CliCmd_Vars/Src/CliCmd/VarsSet.c

146 lines
4.3 KiB
C
Raw 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 zemon on 16.11.22.
//
#include "CliCmd/Vars.h"
#include "freertos_os2.h"
#include <stdlib.h>
static uint8_t charToInt16(uint16_t *val, const char *source, uint8_t len) {
unsigned long R = 0;
uint16_t readed;
uint8_t ret = 0, bad = 0, i = 0;
while (i < len) {
if (source[i] < '0' || source[i] > '9') break;
ret = 1;
R = R * 10L + source[i] - '0';
if (R > 0xffff) {
R = 0;
bad = 1;
}
i++;
}
if (bad || !ret) return 0;
readed = (uint16_t) R;
*val = readed;
return 1;
}
static bool CliCmd_Vars_setDesk(tVariableDescriptor *descriptor, tCliCmd *cli) {
switch (descriptor->typeId) {
case VARIABLE_TYPE_STRING: {
uint8_t len = (CliCmd_RxLineLength(cli)) - 2;
memcpy(descriptor->addr, CliCmd_RxLineBegin(cli), len);
*((uint8_t *) descriptor->len) = len;
}
break;
case VARIABLE_TYPE_UINT8: {
uint8_t data = (uint8_t) atoi(CliCmd_RxLineBegin(cli));
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_UINT16: {
uint16_t data;
if (charToInt16(&data, CliCmd_RxLineBegin(cli), strlen(CliCmd_RxLineBegin(cli)))) {
memcpy(descriptor->addr, &data, sizeof(data));
} else {
CliCmd_PrintLnStatic(cli, "CONVERSATION FAILED, FORMAT DATA ERROR");
}
}
break;
case VARIABLE_TYPE_UINT32: {
uint32_t data = (uint32_t) atoi(CliCmd_RxLineBegin(cli));
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_INT32: {
int32_t data = (int32_t) atoi(CliCmd_RxLineBegin(cli));
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_BOOL: {
uint8_t data;
if ((strstr(CliCmd_RxLineBegin(cli), "TRUE")) || (strstr(CliCmd_RxLineBegin(cli), "1"))) {
data = 1;
}
if ((strstr(CliCmd_RxLineBegin(cli), "FALSE")) || (strstr(CliCmd_RxLineBegin(cli), "0"))) {
data = 0;
}
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_FLOAT32: {
float data = atof(CliCmd_RxLineBegin(cli));
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_ARR_U8_STATIC: {
uint8_t len = (uint32_t) descriptor->len;
uint8_t *item = (uint8_t *) descriptor->addr;
uint8_t *end = item + len;
for (; item < end; ++item) {
*item = (uint8_t) atoi(CliCmd_RxLineBegin(cli));
CliCmd_RxSkipToNextWord(cli);
}
}
break;
default:
return false;
}
return true;
}
int32_t CliCmd_Vars_setVariable(tVariablesTable *extTable, tCliCmd *cli) {
tVariableDescriptor *desc = VariablesTable_GetByName(
extTable,
CliCmd_RxLineBegin(cli),
CliCmd_RxFirstWordLen(cli)
);
if (!desc) {
CliCmd_PrintLnStatic(cli, "no var with this name");
return 0;
}
//проверяем можно ли ее писать (если есть счетчик разрешения записи то не пустой ли он)
if (!VariablesTable_IsVariableChangeAllowed(desc)) {
CliCmd_PrintLnStatic(cli, "access deniedted");
return 0;
}
CliCmd_RxSkipToNextWord(cli);
//запрашиваем доступ на изменение настроек
if (!VariablesTable_RequireChange(extTable, 10)) {
CliCmd_PrintLnStatic(cli, "temporarily unavailable ");
return 0;
}
bool changeResult = CliCmd_Vars_setDesk(desc, cli);
//сообщаем об изменении
VariablesTable_VariableChanged(extTable, desc);
//и обязательно закрываем сессию редактирования(возвращаем mutex)
VariablesTable_ReleaseChange(extTable);
if (changeResult) {
CliCmd_PrintStatic(cli, "changes ok: ");
} else {
CliCmd_PrintStatic(cli, "error, value: ");
}
CliCmd_Vars_printDesk(desc, cli);
CliCmd_PrintLnStatic(cli, "");
return 0;
}