Bugs repaired

tinySA-V4-SI4463
erikkaashoek 5 years ago
parent 95f64ae07f
commit 6596a9fa8c

@ -113,4 +113,5 @@
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
</cproject> </cproject>

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="300448615141682" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1672673687719504" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>
@ -17,7 +17,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="300448615141682" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1672673687719504" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

@ -240,7 +240,7 @@ void reset_settings(int m)
for (int t=0;t<TRACES_MAX;t++) { for (int t=0;t<TRACES_MAX;t++) {
setting.average[t] = 0; setting.average[t] = 0;
setting.stored[t] = false; setting.stored[t] = false;
setting.subtract[t] = 0; setting.subtract[t] = 0; // Disabled
} }
#ifdef TINYSA4 #ifdef TINYSA4
setting.harmonic = 3; // Automatically used when above ULTRA_MAX_FREQ setting.harmonic = 3; // Automatically used when above ULTRA_MAX_FREQ
@ -935,6 +935,8 @@ void limits_update(void)
void store_trace(int f, int t) void store_trace(int f, int t)
{ {
if (f == t)
return;
for (int i=0; i<POINTS_COUNT;i++) for (int i=0; i<POINTS_COUNT;i++)
measured[t][i] = measured[f][i]; measured[t][i] = measured[f][i];
setting.stored[t] = true; setting.stored[t] = true;
@ -968,9 +970,12 @@ void set_subtract_storage(void)
void subtract_trace(int t, int f) void subtract_trace(int t, int f)
{ {
if (t == f)
return;
if (!setting.subtract[t]) { if (!setting.subtract[t]) {
setting.subtract[t] = f; setting.subtract[t] = f;
setting.normalize_level = 0.0; setting.normalize_level = 0.0;
setting.auto_attenuation = false; // Otherwise noise level may move leading to strange measurements
} else } else
setting.subtract[t] = 0; setting.subtract[t] = 0;
} }
@ -4092,11 +4097,12 @@ static volatile int dummy;
for (int t=0; t<TRACES_MAX;t++) { for (int t=0; t<TRACES_MAX;t++) {
if (setting.stored[t]) if (setting.stored[t])
continue; continue;
float RSSI_calc = RSSI;
float *trace_data = measured[t]; float *trace_data = measured[t];
#endif // __DOUBLE_LOOP__ #endif // __DOUBLE_LOOP__
// ------------------------ do all RSSI calculations from CALC menu ------------------- // ------------------------ do all RSSI calculations from CALC menu -------------------
if (setting.subtract[t]) { if (setting.subtract[t]) {
RSSI = RSSI - measured[setting.subtract[t]-1][i] + setting.normalize_level; RSSI_calc = RSSI_calc - measured[setting.subtract[t]-1][i] + setting.normalize_level;
} }
#ifdef __SI4432__ #ifdef __SI4432__
//#define __DEBUG_AGC__ //#define __DEBUG_AGC__
@ -4115,15 +4121,15 @@ static volatile int dummy;
#endif #endif
if (scandirty || setting.average[t] == AV_OFF) { // Level calculations if (scandirty || setting.average[t] == AV_OFF) { // Level calculations
if (setting.average[t] == AV_MAX_DECAY) age[i] = 0; if (setting.average[t] == AV_MAX_DECAY) age[i] = 0;
trace_data[i] = RSSI; trace_data[i] = RSSI_calc;
} else { } else {
switch(setting.average[t] ) { switch(setting.average[t] ) {
case AV_MIN: if (trace_data[i] > RSSI) trace_data[i] = RSSI; break; case AV_MIN: if (trace_data[i] > RSSI_calc) trace_data[i] = RSSI_calc; break;
case AV_MAX_HOLD: if (trace_data[i] < RSSI) trace_data[i] = RSSI; break; case AV_MAX_HOLD: if (trace_data[i] < RSSI_calc) trace_data[i] = RSSI_calc; break;
case AV_MAX_DECAY: case AV_MAX_DECAY:
if (trace_data[i] < RSSI) { if (trace_data[i] < RSSI_calc) {
age[i] = 0; age[i] = 0;
trace_data[i] = RSSI; trace_data[i] = RSSI_calc;
} else { } else {
if (age[i] > setting.decay) if (age[i] > setting.decay)
trace_data[i] -= 0.5; trace_data[i] -= 0.5;
@ -4131,8 +4137,8 @@ static volatile int dummy;
age[i] += 1; age[i] += 1;
} }
break; break;
case AV_4: trace_data[i] = (trace_data[i]*3.0 + RSSI) / 4.0; break; case AV_4: trace_data[i] = (trace_data[i]*3.0 + RSSI_calc) / 4.0; break;
case AV_16: trace_data[i] = (trace_data[i]*15.0 + RSSI) / 16.0; break; case AV_16: trace_data[i] = (trace_data[i]*15.0 + RSSI_calc) / 16.0; break;
case AV_100: case AV_100:
#ifdef TINYSA4 #ifdef TINYSA4
if (linear_averaging) if (linear_averaging)
@ -4140,29 +4146,29 @@ static volatile int dummy;
#if 0 #if 0
int old_unit = setting.unit; int old_unit = setting.unit;
setting.unit = U_WATT; // Power averaging should always be done in Watts setting.unit = U_WATT; // Power averaging should always be done in Watts
trace_data[i] = to_dBm((value(trace_data[i])*(scan_after_dirty-1) + value(RSSI)) / scan_after_dirty ); trace_data[i] = to_dBm((value(trace_data[i])*(scan_after_dirty-1) + value(RSSI_calc)) / scan_after_dirty );
setting.unit = old_unit; setting.unit = old_unit;
#else #else
float v = (expf(trace_data[i]*(logf(10.0)/10.0)) * (scan_after_dirty-1) + expf(RSSI * (logf(10.0)/10.0))) / scan_after_dirty; float v = (expf(trace_data[i]*(logf(10.0)/10.0)) * (scan_after_dirty-1) + expf(RSSI_calc * (logf(10.0)/10.0))) / scan_after_dirty;
trace_data[i] = logf(v)*(10.0/logf(10.0)); trace_data[i] = logf(v)*(10.0/logf(10.0));
#endif #endif
} }
else else
trace_data[i] = (trace_data[i]*(scan_after_dirty-1) + RSSI)/ scan_after_dirty; trace_data[i] = (trace_data[i]*(scan_after_dirty-1) + RSSI_calc)/ scan_after_dirty;
#else #else
trace_data[i] = (trace_data[i]*(scan_after_dirty-1) + RSSI)/ scan_after_dirty; trace_data[i] = (trace_data[i]*(scan_after_dirty-1) + RSSI_calc)/ scan_after_dirty;
#endif #endif
break; break;
#ifdef __QUASI_PEAK__ #ifdef __QUASI_PEAK__
case AV_QUASI: case AV_QUASI:
{ static float old_RSSI = -150.0; { static float old_RSSI = -150.0;
if (i == 0) old_RSSI = trace_data[sweep_points-1]; if (i == 0) old_RSSI = trace_data[sweep_points-1];
if (RSSI > old_RSSI && setting.attack > 1) if (RSSI_calc > old_RSSI && setting.attack > 1)
old_RSSI += (RSSI - old_RSSI)/setting.attack; old_RSSI += (RSSI_calc - old_RSSI)/setting.attack;
else if (RSSI < old_RSSI && setting.decay > 1) else if (RSSI_calc < old_RSSI && setting.decay > 1)
old_RSSI += (RSSI - old_RSSI)/setting.decay; old_RSSI += (RSSI_calc - old_RSSI)/setting.decay;
else else
old_RSSI = RSSI; old_RSSI = RSSI_calc;
trace_data[i] = old_RSSI; trace_data[i] = old_RSSI;
} }
break; break;

@ -516,6 +516,7 @@ static const menuitem_t menu_highoutputmode[];
static const menuitem_t menu_modulation[]; static const menuitem_t menu_modulation[];
static const menuitem_t menu_top[]; static const menuitem_t menu_top[];
static const menuitem_t menu_trace[]; static const menuitem_t menu_trace[];
static const menuitem_t menu_marker_trace[];
static const menuitem_t menu_subtract_trace[]; static const menuitem_t menu_subtract_trace[];
static const menuitem_t menu_reffer[]; static const menuitem_t menu_reffer[];
static const menuitem_t menu_sweep_points[]; static const menuitem_t menu_sweep_points[];
@ -1525,23 +1526,37 @@ static UI_FUNCTION_ADV_CALLBACK(menu_trace_acb)
if(b){ if(b){
b->param_1.i = data+1; b->param_1.i = data+1;
b->icon = (data == current_trace) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP; b->icon = (data == current_trace) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
b->bg = LCD_TRACE_1_COLOR+data;
return; return;
} }
current_trace = data; current_trace = data;
menu_move_back(false); menu_move_back(false);
} }
static UI_FUNCTION_ADV_CALLBACK(menu_marker_trace_acb)
{
(void)item;
if(b){
b->param_1.i = data+1;
b->icon = (data == markers[active_marker].trace) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
b->bg = LCD_TRACE_1_COLOR+data;
return;
}
markers[active_marker].trace = data;
menu_move_back(false);
}
static UI_FUNCTION_ADV_CALLBACK(menu_store_trace_acb) static UI_FUNCTION_ADV_CALLBACK(menu_store_trace_acb)
{ {
(void)item; (void)item;
if(b){ if(b){
if (data == current_trace) plot_printf(b->text, sizeof(b->text), S_RARROW"TRACE %d", data+1);
plot_printf(b->text, sizeof(b->text), "", data); b->bg = LCD_TRACE_1_COLOR+data;
else if (current_trace == data)
plot_printf(b->text, sizeof(b->text), S_RARROW"TRACE %d", data+1); b->fg = LCD_DARK_GREY;
return; return;
} }
if (data != current_trace) store_trace(current_trace,data); store_trace(current_trace,data);
menu_move_back(false); menu_move_back(false);
} }
@ -1550,11 +1565,15 @@ static UI_FUNCTION_ADV_CALLBACK(menu_subtract_trace_acb)
{ {
(void)item; (void)item;
if(b){ if(b){
if (data) if (data) {
plot_printf(b->text, sizeof(b->text), "SUBTRACT\nTRACE %d", data); plot_printf(b->text, sizeof(b->text), "SUBTRACT\nTRACE %d", data);
b->bg = LCD_TRACE_1_COLOR+data-1;
}
else else
plot_printf(b->text, sizeof(b->text), "SUBTRACT\nDISABLED"); plot_printf(b->text, sizeof(b->text), "SUBTRACT\nDISABLED");
b->icon = (data == setting.subtract[current_trace]) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP; b->icon = (data == setting.subtract[current_trace]) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
if (data - 1 == current_trace)
b->fg = LCD_DARK_GREY;
return; return;
} }
subtract_trace(current_trace,data); subtract_trace(current_trace,data);
@ -1566,15 +1585,20 @@ static UI_FUNCTION_ADV_CALLBACK(menu_traces_acb)
{ {
(void)item; (void)item;
if(b){ if(b){
if (data == 0) { if (data == 0) { // Select trace
b->param_1.i = current_trace+1; b->param_1.i = current_trace+1;
} else if (data == 1) b->bg = LCD_TRACE_1_COLOR+current_trace;
b->icon = IS_TRACE_ENABLE(current_trace) ? BUTTON_ICON_NOCHECK : BUTTON_ICON_CHECK ; } else if (data == 1) { // View
else if (data == 2) if (current_trace)
b->icon = IS_TRACE_ENABLE(current_trace) ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK;
else
b->fg = LCD_DARK_GREY;
}
else if (data == 2) // freeze
b->icon = setting.stored[current_trace] ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; b->icon = setting.stored[current_trace] ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK;
else if (data == 3) { else if (data == 3) {
if (setting.stored[current_trace]) if (setting.subtract[current_trace])
plot_printf(b->text, sizeof(b->text), "SUBTRACT\nTRACE %d", setting.stored[current_trace]); plot_printf(b->text, sizeof(b->text), "SUBTRACT\nTRACE %d", setting.subtract[current_trace]);
else else
plot_printf(b->text, sizeof(b->text), "SUBTRACT\nDISABLED"); plot_printf(b->text, sizeof(b->text), "SUBTRACT\nDISABLED");
} }
@ -1586,12 +1610,13 @@ static UI_FUNCTION_ADV_CALLBACK(menu_traces_acb)
return; return;
case 1: case 1:
if (IS_TRACE_ENABLE(current_trace)) { if (IS_TRACE_ENABLE(current_trace)) {
TRACE_DISABLE(1<<current_trace); if (current_trace) // Trace 1 always viewed
TRACE_DISABLE(1<<current_trace);
} else { } else {
TRACE_ENABLE(1<<current_trace); TRACE_ENABLE(1<<current_trace);
} }
break; break;
case 2: case 2: // Freeze
setting.stored[current_trace] = !setting.stored[current_trace]; setting.stored[current_trace] = !setting.stored[current_trace];
break; break;
case 3: case 3:
@ -1600,7 +1625,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_traces_acb)
break; break;
#ifdef TINYSA4 #ifdef TINYSA4
case 6: case 6:
save_to_sd(1+2<<current_trace); // frequencies + trace save_to_sd(1+(2<<current_trace)); // frequencies + trace
break; break;
#endif #endif
} }
@ -1710,55 +1735,39 @@ static UI_FUNCTION_ADV_CALLBACK(menu_marker_modify_acb)
(void)item; (void)item;
if (active_marker == MARKER_INVALID) return; if (active_marker == MARKER_INVALID) return;
if(b){ if(b){
if (markers[active_marker].enabled == M_ENABLED) { uistat.text[0] = 0;
switch(data) {
case M_DELTA:
case M_NOISE:
case M_TRACKING:
case M_AVER:
b->icon = BUTTON_ICON_NOCHECK; b->icon = BUTTON_ICON_NOCHECK;
if (data & markers[active_marker].mtype) if (markers[active_marker].mtype & data)
b->icon = BUTTON_ICON_CHECK;
else if (data==markers[active_marker].mtype) // This catches the M_NORMAL case
b->icon = BUTTON_ICON_CHECK; b->icon = BUTTON_ICON_CHECK;
if ((markers[active_marker].mtype & M_DELTA)) if (markers[active_marker].mtype & M_DELTA)
uistat.text[0] = markers[active_marker].ref+'1'; uistat.text[0] = markers[active_marker].ref+'1';
else break;
uistat.text[0] = 0; case M_STORED:
uistat.text[1] = 0; uistat.text[0] = markers[active_marker].trace+'1';
b->param_1.text = uistat.text; b->bg = LCD_TRACE_1_COLOR+markers[active_marker].trace;
break;
} }
b->param_1.text = uistat.text;
return; return;
} }
if (markers[active_marker].enabled == M_ENABLED) if (data == M_DELTA && !(markers[active_marker].mtype & M_DELTA)) { // Not yet set
{ menu_push_submenu(menu_marker_ref_select);
if (data == M_NORMAL) { goto set_delta;
markers[active_marker].mtype = M_NORMAL; return;
} } else if (data == M_STORED) {
#if 0 current_trace = 0;
if (data == M_REFERENCE) { menu_push_submenu(menu_marker_trace);
for (int i = 0; i<MARKER_COUNT; i++ ) { return;
if (i != active_marker && markers[i].mtype & M_REFERENCE) } else if (markers[active_marker].mtype & data)
markers[i].mtype &= ~M_REFERENCE; markers[active_marker].mtype &= ~data;
} else {
markers[active_marker].mtype &= ~M_DELTA; set_delta:
} markers[active_marker].mtype |= data;
#endif
if (data == M_DELTA) {
if (!(markers[active_marker].mtype & M_DELTA)) // Not yet set
menu_push_submenu(menu_marker_ref_select);
#if 0
markers[active_marker].mtype &= ~M_REFERENCE;
#endif
}
#if 1
markers[active_marker].mtype ^= data;
if (markers[active_marker].mtype & M_STORED)
markers[active_marker].trace = TRACE_STORED;
else
markers[active_marker].trace = TRACE_ACTUAL;
#else
if (markers[active_marker].mtype & data)
markers[active_marker].mtype &= ~data;
else
markers[active_marker].mtype |= data;
#endif
} }
markmap_all_markers(); markmap_all_markers();
// redraw_marker(active_marker, TRUE); // redraw_marker(active_marker, TRUE);
@ -2468,7 +2477,7 @@ const menuitem_t menu_marker_modify[] = {
{ MT_ADV_CALLBACK, M_DELTA, "DELTA %s", menu_marker_modify_acb}, { MT_ADV_CALLBACK, M_DELTA, "DELTA %s", menu_marker_modify_acb},
{ MT_ADV_CALLBACK, M_NOISE, "NOISE", menu_marker_modify_acb}, { MT_ADV_CALLBACK, M_NOISE, "NOISE", menu_marker_modify_acb},
{ MT_ADV_CALLBACK, M_TRACKING, "TRACKING", menu_marker_modify_acb}, { MT_ADV_CALLBACK, M_TRACKING, "TRACKING", menu_marker_modify_acb},
{ MT_ADV_CALLBACK, M_STORED, "STORED", menu_marker_modify_acb}, { MT_ADV_CALLBACK, M_STORED, "TRACE %s", menu_marker_modify_acb},
{ MT_ADV_CALLBACK, M_AVER, "TRACE\nAVERAGE", menu_marker_modify_acb}, { MT_ADV_CALLBACK, M_AVER, "TRACE\nAVERAGE", menu_marker_modify_acb},
{ MT_SUBMENU, 0, "SEARCH", menu_marker_search}, { MT_SUBMENU, 0, "SEARCH", menu_marker_search},
{ MT_CALLBACK, M_DELETE, "DELETE", menu_marker_delete_cb}, { MT_CALLBACK, M_DELETE, "DELETE", menu_marker_delete_cb},
@ -2949,6 +2958,17 @@ static const menuitem_t menu_trace[] =
{ MT_NONE, 0, NULL, menu_back} // next-> menu_back { MT_NONE, 0, NULL, menu_back} // next-> menu_back
}; };
static const menuitem_t menu_marker_trace[] =
{
{ MT_ADV_CALLBACK,0, "TRACE %d", menu_marker_trace_acb},
{ MT_ADV_CALLBACK,1, "TRACE %d", menu_marker_trace_acb},
{ MT_ADV_CALLBACK,2, "TRACE %d", menu_marker_trace_acb},
#if TRACES_MAX > 3
{ MT_ADV_CALLBACK,3, "TRACE %d", menu_marker_trace_acb},
#endif
{ MT_NONE, 0, NULL, menu_back} // next-> menu_back
};
static const menuitem_t menu_store_trace[] = static const menuitem_t menu_store_trace[] =
{ {
{ MT_ADV_CALLBACK,0, MT_CUSTOM_LABEL, menu_store_trace_acb}, { MT_ADV_CALLBACK,0, MT_CUSTOM_LABEL, menu_store_trace_acb},
@ -2975,11 +2995,11 @@ static const menuitem_t menu_subtract_trace[] =
static const menuitem_t menu_traces[] = static const menuitem_t menu_traces[] =
{ {
{ MT_ADV_CALLBACK,0, "TRACE %d", menu_traces_acb}, { MT_ADV_CALLBACK,0, "TRACE %d", menu_traces_acb},
{ MT_ADV_CALLBACK,1, "HIDDEN", menu_traces_acb}, { MT_ADV_CALLBACK,1, "VIEW", menu_traces_acb},
{ MT_ADV_CALLBACK,2, "STORED", menu_traces_acb}, { MT_ADV_CALLBACK,2, "FREEZE", menu_traces_acb},
{ MT_ADV_CALLBACK,3, MT_CUSTOM_LABEL, menu_traces_acb}, { MT_ADV_CALLBACK,3, MT_CUSTOM_LABEL, menu_traces_acb},
{ MT_SUBMENU, 0, "CALC", menu_average}, { MT_SUBMENU, 0, "CALC", menu_average},
{ MT_SUBMENU, 0, "STORE\n"S_RARROW"TRACE", menu_store_trace}, { MT_SUBMENU, 0, "COPY\n"S_RARROW"TRACE", menu_store_trace},
#ifdef TINYSA4 #ifdef TINYSA4
{ MT_ADV_CALLBACK,6, "WRITE\n"S_RARROW"SD", menu_traces_acb}, { MT_ADV_CALLBACK,6, "WRITE\n"S_RARROW"SD", menu_traces_acb},
#endif #endif

Loading…
Cancel
Save

Powered by TurnKey Linux.