slider ui fix

multi_trace
DiSlord 5 years ago committed by erikkaashoek
parent ee2af4df40
commit 1b7219f7c7

85
ui.c

@ -358,16 +358,6 @@ touch_check(void)
} }
#endif #endif
} }
#if 0 // Long press detection
systime_t ticks = chVTGetSystemTimeX();
if (stat && !last_touch_status) { // new button, initialize
prev_touch_time = ticks;
}
dt = ticks - prev_touch_time;
if (stat && stat == last_touch_status && dt > BUTTON_DOWN_LONG_TICKS) {return EVT_TOUCH_LONGPRESS;}
#endif
if (stat != last_touch_status) { if (stat != last_touch_status) {
last_touch_status = stat; last_touch_status = stat;
return stat ? EVT_TOUCH_PRESSED : EVT_TOUCH_RELEASED; return stat ? EVT_TOUCH_PRESSED : EVT_TOUCH_RELEASED;
@ -1326,48 +1316,47 @@ void check_frequency_slider(freq_t slider_freq)
} }
} }
#define TOUCH_DEAD_ZONE 40
static void static void
menu_select_touch(int i, int pos) menu_select_touch(int i, int pos)
{ {
long_t step = 0; long_t step = 0;
int do_exit = false; int do_exit = false;
selection = i; selection = i;
draw_menu(); draw_menu_mask(1<<i);
#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];
int old_keypad_mode = keypad_mode; int old_keypad_mode = keypad_mode;
int keypad = menu[i].data; int keypad = menu[i].data;
systime_t prev_touch_time = chVTGetSystemTimeX();
systime_t wait = BUTTON_DOWN_LONG_TICKS;
int touch_x, touch_y, prev_touch_x = 0; int touch_x, touch_y, prev_touch_x = 0;
// touch_position(&touch_x, &touch_y); // touch_position(&touch_x, &touch_y);
systime_t dt = 0; systime_t dt = 0;
int mode = SL_UNKNOWN; int mode = SL_UNKNOWN;
while (touch_check() != EVT_TOUCH_NONE) {
systime_t ticks = chVTGetSystemTimeX(); systime_t ticks = chVTGetSystemTimeX();
dt = ticks - prev_touch_time; while (touch_check() != EVT_TOUCH_NONE){
dt = chVTGetSystemTimeX() - ticks;
if (dt > BUTTON_DOWN_LONG_TICKS) break;
}
if (dt > wait) { if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && dt >= BUTTON_DOWN_LONG_TICKS){
// wait = MS2ST(100); prev_touch_time = ticks; // Wait release touch and process it
while (touch_check() != EVT_TOUCH_NONE){
touch_position(&touch_x, &touch_y); touch_position(&touch_x, &touch_y);
if (abs(touch_x - prev_touch_x) > 1) { if (abs(touch_x - prev_touch_x) < 2) continue;
fetch_numeric_target(keypad); fetch_numeric_target(keypad);
int new_slider = touch_x - LCD_WIDTH/2; // Can have negative outcome int new_slider = touch_x - LCD_WIDTH/2; // Can have negative outcome
if (new_slider < - (MENU_FORM_WIDTH-8)/2 - 1) if (new_slider < - (MENU_FORM_WIDTH-8)/2 - 1)
new_slider = -(MENU_FORM_WIDTH-8)/2 - 1; new_slider = -(MENU_FORM_WIDTH-8)/2 - 1;
if (new_slider > (MENU_FORM_WIDTH-8)/2 + 1) if (new_slider > (MENU_FORM_WIDTH-8)/2 + 1)
new_slider = (MENU_FORM_WIDTH-8)/2 + 1; new_slider = (MENU_FORM_WIDTH-8)/2 + 1;
if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_CENTER){ if (keypad == KM_CENTER) {
#define TOUCH_DEAD_ZONE 40
if (mode == SL_UNKNOWN ) { if (mode == SL_UNKNOWN ) {
if (abs(setting.slider_position - new_slider) < TOUCH_DEAD_ZONE) { // Pick up slider if (abs(setting.slider_position - new_slider) < TOUCH_DEAD_ZONE) // Pick up slider
mode = SL_MOVE; mode = SL_MOVE;
} else { else
mode = SL_SPAN; mode = SL_SPAN;
goto first_span;
}
} }
if (mode == SL_MOVE ) { if (mode == SL_MOVE ) {
long_t freq_delta = (setting.slider_span/(MENU_FORM_WIDTH-8))*(new_slider - setting.slider_position); long_t freq_delta = (setting.slider_span/(MENU_FORM_WIDTH-8))*(new_slider - setting.slider_position);
@ -1384,9 +1373,9 @@ menu_select_touch(int i, int pos)
dirty = false; dirty = false;
perform(false, 0, uistat.freq_value, false); perform(false, 0, uistat.freq_value, false);
draw_menu_mask(1<<i); draw_menu_mask(1<<i);
} else if (mode == SL_SPAN ){ }
else if (mode == SL_SPAN ){
freq_t slider_freq; freq_t slider_freq;
first_span:
slider_freq = uistat.freq_value; slider_freq = uistat.freq_value;
int pw=new_slider + LCD_WIDTH/2; int pw=new_slider + LCD_WIDTH/2;
setting.slider_position = pw - LCD_WIDTH/2; // Show delta on slider setting.slider_position = pw - LCD_WIDTH/2; // Show delta on slider
@ -1409,53 +1398,36 @@ menu_select_touch(int i, int pos)
minFreq = 0; // And set minFreq to 0 for span display minFreq = 0; // And set minFreq to 0 for span display
uistat.freq_value = setting.slider_span; uistat.freq_value = setting.slider_span;
set_keypad_value(keypad); set_keypad_value(keypad);
#if 1
plot_printf(center_text, sizeof center_text, "RANGE: %%s"); plot_printf(center_text, sizeof center_text, "RANGE: %%s");
#else
center_text[0] = 'S';
center_text[1] = 'P';
center_text[2] = 'A';
center_text[3] = 'N';
#endif
draw_menu_mask(1<<i); // Show slider span draw_menu_mask(1<<i); // Show slider span
minFreq = old_minFreq; // and restore minFreq minFreq = old_minFreq; // and restore minFreq
uistat.freq_value = slider_freq; // and restore current slider freq uistat.freq_value = slider_freq; // and restore current slider freq
set_keypad_value(keypad); set_keypad_value(keypad);
#if 1
plot_printf(center_text, sizeof center_text, "FREQ: %%s"); plot_printf(center_text, sizeof center_text, "FREQ: %%s");
#else
center_text[0] = 'F';
center_text[1] = 'R';
center_text[2] = 'E';
center_text[3] = 'Q';
#endif
setting.slider_position = 0; // reset slider after span change setting.slider_position = 0; // reset slider after span change
check_frequency_slider(slider_freq); check_frequency_slider(slider_freq);
} }
} else if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_LOWOUTLEVEL) { chThdSleepMilliseconds(100);
} else if (keypad == KM_LOWOUTLEVEL) {
uistat.value = setting.external_gain + ((touch_x - OFFSETX+4) * level_range() ) / (MENU_FORM_WIDTH-8) + level_min() ; uistat.value = setting.external_gain + ((touch_x - OFFSETX+4) * level_range() ) / (MENU_FORM_WIDTH-8) + level_min() ;
apply_step:
set_keypad_value(keypad); set_keypad_value(keypad);
perform(false, 0, get_sweep_frequency(ST_CENTER), false); perform(false, 0, get_sweep_frequency(ST_CENTER), false);
draw_menu_mask(1<<i); draw_menu_mask(1<<i);
// } } else if (keypad == KM_HIGHOUTLEVEL) {
// } else if (MT_MASK(menu[i].type) == MT_ADV_CALLBACK && menu[i].reference == menu_sdrive_acb) {
} else if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_HIGHOUTLEVEL) {
set_level( (touch_x - OFFSETX+4) *(level_range()) / (MENU_FORM_WIDTH-8) + level_min() ); set_level( (touch_x - OFFSETX+4) *(level_range()) / (MENU_FORM_WIDTH-8) + level_min() );
perform(false, 0, get_sweep_frequency(ST_CENTER), false); perform(false, 0, get_sweep_frequency(ST_CENTER), false);
draw_menu_mask(1<<i); draw_menu_mask(1<<i);
} }
keypad_mode = old_keypad_mode;
}
}
prev_touch_x = touch_x; prev_touch_x = touch_x;
} }
if (dt > BUTTON_DOWN_LONG_TICKS || do_exit) { keypad_mode = old_keypad_mode;
selection = -1; selection = -1;
draw_menu(); draw_menu();
// redraw_request = 0; // reset all (not need update after)
return; return;
} }
// Wait touch release
touch_wait_release();
if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_LOWOUTLEVEL) { if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_LOWOUTLEVEL) {
switch (pos) { switch (pos) {
case 0: case 0:
@ -1475,7 +1447,6 @@ menu_select_touch(int i, int pos)
} }
uistat.value = setting.external_gain + get_level() + step; uistat.value = setting.external_gain + get_level() + step;
do_exit = true; do_exit = true;
goto apply_step;
} else if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_CENTER) { } else if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_CENTER) {
switch (pos) { switch (pos) {
case 0: case 0:
@ -1502,13 +1473,17 @@ menu_select_touch(int i, int pos)
do_exit = true; do_exit = true;
setting.slider_position = 0; // reset slider after step setting.slider_position = 0; // reset slider after step
check_frequency_slider(uistat.freq_value); check_frequency_slider(uistat.freq_value);
goto apply_step;
} }
if (do_exit){
set_keypad_value(keypad);
perform(false, 0, get_sweep_frequency(ST_CENTER), false);
selection = -1;
draw_menu();
return;
}
nogo: nogo:
setting.slider_position = 0; // Reset slider when entering frequency setting.slider_position = 0; // Reset slider when entering frequency
#endif #endif
// touch_wait_release(); // touch_wait_release();
selection = -1; selection = -1;
menu_invoke(i); menu_invoke(i);

Loading…
Cancel
Save

Powered by TurnKey Linux.