log_dio.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "at32f403a_407.h"
  2. #include "log_dio.h"
  3. #include "settings_api.h"
  4. #include "ringfs.h"
  5. #include "ringfs_api.h"
  6. #include "digital_input.h"
  7. #if defined (MDIO_88)
  8. #undef DBG
  9. #define DBG if(1)
  10. EventGroupHandle_t archive_event;
  11. uint32_t archive_cnt[ARCH_DIO_CH_NUMBER] = {0};
  12. struct ringfs fs_ch_arch[ARCH_DIO_CH_NUMBER];
  13. static struct ringfs_flash_partition fingfs_flash_ch_arch[ARCH_DIO_CH_NUMBER] =
  14. {
  15. {
  16. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET,
  17. .sector_erase = op_sector_erase,
  18. .program = op_program,
  19. .read = op_read,
  20. },
  21. {
  22. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*1,
  23. .sector_erase = op_sector_erase,
  24. .program = op_program,
  25. .read = op_read,
  26. },
  27. {
  28. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*2,
  29. .sector_erase = op_sector_erase,
  30. .program = op_program,
  31. .read = op_read,
  32. },
  33. {
  34. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*3,
  35. .sector_erase = op_sector_erase,
  36. .program = op_program,
  37. .read = op_read,
  38. },
  39. {
  40. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*4,
  41. .sector_erase = op_sector_erase,
  42. .program = op_program,
  43. .read = op_read,
  44. },
  45. {
  46. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*5,
  47. .sector_erase = op_sector_erase,
  48. .program = op_program,
  49. .read = op_read,
  50. },
  51. {
  52. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*6,
  53. .sector_erase = op_sector_erase,
  54. .program = op_program,
  55. .read = op_read,
  56. },
  57. {
  58. .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*7,
  59. .sector_erase = op_sector_erase,
  60. .program = op_program,
  61. .read = op_read,
  62. },
  63. };
  64. // Архив. 8 буферов на каждый канал.
  65. void log_dio_archive_init(void)
  66. {
  67. for (uint8_t i = 0; i < ARCH_DIO_CH_NUMBER; i ++)
  68. {
  69. fingfs_flash_ch_arch[i].sector_size = spi_flash_desc.sector_size;
  70. fingfs_flash_ch_arch[i].sector_count = ARCHIVE_FLASH_SECTOR_COUNT;
  71. ringfs_init(&fs_ch_arch[i], &fingfs_flash_ch_arch[i],
  72. ARCHIV_ENTRY_VERSION + i, sizeof(archive_entry_t));
  73. if (ringfs_scan(&fs_ch_arch[i]) != 0) {
  74. DBG printf("FAT for channel %u is false\r\n", i + 1);
  75. ringfs_format(&fs_ch_arch[i]);
  76. }
  77. DBG printf("FAT for channel %u is true\r\n", i + 1);
  78. }
  79. }
  80. //
  81. uint8_t log_get_arch_channel_number(void)
  82. {
  83. return (uint8_t)ARCH_DIO_CH_NUMBER;
  84. }
  85. //
  86. uint8_t log_is_channel_on(uint8_t channel)
  87. {
  88. return (bool)settings.di[channel].state;
  89. }
  90. //
  91. void log_archive_task_device(void)
  92. {
  93. int ret = 0;
  94. EventBits_t bits;
  95. archive_entry_t entry = {0};
  96. bits = xEventGroupWaitBits(archive_event,
  97. ARCH_CH_1 | ARCH_CH_2 | ARCH_CH_3 | ARCH_CH_4 |
  98. ARCH_CH_5 | ARCH_CH_6 | ARCH_CH_7 | ARCH_CH_8 |
  99. ARCH_CH_9 | ARCH_CH_10 | ARCH_CH_11 | ARCH_CH_12,
  100. pdTRUE, pdFALSE, portMAX_DELAY);
  101. for (uint32_t i = 0; i < ARCH_AI_CH_NUMBER; i++)
  102. {
  103. if (bits & (1 << i))
  104. {
  105. DBG printf("Archive event: %u\r\n", (1 << i));
  106. entry.timestamp = 0;
  107. entry.input_value = di_get(i - 1);
  108. DBG printf("Append archive entry...");
  109. ret = log_append((void*)&entry, ARCHIVE_ENTRY, i - 1);
  110. if (ret != 0) {
  111. DBG printf("FAIL\r\n");
  112. }
  113. else {
  114. DBG printf("OK\r\n");
  115. }
  116. }
  117. }
  118. }
  119. #endif