From 70243003150af3fa1772663776bc33887989dada Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 16 Dec 2020 16:17:59 +0100 Subject: [PATCH] Pre/Post?Mid trigger added --- nanovna.h | 5 ++- sa_core.c | 17 +++++++-- si4432.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- si4432.h | 1 + ui_sa.c | 16 +++++++- 5 files changed, 142 insertions(+), 8 deletions(-) diff --git a/nanovna.h b/nanovna.h index f8a3e53..0b0f647 100644 --- a/nanovna.h +++ b/nanovna.h @@ -805,6 +805,7 @@ typedef struct setting int fast_speedup; float normalize_level; // Level to set normalize to, zero if not doing anything int modulation_frequency; + int trigger_mode; uint32_t checksum; }setting_t; @@ -1064,6 +1065,7 @@ typedef int16_t pureRSSI_t; // External programm zero level settings (need decrease on this value -) #define EXT_ZERO_LEVEL (128) #define DEVICE_TO_PURE_RSSI(rssi) ((rssi)<<4) +#define PURE_TO_DEVICE_RSSI(rssi) ((rssi)>>4) #define float_TO_PURE_RSSI(rssi) ((rssi)*32) #define PURE_TO_float(rssi) ((rssi)/32.0) @@ -1097,6 +1099,7 @@ enum { }; enum { - T_AUTO, T_NORMAL, T_SINGLE, T_DONE, T_UP, T_DOWN + T_AUTO, T_NORMAL, T_SINGLE, T_DONE, T_UP, T_DOWN, T_MODE, T_PRE, T_POST, T_MID }; + /*EOF*/ diff --git a/sa_core.c b/sa_core.c index b3f4736..50854d3 100644 --- a/sa_core.c +++ b/sa_core.c @@ -117,6 +117,7 @@ void reset_settings(int m) setting.offset = 0.0; setting.trigger = T_AUTO; setting.trigger_direction = T_UP; + setting.trigger_mode = T_MID; setting.fast_speedup = 0; setting.level_sweep = 0.0; setting.level = -15.0; @@ -912,7 +913,9 @@ void set_trigger_level(float trigger_level) void set_trigger(int trigger) { - if (trigger == T_UP || trigger == T_DOWN){ + if (trigger == T_PRE || trigger == T_POST || trigger == T_MID) { + setting.trigger_mode = trigger; + } else if (trigger == T_UP || trigger == T_DOWN){ setting.trigger_direction = trigger; } else if (trigger == T_DONE) { pause_sweep(); // Trigger once so pause after this sweep has completed!!!!!!! @@ -1906,6 +1909,11 @@ modulation_again: #define T_LEVEL_CLEAN ~(1<= sweep_points) + buf_index -= sweep_points; + goto store; + break; + case T_MID: // Trigger in the middle of the scan + buf_index = i + sweep_points/2; + if (buf_index >= sweep_points) + buf_index -= sweep_points; + break; + } + } + break; + case ST_FILLING: +store: + if (i == buf_index) + goto done; + } + i++; + if (i >= sweep_points) + i = 0; + if (t) + my_microsecond_delay(t); + }while(1); +done: + buf_end = buf_index; + buf_read = true; +} + void SI4432_Fill(int s, int start) { SI4432_Sel = s; @@ -440,7 +541,7 @@ void SI4432_Fill(int s, int start) uint32_t t = setting.additional_step_delay_us; systime_t measure = chVTGetSystemTimeX(); // __disable_irq(); -#if 0 +#if 1 SPI2_CLK_LOW; int i = start; do { @@ -458,6 +559,7 @@ void SI4432_Fill(int s, int start) // __enable_irq(); setting.measure_sweep_time_us = (chVTGetSystemTimeX() - measure)*100; buf_index = start; // Is used to skip 1st entry during level triggering + buf_end = sweep_points - 1; buf_read = true; } #endif @@ -483,9 +585,12 @@ pureRSSI_t SI4432_RSSI(uint32_t i, int s) //START_PROFILE #ifdef __FAST_SWEEP__ if (buf_read) { - if (buf_index == sweep_points-1) + pureRSSI_t val = DEVICE_TO_PURE_RSSI(age[buf_index++]); + if (buf_index >= sweep_points) + buf_index = 0; + if (buf_index == buf_end) buf_read = false; - return DEVICE_TO_PURE_RSSI(age[buf_index++]); + return val; } #endif SI4432_Sel = s; diff --git a/si4432.h b/si4432.h index 43a2784..6f74b8d 100644 --- a/si4432.h +++ b/si4432.h @@ -137,6 +137,7 @@ extern const int SI4432_RBW_count; void set_calibration_freq(int freq); #ifdef __FAST_SWEEP__ void SI4432_Fill(int s, int start); +void SI4432_trigger_fill(int s, uint8_t trigger_lvl, int up_direction, int trigger_mode); #if 0 int SI4432_is_fast_mode(void); #endif diff --git a/ui_sa.c b/ui_sa.c index 2577a02..c2c6e0d 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1125,20 +1125,33 @@ static UI_FUNCTION_ADV_CALLBACK(menu_scale_per_acb) } #endif +const char *mode_text[] = {"PRE","POST","MID"}; + static UI_FUNCTION_ADV_CALLBACK(menu_trigger_acb) { (void)item; if(b){ - if (data == T_UP || data == T_DOWN) + if (data == T_MODE) { + b->param_1.text = mode_text[setting.trigger_mode - T_PRE]; + } else if (data == T_UP || data == T_DOWN) b->icon = setting.trigger_direction == data ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP; else b->icon = setting.trigger == data ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP; return; } + if (data == T_MODE) { + setting.trigger_mode += 1; + if (setting.trigger_mode > T_MID) + setting.trigger_mode = T_PRE; + data = setting.trigger_mode; + goto done; + } else if (data != T_DONE) { + done: set_trigger(data); // menu_move_back(); ui_mode_normal(); + draw_menu(); completed = true; } } @@ -1856,6 +1869,7 @@ static const menuitem_t menu_trigger[] = { { MT_KEYPAD, KM_TRIGGER, "TRIGGER\nLEVEL", NULL}, { MT_ADV_CALLBACK, T_UP, "UP\nEDGE", menu_trigger_acb}, { MT_ADV_CALLBACK, T_DOWN, "DOWN\nEDGE", menu_trigger_acb}, + { MT_ADV_CALLBACK, T_MODE, "%s\nTRIGGER", menu_trigger_acb}, { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel };