Merge branch 'lever-ops'

This commit is contained in:
TT 2019-11-17 11:01:21 +09:00
commit e6693f1f25
5 changed files with 146 additions and 40 deletions

View file

@ -360,6 +360,15 @@ ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg)
} }
} }
void
ili9341_drawstring_5x7_inv(const char *str, int x, int y, uint16_t fg, uint16_t bg, bool invert)
{
if (invert)
ili9341_drawstring_5x7(str, x, y, bg, fg);
else
ili9341_drawstring_5x7(str, x, y, fg, bg);
}
void void
ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size)
{ {

3
main.c
View file

@ -834,6 +834,9 @@ void
set_sweep_frequency(int type, int32_t freq) set_sweep_frequency(int type, int32_t freq)
{ {
int cal_applied = cal_status & CALSTAT_APPLY; int cal_applied = cal_status & CALSTAT_APPLY;
// negative value indicate overflow, do nothing
if (freq < 0)
return;
switch (type) { switch (type) {
case ST_START: case ST_START:
freq_mode_startstop(); freq_mode_startstop();

View file

@ -274,6 +274,7 @@ void ili9341_bulk(int x, int y, int w, int h);
void ili9341_fill(int x, int y, int w, int h, int color); void ili9341_fill(int x, int y, int w, int h, int color);
void ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg);
void ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg);
void ili9341_drawstring_5x7_inv(const char *str, int x, int y, uint16_t fg, uint16_t bg, bool inv);
void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size);
void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size);
void ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint16_t bg);
@ -341,12 +342,18 @@ void clear_all_config_prop_data(void);
* ui.c * ui.c
*/ */
// lever_mode
enum {
LM_MARKER, LM_SEARCH, LM_CENTER, LM_SPAN
};
typedef struct { typedef struct {
int8_t digit; /* 0~5 */ int8_t digit; /* 0~5 */
int8_t digit_mode; int8_t digit_mode;
int8_t current_trace; /* 0..3 */ int8_t current_trace; /* 0..3 */
uint32_t value; // for editing at numeric input area uint32_t value; // for editing at numeric input area
uint32_t previous_value; uint32_t previous_value;
uint8_t lever_mode;
} uistat_t; } uistat_t;
extern uistat_t uistat; extern uistat_t uistat;

22
plot.c
View file

@ -1535,7 +1535,7 @@ cell_draw_marker_info(int m, int n, int w, int h)
ypos -= n * CELLHEIGHT; ypos -= n * CELLHEIGHT;
chsnprintf(buf, sizeof buf, "%d:", active_marker + 1); chsnprintf(buf, sizeof buf, "%d:", active_marker + 1);
xpos += 5; xpos += 5;
cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); cell_drawstring_invert_5x7(w, h, buf, xpos, ypos, 0xffff, uistat.lever_mode == LM_MARKER);
xpos += 14; xpos += 14;
if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) { if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) {
frequency_string(buf, sizeof buf, frequencies[idx]); frequency_string(buf, sizeof buf, frequencies[idx]);
@ -1610,14 +1610,22 @@ draw_frequencies(void)
} else if (frequency1 < 0) { } else if (frequency1 < 0) {
int fcenter = frequency0; int fcenter = frequency0;
int fspan = -frequency1; int fspan = -frequency1;
strcpy(buf, "CENTER "); int x = OFFSETX;
frequency_string(buf+7, 24-7, fcenter); strcpy(buf, "CENTER");
ili9341_drawstring_5x7_inv(buf, x, 233, 0xffff, 0x0000, uistat.lever_mode == LM_CENTER);
x += 5 * 6;
strcpy(buf, " ");
frequency_string(buf+1, 24-1, fcenter);
strcat(buf, " "); strcat(buf, " ");
ili9341_drawstring_5x7(buf, OFFSETX, 233, 0xffff, 0x0000); ili9341_drawstring_5x7(buf, x, 233, 0xffff, 0x0000);
strcpy(buf, "SPAN "); x = 205;
frequency_string(buf+5, 24-5, fspan); strcpy(buf, "SPAN");
ili9341_drawstring_5x7_inv(buf, x, 233, 0xffff, 0x0000, uistat.lever_mode == LM_SPAN);
x += 5 * 4;
strcpy(buf, " ");
frequency_string(buf+1, 24-1, fspan);
strcat(buf, " "); strcat(buf, " ");
ili9341_drawstring_5x7(buf, 205, 233, 0xffff, 0x0000); ili9341_drawstring_5x7(buf, x, 233, 0xffff, 0x0000);
} else { } else {
int fcenter = frequency0; int fcenter = frequency0;
chsnprintf(buf, 24, "CW %d.%03d %03d MHz ", chsnprintf(buf, 24, "CW %d.%03d %03d MHz ",

145
ui.c
View file

@ -28,7 +28,8 @@
uistat_t uistat = { uistat_t uistat = {
digit: 6, digit: 6,
current_trace: 0 current_trace: 0,
lever_mode: LM_MARKER
}; };
@ -766,6 +767,7 @@ menu_stimulus_cb(int item)
case 2: /* CENTER */ case 2: /* CENTER */
case 3: /* SPAN */ case 3: /* SPAN */
case 4: /* CW */ case 4: /* CW */
uistat.lever_mode = item == 3 ? LM_SPAN : LM_CENTER;
status = btn_wait_release(); status = btn_wait_release();
if (status & EVT_BUTTON_DOWN_LONG) { if (status & EVT_BUTTON_DOWN_LONG) {
ui_mode_numeric(item); ui_mode_numeric(item);
@ -814,22 +816,22 @@ menu_marker_op_cb(int item)
break; break;
case 3: /* MARKERS->SPAN */ case 3: /* MARKERS->SPAN */
{ {
if (previous_marker == active_marker) if (previous_marker == -1 || active_marker == previous_marker) {
return; int32_t center = get_sweep_frequency(ST_CENTER);
int32_t freq2 = get_marker_frequency(previous_marker); int32_t span = center - freq;
if (freq2 < 0) if (span < 0) span = -span;
return; set_sweep_frequency(ST_SPAN, span * 2);
if (freq > freq2) { } else {
freq2 = freq; int32_t freq2 = get_marker_frequency(previous_marker);
freq = get_marker_frequency(previous_marker); if (freq2 < 0)
return;
if (freq > freq2) {
freq2 = freq;
freq = get_marker_frequency(previous_marker);
}
set_sweep_frequency(ST_START, freq);
set_sweep_frequency(ST_STOP, freq2);
} }
set_sweep_frequency(ST_START, freq);
set_sweep_frequency(ST_STOP, freq2);
#if 0
int32_t span = (freq - freq2) * 2;
if (span < 0) span = -span;
set_sweep_frequency(ST_SPAN, span);
#endif
} }
break; break;
} }
@ -867,6 +869,7 @@ menu_marker_search_cb(int item)
break; break;
} }
redraw_marker(active_marker, TRUE); redraw_marker(active_marker, TRUE);
uistat.lever_mode = LM_SEARCH;
} }
void void
@ -911,6 +914,7 @@ menu_marker_sel_cb(int item)
} }
redraw_marker(active_marker, TRUE); redraw_marker(active_marker, TRUE);
draw_menu(); draw_menu();
uistat.lever_mode = LM_MARKER;
} }
const menuitem_t menu_calop[] = { const menuitem_t menu_calop[] = {
@ -1665,6 +1669,92 @@ ui_mode_normal(void)
ui_mode = UI_NORMAL; ui_mode = UI_NORMAL;
} }
static void
lever_move_marker(int status)
{
do {
if (active_marker >= 0 && markers[active_marker].enabled) {
if ((status & EVT_DOWN) && markers[active_marker].index > 0) {
markers[active_marker].index--;
markers[active_marker].frequency = frequencies[markers[active_marker].index];
redraw_marker(active_marker, FALSE);
}
if ((status & EVT_UP) && markers[active_marker].index < 100) {
markers[active_marker].index++;
markers[active_marker].frequency = frequencies[markers[active_marker].index];
redraw_marker(active_marker, FALSE);
}
}
status = btn_wait_release();
} while (status != 0);
if (active_marker >= 0)
redraw_marker(active_marker, TRUE);
}
static void
lever_search_marker(int status)
{
if (active_marker >= 0) {
if (status & EVT_DOWN) {
int i = marker_search_left(markers[active_marker].index);
if (i != -1)
markers[active_marker].index = i;
} else if (status & EVT_UP) {
int i = marker_search_right(markers[active_marker].index);
if (i != -1)
markers[active_marker].index = i;
}
redraw_marker(active_marker, TRUE);
}
}
// ex. 10942 -> 10000
// 6791 -> 5000
// 341 -> 200
static uint32_t
step_round(uint32_t v)
{
// decade step
uint32_t x = 1;
for (x = 1; x*10 < v; x *= 10)
;
// 1-2-5 step
if (x * 2 > v)
return x;
else if (x * 5 > v)
return x * 2;
else
return x * 5;
}
static void
lever_zoom_span(int status)
{
uint32_t span = get_sweep_frequency(ST_SPAN);
if (status & EVT_UP) {
span = step_round(span - 1);
set_sweep_frequency(ST_SPAN, span);
} else if (status & EVT_DOWN) {
span = step_round(span + 1);
span = step_round(span * 3);
set_sweep_frequency(ST_SPAN, span);
}
}
static void
lever_move_center(int status)
{
uint32_t center = get_sweep_frequency(ST_CENTER);
uint32_t span = get_sweep_frequency(ST_SPAN);
span = step_round(span / 3);
if (status & EVT_UP) {
set_sweep_frequency(ST_CENTER, center + span);
} else if (status & EVT_DOWN) {
set_sweep_frequency(ST_CENTER, center - span);
}
}
static void static void
ui_process_normal(void) ui_process_normal(void)
{ {
@ -1673,23 +1763,12 @@ ui_process_normal(void)
if (status & EVT_BUTTON_SINGLE_CLICK) { if (status & EVT_BUTTON_SINGLE_CLICK) {
ui_mode_menu(); ui_mode_menu();
} else { } else {
do { switch (uistat.lever_mode) {
if (active_marker >= 0 && markers[active_marker].enabled) { case LM_MARKER: lever_move_marker(status); break;
if ((status & EVT_DOWN) && markers[active_marker].index > 0) { case LM_SEARCH: lever_search_marker(status); break;
markers[active_marker].index--; case LM_CENTER: lever_move_center(status); break;
markers[active_marker].frequency = frequencies[markers[active_marker].index]; case LM_SPAN: lever_zoom_span(status); break;
redraw_marker(active_marker, FALSE); }
}
if ((status & EVT_UP) && markers[active_marker].index < 100) {
markers[active_marker].index++;
markers[active_marker].frequency = frequencies[markers[active_marker].index];
redraw_marker(active_marker, FALSE);
}
}
status = btn_wait_release();
} while (status != 0);
if (active_marker >= 0)
redraw_marker(active_marker, TRUE);
} }
} }
} }