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