settings_api.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #ifndef SETTINGS_API_H
  2. #define SETTINGS_API_H
  3. #include "at32f403a_407.h"
  4. #include "model_cfg.h"
  5. #include "usart.h"
  6. #include "sys_api.h"
  7. #include "io.h"
  8. #include "mb.h"
  9. #include "mbport.h"
  10. #include "log.h"
  11. #include "analog_input.h"
  12. #include "analog_output.h"
  13. #include <stdbool.h>
  14. // Изменить версию если поменялась структура настроек
  15. #define SETTINGS_VERSION 0x01
  16. // ------------------------------------------------------------------- //
  17. // Граничные значения
  18. // ------------------------------------------------------------------- //
  19. #define MAX_ARCHIVE_PERIOD 43200
  20. // ------------------------------------------------------------------- //
  21. // Настройки лога и архива
  22. // ------------------------------------------------------------------- //
  23. #define ARCH_DIO_CH_NUMBER 8
  24. #define ARCH_AI_CH_NUMBER 12 //12
  25. // ------------------------------------------------------------------- //
  26. // Draft
  27. // ------------------------------------------------------------------- //
  28. /*
  29. 1. Uptime (uint32_t) // +
  30. 2. Realtime (unix timestamp, uint32_t) // +
  31. 3. Версия прошивки // +
  32. 4. Модель (char 16 байт) // +
  33. */
  34. // ------------------------------------------------------------------- //
  35. // Modbus
  36. // ------------------------------------------------------------------- //
  37. #define MB_STOP_BIT_MASK 0x03
  38. #define MB_STOP_BIT_1 0x00
  39. #define MB_STOP_BIT_2 0x02
  40. #define MB_PARITY_MASK (0x03 << 3)
  41. #define MB_NO_PAR (0x00 << 3)
  42. #define MB_EVEN_PAR (0x02 << 3)
  43. #define MB_ODD_PAR (0x03 << 3)
  44. #define MB_BRD_MASK (0x07 << 5)
  45. #define MB_BRD_2400 (0x00 << 5)
  46. #define MB_BRD_4800 (0x01 << 5)
  47. #define MB_BRD_9600 (0x02 << 5)
  48. #define MB_BRD_19200 (0x03 << 5)
  49. #define MB_BRD_38400 (0x04 << 5)
  50. #define MB_BRD_57600 (0x05 << 5)
  51. #define MB_BRD_115200 (0x06 << 5)
  52. // Modbus
  53. typedef struct
  54. {
  55. rate_t baud; // Скорость порта
  56. parity_t parity; // Четность
  57. databits_t databits; // Число бит данных
  58. stopbits_t stopbits; // Число стоп-бит
  59. } modbus_t;
  60. // Общая структура настроек для IAP и FW
  61. typedef struct
  62. {
  63. uint16_t mb_port; // Настройки порта для modbus
  64. //char model[MODEL_LEN]; // Модель
  65. } com_settings_t;
  66. #if 0
  67. // Дискретные входы
  68. typedef struct
  69. {
  70. uint16_t debounce_time; // период антидребезга в мс (0 - 10 сек)
  71. } dinput_t;
  72. #endif
  73. // Полная структура настроек
  74. typedef struct
  75. {
  76. com_settings_t com_settings;
  77. uint32_t critical_section_crc;
  78. /* WARNING! До поля CritSecCRC включительно структура настроек должна быть
  79. * идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
  80. * Контроль целостности настроек внутри IAP выполняется только для критической секции,
  81. * т.к. контроль целостности всей структуры не имеет смысла
  82. * (структура настроек всегда будет отличаться внутри основного ПО).
  83. * В случае повреждения критического сектора, загружаются параметры по умолчанию. */
  84. uint16_t settings_version; // Версия структуры настроек
  85. uint32_t control_word; // Слово для контроля целостности структуры настроек
  86. #if defined (MDIO_88)
  87. di_t di[DI_NUMBER]; //
  88. uint16_t di_state_bits; //
  89. uint16_t di_mode_bits; // режим работы, 0 - вход, 1 - счетчик импульсов
  90. uint16_t di_norm_state_bits; // нормальное состояние (0 - разомкнут, 1 - замкнут)
  91. uint16_t di_debounce[DI_NUMBER]; // дискретные входы
  92. do_t dout[DO_NUMBER]; // параметры выходов в обычном режиме
  93. do_t dout_save[DO_NUMBER]; // параметры выходов в безопасном режиме
  94. uint16_t period_archive[ARCH_DIO_CH_NUMBER]; // период архивирования
  95. #endif
  96. #if defined (MAI_12)
  97. ai_t ai[AI_COMMON_NUMBER]; //
  98. ai_t ai_add[AI_ADD_NUMBER]; //
  99. uint16_t ai_state_bits; // статус входа (для 12 основных), 0 - выкл, 1 - вкл
  100. uint16_t ai_mode_bits; // режим работы входов (для 12 основных), 0 - измерение напряжения, 1 - тока
  101. uint16_t ai_current_mode_bits; // режим измерения тока (0 - 0-20 мА, 1 - 4-20 mA)
  102. uint16_t ext_sens_power; // питание внешних датчиков, 0 - выкл, 1 - вкл
  103. uint16_t period_archive[ARCH_AI_CH_NUMBER]; // период архивирования
  104. #endif
  105. #if defined (MAO_4)
  106. ao_t ao[AO_NUMBER]; // параметры выходов
  107. ao_t ao_save[AO_NUMBER]; // параметры выходов в безопасном режиме
  108. uint16_t ao_state_bits; // статус выхода, 0 - выкл, 1 - вкл
  109. uint16_t ao_state_save_bits; // статус выхода в безопасном режиме, 0 - выкл, 1 - вкл
  110. uint16_t ao_mode_bits; // режим работы выходов, 0 - напряжения, 1 - ток
  111. uint16_t ao_mode_save_bits; // режим работы выходов в безопасном режиме, 0 - напряжения, 1 - ток
  112. #endif
  113. uint16_t save_mode; // безопасный режим, 0 - выкл, 1 - вкл
  114. uint16_t save_delay; // время ожидания опроса (сек.)
  115. uint8_t info[32]; // Пользовательская информация. Текстовая строка.
  116. } settings_t;
  117. // Загрузка структуры настроек из flesh
  118. void settings_load(settings_t *settings);
  119. //
  120. void init_settings(void);
  121. //
  122. void settings_read_from_flash(uint8_t *data, uint32_t size);
  123. //
  124. uint32_t settings_get_crc(settings_t *settings);
  125. //
  126. uint32_t settings_get_crit_sec_crc(settings_t *settings);
  127. // Сброс всех настроек в значения по умолчанию
  128. void settings_set_all_default(void);
  129. // -------------------------------------------------------------------------- //
  130. // Настройки по умолчанию
  131. //
  132. void settings_set_modbus_def(uint16_t *mb_port);
  133. //
  134. void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port);
  135. // Установка параметров Modbus
  136. void settings_set_modbus_params(uint16_t mb_port);
  137. //
  138. uint32_t settings_get_mb_baud(modbus_t *mb_settings);
  139. //
  140. eMBParity settings_get_mb_par(modbus_t *mb_settings);
  141. //
  142. void settings_init_mb_port(uint8_t mb_addr);
  143. // -------------------------------------------------------------------------- //
  144. // Запись структуры настроек во flash
  145. bool settings_save(settings_t *settings);
  146. //
  147. bool settings_save_with_log(void);
  148. //
  149. bool settings_write_to_flash(uint8_t *data, uint32_t size);
  150. // Очистка сектора настроек
  151. void settings_erase_flash_sector(void);
  152. //
  153. bool settings_is_changed(settings_t *new_settings);
  154. //
  155. void settings_print(void);
  156. // Системные настройки
  157. extern sys_settings_t sys_settings;
  158. // Копия системных настроек
  159. extern sys_settings_t temp_sys_settings;
  160. // Общая структура настроек
  161. extern settings_t settings;
  162. #endif /* #ifndef SETTINGS_API_H */