diff --git a/.project b/.project index f5b7df6..7363c6a 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - nanoVNA-Erik + tinySA diff --git a/main.c b/main.c index 2f7911e..b08cfcb 100644 --- a/main.c +++ b/main.c @@ -926,10 +926,10 @@ config_t config = { static const marker_t def_markers[MARKERS_MAX] = { - { M_ENABLED, M_REFERENCE | M_TRACKING, 30, 0 }, - { M_DISABLED, M_NORMAL, 40, 0 }, - { M_DISABLED, M_NORMAL, 60, 0 }, - { M_DISABLED, M_NORMAL, 80, 0 } + { M_ENABLED, M_REFERENCE | M_TRACKING, 0, 30, 0 }, + { M_DISABLED, M_NORMAL, 0, 40, 0 }, + { M_DISABLED, M_NORMAL, 0, 60, 0 }, + { M_DISABLED, M_NORMAL, 0, 80, 0 } }; // Load propeties default settings diff --git a/nanovna.h b/nanovna.h index 2514cf3..24c46c3 100644 --- a/nanovna.h +++ b/nanovna.h @@ -759,6 +759,7 @@ void enableTracesAtComplete(uint8_t mask); typedef struct { uint8_t enabled; uint8_t mtype; + uint8_t ref; int16_t index; freq_t frequency; } marker_t; diff --git a/plot.c b/plot.c index 18594ba..2e379a5 100644 --- a/plot.c +++ b/plot.c @@ -90,30 +90,17 @@ static index_y_t trace_index_y[TRACES_MAX][POINTS_COUNT]; uint16_t marker_color(int mtype) { - if (mtype & M_REFERENCE) - return LCD_M_REFERENCE; +// if (mtype & M_REFERENCE) +// return LCD_M_REFERENCE; if (mtype & M_STORED) return LCD_M_DELTA; // if (mtype & M_DELTA) // return LCD_BRIGHT_COLOR_RED; - if (mtype & M_NOISE) - return LCD_M_NOISE; +// if (mtype & M_NOISE) +// return LCD_M_NOISE; return LCD_M_DEFAULT; } -//#if 4 != M_TRACKING -//#error "Wrong marker numbers" -//#endif - -char marker_letter[5] = -{ - 'R', - ' ', - 'D', - 'N', - 'T' -}; - #if 1 #define float2int(v) ((int)(v)) #else @@ -1423,11 +1410,6 @@ static void trace_print_value_string( // Only used at one place { (void) bold; int ref_marker=-1; - for (int i = 0; i < MARKER_COUNT; i++) { - if (markers[i].enabled && markers[i].mtype & M_REFERENCE && ((markers[i].mtype & M_STORED) == (markers[mi].mtype & M_STORED))) { - ref_marker = i; - } - } int mtype = markers[mi].mtype; int idx = markers[mi].index; float v = marker_to_value(mi); @@ -1436,14 +1418,16 @@ static void trace_print_value_string( // Only used at one place // Prepare marker type string *ptr2++ = mi == active_marker ? S_SARROW[0] : ' '; *ptr2++ = mi+'1'; - if (mtype & M_REFERENCE) - *ptr2++ = 'R'; +// if (mtype & M_REFERENCE) +// *ptr2++ = 'R'; if (mtype & M_TRACKING) *ptr2++ = 'T'; - if (mtype & M_DELTA) - *ptr2++ = 'D'; - if (mtype & M_NOISE) - *ptr2++ = 'N'; + if (mtype & M_DELTA) { + *ptr2++ = S_DELTA[0]; + *ptr2++ = markers[mi].ref+'1'; + } +// if (mtype & M_NOISE) +// *ptr2++ = 'N'; *ptr2++ = ' '; if (mtype & M_NOISE){ // v-= log10f(actual_rbw_x10*100.0) * 10.0; @@ -1458,8 +1442,9 @@ static void trace_print_value_string( // Only used at one place freq_t freq = markers[mi].frequency; int unit_index = setting.unit; // Setup delta values - if (mtype & M_DELTA && ref_marker>=0) { - *ptr2++ = S_DELTA[0]; + if (mtype & M_DELTA) { + ref_marker = markers[mi].ref; +// *ptr2++ = S_DELTA[0]; unit_index+= 5; freq_t ref_freq = markers[ref_marker].frequency; int ridx = markers[ref_marker].index; diff --git a/sa_core.c b/sa_core.c index cbd2f6f..2fa1a72 100644 --- a/sa_core.c +++ b/sa_core.c @@ -360,6 +360,7 @@ void reset_settings(int m) for (uint8_t i = 0; i< MARKERS_MAX; i++) { markers[i].enabled = M_DISABLED; markers[i].mtype = M_NORMAL; + markers[i].ref = 0; } markers[0].mtype = M_REFERENCE | M_TRACKING; markers[0].enabled = M_ENABLED; diff --git a/ui_sa.c b/ui_sa.c index a95c37d..b0205ac 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -507,6 +507,7 @@ static const menuitem_t menu_sweep_points[]; static const menuitem_t menu_sweep_points_form[]; static const menuitem_t menu_modulation[]; static const menuitem_t menu_limit_modify[]; +static const menuitem_t menu_marker_ref_select[]; #ifdef __USE_SERIAL_CONSOLE__ static const menuitem_t menu_connection[]; #endif @@ -1136,8 +1137,11 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) menu_move_back(false); for (int i = 0; i< MARKERS_MAX; i++) { markers[i].enabled = M_DISABLED; - markers[i].mtype = M_NORMAL; + markers[i].mtype = M_DELTA; + markers[i].ref = 0; // Default DELTA referring to marker 1 } + markers[0].enabled = M_ENABLED; + markers[0].mtype = M_REFERENCE | M_TRACKING; #ifdef __MEASURE__ if ((data != M_OFF && setting.measurement != M_OFF) || data == M_OFF ) @@ -1150,8 +1154,6 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) if (setting.measurement == M_LINEARITY) { TRACE_DISABLE(TRACE_STORED_FLAG); } - markers[0].enabled = M_ENABLED; - markers[0].mtype = M_REFERENCE | M_TRACKING; set_average(AV_OFF); } switch(data) { @@ -1162,9 +1164,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) reset_settings(setting.mode); for (int i = 0; i< MARKERS_MAX; i++) { markers[i].enabled = M_ENABLED; - markers[i].mtype = M_DELTA | M_TRACKING; } - markers[0].mtype = M_REFERENCE | M_TRACKING; kp_help_text = "Frequency of fundamental"; ui_mode_keypad(KM_CENTER); set_sweep_frequency(ST_START, 0); @@ -1176,9 +1176,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) reset_settings(setting.mode); for (int i = 0; i< 4; i++) { markers[i].enabled = M_ENABLED; - markers[i].mtype = M_DELTA; } - markers[0].mtype = M_REFERENCE | M_TRACKING; markers[1].mtype = M_TRACKING; kp_help_text = "Frequency of left signal"; ui_mode_keypad(KM_CENTER); @@ -1193,8 +1191,6 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) break; case M_PHASE_NOISE: // Phase noise reset_settings(setting.mode); - markers[0].enabled = M_ENABLED; - markers[0].mtype = M_REFERENCE | M_TRACKING; markers[1].enabled = M_ENABLED; markers[1].mtype = M_DELTA | M_NOISE; kp_help_text = "Frequency of signal"; @@ -1209,9 +1205,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) case M_STOP_BAND: // STop band measurement reset_settings(setting.mode); markers[1].enabled = M_ENABLED; - markers[1].mtype = M_DELTA; markers[2].enabled = M_ENABLED; - markers[2].mtype = M_DELTA; kp_help_text = "Frequency of signal"; ui_mode_keypad(KM_CENTER); kp_help_text = "Width of signal"; @@ -1223,12 +1217,8 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) break; case M_PASS_BAND: // pass band measurement // reset_settings(setting.mode); - markers[0].enabled = M_ENABLED; - markers[0].mtype = M_REFERENCE | M_TRACKING; markers[1].enabled = M_ENABLED; - markers[1].mtype = M_DELTA; markers[2].enabled = M_ENABLED; - markers[2].mtype = M_DELTA; // kp_help_text = "Frequency of signal"; // ui_mode_keypad(KM_CENTER); // kp_help_text = "Width of signal"; @@ -1246,20 +1236,19 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) #endif case M_AM: // AM reset_settings(setting.mode); - for (int i = 0; i< 3; i++) { + for (int i = 1; i< 3; i++) { markers[i].enabled = M_ENABLED; #ifdef TINYSA4 markers[i].mtype = M_DELTA| M_TRACKING; #else - markers[i].mtype = M_DELTA;// | M_TRACKING; +// markers[i].mtype = M_DELTA;// | M_TRACKING; #endif } #ifdef TINYSA4 freq_t span; - markers[0].mtype = M_REFERENCE | M_TRACKING; #else freq_t center, span; - markers[0].mtype = M_REFERENCE;// | M_TRACKING; + markers[0].mtype = M_REFERENCE;// | M_TRACKING; // Not M_TRACKING!!!! #endif kp_help_text = "Frequency of signal"; ui_mode_keypad(KM_CENTER); @@ -1286,11 +1275,10 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) break; case M_FM: // FM reset_settings(setting.mode); - for (int i = 0; i< 3; i++) { + for (int i = 1; i< 3; i++) { markers[i].enabled = M_ENABLED; - markers[i].mtype = M_DELTA; } - markers[0].mtype = M_REFERENCE; + markers[0].mtype = M_NORMAL; /// Not M_TRACKING !!!! kp_help_text = "Frequency of signal"; ui_mode_keypad(KM_CENTER); set_marker_frequency(0, uistat.value); @@ -1497,6 +1485,12 @@ static UI_FUNCTION_ADV_CALLBACK(menu_marker_modify_acb) b->icon = BUTTON_ICON_CHECK; else if (data==markers[active_marker].mtype) // This catches the M_NORMAL case b->icon = BUTTON_ICON_CHECK; + if ((markers[active_marker].mtype & M_DELTA)) + uistat.text[0] = markers[active_marker].ref+'1'; + else + uistat.text[0] = 0; + uistat.text[1] = 0; + b->param_1.text = uistat.text; } return; } @@ -1512,8 +1506,11 @@ static UI_FUNCTION_ADV_CALLBACK(menu_marker_modify_acb) } markers[active_marker].mtype &= ~M_DELTA; } - if (data == M_DELTA) - markers[active_marker].mtype &= ~M_REFERENCE; + if (data == M_DELTA) { + if (!(markers[active_marker].mtype & M_DELTA)) // Not yet set + menu_push_submenu(menu_marker_ref_select); + markers[active_marker].mtype &= ~M_REFERENCE; + } #if 1 markers[active_marker].mtype ^= data; #else @@ -1528,11 +1525,31 @@ static UI_FUNCTION_ADV_CALLBACK(menu_marker_modify_acb) // menu_move_back(false); } +static UI_FUNCTION_ADV_CALLBACK(menu_marker_ref_select_acb) +{ + (void)item; + if(b){ +// b->icon = markers[data-1].enabled ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; + b->param_1.i = data; + return; + } + markers[data-1].enabled = true; +// interpolate_maximum(data-1); // possibly not a maximum + markers[data-1].frequency = frequencies[markers[data-1].index]; + markers[active_marker].ref = data-1; + redraw_marker(active_marker); + menu_move_back(false); +} + static UI_FUNCTION_CALLBACK(menu_marker_delete_cb) { (void)item; (void)data; if (active_marker>=0){ + for (int i = 0; i= 5 + { MT_ADV_CALLBACK, 5, "MARKER %d", menu_marker_ref_select_acb }, +#endif +#if MARKER_COUNT >= 6 + { MT_ADV_CALLBACK, 6, "MARKER %d", menu_marker_ref_select_acb }, +#endif +#if MARKER_COUNT >= 7 + { MT_ADV_CALLBACK, 7, "MARKER %d", menu_marker_ref_select_acb }, +#endif +#if MARKER_COUNT >= 8 + { MT_ADV_CALLBACK, 8, "MARKER %d", menu_marker_ref_select_acb }, +#endif + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + const menuitem_t menu_marker_ops[] = { { MT_CALLBACK, ST_START, S_RARROW" START", menu_marker_op_cb }, { MT_CALLBACK, ST_STOP, S_RARROW" STOP", menu_marker_op_cb },