terminal_sbs.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #include "terminal_sbs.h"
  2. #include "common_config.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdbool.h>
  7. #include <inttypes.h>
  8. extern "C" {
  9. #include "log.h"
  10. #include "log_api.h"
  11. #include "rtc.h"
  12. #include "settings_api.h"
  13. }
  14. extern struct ringfs fs_log;
  15. extern struct ringfs fs_ch_arch[];
  16. SbsTerminal sbsTerminal;
  17. Terminal* pTerminal; //Глобальный указатель на терминал
  18. void vTerminal(void *params);
  19. //
  20. SbsTerminal::SbsTerminal() :
  21. Terminal()
  22. {}
  23. //
  24. void SbsTerminal::configure()
  25. {
  26. Terminal::configure();
  27. pTerminal = &sbsTerminal;
  28. m_dataQueue = xQueueCreate(20, 1);
  29. xTaskCreate(vTerminal, "terminal", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  30. }
  31. //
  32. int SbsTerminal::execute(int argc, const char * const *argv)
  33. {
  34. log_entry_t log_entry;
  35. archive_entry_t archive_entry;
  36. if (argc <= 0) {
  37. return -1;
  38. }
  39. if (strcmp(argv[0], "help") == 0) {
  40. return help(argc, argv);
  41. }
  42. if (strcmp(argv[0], "version") == 0) {
  43. return version(argc, argv);
  44. }
  45. if (strcmp(argv[0], "reset") == 0) {
  46. NVIC_SystemReset();
  47. }
  48. // ---------------------------------------------------------------------- //
  49. // Добавить N новых записей в журнал
  50. if (strcmp(argv[0], "add_lentry") == 0) {
  51. if (argc > 1)
  52. log_add_random_entry(0, atoi(argv[1]), 0);
  53. else
  54. printf("No record counter\r\n");
  55. return 0;
  56. }
  57. // Добавить N новых записей в архив
  58. if (strcmp(argv[0], "add_aentry") == 0) {
  59. if (argc > 2)
  60. log_add_random_entry(1, atoi(argv[1]), atoi(argv[2]));
  61. else
  62. printf("No record counter\r\n");
  63. return 0;
  64. }
  65. // Информация о журнале
  66. if (strcmp(argv[0], "linfo") == 0) {
  67. log_info(0, 0);
  68. return 0;
  69. }
  70. // Информация об архиве
  71. if (strcmp(argv[0], "ainfo") == 0) {
  72. if (argc > 1) {
  73. log_info(1, atoi(argv[1]));
  74. }
  75. return 0;
  76. }
  77. // Fetch archive entry
  78. if (strcmp(argv[0], "afetch") == 0) {
  79. test_fetch();
  80. return 0;
  81. }
  82. // Format log FS
  83. if (strcmp(argv[0], "lformat") == 0) {
  84. if (argc > 1) {
  85. log_format(0, 0);
  86. }
  87. return 0;
  88. }
  89. // Format archive FS
  90. if (strcmp(argv[0], "aformat") == 0) {
  91. if (argc > 1) {
  92. log_format(1, atoi(argv[1]));
  93. }
  94. return 0;
  95. }
  96. //
  97. if (strcmp(argv[0], "lget") == 0) {
  98. log_get_log_entry(atoi(argv[1]), &fs_log, &log_entry);
  99. return 0;
  100. }
  101. //
  102. if (strcmp(argv[0], "aget") == 0) {
  103. if (argc > 2)
  104. log_get_archive_entry(atoi(argv[1]), &fs_ch_arch[atoi(argv[2])], &archive_entry);
  105. return 0;
  106. }
  107. //
  108. if (strcmp(argv[0], "lstate") == 0) {
  109. if (argc > 1)
  110. log_log_state(atoi(argv[1]));
  111. return 0;
  112. }
  113. //
  114. if (strcmp(argv[0], "astate") == 0) {
  115. log_archive_state(atoi(argv[1]));
  116. return 0;
  117. }
  118. // ---------------------------------------------------------------------- //
  119. if (strcmp(argv[0], "mstime") == 0) {
  120. TM_RTC_PrintTime();
  121. printf("\r\n%" PRId64 " [ms]\r\n", rtc_get_ms());
  122. return 0;
  123. }
  124. //
  125. if (strcmp(argv[0], "settings") == 0) {
  126. settings_print();
  127. return 0;
  128. }
  129. // ---------------------------------------------------------------------- //
  130. else {
  131. printeol();
  132. printll("Uncknown command [oO]");
  133. return -1;
  134. }
  135. }
  136. void SbsTerminal::sigint() {
  137. }
  138. //Колбэк, который может быть вызван при подключении
  139. void SbsTerminal::connectCallback()
  140. {
  141. clearScreen();
  142. printll("SBS terminal.");
  143. //Тут выводим полезную при подключении информацию
  144. printeol();
  145. printll("For help type 'help'.");
  146. insert('\r');
  147. }
  148. //
  149. int SbsTerminal::help(int argc, const char * const *argv)
  150. {
  151. printeol();
  152. printeol();
  153. printl ("You can use the following commands:");
  154. printl (" version Print software version");
  155. printl (" reset Reset");
  156. printl (" add_lentry Add N log entries");
  157. printl (" add_aentry [entries] [channel] Add N archive entries to channel");
  158. printl (" linfo Print log info");
  159. printl (" ainfo [channel] Print archive info");
  160. printl (" afetch Fetch archive entry");
  161. printl (" lformat Format log partition");
  162. printl (" aformat [channel 0..7] Format archive partition");
  163. printl (" aget [entry index] [channel] Get archive entry");
  164. printl (" lget [entry index] Get log entry");
  165. printl (" lstate log enable/disable");
  166. printl (" astate archive enable/disable");
  167. printl (" mstime gurrnet rtc in ms");
  168. printl (" settings Print settings structure");
  169. printeol();
  170. return 0;
  171. }
  172. //
  173. int SbsTerminal::version(int argc, const char * const *argv)
  174. {
  175. printeol();
  176. print(FW_VERSION);
  177. printeol();
  178. return 0;
  179. }
  180. //
  181. int SbsTerminal::clear(int argc, const char * const *argv)
  182. {
  183. if ((argc > 1) && (strcmp(argv[1], "help") == 0))
  184. {
  185. printeol();
  186. printl("Clear terminal screen");
  187. printeol();
  188. printeol();
  189. return 0;
  190. }
  191. clearScreen();
  192. return 0;
  193. }
  194. //
  195. void SbsTerminal::put_byte(char byte)
  196. {
  197. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  198. xQueueSendFromISR(m_dataQueue, &byte, &xHigherPriorityTaskWoken);
  199. }
  200. //
  201. void vTerminal(void *params)
  202. {
  203. char val;
  204. for (;;)
  205. {
  206. if (xQueueReceive(sbsTerminal.m_dataQueue, &val, 1000 ) == pdPASS)
  207. {
  208. sbsTerminal.insert(val);
  209. }
  210. }
  211. }