ui_tester.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. #include <stddef.h>
  2. #include "ui.h"
  3. #include <string.h>
  4. #include "adc.h"
  5. #include "button.h"
  6. #include "system.h"
  7. struct display_menu *CurrentMenu = &MainMenu;
  8. static int pin_selected = 0;
  9. static int front_selected = 0;
  10. static void ui_sel_pin(uint8_t press, int hold);
  11. static int pin_t1, pin_t2, front_t1, front_t2;
  12. static uint32_t time_t1_s, time_t1_us;
  13. static void ui_return(uint8_t press, int hold)
  14. {
  15. if (press == '*') {
  16. display_clear(NULL);
  17. clear_input_callback();
  18. ui_display_menu(&MainMenu);
  19. }
  20. }
  21. static void ui_action_interrupt(uint8_t press, int hold)
  22. {
  23. if (press == '*') {
  24. clear_keepalive();
  25. display_clear(NULL);
  26. display_text(5, "Interrupted!");
  27. set_input_callback(ui_return);
  28. }
  29. }
  30. static void display_time(int line, uint32_t s, uint32_t us)
  31. {
  32. char time_txt[] = " .000000 s";
  33. printf("in display_time (%u.%06u)\r\n", s, us);
  34. if (s >= 10000)
  35. time_txt[0] = '0' + s / 10000;
  36. if (s >= 1000)
  37. time_txt[1] = '0' + (s % 10000) / 1000;
  38. if (s >= 100)
  39. time_txt[2] = '0' + (s % 1000) / 100;
  40. if (s >= 10)
  41. time_txt[3] = '0' + (s % 100) / 10;
  42. time_txt[4] = '0' + s % 10;
  43. /* . */
  44. time_txt[6] += us / 100000;
  45. time_txt[7] += (us % 100000) / 10000;
  46. time_txt[8] += (us % 10000) / 1000;
  47. time_txt[9] += (us % 1000) / 100;
  48. time_txt[10] += (us % 100) / 10;
  49. time_txt[11] += (us % 10);
  50. printf("out display_time (%s)\r\n", time_txt);
  51. display_text(line, time_txt);
  52. }
  53. static void trigger_poll(void)
  54. {
  55. exti_poll();
  56. }
  57. static void trigger_t1(uint32_t pin, uint8_t front, uint32_t s, uint32_t us)
  58. {
  59. if ((front_t1 == 2) || (front_t1 == front)) {
  60. exti_clear_callback(pin_t1);
  61. time_t1_s = s;
  62. time_t1_us = us;
  63. display_text(5, "T1");
  64. }
  65. }
  66. static void ui_restart_trigger(uint8_t press, int hold);
  67. static void trigger_t2(uint32_t pin, uint8_t front, uint32_t s, uint32_t us)
  68. {
  69. uint32_t delta_s, delta_us;
  70. if ((front_t2 == 2) || (front_t2 == front)) {
  71. exti_clear_callback(pin);
  72. delta_s = s - time_t1_s;
  73. if (us < time_t1_us) {
  74. delta_s--;
  75. us += 1000000;
  76. }
  77. delta_us = us - time_t1_us;
  78. display_clear(NULL);
  79. display_text(5, "Time Delta: ");
  80. if (delta_s > 99999) {
  81. display_text(6, "Error!");
  82. set_input_callback(ui_return);
  83. return;
  84. }
  85. clear_keepalive();
  86. display_time(6, delta_s, delta_us);
  87. display_text(7, "Press to restart");
  88. set_input_callback(ui_restart_trigger);
  89. }
  90. }
  91. static void ui_restart_trigger(uint8_t press, int hold)
  92. {
  93. if (press == '*') {
  94. set_input_callback(ui_action_interrupt);
  95. display_clear(NULL);
  96. display_text(7, "Capturing...");
  97. exti_set_callback(Channel_Pin[pin_t1], trigger_t1);
  98. exti_set_callback(Channel_Pin[pin_t2], trigger_t2);
  99. pin_exti_init();
  100. pin_exti_start_read();
  101. set_keepalive(trigger_poll);
  102. }
  103. }
  104. static void ui_sel_pin(uint8_t press, int hold)
  105. {
  106. char TXT[] = "PIN X ";
  107. if ((press == '-') && (front_selected == 0) && (pin_selected > 0)) {
  108. pin_selected--;
  109. front_selected = 2;
  110. }else if ((press == '+') && (front_selected == 2) && (pin_selected < 4)) {
  111. pin_selected++;
  112. front_selected = 0;
  113. } else if ((press == '+') && (front_selected < 2))
  114. front_selected++;
  115. else if ((press == '-') && (front_selected > 0))
  116. front_selected--;
  117. switch (front_selected) {
  118. case 0:
  119. memcpy(TXT + 6, "FALL", 4);
  120. break;
  121. case 1:
  122. memcpy(TXT + 6, "RISE", 4);
  123. break;
  124. case 2:
  125. memcpy(TXT + 6, "BOTH", 4);
  126. break;
  127. }
  128. TXT[4] = '0' + pin_selected;
  129. display_text(6, TXT);
  130. display_text(7, Channel_name[pin_selected]);
  131. if (press == '*') {
  132. if (pin_t1 < 0) {
  133. pin_t1 = pin_selected;
  134. front_t1 = front_selected;
  135. pin_selected = 0;
  136. front_selected = 0;
  137. display_text(5, "Select T2 pin:");
  138. } else {
  139. pin_t2 = pin_selected;
  140. front_t2 = front_selected;
  141. set_input_callback(ui_action_interrupt);
  142. display_clear(NULL);
  143. display_text(7, "Capturing...");
  144. exti_set_callback(Channel_Pin[pin_t1], trigger_t1);
  145. exti_set_callback(Channel_Pin[pin_t2], trigger_t2);
  146. pin_exti_init();
  147. pin_exti_start_read();
  148. set_keepalive(trigger_poll);
  149. }
  150. }
  151. }
  152. static void ui_measure_interval(const void *arg)
  153. {
  154. int i;
  155. pin_t1 = -1;
  156. pin_t2 = -1;
  157. set_input_callback(ui_sel_pin);
  158. for (i = 0; i < 5; i++)
  159. GPIOA_MODE &= ~(0x03 << (Channel_Pin[i] * 2));
  160. display_text(5, "Select T1 pin:");
  161. ui_sel_pin(0,0);
  162. }
  163. static void display_voltage(int line, uint16_t val)
  164. {
  165. uint32_t mV = (val * 3300) / 4096;
  166. char txt[] = "0.000";
  167. if (val > 1000)
  168. txt[0] = '0' + mV / 1000;
  169. mV %= 1000;
  170. if (mV != 0)
  171. txt[4] = '0' + mV % 10;
  172. if (mV > 9)
  173. txt[3] = '0' + ((mV / 10) % 10);
  174. if (mV > 99)
  175. txt[2] = '0' + (mV / 100);
  176. display_text(6, txt);
  177. }
  178. void ui_voltage_poll(void)
  179. {
  180. uint16_t val = 0;
  181. char TXT[]="PIN X ADC";
  182. if (pin_selected < 2)
  183. pin_selected = 2;
  184. TXT[4] = '0' + pin_selected;
  185. GPIOA_MODE |= (0x03 << (Channel[pin_selected] * 2));
  186. adc_pin_val(Channel[pin_selected], &val);
  187. display_text(5, TXT);
  188. display_voltage(6, val);
  189. display_text(7, Channel_name[pin_selected]);
  190. }
  191. static void ui_voltage_input(uint8_t press, int hold)
  192. {
  193. if (press == '*') {
  194. display_clear(NULL);
  195. display_text(5, "Interrupted!");
  196. clear_keepalive();
  197. set_input_callback(ui_return);
  198. return;
  199. }
  200. if (press == '+') {
  201. pin_selected++;
  202. if (pin_selected > 4)
  203. pin_selected = 2;
  204. }
  205. if (press == '-') {
  206. pin_selected--;
  207. if (pin_selected < 2)
  208. pin_selected = 4;
  209. }
  210. ui_voltage_poll();
  211. }
  212. static void ui_measure_voltage(const void *arg)
  213. {
  214. set_input_callback(ui_voltage_input);
  215. set_keepalive(ui_voltage_poll);
  216. display_clear(NULL);
  217. ui_voltage_poll();
  218. }
  219. static void ui_input_poll(void)
  220. {
  221. uint32_t val = 0;
  222. char Line5[] = "P0: 0 P1: 0";
  223. char Line6[] = "P2: 0 P3: 0";
  224. char Line7[] = "P4: 0 ";
  225. val = gpio_get(GPIOA, GPIO8|GPIO9|GPIO7|GPIO6|GPIO5);
  226. if (val & GPIO8)
  227. Line5[4] = '1';
  228. if (val & GPIO9)
  229. Line5[12] = '1';
  230. if (val & GPIO7)
  231. Line6[4] = '1';
  232. if (val & GPIO6)
  233. Line6[12] = '1';
  234. if (val & GPIO5)
  235. Line7[4] = '1';
  236. display_text(5, Line5);
  237. display_text(6, Line6);
  238. display_text(7, Line7);
  239. }
  240. static void ui_measure_input(const void *arg)
  241. {
  242. int i;
  243. for (i = 0; i < 5; i++)
  244. GPIOA_MODE &= ~(0x03 << (Channel_Pin[i] * 2));
  245. set_input_callback(ui_action_interrupt);
  246. set_keepalive(ui_input_poll);
  247. ui_input_poll();
  248. }
  249. static void ui_measure_frequency(const void *arg)
  250. {
  251. }
  252. static void ui_generate_dc(const void *arg)
  253. {
  254. }
  255. static void ui_generate_pwm(const void *arg)
  256. {
  257. }
  258. static void ui_submenu(const void *arg)
  259. {
  260. ui_display_menu(arg);
  261. }
  262. const struct display_menu SignalGenMenu = {
  263. .entry_n = 3,
  264. .entry = {
  265. { "Generate DC ", ui_generate_dc, NULL },
  266. { "Generate PWM ", ui_generate_pwm, NULL },
  267. { "Back to Main ", ui_submenu, &MainMenu },
  268. { "", NULL, NULL}
  269. }
  270. };
  271. const struct display_menu ExtraMenu = {
  272. .entry_n = 1,
  273. .entry = {
  274. { "TODO! ", ui_submenu, &MainMenu},
  275. { "", NULL, NULL}
  276. }
  277. };
  278. const struct display_menu MeasureMenu = {
  279. .entry_n = 5,
  280. .entry = {
  281. { "Digital input", ui_measure_input, NULL },
  282. { "Time Delta", ui_measure_interval, NULL },
  283. { "Voltage ", ui_measure_voltage, NULL },
  284. { "Frequency", ui_measure_frequency, NULL },
  285. { "Back to Main ", ui_submenu, &MainMenu },
  286. { "", NULL, NULL}
  287. }
  288. };
  289. const struct display_menu MainMenu = {
  290. .entry_n = 3,
  291. .entry = {
  292. { "Measure ", ui_submenu, &MeasureMenu },
  293. { "Signal Gener. ", ui_submenu, &SignalGenMenu },
  294. { "Extra ", ui_submenu, &ExtraMenu },
  295. { "", NULL, NULL}
  296. }
  297. };