81 lines
3.1 KiB
C
81 lines
3.1 KiB
C
//
|
||
// 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;
|
||
} |