327 lines
16 KiB
C
327 lines
16 KiB
C
//
|
||
// Created by cfif on 23.01.2026.
|
||
//
|
||
#include "DiagnosticTask.h"
|
||
#include "CmsisRtosThreadUtils.h"
|
||
#include "StatusData.h"
|
||
#include "StatusError.h"
|
||
|
||
|
||
void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger) {
|
||
|
||
env->logger = logger;
|
||
|
||
env->queue = osMessageQueueNew(DIAGNOSTIC_QUEUE_SIZE, 1, NULL);
|
||
|
||
env->access = osMutexNew(NULL);
|
||
|
||
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
|
||
|
||
// Тест DTC не был выполнен в текущем цикле работы
|
||
dtc_state_error[i] = UDS_dtc_mask_testNotCompletedThisOperationCycle;
|
||
}
|
||
|
||
InitThreadAtrStatic(&env->thread.attr, "Diagnostic", env->thread.controlBlock, env->thread.stack,
|
||
osPriorityNormal);
|
||
}
|
||
|
||
void diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env) {
|
||
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
|
||
// Тест DTC не был выполнен в текущем цикле работы
|
||
dtc_state_error[i] = UDS_dtc_mask_testNotCompletedThisOperationCycle;
|
||
// Тест DTC не был выполнен с момента последней очистки
|
||
dtc_state_error[i] |= UDS_dtc_mask_testNotCompletedSinceLastClear;
|
||
}
|
||
}
|
||
|
||
const eDiagnosticState diagnostic_com[] = {
|
||
{diagnostic_ClearDiagnosticInformation_14, "DIAGNOSTIC_SET_UDS_ClearDiagnosticInformation_14"},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""},
|
||
{NULL, ""}
|
||
};
|
||
|
||
void setDiagnosticData(tDiagnostic *env, eDiagnosticType diagnosticType) {
|
||
|
||
if (diagnostic_com[diagnosticType].func != NULL) {
|
||
|
||
if (osMutexAcquire(env->access, 1000) == osOK) {
|
||
diagnostic_com[diagnosticType].func(env);
|
||
osMutexRelease(env->access);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
static _Noreturn void Diagnostic_Thread(tDiagnostic *env) {
|
||
for (;;) {
|
||
|
||
osStatus_t status = osMessageQueueGet(env->queue, &env->diagnosticType, 0, 1000);
|
||
|
||
if (status == osOK) {
|
||
if (osMutexAcquire(env->access, 1000) == osOK) {
|
||
|
||
|
||
osMutexRelease(env->access);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void Diagnostic_StartThread(tDiagnostic *env) {
|
||
if (!env->thread.id) {
|
||
env->thread.id = osThreadNew((osThreadFunc_t) (Diagnostic_Thread), (void *) (env), &env->thread.attr);
|
||
}
|
||
} |