Slider working

master
erikkaashoek 5 years ago
parent a37a40228e
commit af88eae535

93
ui.c

@ -87,6 +87,18 @@ static int8_t kp_index = 0;
static char *kp_help_text = NULL; static char *kp_help_text = NULL;
static uint8_t menu_current_level = 0; static uint8_t menu_current_level = 0;
static int selection = 0; static int selection = 0;
static int slider_position = 0;
static int slider_delta = 100000;
static const uint8_t slider_bitmap[]=
{
_BMP8(0b11111110),
_BMP8(0b11111110),
_BMP8(0b11111110),
_BMP8(0b01111100),
_BMP8(0b00111000),
_BMP8(0b00010000)
};
// Button definition (used in MT_ADV_CALLBACK for custom) // Button definition (used in MT_ADV_CALLBACK for custom)
#define BUTTON_ICON_NONE -1 #define BUTTON_ICON_NONE -1
@ -1812,6 +1824,9 @@ draw_menu_buttons(const menuitem_t *menu)
blit8BitWidthBitmap(button_start+MENU_FORM_WIDTH- FORM_ICON_WIDTH-8,y+(button_height-FORM_ICON_HEIGHT)/2,FORM_ICON_WIDTH,FORM_ICON_HEIGHT,&right_icons[((menu[i].data >>0)&0xf)*2*FORM_ICON_HEIGHT]); blit8BitWidthBitmap(button_start+MENU_FORM_WIDTH- FORM_ICON_WIDTH-8,y+(button_height-FORM_ICON_HEIGHT)/2,FORM_ICON_WIDTH,FORM_ICON_HEIGHT,&right_icons[((menu[i].data >>0)&0xf)*2*FORM_ICON_HEIGHT]);
} }
#endif #endif
if (menu[i].type && MT_KEYPAD && menu[i].data == KM_CENTER)
blit8BitWidthBitmap(LCD_WIDTH/2+slider_position - 4, y, 7, 6, slider_bitmap);
// ili9341_line(LCD_WIDTH/2+slider_position, y, LCD_WIDTH/2+slider_position,y+button_height);
} else { } else {
int button_width = MENU_BUTTON_WIDTH; int button_width = MENU_BUTTON_WIDTH;
int button_start = LCD_WIDTH - MENU_BUTTON_WIDTH; int button_start = LCD_WIDTH - MENU_BUTTON_WIDTH;
@ -1843,46 +1858,83 @@ draw_menu_buttons(const menuitem_t *menu)
static systime_t prev_touch_time = 0; static systime_t prev_touch_time = 0;
static int prev_touch_button = -1; static int prev_touch_button = -1;
enum { SL_UNKNOWN, SL_SPAN, SL_MOVE};
static void static void
menu_select_touch(int i) menu_select_touch(int i,int y)
{ {
selection = i; selection = i;
draw_menu(); draw_menu();
#if 1 // drag values #if 1 // drag values
const menuitem_t *menu = menu_stack[menu_current_level]; const menuitem_t *menu = menu_stack[menu_current_level];
prev_touch_time = chVTGetSystemTimeX();
if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD){ if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && menu[i].data == KM_CENTER){
int touch_x, touch_y; int touch_x, touch_y, prev_touch_x;
touch_position(&touch_x, &touch_y); touch_position(&touch_x, &touch_y);
float old_value;
int v = menu[i].data;
int old_keypad_mode = keypad_mode;
keypad_mode = v;
fetch_numeric_target();
old_value = uistat.value - slider_position * slider_delta; // Center value;
keypad_mode = old_keypad_mode;
systime_t dt = 0; systime_t dt = 0;
while (touch_check() != EVT_TOUCH_RELEASED) { int moving = SL_UNKNOWN;
while (touch_check() != EVT_TOUCH_NONE) {
prev_touch_x = touch_x;
touch_position(&touch_x, &touch_y);
systime_t ticks = chVTGetSystemTimeX(); systime_t ticks = chVTGetSystemTimeX();
if (prev_touch_button != i) { // new button, initialize
prev_touch_time = ticks;
prev_touch_button = i;
}
dt = ticks - prev_touch_time; dt = ticks - prev_touch_time;
if (dt > BUTTON_DOWN_LONG_TICKS) { if (dt > BUTTON_DOWN_LONG_TICKS) {
int v = menu[i].data;
int old_keypad_mode = keypad_mode; int old_keypad_mode = keypad_mode;
keypad_mode = v; keypad_mode = v;
fetch_numeric_target(); fetch_numeric_target();
float m = 1.0; float m = 1.0;
#define TOUCH_DEAD_ZONE 5 #define TOUCH_DEAD_ZONE 20
#define PULL_SPEED 25.0 int new_slider = touch_x - LCD_WIDTH/2;
if (touch_x < LCD_WIDTH/2 - TOUCH_DEAD_ZONE) { float saved_value;
m = 1 / (1 + pow(10, -6 + ((float)((LCD_WIDTH/2 - TOUCH_DEAD_ZONE) - touch_x))/PULL_SPEED)); if (moving == SL_UNKNOWN ) {
} else if (touch_x > LCD_WIDTH/2 + TOUCH_DEAD_ZONE) { if (slider_position - TOUCH_DEAD_ZONE < new_slider && new_slider < slider_position + TOUCH_DEAD_ZONE) { // Pick up slider
m = 1 + pow(10, -6 + ((float)(touch_x - (LCD_WIDTH/2 + TOUCH_DEAD_ZONE)))/PULL_SPEED); moving = SL_MOVE;
} } else {
uistat.value *= m; moving = SL_SPAN;
goto first_span;
}
}
if (moving == SL_MOVE ) {
if (touch_x != prev_touch_x) {
uistat.value = old_value + new_slider * slider_delta;
if (uistat.value < 0)
uistat.value = 0;
slider_position = new_slider;
keypad_mode = v;
set_numeric_value(); set_numeric_value();
// selection = -1; perform(false, 0, (uint32_t)uistat.value, false);
draw_menu(); draw_menu();
}
} else if (moving == SL_SPAN ){
if (touch_x != prev_touch_x) {
first_span:
saved_value = uistat.value;
int pw=touch_x * 5 / LCD_WIDTH;
slider_delta = 100;
while (pw-->0)
slider_delta *=10;
slider_position = 0; // Use current slider as center
uistat.value = slider_delta;
keypad_mode = v;
set_numeric_value();
draw_menu(); // Show slaider span
uistat.value = saved_value;
keypad_mode = v;
set_numeric_value();
}
}
keypad_mode = old_keypad_mode; keypad_mode = old_keypad_mode;
return; // return;
} }
} }
if (dt > BUTTON_DOWN_LONG_TICKS) { if (dt > BUTTON_DOWN_LONG_TICKS) {
@ -1890,6 +1942,7 @@ menu_select_touch(int i)
draw_menu(); draw_menu();
return; return;
} }
slider_position = 0; // Reset slider when entering frequency
prev_touch_button = -1; prev_touch_button = -1;
} else } else
#endif #endif
@ -1928,7 +1981,7 @@ menu_apply_touch(void)
} }
if (y < touch_y && touch_y < y+MENU_BUTTON_HEIGHT) { if (y < touch_y && touch_y < y+MENU_BUTTON_HEIGHT) {
if (touch_x > active_button_start) { if (touch_x > active_button_start) {
menu_select_touch(i); menu_select_touch(i, y);
return; return;
} }
} }

@ -402,7 +402,8 @@ static const keypads_t keypads_time[] = {
}; };
enum { enum {
KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFLEVEL, KM_SCALE, KM_ATTENUATION, KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, // These must be first to share common help text
KM_REFLEVEL, KM_SCALE, KM_ATTENUATION,
KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE,
KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY,
KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, KM_MODULATION,KM_COR_AM,KM_COR_WFM, KM_COR_NFM, KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, KM_MODULATION,KM_COR_AM,KM_COR_WFM, KM_COR_NFM,
@ -1486,7 +1487,7 @@ static const menuitem_t menu_lowoutputmode[] = {
// { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", "0..350MHz"}, // { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", "0..350MHz"},
// { MT_FORM | MT_KEYPAD | MT_LOW, KM_LEVELSWEEP,"LEVEL CHANGE: %s", "-70..70"}, // { MT_FORM | MT_KEYPAD | MT_LOW, KM_LEVELSWEEP,"LEVEL CHANGE: %s", "-70..70"},
// { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME, "SWEEP TIME: %s", "0..600 seconds"}, // { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME, "SWEEP TIME: %s", "0..600 seconds"},
{ MT_FORM | MT_KEYPAD, KM_OFFSET, "AMP: %s", "-100..+100"}, { MT_FORM | MT_KEYPAD, KM_OFFSET, "EXTERNAL AMP: %s", "-100..+100"},
{ MT_FORM | MT_CANCEL, 0, "MODE", NULL }, { MT_FORM | MT_CANCEL, 0, "MODE", NULL },
{ MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel
}; };
@ -2111,7 +2112,7 @@ static void fetch_numeric_target(void)
// if (setting.sweep_time_us < calc_min_sweep_time_us()) // if (setting.sweep_time_us < calc_min_sweep_time_us())
// uistat.value = calc_min_sweep_time_us(); // uistat.value = calc_min_sweep_time_us();
// else // else
uistat.value = setting.actual_sweep_time_us; uistat.value = setting.sweep_time_us;
uistat.value /= (float)ONE_SECOND_TIME; uistat.value /= (float)ONE_SECOND_TIME;
plot_printf(uistat.text, sizeof uistat.text, "%.3Fs", uistat.value); plot_printf(uistat.text, sizeof uistat.text, "%.3Fs", uistat.value);
break; break;

Loading…
Cancel
Save

Powered by TurnKey Linux.