151 lines
5.2 KiB
C
151 lines
5.2 KiB
C
//
|
||
// 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 = (uint32_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;
|
||
} |