CliCmd_Vars/Src/CliCmd/SetVar.c

151 lines
5.2 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 zemon on 16.11.22.
//
#include "CliCmd/Vars.h"
#include "freertos_os2.h"
#include <stdlib.h>
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;
}
uint8_t testIsWriteData(tVariableDescriptor *descriptor, tVariablesTable *extTable) {
//проверяем можно ли ее писать (если есть счетчик разрешения записи то не пустой ли он)
if (VariablesTable_IsVariableChangeAllowed(descriptor)) {
//запрашиваем доступ на изменение настроек
if (VariablesTable_RequireChange(extTable, 10)) {
return 0;
} else {
return 2;
}
} else {
return 1;
}
}
void saveChenge(tCliCmd *cli, tVariableDescriptor *descriptor, tVariablesTable *extTable) {
VariablesTable_VariableChanged(extTable, descriptor);
VariablesTable_ReleaseChange(extTable);
}
int32_t vSetVarTableSetting(tVariablesTable *extTable, tCliCmd *cli) {
char *paramVale = "";
for (uint16_t id = 0; id < extTable->count; ++id) {
if (CliCmd_RxStartsWith(
cli,
extTable->items[id].name.str,
extTable->items[id].name.length
)
) {
CliCmd_RxSkip(cli, extTable->items[id].name.length);
CliCmd_RxSkipSpace(cli);
paramVale = cli->rxLine.begin;
tVariableDescriptor *descriptor = extTable->items + id;
switch (testIsWriteData(descriptor, extTable)) {
case 0: {
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(paramVale);
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_UINT16: {
uint16_t data;
if (charToInt16(&data, paramVale, strlen(paramVale))) {
memcpy(descriptor->addr, &data, sizeof(data));
} else {
CliCmd_PrintLnStatic(cli, "CONVERSATION FAILED, FORMAT DATA ERROR");
}
}
break;
case VARIABLE_TYPE_INT32: {
uint32_t data = (uint8_t) atoi(paramVale);
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_BOOL: {
uint8_t data;
if ((strstr(paramVale, "TRUE")) || (strstr(paramVale, "1"))) {
data = 1;
}
if ((strstr(paramVale, "FALSE")) || (strstr(paramVale, "0"))) {
data = 0;
}
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
case VARIABLE_TYPE_FLOAT32: {
float data = atof(paramVale);
memcpy(descriptor->addr, &data, sizeof(data));
}
break;
default:
CliCmd_PrintStatic(cli, "Unidentified error!");
}
CliCmd_PrintLnStatic(cli, "Save setting? (Yes/No)");
CliCmd_WaitLine(cli);
if (CliCmd_RxStartsWithStatic(cli, "Yes")) {
saveChenge(cli, descriptor, extTable);
CliCmd_PrintLnStatic(cli, "Setting is success full");
}
break;
}
case 1: {
CliCmd_PrintLnStatic(cli, "Access deniedted");
break;
}
case 2: {
CliCmd_PrintLnStatic(cli, "Temporarily unavailable ");
//осовбождаем доступ к измененению настроек
VariablesTable_ReleaseChange(extTable);
break;
}
default:
CliCmd_PrintStatic(cli, "Unidentified error!");
}
}
}
return 0;
}