This commit is contained in:
cfif 2025-06-02 13:26:41 +03:00
commit 5987a72c79
8 changed files with 511 additions and 0 deletions

19
Inc/CliCmd/Vars.h Normal file
View File

@ -0,0 +1,19 @@
//
// Created by zemon on 17.11.22.
//
#ifndef UVEOS_ON_NATION_CLIVARS_H
#define UVEOS_ON_NATION_CLIVARS_H
#include "CliCmd.h"
#include "VariablesTable.h"
int32_t vGetVarsTableSetting(tVariablesTable *extTable, tCliCmd *cli);
int32_t vSetVarTableSetting(tVariablesTable *extTable, tCliCmd *cli);
int32_t CliCmd_VarsHelp(tCliCmd *cli);
int32_t CliCmd_ChangeListVar(tVariablesTable *varTable, tCliCmd *cli);
#endif //UVEOS_ON_NATION_CLIVARS_H

43
Src/CliCmd/GetVars.c Normal file
View File

@ -0,0 +1,43 @@
//
// Created by zemon on 15.11.22.
//
#include "CliCmd/Vars.h"
#include "stream.h"
int32_t vGetVarsTableSetting(tVariablesTable *extTable, tCliCmd *cli) {
for (uint16_t id = 0; id < extTable->count; ++id) {
CliCmd_Print(cli, extTable->items[id].name.str, extTable->items[id].name.length);
CliCmd_PrintStatic(cli, " ");
tVariableDescriptor *descriptor = extTable->items + id;
if (descriptor->typeId == VARIABLE_TYPE_STRING) {
CliCmd_Print(cli, descriptor->addr, *(uint8_t *) descriptor->len);
} else {
if (extTable->items[id].typeId == VARIABLE_TYPE_UINT8) {
debug_printf(cli->serialCommandPort, "%u", *(uint8_t *) extTable->items[id].addr);
}
if (extTable->items[id].typeId == VARIABLE_TYPE_UINT16) {
debug_printf(cli->serialCommandPort, "%u", *(uint16_t *) extTable->items[id].addr);
}
if (extTable->items[id].typeId == VARIABLE_TYPE_UINT32) {
debug_printf(cli->serialCommandPort, "%u", *(uint8_t *) extTable->items[id].addr);
}
if (extTable->items[id].typeId == VARIABLE_TYPE_BOOL) {
debug_printf(cli->serialCommandPort, "%u", *(uint8_t *) extTable->items[id].addr);
}
if (extTable->items[id].typeId == VARIABLE_TYPE_FLOAT32) {
debug_printf(cli->serialCommandPort, "%f", *(float *) extTable->items[id].addr);
}
if (!VariablesTable_IsVariableChangeAllowed(descriptor)) {
CliCmd_PrintStatic(cli, " === CHANGE NOT ACCESS ===");
}
}
CliCmd_PrintLnStatic(cli, "");
}
CliCmd_PrintLnStatic(cli, "================================================");
CliCmd_PrintLnStatic(cli, "");
return 0;
}

151
Src/CliCmd/SetVar.c Normal file
View File

@ -0,0 +1,151 @@
//
// 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;
}

82
Src/CliCmd/VarsGet.c Normal file
View File

@ -0,0 +1,82 @@
//
// Created by zemon on 15.11.22.
//
#include "CliCmd/Vars.h"
static const uint8_t nameAlign = 16;
static char space[] = " ";
static void CliCmd_Vars_printDeskName(tVariableDescriptor *descriptor, tCliCmd *cli) {
if (descriptor->name.length > nameAlign) {
CliCmd_Print(cli, descriptor->name.str, descriptor->name.length);
} else {
CliCmd_PrintFormat(cli, "%.*s%.*s",
descriptor->name.length,
descriptor->name.str,
nameAlign - descriptor->name.length,
space
);
}
CliCmd_PrintStatic(cli, "\t");
}
static void CliCmd_Vars_printDeskValue(tVariableDescriptor *descriptor, tCliCmd *cli) {
if (!VariablesTable_IsVariableChangeAllowed(descriptor)) {
CliCmd_PrintStatic(cli, "# ");
} else {
CliCmd_PrintStatic(cli, " ");
}
if (descriptor->typeId == VARIABLE_TYPE_STRING) {
CliCmd_Print(cli, descriptor->addr, *(uint8_t *) descriptor->len);
} else {
if (descriptor->typeId == VARIABLE_TYPE_UINT8) {
CliCmd_PrintFormat(cli, "%u", *(uint8_t *) descriptor->addr);
}
if (descriptor->typeId == VARIABLE_TYPE_UINT16) {
CliCmd_PrintFormat(cli, "%u", *(uint16_t *) descriptor->addr);
}
if (descriptor->typeId == VARIABLE_TYPE_UINT32) {
CliCmd_PrintFormat(cli, "%i", *(uint32_t *) descriptor->addr);
}
if (descriptor->typeId == VARIABLE_TYPE_BOOL) {
CliCmd_PrintFormat(cli, "%u", *(uint8_t *) descriptor->addr);
}
if (descriptor->typeId == VARIABLE_TYPE_FLOAT32) {
CliCmd_PrintFormat(cli, "%f", *(float *) descriptor->addr);
}
if (descriptor->typeId == VARIABLE_TYPE_ARR_U8_STATIC) {
uint8_t *beg = descriptor->addr;
uint8_t *end = beg + ((uint32_t) descriptor->len);
for (uint8_t *elem = beg; elem < end; elem++) {
if (elem != beg) {
CliCmd_PrintStatic(cli, " ");
}
CliCmd_PrintFormat(cli, "%u", *elem);
}
}
}
}
void CliCmd_Vars_printDesk(tVariableDescriptor *desk, tCliCmd *cli) {
CliCmd_Vars_printDeskName(desk, cli);
CliCmd_Vars_printDeskValue(desk, cli);
}
int32_t CliCmd_Vars_listVariables(tVariablesTable *extTable, tCliCmd *cli) {
CliCmd_PrintLnStatic(cli, "==============================VARS==============================");
for (uint16_t id = 0; id < extTable->count; ++id) {
CliCmd_Vars_printDesk(extTable->items + id, cli);
CliCmd_PrintLnStatic(cli, "");
}
CliCmd_PrintLnStatic(cli, "================================================================");
CliCmd_PrintLnStatic(cli, "");
return 0;
}

15
Src/CliCmd/VarsHelp.c Normal file
View File

@ -0,0 +1,15 @@
//
// Created by xemon on 22.12.22.
//
#include "CliCmd/Vars.h"
int32_t CliCmd_VarsHelp(tCliCmd *cli) {
CliCmd_PrintLnStatic(cli, " access sub commands:");
CliCmd_PrintLnStatic(cli, " command [ ls ]- listing all access variable and values");
CliCmd_PrintLnStatic(cli, " command [ set ] - set variable values");
CliCmd_PrintLnStatic(cli, " syntaxis: [command] [VARIABLE_NAME] [VARIABLE_VALUE]");
CliCmd_PrintLnStatic(cli, " command [ help ] - help this as sub mode");
CliCmd_PrintLnStatic(cli, " command [ exit ] - exit as this sub mode");
CliCmd_PrintLnStatic(cli, "");
return 0;
}

33
Src/CliCmd/VarsMode.c Normal file
View File

@ -0,0 +1,33 @@
//
// Created by xemon on 22.12.22.
//
#include "CliCmd/Vars.h"
int32_t CliCmd_ChangeListVar(tVariablesTable *varTable, tCliCmd *cli) {
CliCmd_PrintLnStatic(cli, "THIS MODE CHANG BASE VARIABLE");
CliCmd_VarsHelp(cli);
while (1) {
CliCmd_WaitLine(cli);
if (CliCmd_RxStartsWithStatic(cli, "ls")) {
vGetVarsTableSetting(varTable, cli);
}
if (CliCmd_RxStartsWithStatic(cli, "set")) {
CliCmd_PrintLnStatic(cli, "set");
CliCmd_RxSkip(cli, sizeof("set"));
vSetVarTableSetting(varTable, cli);
}
if (CliCmd_RxStartsWithStatic(cli, "exit")) {
CliCmd_PrintLnStatic(cli, "EXIT IN BASE MODE...");
return 0;
}
if (CliCmd_RxStartsWithStatic(cli, "help")) {
CliCmd_VarsHelp(cli);
}
}
}

146
Src/CliCmd/VarsSet.c Normal file
View File

@ -0,0 +1,146 @@
//
// 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;
}

22
modular.json Normal file
View File

@ -0,0 +1,22 @@
{
"dep": [
{
"type": "git",
"provider": "Smart_Components_Aurus",
"repo": "CmsisCore5"
},
{
"type": "git",
"provider": "Smart_Components_Aurus",
"repo": "CliCmd"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}