commit baeb4aa0bca83c4db8ee66dbffddeb2bae8115ff Author: cfif Date: Tue Sep 30 15:52:33 2025 +0300 Добавлены интерфейсы и драйверы diff --git a/Inc/ComIntCmd/Vars.h b/Inc/ComIntCmd/Vars.h new file mode 100644 index 0000000..d9b1e29 --- /dev/null +++ b/Inc/ComIntCmd/Vars.h @@ -0,0 +1,20 @@ +// +// Created by xemon on 10.11.22. +// + +#ifndef UVEOS_ON_NATION_VARIABLES_H +#define UVEOS_ON_NATION_VARIABLES_H + +#include +#include "XfcProtProcessorUtilDefines.h" + + +void XfcProtMethodsAdd_Vars(tXfcProtTable *protTab, tVariablesTable *varsTab); + +uint8_t XfcProtMethod_VarsTable(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab); + +uint8_t XfcProtMethod_VarsGet(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab); + +uint8_t XfcProtMethod_VarsSet(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab); + +#endif //UVEOS_ON_NATION_VARIABLES_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/Vars.c b/Src/ComIntCmd/Vars.c new file mode 100644 index 0000000..d742d05 --- /dev/null +++ b/Src/ComIntCmd/Vars.c @@ -0,0 +1,11 @@ +// +// Created by xemon on 10.11.22. +// + +#include "ComIntCmd/Vars.h" + +void XfcProtMethodsAdd_Vars(tXfcProtTable *protTab, tVariablesTable *varsTab) { + XfcProtTable_AddStatic(protTab, "VARS_TABLE", XfcProtMethod_VarsTable, varsTab); + XfcProtTable_AddStatic(protTab, "GET_VARS", XfcProtMethod_VarsGet, varsTab); + XfcProtTable_AddStatic(protTab, "SET_VARS", XfcProtMethod_VarsSet, varsTab); +} \ No newline at end of file diff --git a/Src/ComIntCmd/VarsGet.c b/Src/ComIntCmd/VarsGet.c new file mode 100644 index 0000000..15ccaaf --- /dev/null +++ b/Src/ComIntCmd/VarsGet.c @@ -0,0 +1,99 @@ +// +// Created by cfif on 04.10.2022. +// +#include "ComIntCmd/Vars.h" +#include +#include + +uint8_t XfcProtMethod_VarsGetVar(tXfcArray *request, tXfcArray *response, tVariableDescriptor *var) { + + // id параметра + //XFC_CMD_TX_ADD_RAW(id); + // Текстовый вид ID + XFC_CMD_TX_ADD_RAW(var->name.length); + XFC_CMD_TX_ADD_ARR(var->name.str, var->name.length); + +// if (varsTab->items[id].typeId == VARIABLE_TYPE_STRING) { +// tString128 *str = (tString128 *) varsTab->items[id].addr; +// // Длина строки +// XFC_CMD_TX_ADD_RAW( varsTab->items[id]); +// // Строка +// XFC_CMD_TX_ADD_ARR(str->data, str->length); +// } else { +// +// +// } +// uint16_t typeLen16 = variablesTypeLength[varsTab->items[id].typeId]; + + uint8_t len = VariablesTable_GetVarLength(var); + + // Размер данных + XFC_CMD_TX_ADD_RAW(len); + // Данные + XFC_CMD_TX_ADD_ARR(var->addr, len); + + return true; +} + +uint8_t XfcProtMethod_VarsGet(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab) { + + // Чтение всех параметров + if (XfcArrayGetDataSize(request) == 0) { + + // Количество параметров + XFC_CMD_TX_ADD_RAW(varsTab->count); + + for (uint16_t id = 0; id < varsTab->count; ++id) { + if (!XfcProtMethod_VarsGetVar(request, response, varsTab->items + id)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; + } + + // Чтение избранных параметров + uint16_t paramCount; + XFC_CMD_RX_GET_RAW(paramCount); + + // Количество параметров + XFC_CMD_TX_ADD_RAW(paramCount); + + for (uint16_t count = 0; count < paramCount; ++count) { + // id параметра + //XFC_CMD_RX_GET_RAW(paramValueID); + + // Получение текстового id параметра + uint8_t paramValueID_len; + XFC_CMD_RX_GET_RAW(paramValueID_len); + char paramValueID_text[paramValueID_len]; + XFC_CMD_RX_GET_ARR(paramValueID_text, paramValueID_len); + + tVariableDescriptor *var = VariablesTable_GetByName(varsTab, paramValueID_text, paramValueID_len); + + if (!var) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + if (!XfcProtMethod_VarsGetVar(request, response, var)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + +// if (varsTab->items[paramValueID].typeId == VARIABLE_TYPE_STRING) { +// tString *str = (tString *) varsTab->items[paramValueID].addr; +// XFC_CMD_TX_ADD_RAW(str->length); +// XFC_CMD_TX_ADD_ARR(str->str, str->length); +// } else { +// uint16_t len = variablesTypeLength[varsTab->items[paramValueID].typeId]; +// uint8_t typeLen8 = len; +// +// // Размер данных +// XFC_CMD_TX_ADD_RAW(typeLen8); +// // Считывание данных по адресу в буфер на передачу +// XFC_CMD_TX_ADD_ARR(varsTab->items[paramValueID].addr, len); +// } + + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; +} diff --git a/Src/ComIntCmd/VarsSet.c b/Src/ComIntCmd/VarsSet.c new file mode 100644 index 0000000..1903827 --- /dev/null +++ b/Src/ComIntCmd/VarsSet.c @@ -0,0 +1,81 @@ +// +// Created by cfif on 04.10.2022. +// + +#include "ComIntCmd/Vars.h" +#include + + +static uint8_t XfcProtMethod_VarsSetChange(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab) { + // Запись избранных параметров + uint16_t paramCount = 0; + uint8_t paramValueID_len = 0; + uint8_t paramValueID_text[64]; + + XFC_CMD_RX_GET_RAW(paramCount); + + if (!paramCount) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; + } + + for (uint16_t count = 0; count < paramCount; ++count) { + + + // Получение текстового id параметра + XFC_CMD_RX_GET_RAW(paramValueID_len); + XFC_CMD_RX_GET_ARR(paramValueID_text, paramValueID_len); + + + //достаем переменную из таблицы + tVariableDescriptor *var = VariablesTable_GetByName(varsTab, (char *) paramValueID_text, paramValueID_len); + + + //проверяем есть ли она (если по названию ее найти не удалось, то ее не будет) + if (!var) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + //проверяем можно ли ее еще писать (если есть счетчик разрешения записи то не пустой ли он) + if (!VariablesTable_IsVariableChangeAllowed(var)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + //получаем размер для типа данных переменно, если размер типа равен 0 то размер не статичен + uint8_t typeLen = VariablesTable_GetVarTypeLength(var); + + uint8_t dataLen; + XFC_CMD_RX_GET_RAW(dataLen); + + //проверяем совпадает ли размер типа данных(если он есть) с переданным от клината размером + if (typeLen && (typeLen != dataLen)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + //собственно, получаем dataLen байт переменной + XFC_CMD_RX_GET_ARR(var->addr, dataLen); + if (var->len) { + *(uint8_t *) var->len = dataLen; + } + + //и самое главное сообщаем что переменная была изменена иначе будет неизветно что и где нужно обновить + VariablesTable_VariableChanged(varsTab, var); + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; +} + + +uint8_t XfcProtMethod_VarsSet(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab) { + + //запрашиваем доступ на изменение настроек + if (!VariablesTable_RequireChange(varsTab, 10)) { + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; + } + + uint8_t result = XfcProtMethod_VarsSetChange(request, response, varsTab); + + //осовбождаем доступ к измененению настроек + VariablesTable_ReleaseChange(varsTab); + + return result; +} \ No newline at end of file diff --git a/Src/ComIntCmd/VarsTable.c b/Src/ComIntCmd/VarsTable.c new file mode 100644 index 0000000..c1c6afd --- /dev/null +++ b/Src/ComIntCmd/VarsTable.c @@ -0,0 +1,28 @@ +// +// Created by cfif on 04.10.2022. +// + +#include "ComIntCmd/Vars.h" + +uint8_t XfcProtMethod_VarsTable(tXfcArray *request, tXfcArray *response, tVariablesTable *varsTab) { + + XFC_CMD_TX_ADD_RAW(varsTab->count); + + for (uint16_t count = 0; count < varsTab->count; ++count) { + + XFC_CMD_TX_ADD_RAW(varsTab->items[count].name.length); + XFC_CMD_TX_ADD_ARR(varsTab->items[count].name.str, + varsTab->items[count].name.length); + + // Описание переменной + uint8_t zero = 0; + XFC_CMD_TX_ADD_RAW(zero); + + // Тип переменной + uint16_t type = varsTab->items[count].typeId; + XFC_CMD_TX_ADD_RAW(type); + + } + + return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..ca28608 --- /dev/null +++ b/modular.json @@ -0,0 +1,27 @@ +{ + "dep": [ + { + "type": "git", + "provider": "HVAC_M7", + "repo": "XfcTransportProtocol" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "BaseTypes" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "VariablesTable" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file