///////////////////////////////////////////////////////////////////// // 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(); } }
/////////////////////////////////////////////// // Display a menu void menu_push(uint8_t idx) { uint8_t menu_line[MLINESIZE+1], dpybuf[20], picbuf[24]; uint16_t off; menu_stack[menu_stackidx] = idx; if(menu_stackidx < MENUSTACK) menu_stackidx++; else return; // Title off = menu_get_line(menu_offset[idx], menu_line, sizeof(menu_line)); menu_getlineword(3, menu_line, dpybuf, sizeof(dpybuf)); if(dpybuf[0]) { dpybuf[9] = '0'; dpybuf[10] = 0; // fromhex needs an even number of chars fromhex((char *)dpybuf, menu_cols, sizeof(menu_cols)); } else { menu_cols[0] = menu_cols[1] = menu_cols[2] = menu_cols[3] = menu_cols[4] = 0xff; } menu_getlineword(2, menu_line, dpybuf, sizeof(dpybuf)); if(!dpybuf[0]) menu_getlineword(1, menu_line, dpybuf, sizeof(dpybuf)); lcd_setbgcol(menu_cols[0]&0xf0, menu_cols[0]<<4, menu_cols[1]&0xf0); lcd_putline(0, (char *)dpybuf); menu_item_offset[0] = off; picbuf[0] = 0; for(menu_nitems = 1; menu_nitems <= NITEMS; menu_nitems++) { off = menu_get_line(off, menu_line, sizeof(menu_line)); if(menu_line[0] == 'P') { strncpy((char*)picbuf, (char*)menu_line, sizeof(picbuf)); break; } if(off == 0 || !menu_line[0]) break; if(menu_nitems < NITEMS) menu_item_offset[menu_nitems] = off; } menu_nitems--; // Now display the data. // Load the last offset menu_curitem = menu_lastsel[menu_stack[menu_stackidx-1]]; // Compute the top line if(menu_curitem >= menu_nitems) { // Invalid/not yet entered menu menu_topitem = 0; menu_curitem = 0; } else { if(menu_curitem >= BODY_LINES) menu_topitem = menu_curitem-BODY_LINES/2; else menu_topitem = 0; } if(idx == 0) lcd_resetscroll(); uint8_t fullsizepic = 0; if(picbuf[0]) { uint8_t hb[4]; fromhex((char *)picbuf+1, hb, 4); // x, y, w, h if(hb[2] >= VISIBLE_WIDTH && hb[3] >= VISIBLE_HEIGHT) fullsizepic = 1; } if(!fullsizepic) { for(uint8_t i = 0; i < BODY_LINES; i++) { if(menu_topitem+i < menu_nitems) { menu_get_line(menu_item_offset[menu_topitem+i], menu_line, sizeof(menu_line)); menu_getlineword(1, menu_line, dpybuf+1, sizeof(dpybuf)-1); dpybuf[0] = (menu_topitem+i == menu_curitem ? '>' : ' '); } else { dpybuf[0] = 0; // Clear the rest } menu_setbg(i); lcd_putline(i+1, (char *)dpybuf); } } if(picbuf[0]) lcd_drawpic((char *)picbuf); #if 0 if(idx == 0) lcd_drawlogo(); #endif }
////////////////////////////////////////////////// // Display routines void display_char(char data) { #ifdef HAS_USB if(USB_IsConnected && (output_enabled & OUTPUT_USB)) { if(USB_Tx_Buffer->nbytes >= USB_Tx_Buffer->size) CDC_Task(); rb_put(USB_Tx_Buffer, data); if(data == '\n') CDC_Task(); } #endif #ifdef HAS_LCD if(output_enabled & OUTPUT_LCD) { static uint8_t buf[TITLE_LINECHARS+1]; static uint8_t off = 0, cmdmode = 0; if(data == '\r') return; if(data == '\n') { buf[off] = 0; off = 0; if(cmdmode) { callfn((char *)buf); } else lcd_putline(0, (char*)buf); cmdmode = 0; } else { // if(off < TITLE_LINECHARS) // or cmd: up to 12Byte: F12346448616c6c6f buf[off++] = data; if(cmdmode && cmdmode++ == 2) { off -= 2; fromhex((char *)buf+off, buf+off, 1); // replace the hexnumber off++; cmdmode = 1; } } // Check if its a message for us: F<HC>..., and set cmdmode if(!cmdmode && off == 5 && buf[0] == 'F') { uint8_t hb[2]; fromhex((char*)buf+1, hb, 2); if(hb[0] == fht_hc[0] && hb[1] == fht_hc[1]) { cmdmode = 1; off = 0; } } } #endif #ifdef HAS_FS if(output_enabled & OUTPUT_LOG) { static uint8_t buf[LOG_NETTOLINELEN+1]; static uint8_t off = 0; if(data == '\r') return; if(data == '\n') { buf[off] = 0; off = 0; Log((char*)buf); } else { if(off < LOG_NETTOLINELEN) buf[off++] = data; } } #endif }