commit ec61abc208635e5eccc2c222f1752a426d00ffc7 Author: cfif Date: Mon May 26 14:41:45 2025 +0300 Init diff --git a/Inc/ComInt.h b/Inc/ComInt.h new file mode 100644 index 0000000..ae0c48b --- /dev/null +++ b/Inc/ComInt.h @@ -0,0 +1,61 @@ +// +// 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" + +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; + struct { + tStringStatic board; + tStringStatic serialNumber; + tStringStatic firmware; + tStringStatic gsm; + } versions; + + tComIntPing ping; + tString16 sn; + + struct { + osThreadId_t id; + uint32_t stack[2048]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; +} tComInt; + +void ComInt_Init( + tComInt *env, + tSerialPortIO *io, +// tDeviceStorage *store, +// tDeviceTestsTable *tests, + tSerialPortIO *gsmIo, + tSerialPortIO *cliIo, + tStringLink *currentModeName +); + +void ComInt_StartThread(tComInt *env); + +#endif //XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H diff --git a/Src/ComInt.c b/Src/ComInt.c new file mode 100644 index 0000000..3513190 --- /dev/null +++ b/Src/ComInt.c @@ -0,0 +1,126 @@ +// +// 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 "FirmwareMetadataSection.h" + +static void ComInt_LoadMetadata(tComInt *env) { + env->versions.firmware = (tStringStatic) {.data = (char *) (META_FW_NAME), .length = META_FW_NAME_SIZE}; + env->versions.board = (tStringStatic) {.data = (char *) (META_HW_NAME), .length = META_HW_NAME_SIZE}; +}; + +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 *cliIo) { + SerialBridges_InitStatic(&env->serialBridges, env->memAlloc.serialBridge); + SerialBridges_AddStatic(&env->serialBridges, "AT_GSM", gsmIo); + SerialBridges_AddStatic(&env->serialBridges, "CLI", cliIo); +} + +void ComInt_Init( + tComInt *env, + tSerialPortIO *io, +// tDeviceStorage *store, + // tDeviceTestsTable *tests, + tSerialPortIO *gsmIo, + tSerialPortIO *cliIo, + tStringLink *currentModeName +) { + String16CopyStatic(&env->sn,"000"); + ComIntInitRoot(env, io); + ComIntInitPing(env, &env->sn, currentModeName); +// ComIntInitVersions(env, &store->nvm.device.serialNumber.value); + + + if (gsmIo != NULL) + ComIntInitSerialBridges(env, gsmIo, cliIo); + + //Добавляем обработчики комманд + XfcProtMethodsAdd_Mandatory(&env->table, &env->ping, &env->table); +// XfcProtMethodsAdd_VersionsInfo(&env->table, &env->versionsTable); +// XfcProtMethodsAdd_Vars(&env->table, &store->publicVariablesTable); + //XfcProtMethodsAdd_Tests(&env->table, tests); + + if (gsmIo != NULL) + 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, 1000)) { + + 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..18c77dd --- /dev/null +++ b/modular.json @@ -0,0 +1,37 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "XfcTransportProtocol" + }, + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "BaseTypes" + }, + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "ComIntCmd_Mandatory" + }, + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "ComIntCmd_SerialBridge" + }, + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "ComIntCmd_VersionsInfo" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file