// // Created by cfif on 04.10.2022. // #include #include #include #include #include "SerialPort.h" #include "ComIntCmd/Vars.h" #include "ComIntCmd/Tests.h" #include "ComIntCmd/VersionsInfo.h" #include "ComIntCmd/AccelCalibration.h" static void ComInt_LoadMetadata(tComInt *env) { env->versions.firmware = StringStaticInit("1.1.0"); env->versions.board = (tStringStatic) { .data = (char *) (HARDWARE_REVISION), .length = sizeof(HARDWARE_REVISION) - 1 }; }; static void ComIntInitRoot(tComInt *env, tSerialPortIO *io) { env->io = io; XfcProtTable_InitStatic(&env->table, env->memAlloc.table); tXfcArray rxArr; tXfcArray txArr; XfcArrayInitStatic(&rxArr, env->memAlloc.rxArr); XfcArrayInitStatic(&txArr, env->memAlloc.txArr); XfcProtRespondent_Init(&env->service, NULL, &env->table, rxArr, txArr, XFC_STD_MAGIC_NUMBERS); ComInt_LoadMetadata(env); } static void ComIntInitPing(tComInt *env, tString16 *deviceId, tStringLink *currentModeName) { env->ping.device = String16GetLink(deviceId); env->ping.board = StringStaticGetLink(&env->versions.board); env->ping.mode = currentModeName; } static void ComIntInitVersions(tComInt *env, tString16 *deviceId) { VersionsInfoTable_InitStatic(&env->versionsTable, env->memAlloc.versions); VersionsInfoTable_AddStatic( &env->versionsTable, "DEVICE_ID", String16GetLink(deviceId) ); VersionsInfoTable_AddStatic( &env->versionsTable, "FIRMWARE", StringStaticGetLink(&env->versions.firmware) ); VersionsInfoTable_AddStatic( &env->versionsTable, "BOARD", StringStaticGetLink(&env->versions.board) ); } static void ComIntInitSerialBridges( tComInt *env, tSerialPortIO *gsmIo, tSerialPortIO *gnssIo, tSerialPortIO *cliIo ) { SerialBridges_InitStatic(&env->serialBridges, env->memAlloc.serialBridge); if (gnssIo)SerialBridges_AddStatic(&env->serialBridges, "GNSS", gnssIo); if (gsmIo)SerialBridges_AddStatic(&env->serialBridges, "AT_GSM", gsmIo); if (cliIo)SerialBridges_AddStatic(&env->serialBridges, "CLI", cliIo); } void ComInt_Init( tComInt *env, tSerialPortIO *io, tString16 *deviceId, tVariablesTable *varsTab, tDeviceTestsTable *tests, tSerialPortIO *gsmIo, tSerialPortIO *cliIo, tSerialPortIO *gnssIo, tStringLink *currentModeName, tCarFlipDetection *carFlipDetection ) { ComIntInitRoot(env, io); ComIntInitPing(env, deviceId, currentModeName); ComIntInitVersions(env, deviceId); ComIntInitSerialBridges(env, gsmIo, gnssIo, cliIo); XfcProtMethodsInit_AccelCalibration(&env->accelCalibData, carFlipDetection, varsTab); //Добавляем обработчики комманд XfcProtMethodsAdd_Mandatory(&env->table, &env->ping, &env->table); XfcProtMethodsAdd_VersionsInfo(&env->table, &env->versionsTable); XfcProtMethodsAdd_AccelCalibration(&env->table,&env->accelCalibData); if (varsTab) { XfcProtMethodsAdd_Vars(&env->table, varsTab); } XfcProtMethodsAdd_Tests(&env->table, tests); XfcProtMethodsAdd_SerialBridge(&env->table, &env->serialBridges); //Инициализируем поток InitThreadAtrStatic(&env->thread.attr, "ComInt", env->thread.controlBlock, env->thread.stack, osPriorityNormal); env->thread.id = 0; } static _Noreturn void ComInt_Thread(tComInt *env) { for (;;) { uint8_t byte; if (SerialPortReceive(env->io, &byte, 1, SystemWaitForever)) { XfcProtRespondent_AddBytes(&env->service, &byte, 1); while (XfcArrayGetDataSize(env->service.requestDecoder.buffer)) { if (XfcProtRespondent_Step(&env->service)) { SerialPortTransmit( env->io, env->service.responseEncoder.buffer->data, XfcArrayGetDataSize(env->service.responseEncoder.buffer), 1000 ); XfcProtRespondent_SkipCurrentRequest(&env->service); } else { break; } } } } } void ComInt_StartThread(tComInt *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (ComInt_Thread), (void *) (env), &env->thread.attr); } else { osThreadResume(env->thread.id); } }