ui.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * (c) danielinux 2019
  3. *
  4. * GPLv.2
  5. *
  6. * See LICENSE for details
  7. */
  8. #include <stdint.h>
  9. #include "system.h"
  10. #include "display.h"
  11. #include "systick.h"
  12. #include "button.h"
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include "ui.h"
  17. /* Uncomment for device initialization */
  18. //#define DEVICE_INITIALIZATION
  19. static const char welcome_message0[]= " Smells like ";
  20. static const char welcome_message1[]= "fresh electrons";
  21. static const char welcome_message2[]= " and coffee. ";
  22. static uint32_t last_action = 0;
  23. static uint32_t offset = 0;
  24. #define ST_LOCKED 0
  25. #define ST_PIN_ENTRY 1
  26. #define ST_UNLOCKED 2
  27. #define MAX_PASSWORD 32
  28. static int fsm_state = ST_LOCKED;
  29. static int sleeping = 0;
  30. static char password[MAX_PASSWORD] = {};
  31. static int pin_idx = 0;
  32. #define SLEEP_TIME (5000)
  33. static void ui_sleep(void)
  34. {
  35. display_scroll(NULL, 0);
  36. display_clear(NULL);
  37. sleeping = 1;
  38. }
  39. static int ui_wakeup(void)
  40. {
  41. last_action = jiffies;
  42. if (sleeping) {
  43. sleeping = 0;
  44. return 1;
  45. }
  46. return 0;
  47. }
  48. void ui_msg(const char *txt)
  49. {
  50. ui_wakeup();
  51. display_scroll(NULL, 0);
  52. display_clear(NULL);
  53. display_text(6, txt);
  54. }
  55. static uint8_t display_cur_v = 0;
  56. static uint8_t menu_selection = 0;
  57. void ui_menu_autoscroll(void)
  58. {
  59. int lines = CurrentMenu->entry_n;
  60. if ((lines < 5) || (menu_selection < 2))
  61. display_cur_v = 0;
  62. else if (menu_selection > lines - 2)
  63. display_cur_v = 0x40 - ((lines - 4) * 8);
  64. else
  65. display_cur_v = 0x40 - ((menu_selection - 2) * 8);
  66. display_scroll(NULL, display_cur_v);
  67. }
  68. static void ui_display_menu_refresh(void)
  69. {
  70. const struct display_menu *menu = CurrentMenu;
  71. uint8_t vline;
  72. int i;
  73. display_scroll(NULL, display_cur_v);
  74. display_clear(NULL);
  75. for (i = 0; i < menu->entry_n; i++) {
  76. vline = i + 4;
  77. if (vline > 7)
  78. vline -= 8;
  79. if (i == menu_selection)
  80. display_text_inverse(vline, menu->entry[i].title);
  81. else
  82. display_text(vline, menu->entry[i].title);
  83. }
  84. WFI();
  85. }
  86. void ui_display_menu(const struct display_menu *menu)
  87. {
  88. uint8_t i;
  89. display_clear(NULL);
  90. menu_selection = 0;
  91. display_cur_v = 0;
  92. CurrentMenu = (struct display_menu *)menu;
  93. ui_display_menu_refresh();
  94. }
  95. void ui_button_press(uint8_t b, int hold)
  96. {
  97. if (b == '*') {
  98. int n = menu_selection;
  99. menu_selection = 0;
  100. if (CurrentMenu->entry[n].action) {
  101. display_cur_v = 0;
  102. display_clear(NULL);
  103. display_scroll(NULL, display_cur_v);
  104. CurrentMenu->entry[n].action(
  105. CurrentMenu->entry[n].arg);
  106. }
  107. return;
  108. }
  109. if (b == '-') {
  110. if (menu_selection > 0) {
  111. menu_selection--;
  112. ui_menu_autoscroll();
  113. ui_display_menu_refresh();
  114. }
  115. }
  116. if (b == '+') {
  117. if (menu_selection < CurrentMenu->entry_n - 1) {
  118. menu_selection++;
  119. ui_menu_autoscroll();
  120. ui_display_menu_refresh();
  121. }
  122. }
  123. }
  124. void ui_init(void)
  125. {
  126. uint32_t now;
  127. int i;
  128. #if 0
  129. display_scroll(NULL, 0x3f);
  130. display_text(0, welcome_message0);
  131. display_text(1, welcome_message1);
  132. display_text(2, welcome_message2);
  133. now = jiffies;
  134. for (i = 0x3f; i >= 0x20; i--) {
  135. display_scroll(NULL, i);
  136. while ((jiffies - now) < 20)
  137. WFI();
  138. now = jiffies;
  139. }
  140. for (i = display_getcontrast(NULL); i >= 0; i--) {
  141. display_setcontrast(NULL, i);
  142. while ((jiffies - now) < 10)
  143. WFI();
  144. now = jiffies;
  145. }
  146. #endif
  147. display_scroll(NULL, display_cur_v);
  148. display_clear(NULL);
  149. display_setcontrast(NULL, 0xcf);
  150. ui_display_menu(CurrentMenu);
  151. }
  152. void ui_keepalive(uint32_t timeslice)
  153. {
  154. }