/* * CanFwInterface.h * * Created on: 13 мая 2015 г. * Author: esaulenko */ #ifndef CANFWINTERFACE_H_ #define CANFWINTERFACE_H_ #include "CommonTypes.h" // размер области памяти под переменные CAN-прошивки enum { gCanFwMemSize = 2048 }; // объявляем структуры заранее, чтобы не было взаимных ссылок struct TCanPkt; union TLinInit; struct TLinFrame; #if CAN_FIRMWARE struct TCanFwMem; #else // Core typedef char TCanFwMem[gCanFwMemSize]; #endif // команды ядра, которые может вызывать CAN-прошивка enum TCoreCommands : uint8_t { CoreCmdDisarm = 1, // команда снятия с охраны Параметр: b00CHASFL // бит 0(L) - отпирать замки; // бит 1(F) - мигать поворотниками; // бит 2(S) - гудеть сиреной; // бит 3(A) - если команда подана в режиме тревоги, прекратить ее, не снимая с охраны; // бит 4(H) - режим Handsfree, позволяет сниматься с Охраны в любой момент начала Автозапуска и блокирует Перепостановку; // бит 5(C) - выдавать сигналы управления функциями Комфорта. CoreCmdArm = 2, // команда постановки на охрану Параметр: b00C00SFL // бит 0(L) - запирать замки; // бит 1(F) - мигать поворотниками; // бит 2(S) - гудеть сиреной; // бит 5(C) - выдавать сигналы управления функциями Комфорта. CoreCmdTrunkOpened = 3, // команда оповещения Системы о том, что багажник открыт: b00000SF0 //CoreCmdAlarm = 6, // не реализовано CoreCmdDisableShockSens = 7, // Отключить реакцию на датчик Удара в течении <Параметр> времени в мсек CoreCmdDisableDoorSens = 8, // Задержать реакцию на концевики дверей в течении <Параметр> времени в мсек CoreCmdLauncherOn = 9, // команда оповещения Системы о включении внешнего запуска: <Параметр> - время ожидания запуска в сек CoreCmdLauncherOff = 10, // команда оповещения Системы о выключении внешнего запуска: <Параметр> - время ожидания глушения или перезапуска в сек CoreCmdDisableTrunkSens = 11, // Задержать реакцию на концевики багажника в течении <Параметр> времени в мсек CoreCmdImmoLearnRes = 12, // Результат обучения иммобилайзера: 0 - успех, нужно запомнить VIN, 0x80 - успех, VIN не нужен, другое - ошибка CoreCmdImmoLearnContinue = 13, // Управление обучением иммо: 1 - перезапуск таймаута; 2 - необходимо выключить зажигание; 3 - подать сигнал антенным модулем CoreCmdStartStop = 14, // Управление запуском со штатного брелока (например, трехкратным нажатием на кнопку закрыть) CoreCmdMenuResult = 15, // Результат выполнения команды из меню антенны: 0 - успех, 1 - ошибка }; // Список команд предназначеных/определенных/известных CAN прошивке enum TCanFwCommands : uint8_t { ccNone = 0, // нет команды/не команда, либо команда неизвестна/неопределена... ccLockDoors = 1, // Запереть все двери ccUnLockDoors = 2, // Отпереть все двери ccUnLockDoorDrv = 3, // Отпереть дверь водителя ccLockTrunk = 4, // Запереть багажник ccUnLockTrunk = 5, // Отпереть багажник ccLockHood = 6, // Запереть капот ccUnLockHood = 7, // Отпереть капот ccCloseWindows = 8, // Закрыть окна ccOpenWindows = 9, // Открыть окна ccService = 10, // включение режима Автосервис ccDisarm = 11, // выключение режима Охраны //reserved = 12, ccArm = 13, // включение режима Охраны //reserved = 14, //reserved = 15, ccAlarmOff = 16, // выключить Тревогу ccAlarmOn = 17, // включить Тревогу ccPanicOff = 18, // выключение режима Паника ccPanicOn = 19, // включение режима Паника ccImmobilizerOff = 20, // выключить Иммобилайзер ccImmobilizerOn = 21, // включить Иммобилайзер ccIgnSupportOff = 22, // выключение поддержки зажигания ccIgnSupportOn = 23, // включение поддержки зажигания ccBlockageOff = 24, // выключить блокировку ccBlockageOn = 25, // включить блокировку ccEngineStart = 26, // запуск двигателя (по ошибке, стало событием) ccEngineStop = 27, // глушение двигателя (по ошибке, стало событием) ccTestMode = 28, // включение Тест-режима ccFoldMirrors = 29, // сложить зеркала ccUnFoldMirrors = 30, // разложить зеркала ccCloseSunroof = 31, // закрыть люк ccHeatedSeatsOn = 32, // включить подогрев сидений ccHeatedSeatsOff = 33, // выключить подогрев сидений ccPreHeaterOff = 34, // выключить предпусковой подогреватель ccPreHeaterOn = 35, // включить предпусковой подогреватель ccAutoStartOff = 36, // выключение запуска ccAutoStartOn = 37, // включение запуска ccAutoStartDone = 38, // успешный запуск ccKillEngine = 39, // заглушить двигатель! ccImmoBypass = 40, // обходчик иммобилайзера: бит 0 - включить; бит 1 - режим обучения ccUpdateVin = 41, // обновить VIN-код ccSendObdReq = 42, // запрос OBD-диагностики ccValetMenuCmd = 43, // команда из меню антенны ccHeatedWindowsOn = 44, // включить подогрев окон ccHeatedWindowsOff = 45, // выключить подогрев окон }; // Параметры команд для CAN прошивки, битовая маска (всего 24 бита) enum TCanFwCommandParam : uint32_t { mccReserved = (1 << 0), // резерв mccSilent = (1 << 1), // беззвучное исполнение команды mccPriority = (1 << 2), // приоритетное открытие двери водителя (ccDisarm) mccDriveBuiltinSystem = (1 << 3), // разрешено управлять штатной охранной системой (ccLockTrunk/ccUnLockTrunk) }; // данные, которые CAN-прошивка может передать в ядро enum TCanFwData : uint8_t { CanData_RPM = 0, // обороты, об/мин CanData_Speed = 1, // скорость, км/ч CanData_Odometer = 2, // пробег, 1 ед = 100 метров CanData_Accelerator = 3, // положение педали газа, проценты CanData_BrakeForce = 4, // положение педали тормоза, проценты CanData_WheelAngle = 5, // положение руля CanData_FuelLevel = 6, // уровень топлива, проценты CanData_FuelConsumption = 7, // мгновенный расход, миллилитры CanData_CoolantTemp = 8, // температура двигателя, со смещением 40 градусов CanData_VIN = 9, // VIN-код CanData_FuelLevelRaw = 10, // уровень топлива, без калибровки 0..255 CanData_COUNT, // количество возможных полей с данными CanData_Invalid = 0x80, }; // описание CAN-прошивки extern const TCanFwInfo gCanFwInfo; // структура с функциями CAN, которые вызываются из ядра struct TCanFunctions { TCanFwInfo const * pCanFwInfo; uint8_t const * pSettingsTable; char const * const * pSettingsNames; void (*Init)(TCanFwMem * vars); void (*Periodic)(TCanFwMem * vars); void (*SettingChanged)(TCanFwMem * vars, uint16_t id); void (*Reserved6)(); void (*InputChanged)(TCanFwMem * vars, uint32_t aInput, bool aSwitchedOn); void (*OutputChanged)(TCanFwMem * vars, uint32_t aOutput, bool aSwitchedOn); void (*GuardEvent)(TCanFwMem * vars, TGuardEvents aEvent); void (*Can1Received)(TCanFwMem * vars, TCanPkt *apPkt); void (*Can2Received)(TCanFwMem * vars, TCanPkt *apPkt); void (*SequenceStart)(TCanFwMem * vars, uint32_t aOutputNum); void (*SequenceStop)(TCanFwMem * vars, uint32_t aOutputNum); void (*Command)(TCanFwMem * vars, TCanFwCommands aCmd, uint32_t aCmdParam); void (*Lin1Received)(TCanFwMem* vars, TLinFrame* apFrame); void (*Lin2Received)(TCanFwMem* vars, TLinFrame* apFrame); void (*Lin1Transmitted)(TCanFwMem* vars, uint8_t aFrameId); void (*Lin2Transmitted)(TCanFwMem* vars, uint8_t aFrameId); #if defined MOBICAR_1_2 void (*Reserved19)(); void (*Reserved20)(); #elif defined MOBICAR_3 || defined MAGICAR_X void (*Lin3Received)(TCanFwMem * vars, TLinFrame *apFrame); void (*Lin3Transmitted)(TCanFwMem * vars, uint8_t aFrameId); #endif void (*Reserved21)(); void (*Reserved22)(); void (*Reserved23)(); void (*Reserved24)(); void (*Reserved25)(); void (*Reserved26)(); void (*Reserved27)(); void (*Reserved28)(); void (*Reserved29)(); void (*Reserved30)(); void (*Reserved31)(); }; static_assert (sizeof(TCanFunctions) == 4*32, "В таблице должно быть 32 поля"); // структура с функциями ядра, которые вызываются из CAN-прошивки struct TCoreFunctions { const TCoreInfo* pCoreInfo; uint32_t (*GetTickMs) (); uint32_t (*CanInit) (TCanChannel aCh, const TCanInit* apInit); uint32_t (*CanSend) (TCanChannel aCh, TCanPkt* apPkt, uint32_t timeout); uint64_t (*GetInputs) (); uint64_t (*GetOutputs) (); #if defined MOBICAR_3 && 1 // Только для отладки (работает только с отладочной или спец. прошивками) typedef struct { uint8_t BlinkOff; // [50ms] uint8_t BlinkOn; // [50ms] uint8_t BeepTime; // [50ms] uint8_t BeepTone; } TDebugIndicate; void (*DebugIndicate)(TDebugIndicate const & aIndicate, const uint8_t nBlink); #else void (*Reserved6)(); #endif uint32_t (*Command) (TCoreCommands aCmd, uint32_t aParam); uint32_t (*RunSequence) (uint32_t aOutput, uint32_t aSequenceNum); uint32_t (*SetPeriod) (uint32_t aPeriod); uint32_t (*SetOutput) (uint32_t aOutput, bool On); uint32_t (*InputState) (uint32_t aInput, bool On); uint32_t (*DataValue) (uint32_t aDataIdx, int32_t aValue); uint32_t (*CanGetRxTimeout) (TCanChannel aCh); uint32_t (*LinInit) (TLinChannel aCh, const TLinInit* apInit); uint32_t (*LinSend) (TLinChannel aCh, const TLinFrame* apFrame); uint32_t (*LinSleep) (TLinChannel aCh, bool aSleep); void (*Reserved17)(); uint32_t (*DataValueArr) (uint32_t aDataIdx, const void * data); bool (*CheckVinValid) (); bool (*SaveSetting) (uint16_t id, const void * apData, uint16_t aDataSize); const void *(*GetSetting) (uint16_t id); bool (*SaveImmoLearn) (const void *data, uint32_t dataSize); void (*Reserved23)(); void (*Reserved24)(); void (*Reserved25)(); void (*Reserved26)(); void (*Reserved27)(); void (*Reserved28)(); void (*Reserved29)(); void (*Reserved30)(); void (*DebugConsole)(const char *, ...); }; static_assert (sizeof(TCoreFunctions) == 4*32, "В таблице должно быть 32 поля"); // таблица с доступными функциями ядра #define CoreFunc ((TCoreFunctions*) ((uint32_t) &FW_AREAS->Core + 512) ) // 16K + 512 #if defined CAN_FIRMWARE // объявление функций CAN-прошивки void Init (TCanFwMem * vars); void SettingChanged (TCanFwMem * vars, uint16_t id); void Can1Received (TCanFwMem * vars, TCanPkt *apPkt); void Can2Received (TCanFwMem * vars, TCanPkt *apPkt); void InputChanged (TCanFwMem * vars, uint32_t aInputNum, bool aSwitchedOn); void OutputChanged (TCanFwMem * vars, uint32_t aOutputNum, bool aSwitchedOn); void GuardEvent (TCanFwMem * vars, TGuardEvents aEvent); void SequenceStart (TCanFwMem * vars, uint32_t aEvent); void SequenceStop (TCanFwMem * vars, uint32_t aEvent); void Command (TCanFwMem * vars, TCanFwCommands aCmd, uint32_t aCmdParam); void PeriodicProcess (TCanFwMem * vars); void Lin1Received (TCanFwMem * vars, TLinFrame *apFrame); void Lin2Received (TCanFwMem * vars, TLinFrame *apFrame); void Lin3Received (TCanFwMem * vars, TLinFrame *apFrame); void Lin1Transmitted (TCanFwMem * vars, uint8_t aFrameId); void Lin2Transmitted (TCanFwMem * vars, uint8_t aFrameId); void Lin3Transmitted (TCanFwMem * vars, uint8_t aFrameId); #else // core // таблица с доступными функциями CAN-прошивки, лежит в её начале #define CanFwFunc ((TCanFunctions*) &FW_AREAS->CanFw) #endif #endif /* CANFWINTERFACE_H_ */