commit 1acec4cb87a0f3f6be4d2324abc13b45968333c8 Author: cfif Date: Mon Jun 2 13:26:41 2025 +0300 Init diff --git a/Inc/DeviceTestsResults.h b/Inc/DeviceTestsResults.h new file mode 100644 index 0000000..e9a42a3 --- /dev/null +++ b/Inc/DeviceTestsResults.h @@ -0,0 +1,43 @@ +// +// Created by xemon on 30.10.22. +// + +#ifndef UVEOS_ON_NATION_DEVICETESTSRESULTS_H +#define UVEOS_ON_NATION_DEVICETESTSRESULTS_H + +//Данные коды глобальны для всех устройств +//Они должны быть занесены в сервисную программу +//Удаление или замена кода недопустима +//Коды могут могут только доплняться +//Максимальное значение кода 0xFFFF + + +typedef enum { + DEVICE_TESTING_CODE_NOT_TESTED = 0x00, + DEVICE_TESTING_CODE_IN_PROCESS = 0x01, + DEVICE_TESTING_CODE_ERROR = 0x02, + DEVICE_TESTING_CODE_PASSED = 0x03, + + DEVICE_TESTING_CODE_BATTERY_NOT_CHARGE = 0x11, + DEVICE_TESTING_CODE_BATTERY_PRE_CHARGE = 0x12, + DEVICE_TESTING_CODE_BATTERY_FAST_CHARGE = 0x13, + DEVICE_TESTING_CODE_BATTERY_CHARGE_DONE = 0x14, + + DEVICE_TESTING_CODE_BUTTON_PRESSED = 0x21, + DEVICE_TESTING_CODE_BUTTON_NOT_PRESSED = 0x22, + + DEVICE_TESTING_CODE_LED_OFF = 0x23, + DEVICE_TESTING_CODE_LED_RED = 0x24, + DEVICE_TESTING_CODE_LED_GREEN = 0x25, + DEVICE_TESTING_CODE_LED_BLUE = 0x25, + + DEVICE_TESTING_CODE_NOT_CONNECTED = 0x31, + DEVICE_TESTING_CODE_CONNECTED = 0x32, + DEVICE_TESTING_CODE_SHORT_CIRCUIT = 0x33, + DEVICE_TESTING_CODE_NOT_CONNECTED_OK = 0x34, + DEVICE_TESTING_CODE_INPUT_ANTENA_OK = 0x35, + + DEVICE_TESTING_CODE_NOT_ACTIVE = 0x36, +} eDeviceTestingCode; + +#endif //UVEOS_ON_NATION_DEVICETESTSRESULTS_H diff --git a/Inc/DeviceTestsTable.h b/Inc/DeviceTestsTable.h new file mode 100644 index 0000000..3d64463 --- /dev/null +++ b/Inc/DeviceTestsTable.h @@ -0,0 +1,70 @@ +// +// Created by cfif on 14.10.22. +// + +#ifndef UVEOS_ON_NATION_DeviceTestsTable_H +#define UVEOS_ON_NATION_DeviceTestsTable_H + +#include "stdint.h" +#include +#include "cmsis_os.h" +#include "DeviceTestsResults.h" + +typedef eDeviceTestingCode (*TestMethod)(void *env); + +typedef struct { + char str[16]; + uint8_t length; +} tTestName; + +typedef struct { + tTestName name; + void *testEnv; + TestMethod testMethod; + uint16_t result; + uint16_t resultFix; + uint16_t modesFlag; +} tTestDescriptor; + +#define DEVICE_TEST_NAME(STR) (tTestName){.str=(STR), .length=sizeof(STR)-1} + +typedef struct { + tTestDescriptor *items; + uint16_t itemsLimit; + uint16_t count; + osMutexId_t rmcAccess; + + uint16_t currentProcessMode; + uint16_t currentProcessIterationsLeft; + + uint32_t testProcessBegin; + uint32_t testProcessEnd; +} tDeviceTestsTable; + + +void DeviceTestsTableInit(tDeviceTestsTable *env, tTestDescriptor *itemsMem, uint16_t itemsLimit); + +#define DeviceTestsTableInitStatic(ENV, MEM) DeviceTestsTableInit(ENV,MEM,sizeof(MEM)/ sizeof(tTestDescriptor)) + +tTestDescriptor* DeviceTestsTableAdd(tDeviceTestsTable *env, tTestName name, void *testEnv, TestMethod method, uint16_t modesFlag); + +void DeviceTestsTable_TestInMode(tDeviceTestsTable *env, uint16_t modesFlag, uint16_t timeout); + +bool DeviceTestsTable_AnyTestHasCode(tDeviceTestsTable *env, eDeviceTestingCode code); + +tTestDescriptor *DeviceTestsTable_GetModeTest(tDeviceTestsTable *env, uint16_t modesFlag, char *name, uint8_t nameSize); + +#define DeviceTestsTable_GetModeTestStatic(ENV, MODE, NAME) DeviceTestsTable_GetModeTest(ENV,MODE, NAME,sizeof(NAME)-1) + +uint16_t DeviceTestsTable_MakeTest(tTestDescriptor *test); + +//uint16_t getTestRepeats(tDeviceTestsTable *env, uint16_t id); +// +//uint16_t getTestResult(tDeviceTestsTable *env, uint16_t id); +// +//void setTestRepeats(tDeviceTestsTable *env, uint16_t id, uint16_t value); +// +//void setTestResult(tDeviceTestsTable *env, uint16_t id, uint16_t value); + + +#endif //UVEOS_ON_NATION_DeviceTestsTable_H diff --git a/Src/DeviceTestsTable.c b/Src/DeviceTestsTable.c new file mode 100644 index 0000000..5af428d --- /dev/null +++ b/Src/DeviceTestsTable.c @@ -0,0 +1,85 @@ +// +// Created by cfif on 14.10.22. +// +#include +#include "DeviceTestsTable.h" +#include + +void DeviceTestsTableInit( + tDeviceTestsTable *env, + tTestDescriptor *itemsMem, + uint16_t itemsLimit +) { + env->count = 0; + env->items = itemsMem; + env->itemsLimit = itemsLimit; +} + +tTestDescriptor *DeviceTestsTableAdd( + tDeviceTestsTable *env, tTestName name, void *testEnv, TestMethod method, uint16_t modesFlag +) { + if (env->count >= env->itemsLimit) { + return NULL; + } + env->items[env->count].testMethod = method; + env->items[env->count].testEnv = testEnv; + env->items[env->count].name = name; + env->items[env->count].modesFlag = modesFlag; + + ++env->count; + + return env->items + env->count - 1; +} + +uint16_t DeviceTestsTable_MakeTest(tTestDescriptor *test) { + return test->result = test->testMethod(test->testEnv); +} + +void DeviceTestsTable_TestInMode(tDeviceTestsTable *env, uint16_t modesFlag, uint16_t timeout) { + static uint16_t testAccelCalibIdx = 0xFFFF; + + for (uint16_t testIdx = 0; testIdx < env->count; ++testIdx) { + + if (testAccelCalibIdx == 0xFFFF) { + if (memcmp(env->items[testIdx].name.str, "ACCEL_CALIB", sizeof("ACCEL_CALIB") - 1) == 0) { + testAccelCalibIdx = testIdx; + } + } + + if (env->items[testIdx].modesFlag & modesFlag) { + env->items[testIdx].result = DEVICE_TESTING_CODE_IN_PROCESS; + SystemDelayMs(timeout); + DeviceTestsTable_MakeTest(env->items + testIdx); + env->items[testIdx].resultFix = env->items[testIdx].result; + + if (testAccelCalibIdx != 0xFFFF) { + DeviceTestsTable_MakeTest(env->items + testAccelCalibIdx); + env->items[testAccelCalibIdx].resultFix = env->items[testAccelCalibIdx].result; + } + + } + } +} + +bool DeviceTestsTable_AnyTestHasCode(tDeviceTestsTable *env, eDeviceTestingCode code) { + for (uint16_t testIdx = 0; testIdx < env->count; ++testIdx) { + if (env->items[testIdx].result == code) { + return true; + } + } + return false; +} + +tTestDescriptor *DeviceTestsTable_GetModeTest(tDeviceTestsTable *env, uint16_t modes, char *name, uint8_t nameSize) { + + for (uint16_t testIdx = 0; testIdx < env->count; ++testIdx) { + tTestDescriptor *test = env->items + testIdx; + if (test->modesFlag & modes) { + if ((nameSize == test->name.length) && (strncmp(name, test->name.str, test->name.length) == 0)) { + return test; + } + } + } + + return NULL; +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..d4d574e --- /dev/null +++ b/modular.json @@ -0,0 +1,12 @@ +{ + "dep": [ + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file