146 lines
4.3 KiB
C
146 lines
4.3 KiB
C
//
|
||
// 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;
|
||
} |