EraGlonassMsd/Inc/EraGlonassMsd.h

178 lines
6.6 KiB
C

/*
* msd.h
*
* Created on: Oct 20, 2020
* Author: FICOM-IT LTD
*/
#ifndef INC_MSD_H_
#define INC_MSD_H_
#include <stdint.h>
#include <stdbool.h>
#include <UveosGostSettingsTypes.h>
#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_ */