terminal_sbs.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. extern "C" {
  8. #include "log.h"
  9. }
  10. SbsTerminal sbsTerminal;
  11. Terminal* pTerminal; //Глобальный указатель на терминал
  12. void vTerminal(void *params);
  13. //
  14. SbsTerminal::SbsTerminal() :
  15. Terminal()
  16. {}
  17. //
  18. void SbsTerminal::configure()
  19. {
  20. Terminal::configure();
  21. pTerminal = &sbsTerminal;
  22. m_dataQueue = xQueueCreate(20, 1);
  23. xTaskCreate(vTerminal, "terminal", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  24. }
  25. //
  26. int SbsTerminal::execute(int argc, const char * const *argv)
  27. {
  28. //char str[20];
  29. if (argc <= 0) {
  30. return -1;
  31. }
  32. if (strcmp(argv[0], "help") == 0) {
  33. return help(argc, argv);
  34. }
  35. if (strcmp(argv[0], "version") == 0) {
  36. return version(argc, argv);
  37. }
  38. // ---------------------------------------------------------------------- //
  39. // Archive API
  40. // Добавить N новых записей в архив
  41. if (strcmp(argv[0], "add_aentry") == 0) {
  42. if (argc > 1)
  43. test_add_random_archive_entry(atoi(argv[1]));
  44. else
  45. printf("No record counter\r\n");
  46. return 0;
  47. }
  48. // Информация об архиве
  49. if (strcmp(argv[0], "ainfo") == 0) {
  50. test_archive_info();
  51. return 0;
  52. }
  53. // Fetch archive entry
  54. if (strcmp(argv[0], "afetch") == 0) {
  55. test_fetch();
  56. return 0;
  57. }
  58. // Format archive FS
  59. if (strcmp(argv[0], "aformat") == 0) {
  60. test_archive_format();
  61. return 0;
  62. }
  63. // ---------------------------------------------------------------------- //
  64. else {
  65. printeol();
  66. printll("Uncknown command [oO]");
  67. return -1;
  68. }
  69. }
  70. void SbsTerminal::sigint() {
  71. }
  72. //Колбэк, который может быть вызван при подключении
  73. void SbsTerminal::connectCallback()
  74. {
  75. clearScreen();
  76. printll("SBS terminal.");
  77. //Тут выводим полезную при подключении информацию
  78. printeol();
  79. printll("For help type 'help'.");
  80. insert('\r');
  81. }
  82. //
  83. int SbsTerminal::help(int argc, const char * const *argv)
  84. {
  85. printeol();
  86. printeol();
  87. printl ("You can use the following commands:");
  88. printll(" version Print software version");
  89. printeol();
  90. return 0;
  91. }
  92. //
  93. int SbsTerminal::version(int argc, const char * const *argv)
  94. {
  95. printeol();
  96. print(VERSION);
  97. printeol();
  98. return 0;
  99. }
  100. //
  101. int SbsTerminal::clear(int argc, const char * const *argv)
  102. {
  103. if ((argc > 1) && (strcmp(argv[1], "help") == 0))
  104. {
  105. printeol();
  106. printl("Clear terminal screen");
  107. printeol();
  108. printeol();
  109. return 0;
  110. }
  111. clearScreen();
  112. return 0;
  113. }
  114. //
  115. void SbsTerminal::put_byte(char byte)
  116. {
  117. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  118. xQueueSendFromISR(m_dataQueue, &byte, &xHigherPriorityTaskWoken);
  119. }
  120. //
  121. void vTerminal(void *params)
  122. {
  123. char val;
  124. for (;;)
  125. {
  126. if (xQueueReceive(sbsTerminal.m_dataQueue, &val, 1000 ) == pdPASS)
  127. {
  128. sbsTerminal.insert(val);
  129. }
  130. }
  131. }