This commit is contained in:
cfif 2025-05-26 14:41:45 +03:00
commit ec61abc208
3 changed files with 224 additions and 0 deletions

61
Inc/ComInt.h Normal file
View File

@ -0,0 +1,61 @@
//
// Created by cfif on 04.10.2022.
//
#ifndef XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H
#define XFCTRANSPACKSINGLESERVICERESPONDENTTASK_H
#include <SerialPortIO.h>
#include <XfcProtTable.h>
//#include <DeviceTestsTable.h>
#include <DeviceStorageIni.h>
#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

126
Src/ComInt.c Normal file
View File

@ -0,0 +1,126 @@
//
// Created by cfif on 04.10.2022.
//
#include <stddef.h>
#include <SystemDelayInterface.h>
#include <ComInt.h>
#include <CmsisRtosThreadUtils.h>
#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);
}
}

37
modular.json Normal file
View File

@ -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"
]
}
}