// // Created by zemon on 16.11.22. // #include "CliCmd/Vars.h" #include "freertos_os2.h" #include 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; }