commit 77120c89df002e3a094b38a3613e4edf654abf89 Author: cfif Date: Wed Dec 4 13:10:48 2024 +0300 Init diff --git a/Inc/ComInt.h b/Inc/ComInt.h new file mode 100644 index 0000000..901e71c --- /dev/null +++ b/Inc/ComInt.h @@ -0,0 +1,66 @@ +// +// Created by cfif on 04.10.2022. +// + +#ifndef XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H +#define XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H + +#include +#include +#include +#include +#include "XfcProtRespondent.h" +#include "ComIntCmd/Mandatory.h" +#include "ComIntCmd/SerialBridge.h" +#include "VersionsInfoTable.h" +#include "ComIntCmd/AccelCalibration.h" + +typedef struct { + tSerialPortIO *io; + struct { + tXfcProtProcessor table[16]; + uint8_t rxArr[256]; + uint8_t txArr[2048]; + tSerialBridge serialBridge[8]; + tVersionPair versions[3]; + } memAlloc; + + tXfcProtTable table; + tXfcProtRespondent service; + tSerialBridges serialBridges; + tVersionsInfoTable versionsTable; + tAccelCalibData accelCalibData; + + struct { + tStringStatic board; + tStringStatic serialNumber; + tStringStatic firmware; + tStringStatic gsm; + } versions; + + tComIntPing ping; + + struct { + osThreadId_t id; + uint32_t stack[2048]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; +} tComInt; + +void ComInt_Init( + tComInt *env, + tSerialPortIO *io, + tString16 *deviceId, + tVariablesTable *varsTab, + tDeviceTestsTable *tests, + tSerialPortIO *gsmIo, + tSerialPortIO *cliIo, + tSerialPortIO *gnssIo, + tStringLink *currentModeName, + tCarFlipDetection *flipDetect +); + +void ComInt_StartThread(tComInt *env); + +#endif //XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H diff --git a/Src/ComInt.c b/Src/ComInt.c new file mode 100644 index 0000000..252bd1e --- /dev/null +++ b/Src/ComInt.c @@ -0,0 +1,139 @@ +// +// Created by cfif on 04.10.2022. +// + +#include +#include +#include +#include +#include "SerialPort.h" +#include "ComIntCmd/Vars.h" +#include "ComIntCmd/Tests.h" +#include "ComIntCmd/VersionsInfo.h" +#include "ComIntCmd/AccelCalibration.h" + +static void ComInt_LoadMetadata(tComInt *env) { + env->versions.firmware = StringStaticInit("1.1.0"); + + env->versions.board = (tStringStatic) { + .data = (char *) (HARDWARE_REVISION), + .length = sizeof(HARDWARE_REVISION) - 1 + }; +}; + +static void ComIntInitRoot(tComInt *env, tSerialPortIO *io) { + env->io = io; + XfcProtTable_InitStatic(&env->table, env->memAlloc.table); + tXfcArray rxArr; + tXfcArray txArr; + XfcArrayInitStatic(&rxArr, env->memAlloc.rxArr); + XfcArrayInitStatic(&txArr, env->memAlloc.txArr); + XfcProtRespondent_Init(&env->service, NULL, &env->table, rxArr, txArr, XFC_STD_MAGIC_NUMBERS); + ComInt_LoadMetadata(env); +} + +static void ComIntInitPing(tComInt *env, tString16 *deviceId, tStringLink *currentModeName) { + env->ping.device = String16GetLink(deviceId); + env->ping.board = StringStaticGetLink(&env->versions.board); + env->ping.mode = currentModeName; +} + +static void ComIntInitVersions(tComInt *env, tString16 *deviceId) { + + VersionsInfoTable_InitStatic(&env->versionsTable, env->memAlloc.versions); + + VersionsInfoTable_AddStatic( + &env->versionsTable, "DEVICE_ID", String16GetLink(deviceId) + ); + VersionsInfoTable_AddStatic( + &env->versionsTable, "FIRMWARE", StringStaticGetLink(&env->versions.firmware) + ); + VersionsInfoTable_AddStatic( + &env->versionsTable, "BOARD", StringStaticGetLink(&env->versions.board) + ); +} + +static void ComIntInitSerialBridges( + tComInt *env, + tSerialPortIO *gsmIo, + tSerialPortIO *gnssIo, + tSerialPortIO *cliIo +) { + SerialBridges_InitStatic(&env->serialBridges, env->memAlloc.serialBridge); + if (gnssIo)SerialBridges_AddStatic(&env->serialBridges, "GNSS", gnssIo); + if (gsmIo)SerialBridges_AddStatic(&env->serialBridges, "AT_GSM", gsmIo); + if (cliIo)SerialBridges_AddStatic(&env->serialBridges, "CLI", cliIo); +} + +void ComInt_Init( + tComInt *env, + tSerialPortIO *io, + tString16 *deviceId, + tVariablesTable *varsTab, + tDeviceTestsTable *tests, + tSerialPortIO *gsmIo, + tSerialPortIO *cliIo, + tSerialPortIO *gnssIo, + tStringLink *currentModeName, + tCarFlipDetection *carFlipDetection +) { + ComIntInitRoot(env, io); + ComIntInitPing(env, deviceId, currentModeName); + ComIntInitVersions(env, deviceId); + ComIntInitSerialBridges(env, gsmIo, gnssIo, cliIo); + XfcProtMethodsInit_AccelCalibration(&env->accelCalibData, carFlipDetection, varsTab); + + //Добавляем обработчики комманд + XfcProtMethodsAdd_Mandatory(&env->table, &env->ping, &env->table); + XfcProtMethodsAdd_VersionsInfo(&env->table, &env->versionsTable); + XfcProtMethodsAdd_AccelCalibration(&env->table,&env->accelCalibData); + + if (varsTab) { + XfcProtMethodsAdd_Vars(&env->table, varsTab); + } + + XfcProtMethodsAdd_Tests(&env->table, tests); + XfcProtMethodsAdd_SerialBridge(&env->table, &env->serialBridges); + + //Инициализируем поток + InitThreadAtrStatic(&env->thread.attr, "ComInt", env->thread.controlBlock, env->thread.stack, osPriorityNormal); + env->thread.id = 0; +} + + +static _Noreturn void ComInt_Thread(tComInt *env) { + + for (;;) { + uint8_t byte; + + if (SerialPortReceive(env->io, &byte, 1, SystemWaitForever)) { + + XfcProtRespondent_AddBytes(&env->service, &byte, 1); + + while (XfcArrayGetDataSize(env->service.requestDecoder.buffer)) { + + if (XfcProtRespondent_Step(&env->service)) { + + SerialPortTransmit( + env->io, + env->service.responseEncoder.buffer->data, + XfcArrayGetDataSize(env->service.responseEncoder.buffer), + 1000 + ); + + XfcProtRespondent_SkipCurrentRequest(&env->service); + } else { + break; + } + } + } + } +} + +void ComInt_StartThread(tComInt *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (ComInt_Thread), (void *) (env), &env->thread.attr); + } else { + osThreadResume(env->thread.id); + } +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..d18f5f8 --- /dev/null +++ b/modular.json @@ -0,0 +1,47 @@ +{ + "dep": [ + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "XfcTransportProtocol" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "BaseTypes" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ComIntCmd_Mandatory" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ComIntCmd_SerialBridge" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ComIntCmd_Vars" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ComIntCmd_Tests" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ComIntCmd_VersionsInfo" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file