main.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "pico/stdlib.h"
  4. #include "hardware/gpio.h"
  5. #include <string.h>
  6. #define DISP_INTERVAL 3
  7. /* DOUT */
  8. #define DISP1_CLK 17
  9. #define DISP1_DIO 16
  10. #define DISP2_CLK 19
  11. #define DISP2_DIO 18
  12. #define LED_PIN PICO_DEFAULT_LED_PIN
  13. #define BUTTON_P1 12
  14. #define BUTTON_P2 8
  15. /* DIN */
  16. #define ROT_S0 2
  17. #define ROT_S1 3
  18. #define ROT_KEY 6
  19. #define BUZZ_DURATION 2000
  20. #define BUZZ_FREQ 220
  21. /* GP7 is PWM B[3] */
  22. #define SPK_PWM_CHAN PWM_CHAN_B
  23. #define SPK_PWM_SLICE 3
  24. #define get_absolute_time_ms() us_to_ms(get_absolute_time())
  25. /* TM1637 display driver */
  26. static void tm_clk_start(uint8_t disp)
  27. {
  28. uint8_t clk = DISP1_CLK, dio = DISP1_DIO;
  29. if (disp == 2)
  30. clk = DISP2_CLK, dio = DISP2_DIO;
  31. gpio_put(clk, 1);
  32. gpio_put(dio, 1);
  33. sleep_us(DISP_INTERVAL);
  34. gpio_put(dio, 0);
  35. sleep_us(DISP_INTERVAL);
  36. }
  37. static void tm_clk_stop(uint8_t disp)
  38. {
  39. uint8_t clk = DISP1_CLK, dio = DISP1_DIO;
  40. if (disp == 2)
  41. clk = DISP2_CLK, dio = DISP2_DIO;
  42. gpio_put(clk, 0);
  43. sleep_us(DISP_INTERVAL);
  44. gpio_put(dio, 0);
  45. sleep_us(DISP_INTERVAL);
  46. gpio_put(clk, 1);
  47. sleep_us(DISP_INTERVAL);
  48. gpio_put(dio, 1);
  49. sleep_us(DISP_INTERVAL);
  50. }
  51. static uint8_t tm_wait_ack(uint8_t disp)
  52. {
  53. uint8_t clk = DISP1_CLK, dio = DISP1_DIO;
  54. uint8_t ack;
  55. if (disp == 2)
  56. clk = DISP2_CLK, dio = DISP2_DIO;
  57. gpio_put(clk, 0);
  58. sleep_us(2 * DISP_INTERVAL);
  59. gpio_put(clk, 1);
  60. sleep_us(DISP_INTERVAL);
  61. gpio_put(clk, 0);
  62. return 0;
  63. }
  64. void tm_write(uint8_t disp, const uint8_t *b, uint8_t sz, int nostop)
  65. {
  66. uint8_t clk = DISP1_CLK, dio = DISP1_DIO;
  67. int i, c;
  68. if (disp == 2)
  69. clk = DISP2_CLK, dio = DISP2_DIO;
  70. gpio_put(dio, 0);
  71. sleep_us(DISP_INTERVAL);
  72. gpio_put(clk, 0);
  73. sleep_us(DISP_INTERVAL);
  74. for (c = 0; c < sz; c++) {
  75. uint8_t sliding_buf = b[c];
  76. for (i = 0; i < 8; i++) {
  77. gpio_put(clk, 0);
  78. gpio_put(dio, sliding_buf & 0x01);
  79. //gpio_put(dio, (sliding_buf & 0x80) >> 7);
  80. sleep_us(DISP_INTERVAL);
  81. sliding_buf >>= 1;
  82. //sliding_buf = (sliding_buf & 0x7F) << 1;
  83. gpio_put(clk, 1);
  84. sleep_us(DISP_INTERVAL);
  85. }
  86. tm_wait_ack(disp);
  87. }
  88. }
  89. #define CMD_DATA 0x40
  90. #define CMD_DATA_WRITE 0x00
  91. #define CMD_DATA_READ 0x02
  92. #define CMD_DATA_FLAG_AAUTO 0x04
  93. #define CMD_DATA_FLAG_TEST 0x08
  94. #define CMD_ADDRESS 0xC0
  95. #define CMD_DISPLAY 0x80
  96. #define CMD_DISPLAY_SWITCH_ON 0x08
  97. #define CMD_DISPLAY_PULSE_MASK 0x07
  98. const unsigned char numchar[10] = {
  99. /* 0 = 11111100 */ 0x3F,
  100. /* 1 = 01100000 */ 0x06,
  101. /* 2 = 11011010 */ 0x5B,
  102. /* 3 = 11110010 */ 0x4F,
  103. /* 4 = 01100110 */ 0x66,
  104. /* 5 = 10110110 */ 0x6D,
  105. /* 6 = 10111110 */ 0x7D,
  106. /* 7 = 11100000 */ 0x07,
  107. /* 8 = 11111110 */ 0x7F,
  108. /* 9 = 11110110 */ 0x6F
  109. };
  110. const unsigned char CHAR_NONE = 0x00;
  111. const unsigned char CHAR_A = 0x77;
  112. const unsigned char CHAR_B = 0x7C;
  113. const unsigned char CHAR_C = 0x39;
  114. const unsigned char CHAR_D = 0x5E;
  115. const unsigned char CHAR_E = 0x79;
  116. const unsigned char CHAR_F = 0x71;
  117. const unsigned char CHAR_G = numchar[9];
  118. const unsigned char CHAR_H = 0x76;
  119. const unsigned char CHAR_I = numchar[1];
  120. const unsigned char CHAR_L = 0x38;
  121. const unsigned char CHAR_N = 0x54;
  122. const unsigned char CHAR_O = 0x5C;
  123. const unsigned char CHAR_P = 0x73;
  124. const unsigned char CHAR_R = 0x50;
  125. const unsigned char CHAR_S = numchar[5];
  126. const unsigned char CHAR_T = numchar[7];
  127. const unsigned char CHAR_U = 0x3E;
  128. const unsigned char CHAR_Y = 0x6E;
  129. const unsigned char CHAR_Z = numchar[2];
  130. const unsigned char txt_sel[4] = {CHAR_S, CHAR_E, CHAR_L, CHAR_NONE };
  131. const unsigned char txt_cus[4] = {CHAR_C, CHAR_U, CHAR_S, CHAR_T };
  132. const unsigned char txt_good[4] = {CHAR_G, CHAR_O, CHAR_O, CHAR_D };
  133. const unsigned char txt_day[4] = {CHAR_NONE, CHAR_D, CHAR_A, CHAR_Y };
  134. const unsigned char txt_done[4] = {CHAR_D, CHAR_O, CHAR_N, CHAR_E };
  135. const unsigned char txt_pause0[4] = {CHAR_P, CHAR_A, CHAR_U, CHAR_S };
  136. const unsigned char txt_pause1[4] = {CHAR_E, CHAR_D, CHAR_NONE, CHAR_NONE };
  137. const unsigned char CHAR_DOTS = 0x80;
  138. const unsigned char CHAR_MINUS = 0x40;
  139. static void display_set_brightness(int disp, uint8_t brightness)
  140. {
  141. uint8_t cmd;
  142. tm_clk_start(disp);
  143. cmd = CMD_DISPLAY | CMD_DISPLAY_SWITCH_ON | (brightness & CMD_DISPLAY_PULSE_MASK);
  144. tm_write(disp, &cmd, 1, 0);
  145. tm_clk_stop(disp);
  146. }
  147. static void display_show(uint8_t disp, const unsigned char *c, int colon)
  148. {
  149. int i;
  150. unsigned char cmd = CMD_DATA;
  151. unsigned char payload[6];
  152. tm_clk_start(disp);
  153. tm_write(disp, &cmd, 1, 1);
  154. tm_clk_stop(disp);
  155. sleep_ms(1);
  156. memcpy(payload + 1, c, 4);
  157. payload[0] = CMD_ADDRESS;
  158. if (colon == 1) {
  159. payload[2] |= CHAR_DOTS;
  160. }
  161. if (colon == 2) {
  162. payload[3] |= CHAR_DOTS;
  163. }
  164. tm_clk_start(disp);
  165. tm_write(disp, payload, 5, 1);
  166. tm_clk_stop(disp);
  167. sleep_ms(1);
  168. }
  169. static void display_clear(uint8_t disp)
  170. {
  171. const unsigned char zero[4] = {0, 0, 0, 0};
  172. display_show(disp, zero, 0);
  173. }
  174. void num_to_digits(uint16_t n, uint8_t *out, int lead_zero)
  175. {
  176. memset(out, 0, 2);
  177. if (n > 99)
  178. return;
  179. if (n < 10) {
  180. if (lead_zero)
  181. out[0] = numchar[0];
  182. out[1] = numchar[n];
  183. } else {
  184. out[0] = numchar[n / 10];
  185. out[1] = numchar[n % 10];
  186. }
  187. }
  188. static void display_time(uint8_t disp, uint32_t t_sec, uint32_t t_usec, int col)
  189. {
  190. uint32_t minutes = 0;
  191. uint32_t cent = 0;
  192. unsigned char out[4];
  193. int colon;
  194. memset(out, 0, 4);
  195. if (t_usec < 500000)
  196. colon = 1;
  197. if (t_sec > 59) {
  198. minutes = t_sec / 60;
  199. t_sec -= minutes * 60;
  200. num_to_digits(minutes, out, 0);
  201. num_to_digits(t_sec, out + 2, 1);
  202. display_show(disp, out, col);
  203. } else {
  204. cent = t_usec / 10000;
  205. num_to_digits(t_sec, out, 0);
  206. num_to_digits(cent, out + 2, 1);
  207. out[3] = CHAR_NONE;
  208. display_show(disp, out, col);
  209. }
  210. }
  211. /* States */
  212. #define STATE_WALLCLOCK 0 /* Press B1 or B2: GAME_SET, long press KEY: clock adjust */
  213. #define STATE_GAME_SET 1 /* Setup menu, confirm = GAME_READY */
  214. #define STATE_GAME_CUSTOM 2 /* Setup custom time, confirm = GAME_READY */
  215. #define STATE_GAME_READY 3 /* Press B1 or B2: GAME_PLAY P2/P1 */
  216. #define STATE_GAME_PLAY_P1 4 /* Press B1: GAME_PLAY_P2, press B1+B2: GAME_PAUSE */
  217. #define STATE_GAME_PLAY_P2 5 /* Bress B2: GAME_PLAY_P1, press B1+B2: GAME_PAUSE */
  218. #define STATE_GAME_PAUSE 6 /* Press B1: GAME_PLAY_P2, B2: GAME_PLAY_P1, KEY: GAME_SET */
  219. #define STATE_GAME_TIMEOUT 7 /* Press any key: GAME_SET */
  220. #define STATE_CLOCK_ADJUST 8 /* */
  221. static uint8_t State = STATE_WALLCLOCK;
  222. struct play_mode {
  223. uint32_t minutes;
  224. uint32_t increment_seconds;
  225. };
  226. static struct play_mode Modes[] = {
  227. { 10, 0 },
  228. { 15, 10},
  229. { 30, 0 },
  230. { 45, 45},
  231. { 60, 0 },
  232. { 5, 5 },
  233. { 3, 2 },
  234. { 2, 1 },
  235. { 0, 0 } //Custom
  236. };
  237. #define N_MODES 9
  238. static int current_mode = 0;
  239. static void prev_mode(void)
  240. {
  241. if (current_mode == 0)
  242. current_mode = N_MODES - 1;
  243. else
  244. current_mode--;
  245. }
  246. static void next_mode(void)
  247. {
  248. if (current_mode == N_MODES - 1)
  249. current_mode = 0;
  250. else
  251. current_mode++;
  252. }
  253. struct game {
  254. int black_player;
  255. uint32_t p1_time;
  256. uint32_t p2_time;
  257. uint32_t move_count;
  258. };
  259. static struct game Game = { 0, 0, 0, 0 };
  260. static void game_start(void)
  261. {
  262. Game.p1_time = Modes[current_mode].minutes * 60000;
  263. Game.p2_time = Modes[current_mode].minutes * 60000;
  264. Game.move_count = 0;
  265. }
  266. #define BUTTON_DEBOUNCE_TIME 5
  267. #define BUTTON_LONG_PRESS_TIME 80
  268. uint32_t rotary_action(void)
  269. {
  270. uint32_t action = 0;
  271. if (gpio_get(ROT_S0))
  272. action |= 1;
  273. if (gpio_get(ROT_S1))
  274. action |= 2;
  275. return action;
  276. }
  277. #define ROT_UP 1
  278. #define ROT_DOWN 2
  279. int rot_updown(void)
  280. {
  281. static int rot_up = 0;
  282. static int rot_down = 0;
  283. static uint32_t rotary_pos = 0;
  284. uint32_t rotary_now;
  285. rotary_now = rotary_action();
  286. if (rotary_now != rotary_pos) {
  287. if ((rotary_pos == 0 && rotary_now == 3) ||
  288. (rotary_pos == 3 && rotary_now == 2) ||
  289. (rotary_pos == 2 && rotary_now == 0) ||
  290. (rotary_pos == 1 && rotary_now == 3)) {
  291. rot_down++;
  292. rot_up = 0;
  293. }
  294. if ((rotary_pos == 0 && rotary_now == 1) ||
  295. (rotary_pos == 3 && rotary_now == 1) ||
  296. (rotary_pos == 2 && rotary_now == 3) ||
  297. (rotary_pos == 1 && rotary_now == 0)) {
  298. rot_up++;
  299. rot_down = 0;
  300. }
  301. rotary_pos = rotary_now;
  302. }
  303. if (rot_up > 1) {
  304. rot_up = 0;
  305. return ROT_UP;
  306. }
  307. if (rot_down > 1) {
  308. rot_down = 0;
  309. return ROT_DOWN;
  310. }
  311. return 0;
  312. }
  313. void poll_buttons(void)
  314. {
  315. static uint32_t b1_press_counter = 0;
  316. static uint32_t b2_press_counter = 0;
  317. static uint32_t key_press_counter = 0;
  318. int rot_ud = 0;
  319. uint8_t oldstate;
  320. uint8_t black_player = 0;
  321. static uint32_t last_update = 0;
  322. if (gpio_get(ROT_KEY) == 0) {
  323. printf("K ON\n");
  324. key_press_counter++;
  325. } else {
  326. key_press_counter = 0;
  327. }
  328. if (gpio_get(BUTTON_P1) == 0)
  329. b1_press_counter++;
  330. else
  331. b1_press_counter = 0;
  332. if (gpio_get(BUTTON_P2) == 0)
  333. b2_press_counter++;
  334. else
  335. b2_press_counter = 0;
  336. oldstate = State;
  337. if (b1_press_counter >= BUTTON_DEBOUNCE_TIME)
  338. printf("b1: pressed\n");
  339. if (b2_press_counter >= BUTTON_DEBOUNCE_TIME)
  340. printf("b2: pressed\n");
  341. switch(State) {
  342. case STATE_WALLCLOCK:
  343. if ((b1_press_counter == BUTTON_DEBOUNCE_TIME) ||
  344. (b2_press_counter == BUTTON_DEBOUNCE_TIME) ||
  345. (key_press_counter == BUTTON_DEBOUNCE_TIME)) {
  346. State = STATE_GAME_SET;
  347. }
  348. break;
  349. case STATE_GAME_SET:
  350. rot_ud = rot_updown();
  351. if (rot_ud == ROT_UP) {
  352. next_mode();
  353. }
  354. if (rot_ud == ROT_DOWN) {
  355. prev_mode();
  356. }
  357. // display_current_mode
  358. //
  359. if (key_press_counter == BUTTON_LONG_PRESS_TIME) {
  360. if (current_mode == N_MODES - 1) {
  361. }
  362. game_start();
  363. State = STATE_GAME_READY;
  364. }
  365. break;
  366. case STATE_GAME_READY:
  367. if (b1_press_counter > 0) {
  368. /* P1 is black */
  369. State = STATE_GAME_PLAY_P2;
  370. last_update = get_absolute_time_ms();
  371. } else if (b2_press_counter > 0) {
  372. /* P2 is black */
  373. State = STATE_GAME_PLAY_P1;
  374. last_update = get_absolute_time_ms();
  375. }
  376. break;
  377. case STATE_GAME_PLAY_P1:
  378. {
  379. uint32_t now = get_absolute_time_ms();
  380. int diff = now - last_update;
  381. if (diff >= Game.p1_time) {
  382. Game.p1_time = 0;
  383. State = STATE_GAME_TIMEOUT;
  384. break;
  385. }
  386. Game.p1_time -= diff;
  387. last_update = now;
  388. if (b1_press_counter > 0) {
  389. Game.p1_time += Modes[current_mode].increment_seconds * 1000;
  390. State = STATE_GAME_PLAY_P2;
  391. break;
  392. }
  393. if (key_press_counter > BUTTON_DEBOUNCE_TIME) {
  394. b2_press_counter = 0;
  395. key_press_counter = 0;
  396. State = STATE_GAME_PAUSE;
  397. }
  398. }
  399. break;
  400. case STATE_GAME_PLAY_P2:
  401. {
  402. uint32_t now = get_absolute_time_ms();
  403. int diff = now - last_update;
  404. if (diff >= Game.p2_time) {
  405. Game.p2_time = 0;
  406. State = STATE_GAME_TIMEOUT;
  407. break;
  408. }
  409. Game.p2_time -= diff;
  410. last_update = now;
  411. if (b2_press_counter > 0) {
  412. Game.p2_time += Modes[current_mode].increment_seconds * 1000;
  413. State = STATE_GAME_PLAY_P1;
  414. }
  415. if (key_press_counter > BUTTON_DEBOUNCE_TIME) {
  416. State = STATE_GAME_PAUSE;
  417. }
  418. }
  419. break;
  420. case STATE_GAME_PAUSE:
  421. if (b2_press_counter == BUTTON_DEBOUNCE_TIME) {
  422. State = STATE_GAME_PLAY_P1;
  423. } else if (b1_press_counter == BUTTON_DEBOUNCE_TIME) {
  424. State = STATE_GAME_PLAY_P2;
  425. }
  426. break;
  427. case STATE_GAME_TIMEOUT:
  428. if (key_press_counter == BUTTON_LONG_PRESS_TIME) {
  429. State = STATE_WALLCLOCK;
  430. }
  431. break;
  432. }
  433. if (oldstate != State) {
  434. b1_press_counter = 0;
  435. b2_press_counter = 0;
  436. key_press_counter = 0;
  437. printf("State: %d\n", State);
  438. }
  439. }
  440. void system_boot(void)
  441. {
  442. int i;
  443. set_sys_clock_48mhz();
  444. stdio_init_all();
  445. /* LED and Douts */
  446. gpio_init(LED_PIN);
  447. gpio_set_dir(LED_PIN, GPIO_OUT);
  448. gpio_put(LED_PIN,1);
  449. sleep_ms(1000);
  450. gpio_put(LED_PIN, 0);
  451. printf("Setting LEDs and digital outputs...\n");
  452. gpio_init(DISP1_CLK);
  453. gpio_init(DISP1_DIO);
  454. gpio_init(DISP2_CLK);
  455. gpio_init(DISP2_DIO);
  456. gpio_set_dir(DISP1_CLK, GPIO_OUT);
  457. gpio_set_dir(DISP1_DIO, GPIO_OUT);
  458. gpio_set_dir(DISP2_CLK, GPIO_OUT);
  459. gpio_set_dir(DISP2_DIO, GPIO_OUT);
  460. gpio_set_pulls(DISP1_CLK, 1, 0);
  461. gpio_set_pulls(DISP1_DIO, 1, 0);
  462. gpio_set_pulls(DISP2_CLK, 1, 0);
  463. gpio_set_pulls(DISP2_DIO, 1, 0);
  464. gpio_put(DISP1_CLK, 1);
  465. gpio_put(DISP1_DIO, 1);
  466. gpio_put(DISP2_CLK, 1);
  467. gpio_put(DISP2_DIO, 1);
  468. printf("Done.\n");
  469. /* BTN Dins */
  470. printf("Setting buttons and digital inputs...\n");
  471. gpio_init(BUTTON_P1);
  472. gpio_init(BUTTON_P2);
  473. gpio_init(ROT_KEY);
  474. gpio_init(ROT_S1);
  475. gpio_init(ROT_S0);
  476. gpio_set_dir(BUTTON_P1, GPIO_IN);
  477. gpio_set_dir(BUTTON_P2, GPIO_IN);
  478. gpio_set_dir(ROT_KEY, GPIO_IN);
  479. gpio_set_dir(ROT_S0, GPIO_IN);
  480. gpio_set_dir(ROT_S1, GPIO_IN);
  481. gpio_pull_down(ROT_KEY);
  482. gpio_pull_up(BUTTON_P1);
  483. gpio_pull_up(BUTTON_P2);
  484. printf("Wating up...\n");
  485. sleep_ms(2000);
  486. printf("Done.\n");
  487. }
  488. int main() {
  489. uint val = 1;
  490. uint8_t btn;
  491. uint16_t pot = 0;
  492. static uint16_t oldpot = 0;
  493. int i;
  494. system_boot();
  495. printf("Loop started.\n");
  496. display_set_brightness(1, 7);
  497. display_set_brightness(2, 7);
  498. display_clear(1);
  499. display_clear(2);
  500. while (1) {
  501. poll_buttons();
  502. switch (State) {
  503. case STATE_WALLCLOCK:
  504. {
  505. display_set_brightness(1, 7);
  506. display_set_brightness(2, 7);
  507. display_show(2, txt_good, 0);
  508. display_show(1, txt_day, 0);
  509. }
  510. break;
  511. case STATE_GAME_SET:
  512. {
  513. struct play_mode *md = &Modes[current_mode];
  514. display_show(2, txt_sel, 0);
  515. if (current_mode == N_MODES - 1) {
  516. display_show(1, txt_cus, 0);
  517. } else {
  518. uint8_t dn[4];
  519. num_to_digits(md->minutes, dn, 0);
  520. num_to_digits(md->increment_seconds, dn + 2, 0);
  521. display_show(1, dn, 1);
  522. }
  523. }
  524. break;
  525. case STATE_GAME_CUSTOM:
  526. {
  527. struct play_mode *md = &Modes[N_MODES - 1];
  528. uint8_t dn[4];
  529. display_show(2, txt_cus, 0);
  530. num_to_digits(md->minutes, dn, 0);
  531. num_to_digits(md->increment_seconds, dn + 2, 0);
  532. display_show(1, dn, 1);
  533. }
  534. break;
  535. case STATE_GAME_READY:
  536. {
  537. char txt_2[4] = { CHAR_P, CHAR_U, CHAR_S, CHAR_H };
  538. char txt_1[4] = { CHAR_B, CHAR_L, CHAR_A, CHAR_C };
  539. display_show(2, txt_2, 0);
  540. display_show(1, txt_1, 0);
  541. }
  542. break;
  543. case STATE_GAME_PLAY_P1:
  544. {
  545. int col = 0;
  546. if ((Game.p1_time % 1000) < 500)
  547. col = 1;
  548. display_time(1, Game.p1_time / 1000, (Game.p1_time % 1000) * 1000, col);
  549. display_time(2, Game.p2_time / 1000, (Game.p2_time % 1000) * 1000, 1);
  550. display_set_brightness(1, 7);
  551. display_set_brightness(2, 1);
  552. }
  553. break;
  554. case STATE_GAME_PLAY_P2:
  555. {
  556. int col = 0;
  557. if ((Game.p2_time % 1000) < 500)
  558. col = 1;
  559. display_time(1, Game.p1_time / 1000, (Game.p1_time % 1000) * 1000, 1);
  560. display_time(2, Game.p2_time / 1000, (Game.p2_time % 1000) * 1000, col);
  561. display_set_brightness(1, 1);
  562. display_set_brightness(2, 7);
  563. }
  564. break;
  565. case STATE_GAME_PAUSE:
  566. {
  567. display_show(2, txt_pause0, 0);
  568. display_show(1, txt_pause1, 0);
  569. }
  570. break;
  571. case STATE_GAME_TIMEOUT:
  572. {
  573. uint32_t now = get_absolute_time_ms();
  574. if ((now % 1000) > 500) {
  575. if (Game.p1_time == 0) {
  576. display_clear(1);
  577. }
  578. if (Game.p2_time == 0) {
  579. display_clear(2);
  580. }
  581. } else {
  582. if (Game.p1_time == 0) {
  583. display_time(1,0,0,1);
  584. }
  585. if (Game.p2_time == 0) {
  586. display_time(2,0,0,1);
  587. }
  588. }
  589. }
  590. break;
  591. default:
  592. display_show(2, txt_good, 0);
  593. display_show(1, txt_done, 0);
  594. }
  595. sleep_ms(10);
  596. }
  597. return 0;
  598. }