// // 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; }