You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.8 KiB

2 years ago
  1. #include "sample_data_manager_service.h"
  2. #include "board/board.h"
  3. #include "board/board_sdcard_driver.h"
  4. #include "znordic.h"
  5. /*******************************************************************************
  6. * ȫֱ *
  7. *******************************************************************************/
  8. static FIL m_default_file_handler;
  9. static sample_data_fileinfo_list_t m_sample_fileinfo_list;
  10. static sample_data_fileinfo_t m_sample_fileinfo[FILE_MAX_COUNT];
  11. /*******************************************************************************
  12. * ӿڲ *
  13. *******************************************************************************/
  14. static void read_file_info() {
  15. /**
  16. * @brief
  17. *
  18. * fdate:
  19. * bit15:9
  20. * Year origin from 1980 (0..127)
  21. * bit8:5
  22. * Month (1..12)
  23. * bit4:0
  24. * Day of the month(1..31)
  25. * ftime:
  26. * bit15:11
  27. * Hour (0..23)
  28. * bit10:5
  29. * Minute (0..59)
  30. * bit4:0
  31. * Second / 2 (0..29)
  32. */
  33. FILINFO fno;
  34. FRESULT ff_result = f_stat("0.bin", &fno);
  35. m_sample_fileinfo_list.fileinfo[0] = &m_sample_fileinfo[0];
  36. if (ff_result == FR_OK) {
  37. static sample_data_filename_t _filename;
  38. _filename.year = (fno.fdate >> 9) + 1980 - 2000;
  39. _filename.month = (fno.fdate >> 5) & 0x0F;
  40. _filename.day = fno.fdate & 0x1F;
  41. _filename.hour = (fno.ftime >> 11);
  42. _filename.min = (fno.ftime >> 5) & 0x3F;
  43. _filename.sec = (fno.ftime & 0x1F) * 2;
  44. memcpy(m_sample_fileinfo_list.fileinfo[0]->filename, &_filename, sizeof(sample_data_filename_t));
  45. m_sample_fileinfo_list.fileinfo[0]->size = fno.fsize;
  46. m_sample_fileinfo_list.count = 1;
  47. ZLOGI("filelist:");
  48. ZLOGI(" name:%s", "0.bin");
  49. ZLOGI(" size:%d", fno.fsize);
  50. } else {
  51. m_sample_fileinfo_list.fileinfo[0]->size = 0;
  52. m_sample_fileinfo_list.count = 0;
  53. }
  54. }
  55. /**
  56. * @brief ļ
  57. */
  58. void SampleDataMgr_init() {
  59. Board_sdcardInit();
  60. // �����ӵ���Ƭ������ȡ���ļ�״̬��Ϣ
  61. SampleDataMgr_changeToLocalMode();
  62. SampleDataMgr_changeToExtMode();
  63. }
  64. void SampleDataMgr_loadDriver() {
  65. // donothing
  66. }
  67. void SampleDataMgr_unloadDriver() {
  68. // donothin
  69. }
  70. typedef struct {
  71. uint8_t filename[8];
  72. uint32_t filesize;
  73. } disk_state_t;
  74. /**
  75. * @brief ӵƬ
  76. */
  77. void SampleDataMgr_changeToLocalMode() {
  78. ZLOGI("change to local mode");
  79. Board_sdcardConnectToInternal();
  80. read_file_info();
  81. }
  82. /**
  83. * @brief ⲿtypec
  84. */
  85. void SampleDataMgr_changeToExtMode() {
  86. ZLOGI("change to ext mode");
  87. if (Board_sdcardGetConnectTo() == kConnectToInternal) {
  88. read_file_info();
  89. }
  90. Board_sdcardConnectToExt();
  91. }
  92. /**
  93. * @brief ļ
  94. *
  95. * @param filename
  96. * @param flag
  97. * @return int32_t
  98. */
  99. static FIL m_default_file_handler;
  100. static bool m_is_open;
  101. int32_t SampleDataMgr_open(sample_data_filename_t* filename, wrflag_t flag) {
  102. if (flag == kwrflag_write_only) {
  103. FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_CREATE_ALWAYS | FA_READ | FA_WRITE);
  104. ZASSERT(ff_result == FR_OK);
  105. m_is_open = true;
  106. return 1;
  107. } else {
  108. FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_READ);
  109. if (ff_result != FR_OK) {
  110. return -1;
  111. }
  112. m_is_open = true;
  113. return 1;
  114. }
  115. }
  116. int32_t SampleDataMgr_close(int32_t fd) {
  117. ZASSERT(m_is_open);
  118. FRESULT ff_result = f_close(&m_default_file_handler);
  119. ZASSERT(ff_result == FR_OK);
  120. m_is_open = false;
  121. return 0;
  122. }
  123. int32_t SampleDataMgr_write(int32_t fd, const uint8_t* data, int32_t size) {
  124. ZASSERT(m_is_open);
  125. UINT write_size;
  126. FRESULT ff_result = f_write(&m_default_file_handler, data, size, &write_size);
  127. ZASSERT(ff_result == FR_OK);
  128. return write_size;
  129. }
  130. int32_t SampleDataMgr_read(int32_t fd, uint8_t* data, int32_t size) {
  131. ZASSERT(m_is_open);
  132. UINT read_size;
  133. FRESULT ff_result = f_read(&m_default_file_handler, data, size, &read_size);
  134. ZASSERT(ff_result == FR_OK);
  135. return read_size;
  136. }
  137. uint32_t SampleDataMgr_getFileSizeByFd(int32_t fd) {
  138. ZASSERT(m_is_open);
  139. return f_size(&m_default_file_handler);
  140. }
  141. int32_t SampleDataMgr_deleteFile(sample_data_filename_t* filename) {
  142. if (Board_sdcardGetConnectTo() == kConnectToExt) {
  143. /**
  144. * @brief
  145. * н׶ΣSDӵⲿ޷ɾļ
  146. */
  147. ZLOGW("unsupport now");
  148. return 0;
  149. }
  150. f_unlink((const TCHAR*)"0.bin");
  151. return 0;
  152. }
  153. sample_data_fileinfo_list_t* SampleDataMgr_getFileinfoList() { //
  154. return &m_sample_fileinfo_list;
  155. }
  156. bool SampleDataMgr_storageIsFull() { return m_sample_fileinfo_list.count >= FILE_MAX_COUNT; }
  157. int32_t SampleDataMgr_getFileNum() { return m_sample_fileinfo_list.count; }