mirror of
https://github.com/ttrftech/NanoVNA.git
synced 2025-12-06 03:31:59 +01:00
feat: add marker search
This commit is contained in:
parent
65d3c9fa0d
commit
3f209e4986
|
|
@ -238,6 +238,9 @@ void markmap_all_markers(void);
|
||||||
|
|
||||||
void marker_position(int m, int t, int *x, int *y);
|
void marker_position(int m, int t, int *x, int *y);
|
||||||
int search_nearest_index(int x, int y, int t);
|
int search_nearest_index(int x, int y, int t);
|
||||||
|
int marker_search(int mode);
|
||||||
|
int marker_search_left(int from);
|
||||||
|
int marker_search_right(int from);
|
||||||
|
|
||||||
extern uint16_t redraw_request;
|
extern uint16_t redraw_request;
|
||||||
|
|
||||||
|
|
|
||||||
88
plot.c
88
plot.c
|
|
@ -1073,6 +1073,94 @@ marker_position(int m, int t, int *x, int *y)
|
||||||
*y = CELL_Y(index);
|
*y = CELL_Y(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int greater(int x, int y) { return x > y; }
|
||||||
|
static int lesser(int x, int y) { return x < y; }
|
||||||
|
|
||||||
|
static int (*compare)(int x, int y) = lesser;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
marker_search(int mode)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
if (mode == 0)
|
||||||
|
compare = greater;
|
||||||
|
else
|
||||||
|
compare = lesser;
|
||||||
|
|
||||||
|
if (uistat.current_trace == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int value = CELL_Y(trace_index[uistat.current_trace][0]);
|
||||||
|
for (i = 0; i < 101; i++) {
|
||||||
|
uint32_t index = trace_index[uistat.current_trace][i];
|
||||||
|
if ((*compare)(value, CELL_Y(index))) {
|
||||||
|
value = CELL_Y(index);
|
||||||
|
found = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
marker_search_left(int from)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int found = -1;
|
||||||
|
|
||||||
|
if (uistat.current_trace == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int value = CELL_Y(trace_index[uistat.current_trace][from]);
|
||||||
|
for (i = from - 1; i >= 0; i--) {
|
||||||
|
uint32_t index = trace_index[uistat.current_trace][i];
|
||||||
|
if ((*compare)(value, CELL_Y(index)))
|
||||||
|
break;
|
||||||
|
value = CELL_Y(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i >= 0; i--) {
|
||||||
|
uint32_t index = trace_index[uistat.current_trace][i];
|
||||||
|
if ((*compare)(CELL_Y(index), value)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
found = i;
|
||||||
|
value = CELL_Y(index);
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
marker_search_right(int from)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int found = -1;
|
||||||
|
|
||||||
|
if (uistat.current_trace == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int value = CELL_Y(trace_index[uistat.current_trace][from]);
|
||||||
|
for (i = from + 1; i < 101; i++) {
|
||||||
|
uint32_t index = trace_index[uistat.current_trace][i];
|
||||||
|
if ((*compare)(value, CELL_Y(index)))
|
||||||
|
break;
|
||||||
|
value = CELL_Y(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < 101; i++) {
|
||||||
|
uint32_t index = trace_index[uistat.current_trace][i];
|
||||||
|
if ((*compare)(CELL_Y(index), value)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
found = i;
|
||||||
|
value = CELL_Y(index);
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
search_nearest_index(int x, int y, int t)
|
search_nearest_index(int x, int y, int t)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
61
ui.c
61
ui.c
|
|
@ -803,16 +803,16 @@ menu_marker_op_cb(int item)
|
||||||
return; // no active marker
|
return; // no active marker
|
||||||
|
|
||||||
switch (item) {
|
switch (item) {
|
||||||
case 1: /* MARKER->START */
|
case 0: /* MARKER->START */
|
||||||
set_sweep_frequency(ST_START, freq);
|
set_sweep_frequency(ST_START, freq);
|
||||||
break;
|
break;
|
||||||
case 2: /* MARKER->STOP */
|
case 1: /* MARKER->STOP */
|
||||||
set_sweep_frequency(ST_STOP, freq);
|
set_sweep_frequency(ST_STOP, freq);
|
||||||
break;
|
break;
|
||||||
case 3: /* MARKER->CENTER */
|
case 2: /* MARKER->CENTER */
|
||||||
set_sweep_frequency(ST_CENTER, freq);
|
set_sweep_frequency(ST_CENTER, freq);
|
||||||
break;
|
break;
|
||||||
case 4: /* MARKERS->SPAN */
|
case 3: /* MARKERS->SPAN */
|
||||||
{
|
{
|
||||||
if (previous_marker == active_marker)
|
if (previous_marker == active_marker)
|
||||||
return;
|
return;
|
||||||
|
|
@ -838,6 +838,37 @@ menu_marker_op_cb(int item)
|
||||||
//redraw_all();
|
//redraw_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
menu_marker_search_cb(int item)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (active_marker == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (item) {
|
||||||
|
case 0: /* maximum */
|
||||||
|
case 1: /* minimum */
|
||||||
|
i = marker_search(item);
|
||||||
|
if (i != -1)
|
||||||
|
markers[active_marker].index = i;
|
||||||
|
draw_menu();
|
||||||
|
break;
|
||||||
|
case 2: /* search Left */
|
||||||
|
i = marker_search_left(markers[active_marker].index);
|
||||||
|
if (i != -1)
|
||||||
|
markers[active_marker].index = i;
|
||||||
|
draw_menu();
|
||||||
|
break;
|
||||||
|
case 3: /* search right */
|
||||||
|
i = marker_search_right(markers[active_marker].index);
|
||||||
|
if (i != -1)
|
||||||
|
markers[active_marker].index = i;
|
||||||
|
draw_menu();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
redraw_marker(active_marker, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
active_marker_select(int item)
|
active_marker_select(int item)
|
||||||
{
|
{
|
||||||
|
|
@ -1011,8 +1042,7 @@ const menuitem_t menu_marker_sel[] = {
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
||||||
const menuitem_t menu_marker[] = {
|
const menuitem_t menu_marker_ops[] = {
|
||||||
{ MT_SUBMENU, "\2SELECT\0MARKER", menu_marker_sel },
|
|
||||||
{ MT_CALLBACK, S_RARROW"START", menu_marker_op_cb },
|
{ MT_CALLBACK, S_RARROW"START", menu_marker_op_cb },
|
||||||
{ MT_CALLBACK, S_RARROW"STOP", menu_marker_op_cb },
|
{ MT_CALLBACK, S_RARROW"STOP", menu_marker_op_cb },
|
||||||
{ MT_CALLBACK, S_RARROW"CENTER", menu_marker_op_cb },
|
{ MT_CALLBACK, S_RARROW"CENTER", menu_marker_op_cb },
|
||||||
|
|
@ -1021,6 +1051,25 @@ const menuitem_t menu_marker[] = {
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const menuitem_t menu_marker_search[] = {
|
||||||
|
//{ MT_CALLBACK, "OFF", menu_marker_search_cb },
|
||||||
|
{ MT_CALLBACK, "MAXIMUM", menu_marker_search_cb },
|
||||||
|
{ MT_CALLBACK, "MINIMUM", menu_marker_search_cb },
|
||||||
|
{ MT_CALLBACK, "\2SEARCH\0" S_LARROW" LEFT", menu_marker_search_cb },
|
||||||
|
{ MT_CALLBACK, "\2SEARCH\0" S_RARROW" RIGHT", menu_marker_search_cb },
|
||||||
|
//{ MT_CALLBACK, "TRACKING", menu_marker_search_cb },
|
||||||
|
{ MT_CANCEL, S_LARROW" BACK", NULL },
|
||||||
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
const menuitem_t menu_marker[] = {
|
||||||
|
{ MT_SUBMENU, "\2SELECT\0MARKER", menu_marker_sel },
|
||||||
|
{ MT_SUBMENU, "SEARCH", menu_marker_search },
|
||||||
|
{ MT_SUBMENU, "OPERATIONS", menu_marker_ops },
|
||||||
|
{ MT_CANCEL, S_LARROW" BACK", NULL },
|
||||||
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
const menuitem_t menu_recall[] = {
|
const menuitem_t menu_recall[] = {
|
||||||
{ MT_CALLBACK, "RECALL 0", menu_recall_cb },
|
{ MT_CALLBACK, "RECALL 0", menu_recall_cb },
|
||||||
{ MT_CALLBACK, "RECALL 1", menu_recall_cb },
|
{ MT_CALLBACK, "RECALL 1", menu_recall_cb },
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue