ComIntCmd_Vars/Src/ComIntCmd/VarsSet.c

81 lines
3.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by cfif on 04.10.2022.
//
#include "ComIntCmd/Vars.h"
#include <BaseTypes.h>
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;
}