コード例 #1
0
ファイル: pcf8833.c プロジェクト: MariusRumpf/a-culfw
/////////////////////////////////////////////////////////////////////
// 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);
}
コード例 #2
0
ファイル: menu.c プロジェクト: jknofe/a-culfw
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();
    }
}
コード例 #3
0
ファイル: menu.c プロジェクト: jknofe/a-culfw
///////////////////////////////////////////////
// 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
}
コード例 #4
0
ファイル: display.c プロジェクト: NetHome/CULFirmware
//////////////////////////////////////////////////
// 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
}