example.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /***************************************************************
  2. * @file example.c
  3. * @brief
  4. * @author WKJay
  5. * @Version
  6. * @Date 2023-08-07
  7. ***************************************************************/
  8. #include <rtthread.h>
  9. #include "sfdb.h"
  10. #include <stdlib.h>
  11. #define TEST_FILE_PATH "/sdcard/test.sdb"
  12. #define MAX_RECORD_NUM 10000
  13. #define RECORD_LEN 32
  14. #define TEST_APPEND_NUM 10100
  15. void sdcard_test(void *param) {
  16. sfdb_t sfdb;
  17. sfdb_cfg_t cfg = {0};
  18. uint8_t record[32] = {0};
  19. uint32_t tick_old, duration;
  20. cfg.path = TEST_FILE_PATH;
  21. cfg.flags = SFDB_SYNC | SFDB_OVERWRITE;
  22. cfg.record_len = RECORD_LEN;
  23. cfg.max_record_num = MAX_RECORD_NUM;
  24. if (sfdb_open(&sfdb, &cfg) < 0) {
  25. return;
  26. }
  27. for (int i = 0; i < TEST_APPEND_NUM; i++) {
  28. snprintf((char *)record, sizeof(record), "sfdb test record %d", i + 1);
  29. tick_old = rt_tick_get();
  30. if (sfdb_append(&sfdb, record, sizeof(record)) < 0) {
  31. SF_LOG("append %d record failed.", i + 1);
  32. sfdb_close(&sfdb);
  33. return;
  34. }
  35. duration = rt_tick_get() - tick_old;
  36. SF_LOG("append %5d data cost %4d ms", i + 1, duration);
  37. }
  38. sfdb_close(&sfdb);
  39. }
  40. int sfdb_test(void) {
  41. rt_thread_t tid = rt_thread_create("sd_test", sdcard_test, NULL, 4096, 12, 5);
  42. if (tid) {
  43. rt_thread_startup(tid);
  44. }
  45. return 0;
  46. }
  47. MSH_CMD_EXPORT(sfdb_test, sfdb_test);
  48. int sfdb_read_test(int argc, char *argv[]) {
  49. int ret = -1, print_index = 0;
  50. uint32_t tick_old, duration, offset;
  51. uint16_t number;
  52. uint8_t order;
  53. sfdb_t sfdb;
  54. sfdb_cfg_t cfg;
  55. if (argc != 1 && argc != 4) {
  56. printf("invalid arguments,please input:\r\n");
  57. printf("1. sfdb_read\r\n");
  58. printf("2. sfdb_read [offset] [number] [order(0:asc 1:dsc)]\r\n");
  59. return -1;
  60. }
  61. if (argc == 4) {
  62. offset = atoi(argv[1]);
  63. number = atoi(argv[2]);
  64. order = atoi(argv[3]) ? SFDB_READ_DESC : SFDB_READ_ASC;
  65. }
  66. cfg.path = TEST_FILE_PATH;
  67. cfg.max_record_num = MAX_RECORD_NUM;
  68. cfg.record_len = RECORD_LEN;
  69. tick_old = rt_tick_get();
  70. if (sfdb_open(&sfdb, &cfg) < 0) {
  71. SF_LOG("open %s failed.", TEST_FILE_PATH);
  72. return -1;
  73. }
  74. duration = rt_tick_get() - tick_old;
  75. SF_LOG("open database cost %4d ms", duration);
  76. if (argc == 1) {
  77. SF_LOG("db index:%d", sfdb.hdr.record_index);
  78. SF_LOG("db count:%d", sfdb.hdr.record_count);
  79. SF_LOG("record len:%d", sfdb.hdr.record_len);
  80. } else {
  81. if (number > 100) number = 100;
  82. uint32_t data_sz = number * sfdb.hdr.record_len;
  83. uint8_t *data_buf = malloc(data_sz);
  84. if (data_buf == NULL) {
  85. SF_LOG("allocate memory failed.");
  86. goto close_db;
  87. }
  88. tick_old = rt_tick_get();
  89. ret = sfdb_read(&sfdb, data_buf, data_sz, offset, number, order);
  90. duration = rt_tick_get() - tick_old;
  91. SF_LOG("read %d data from %d cost %4d ms", ret, offset, duration);
  92. SF_LOG("------------DATA------------");
  93. for (int i = 0; i < ret; i++) {
  94. if (order == SFDB_READ_ASC) {
  95. print_index = i;
  96. } else {
  97. print_index = ret - i - 1;
  98. }
  99. SF_LOG("%-5d:%s", offset + i + 1, (char *)&data_buf[print_index * sfdb.hdr.record_len]);
  100. }
  101. SF_LOG("----------DATA END----------");
  102. free(data_buf);
  103. }
  104. close_db:
  105. tick_old = rt_tick_get();
  106. sfdb_close(&sfdb);
  107. duration = rt_tick_get() - tick_old;
  108. SF_LOG("close database cost %4d ms", duration);
  109. return 0;
  110. }
  111. MSH_CMD_EXPORT_ALIAS(sfdb_read_test, sfdb_read, sfdb read data);