From a9e21d2036754118e86eab882616edd8e96ce6f6 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 30 Sep 2025 15:52:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D1=8B=20=D0=B8=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/ComInt.h | 65 +++++++++++++++++++++++ Src/ComInt.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++ modular.json | 32 ++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 Inc/ComInt.h create mode 100644 Src/ComInt.c create mode 100644 modular.json diff --git a/Inc/ComInt.h b/Inc/ComInt.h new file mode 100644 index 0000000..51d42ce --- /dev/null +++ b/Inc/ComInt.h @@ -0,0 +1,65 @@ +// +// Created by ilya on 04.10.23. +// + +#ifndef ERA_ELEMENT_2_COMINT_H +#define ERA_ELEMENT_2_COMINT_H + +#include +#include +//#include +//#include +#include "XfcProtRespondent.h" +#include "ComIntCmd/Mandatory.h" +#include "ComIntCmd/SerialBridge.h" +#include "VersionsInfoTable.h" +#include "VariablesTable.h" +#include "cmsis_os2.h" +#include "FreeRTOS.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, + tVariablesTable *varsTab, + tSerialPortIO *gsmIo, + tSerialPortIO *gnssIo, + tSerialPortIO *cliIo, + tStringLink *currentModeName +); + +void ComInt_StartThread(tComInt *env); + + +#endif //ERA_ELEMENT_2_COMINT_H diff --git a/Src/ComInt.c b/Src/ComInt.c new file mode 100644 index 0000000..81ccf46 --- /dev/null +++ b/Src/ComInt.c @@ -0,0 +1,145 @@ +// +// Created by ilya on 04.10.23. +// +#include +#include +#include +#include +#include "SerialPort.h" +//#include "ComIntCmd/Vars.h" +//#include "ComIntCmd/Tests.h" +#include "ComIntCmd/VersionsInfo.h" +#include "FirmwareMetadataSection.h" +#include "ComIntCmd/Vars.h" +#include "stdlib.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, tSerialPortIO *gnssIo) { + SerialBridges_InitStatic(&env->serialBridges, env->memAlloc.serialBridge); + SerialBridges_AddStatic(&env->serialBridges, "AT_GSM", gsmIo); + SerialBridges_AddStatic(&env->serialBridges, "CLI", cliIo); +// SerialBridges_AddStatic(&env->serialBridges, "GNSS", gnssIo); + +} + +void ComInt_Init( + tComInt *env, + tSerialPortIO *io, + tVariablesTable *varsTab, + tSerialPortIO *gsmIo, + tSerialPortIO *gnssIo, + tSerialPortIO *cliIo, + tStringLink *currentModeName +) { + + + char strTmp[16]; + utoa(123, strTmp, 10); + env->sn.length = strlen(strTmp); + memcpy(env->sn.data, strTmp, env->sn.length); + + ComIntInitRoot(env, io); + ComIntInitPing(env, &env->sn, currentModeName); + ComIntInitVersions(env, &env->sn); + + if (gsmIo != NULL) + ComIntInitSerialBridges(env, gsmIo, cliIo, gnssIo); + + //Добавляем обработчики комманд + 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 (varsTab) { + XfcProtMethodsAdd_Vars(&env->table, varsTab); + } + + if ((gsmIo != NULL) || (gnssIo != 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..b5977a2 --- /dev/null +++ b/modular.json @@ -0,0 +1,32 @@ +{ + "dep": [ + { + "type": "git", + "provider": "HVAC_M7", + "repo": "BaseTypes" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "ComIntCmd_Mandatory" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "ComIntCmd_SerialBridge" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "ComIntCmd_VersionsInfo" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file