// // 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; }