DeviceTestsTable/Src/DeviceTestsTable.c

86 lines
2.6 KiB
C

//
// Created by cfif on 14.10.22.
//
#include <string.h>
#include "DeviceTestsTable.h"
#include <SystemDelayInterface.h>
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;
}