logic_dcf77.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "logic_dcf77.h"
  2. #include "longwave_clock_app.h"
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #define BIT_START 0
  6. #define BIT_WEATHER 1
  7. #define BIT_CALL 15
  8. #define BIT_TZCHANGE 16
  9. #define BIT_CEST 17
  10. #define BIT_CET 18
  11. #define BIT_LEAP 19
  12. #define BIT_TIME_CONSTANT 20
  13. #define BIT_MINUTES_1s_START 21
  14. #define BIT_MINUTES_10s_START 25
  15. #define BIT_MINUTES_CHECKSUM 28
  16. #define BIT_HOURS_1s_START 29
  17. #define BIT_HOURS_10s_START 33
  18. #define BIT_HOURS_CHECKSUM 35
  19. #define BIT_DOM_1s_START 36
  20. #define BIT_DOM_10s_START 40
  21. #define BIT_DOW_START 42
  22. #define BIT_MONTH_1s_START 45
  23. #define BIT_MONTH_10s_START 49
  24. #define BIT_YEAR_1s_START 50
  25. #define BIT_YEAR_10s_START 54
  26. #define BIT_DATE_CHECKSUM 58
  27. DecodingPhase dcf77_get_decoding_phase(MinuteData* minute_data) {
  28. if(minute_data->index == -1) {
  29. return DecodingUnknown;
  30. } else if(minute_data->index <= BIT_WEATHER) {
  31. return DecodingTime;
  32. } else if(minute_data->index <= BIT_CALL) {
  33. return DecodingWeather;
  34. } else if(minute_data->index == BIT_TZCHANGE) {
  35. return DecodingMeta;
  36. } else if(minute_data->index <= BIT_DOM_1s_START) {
  37. return DecodingTime;
  38. } else {
  39. return DecodingDate;
  40. }
  41. }
  42. DecodingTimePhase dcf77_get_decoding_time_phase(MinuteData* minute_data) {
  43. if(minute_data->index <= BIT_WEATHER) {
  44. return DecodingTimeSeconds;
  45. } else if(minute_data->index <= BIT_CET + 1) {
  46. return DecodingTimeTimezone;
  47. } else if(minute_data->index <= BIT_TIME_CONSTANT) {
  48. return DecodingNoTime;
  49. } else if(minute_data->index == BIT_TIME_CONSTANT + 1) {
  50. return DecodingTimeConstant;
  51. } else if(minute_data->index <= BIT_MINUTES_10s_START) {
  52. return DecodingTimeMinutes1s;
  53. } else if(minute_data->index <= BIT_MINUTES_CHECKSUM) {
  54. return DecodingTimeMinutes10s;
  55. } else if(minute_data->index == BIT_MINUTES_CHECKSUM + 1) {
  56. return DecodingTimeMinutes;
  57. } else if(minute_data->index <= BIT_HOURS_10s_START) {
  58. return DecodingTimeHours1s;
  59. } else if(minute_data->index <= BIT_HOURS_CHECKSUM) {
  60. return DecodingTimeHours10s;
  61. } else {
  62. return DecodingTimeHours;
  63. }
  64. }
  65. DecodingDatePhase dcf77_get_decoding_date_phase(MinuteData* minute_data) {
  66. if(minute_data->index <= BIT_DOM_10s_START) {
  67. return DecodingDateDayOfMonth1s;
  68. } else if(minute_data->index <= BIT_DOW_START) {
  69. return DecodingDateDayOfMonth10s;
  70. } else if(minute_data->index <= BIT_MONTH_1s_START) {
  71. return DecodingDateDayOfWeek;
  72. } else if(minute_data->index <= BIT_MONTH_10s_START) {
  73. return DecodingDateMonth1s;
  74. } else if(minute_data->index <= BIT_YEAR_1s_START) {
  75. return DecodingDateMonth10s;
  76. } else if(minute_data->index <= BIT_YEAR_10s_START) {
  77. return DecodingDateYear1s;
  78. } else if(minute_data->index <= BIT_DATE_CHECKSUM) {
  79. return DecodingDateYear10s;
  80. } else if(minute_data->index == BIT_DATE_CHECKSUM + 1) {
  81. return DecodingDateDate;
  82. } else {
  83. return DecodingNoDate;
  84. }
  85. }
  86. Timezone dcf77_decode_timezone(MinuteData* minute_data) {
  87. int cest = minute_data->buffer[BIT_CEST];
  88. int cet = minute_data->buffer[BIT_CET];
  89. if(cet == 1 && cest == 0) {
  90. return CETTimezone;
  91. } else if(cet == 0 && cest == 1) {
  92. return CESTTimezone;
  93. } else {
  94. return UnknownTimezone;
  95. }
  96. }
  97. int dcf77_decode_minutes_1s(MinuteData* minute_data) {
  98. return get_if_single_digit(
  99. get_power2_number(minute_data, BIT_MINUTES_1s_START, BIT_MINUTES_10s_START, 1));
  100. }
  101. int dcf77_decode_minutes_10s(MinuteData* minute_data) {
  102. return get_if_single_digit(
  103. get_power2_number(minute_data, BIT_MINUTES_10s_START, BIT_MINUTES_CHECKSUM, 1));
  104. }
  105. int dcf77_get_minutes_checksum(MinuteData* minute_data) {
  106. return get_checksum(minute_data, BIT_MINUTES_1s_START, BIT_MINUTES_CHECKSUM + 1, 1);
  107. }
  108. int dcf77_decode_hours_1s(MinuteData* minute_data) {
  109. return get_if_single_digit(
  110. get_power2_number(minute_data, BIT_HOURS_1s_START, BIT_HOURS_10s_START, 1));
  111. }
  112. int dcf77_decode_hours_10s(MinuteData* minute_data) {
  113. return get_if_single_digit(
  114. get_power2_number(minute_data, BIT_HOURS_10s_START, BIT_HOURS_CHECKSUM, 1));
  115. }
  116. int dcf77_get_hours_checksum(MinuteData* minute_data) {
  117. return get_checksum(minute_data, BIT_HOURS_1s_START, BIT_HOURS_CHECKSUM + 1, 1);
  118. }
  119. int dcf77_decode_day_of_month_1s(MinuteData* minute_data) {
  120. return get_if_single_digit(
  121. get_power2_number(minute_data, BIT_DOM_1s_START, BIT_DOM_10s_START, 1));
  122. }
  123. int dcf77_decode_day_of_month_10s(MinuteData* minute_data) {
  124. return get_if_single_digit(
  125. get_power2_number(minute_data, BIT_DOM_10s_START, BIT_DOW_START, 1));
  126. }
  127. int dcf77_decode_day_of_week(MinuteData* minute_data) {
  128. return get_power2_number(minute_data, BIT_DOW_START, BIT_MONTH_1s_START, 1);
  129. }
  130. int dcf77_decode_month_1s(MinuteData* minute_data) {
  131. return get_if_single_digit(
  132. get_power2_number(minute_data, BIT_MONTH_1s_START, BIT_MONTH_10s_START, 1));
  133. }
  134. int dcf77_decode_month_10s(MinuteData* minute_data) {
  135. return get_if_single_digit(
  136. get_power2_number(minute_data, BIT_MONTH_10s_START, BIT_YEAR_1s_START, 1));
  137. }
  138. int dcf77_decode_year_1s(MinuteData* minute_data) {
  139. return get_if_single_digit(
  140. get_power2_number(minute_data, BIT_YEAR_1s_START, BIT_YEAR_10s_START, 1));
  141. }
  142. int dcf77_decode_year_10s(MinuteData* minute_data) {
  143. return get_if_single_digit(
  144. get_power2_number(minute_data, BIT_YEAR_10s_START, BIT_DATE_CHECKSUM, 1));
  145. }
  146. int dcf77_get_date_checksum(MinuteData* minute_data) {
  147. return get_checksum(minute_data, BIT_DOM_1s_START, BIT_DATE_CHECKSUM + 1, 1);
  148. }
  149. static void set_simulated_dcf77_encoded_number(
  150. MinuteData* simulated_data,
  151. int start_index,
  152. int count_1s,
  153. int count_10s,
  154. int number) {
  155. int number_1s = number % 10;
  156. int number_10s = (number - number_1s) / 10;
  157. int index = start_index;
  158. for(int i = 0; i < count_1s; i++) {
  159. simulated_data->buffer[index] = number_1s & 1;
  160. index++;
  161. number_1s >>= 1;
  162. }
  163. for(int i = 0; i < count_10s; i++) {
  164. simulated_data->buffer[index] = number_10s & 1;
  165. index++;
  166. number_10s >>= 1;
  167. }
  168. }
  169. void dcf77_set_simulated_minute_data(
  170. MinuteData* simulated_data,
  171. int seconds,
  172. int minutes,
  173. int hours,
  174. int day_of_week,
  175. int day_of_month,
  176. int month,
  177. int year) {
  178. simulated_data->index = seconds;
  179. simulated_data->buffer[BIT_START] = 0;
  180. for(int i = BIT_START + 1; i < BIT_CALL; i++) {
  181. simulated_data->buffer[i] = random() % 2;
  182. }
  183. simulated_data->buffer[BIT_CALL] = 0;
  184. simulated_data->buffer[BIT_TZCHANGE] = 0;
  185. if(month > 3 && month < 11) {
  186. simulated_data->buffer[BIT_CEST] = 1;
  187. simulated_data->buffer[BIT_CET] = 0;
  188. } else {
  189. simulated_data->buffer[BIT_CEST] = 0;
  190. simulated_data->buffer[BIT_CET] = 1;
  191. }
  192. simulated_data->buffer[BIT_LEAP] = 0;
  193. simulated_data->buffer[BIT_TIME_CONSTANT] = 1;
  194. set_simulated_dcf77_encoded_number(simulated_data, BIT_MINUTES_1s_START, 4, 3, minutes);
  195. simulated_data->buffer[BIT_MINUTES_CHECKSUM] =
  196. get_checksum(simulated_data, BIT_MINUTES_1s_START, BIT_MINUTES_CHECKSUM, 1);
  197. set_simulated_dcf77_encoded_number(simulated_data, BIT_HOURS_1s_START, 4, 2, hours);
  198. simulated_data->buffer[BIT_HOURS_CHECKSUM] =
  199. get_checksum(simulated_data, BIT_HOURS_1s_START, BIT_HOURS_CHECKSUM, 1);
  200. set_simulated_dcf77_encoded_number(simulated_data, BIT_DOM_1s_START, 4, 2, day_of_month);
  201. set_simulated_dcf77_encoded_number(simulated_data, BIT_DOW_START, 3, 0, day_of_week);
  202. set_simulated_dcf77_encoded_number(simulated_data, BIT_MONTH_1s_START, 4, 1, month);
  203. set_simulated_dcf77_encoded_number(simulated_data, BIT_YEAR_1s_START, 4, 4, year % 100);
  204. simulated_data->buffer[BIT_DATE_CHECKSUM] =
  205. get_checksum(simulated_data, BIT_DOM_1s_START, BIT_DATE_CHECKSUM, 1);
  206. }