123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- * (c) danielinux 2019
- *
- * GPLv.2
- *
- * See LICENSE for details
- */
- #include <stdint.h>
- #include "system.h"
- #include "display.h"
- #include "systick.h"
- #include "button.h"
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include "ui.h"
- /* Uncomment for device initialization */
- //#define DEVICE_INITIALIZATION
- static const char welcome_message0[]= " Smells like ";
- static const char welcome_message1[]= "fresh electrons";
- static const char welcome_message2[]= " and coffee. ";
- static uint32_t last_action = 0;
- static uint32_t offset = 0;
- #define ST_LOCKED 0
- #define ST_PIN_ENTRY 1
- #define ST_UNLOCKED 2
- #define MAX_PASSWORD 32
- static int fsm_state = ST_LOCKED;
- static int sleeping = 0;
- static char password[MAX_PASSWORD] = {};
- static int pin_idx = 0;
- #define SLEEP_TIME (5000)
- static void ui_sleep(void)
- {
- display_scroll(NULL, 0);
- display_clear(NULL);
- sleeping = 1;
- }
- static int ui_wakeup(void)
- {
- last_action = jiffies;
- if (sleeping) {
- sleeping = 0;
- return 1;
- }
- return 0;
- }
- void ui_msg(const char *txt)
- {
- ui_wakeup();
- display_scroll(NULL, 0);
- display_clear(NULL);
- display_text(6, txt);
- }
- static uint8_t display_cur_v = 0;
- static uint8_t menu_selection = 0;
- void ui_menu_autoscroll(void)
- {
- int lines = CurrentMenu->entry_n;
- if ((lines < 5) || (menu_selection < 2))
- display_cur_v = 0;
- else if (menu_selection > lines - 2)
- display_cur_v = 0x40 - ((lines - 4) * 8);
- else
- display_cur_v = 0x40 - ((menu_selection - 2) * 8);
- display_scroll(NULL, display_cur_v);
- }
- static void ui_display_menu_refresh(void)
- {
- const struct display_menu *menu = CurrentMenu;
- uint8_t vline;
- int i;
- display_scroll(NULL, display_cur_v);
- display_clear(NULL);
- for (i = 0; i < menu->entry_n; i++) {
- vline = i + 4;
- if (vline > 7)
- vline -= 8;
- if (i == menu_selection)
- display_text_inverse(vline, menu->entry[i].title);
- else
- display_text(vline, menu->entry[i].title);
- }
- WFI();
- }
- void ui_display_menu(const struct display_menu *menu)
- {
- uint8_t i;
- display_clear(NULL);
- menu_selection = 0;
- display_cur_v = 0;
- CurrentMenu = (struct display_menu *)menu;
- ui_display_menu_refresh();
- }
- void ui_button_press(uint8_t b, int hold)
- {
- if (b == '*') {
- int n = menu_selection;
- menu_selection = 0;
- if (CurrentMenu->entry[n].action) {
- display_cur_v = 0;
- display_clear(NULL);
- display_scroll(NULL, display_cur_v);
- CurrentMenu->entry[n].action(
- CurrentMenu->entry[n].arg);
-
- }
- return;
- }
- if (b == '-') {
- if (menu_selection > 0) {
- menu_selection--;
- ui_menu_autoscroll();
- ui_display_menu_refresh();
- }
- }
- if (b == '+') {
- if (menu_selection < CurrentMenu->entry_n - 1) {
- menu_selection++;
- ui_menu_autoscroll();
- ui_display_menu_refresh();
- }
- }
- }
- void ui_init(void)
- {
- uint32_t now;
- int i;
- #if 0
- display_scroll(NULL, 0x3f);
- display_text(0, welcome_message0);
- display_text(1, welcome_message1);
- display_text(2, welcome_message2);
- now = jiffies;
- for (i = 0x3f; i >= 0x20; i--) {
- display_scroll(NULL, i);
- while ((jiffies - now) < 20)
- WFI();
- now = jiffies;
- }
- for (i = display_getcontrast(NULL); i >= 0; i--) {
- display_setcontrast(NULL, i);
- while ((jiffies - now) < 10)
- WFI();
- now = jiffies;
- }
- #endif
- display_scroll(NULL, display_cur_v);
- display_clear(NULL);
- display_setcontrast(NULL, 0xcf);
- ui_display_menu(CurrentMenu);
- }
- void ui_keepalive(uint32_t timeslice)
- {
- }
|