///////////////////////////////////////////////////////////////////// // First byte, hex: Row number if less then 32, Display text in title else // Rest: Text to display, up to 16 char. // 00:title (big font). // 01-08:body // 09:scroll up, add row at bottom // 0A:scroll down, add row at top // 0B:redraw screen. // FF:control functions: Switch LCD on/of, set contrast void lcdfunc(char *in) { uint8_t hb[4]; uint8_t narg = fromhex(in+1, hb, 4); if(narg > 0 && hb[0] == 0xFF) { if(hb[1] != 0xFF) lcd_switch(hb[1]); if(hb[2] != 0xFF) lcd_contrast(hb[2]); #ifdef LCD_BL_PWM if(hb[3] != 0xFF) lcd_brightness(hb[3]); #endif return; } if(narg == 0 || hb[0] >= 0x20) { // Strange lines go to the title hb[0] = 0; in += 1; } else { in += 3; } lcd_putline(hb[0], in); }
void menu_handle_joystick(uint8_t key) { uint8_t menu_line[MLINESIZE+1]; //////////////////////////////////////// // Scrolling up/down. if(key == KEY_DOWN || key == KEY_UP) { menu_setbg(menu_curitem); lcd_putchar(menu_curitem-menu_topitem+1, ' '); uint8_t insert_line = 0; if(key == KEY_DOWN) { if(menu_curitem == menu_nitems-1) menu_curitem = 0; else menu_curitem++; if(menu_curitem - menu_topitem >= BODY_LINES) { menu_topitem++; insert_line = 9; } } if(key == KEY_UP) { if(menu_curitem == 0) menu_curitem = menu_nitems-1; else menu_curitem--; if(menu_topitem > menu_curitem) { menu_topitem--; insert_line = 10; } } menu_setbg(menu_curitem); if(insert_line) { uint8_t dpybuf[17]; menu_get_line(menu_item_offset[menu_curitem], menu_line, sizeof(menu_line)); menu_getlineword(1, menu_line, dpybuf+1, sizeof(dpybuf)-1); dpybuf[0] = ' '; lcd_putline(insert_line, (char *)dpybuf); } lcd_putchar(menu_curitem-menu_topitem+1, '>'); } //////////////////////////////////////// // Exec current command if(key == KEY_RIGHT) { // Save the current position menu_lastsel[menu_stack[menu_stackidx-1]] = menu_curitem; menu_get_line(menu_item_offset[menu_curitem], menu_line, sizeof(menu_line)); uint8_t arg[MLINESIZE]; menu_getlineword(2, menu_line, arg, sizeof(arg)); if(menu_line[0] == 'S') { // submenu uint8_t sm; fromhex((char *)arg, &sm, 1); menu_push(sm); } if(menu_line[0] == 'C') { // Command lcd_invon(); callfn((char *)arg); lcd_invoff(); } if(menu_line[0] == 'm') { // Macro uint8_t idx; uint16_t off; lcd_invon(); fromhex((char *)arg, &idx, 1); off = menu_get_line(menu_offset[idx], menu_line, sizeof(menu_line)); while(off && menu_line[0]) { off = menu_get_line(off, menu_line, sizeof(menu_line)); if(off == 0 || !menu_line[0]) break; callfn((char *)menu_line); } lcd_invoff(); } } if(key == KEY_LEFT) { // pop menu stack // Save the current position menu_lastsel[menu_stack[menu_stackidx-1]] = menu_curitem; menu_pop(); } //////////////////////////////////////// // Switch display on / off if(key == KEY_ENTER) { if(lcd_on) { if(lcd_on == 0xff) { lcd_switch(1); lcd_cls(); lcd_contrast(0xfc); menu_stackidx = 0; menu_push(0); } else { dosleep(); } } else { lcd_switch(1); } bat_drawstate(); } }
void Minute_Task(void) { static uint8_t last_tick; if((uint8_t)ticks == last_tick) return; last_tick = (uint8_t)ticks; wdt_reset(); // 125Hz #ifdef XLED if ((ticks % 12) == 0) { if ( xled_pattern & _BV(xled_pos++) ) { LED_ON(); } else { LED_OFF(); } } xled_pos &= 15; #endif #ifdef HAS_FHT_TF // iterate over all TFs for(uint8_t i = 0; i < FHT_TF_NUM; i++) { // if timed out -> call fht_tf_timer to send out data if(fht_tf_timeout_Array[3 * i] == 0) { fht_tf_timer(i); } } #endif #ifdef HAS_FHT_8v if(fht8v_timeout == 0) fht8v_timer(); #endif #ifdef HAS_FHT_80b if(fht80b_timeout == 0) fht80b_timer(); #endif #ifdef HAS_RF_ROUTER if(rf_router_sendtime && --rf_router_sendtime == 0) rf_router_flush(); #endif #ifdef HAS_ONEWIRE // Check if a running conversion is done // if HMS Emulation is on, and the Minute timer has expired onewire_HsecTask (); #endif if(clock_hsec<125) return; clock_hsec = 0; // once per second from here on. #ifndef XLED if(led_mode & 2) LED_TOGGLE(); #endif if (credit_10ms < MAX_CREDIT) // 10ms/1s == 1% -> allowed talk-time without CD credit_10ms += 1; #ifdef HAS_ONEWIRE // if HMS Emulation is on, check the HMS timer onewire_SecTask (); #endif #ifdef HAS_VZ vz_sectask(); #endif #if defined(HAS_SLEEP) && defined(JOY_PIN1) if(joy_inactive < 255) joy_inactive++; if(sleep_time && joy_inactive == sleep_time) { if(USB_IsConnected) lcd_switch(0); else dosleep(); } #endif #ifdef HAS_NTP if((ntp_sec & NTP_INTERVAL_MASK) == 0) ntp_sendpacket(); #endif static uint8_t clock_sec; clock_sec++; if(clock_sec != 60) // once per minute from here on return; clock_sec = 0; #ifdef HAS_FHT_80b fht80b_minute++; if(fht80b_minute >= 60) fht80b_minute = 0; #endif #if defined(HAS_LCD) && defined(BAT_PIN) bat_drawstate(); #endif }