clock.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #include "clock.h"
  2. /* variables */
  3. rtc_t Clock;
  4. static btn_t Button[BTN_NUM] = {
  5. {0, evBTN1Pressed, evBTN1Holded, BTN1_PIN},
  6. {0, evBTN2Pressed, evBTN2Pressed, BTN2_PIN},
  7. {0, evBTN3Pressed, evBTN3Pressed, BTN3_PIN},
  8. {0, evBTN4Pressed, evBTN4Holded, BTN4_PIN}
  9. };
  10. static volatile uint8_t dispWDT = 0;
  11. /* function prototypes */
  12. static void Color_RGB(const uint8_t r, const uint8_t g, const uint8_t b);
  13. static void MinusFadeIn(void);
  14. static void MinusFadeOut(void);
  15. /* funcions */
  16. /**
  17. * @brief Вывод HEX значений цвета в таймер.
  18. * @param : RGB value in range 0x00-0xFF
  19. * @retval : None
  20. */
  21. static void Color_RGB(uint8_t r, uint8_t g, uint8_t b) {
  22. COLOR_R(r);
  23. COLOR_G(g);
  24. COLOR_B(b);
  25. }
  26. /**
  27. * @brief Обработка кнопок.
  28. * @param : None
  29. * @retval : None
  30. */
  31. void btnProcess(void) {
  32. /* get pin state */
  33. uint32_t pins = BTNS_STATE;
  34. int i;
  35. for (i=0; i<BTN_NUM; i++) {
  36. if ((pins & Button[i].pin) == 0) {
  37. /* button pressed */
  38. Button[i].time ++;
  39. if (Button[i].time >= (BTN_TIME_HOLDED/BTN_SCAN_PERIOD)) {
  40. Button[i].time -= (BTN_TIME_REPEATED/BTN_SCAN_PERIOD);
  41. if (Button[i].holded == Button[i].pressed) {
  42. /* if pressed and holded - same function, then button pressed auto repeat */
  43. ES_PlaceEvent(Button[i].pressed);
  44. }
  45. }
  46. } else if (Button[i].time != 0) {
  47. /* button released */
  48. if (Button[i].time >= ((BTN_TIME_HOLDED - BTN_TIME_REPEATED)/BTN_SCAN_PERIOD)) {
  49. /* process long press */
  50. ES_PlaceEvent(Button[i].holded);
  51. } else if (Button[i].time >= (BTN_TIME_PRESSED/BTN_SCAN_PERIOD)) {
  52. /* process short press */
  53. ES_PlaceEvent(Button[i].pressed);
  54. }
  55. Button[i].time = 0;
  56. RTOS_SetTask(btnProcess, BTN_SCAN_PAUSE, BTN_SCAN_PERIOD);
  57. }
  58. } /* end FOR */
  59. }
  60. void new_Second(void) {
  61. // Blink_Start(); // !!! TODO
  62. RTC_ReadAll(&Clock);
  63. if (dispWDT != 0) {
  64. dispWDT--;
  65. if (dispWDT == 0) {
  66. ES_PlaceEvent(evDisplayWDT);
  67. }
  68. }
  69. }
  70. /**
  71. * On/off symbols on IN-15 tube.
  72. */
  73. void in15Off(void) {
  74. IN15_OFF;
  75. TUBE_C_OFF;
  76. }
  77. void in15Minus(void) {
  78. IN15_OFF;
  79. IN15_Minus;
  80. TUBE_C_ON;
  81. }
  82. void in15Plus(void) {
  83. IN15_OFF;
  84. IN15_Plus;
  85. TUBE_C_ON;
  86. }
  87. void in15Percent(void) {
  88. IN15_OFF;
  89. IN15_Percent;
  90. TUBE_C_ON;
  91. }
  92. void in15P(void) {
  93. IN15_OFF;
  94. IN15_P;
  95. TUBE_C_ON;
  96. }
  97. /** 'Faded' funcions */
  98. static void MinusFadeIn(void) {
  99. static uint8_t on = 0;
  100. static uint8_t off = 20;
  101. static uint8_t st = 0;
  102. if (st == 0) {
  103. st = 1;
  104. IN15_Minus;
  105. on += 2;
  106. if (on < 20) {
  107. RTOS_SetTask(MinusFadeIn, on, 0);
  108. } else {
  109. on = 0; off = 20; st = 0;
  110. }
  111. } else {
  112. st = 0;
  113. IN15_OFF;
  114. off -= 2;
  115. RTOS_SetTask(MinusFadeIn, off, 0);
  116. }
  117. }
  118. static void MinusFadeOut(void) {
  119. static uint8_t off = 0;
  120. static uint8_t on = 20;
  121. static uint8_t st = 0;
  122. if (st == 0) {
  123. st = 1;
  124. IN15_OFF;
  125. off += 2;
  126. if (off < 20) {
  127. RTOS_SetTask(MinusFadeOut, off, 0);
  128. } else {
  129. off = 0; on = 20; st = 0;
  130. }
  131. } else {
  132. st = 0;
  133. IN15_Minus;
  134. on -= 2;
  135. RTOS_SetTask(MinusFadeOut, on, 0);
  136. }
  137. }
  138. /**
  139. * Show info on tubes.
  140. */
  141. void showTime(void) {
  142. MinusFadeIn();
  143. RTOS_SetTask(MinusFadeOut, 500, 0);
  144. int16_t hue = bcd2bin(Clock.Sec) * 6;
  145. HSV2LED(hue, 255, 255);
  146. uint8_t buf[4];
  147. buf[Tube_A] = Clock.Hr >> 4;
  148. buf[Tube_B] = Clock.Hr & 0xf;
  149. buf[Tube_D] = Clock.Min >> 4;
  150. buf[Tube_E] = Clock.Min & 0xf;
  151. showDigits(buf);
  152. }
  153. void showWD(void) {
  154. dispWDT = DISP_WDT_TIME;
  155. IN15_OFF;
  156. uint8_t buf[4];
  157. buf[Tube_A] = 0xf;
  158. buf[Tube_B] = Clock.WD & 0xf;
  159. buf[Tube_D] = 0xf;
  160. buf[Tube_E] = 0xf;
  161. showDigits(buf);
  162. }
  163. void showDay(void) {
  164. dispWDT = DISP_WDT_TIME;
  165. IN15_OFF;
  166. uint8_t buf[4];
  167. buf[Tube_A] = Clock.Day >> 4;
  168. buf[Tube_B] = Clock.Day & 0xf;
  169. buf[Tube_D] = 0xf;
  170. buf[Tube_E] = 0xf;
  171. showDigits(buf);
  172. }
  173. void showMonth(void) {
  174. dispWDT = DISP_WDT_TIME;
  175. IN15_OFF;
  176. uint8_t buf[4];
  177. buf[Tube_A] = 0xf;
  178. buf[Tube_B] = 0xf;
  179. buf[Tube_D] = Clock.Mon >> 4;
  180. buf[Tube_E] = Clock.Mon & 0xf;
  181. showDigits(buf);
  182. }
  183. void showDayMon(void) {
  184. dispWDT = DISP_WDT_TIME;
  185. IN15_OFF;
  186. uint8_t buf[4];
  187. buf[Tube_A] = Clock.Day >> 4;
  188. buf[Tube_B] = Clock.Day & 0xf;
  189. buf[Tube_D] = Clock.Mon >> 4;
  190. buf[Tube_E] = Clock.Mon & 0xf;
  191. showDigits(buf);
  192. }
  193. void showYear(void) {
  194. dispWDT = DISP_WDT_TIME;
  195. IN15_OFF;
  196. uint8_t buf[4];
  197. buf[Tube_A] = 2;
  198. buf[Tube_B] = 0;
  199. buf[Tube_D] = Clock.Year >> 4;
  200. buf[Tube_E] = Clock.Year & 0xf;
  201. showDigits(buf);
  202. }
  203. void showHumidity(void) {
  204. dispWDT = DISP_WDT_TIME;
  205. in15Percent();
  206. uint8_t buf[4];
  207. buf[Tube_A] = Humidity / 10;
  208. buf[Tube_B] = Humidity % 10;
  209. buf[Tube_D] = 0xf;
  210. buf[Tube_E] = 0xf;
  211. showDigits(buf);
  212. }
  213. void showTemperature(void) {
  214. dispWDT = DISP_WDT_TIME;
  215. in15Plus();
  216. uint8_t buf[4];
  217. buf[Tube_A] = 0xf;
  218. buf[Tube_B] = 0xf;
  219. buf[Tube_D] = Temperature / 10;
  220. buf[Tube_E] = Temperature % 10;
  221. showDigits(buf);
  222. }
  223. void showPressure(void) {
  224. dispWDT = DISP_WDT_TIME;
  225. in15P();
  226. uint8_t buf[4];
  227. int tmp;
  228. buf[Tube_A] = 0xf;
  229. buf[Tube_B] = Pressure / 100;
  230. tmp = Pressure % 100;
  231. buf[Tube_D] = tmp / 10;
  232. buf[Tube_E] = tmp % 10;
  233. showDigits(buf);
  234. }
  235. /* Simple function for cyclic show all sensor data */
  236. void showSensorData(void) {
  237. ES_SetState(stShowSensorData);
  238. RTOS_DeleteTask(MinusFadeOut);
  239. Color_RGB(0xFF, 0x12, 0x0); // Nixie color. FF1200 or FF7E00 or FFBF00
  240. showTemperature();
  241. tdelay_ms(3000);
  242. showHumidity();
  243. tdelay_ms(3000);
  244. showPressure();
  245. tdelay_ms(3000);
  246. ES_SetState(stShowTime);
  247. showTime();
  248. }