display.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include <avr/pgmspace.h>
  2. #include "main.h"
  3. #include "display.h"
  4. #include "HD44780-I2C.h"
  5. #include "xprintf.h"
  6. #include "working_modes.h"
  7. #include "timec.h"
  8. __flash const unsigned char battery_states[][8] = {
  9. {
  10. 0b01110,
  11. 0b11111,
  12. 0b11111,
  13. 0b11111,
  14. 0b11111,
  15. 0b11111,
  16. 0b11111,
  17. 0b11111,
  18. },
  19. {
  20. 0b01110,
  21. 0b11111,
  22. 0b10001,
  23. 0b11111,
  24. 0b11111,
  25. 0b11111,
  26. 0b11111,
  27. 0b11111,
  28. },
  29. {
  30. 0b01110,
  31. 0b11111,
  32. 0b10001,
  33. 0b10001,
  34. 0b10001,
  35. 0b11111,
  36. 0b11111,
  37. 0b11111,
  38. },
  39. {
  40. 0b01110,
  41. 0b11111,
  42. 0b10001,
  43. 0b10001,
  44. 0b10001,
  45. 0b10001,
  46. 0b10001,
  47. 0b11111,
  48. },
  49. };
  50. __flash const unsigned char custom_chars[] = {
  51. 0b00000, /* 0x01 down arrow */
  52. 0b00100,
  53. 0b00100,
  54. 0b00100,
  55. 0b10101,
  56. 0b01110,
  57. 0b00100,
  58. 0b00000,
  59. 0b00000, /* 0x02 up arrow */
  60. 0b00100,
  61. 0b01110,
  62. 0b10101,
  63. 0b00100,
  64. 0b00100,
  65. 0b00100,
  66. 0b00000,
  67. };
  68. struct disp_s disp;
  69. void disp_init(void) { /* send custom characters starting with 0x01 */
  70. unsigned char i;
  71. LCD_WriteCommand(0x40 + 8); // 0x01
  72. for(i=0; i<sizeof(custom_chars); i++){
  73. LCD_WriteData(custom_chars[i]);
  74. };
  75. }
  76. void battery_state_display(void) {
  77. unsigned char i;
  78. unsigned char index;
  79. if (System.bat_volt > 4.0)
  80. index = 0;
  81. else if (System.bat_volt > 3.7)
  82. index = 1;
  83. else if (System.bat_volt > 3.4)
  84. index = 2;
  85. else
  86. index = 3;
  87. LCD_WriteCommand(0x40 + 0); // 0x00
  88. for(i=0; i<8; i++){
  89. LCD_WriteData(battery_states[index][i]);
  90. };
  91. }
  92. __flash const char _gps_wait[] = "Czekam na GPS...";
  93. __flash const char _gps_ok[] = "GPS OK!";
  94. __flash const char _card_ok[] = "Karta OK!";
  95. __flash const char _logging_active[] = "Zapis aktywny";
  96. __flash const char _logging_paused[] = "Zapis wstrzymany";
  97. void display_event(unsigned char event) { /* overrides display with current messages */
  98. switch (event) {
  99. case DISPLAY_EVENT_STARTUP:
  100. strcpy_P(disp.line1, PSTR("Uruchamianie..."));
  101. break;
  102. case DISPLAY_EVENT_LOW_BATTERY:
  103. strcpy_P(disp.line2, PSTR("Bateria slaba!"));
  104. /* fall through */
  105. case DISPLAY_EVENT_POWEROFF:
  106. strcpy_P(disp.line1, PSTR("Wylaczanie..."));
  107. break;
  108. case DISPLAY_EVENT_INITIALIZED:
  109. strcpy_P(disp.line1, PSTR("Start"));
  110. switch(System.status){
  111. case STATUS_NO_POWER: case STATUS_OK: case STATUS_NO_GPS: disp.line2[0] = '\0'; break;
  112. case STATUS_NO_DISK: strcpy_P(disp.line2, PSTR("Brak karty!")); break;
  113. case STATUS_DISK_ERROR: strcpy_P(disp.line2, PSTR("Blad karty!")); break;
  114. case STATUS_FILE_WRITE_ERROR: strcpy_P(disp.line2, PSTR("Blad zapisu!")); break;
  115. case STATUS_FILE_SYNC_ERROR: strcpy_P(disp.line2, PSTR("Blad zapisu FAT!")); break;
  116. case STATUS_FILE_CLOSE_ERROR: strcpy_P(disp.line2, PSTR("Blad zamk.pliku!")); break;
  117. case STATUS_FILE_OPEN_ERROR: strcpy_P(disp.line2, PSTR("Blad otw. pliku!")); break;
  118. }
  119. break;
  120. case DISPLAY_EVENT_CARD_INITIALIZED:
  121. strcpy_P(disp.line1, _card_ok);
  122. strcpy_P(disp.line2, _gps_wait);
  123. break;
  124. case DISPLAY_EVENT_FILE_CLOSED:
  125. strcpy_P(disp.line2, PSTR("Pliki zamkniete"));
  126. break;
  127. case DISPLAY_EVENT_FILE_OPEN:
  128. strcpy_P(disp.line2, PSTR("Pliki otwarte"));
  129. break;
  130. }
  131. display_refresh(1);
  132. }
  133. void disp_func_main_default(void) {
  134. if (FLAGS & F_FILEOPEN) {
  135. if (System.tracking_paused)
  136. strcpy_P(disp.line1, _logging_paused);
  137. else
  138. strcpy_P(disp.line1, _logging_active);
  139. } else
  140. strcpy_P(disp.line1, _card_ok);
  141. if (FLAGS & F_GPSOK)
  142. strcpy_P(disp.line2, _gps_ok);
  143. else
  144. strcpy_P(disp.line2, _gps_wait);
  145. }
  146. void disp_func_coord(void) {
  147. if (System.location_valid == LOC_INVALID) {
  148. strcpy_P(disp.line1, PSTR("??? N/S"));
  149. strcpy_P(disp.line2, PSTR("??? E/W"));
  150. return;
  151. }
  152. xsprintf(disp.line1, PSTR("%2.6f%c"), (location.lat < 0)?(-location.lat):location.lat, (location.lat < 0)?'S':'N');
  153. xsprintf(disp.line2, PSTR("%3.6f%c"), (location.lon < 0)?(-location.lon):location.lon, (location.lon < 0)?'W':'E');
  154. }
  155. void disp_func_ele_sat(void) {
  156. if (System.location_valid == LOC_INVALID) {
  157. strcpy_P(disp.line1, PSTR("ele = ???"));
  158. } else {
  159. xsprintf(disp.line1, PSTR("ele = %.1fm"), location.alt);
  160. }
  161. xsprintf(disp.line2, PSTR("%2d satelit"), System.satellites_used);
  162. if (System.sbas)
  163. strcat_P(disp.line2, PSTR(", DGPS"));
  164. }
  165. void disp_distance_and_time(void) {
  166. xsprintf(disp.line1, PSTR("%.2f km"), (float)System.distance / 100000.0);
  167. if (utc > 0 && System.time_start > 0) {
  168. xsprintf(disp.line2, PSTR("t=%u s"), (unsigned int)(utc - System.time_start));
  169. } else {
  170. strcpy_P(disp.line2, PSTR("Czas nieznany"));
  171. }
  172. }
  173. void disp_speed(void) {
  174. strcpy_P(disp.line1, PSTR("Predkosc:"));
  175. if (utc > 0 && System.time_start > 0) {
  176. xsprintf(disp.line2, PSTR("%.2f km/h"), (float)System.distance / (float)(utc - System.time_start) * 0.036);
  177. } else {
  178. strcpy_P(disp.line2, PSTR("nieznana"));
  179. }
  180. }
  181. void disp_time(void) {
  182. if (utc == 0) {
  183. strcpy_P(disp.line1, PSTR("?"));
  184. strcpy_P(disp.line2, PSTR("?"));
  185. return;
  186. }
  187. time_t time = utc;
  188. time += local_time_diff(time) * (signed int)3600;
  189. struct tm *ct = gmtime(&time);
  190. xsprintf(disp.line1, PSTR("%d.%02d.%4d"), ct->tm_mday, ct->tm_mon+1, ct->tm_year+1900);
  191. xsprintf(disp.line2, PSTR("%d:%02d:%02d"), ct->tm_hour, ct->tm_min, ct->tm_sec);
  192. }
  193. void disp_func_temperature(void) {
  194. strcpy_P(disp.line1, PSTR("Temperatura"));
  195. if (System.temperature_ok) {
  196. xsprintf(disp.line2, PSTR("%.1f stC"), System.temperature);
  197. } else {
  198. strcpy_P(disp.line2, PSTR("Blad!"));
  199. }
  200. }
  201. void display_refresh(unsigned char changed) {
  202. if (timer_expired(lcd)) {
  203. changed = 1;
  204. }
  205. /* write to LCD */
  206. if (changed) {
  207. set_timer(lcd, 1000);
  208. battery_state_display();
  209. unsigned char len;
  210. LCD_GoTo(0,0);
  211. len = strlen(disp.line1);
  212. LCD_WriteText(disp.line1);
  213. while (len<15) {
  214. len++;
  215. LCD_WriteData(' ');
  216. }
  217. LCD_WriteData(0); /* battery symbol */
  218. LCD_GoTo(0,1);
  219. len = strlen(disp.line2);
  220. LCD_WriteText(disp.line2);
  221. while (len<16) {
  222. len++;
  223. LCD_WriteData(' ');
  224. }
  225. }
  226. }