logic_general.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "logic_general.h"
  2. #include <stdlib.h>
  3. static void minute_data_up_index(MinuteData* minute_data) {
  4. if(minute_data->index < minute_data->max - 1) {
  5. minute_data->index++;
  6. } else {
  7. minute_data_reset(minute_data);
  8. }
  9. }
  10. void minute_data_start_minute(MinuteData* minute_data) {
  11. minute_data->index = 0;
  12. minute_data->half_seconds = 0;
  13. minute_data->error_count = 0;
  14. }
  15. MinuteDataError minute_data_500ms_passed(MinuteData* minute_data) {
  16. if(minute_data->index >= 0 && minute_data->index < 59) {
  17. minute_data->half_seconds++;
  18. if(minute_data->half_seconds > minute_data->index * 2 + 1) {
  19. minute_data->buffer[minute_data->index] = -1;
  20. minute_data_up_index(minute_data);
  21. minute_data->error_count++;
  22. if(minute_data->error_count > 2) {
  23. minute_data_reset(minute_data);
  24. return MinuteDataErrorDesync;
  25. } else {
  26. return MinuteDataErrorUnknownBit;
  27. }
  28. }
  29. }
  30. return MinuteDataErrorNone;
  31. }
  32. void minute_data_add_bit(MinuteData* minute_data, int bit) {
  33. if(minute_data->index >= 0) {
  34. minute_data->buffer[minute_data->index] = bit;
  35. if((bit == 0 || bit == 1) && minute_data->error_count > 0) {
  36. minute_data->error_count--;
  37. }
  38. minute_data_up_index(minute_data);
  39. }
  40. }
  41. int minute_data_get_length(MinuteData* minute_data) {
  42. return minute_data->index;
  43. }
  44. int minute_data_get_bit(MinuteData* minute_data, int position) {
  45. return minute_data->buffer[position];
  46. }
  47. int get_if_single_digit(int value) {
  48. if(value < 10) {
  49. return value;
  50. } else {
  51. return -1;
  52. }
  53. }
  54. int get_power2_number(MinuteData* minute_data, int start_index, int stop_index, int increment) {
  55. int power2 = 1;
  56. int result = 0;
  57. int index = start_index;
  58. do {
  59. int value = minute_data->buffer[index];
  60. if(value == 0 || value == 1) {
  61. result += value * power2;
  62. } else {
  63. return -1;
  64. }
  65. index = index + increment;
  66. power2 = power2 * 2;
  67. } while(index != stop_index);
  68. return result;
  69. }
  70. int get_checksum(MinuteData* minute_data, int start_index, int stop_index, int increment) {
  71. int result = 0;
  72. int index = start_index;
  73. do {
  74. int value = minute_data->buffer[index];
  75. if(value == 1) {
  76. result = 1 - result;
  77. } else if(value == 0) {
  78. } else {
  79. return -1;
  80. }
  81. index = index + increment;
  82. } while(index != stop_index);
  83. return result;
  84. }
  85. int add_to_checksum(MinuteData* minute_data, int index, int current_checksum) {
  86. if(current_checksum == -1) {
  87. return -1;
  88. } else {
  89. int value = minute_data->buffer[index];
  90. if(value == 1) {
  91. return 1 - current_checksum;
  92. } else if(value == 0) {
  93. return current_checksum;
  94. } else {
  95. return -1;
  96. }
  97. }
  98. }
  99. void minute_data_reset(MinuteData* minute_data) {
  100. minute_data->index = -1;
  101. }
  102. MinuteData* minute_data_alloc(int max) {
  103. MinuteData* minute_data = malloc(sizeof(MinuteData));
  104. minute_data_reset(minute_data);
  105. minute_data->max = max;
  106. return minute_data;
  107. }
  108. void minute_data_free(MinuteData* minute_data) {
  109. free(minute_data);
  110. }