Пример #1
0
/////////////////////////////////////////////////////////////////////
// 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
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
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
}