Init
This commit is contained in:
commit
6a9b582509
|
|
@ -0,0 +1,444 @@
|
||||||
|
//
|
||||||
|
// Created by zemon on 21.08.24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include "MainModesArbiter_Private.h"
|
||||||
|
#include "DeviceTesting_TestingMethods.h"
|
||||||
|
#include "DeviceTesting.h"
|
||||||
|
|
||||||
|
#define LOG_SIGN "Главн состояние в UDS."
|
||||||
|
#define LOGGER &env->slog.logger
|
||||||
|
eDeviceTestingCode resBatState;
|
||||||
|
crm_clocks_freq_type crm_clocks_freq_structure = {0};
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetModemState(tModemDataColl *ModemDataCollector, const tDeviceModes *deviceModes, tSystemStateID_0006 *state) {
|
||||||
|
switch (*deviceModes) {
|
||||||
|
case DEVICE_MODE_UVEOS_MSD_TRANSMIT:
|
||||||
|
state->GSM_State = MSD_SENDS;
|
||||||
|
break;
|
||||||
|
case DEVICE_MODE_UVEOS_IN_CALL:
|
||||||
|
state->GSM_State = INCOMING_CALL;
|
||||||
|
break;
|
||||||
|
case DEVICE_MODE_UVEOS_SYSTEM_STARTUP:
|
||||||
|
state->GSM_State = INITIALIZING;
|
||||||
|
break;
|
||||||
|
case DEVICE_MODE_TESTING:
|
||||||
|
state->GSM_State = IDLE;
|
||||||
|
break;
|
||||||
|
case DEVICE_MODE_UVEOS_ERA_GNSS_READY:
|
||||||
|
state->GSM_State = IDLE;
|
||||||
|
break;
|
||||||
|
case DEVICE_MODE_UVEOS_ERA_WAIT_GNSS:
|
||||||
|
state->GSM_State = IDLE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state->GSM_State = INITIALIZING;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetMotionState(tPowerManagement *env, tSystemStateID_0006 *state) {
|
||||||
|
if (GpioPinGet(&env->powerSusystem->main.ignition)) {
|
||||||
|
state->Motion_State = 1;
|
||||||
|
} else {
|
||||||
|
state->Motion_State = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetBattaryState(tPowerManagement *env, tSystemStateID_0006 *state) {
|
||||||
|
if (osMutexAcquire(env->mux_accessPwrMan, 100) == osOK) {
|
||||||
|
resBatState = DeviceTesting_AdcBatteryChargeTest(&env->powerSusystem->battery);
|
||||||
|
osMutexRelease(env->mux_accessPwrMan);
|
||||||
|
switch (resBatState) {
|
||||||
|
case DEVICE_TESTING_CODE_ERROR:
|
||||||
|
state->Battery_State = NO_CHARGE;
|
||||||
|
break;
|
||||||
|
case DEVICE_TESTING_CODE_BATTERY_PRE_CHARGE:
|
||||||
|
state->Battery_State = TRICLE_CHHARGE;
|
||||||
|
break;
|
||||||
|
case DEVICE_TESTING_CODE_BATTERY_FAST_CHARGE:
|
||||||
|
state->Battery_State = FAST_CHARGE;
|
||||||
|
break;
|
||||||
|
case DEVICE_TESTING_CODE_BATTERY_CHARGE_DONE:
|
||||||
|
state->Battery_State = STABILISATION;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state->Battery_State = UNDEFINDET;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetInputLinesState(tGpios *gpios, tInputStatesRecord_0001 *env) {
|
||||||
|
if (GpioPinGet(&gpios->bip.buttons.emergency)) {
|
||||||
|
env->Input_SOS = STATE_RECORD001_ON;
|
||||||
|
} else {
|
||||||
|
env->Input_SOS = STATE_RECORD001_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GpioPinGet(&gpios->bip.buttons.additional)) {
|
||||||
|
env->Input_Service = STATE_RECORD001_ON;
|
||||||
|
} else {
|
||||||
|
env->Input_Service = STATE_RECORD001_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GpioPinGet(&gpios->powerSusystem.main.ignition)) {
|
||||||
|
env->Input_KL15 = STATE_RECORD001_ON;
|
||||||
|
} else {
|
||||||
|
env->Input_KL15 = STATE_RECORD001_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSpowerStatus(tGpios *gpios, tPowerManagement *power, tOutputStatesRecord_0002 *env) {
|
||||||
|
if (GpioPinGet(&power->powerSusystem->sim7600.powerStatus)) {
|
||||||
|
env->OutputMODEM_ON = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->OutputMODEM_ON = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetModemResetState(tGpios *gpios, tPowerManagement *power, tOutputStatesRecord_0002 *env) {
|
||||||
|
if (GpioPinGet(&power->powerSusystem->sim7600.reset)) {
|
||||||
|
env->Output_Modem_Reset = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->Output_Modem_Reset = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetRedLedState(tGpios *gpios, tOutputStatesRecord_0002 *env) {
|
||||||
|
|
||||||
|
if (GpioPinGet(&gpios->bip.led.red)) {
|
||||||
|
env->Output_RED_LED = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->Output_RED_LED = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetRedGreenState(tGpios *gpios, tOutputStatesRecord_0002 *env) {
|
||||||
|
if (GpioPinGet(&gpios->bip.led.green)) {
|
||||||
|
env->Output_GREEN_LED = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->Output_GREEN_LED = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetSimProfileAmount(uint8_t *SimProfileAmount) {
|
||||||
|
*SimProfileAmount = (uint8_t) 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetTCMTimeCalculation(uint8_t *TimeCalculation) {
|
||||||
|
*TimeCalculation = (uint8_t) 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetBoardVoltage(tPowerManagement *power, uint8_t *BoardVoltage) {
|
||||||
|
if (osMutexAcquire(power->mux_accessPwrMan, 100) == osOK) {
|
||||||
|
double BoardVoltageTmp = (double )power->powerSusystem->boardPower.currentBoardVoltage / 1000;
|
||||||
|
*BoardVoltage = (uint8_t) (BoardVoltageTmp / 0.0942);
|
||||||
|
osMutexRelease(power->mux_accessPwrMan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetBatteryCharge(tPowerManagement *power, uint8_t *ReserveBatteryCharge) {
|
||||||
|
if (osMutexAcquire(power->mux_accessPwrMan, 100) == osOK) {
|
||||||
|
|
||||||
|
uint8_t BatteryCharge;
|
||||||
|
|
||||||
|
if (power->powerSusystem->battery.currentBatVoltage < 3300) {
|
||||||
|
BatteryCharge = 0;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (power->powerSusystem->battery.currentBatVoltage > 4200) {
|
||||||
|
BatteryCharge = 100;
|
||||||
|
} else {
|
||||||
|
BatteryCharge = ((power->powerSusystem->battery.currentBatVoltage - 3300) * 100) / (4200 - 3300);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*ReserveBatteryCharge = (uint8_t) (BatteryCharge / 0.3922);
|
||||||
|
osMutexRelease(power->mux_accessPwrMan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetBatteryCargeState(tGpios *gpios, tOutputStatesRecord_0002 *env) {
|
||||||
|
if (GpioPinGet(&gpios->powerSusystem.battery.charge)) {
|
||||||
|
env->Output_ON_Charg = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->Output_ON_Charg = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetMuteState(tGpios *gpios, tPowerManagement *power, tOutputStatesRecord_0002 *env) {
|
||||||
|
if (Pwm_GetMuteInCarState(power)) {
|
||||||
|
env->Output_Mute = STATE_RECORD002_ON;
|
||||||
|
} else {
|
||||||
|
env->Output_Mute = STATE_RECORD002_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double cConvertDecToGradus(double dec) {
|
||||||
|
int deg = 0, min = 0;
|
||||||
|
double sec = 0.0;
|
||||||
|
double _dec = dec;
|
||||||
|
|
||||||
|
deg = (int) (_dec / 100);
|
||||||
|
min = (int) (_dec) - (deg * 100);
|
||||||
|
sec = (double) (_dec - min - 100 * deg) * 60.0;
|
||||||
|
double gradus = deg + min / 60.0 + sec / 3600.0;
|
||||||
|
|
||||||
|
return gradus;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetNavData(tNmeaRmc *nmeaRmc, tVehicleCoordinates *vehicleCoordinates) {
|
||||||
|
if (nmeaRmc->status == 'A') {
|
||||||
|
|
||||||
|
double latitude = cConvertDecToGradus(nmeaRmc->location.latitude);
|
||||||
|
double longitude = cConvertDecToGradus(nmeaRmc->location.longitude);
|
||||||
|
|
||||||
|
vehicleCoordinates->vehicleLatitude = (uint32_t) ((latitude + 90) * 3600000);
|
||||||
|
vehicleCoordinates->vehicleLongitude = (uint32_t) ((longitude + 180) * 3600000);
|
||||||
|
} else {
|
||||||
|
vehicleCoordinates->vehicleLatitude = 0xFFFFFFFF;
|
||||||
|
vehicleCoordinates->vehicleLongitude = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetReliabilityNavData(tNmeaRmc *nmeaRmc, uint8_t *vehicleCoordinatesReliability) {
|
||||||
|
if (nmeaRmc->status == 'A') {
|
||||||
|
*vehicleCoordinatesReliability = 1;
|
||||||
|
} else if (nmeaRmc->status == 'V') {
|
||||||
|
*vehicleCoordinatesReliability = 0;
|
||||||
|
} else {
|
||||||
|
*vehicleCoordinatesReliability = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetRegState(tGsmWithGnss *gsmWithGnss, uint8_t *gsmRegistrationState) {
|
||||||
|
if (gsmRegistrationState != NULL) {
|
||||||
|
if (gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_NOT_REGISTERED) {
|
||||||
|
*gsmRegistrationState = 0;
|
||||||
|
}
|
||||||
|
if (gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_REGISTERED_HOME) {
|
||||||
|
*gsmRegistrationState = 1;
|
||||||
|
}
|
||||||
|
if (gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_REGISTERED_ROAMING) {
|
||||||
|
*gsmRegistrationState = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetErorModemState(tGsmWithGnss *gsmWithGnss, uint8_t *gsmInnerError) {
|
||||||
|
if (gsmWithGnss->gsmState == GSM_INITIALIZING) {
|
||||||
|
*gsmInnerError = 0;
|
||||||
|
}
|
||||||
|
if (gsmWithGnss->gsmState == GSM_IDLE) {
|
||||||
|
*gsmInnerError = 1;
|
||||||
|
}
|
||||||
|
if (gsmWithGnss->gsmState == GSM_ERROR) {
|
||||||
|
*gsmInnerError = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetSimProfile(const uint8_t *SimProfile) {
|
||||||
|
SimProfile = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemGetVehCoorReliabilityMem(tNmeaRmc *nmeaRmc, uint8_t *vehicleCoordinatesReliabilityMem) {
|
||||||
|
if (nmeaRmc->status == 'A') {
|
||||||
|
*vehicleCoordinatesReliabilityMem = 1;
|
||||||
|
} else if (nmeaRmc->status == 'V') {
|
||||||
|
*vehicleCoordinatesReliabilityMem = 0;
|
||||||
|
} else {
|
||||||
|
*vehicleCoordinatesReliabilityMem = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Mma_InfoSystemGetEcallState(tEraGlonassUveos *eraGlonassUveos, uint8_t *EcallOn){
|
||||||
|
if (eraGlonassUveos->fl_ecallState == true) {
|
||||||
|
*EcallOn = true;
|
||||||
|
} else {
|
||||||
|
*EcallOn = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetTimeStamp(tRtcIO *rtcI0, uint32_t *TimeStamp) {
|
||||||
|
time_t timeThis;
|
||||||
|
RtcGet(rtcI0, &timeThis);
|
||||||
|
if(timeThis > 1727941386){
|
||||||
|
*TimeStamp = timeThis;
|
||||||
|
} else {
|
||||||
|
*TimeStamp = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InfoToUDS_InitSetDefault(tMma *env) {
|
||||||
|
env->InputStatesRecord_0001.Input_SOS = STATE_RECORD001_UNDEFINDET;
|
||||||
|
env->InputStatesRecord_0001.Input_Service = STATE_RECORD001_UNDEFINDET;
|
||||||
|
env->InputStatesRecord_0001.Input_KL15 = STATE_RECORD001_UNDEFINDET;
|
||||||
|
env->InputStatesRecord_0001.Input_ACC = STATE_RECORD001_UNDEFINDET;
|
||||||
|
env->InputStatesRecord_0001.Reserved = STATE_RECORD001_NOT_USED;
|
||||||
|
env->InputStatesRecord_0001.Input_3 = STATE_RECORD001_NOT_USED;
|
||||||
|
env->InputStatesRecord_0001.Input_ENS = STATE_RECORD001_NOT_USED;
|
||||||
|
|
||||||
|
env->OutputStatesRecord_0002.NotUsed1 = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_SOS_LED = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_SERVICE_LED = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.NotUsed2 = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.NotUsed3 = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.OutputMODEM_ON = STATE_RECORD002_UNDEFINDET;
|
||||||
|
env->OutputStatesRecord_0002.OutputCheckACC = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.OutputEN_CAN = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_ON_OFF_Mode = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_ON_Charg = STATE_RECORD002_UNDEFINDET;
|
||||||
|
env->OutputStatesRecord_0002.Output_RED_LED = STATE_RECORD002_UNDEFINDET;
|
||||||
|
env->OutputStatesRecord_0002.Output_GREEN_LED = STATE_RECORD002_UNDEFINDET;
|
||||||
|
env->OutputStatesRecord_0002.Output_EN_VMIC = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_Modem_Wake = STATE_RECORD002_NOT_USED;
|
||||||
|
env->OutputStatesRecord_0002.Output_Modem_Reset = STATE_RECORD002_UNDEFINDET;
|
||||||
|
env->OutputStatesRecord_0002.Output_Mute = STATE_RECORD002_UNDEFINDET;
|
||||||
|
|
||||||
|
env->SystemStateID_0006.Comfort_State = 2;
|
||||||
|
env->SystemStateID_0006.Airbag_State = 5;
|
||||||
|
env->SystemStateID_0006.TCM_State = 1;
|
||||||
|
env->SystemStateID_0006.Reserved2 = 2;
|
||||||
|
env->SystemStateID_0006.Battery_State = 7;
|
||||||
|
env->SystemStateID_0006.Motion_State = 3;
|
||||||
|
env->SystemStateID_0006.Reserved3 = 2;
|
||||||
|
env->SystemStateID_0006.RolloverAngleStatus = 0;
|
||||||
|
env->SystemStateID_0006.GSM_State = INITIALIZING;
|
||||||
|
|
||||||
|
env->state.GsmInnerError = 0;
|
||||||
|
env->state.GsmRegistrationState = 0;
|
||||||
|
env->state.VehicleCoordinates.vehicleLongitude = 0xFFFFFFFF;
|
||||||
|
env->state.VehicleCoordinates.vehicleLatitude = 0xFFFFFFFF;
|
||||||
|
env->state.VehicleCoordinatesReliability = 2;
|
||||||
|
env->state.ReserveBatteryTemperature = 80;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemGetGSMSoftwareVersionNumber(tString32 *env, const bool *modemState, char *GSMSoftwareVersionNumber){
|
||||||
|
if(*modemState == true) {
|
||||||
|
uint8_t length = env->length;
|
||||||
|
if(length>20){
|
||||||
|
length = 20;
|
||||||
|
}
|
||||||
|
memcpy(GSMSoftwareVersionNumber, env->data, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_InfoSystemToUDSGetGsmRegistrationError(tGsmWithGnss *gsmWithGnss, const bool *modemState, uint8_t *GsmRegistrationError){
|
||||||
|
if(*modemState == true) {
|
||||||
|
if (GsmRegistrationError != NULL) {
|
||||||
|
if (
|
||||||
|
gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_REGISTERED_HOME ||
|
||||||
|
gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_REGISTERED_ROAMING
|
||||||
|
) {
|
||||||
|
*GsmRegistrationError = 1;
|
||||||
|
} else if (gsmWithGnss->regState == AT_NETWORK_REGISTRATION_STATE_REGISTRATION_DENIED) {
|
||||||
|
*GsmRegistrationError = 2;
|
||||||
|
} else {
|
||||||
|
*GsmRegistrationError = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static _Noreturn void Mma_InfoSystemToUDSThread(tMma *env) {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поток передачи состояния устройства через UDS протокол запущен")
|
||||||
|
// GsmRegistartionStateMem
|
||||||
|
while (1) {
|
||||||
|
|
||||||
|
env->state.MDS_FormatVersion = 2;
|
||||||
|
Mma_InfoSystemToUDSGetSimProfileAmount(&env->state.SimProfileAmount);
|
||||||
|
Mma_InfoSystemToUDSGetTCMTimeCalculation(&env->state.TCM_time_calculation);
|
||||||
|
Mma_InfoSystemToUDSGetBoardVoltage(&env->power, &env->state.BoardVoltage);
|
||||||
|
Mma_InfoSystemToUDSGetBatteryCharge(&env->power, &env->state.ReserveBatteryCharge);
|
||||||
|
Mma_InfoSystemToUDSGetTimeStamp(&env->rtc->rtcI0, &env->state.TimeStamp);
|
||||||
|
Mma_InfoSystemToUDSGetSimProfile(&env->state.SimProfile);
|
||||||
|
Mma_InfoSystemToUDSGetErorModemState(&env->gsmWithGnss, &env->state.GsmInnerError);
|
||||||
|
Mma_InfoSystemToUDSGetRegState( &env->gsmWithGnss, &env->state.GsmRegistrationState);
|
||||||
|
Mma_InfoSystemToUDSGetNavData(&env->gsmWithGnss.gnss.currentRmc, &env->state.VehicleCoordinates);
|
||||||
|
Mma_InfoSystemToUDSGetReliabilityNavData(&env->gsmWithGnss.gnss.currentRmc, &env->state.VehicleCoordinatesReliability);
|
||||||
|
Mma_InfoSystemToUDSGetInputLinesState(env->gpios, &env->InputStatesRecord_0001);
|
||||||
|
Mma_InfoSystemToUDSGetModemResetState(env->gpios, &env->power, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSGetRedLedState(env->gpios, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSGetRedGreenState(env->gpios, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSGetBatteryCargeState(env->gpios, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSGetMuteState(env->gpios, &env->power, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSpowerStatus(env->gpios, &env->power, &env->OutputStatesRecord_0002);
|
||||||
|
Mma_InfoSystemToUDSGetModemState(&env->ModemDataCollector, &env->indication.mode, &env->SystemStateID_0006);
|
||||||
|
Mma_InfoSystemToUDSGetBattaryState(&env->power, &env->SystemStateID_0006);
|
||||||
|
Mma_InfoSystemToUDSGetMotionState(&env->power, &env->SystemStateID_0006);
|
||||||
|
|
||||||
|
Mma_InfoSystemToUDSGetGsmRegistrationError(
|
||||||
|
&env->gsmWithGnss,
|
||||||
|
&env->ModemDataCollector.fl_IsLoad,
|
||||||
|
&env->state.GsmRegistrationError
|
||||||
|
);
|
||||||
|
|
||||||
|
Mma_InfoSystemGetGSMSoftwareVersionNumber(
|
||||||
|
&env->ModemDataCollector.modemVersionRevision.softValue,
|
||||||
|
&env->ModemDataCollector.fl_IsLoad,
|
||||||
|
env->state.GSMSoftwareVersionNumber
|
||||||
|
);
|
||||||
|
SystemDelayMs(4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TMR2_CanMute_Start(tMma *env){
|
||||||
|
crm_clocks_freq_get(&crm_clocks_freq_structure);
|
||||||
|
crm_periph_clock_enable(CRM_TMR8_PERIPH_CLOCK, TRUE);
|
||||||
|
uint32_t tmr = (crm_clocks_freq_structure.apb2_freq * 2 / 10000) - 1;
|
||||||
|
tmr = tmr/100;
|
||||||
|
tmr_base_init(TMR8, 9990, tmr);
|
||||||
|
tmr_cnt_dir_set(TMR8, TMR_COUNT_UP);
|
||||||
|
tmr_interrupt_enable(TMR8, TMR_OVF_INT, TRUE);
|
||||||
|
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
|
||||||
|
nvic_irq_enable(TMR8_OVF_TMR13_IRQn, 0x59, 0);
|
||||||
|
tmr_counter_enable(TMR8, TRUE);
|
||||||
|
uint32_t tmStop = SystemGetMs() - env->tmStart;
|
||||||
|
tmStop = tmStop;
|
||||||
|
}
|
||||||
|
|
||||||
|
//uint32_t tm;
|
||||||
|
//uint16_t ms[1000];
|
||||||
|
//volatile uint16_t i = 0;
|
||||||
|
//volatile uint16_t o = 0;
|
||||||
|
//volatile uint32_t ttt = 0;
|
||||||
|
//volatile uint32_t aa = 0;
|
||||||
|
void TMR8_OVF_TMR13_IRQHandler()
|
||||||
|
{
|
||||||
|
if(tmr_interrupt_flag_get(TMR8, TMR_OVF_FLAG) == SET)
|
||||||
|
{
|
||||||
|
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
|
||||||
|
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_GNSS);
|
||||||
|
|
||||||
|
// if(o == 1000){
|
||||||
|
// o=0;
|
||||||
|
// }
|
||||||
|
// aa = SystemGetMs();
|
||||||
|
// if(ttt > aa){
|
||||||
|
// ++i;
|
||||||
|
// } else {
|
||||||
|
// ms[o] = i;
|
||||||
|
// i=0;
|
||||||
|
// o++;
|
||||||
|
// ttt = SystemGetMs()+1000;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
tmr_flag_clear(TMR8, TMR_OVF_FLAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserInputInfoSystemToUDS(tMma *env) {
|
||||||
|
InitThreadAtrStatic(&env->threadToUDS_Info.attr, "Thread_Uds", env->threadToUDS_Info.controlBlock,
|
||||||
|
env->threadToUDS_Info.stack, osPriorityNormal);
|
||||||
|
if (!env->threadToUDS_Info.id) {
|
||||||
|
env->threadToUDS_Info.id = osThreadNew(
|
||||||
|
(osThreadFunc_t) (Mma_InfoSystemToUDSThread),
|
||||||
|
(void *) (env),
|
||||||
|
&env->threadToUDS_Info.attr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,188 @@
|
||||||
|
//
|
||||||
|
// Created by xemon on 19.09.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SMART_COMPONENTS_MAINMODESARBITER_H
|
||||||
|
#define SMART_COMPONENTS_MAINMODESARBITER_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "I2cPorts.h"
|
||||||
|
#include "Rtcs.h"
|
||||||
|
#include "Gpios.h"
|
||||||
|
#include "SerialPorts.h"
|
||||||
|
#include "Adcs.h"
|
||||||
|
#include "StorageOnFlash.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "DeviceStorage.h"
|
||||||
|
#include "AudioCodec.h"
|
||||||
|
#include "GsmWithGnss.h"
|
||||||
|
#include "Accel.h"
|
||||||
|
#include "LoggerToSerialPort.h"
|
||||||
|
#include "CrashDetection.h"
|
||||||
|
#include "ComInt.h"
|
||||||
|
#include "ComandLineInterface.h"
|
||||||
|
#include "DeviceTesting_Env.h"
|
||||||
|
#include "SignaturePduSpecific.h"
|
||||||
|
#include "Amplifier.h"
|
||||||
|
#include <EraGlonassUveos.h>
|
||||||
|
#include <PowerManagment.h>
|
||||||
|
#include "CanPorts.h"
|
||||||
|
#include "ext_telematica.h"
|
||||||
|
#include "AudioPlayerSimComSim7600E.h"
|
||||||
|
#include "AudioRecorderSimComSim7600E.h"
|
||||||
|
#include "ModemDataCollector.h"
|
||||||
|
#include "TelematicaConnectStatus.h"
|
||||||
|
#include "SubsystemSwitcher.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
// Преферийные интерфесы
|
||||||
|
tGpios *gpios;
|
||||||
|
tSerialPorts *serialPorts;
|
||||||
|
tI2cPorts *i2cPorts;
|
||||||
|
tSpiPorts *spiPorts;
|
||||||
|
tAdcs *adcs;
|
||||||
|
tStorageOnFlash *flash;
|
||||||
|
tRtcs *rtc;
|
||||||
|
tCanPorts *canPorts;
|
||||||
|
|
||||||
|
// Преферийные устройства
|
||||||
|
tDeviceStorage storage;
|
||||||
|
tPowerManagement power;
|
||||||
|
tAudioCodec audioCodec;
|
||||||
|
tAmplifier amplifier;
|
||||||
|
tGsmWithGnss gsmWithGnss;
|
||||||
|
tAccel *accel;
|
||||||
|
tAudioPlayer audioPlayer;
|
||||||
|
tAudioRecorder audioRecorder;
|
||||||
|
//Подсистемы
|
||||||
|
tLoggerToSerialPort slog;
|
||||||
|
tUserInput userInput;
|
||||||
|
tUserIndication indication;
|
||||||
|
tComInt comInt;
|
||||||
|
// tCli cli;
|
||||||
|
tCli cliVrt;
|
||||||
|
tModemDataColl ModemDataCollector;
|
||||||
|
tDeviceTesting testing;
|
||||||
|
|
||||||
|
tCrashDetection crashDetect;
|
||||||
|
tEraGlonassUveos uveos;
|
||||||
|
tSystemSelector systemSelector;
|
||||||
|
uint32_t lastSmsCheckTime;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
osThreadId_t id;
|
||||||
|
uint32_t stack[4048]; //4048 6072
|
||||||
|
StaticTask_t controlBlock;
|
||||||
|
osThreadAttr_t attr;
|
||||||
|
} thread;
|
||||||
|
|
||||||
|
tSystemStateID_0006 SystemStateID_0006;
|
||||||
|
tInputStatesRecord_0001 InputStatesRecord_0001;
|
||||||
|
tOutputStatesRecord_0002 OutputStatesRecord_0002;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
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[32]; // 20
|
||||||
|
char SmsFallbackTestNumber[20]; // 20
|
||||||
|
uint8_t SimProfileAmount;
|
||||||
|
uint8_t SimProfile;
|
||||||
|
uint8_t AudioProfile;
|
||||||
|
uint8_t EcallNoAutomaticTriggering;
|
||||||
|
uint8_t MiddletState;
|
||||||
|
char Vehicle_SW_Version[3]; // 3
|
||||||
|
char Midlet_SW_Version[3]; // 3
|
||||||
|
char Boot_SW_Version[27]; // 27
|
||||||
|
uint8_t SertState;
|
||||||
|
uint16_t ApplicationCheckSum;
|
||||||
|
uint8_t Audio_HW_Settings;
|
||||||
|
tEmergencyCallCounter ECALL_EmergencyCallCounter;
|
||||||
|
char Avaialble_Networks_List[128]; //128
|
||||||
|
uint8_t SavedMSDAmount;
|
||||||
|
uint8_t SentMSDAmount;
|
||||||
|
char VehicleManufacturerSparePartNumber[10]; //10
|
||||||
|
char ConfigurationFileReferenceLink[10]; //10
|
||||||
|
char SystemSupplierIdentifier[3]; //3
|
||||||
|
char ECUSerialNumber[20]; //20
|
||||||
|
char VehicleManufacturerECUHardwareNumber[10]; //10
|
||||||
|
char SystemSupplierECUSoftwareNumber[2]; //2
|
||||||
|
char SystemSupplierECUSoftwareVersionNumber[2]; //2
|
||||||
|
uint8_t VDIAG;
|
||||||
|
} state;
|
||||||
|
|
||||||
|
bool flIgn;
|
||||||
|
bool playMode;
|
||||||
|
bool fl_iniSysIsDone;
|
||||||
|
|
||||||
|
tStaticThreadBlock(128) threadSubstartChekButton;
|
||||||
|
tStaticThreadBlock(512) threadAccompanMode;
|
||||||
|
tStaticThreadBlock(512) threadToUDS_Info;
|
||||||
|
|
||||||
|
tSignPack signature;
|
||||||
|
uint8_t userInputSubstart;
|
||||||
|
eQueryUDSState queryUDSState;
|
||||||
|
osMutexId_t mux_factoryMode;
|
||||||
|
uint32_t tmt;
|
||||||
|
uint32_t tmpTm;
|
||||||
|
uint32_t tm_FactoryMessage;
|
||||||
|
bool checNetDeGeg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Флаг очистки переменных EOL
|
||||||
|
*/
|
||||||
|
bool eolAcsess;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Флаг проверки нахождения в режиме производственного теста
|
||||||
|
*/
|
||||||
|
bool fl_isFacrotyMode;
|
||||||
|
|
||||||
|
|
||||||
|
eTelematicaIsConnect telematicaIsConnect;
|
||||||
|
tGNSS_General GNSS_General;
|
||||||
|
eLastEventDevice lastEventDevice;
|
||||||
|
eCarType carType;
|
||||||
|
uint32_t tmStart;
|
||||||
|
tSystemSwitcher systemSwitcher;
|
||||||
|
} tMma;
|
||||||
|
|
||||||
|
void Mma_Init(
|
||||||
|
tMma *env,
|
||||||
|
tGpios *gpios,
|
||||||
|
tSerialPorts *serialPorts,
|
||||||
|
tI2cPorts *i2cPorts,
|
||||||
|
tSpiPorts *spiPorts,
|
||||||
|
tAdcs *adcs,
|
||||||
|
tStorageOnFlash *flash,
|
||||||
|
tRtcs *rtc,
|
||||||
|
tCanPorts *canPorts
|
||||||
|
);
|
||||||
|
|
||||||
|
void Mma_StartThread(tMma *env);
|
||||||
|
|
||||||
|
void AccompanModeStopThread(tMma *env);
|
||||||
|
|
||||||
|
#define Mma_SetMode(ENV, VALUE) UserIndication_SetMode(&((ENV)->indication),(VALUE))
|
||||||
|
|
||||||
|
#endif //SMART_COMPONENTS_MAINMODESARBITER_H
|
||||||
|
|
@ -0,0 +1,239 @@
|
||||||
|
//
|
||||||
|
// Created by zemon on 18.10.24.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "MainModesArbiter_Private.h"
|
||||||
|
#include "PointEvent.h"
|
||||||
|
|
||||||
|
#define LOG_SIGN "Главн."
|
||||||
|
#define LOGGER &env->slog.logger
|
||||||
|
|
||||||
|
void Mma_ProcessCallAnswer(tMma *env) {
|
||||||
|
env->testing.queryUDSState->state = QUERY_BUSY;
|
||||||
|
|
||||||
|
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
|
||||||
|
if(subSystemsTmp != UVEOS) {
|
||||||
|
SystemSelector(&env->systemSwitcher, UVEOS);
|
||||||
|
}
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Получен вызов от оператора");
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включение аудио подсистемы");
|
||||||
|
Mma_AudioSubSystemStart(&env->power, &env->amplifier);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включение линии ecall в бортовой сети ТС");
|
||||||
|
GpioPinEnable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "audio_on.mp3", 4*1000);
|
||||||
|
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
AtGsmAnswer(&env->gsmWithGnss.gsmAt);
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления AtGsmAnswer")
|
||||||
|
}
|
||||||
|
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора принят");
|
||||||
|
env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_IN_CALL);
|
||||||
|
while (GsmWithGnss_isInpCallActive(&env->gsmWithGnss)) {
|
||||||
|
env->uveos.fl_ecallState = true;
|
||||||
|
SystemDelayMs(500);
|
||||||
|
}
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора завершён");
|
||||||
|
|
||||||
|
AtCommandResult res = AtGsmHangUpCall(&env->gsmWithGnss.gsmAt);
|
||||||
|
while (res != AT_OK) {
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
res = AtGsmHangUpCall(&env->gsmWithGnss.gsmAt);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Освобождение управления 21");
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления AtGsmHangUpCall")
|
||||||
|
}
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поднят HangUp");
|
||||||
|
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
GsmWithGnss_resetInputCall(&env->gsmWithGnss);
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления GsmWithGnss_resetInputCall")
|
||||||
|
}
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполнен сброс Ринга");
|
||||||
|
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4*1000);
|
||||||
|
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание УНЧ отключено");
|
||||||
|
Mma_AudioSubSystemRelease(env);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сигнал MUTE отключен от бортовой сети ");
|
||||||
|
Pwm_SetMuteInCar(&env->power, false);
|
||||||
|
GpioPinDisable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
env->uveos.fl_ecallState = false;
|
||||||
|
env->testing.queryUDSState->state = QUERY_STOP;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_ReleaseEcallSubSystems(tMma *env) {
|
||||||
|
GpioPinDisable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
EraGlonassEcallProvider_HangupEcl(env->uveos.ecallProvider);
|
||||||
|
|
||||||
|
StopResiver(&env->gsmWithGnss);
|
||||||
|
HotStartGNSS(&env->gsmWithGnss);
|
||||||
|
|
||||||
|
GpioPinDisable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
|
||||||
|
#if (AURUS_CAR_UI == 1)
|
||||||
|
AudioPlayer_PlayStaticTone(env->uveos.audioPlayerIO,1);
|
||||||
|
#endif
|
||||||
|
#if (AURUS_CAR_UI == 0)
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4 * 1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EraGlonassUveos_SetTimings(&env->uveos);
|
||||||
|
SystemDelayMs(4000);
|
||||||
|
|
||||||
|
Mma_AudioSubSystemRelease(env);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обработка экстренной ситуации завершена")
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_EcallManual(tMma *env) {
|
||||||
|
///* fix GNSS_General
|
||||||
|
AccompanModeStopThread(env);
|
||||||
|
EraGlonassUveos_SetTimings(&env->uveos);
|
||||||
|
env->testing.queryUDSState->state = QUERY_BUSY;
|
||||||
|
|
||||||
|
setGeneralGNSS(env,
|
||||||
|
CAN_GNSS_CALL,
|
||||||
|
CAN_GNSS_NO_MALFUNCTIONS,
|
||||||
|
CAN_GNSS_NO_ROLLOVER_DETECT,
|
||||||
|
CAN_GNSS_CALL_TEST_NOT_ACTIVE
|
||||||
|
);
|
||||||
|
|
||||||
|
env->uveos.fl_ecallState = true;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_MANUAL_BEGIN);
|
||||||
|
Mma_AudioSubSystemRequire(env);
|
||||||
|
|
||||||
|
#if (AURUS_CAR_UI == 1)
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "emerCool_aurus.mp3", 5*1000);
|
||||||
|
#endif
|
||||||
|
#if (AURUS_CAR_UI == 0)
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "ecall_on.mp3", 5*1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
|
||||||
|
eEgtsEventTetedata egtsEventTetedata = EVENT_USER_CALL;
|
||||||
|
EXT_ENV_ADR_TELE.tele_func(&egtsEventTetedata, TELE_MODULE_ADD_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemSelector(&env->systemSwitcher, UVEOS);
|
||||||
|
|
||||||
|
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
|
||||||
|
if(subSystemsTmp != UVEOS) {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "ОШИБКА ВЫПОЛНЕНИЯ ПРОЦЕДУРЫ ЭКСТРЕННОГО ВЫЗОВА");
|
||||||
|
if(env->ModemDataCollector.modemVersionRevision.valid_CCID != MOD_READY) {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "ОШИБКА СИМ ЧИПА");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mma_NetworkRequire(env);
|
||||||
|
GpioPinEnable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
|
||||||
|
env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
|
||||||
|
|
||||||
|
/// Очистка нажатий перед началом ECALL
|
||||||
|
/// для избежания случайной отмены вызова
|
||||||
|
UserButtons_Clear(&env->userInput.buttonsInterface);
|
||||||
|
|
||||||
|
eEraGlonassUveos_EcallProcessingResult res = EraGlonassUveos_ManualEmergencyCall(&env->uveos);
|
||||||
|
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
GsmWithGnss_ResetRing(&env->gsmWithGnss);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сброс URC RING выполнен 2");
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления, сброс URC RING 2")
|
||||||
|
}
|
||||||
|
|
||||||
|
env->uveos.fl_ecallState = false;
|
||||||
|
Mma_ReleaseEcallSubSystems(env);
|
||||||
|
|
||||||
|
/// Очистка нажатий после ECALL
|
||||||
|
/// для избежания случайного вызова
|
||||||
|
UserButtons_Clear(&env->userInput.buttonsInterface);
|
||||||
|
|
||||||
|
setGeneralGNSS(env,
|
||||||
|
CAN_GNSS_NO_CALL,
|
||||||
|
CAN_GNSS_NO_MALFUNCTIONS,
|
||||||
|
CAN_GNSS_NO_ROLLOVER_DETECT,
|
||||||
|
CAN_GNSS_CALL_TEST_NOT_ACTIVE
|
||||||
|
);
|
||||||
|
|
||||||
|
env->testing.queryUDSState->state = QUERY_STOP;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
|
||||||
|
AccompanModeStartThread(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mma_EcallAutomatic(tMma *env, tUveosEmergencyEvent emergencyEvent) {
|
||||||
|
AccompanModeStopThread(env);
|
||||||
|
EraGlonassUveos_SetTimings(&env->uveos);
|
||||||
|
env->testing.queryUDSState->state = QUERY_BUSY;
|
||||||
|
|
||||||
|
if(emergencyEvent.isFlip) {
|
||||||
|
setGeneralGNSS(env,
|
||||||
|
CAN_GNSS_NO_CALL,
|
||||||
|
CAN_GNSS_NO_MALFUNCTIONS,
|
||||||
|
CAN_GNSS_ROLLOVER_DETECT,
|
||||||
|
CAN_GNSS_CALL_TEST_NOT_ACTIVE
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
setGeneralGNSS(env,
|
||||||
|
CAN_GNSS_NO_CALL,
|
||||||
|
CAN_GNSS_NO_MALFUNCTIONS,
|
||||||
|
CAN_GNSS_NO_ROLLOVER_DETECT,
|
||||||
|
CAN_GNSS_CALL_TEST_NOT_ACTIVE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
env->uveos.fl_ecallState = true;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_AUTOMATIC_BEGIN);
|
||||||
|
Mma_AudioSubSystemRequire(env);
|
||||||
|
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "ecall_on.mp3", 5*1000);
|
||||||
|
|
||||||
|
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
|
||||||
|
eEgtsEventTetedata egtsEventTetedata = EVENT_EMERGENCY_CALL;
|
||||||
|
EXT_ENV_ADR_TELE.tele_func(&egtsEventTetedata, TELE_MODULE_ADD_EVENT);
|
||||||
|
if(emergencyEvent.isFlip){
|
||||||
|
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_FUEL_CUT_OFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemSelector(&env->systemSwitcher, UVEOS);
|
||||||
|
|
||||||
|
Mma_NetworkRequire(env);
|
||||||
|
GpioPinEnable(&env->power.powerSusystem->main.ecallOut);
|
||||||
|
|
||||||
|
eEraGlonassUveos_EcallProcessingResult res = EraGlonassUveos_ProcessingEmergencyEvent(&env->uveos, &emergencyEvent);
|
||||||
|
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
GsmWithGnss_ResetRing(&env->gsmWithGnss);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сброс URC RING выполнен 3");
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления, сброс URC RING 3")
|
||||||
|
}
|
||||||
|
|
||||||
|
Mma_ReleaseEcallSubSystems(env);
|
||||||
|
env->uveos.fl_ecallState = false;
|
||||||
|
|
||||||
|
setGeneralGNSS(env,
|
||||||
|
CAN_GNSS_NO_CALL,
|
||||||
|
CAN_GNSS_NO_MALFUNCTIONS,
|
||||||
|
CAN_GNSS_NO_ROLLOVER_DETECT,
|
||||||
|
CAN_GNSS_CALL_TEST_NOT_ACTIVE
|
||||||
|
);
|
||||||
|
|
||||||
|
env->testing.queryUDSState->state = QUERY_STOP;
|
||||||
|
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
|
||||||
|
AccompanModeStartThread(env);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
//
|
||||||
|
// Created by xemon on 09.01.23.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "MainModesArbiter_Private.h"
|
||||||
|
#include <AtGsmSms_Utils.h>
|
||||||
|
|
||||||
|
#define LOG_SIGN "Главн. sms"
|
||||||
|
#define LOGGER &env->slog.logger
|
||||||
|
|
||||||
|
void Mma_DeletSms(tMma *env) {
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
|
||||||
|
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AtCommandResult Mma_CheckIncomingSms(tMma *env) {
|
||||||
|
|
||||||
|
if (env->lastSmsCheckTime > SystemGetMs()) {
|
||||||
|
return AT_NONE;
|
||||||
|
}
|
||||||
|
env->lastSmsCheckTime = SystemGetMs() + 8000;
|
||||||
|
|
||||||
|
uint8_t binaryData[255];
|
||||||
|
memset(binaryData, 0, sizeof(binaryData));
|
||||||
|
uint16_t binaryDataSize = 0;
|
||||||
|
|
||||||
|
AtCommandResult resultReadPdu = AtGsmSms_UtilsReadPduData(&env->gsmWithGnss.gsmAt, binaryData, &binaryDataSize, sizeof(binaryData));
|
||||||
|
if (resultReadPdu == AT_OK) {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Получена команда посредствам СМС");
|
||||||
|
if (binaryDataSize) {
|
||||||
|
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
|
||||||
|
SystemSelector(&env->systemSwitcher, UVEOS);
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Команда содержит EGTS пакет");
|
||||||
|
Mma_AudioSubSystemRequire(env);
|
||||||
|
Mma_NetworkRequire(env);
|
||||||
|
|
||||||
|
bool res = EraGlonassUveos_ProcessEgtsPacket(&env->uveos, &env->storage, binaryData, binaryDataSize);
|
||||||
|
|
||||||
|
if(
|
||||||
|
(env->indication.mode == DEVICE_MODE_UVEOS_ERA_WAIT_GNSS) ||
|
||||||
|
(env->indication.mode == DEVICE_MODE_UVEOS_ERA_GNSS_READY)
|
||||||
|
){
|
||||||
|
Mma_AudioSubSystemRelease(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res == true) {
|
||||||
|
StopResiver(&env->gsmWithGnss);
|
||||||
|
HotStartGNSS(&env->gsmWithGnss);
|
||||||
|
}
|
||||||
|
SystemSelector(&env->systemSwitcher, subSystemsTmp);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Команда не содержит EGTS пакета");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t t = SystemGetMs() + 2000;
|
||||||
|
while (t > SystemGetMs()){
|
||||||
|
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 100) == osOK) {
|
||||||
|
if(AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt) == AT_OK){
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
return AT_OK;
|
||||||
|
}
|
||||||
|
osMutexRelease(env->gsmWithGnss.gsmAt.access);
|
||||||
|
}
|
||||||
|
SystemDelayMs(40);
|
||||||
|
}
|
||||||
|
return AT_TIMEOUT;
|
||||||
|
} else {
|
||||||
|
return resultReadPdu;
|
||||||
|
}
|
||||||
|
return resultReadPdu;
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,122 @@
|
||||||
|
//
|
||||||
|
// Created by xemon on 11.12.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UVEOS_ON_NATION_MAINMODESARBITER_PRIVATE_H
|
||||||
|
#define UVEOS_ON_NATION_MAINMODESARBITER_PRIVATE_H
|
||||||
|
|
||||||
|
#include "MainModesArbiter.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define Mma_SetMode(ENV, VALUE) UserIndication_SetMode(&((ENV)->indication),(VALUE))
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SUB_START_MODE_UNDEF = 0,
|
||||||
|
SUB_START_MODE_EMER = 1,
|
||||||
|
SUB_START_MODE_TESTING = 2,
|
||||||
|
SUB_START_MODE_NOT_SEND_MSD = 3,
|
||||||
|
} tSubStartMode;
|
||||||
|
|
||||||
|
eCarType Mma_GetCarType(tString32 *env);
|
||||||
|
|
||||||
|
void Mma_RunShortTest(tMma *env, bool blocEcall);
|
||||||
|
|
||||||
|
void Mma_InitGSM_AudioProfile(tMma *env);
|
||||||
|
|
||||||
|
tDeviceModes *UserIndication_GetMode(tMma *env);
|
||||||
|
|
||||||
|
void Mma_ReleaseEcallSubSystems(tMma *env);
|
||||||
|
|
||||||
|
void Mma_ProcessCallAnswer(tMma *env);
|
||||||
|
|
||||||
|
void Mma_InitCrachDetectSettings(tMma *env);
|
||||||
|
|
||||||
|
void Mma_SubstartTelematica(tMma *env);
|
||||||
|
|
||||||
|
void Mma_AccompanMode(tMma *env);
|
||||||
|
|
||||||
|
void Mma_ClearParams(tMma *env);
|
||||||
|
|
||||||
|
void Mma_PassedMode(tMma *env);
|
||||||
|
|
||||||
|
static _Noreturn void Mma_UserInputSubstartButtonThread(tMma *env);
|
||||||
|
|
||||||
|
void InfoToUDS_InitSetDefault(tMma *env);
|
||||||
|
|
||||||
|
void Mma_SystemSelector(tMma *env, eSubSystems subSystems);
|
||||||
|
|
||||||
|
void Mma_SelectorOneSystem(tMma *env, eSubSystems subSystems);
|
||||||
|
|
||||||
|
void Mma_RunTests(tMma *env);
|
||||||
|
|
||||||
|
void Mma_gnssUpdateIndication(tMma *env);
|
||||||
|
|
||||||
|
void Mma_RunUserTests(tMma *env, bool releaseAudioSubSystem);
|
||||||
|
|
||||||
|
//void Mma_ControlCapture(tMma *env, eControlCapture Capture);
|
||||||
|
|
||||||
|
void Mma_AudioSubSystemStart(tPowerManagement *power, tAmplifier *amplifier);
|
||||||
|
|
||||||
|
void UserInputInfoSystemToUDS(tMma *env);
|
||||||
|
|
||||||
|
void Mma_FirstStartupAudioSubsystem(tMma *env);
|
||||||
|
|
||||||
|
void Mma_DeletSms(tMma *env);
|
||||||
|
|
||||||
|
void Mma_AudioTestSetMode(tPowerManagement *env, bool fl);
|
||||||
|
|
||||||
|
void Mma_FatalErrorOnInit(tMma *env, bool noinit, tDeviceModes errState);
|
||||||
|
|
||||||
|
void Mma_delayNotBloc(uint32_t tim);
|
||||||
|
|
||||||
|
void Mma_UserInputSubstartButtonThreadStart(tMma *env);
|
||||||
|
|
||||||
|
void Mma_UserInputSubstartButtonThreadStop(tMma *env);
|
||||||
|
|
||||||
|
void AccompanModeStartThread(tMma *env);
|
||||||
|
|
||||||
|
void UserInputChekButton(tMma *env);
|
||||||
|
|
||||||
|
void Mma_InitStage(tMma *env);
|
||||||
|
|
||||||
|
void Mma_CheckShutdown(tMma *env) ;
|
||||||
|
|
||||||
|
AtCommandResult Mma_CheckIncomingSms(tMma *env);
|
||||||
|
|
||||||
|
void Mma_NetworkRequire(tMma *env);
|
||||||
|
|
||||||
|
void TMR2_CanMute_Start(tMma *env);
|
||||||
|
|
||||||
|
void Mma_EcallManual(tMma *env);
|
||||||
|
|
||||||
|
bool Mma_StartCrachDetectSubsystem(tMma *env);
|
||||||
|
|
||||||
|
void Mma_EcallAutomatic(tMma *env, tUveosEmergencyEvent emergencyEvent);
|
||||||
|
|
||||||
|
void Mma_GetHardVers(tMma *env);
|
||||||
|
|
||||||
|
void Mma_GetSoftVers(tMma *env);
|
||||||
|
|
||||||
|
//void Mma_GetCCID(tMma *env);
|
||||||
|
|
||||||
|
//void Mma_GetCGSN(tMma *env);
|
||||||
|
|
||||||
|
void Mma_AudioSubSystemRelease(tMma *env);
|
||||||
|
|
||||||
|
void Mma_AudioSubSystemRequire(tMma *env);
|
||||||
|
|
||||||
|
//bool Mma_GetNewSms(tMma *env, uint8_t *binaryData, uint16_t size, uint16_t *binaryDataSize);
|
||||||
|
//
|
||||||
|
//void Mma_SmsProcrssing(tMma *env, uint8_t *binaryData, const uint16_t *binaryDataSize);
|
||||||
|
|
||||||
|
void setGeneralGNSS(tMma *env,
|
||||||
|
eCanGnssCallByButton GNSS_Call_By_button,
|
||||||
|
eCanGnssStatus GNSS_Status,
|
||||||
|
eCanGnssCallAuto GNSS_Call_Auto,
|
||||||
|
eCanGnssCallTest GNSS_Call_Test
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//void Mma_SetAccessProtection();
|
||||||
|
|
||||||
|
#endif //UVEOS_ON_NATION_MAINMODESARBITER_PRIVATE_H
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
//
|
||||||
|
// Created by xemon on 11.12.22.
|
||||||
|
//
|
||||||
|
#include "PeripheralInterfaces.h"
|
||||||
|
#include "Rtcs.h"
|
||||||
|
|
||||||
|
void InitPeripheralInterfaces() {
|
||||||
|
Gpios_Init();
|
||||||
|
Adcs_Init();
|
||||||
|
SerialPorts_Init(&GPIOS.comIntDir);
|
||||||
|
I2cPorts_Init();
|
||||||
|
SpiPorts_Init(&GPIOS.accel);
|
||||||
|
CanPorts_Init();
|
||||||
|
StorageOnFlash_Init();
|
||||||
|
Rtcs_Init();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
//
|
||||||
|
// Created by xemon on 11.12.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UVEOS_ON_NATION_DEVICE_PERIPHERALINTERFACES_H
|
||||||
|
#define UVEOS_ON_NATION_DEVICE_PERIPHERALINTERFACES_H
|
||||||
|
|
||||||
|
#include <Gpios.h>
|
||||||
|
#include <Adcs.h>
|
||||||
|
#include <SerialPorts.h>
|
||||||
|
#include <I2cPorts.h>
|
||||||
|
#include <SpiPorts.h>
|
||||||
|
#include <StorageOnFlash.h>
|
||||||
|
#include "CanPorts.h"
|
||||||
|
|
||||||
|
void InitPeripheralInterfaces();
|
||||||
|
|
||||||
|
#endif //UVEOS_ON_NATION_DEVICE_PERIPHERALINTERFACES_H
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
//
|
||||||
|
// Created by zemon on 09.10.24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SMART_COMPONENTS_V2_TELEMATICACONNECTSTATUS_H
|
||||||
|
#define SMART_COMPONENTS_V2_TELEMATICACONNECTSTATUS_H
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TELE_ACSESS_DENATED = 0,
|
||||||
|
TELE_ACSESS_SERVER = 1,
|
||||||
|
TELE_ACSESS_LOCAL = 2,
|
||||||
|
TELE_ACSESS_TEMPORARY = 3,
|
||||||
|
}eTelematicaIsConnect;
|
||||||
|
|
||||||
|
#endif //SMART_COMPONENTS_V2_TELEMATICACONNECTSTATUS_H
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"cmake": {
|
||||||
|
"inc_dirs": [
|
||||||
|
"./"
|
||||||
|
],
|
||||||
|
"srcs": [
|
||||||
|
"./**.c"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue