module_rollbits.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "module_rollbits.h"
  2. #include "longwave_clock_icons.h"
  3. #define FRAME_HEIGHT 13
  4. #define START_HEIGHT 10
  5. #define MIN_X 2
  6. #define Y_POS 11
  7. #define ICON_WIDTH 9
  8. #define ICON_TOP 0
  9. #define ICON_BOTTOM 10
  10. #define ICON_SPACING 4
  11. #define WIDTH_DIGIT 6
  12. #define WIDTH_CHECKSUM 2
  13. #define WIDTH_MINUTE 10
  14. #define WIDTH_ASYNC 13
  15. #define WIDTH_START 2
  16. #define MID_SCREEN 64
  17. #define SUM_HEIGHT_1 17
  18. #define SUM_HEIGHT_2 19
  19. #define SUM_HEIGHT_3 21
  20. #define STRIKE_HEIGHT 7
  21. char* start_description[] =
  22. {"BBK+Weather", "DUT", "TZ", "Minute", "Hour", "Date", "Day", "Month", "Year"};
  23. static void draw_before_start(Canvas* canvas, uint16_t top, const char* str) {
  24. canvas_set_font(canvas, FontSecondary);
  25. canvas_draw_str_aligned(
  26. canvas, MID_SCREEN, top + FRAME_HEIGHT + START_HEIGHT, AlignCenter, AlignBottom, str);
  27. canvas_set_font(canvas, FontKeyboard);
  28. }
  29. void draw_decoded_bits(
  30. Canvas* canvas,
  31. LWCType type,
  32. uint16_t top,
  33. Bit buffer[],
  34. uint8_t length_buffer,
  35. uint8_t count_signals,
  36. uint8_t last_index,
  37. bool waiting_for_interrupt,
  38. bool waiting_for_sync) {
  39. if(waiting_for_interrupt) {
  40. draw_before_start(canvas, top, "Waiting first interrupt...");
  41. } else if(waiting_for_sync) {
  42. draw_before_start(canvas, top, "Waiting for sync...");
  43. }
  44. uint8_t left = canvas_width(canvas) - ICON_WIDTH;
  45. canvas_draw_icon(canvas, left, ICON_TOP, &I_lwc_sender);
  46. if(type == DCF77) {
  47. canvas_draw_icon(canvas, left, ICON_BOTTOM, &I_lwc_dcf);
  48. } else if(type == MSF) {
  49. canvas_draw_icon(canvas, left, ICON_BOTTOM, &I_lwc_msf);
  50. }
  51. left = left - ICON_SPACING;
  52. canvas_draw_line(canvas, 0, top, left, top);
  53. canvas_draw_line(canvas, 0, top + FRAME_HEIGHT, left, top + FRAME_HEIGHT);
  54. canvas_set_font(canvas, FontKeyboard);
  55. uint8_t index = last_index;
  56. uint8_t current_count = count_signals;
  57. bool drawn_start = false;
  58. bool drawn_end = false;
  59. while(left > MIN_X + WIDTH_DIGIT && current_count > 0) {
  60. Bit bit = buffer[index];
  61. current_count--;
  62. if(index == 0) {
  63. index = length_buffer - 1;
  64. } else {
  65. index--;
  66. }
  67. if(bit < BitChecksum) {
  68. left = left - WIDTH_DIGIT;
  69. if(bit == BitZero) {
  70. canvas_draw_str(canvas, left, Y_POS, "0");
  71. } else {
  72. canvas_draw_str(canvas, left, Y_POS, "1");
  73. }
  74. } else if(bit < BitEndMinute) {
  75. left = left - WIDTH_CHECKSUM;
  76. canvas_draw_line(canvas, left, top, left, top + FRAME_HEIGHT);
  77. if(!waiting_for_sync) {
  78. if(bit <= BitChecksumError) {
  79. canvas_draw_line(
  80. canvas, left + 2, top + SUM_HEIGHT_2, left + 6, top + SUM_HEIGHT_2);
  81. canvas_draw_line(
  82. canvas, left + 4, top + SUM_HEIGHT_1, left + 4, top + SUM_HEIGHT_3);
  83. } else {
  84. canvas_draw_line(
  85. canvas, left + 2, top + SUM_HEIGHT_2, left + 6, top + SUM_HEIGHT_2);
  86. canvas_draw_line(
  87. canvas, left + 2, top + SUM_HEIGHT_3, left + 6, top + SUM_HEIGHT_3);
  88. }
  89. }
  90. if(bit % 2 == 1) {
  91. canvas_draw_line(canvas, left, top + STRIKE_HEIGHT, left + 8, top + STRIKE_HEIGHT);
  92. }
  93. } else if(bit == BitEndMinute) {
  94. if(left < MIN_X + WIDTH_MINUTE) {
  95. break;
  96. }
  97. left = left - WIDTH_MINUTE;
  98. canvas_draw_box(
  99. canvas, left + 1, top, WIDTH_MINUTE - 2, FRAME_HEIGHT + START_HEIGHT + 1);
  100. drawn_end = true;
  101. } else if(bit == BitEndSync) {
  102. if(left < MIN_X + WIDTH_ASYNC) {
  103. break;
  104. }
  105. left = left - WIDTH_ASYNC;
  106. canvas_draw_line(canvas, left + 1, top, left + 4, top + 3);
  107. canvas_draw_line(canvas, left + WIDTH_ASYNC - 5, top, left + WIDTH_ASYNC - 2, top + 3);
  108. canvas_draw_line(canvas, left + 4, top + 3, left + 1, top + 6);
  109. canvas_draw_line(
  110. canvas, left + WIDTH_ASYNC - 2, top + 3, left + WIDTH_ASYNC - 5, top + 6);
  111. canvas_draw_line(canvas, left + 1, top + 6, left + 4, top + 9);
  112. canvas_draw_line(
  113. canvas, left + WIDTH_ASYNC - 5, top + 6, left + WIDTH_ASYNC - 2, top + 9);
  114. canvas_draw_line(canvas, left + 4, top + 9, left + 1, top + 12);
  115. canvas_draw_line(
  116. canvas, left + WIDTH_ASYNC - 2, top + 9, left + WIDTH_ASYNC - 5, top + 12);
  117. drawn_end = true;
  118. } else if(bit == BitUnknown) {
  119. left = left - WIDTH_DIGIT;
  120. canvas_draw_str(canvas, left, Y_POS, "?");
  121. } else if(bit >= BitStartEmpty) {
  122. left = left - WIDTH_START;
  123. uint8_t extra_height;
  124. if(bit > BitStartEmpty && !waiting_for_sync) {
  125. extra_height = START_HEIGHT;
  126. canvas_set_font(canvas, FontSecondary);
  127. canvas_draw_str(
  128. canvas,
  129. left + 2,
  130. top + FRAME_HEIGHT + START_HEIGHT,
  131. start_description[bit - BitStartEmpty - 1]);
  132. canvas_set_font(canvas, FontKeyboard);
  133. } else {
  134. extra_height = 0;
  135. }
  136. canvas_draw_line(canvas, left, top, left, top + FRAME_HEIGHT + extra_height);
  137. drawn_start = true;
  138. }
  139. }
  140. while(!drawn_start && !drawn_end && !waiting_for_sync && current_count > 0) {
  141. Bit bit = buffer[index];
  142. current_count--;
  143. if(index == 0) {
  144. index = length_buffer - 1;
  145. } else {
  146. index--;
  147. }
  148. if(bit == BitEndMinute) {
  149. drawn_end = true;
  150. } else if(bit >= BitStartEmpty) {
  151. canvas_draw_line(canvas, 0, top, 0, top + FRAME_HEIGHT + START_HEIGHT);
  152. canvas_set_font(canvas, FontSecondary);
  153. canvas_draw_str(
  154. canvas, 2, FRAME_HEIGHT + START_HEIGHT, start_description[bit - BitStartEmpty - 1]);
  155. canvas_set_font(canvas, FontKeyboard);
  156. drawn_start = true;
  157. }
  158. }
  159. }