/* * msd.h * * Created on: Oct 20, 2020 * Author: FICOM-IT LTD */ #ifndef INC_MSD_H_ #define INC_MSD_H_ #include #include #include #include "EcallTypes.h" #define ERA_GLONASS_MSD_ENCODED_BUFFER_LENGTH 128 typedef enum { MSD_V_1 = 1, MSD_V_2 = 2, } eEraGlonassMsd_Version; // @brief Control and status data typedef struct { uint16_t extraData; // 000 - additional data excluded, 010 - additional data included uint16_t recentPos1; // True if previous location is available uint16_t recentPos2; // True if previous location is available uint16_t passengers; // True if passangers' number is available uint16_t activation; // True if Automatic, False if manual eCall activation uint16_t testCall; // True if test eCall, Flase if not test eCall uint16_t posStatus; // True if GPS position can be trusted uint16_t vehicleType; // Vehicle identification according to 2007/46/EC, 2002/24/EC uint16_t includedTanks; // if True include status data (present/not present) for the relevant tank } tEraGlonassMsd_Control; // @brief Vehicle location stored in milli-arc-second typedef struct { int32_t lat; // Position latitude int32_t lon; // Position longitude } tEraGlonassMsd_GpsPos; // @brief Vehicle location difference with the previous location stored in milli-arc-second typedef struct { uint16_t lat; uint16_t lon; } tEraGlonassMsd_PosDelta; typedef enum { ERA_GLONASS_MSD_OPTIONAL_FLAG_ABSENT = 0, ERA_GLONASS_MSD_OPTIONAL_FLAG_PRESENT_TRUE = 1, ERA_GLONASS_MSD_OPTIONAL_FLAG_PRESENT_FALSE = 2, } tEraGlonassMsd_OptionalFlagState; typedef uint8_t tEraGlonassMsd_OptionalFlag; #define EraGlonassMsd_OptionalFlagClear(FLAG) (GLAG) = ERA_GLONASS_MSD_OPTIONAL_FLAG_ABSENT #define EraGlonassMsd_OptionalFlagSet(FLAG, VALUE) (FLAG) = (VALUE) ? ERA_GLONASS_MSD_OPTIONAL_FLAG_PRESENT_TRUE : ERA_GLONASS_MSD_OPTIONAL_FLAG_PRESENT_FALSE typedef struct { tEraGlonassMsd_OptionalFlag CrashFront; tEraGlonassMsd_OptionalFlag CrashLeftSide; tEraGlonassMsd_OptionalFlag CrashRightSide; tEraGlonassMsd_OptionalFlag CrashRear; tEraGlonassMsd_OptionalFlag CrashWithRollover; tEraGlonassMsd_OptionalFlag CrashSide; tEraGlonassMsd_OptionalFlag CrashFrontOrSide; tEraGlonassMsd_OptionalFlag CrashOtherType; } tMSD_CrashInfo; #define EraGlonassMsd_CrashInfoClear(ENV) memset(ENV, 0, sizeof(tMSD_CrashInfo)) typedef struct { tEraGlonassMsd_OptionalFlag micConnectionFailure; tEraGlonassMsd_OptionalFlag micFailure; tEraGlonassMsd_OptionalFlag rightSpeakerFailure; tEraGlonassMsd_OptionalFlag leftSpeakerFailure; tEraGlonassMsd_OptionalFlag speakersFailure; tEraGlonassMsd_OptionalFlag ignitionLineFailure; tEraGlonassMsd_OptionalFlag uimFailure; tEraGlonassMsd_OptionalFlag statusIndicatorFailure; tEraGlonassMsd_OptionalFlag batteryFailure; tEraGlonassMsd_OptionalFlag batteryVoltageLow; tEraGlonassMsd_OptionalFlag crashSensorFailure; tEraGlonassMsd_OptionalFlag firmwareImageCorruption; tEraGlonassMsd_OptionalFlag commModuleInterfaceFailure; tEraGlonassMsd_OptionalFlag gnssReceiverFailure; tEraGlonassMsd_OptionalFlag raimProblem; tEraGlonassMsd_OptionalFlag gnssAntennaFailure; tEraGlonassMsd_OptionalFlag commModuleFailure; tEraGlonassMsd_OptionalFlag eventsMemoryOverflow; tEraGlonassMsd_OptionalFlag crashProfileMemoryOverflow; tEraGlonassMsd_OptionalFlag otherCriticalFailures; tEraGlonassMsd_OptionalFlag otherNotCriticalFailures; } tMSD_DiagnosticResult; typedef enum { ERA_GLONASS_MSD_COORDINATE_SYSTEM_TYPE_WGS84 = 0x01, ERA_GLONASS_MSD_COORDINATE_SYSTEM_TYPE_PZ90 = 0x02, } eEraGlonassMsd_CoordinateSystemType; typedef struct { bool asi15Present; bool crashInfoPresent; uint16_t asi15; tMSD_CrashInfo crashInfo; eEraGlonassMsd_CoordinateSystemType coordSystem; tMSD_DiagnosticResult *diagnosticResult; } tEraGlonassMsd_AdditionalData; // @brief MSD data structure typedef struct { uint16_t msdId; // MSD format version set to 1 uint16_t msgId; // Message identifier, starting with 1 for each new eCall session tEraGlonassMsd_Control MSD_Control; // Control flags and data uint16_t vin[18]; // VIN uint16_t propulsion; // Vehicle propulsion storage type uint32_t timestamp; // Timestamp tEraGlonassMsd_GpsPos pos; // Vehicle position uint8_t direction; // Vehicle heading, course over ground, course over north tEraGlonassMsd_PosDelta MSD_PosDelta[2]; // Previous position delta bool additionalDataPresent; tEraGlonassMsd_AdditionalData additionalData; // Additional data } tEraGlonassMsd_DataTypedef; typedef struct { tEraGlonassMsd_DataTypedef MSD_Data; // tEraGlonassMsd_GpsPos lastPos; } tEraGlonassMsd; //Must be called on create void EraGlonassMsdInit(tEraGlonassMsd *env); void EraGlonassMsd_ClearDiagnostic(tMSD_DiagnosticResult *env); //Must be called when settings changed void EraGlonassMsdSetPassengersNumber(tEraGlonassMsd *env, uint16_t value); void EraGlonassMsdSetVehicleType(tEraGlonassMsd *env, eUveosGostVehicleType value); void EraGlonassMsdSetVIN(tEraGlonassMsd *env, char *vin, uint8_t vinLen); void EraGlonassMsdSetPropulsionStorageType(tEraGlonassMsd *env, eUveosGostVehiclePropulsionStorageType value); //Must be called when gnss data changed void EraGlonassMsdSetTimeStamp(tEraGlonassMsd *env, uint32_t timestamp); void EraGlonassMsdSetPositionValue( tEraGlonassMsd *env, int32_t lonArc, int32_t latArc, uint16_t track, uint8_t valid ); void EraGlonassMsdNoGnssSetDefaults(tEraGlonassMsd *env); //Called on emergency situation void EraGlonassMsdSetDataEmergencySituationFlags( tEraGlonassMsd *env, int MSD_MSG_ID, eEcallActivationType eCallType, eEcallTestMode eCallTestMode ); uint16_t EraGlonassMsdEncode(tEraGlonassMsd *env, eEraGlonassMsd_Version msdVersion, uint8_t *encoded); #endif /* INC_MSD_H_ */