| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 | #include "terminal_sbs.h"#include "common_config.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>#include <inttypes.h>extern "C" {#include "log.h"#include "log_api.h"#include "rtc.h"#include "settings_api.h"#include "utility.h"}extern struct ringfs fs_log;extern struct ringfs fs_ch_arch[];SbsTerminal sbsTerminal;Terminal* pTerminal; //Глобальный указатель на терминалvoid vTerminal(void *params);//SbsTerminal::SbsTerminal() :    Terminal(){}//void SbsTerminal::configure(){    Terminal::configure();    pTerminal = &sbsTerminal;        m_dataQueue = xQueueCreate(20, 1);    xTaskCreate(vTerminal, "terminal", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);    }//int SbsTerminal::execute(int argc, const char * const *argv){    log_entry_t log_entry;    archive_entry_t archive_entry;      if (argc <= 0) {        return -1;    }    if (strcmp(argv[0], "help") == 0) {        return help(argc, argv);    }    if (strcmp(argv[0], "version") == 0) {        return version(argc, argv);    }    if (strcmp(argv[0], "reset") == 0) {        NVIC_SystemReset();    }    if (strcmp(argv[0], "os") == 0) {        print_os_stat();    }    // ---------------------------------------------------------------------- //    // Добавить N новых записей в журнал    if (strcmp(argv[0], "add_lentry") == 0) {        if (argc > 1)            log_add_random_entry(0, atoi(argv[1]), 0);        else            printf("No record counter\r\n");                return 0;    }    // Добавить N новых записей в архив    if (strcmp(argv[0], "add_aentry") == 0) {        if (argc > 2)            log_add_random_entry(1, atoi(argv[1]), atoi(argv[2]));        else            printf("No record counter\r\n");                return 0;    }    // Информация о журнале    if (strcmp(argv[0], "linfo") == 0) {        log_info(0, 0);        return 0;    }    // Информация об архиве    if (strcmp(argv[0], "ainfo") == 0) {        if (argc > 1) {            log_info(1, atoi(argv[1]));        }        return 0;    }    // Fetch archive entry    if (strcmp(argv[0], "afetch") == 0) {        test_fetch();        return 0;    }    // Format log FS    if (strcmp(argv[0], "lformat") == 0) {        if (argc > 1) {            log_format(0, 0);          }        return 0;    }    // Format archive FS    if (strcmp(argv[0], "aformat") == 0) {        if (argc > 1) {            log_format(1, atoi(argv[1]));          }        return 0;    }    //     if (strcmp(argv[0], "lget") == 0) {        log_get_log_entry(atoi(argv[1]), &fs_log, &log_entry);        return 0;    }    // #if defined (MDIO_88) || (MAI_12)                     if (strcmp(argv[0], "aget") == 0) {        if (argc > 2)            log_get_archive_entry(atoi(argv[1]), &fs_ch_arch[atoi(argv[2])], &archive_entry);        return 0;    }#endif        //    if (strcmp(argv[0], "lstate") == 0) {        if (argc > 1)            log_log_state(atoi(argv[1]));        return 0;    }    //    if (strcmp(argv[0], "astate") == 0) {        if (argc > 1)            log_archive_state(atoi(argv[1]));        return 0;    }    // ---------------------------------------------------------------------- //    if (strcmp(argv[0], "mstime") == 0) {        TM_RTC_PrintTime();        printf("\r\n%" PRId64 " [ms]\r\n", rtc_get_ms());        return 0;    }    //     if (strcmp(argv[0], "settings") == 0) {        settings_print();        return 0;    }    // ---------------------------------------------------------------------- //    else {        printeol();        printll("Uncknown command [oO]");        return -1;    }    }void SbsTerminal::sigint() {}//Колбэк, который может быть вызван при подключенииvoid SbsTerminal::connectCallback() {    clearScreen();    printll("SBS terminal.");      //Тут выводим полезную при подключении информацию    printeol();    printll("For help type 'help'.");    insert('\r');    }    //int SbsTerminal::help(int argc, const char * const *argv){    printeol();    printeol();    printl ("You can use the following commands:");    printl ("  version                          Print software version");    printl ("  reset                            Reset");    printl ("  os                               Print os statistic");    printl ("  add_lentry                       Add N log entries");    printl ("  add_aentry [entries] [channel]   Add N archive entries to channel");    printl ("  linfo                            Print log info");    printl ("  ainfo [channel]                  Print archive info");    printl ("  afetch                           Fetch archive entry");    printl ("  lformat                          Format log partition");    printl ("  aformat [channel 0..7]           Format archive partition");    printl ("  aget [entry index] [channel]     Get archive entry");    printl ("  lget [entry index]               Get log entry");    printl ("  lstate                           log enable/disable");    printl ("  astate                           archive enable/disable");    printl ("  mstime                           gurrnet rtc in ms");    printl ("  settings                         Print settings structure");        printeol();    return 0;}//int SbsTerminal::version(int argc, const char * const *argv) {    printeol();    print(FW_VERSION);    printeol();    return 0;}//int SbsTerminal::clear(int argc, const char * const *argv){    if ((argc > 1) && (strcmp(argv[1], "help") == 0))      {        printeol();        printl("Clear terminal screen");              printeol();        printeol();        return 0;    }    clearScreen();    return 0;}//void SbsTerminal::put_byte(char byte){    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;    xQueueSendFromISR(m_dataQueue, &byte, &xHigherPriorityTaskWoken);}//void vTerminal(void *params){    char val;        for (;;)    {        if (xQueueReceive(sbsTerminal.m_dataQueue, &val, 1000 ) == pdPASS)        {            sbsTerminal.insert(val);        }    }  }
 |