292 lines
14 KiB
C
292 lines
14 KiB
C
/*
|
|
* 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_ */
|