From ffa5cca379ce2d982124d5ccb8560157fac4ac91 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 2 Jun 2025 13:26:40 +0300 Subject: [PATCH] Init --- Inc/ComIntCmd/SerialBridge.h | 47 +++++++++++++++++++++++++++++++ READMY.txt | 16 +++++++++++ Src/ComIntCmd/SerialBridge.c | 11 ++++++++ Src/ComIntCmd/SerialBridgeRead.c | 35 +++++++++++++++++++++++ Src/ComIntCmd/SerialBridgeWrite.c | 29 +++++++++++++++++++ Src/ComIntCmd/SerialBridges.c | 47 +++++++++++++++++++++++++++++++ Src/ComIntCmd/SerilaBridgeTable.c | 20 +++++++++++++ modular.json | 22 +++++++++++++++ 8 files changed, 227 insertions(+) create mode 100644 Inc/ComIntCmd/SerialBridge.h create mode 100644 READMY.txt create mode 100644 Src/ComIntCmd/SerialBridge.c create mode 100644 Src/ComIntCmd/SerialBridgeRead.c create mode 100644 Src/ComIntCmd/SerialBridgeWrite.c create mode 100644 Src/ComIntCmd/SerialBridges.c create mode 100644 Src/ComIntCmd/SerilaBridgeTable.c create mode 100644 modular.json diff --git a/Inc/ComIntCmd/SerialBridge.h b/Inc/ComIntCmd/SerialBridge.h new file mode 100644 index 0000000..da8a607 --- /dev/null +++ b/Inc/ComIntCmd/SerialBridge.h @@ -0,0 +1,47 @@ +// +// Created by xemon on 09.11.22. +// + +#ifndef UVEOS_ON_NATION_SERIALBRIDGE_H +#define UVEOS_ON_NATION_SERIALBRIDGE_H + +#include +#include "XfcProtProcessorUtilDefines.h" +#include "SerialPort.h" + +typedef struct { + char *name; + uint8_t nameLength; + uint8_t flags; + tSerialPortIO *serialIo; +} tSerialBridge; + +typedef struct { + uint16_t count; + uint16_t limit; + tSerialBridge *items; +} tSerialBridges; + + +void SerialBridges_Init(tSerialBridges *env, tSerialBridge *allocatedMem, uint16_t memCountLimit); + +#define SerialBridges_InitStatic(ENV, MEM) SerialBridges_Init(ENV,MEM,sizeof(MEM)/sizeof(tSerialBridge)); + +bool SerialBridges_Add(tSerialBridges *env, char *staticStringName, uint8_t nameLen, tSerialPortIO *io); + +#define SerialBridges_AddStatic(ENV, STR, IO) SerialBridges_Add(ENV,STR,sizeof(STR)-1,IO) + +tSerialBridge *SerialBridges_GetForName(tSerialBridges *table, char *name, uint8_t nameLen); + + +/// +void XfcProtMethodsAdd_SerialBridge(tXfcProtTable *protTab, tSerialBridges *bridges); + +////Methods +uint8_t XfcProtMethod_SerialBridgeTable(tXfcArray *request, tXfcArray *response, tSerialBridges *env); + +uint8_t XfcProtMethod_SerialBridgeReed(tXfcArray *request, tXfcArray *response, tSerialBridges *env); + +uint8_t XfcProtMethod_SerialBridgeWrite(tXfcArray *request, tXfcArray *response, tSerialBridges *env); + +#endif //UVEOS_ON_NATION_SERIALBRIDGE_H diff --git a/READMY.txt b/READMY.txt new file mode 100644 index 0000000..fc7c180 --- /dev/null +++ b/READMY.txt @@ -0,0 +1,16 @@ + +обычный транспортный протокол XfcTransportProtocol: +Прописать в modular.json: + { + "type": "git", + "provider": "ficom_modules", + "repo": "XfcTransportProtocol" + }, + +Расширеный транспортный протокол XfcTransportProtocol_Extended. +Прописать в modular.json: + { + "type": "git", + "provider": "ficom_modules", + "repo": "XfcTransportProtocol_Extended" + }, \ No newline at end of file diff --git a/Src/ComIntCmd/SerialBridge.c b/Src/ComIntCmd/SerialBridge.c new file mode 100644 index 0000000..bd845ec --- /dev/null +++ b/Src/ComIntCmd/SerialBridge.c @@ -0,0 +1,11 @@ +// +// Created by xemon on 10.11.22. +// + +#include "ComIntCmd/SerialBridge.h" + +void XfcProtMethodsAdd_SerialBridge(tXfcProtTable *protTab, tSerialBridges *bridges) { + XfcProtTable_AddStatic(protTab, "SERIAL_BRIDGE_TABLE", XfcProtMethod_SerialBridgeTable, bridges); + XfcProtTable_AddStatic(protTab, "SERIAL_BRIDGE_READ", XfcProtMethod_SerialBridgeReed, bridges); + XfcProtTable_AddStatic(protTab, "SERIAL_BRIDGE_WRITE", XfcProtMethod_SerialBridgeWrite, bridges); +} \ No newline at end of file diff --git a/Src/ComIntCmd/SerialBridgeRead.c b/Src/ComIntCmd/SerialBridgeRead.c new file mode 100644 index 0000000..2ece2b7 --- /dev/null +++ b/Src/ComIntCmd/SerialBridgeRead.c @@ -0,0 +1,35 @@ +// +// Created by xemon on 09.11.22. +// +#include "ComIntCmd/SerialBridge.h" + + +uint8_t XfcProtMethod_SerialBridgeReed(tXfcArray *request, tXfcArray *response, tSerialBridges *env) { + char name[64]; + uint8_t nameLength; + uint16_t blockLimit; + + XFC_CMD_RX_GET_RAW(nameLength); + XFC_CMD_RX_GET_ARR(name, nameLength); + XFC_CMD_RX_GET_RAW(blockLimit); + + + name[nameLength] = '\0'; + tSerialBridge *bridge = SerialBridges_GetForName(env, name, nameLength); + + if (blockLimit > XfcArrayGetSpace(response)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + if (bridge) { + + uint16_t reedBytes = SerialPortReceive(bridge->serialIo, response->data, blockLimit, 10); + if(reedBytes){ + XfcArrayAddLength(response, reedBytes); + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; +} \ No newline at end of file diff --git a/Src/ComIntCmd/SerialBridgeWrite.c b/Src/ComIntCmd/SerialBridgeWrite.c new file mode 100644 index 0000000..8fbe514 --- /dev/null +++ b/Src/ComIntCmd/SerialBridgeWrite.c @@ -0,0 +1,29 @@ +// +// Created by xemon on 09.11.22. +// +#include "ComIntCmd/SerialBridge.h" + +uint8_t XfcProtMethod_SerialBridgeWrite(tXfcArray *request, tXfcArray *response, tSerialBridges *env) { + char name[64]; + uint8_t nameLength; + + XFC_CMD_RX_GET_RAW(nameLength); + XFC_CMD_RX_GET_ARR(name, nameLength); + + name[nameLength] = '\0'; + tSerialBridge *bridge = SerialBridges_GetForName(env, name, nameLength); + + if (bridge) { + uint16_t bytesInRequest = XfcArrayGetDataSize(request); + + uint16_t bytesWriten = SerialPortTransmit( + bridge->serialIo, request->data + request->begin, bytesInRequest, 100 + ); + + if (bytesWriten == bytesInRequest) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; + } + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; +} diff --git a/Src/ComIntCmd/SerialBridges.c b/Src/ComIntCmd/SerialBridges.c new file mode 100644 index 0000000..3384850 --- /dev/null +++ b/Src/ComIntCmd/SerialBridges.c @@ -0,0 +1,47 @@ +// +// Created by xemon on 09.11.22. +// +#include "ComIntCmd/SerialBridge.h" +#include "string.h" + + +void SerialBridges_Init(tSerialBridges *env, tSerialBridge *allocatedMem, uint16_t memCountLimit) { + env->limit = memCountLimit; + env->items = allocatedMem; + env->count = 0; + memset(env->items, 0, env->limit * sizeof(tSerialBridge)); +} + +bool SerialBridges_Add( + tSerialBridges *env, + char *staticStringName, + uint8_t nameLen, + tSerialPortIO *io +) { + if (env->limit <= env->count) { + return false; + } + + tSerialBridge *item = env->items + env->count; + + item->name = staticStringName; + item->nameLength = nameLen; + item->serialIo = io; + + ++env->count; + + return true; +} + +tSerialBridge *SerialBridges_GetForName(tSerialBridges *table, char *name, uint8_t nameLen) { + + for (uint16_t idx = 0; idx < table->count; ++idx) { + tSerialBridge *bridge = table->items + idx; + if (bridge->nameLength == nameLen) { + if (strncmp(bridge->name, name, nameLen) == 0) { + return bridge; + } + } + } + return NULL; +} \ No newline at end of file diff --git a/Src/ComIntCmd/SerilaBridgeTable.c b/Src/ComIntCmd/SerilaBridgeTable.c new file mode 100644 index 0000000..9d509bd --- /dev/null +++ b/Src/ComIntCmd/SerilaBridgeTable.c @@ -0,0 +1,20 @@ +// +// Created by xemon on 09.11.22. +// +#include "ComIntCmd/SerialBridge.h" + +uint8_t XfcProtMethod_SerialBridgeTable(tXfcArray *request, tXfcArray *response, tSerialBridges *table) { + + XFC_CMD_TX_ADD_RAW(table->count); + + uint8_t flagAllowAll = 0xFF; + + for (uint16_t idx = 0; idx < table->count; ++idx) { + XFC_CMD_TX_ADD_RAW(table->items[idx].nameLength); + XFC_CMD_TX_ADD_ARR(table->items[idx].name, table->items[idx].nameLength); + //todo + XFC_CMD_TX_ADD_RAW(flagAllowAll); + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..5f0cd3c --- /dev/null +++ b/modular.json @@ -0,0 +1,22 @@ +{ + "dep": [ + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "XfcTransportProtocol" + }, + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "SerialPort" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file