terminal_sbs.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. }
  13. extern struct ringfs fs_archive;
  14. SbsTerminal sbsTerminal;
  15. Terminal* pTerminal; //Глобальный указатель на терминал
  16. void vTerminal(void *params);
  17. //
  18. SbsTerminal::SbsTerminal() :
  19. Terminal()
  20. {}
  21. //
  22. void SbsTerminal::configure()
  23. {
  24. Terminal::configure();
  25. pTerminal = &sbsTerminal;
  26. m_dataQueue = xQueueCreate(20, 1);
  27. xTaskCreate(vTerminal, "terminal", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  28. }
  29. //
  30. int SbsTerminal::execute(int argc, const char * const *argv)
  31. {
  32. //char str[20];
  33. if (argc <= 0) {
  34. return -1;
  35. }
  36. if (strcmp(argv[0], "help") == 0) {
  37. return help(argc, argv);
  38. }
  39. if (strcmp(argv[0], "version") == 0) {
  40. return version(argc, argv);
  41. }
  42. if (strcmp(argv[0], "reset") == 0) {
  43. NVIC_SystemReset();
  44. }
  45. // ---------------------------------------------------------------------- //
  46. // Добавить N новых записей в журнал
  47. if (strcmp(argv[0], "add_lentry") == 0) {
  48. if (argc > 1)
  49. log_add_random_entry(0, atoi(argv[1]));
  50. else
  51. printf("No record counter\r\n");
  52. return 0;
  53. }
  54. // Добавить N новых записей в архив
  55. if (strcmp(argv[0], "add_aentry") == 0) {
  56. if (argc > 1)
  57. log_add_random_entry(1, atoi(argv[1]));
  58. else
  59. printf("No record counter\r\n");
  60. return 0;
  61. }
  62. // Информация о журнале
  63. if (strcmp(argv[0], "linfo") == 0) {
  64. log_info(0);
  65. return 0;
  66. }
  67. // Информация об архиве
  68. if (strcmp(argv[0], "ainfo") == 0) {
  69. log_info(1);
  70. return 0;
  71. }
  72. // Fetch archive entry
  73. if (strcmp(argv[0], "afetch") == 0) {
  74. test_fetch();
  75. return 0;
  76. }
  77. // Format log FS
  78. if (strcmp(argv[0], "lformat") == 0) {
  79. log_format(0);
  80. return 0;
  81. }
  82. // Format archive FS
  83. if (strcmp(argv[0], "aformat") == 0) {
  84. log_format(1);
  85. return 0;
  86. }
  87. //
  88. if (strcmp(argv[0], "get") == 0) {
  89. archive_entry_t entry;
  90. log_get_entry(atoi(argv[1]), &fs_archive, &entry);
  91. return 0;
  92. }
  93. // ---------------------------------------------------------------------- //
  94. if (strcmp(argv[0], "mstime") == 0) {
  95. printf("\r\n%" PRId64 " [ms]\r\n", rtc_get_ms());
  96. return 0;
  97. }
  98. // ---------------------------------------------------------------------- //
  99. else {
  100. printeol();
  101. printll("Uncknown command [oO]");
  102. return -1;
  103. }
  104. }
  105. void SbsTerminal::sigint() {
  106. }
  107. //Колбэк, который может быть вызван при подключении
  108. void SbsTerminal::connectCallback()
  109. {
  110. clearScreen();
  111. printll("SBS terminal.");
  112. //Тут выводим полезную при подключении информацию
  113. printeol();
  114. printll("For help type 'help'.");
  115. insert('\r');
  116. }
  117. //
  118. int SbsTerminal::help(int argc, const char * const *argv)
  119. {
  120. printeol();
  121. printeol();
  122. printl ("You can use the following commands:");
  123. printl (" version Print software version");
  124. printl (" reset Reset");
  125. printl (" add_lentry Add N log entries");
  126. printl (" add_aentry Add N archive entries");
  127. printl (" linfo Print log info");
  128. printl (" ainfo Print archive info");
  129. printl (" afetch Fetch archive entry");
  130. printl (" aentry Get archive entry [position] [sector] [slot]");
  131. printll(" lformat Format log partition");
  132. printll(" aformat Format archive partition");
  133. printeol();
  134. return 0;
  135. }
  136. //
  137. int SbsTerminal::version(int argc, const char * const *argv)
  138. {
  139. printeol();
  140. print(VERSION);
  141. printeol();
  142. return 0;
  143. }
  144. //
  145. int SbsTerminal::clear(int argc, const char * const *argv)
  146. {
  147. if ((argc > 1) && (strcmp(argv[1], "help") == 0))
  148. {
  149. printeol();
  150. printl("Clear terminal screen");
  151. printeol();
  152. printeol();
  153. return 0;
  154. }
  155. clearScreen();
  156. return 0;
  157. }
  158. //
  159. void SbsTerminal::put_byte(char byte)
  160. {
  161. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  162. xQueueSendFromISR(m_dataQueue, &byte, &xHigherPriorityTaskWoken);
  163. }
  164. //
  165. void vTerminal(void *params)
  166. {
  167. char val;
  168. for (;;)
  169. {
  170. if (xQueueReceive(sbsTerminal.m_dataQueue, &val, 1000 ) == pdPASS)
  171. {
  172. sbsTerminal.insert(val);
  173. }
  174. }
  175. }