lap timer fixups, menu_common() removes all symbols always

This commit is contained in:
Pavel Semerad
2012-04-20 14:07:15 +02:00
parent 9e1c177f0a
commit e6e7cbd653
5 changed files with 119 additions and 78 deletions

17
menu.c
View File

@@ -187,13 +187,12 @@ static void menu_channel_func(u8 action, menu_channel_t *p) {
case MCA_ADC_PRE: case MCA_ADC_PRE:
menu_set_adc_direction(menu_id); menu_set_adc_direction(menu_id);
return; // show nothing at ADC_PRE return; // show nothing at ADC_PRE
break;
case MCA_ADC_POST: case MCA_ADC_POST:
// do nothing if left-right didn't changed // do nothing if left-right didn't changed
if (p->last_direction == menu_adc_direction) return; if (p->last_direction == menu_adc_direction) return;
// else show value // else flag it to show value
menu_id_set = 1; // flag that new value is showed menu_id_set = 1; // flag that new value is showed
break; return;
} }
// show value // show value
@@ -202,14 +201,10 @@ static void menu_channel_func(u8 action, menu_channel_t *p) {
if (action != MCA_SET_CHG) p->func(menu_id, 0); // skip if changed if (action != MCA_SET_CHG) p->func(menu_id, 0); // skip if changed
if (menu_adc_wakeup) { if (menu_adc_wakeup) {
// show arrow // show arrow
if (menu_adc_direction) { if (menu_adc_direction)
lcd_segment(LS_SYM_RIGHT, LS_ON); lcd_segment(LS_SYM_RIGHT, LS_ON);
lcd_segment(LS_SYM_LEFT, LS_OFF); else
}
else {
lcd_segment(LS_SYM_LEFT, LS_ON); lcd_segment(LS_SYM_LEFT, LS_ON);
lcd_segment(LS_SYM_RIGHT, LS_OFF);
}
} }
p->last_direction = menu_adc_direction; p->last_direction = menu_adc_direction;
} }
@@ -435,10 +430,8 @@ static void sf_speed(u8 channel, u8 change) {
cm.thspd_onlyfwd ^= 1; cm.thspd_onlyfwd ^= 1;
else *addr = (u8)menu_change_val(*addr, 1, 100, SPEED_FAST, 0); else *addr = (u8)menu_change_val(*addr, 1, 100, SPEED_FAST, 0);
} }
if (thfwdonly) { if (thfwdonly)
lcd_chars(cm.thspd_onlyfwd ? "OFF" : "ON "); lcd_chars(cm.thspd_onlyfwd ? "OFF" : "ON ");
lcd_segment(LS_SYM_PERCENT, LS_OFF);
}
else { else {
lcd_char_num3(*addr); lcd_char_num3(*addr);
lcd_segment(LS_SYM_PERCENT, LS_ON); lcd_segment(LS_SYM_PERCENT, LS_ON);

15
menu.h
View File

@@ -149,13 +149,14 @@ extern u8 menu_blink; // what of chars should blink
typedef void (*menu_common_t)(u8 action, void *params); typedef void (*menu_common_t)(u8 action, void *params);
void menu_common(menu_common_t func, void *params, u8 flags); void menu_common(menu_common_t func, void *params, u8 flags);
// menu_common_t actions, all shows actual values // menu_common_t actions, all shows actual values
#define MCA_INIT 0 #define MCA_SHOW 0
#define MCA_SET_CHG 1 #define MCA_INIT 1
#define MCA_SET_NEXT 2 #define MCA_SET_CHG 2
#define MCA_ID_CHG 3 #define MCA_SET_NEXT 3
#define MCA_ADC_PRE 4 #define MCA_ID_CHG 4
#define MCA_ADC_POST 5 #define MCA_ADC_PRE 5
#define MCA_SWITCH 6 #define MCA_ADC_POST 6
#define MCA_SWITCH 7
// common list menu, given by list of functions, one for each menu item // common list menu, given by list of functions, one for each menu item

View File

@@ -183,17 +183,22 @@ u8 menu_id; // id of selected menu
_Bool menu_id_set; // 0 = in menu-id, 1 = in menu-setting _Bool menu_id_set; // 0 = in menu-id, 1 = in menu-setting
u8 menu_blink; // what of chars should blink u8 menu_blink; // what of chars should blink
void menu_common(menu_common_t func, void *params, u8 flags) { static void func_init(u8 flags) {
menu_id_set = flags & MCF_SET_ONLY ? 1 : 0; // blink all
menu_set = 0; // now in menu_id menu_blink = 0xff;
menu_id = 0; // first menu item
menu_blink = 0xff; // bit for each char to blink
// clear display symbols // clear display symbols
menu_clear_symbols(); menu_clear_symbols();
if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF); if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF);
}
void menu_common(menu_common_t func, void *params, u8 flags) {
menu_id_set = flags & MCF_SET_ONLY ? 1 : 0;
menu_set = 0; // now in menu_id
menu_id = 0; // first menu item
// init and show setting // init and show setting
func_init(flags);
func(MCA_INIT, params); func(MCA_INIT, params);
if (menu_id_set) { if (menu_id_set) {
lcd_chars_blink_mask(LB_SPC, menu_blink); lcd_chars_blink_mask(LB_SPC, menu_blink);
@@ -220,7 +225,7 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
// rotate encoder changed, change menu-id or value // rotate encoder changed, change menu-id or value
if (btn(BTN_ROT_ALL)) { if (btn(BTN_ROT_ALL)) {
if (menu_id_set) { if (menu_id_set) {
// change selected menu setting func_init(flags);
func(MCA_SET_CHG, params); func(MCA_SET_CHG, params);
lcd_chars_blink_mask(LB_SPC, menu_blink); lcd_chars_blink_mask(LB_SPC, menu_blink);
} }
@@ -230,13 +235,9 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
// reset some variables // reset some variables
menu_adc_wakeup = 0; menu_adc_wakeup = 0;
menu_force_value_channel = 0; menu_force_value_channel = 0;
menu_blink = 0xff; // default to all chars
// remove possible showed symbols
menu_clear_symbols();
if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF);
// select new menu id and show it // select new menu id and show it
func_init(flags);
func(MCA_ID_CHG, params); // do own change based on BTN_ROT func(MCA_ID_CHG, params); // do own change based on BTN_ROT
if (menu_blink & MCB_7SEG) lcd_set_blink(L7SEG, LB_SPC); if (menu_blink & MCB_7SEG) lcd_set_blink(L7SEG, LB_SPC);
@@ -250,11 +251,7 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
key_beep(); key_beep();
if (flags & MCF_SWITCH) { if (flags & MCF_SWITCH) {
// switch will be done by function // switch will be done by function
menu_blink = 0xff; // default to all chars func_init(flags);
// remove possible showed symbols
menu_clear_symbols();
if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF);
// select next menu setting
func(MCA_SWITCH, params); func(MCA_SWITCH, params);
if (menu_set == 255) break; // exit menu when requested if (menu_set == 255) break; // exit menu when requested
// blinking // blinking
@@ -269,11 +266,8 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
lcd_update(); lcd_update();
} }
else if (menu_id_set) { else if (menu_id_set) {
menu_blink = 0xff; // default to all chars
// remove possible showed symbols
menu_clear_symbols();
if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF);
// select next menu setting // select next menu setting
func_init(flags);
func(MCA_SET_NEXT, params); func(MCA_SET_NEXT, params);
if (menu_set || (flags & MCF_SET_ONLY)) { if (menu_set || (flags & MCF_SET_ONLY)) {
// some > 0 menu setting // some > 0 menu setting
@@ -296,14 +290,18 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
} }
} }
// if menu ADC was activated, call func to for example show other // if menu ADC was activated, call func to check if to show for example
// value when left-right position changed // other value when left-right position changed
if (menu_adc_wakeup) { if (menu_adc_wakeup) {
u8 mis = menu_id_set; // save value u8 mis = menu_id_set; // save value
menu_id_set = 0; // func will set it to 1 when new val showed menu_id_set = 0; // func will set it to 1 when show call needed
func(MCA_ADC_POST, params); func(MCA_ADC_POST, params);
if (menu_id_set) { if (menu_id_set) {
if (mis) { menu_id_set = mis;
// show changed value
func_init(flags);
func(MCA_SHOW, params);
if (menu_id_set) {
lcd_chars_blink_mask(LB_SPC, menu_blink); lcd_chars_blink_mask(LB_SPC, menu_blink);
} }
else { else {
@@ -311,7 +309,7 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
} }
lcd_update(); lcd_update();
} }
menu_id_set = mis; else menu_id_set = mis;
} }
} }
@@ -319,8 +317,7 @@ void menu_common(menu_common_t func, void *params, u8 flags) {
if (menu_id_set) func(MCA_SET_NEXT, params); if (menu_id_set) func(MCA_SET_NEXT, params);
// cleanup display // cleanup display
menu_clear_symbols(); func_init(flags);
if (flags & MCF_LOWPWR) lcd_segment(LS_SYM_LOWPWR, LS_OFF);
// reset variables // reset variables
menu_adc_wakeup = 0; menu_adc_wakeup = 0;
@@ -341,11 +338,9 @@ static void menu_list_func(u8 action, menu_list_params_t *p) {
case MCA_SET_CHG: case MCA_SET_CHG:
func(MLA_CHG); func(MLA_CHG);
return; // value already showed return; // value already showed
break;
case MCA_SET_NEXT: case MCA_SET_NEXT:
func(MLA_NEXT); func(MLA_NEXT);
return; // value already showed return; // value already showed
break;
case MCA_ID_CHG: case MCA_ID_CHG:
menu_id = (u8)menu_change_val(menu_id, 0, p->nitems - 1, 1, 1); menu_id = (u8)menu_change_val(menu_id, 0, p->nitems - 1, 1, 1);
func = p->funcs[menu_id]; func = p->funcs[menu_id];

View File

@@ -146,7 +146,6 @@ static void km_trim(u8 action) {
} }
// show value of menu_set // show value of menu_set
lcd_segment(LS_SYM_VOLTS, LS_OFF);
switch (menu_set) { switch (menu_set) {
case 0: case 0:
// function // function
@@ -311,7 +310,6 @@ static void km_key(u8 action) {
} }
// show value of menu_set // show value of menu_set
lcd_segment(LS_SYM_VOLTS, LS_OFF);
switch (menu_set) { switch (menu_set) {
case 0: case 0:
// function // function
@@ -375,7 +373,6 @@ static const u8 key_ids[] = {
void menu_key_mapping_func(u8 action, void *p) { void menu_key_mapping_func(u8 action, void *p) {
if (action == MCA_SET_CHG) { if (action == MCA_SET_CHG) {
km_trim_key(1); km_trim_key(1);
return; // value already showed
} }
else if (action == MCA_SET_NEXT) { else if (action == MCA_SET_NEXT) {
km_trim_key(2); km_trim_key(2);
@@ -408,7 +405,8 @@ void menu_key_mapping_func(u8 action, void *p) {
// left trim key // left trim key
lcd_segment(LS_SYM_LEFT, LS_ON); lcd_segment(LS_SYM_LEFT, LS_ON);
} }
if (action != MCA_SET_NEXT) km_trim_key(0); if (action != MCA_SET_NEXT && action != MCA_SET_CHG)
km_trim_key(0);
} }
void menu_key_mapping(void) { void menu_key_mapping(void) {

View File

@@ -48,6 +48,7 @@ static @near u8 timer_lap_count[TIMER_NUM];
static @near menu_timer_s timer_lap_time[TIMER_NUM][TIMER_MAX_LAPS]; static @near menu_timer_s timer_lap_time[TIMER_NUM][TIMER_MAX_LAPS];
// time when lap button can be pressed (to eliminate double-clicks) // time when lap button can be pressed (to eliminate double-clicks)
static @near u16 next_timer_sec[TIMER_NUM]; static @near u16 next_timer_sec[TIMER_NUM];
static @near u16 next_timer_sec_display[TIMER_NUM];
@@ -135,18 +136,41 @@ void menu_timer_show(u8 tid) {
case TIMER_LAP: case TIMER_LAP:
// if several seconds from last LAP press, show actual timer value // if several seconds from last LAP press, show actual timer value
if (time_sec >= next_timer_sec[tid]) { if (time_sec >= next_timer_sec_display[tid]) {
timer_value(pt); timer_value(pt);
break; break;
} }
// show last lap time for several seconds // show last lap time for several seconds
lap = timer_lap_count[tid]; lap = timer_lap_count[tid];
if (lap) { if (lap > 1) {
menu_timer_s *pt2, tm;
s16 hdr;
// to last lap id
lap--; // to last lap id lap--; // to last lap id
while (lap >= TIMER_MAX_LAPS) lap -= TIMER_MAX_LAPS; while (lap >= TIMER_MAX_LAPS) lap -= TIMER_MAX_LAPS;
timer_value(&timer_lap_time[tid][lap]); timer_value(&timer_lap_time[tid][lap]);
// calculate lap time as difference between lap and lap -1
if (lap) pt2 = &timer_lap_time[tid][lap - 1];
else pt2 = &timer_lap_time[tid][TIMER_MAX_LAPS - 1];
pt = &timer_lap_time[tid][lap];
tm.sec = pt->sec - pt2->sec;
hdr = pt->hdr - pt2->hdr;
if (hdr < 0) {
tm.sec--;
hdr += 100;
}
tm.hdr = (u8)hdr;
timer_value(&tm);
} }
else timer_value(NULL); else if (lap)
// first lap
timer_value(&timer_lap_time[tid][0]);
else
// no lap
timer_value(NULL);
// blink this last lap time
lcd_set_blink(L7SEG, LB_SPC);
lcd_chars_blink(LB_SPC);
break; break;
case TIMER_LAPCNT: case TIMER_LAPCNT:
@@ -164,12 +188,6 @@ void menu_timer_show(u8 tid) {
// lap times clear
static void lap_times_clear(u8 tid) {
timer_lap_count[tid] = 0;
memset(&timer_lap_time[tid], 0, TIMER_MAX_LAPS * sizeof(menu_timer_s));
}
// clear timer // clear timer
void menu_timer_clear(u8 tid, u8 laps) { void menu_timer_clear(u8 tid, u8 laps) {
menu_timer_s *pt = &menu_timer[tid]; menu_timer_s *pt = &menu_timer[tid];
@@ -182,8 +200,10 @@ void menu_timer_clear(u8 tid, u8 laps) {
// zero values, laps only when requested // zero values, laps only when requested
pt->hdr = 0; pt->hdr = 0;
menu_timer_alarmed &= (u8)~tbit; menu_timer_alarmed &= (u8)~tbit;
if (laps == 1 || (laps == 2 && type != TIMER_DOWN)) if (laps == 1 || (laps == 2 && type != TIMER_DOWN)) {
lap_times_clear(tid); timer_lap_count[tid] = 0;
memset(&timer_lap_time[tid], 0, TIMER_MAX_LAPS * sizeof(menu_timer_s));
}
// set alarm // set alarm
if (type == TIMER_LAPCNT) if (type == TIMER_LAPCNT)
@@ -247,7 +267,7 @@ static void timer_setup_alarm(u8 action) {
} }
static const u8 timer_type_labels[][4] = { static const u8 timer_type_labels[][4] = {
"OFF", "UP ", "DWN", "LPT", "LPC" "OFF", "UP ", "DWN", "LAP", "LPC"
}; };
static void timer_setup_type(u8 action) { static void timer_setup_type(u8 action) {
u8 tid = timer_id; // compiler hack u8 tid = timer_id; // compiler hack
@@ -275,6 +295,10 @@ static const menu_list_t timer_setup_funcs[] = {
}; };
void menu_timer_setup(u8 tid) { void menu_timer_setup(u8 tid) {
// stop timer
menu_timer_running &= (u8)~(u8)(1 << tid);
next_timer_sec_display[tid] = 0; // display last value
// set timer_id for subfunctions
timer_id = tid; timer_id = tid;
menu_list(timer_setup_funcs, sizeof(timer_setup_funcs) / sizeof(void *), MCF_NONE); menu_list(timer_setup_funcs, sizeof(timer_setup_funcs) / sizeof(void *), MCF_NONE);
config_global_save(); config_global_save();
@@ -310,13 +334,13 @@ static void lap_times_func(u8 action, u8 *ptid) {
case MCA_ID_CHG: case MCA_ID_CHG:
// change to other lap, skip TOT ang AVG for down timer // change to other lap, skip TOT ang AVG for down timer
menu_id = (u8)menu_change_val(menu_id, 0, menu_id = (u8)menu_change_val(menu_id, 0,
laps + (type != TIMER_DOWN ? 2 : 0), LAP_SHOW_FAST, 0); laps + (type != TIMER_DOWN ? 2 : 0), LAP_SHOW_FAST, 1);
break; break;
case MCA_SWITCH: case MCA_SWITCH:
// switch between lap numbers and times // switch between lap numbers and times
if (menu_id == laps) { if (menu_id == laps) {
// if RESset selected, delete all values end exit // if RESset selected, delete all values end exit
lap_times_clear(tid); menu_timer_clear(tid, 1);
menu_set = 255; // flag to exit menu_set = 255; // flag to exit
return; return;
} }
@@ -328,16 +352,26 @@ static void lap_times_func(u8 action, u8 *ptid) {
// show value // show value
menu_blink = 0; // no blinking menu_blink = 0; // no blinking
timer_show_id(tid); timer_show_id(tid);
// blink arrow to indicate lap times viewing
lcd_segment_blink(LS_SYM_LEFT, LB_SPC);
lcd_segment_blink(LS_SYM_RIGHT, LB_SPC);
// show lap number // show lap number
if (!menu_id_set) { if (!menu_id_set) {
lcd_7seg('L'); lcd_7seg(L7_L);
if (menu_id == laps) if (menu_id == laps)
lcd_chars("RES"); lcd_chars("RES");
else if (menu_id == laps + 1) else if (menu_id > laps) {
lcd_chars("AVG"); u8 laps10 = (u8)(laps / 10);
else if (menu_id == laps + 2) // show ID Average/Total
lcd_chars("TOT"); if (menu_id == laps + 1) lcd_char(LCHR1, 'A'); // average
else lcd_char(LCHR1, 'T'); // total
// show number of laps
if (laps10 == 10) lcd_char(LCHR2, LCHAR_ONE_ZERO);
else if (laps10 == 0) lcd_char(LCHR2, ' ');
else lcd_char(LCHR2, (u8)(laps10 + '0'));
lcd_char(LCHR3, (u8)(laps % 10 + '0'));
}
else lcd_char_num3(menu_id + 1); else lcd_char_num3(menu_id + 1);
return; return;
} }
@@ -350,10 +384,25 @@ static void lap_times_func(u8 action, u8 *ptid) {
return; return;
} }
else if (menu_id == laps + 1) { else if (menu_id == laps + 1) {
// average XXX // average lap times
lcd_set(L7SEG, LB_EMPTY); if (laps) {
lcd_chars("NDY"); // we have at least one lap
return; u32 tot;
pt = &timer_lap_time[tid][laps - 1];
// count in hundredths
tot = (u32)pt->sec * 100 + pt->hdr;
// average
tot = (tot + laps / 2) / laps;
// assign to timer val
tm.sec = (u16)(tot / 100);
tm.hdr = (u8)(tot % 100);
}
else {
// no laps, show zero
tm.sec = 0;
tm.hdr = 0;
}
pt = &tm;
} }
else if (menu_id == laps + 2) else if (menu_id == laps + 2)
// total, read time of last lap // total, read time of last lap
@@ -366,9 +415,9 @@ static void lap_times_func(u8 action, u8 *ptid) {
} }
else { else {
// show lap time // show lap time
if (menu_id == 0) if (menu_id == 0 || type == TIMER_DOWN)
// first lap // first lap or down timer
pt = &timer_lap_time[tid][0]; pt = &timer_lap_time[tid][menu_id];
else { else {
// calculate lap time as difference between lap and lap -1 // calculate lap time as difference between lap and lap -1
menu_timer_s *pt2 = &timer_lap_time[tid][menu_id - 1]; menu_timer_s *pt2 = &timer_lap_time[tid][menu_id - 1];
@@ -467,15 +516,19 @@ void kf_menu_timer_start(u8 *id, u8 *param, u8 flags, s16 *pv) {
// when not running, start it // when not running, start it
if (!(menu_timer_running & tbit)) { if (!(menu_timer_running & tbit)) {
menu_timer_running |= tbit; menu_timer_running |= tbit;
next_timer_sec_display[tid] = 0; // display running value
break; break;
} }
// when alarmed already, stop timer // when alarmed already, stop timer
if (menu_timer_alarmed & tbit) { if (menu_timer_alarmed & tbit) {
menu_timer_running &= (u8)~tbit; menu_timer_running &= (u8)~tbit;
menu_timer_throttle &= (u8)~tbit; menu_timer_throttle &= (u8)~tbit;
next_timer_sec_display[tid] = 0; // display last value
timer_lap_time_save(tid);
break; break;
} }
// save to lap times // save to lap times
next_timer_sec_display[tid] = time_sec + 3;
timer_lap_time_save(tid); timer_lap_time_save(tid);
break; break;
@@ -532,6 +585,7 @@ void kf_menu_timer_reset(u8 *id, u8 *param, u8 flags, s16 *pv) {
// stop timer // stop timer
menu_timer_running &= (u8)~tbit; menu_timer_running &= (u8)~tbit;
menu_timer_throttle &= (u8)~tbit; menu_timer_throttle &= (u8)~tbit;
next_timer_sec_display[tid] = 0; // display last value
break; break;
case TIMER_LAPCNT: case TIMER_LAPCNT: