From 257821733afcb78c423e28325633ff2d6f44d282 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 2 Jun 2025 13:26:39 +0300 Subject: [PATCH] Init --- ext_telematica.c | 72 ++++++++++++ ext_telematica.h | 298 +++++++++++++++++++++++++++++++++++++++++++++++ modular.json | 11 ++ 3 files changed, 381 insertions(+) create mode 100644 ext_telematica.c create mode 100644 ext_telematica.h create mode 100644 modular.json diff --git a/ext_telematica.c b/ext_telematica.c new file mode 100644 index 0000000..a8148be --- /dev/null +++ b/ext_telematica.c @@ -0,0 +1,72 @@ +// +// Created by cfif on 24.06.2024. +// +#include "ext_telematica.h" +//#include "FirmwareMetadataSection.h" +#include "string.h" +#include "ld_adr.h" + +tMmaTeleAdr EXT_ENV_ADR_TELE; + + +bool loadMetaTelematica() { + tMetaSectionData *metaSectionData; + + uint32_t offsetMeta = 0x08000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH + FIRMWARE_MAIN_UPDATE_AREA_LENGTH + + FIRMWARE_TELE_AREA_LENGTH - 256; + uint32_t offsetTele = 0x08000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH + FIRMWARE_MAIN_UPDATE_AREA_LENGTH; + + + uint32_t pos = offsetMeta; + uint32_t offsetMetaCrc = (*(uint32_t *) pos); + pos += 4; + uint32_t offsetMetaSize = (*(uint32_t *) (pos)); + pos += 4; + + + EXT_ENV_ADR_TELE.FW_NAME.length = (*(uint8_t *) (pos)); + pos += 1; + + if (EXT_ENV_ADR_TELE.FW_NAME.length > 32) { + EXT_ENV_ADR_TELE.FW_NAME.length = 0; + return false; + } + + memcpy(EXT_ENV_ADR_TELE.FW_NAME.data, (uint8_t *) (pos), EXT_ENV_ADR_TELE.FW_NAME.length); + pos += EXT_ENV_ADR_TELE.FW_NAME.length; + + + EXT_ENV_ADR_TELE.HW_NAME.length = (*(uint8_t *) (pos)); + pos += 1; + + if (EXT_ENV_ADR_TELE.HW_NAME.length > 32) { + EXT_ENV_ADR_TELE.HW_NAME.length = 0; + return false; + } + + memcpy(EXT_ENV_ADR_TELE.HW_NAME.data, (uint8_t *) (pos), EXT_ENV_ADR_TELE.HW_NAME.length); + pos += EXT_ENV_ADR_TELE.HW_NAME.length; + + + uint32_t crc32 = 0; + for (uint32_t i = 0; i < FIRMWARE_TELE_AREA_LENGTH - 256; ++i) { + crc32 += ((uint8_t *) offsetTele)[i]; + } + + if (offsetMetaSize != FIRMWARE_TELE_AREA_LENGTH - 256) + return false; + + if ((crc32 != offsetMetaCrc) && (offsetMetaCrc != 0)) + return false; + + uint32_t offset = + offsetMeta + sizeof(offsetMetaCrc) + sizeof(offsetMetaSize) + 1 + EXT_ENV_ADR_TELE.FW_NAME.length + 1 + EXT_ENV_ADR_TELE.HW_NAME.length; + + metaSectionData = (tMetaSectionData *) offset; + + EXT_ENV_ADR_TELE.META_EXT_ENV_TELE = metaSectionData->meta_ext_env_tele; + EXT_ENV_ADR_TELE.tele_func = (p_tele_func) metaSectionData->meta_tele_func; + + + return true; +} \ No newline at end of file diff --git a/ext_telematica.h b/ext_telematica.h new file mode 100644 index 0000000..a14d88d --- /dev/null +++ b/ext_telematica.h @@ -0,0 +1,298 @@ +// +// Created by cfif on 18.06.2024. +// + +#ifndef SMART_COMPONENTS_EXT_TELEMATICA_H +#define SMART_COMPONENTS_EXT_TELEMATICA_H + +#include "cmsis_os2.h" +#include "SystemMutexCmsis.h" +#include "LoggerToSerialPort.h" +#include "AtCmdBase.h" +#include "DeviceStorage.h" +#include "Nmea0183Parser.h" +#include "XfcProtTable.h" +#include "GpioPin.h" +#include "DeviceTestsTable.h" +#include "SerialPortFrameIO.h" +#include "AdcIO.h" +#include "CanSerialPortFrame.h" +#include "ReadDataByIdentifier_22.h" +#include "RoutineControl_31.h" + +typedef struct { + uint32_t vehicleLatitude; + uint32_t vehicleLongitude; +} tVehicleCoordinates; + +typedef struct { + uint8_t SosButtonEvent; + uint8_t crashEvent; + uint8_t RolloverEvent; +} tEmergencyCallCounter; + +typedef enum { + CAN_GNSS_NO_MALFUNCTIONS = 0, + CAN_GNSS_SYSTEM_INITIALISATION = 1, + CAN_GNSS_FAILURE = 2 +} eCanGnssStatus; + +typedef enum { + CAN_GNSS_NO_CALL = 0, + CAN_GNSS_CALL = 1 +} eCanGnssCallByButton; + +typedef enum { + CAN_GNSS_NO_ROLLOVER_DETECT = 0, + CAN_GNSS_ROLLOVER_DETECT = 1 +} eCanGnssCallAuto; + +typedef enum { + CAN_GNSS_CALL_TEST_NOT_ACTIVE = 0, + CAN_GNSS_CALL_TEST_ACTIVE = 1 +} eCanGnssCallTest; + +typedef enum { + LAST_EVENT_NONE = 0, + LAST_EVENT_FLIP = 1, + LAST_EVENT_IMPACT = 2, + LAST_EVENT_MANUAL = 3, + LAST_EVENT_TEST = 4 +} eLastEventDevice; + +//#pragma scalar_storage_order big-endian +typedef struct __attribute__ ((packed)) { + + +// eCanGnssCallTest GNSS_Call_Test: 1; +// eCanGnssCallAuto GNSS_Call_Auto: 1; +// eCanGnssCallByButton GNSS_Call_By_button: 1; +// eCanGnssStatus GNSS_Status: 2; + + eCanGnssStatus GNSS_Status: 2; + eCanGnssCallByButton GNSS_Call_By_button: 1; + eCanGnssCallAuto GNSS_Call_Auto: 1; + eCanGnssCallTest GNSS_Call_Test: 1; + uint8_t Reserved2: 3; + + uint8_t Reserved1: 4; + uint8_t GNSS_LC: 4; // Счетчик от 0..15 по циклу + + +} tGNSS_General; +//#pragma scalar_storage_order little-endian + +typedef struct { + struct { + osThreadId_t (*osThreadNew)(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr); + + osStatus_t (*osThreadSuspend)(osThreadId_t thread_id); + + osStatus_t (*osThreadTerminate)(osThreadId_t thread_id); + + osStatus_t (*osThreadResume)(osThreadId_t thread_id); + + osMessageQueueId_t + (*osMessageQueueNew)(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); + + osMutexId_t (*osMutexNew)(const osMutexAttr_t *attr); + + osStatus_t (*osMutexAcquire)(osMutexId_t mutex_id, uint32_t timeout); + + osStatus_t (*osMutexRelease)(osMutexId_t mutex_id); + + osStatus_t + (*osMessageQueuePut)(osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout); + + osStatus_t (*osMessageQueueGet)(osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout); + + osStatus_t (*osMessageQueueReset)(osMessageQueueId_t mq_id); + + uint32_t (*osMessageQueueGetSpace)(osMessageQueueId_t mq_id); + + uint32_t (*osMessageQueueGetCount)(osMessageQueueId_t mq_id); + + void (*SystemDelayMs)(uint32_t ms); + + uint64_t (*SystemGetMs)(); + + void (*nvic_system_reset)(void); + + void *(*malloc)(size_t); + + void (*free)(void *); + } osFreeRTOS; + + void (*CanPort_SetSpeed)(can_type *CANx, eCanBaudRate canBaudRate); + + void (*CanPort_GetSpeed)(can_type *CANx, eCanBaudRate *canBaudRate); + + void (*CanPort_SetFilter)(can_type *CANx, can_filter_init_type *can_filter0_init_struct, + can_filter_init_type *can_filter1_init_struct); + + void *Routine_Can_UDS_env; + + void (*Routine_Can_UDS)(void *env, + eUdsRoutineIdentifier udsRoutineIdentifier, + eUdsRoutineModes udsRoutineModes, + eUdsRoutineControlType udsRoutineControlType, + eUdsStartStopRoutineResult *udsStartStopRoutineResult, + eUdsRequestRoutineResult *udsRequestRoutineResult + ); + + struct { + tNmeaRmc *currentRmc; + osMutexId_t rmcAccess; + } gnss; + + tGpioPin *ignition; + tAtCmd *gsmAt; + tRtcIO *rtcIO; + tLoggerToSerialPort *loggerToSerialPort; + + struct { + tDeviceDataRuntime *runtime; + tDeviceAdditionalSettings *AdditionalSettings; + tUveosGostSettings *gost; + tDeviceSettings *device; + uint8_t *dataTeledata; + tVariablesTable *publicVariablesTable; + tEraGlonassUveosDumperInterface *uveosDumper; + osMutexId_t accessDumper; + } store; + + tDeviceTestsTable *testsTable; + + tAdcIO *vccIo; + + tSerialPortFrameIO *Can1_IO; + tSerialPortFrameIO *Can2_IO; + + tInputStatesRecord_0001 *InputStatesRecord_0001; + tOutputStatesRecord_0002 *OutputStatesRecord_0002; + tSystemStateID_0006 *SystemStateID_0006; + + uint8_t *BoardVoltage; + uint8_t *ReserveBatteryCharge; + uint8_t *ReserveBatteryTemperature; + tVehicleCoordinates *VehicleCoordinates; + uint8_t *VehicleCoordinatesReliability; + uint8_t *MDS_FormatVersion; + uint8_t *TCM_working_mode; + uint8_t *TCM_activation_source; + uint8_t *TCM_time_calculation; + uint8_t *GLONASS_and_GLONASS_GPS_groups; + uint8_t *GsmRegistrationState; + uint32_t *TimeStamp; + uint8_t *GsmInnerError; + uint8_t *VehicleCoordinatesReliabilityMem; + uint8_t *GsmRegistartionStateMem; + uint8_t *GsmRegistrationError; + uint8_t *EcallOn; + uint8_t *CrashSignalExternal; + uint16_t *GnssPowerOffTime; + uint8_t *AutomaticActivationProhibition; + uint8_t *ECALLToTest; + uint8_t *NadRegistrationAtStartup; + char *GSMSoftwareVersionNumber; // 20 + char *SmsFallbackTestNumber; // 20 + uint8_t *SimProfileAmount; + uint8_t *SimProfile; + uint8_t *AudioProfile; + uint8_t *EcallNoAutomaticTriggering; + uint8_t *MiddletState; + char *Vehicle_SW_Version; // 3 + char *Midlet_SW_Version; // 3 + char *Boot_SW_Version; // 27 + uint8_t *SertState; + uint16_t *ApplicationCheckSum; + uint8_t *Audio_HW_Settings; + tEmergencyCallCounter *ECALL_EmergencyCallCounter; + char *Avaialble_Networks_List; //128 + uint8_t *SavedMSDAmount; + uint8_t *SentMSDAmount; + char *VehicleManufacturerSparePartNumber; //10 + char *ConfigurationFileReferenceLink; //10 + char *SystemSupplierIdentifier; //3 + char *ECUSerialNumber; //20 + char *VehicleManufacturerECUHardwareNumber; //10 + char *SystemSupplierECUSoftwareNumber; //2 + char *SystemSupplierECUSoftwareVersionNumber; //2 + uint8_t *VDIAG; + + uint16_t *vBatVoltage; // Напряжение АКБ мили вольт + uint16_t *vBoardVoltage; // Напряжение платы мили вольт + + tGNSS_General *GNSS_General; + + eDeviceTestingCode *deviceTestingCodeCan; // Код ошибки CAN (работает только в производственном режиме) + + eLastEventDevice *LastEventDevice; + + void (*SetDeviceFactoryMode)(void *env); + + void *SetDeviceFactoryMode_env; + + void (*SrandStdLib)(unsigned seed); + + int (*RandStdLib)(); + + tDataToCan *DataToCan; + + void *Function_Can_UDS_env; + + void (*Function_Can_UDS)(void *env, + eTypeFunctionCanUds typeFunctionCanUds, + void *dataFunctionCanUdsEnv + ); + + + uint8_t reserve[256]; + +} tMmaTele; + +typedef struct __attribute__ ((packed)) { + uint32_t meta_ext_env_tele; + uint32_t meta_tele_func; +} tMetaSectionData; + +typedef enum { + TELE_MODULE_INIT = 0, + TELE_MODULE_START = 1, + TELE_MODULE_COM_INT = 2, + TELE_MODULE_COM_INT_DEFAULT = 3, + TELE_MODULE_GSM_URC = 4, + TELE_MODULE_ACCEL_DATA = 5, + TELE_MODULE_ADD_EVENT = 6, + TELE_MODULE_CAN_UDS_START = 7, + TELE_MODULE_SHUTDOWN = 8, + TELE_MODULE_MUTE_ON = 9, + TELE_MODULE_MUTE_OFF = 10, + TELE_MODULE_FUEL_CUT_OFF = 11, + TELE_MODULE_GET_CAN_COM_IO = 12, + + TELE_MODULE_COUNTER_1 = 13, + TELE_MODULE_COUNTER_2 = 14, + TELE_MODULE_COUNTER_3 = 15, + TELE_MODULE_COUNTER_4 = 16, + TELE_MODULE_COUNTER_5 = 17, + + TELE_MODULE_GNSS = 18, + TELE_MODULE_PRE_INIT = 19, +} eEventTelematica; + +typedef void *(*p_tele_func)(void *env, eEventTelematica event); + +typedef struct { + uint32_t META_EXT_ENV_TELE; + tString32 FW_NAME; + tString32 HW_NAME; + p_tele_func tele_func; +} tMmaTeleAdr; + +extern tMmaTele EXT_ENV_TELE; +extern tMmaTeleAdr EXT_ENV_ADR_TELE; + +bool loadMetaTelematica(); + +#endif //SMART_COMPONENTS_EXT_TELEMATICA_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..3fea4af --- /dev/null +++ b/modular.json @@ -0,0 +1,11 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} +