ui.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. static void ui_display_menu_refresh(void)
  58. {
  59. const struct display_menu *menu = CurrentMenu;
  60. uint8_t vline;
  61. int i;
  62. display_scroll(NULL, display_cur_v);
  63. display_clear(NULL);
  64. for (i = menu->entry_n - 1; i >= 0; i--) {
  65. vline = i + 5;
  66. if (vline > 7)
  67. vline -= 8;
  68. if (i == menu_selection)
  69. display_text_inverse(vline, menu->entry[i].title);
  70. else
  71. display_text(vline, menu->entry[i].title);
  72. }
  73. WFI();
  74. }
  75. void ui_display_menu(const struct display_menu *menu)
  76. {
  77. uint8_t i;
  78. display_clear(NULL);
  79. menu_selection = 0;
  80. display_cur_v = 0;
  81. CurrentMenu = (struct display_menu *)menu;
  82. ui_display_menu_refresh();
  83. }
  84. void ui_button_press(uint8_t b, int hold)
  85. {
  86. if (b == '*') {
  87. int n = menu_selection;
  88. menu_selection = 0;
  89. if (CurrentMenu->entry[n].action) {
  90. display_cur_v = 0;
  91. display_clear(NULL);
  92. display_scroll(NULL, display_cur_v);
  93. CurrentMenu->entry[n].action(
  94. CurrentMenu->entry[n].arg);
  95. }
  96. return;
  97. }
  98. if (b == '-') {
  99. if (menu_selection > 0) {
  100. menu_selection--;
  101. if ((display_cur_v / 8) - (menu_selection > 2)) {
  102. int s;
  103. s = display_cur_v + 8;
  104. if (s > 0x3f)
  105. s = 0;
  106. display_cur_v = (uint8_t)s;
  107. display_scroll(NULL, display_cur_v);
  108. }
  109. }
  110. }
  111. if (b == '+') {
  112. if (menu_selection < CurrentMenu->entry_n - 1) {
  113. menu_selection++;
  114. if ((menu_selection - display_cur_v / 8) > 2) {
  115. int s;
  116. s = display_cur_v - 8;
  117. if (s < 0)
  118. s = 0x40 - 8;
  119. display_cur_v = (uint8_t)s;
  120. display_scroll(NULL, display_cur_v);
  121. }
  122. }
  123. }
  124. ui_display_menu_refresh();
  125. }
  126. void ui_init(void)
  127. {
  128. uint32_t now;
  129. int i;
  130. #if 0
  131. display_scroll(NULL, 0x3f);
  132. display_text(0, welcome_message0);
  133. display_text(1, welcome_message1);
  134. display_text(2, welcome_message2);
  135. now = jiffies;
  136. for (i = 0x3f; i >= 0x20; i--) {
  137. display_scroll(NULL, i);
  138. while ((jiffies - now) < 20)
  139. WFI();
  140. now = jiffies;
  141. }
  142. for (i = display_getcontrast(NULL); i >= 0; i--) {
  143. display_setcontrast(NULL, i);
  144. while ((jiffies - now) < 10)
  145. WFI();
  146. now = jiffies;
  147. }
  148. #endif
  149. display_scroll(NULL, display_cur_v);
  150. display_clear(NULL);
  151. display_setcontrast(NULL, 0xcf);
  152. ui_display_menu(CurrentMenu);
  153. }
  154. void ui_keepalive(uint32_t timeslice)
  155. {
  156. }