Files
Geely/libs/IO.h

330 lines
15 KiB
C++

/*
* IO.h
*
* Created on: 11 июня 2015 г.
* Author: esaulenko
*/
#ifndef DRIVERS_IO_H_
#define DRIVERS_IO_H_
#include <cstdint>
#include "CommonTypes.h"
#include "Settings.h"
#include "Utils.h"
#if not defined CAN_FIRMWARE
#include "SysTimer.h"
#endif
typedef uint64_t TInpMask; // битовая маска логических входов
typedef uint64_t TOutMask; // битовая маска логических выходов
// макросы для более простого обращения к битовым маскам
#define oBIT(x) BIT64(CIO::x)
#define iBIT(x) BIT64(CIO::x)
class CIO
{
#define iPIN(x) (CSettings::x-CSettings::ipOFFSET)
#define oNAME(x) (CSettings::x-CSettings::oOFFSET)
#define iNAME(x) (CSettings::x-CSettings::iOFFSET)
public:
// Эта таблица источников для логических входов (функций)
#if defined MOBICAR_1_2
enum TInPins {
iRedBlack = iPIN(iRedBlack), // Pin_Door_I
iGreyBlack = iPIN(iGreyBlack), // Pin_Trunk_I
iBrownBlack = iPIN(iBrownBlack), // Pin_Hood_I
iGreen = iPIN(iGreen), // Pin_Ignition
iLBlueBlack = iPIN(iLBlueBlack), // Pin_Parking_I
iBlackWhite = iPIN(iBlackWhite), // Pin_Foot_I
iBlackPink = iPIN(iBlackPink), // Pin_RPM_I
iYellowBlue = iPIN(iYellowBlue), // Pin_OutRes2
iYellowWhite = iPIN(iYellowWhite), // Pin_OutRes1
ipCOUNT = CSettings::ipCOUNT, // Общее кол-во физических источников
iCAN = 0x7E, // берется из CAN шины
iNone = 0x7F // никуда не подключен
};
enum TOutPins {
oBrownGreen, // Pin_Ign_O
oBrownViolet, // Pin_Ign1_O
oBrownYellow, // Pin_Start_O
oBrownWhite, // Pin_Acc_O
oGreen, // Pin_LockRelay Relay3
oYellow, // Pin_UnlockRelay Relay4
oVioletYellow, // Pin_Light1Relay Relay1
oVioletBrown, // Pin_Light2Relay Relay2
oPink, // Pin_Relay5 Relay5
oBlue, // Pin_Immo_O
oBrown, // Pin_SirenOut
oYellowBlue, // Pin_OutRes2_O
oYellowWhite, // Pin_OutRes1_O
oOrange, // Kline1
oOrangeBlack, // KLine2
opCOUNT, // Общее кол-во физических выходов
oCAN = 31,
};
#elif defined MOBICAR_3 || defined MAGICAR_X
enum TInPins {
iRedBlack = iPIN(iRedBlack),
iGreyBlack = iPIN(iGreyBlack),
iBrownBlack = iPIN(iBrownBlack),
iGreen = iPIN(iGreen),
iLBlueBlack = iPIN(iLBlueBlack),
iBlackWhite = iPIN(iBlackWhite),
iBlackPink = iPIN(iBlackPink),
iYellowBlue = iPIN(iYellowBlue),
iYellowWhite = iPIN(iYellowWhite),
ipCOUNT = CSettings::ipCOUNT, // Общее кол-во физических источников
iCAN = 0x7E, // берется из CAN шины
iNone = 0x7F // никуда не подключен
};
enum TOutPins {
oGreenRelay,
oVioletRelay,
oYellowRelay,
oWhiteRelay,
oBrownGreen,
oBrownYellow,
oBrownViolet,
oBrownWhite,
oOrangeBreak, // разрыв Lin1
oBlue,
oBrown,
oYellowBlue, // вход/выход +/-
oYellowWhite, // вход/выход +/-
oGreen, // вход/выход
oBlackWhite, // вход/выход
oPinkBreak, // разрыв Lin2
oOrange, // Lin1
oPink, // Lin2
oPinkWhite, // Lin3
opCOUNT, // Общее кол-во физических выходов
oCAN = 31 // Выход на CAN-прошивку
};
#else
#error IO pins: unknown model!
#endif
enum TInputs {
iDoorDrv = iNAME(iDoorDrv),
iDoorFP = iNAME(iDoorFP),
iDoorRL = iNAME(iDoorRL),
iDoorRR = iNAME(iDoorRR),
iTrunk = iNAME(iTrunk),
iHood = iNAME(iHood),
iIgn = iNAME(iIgn),
iHBrake = iNAME(iHBrake),
iLamp = iNAME(iLamp),
iPark = iNAME(iPark),
iBrake = iNAME(iBrake),
iLeftTurnLight = iNAME(iLeftTurnLight),
iRightTurnLight = iNAME(iRightTurnLight),
iArm = iNAME(iArm),
iSensorAlarm = iNAME(iSensorAlarm),
iSensorNotify = iNAME(iSensorNotify),
iEngine = iNAME(iEngine),
iLock = iNAME(iLock),
iPreHeater = iNAME(iPreHeater),
iLowFuelLevel = iNAME(iLowFuelLevel),
iACC = iNAME(iACC),
iKeyIn = iNAME(iKeyIn),
iSpark = iNAME(iSpark),
iDoorsLamp = iNAME(iDoorsLamp),
iTrunkLamp = iNAME(iTrunkLamp),
iTrunkWindow = iNAME(iTrunkWindow),
iStartStop = iNAME(iStartStop),
iNeutral = iNAME(iNeutral),
iLauncher = iNAME(iLauncher),
iDisarm = iNAME(iDisarm),
iUnTrunk = iNAME(iUnTrunk),
iUnLock = iNAME(iUnLock),
iDevice1 = iNAME(iDevice1),
iDevice2 = iNAME(iDevice2),
iDevice3 = iNAME(iDevice3),
iDevice4 = iNAME(iDevice4),
iDevice5 = iNAME(iDevice5),
iDevice6 = iNAME(iDevice6),
iDevice7 = iNAME(iDevice7),
iDevice8 = iNAME(iDevice8),
iCOUNT = CSettings::iCOUNT,
iStateAtMt = 63 // особый вход: "трансмиссия автомат"
};
// Виртуальные выходы на исполнительные устройства или
// выход на устройство выполняющее определенную функцию
enum TOutputs {
// Неопределенные устройства
oDevice1 = oNAME(oDevice1), // 0
oDevice2 = oNAME(oDevice2), // 1
oDevice3 = oNAME(oDevice3), // 2
oDevice4 = oNAME(oDevice4), // 3
oDevice5 = oNAME(oDevice5), // 4
oDevice6 = oNAME(oDevice6), // 5
oDevice7 = oNAME(oDevice7), // 6
oDevice8 = oNAME(oDevice8), // 7
// Базовые устройства Охранной системы
oSiren = oNAME(oSiren), // 08 Сирена
oHorn = oNAME(oHorn), // 09 Клаксон
oLights = oNAME(oLights), // 10 Поворотники
oLamp = oNAME(oLamp), // 11 Головное освещение
oPassiveBlockage = oNAME(oPassiveBlockage), // 12 Пассивная блокировка (когда выключена, цепь разомкнута, блокировка включена)
oActiveBlockage = oNAME(oActiveBlockage), // 13 Активная блокировка (когда выключена, цепь замкнута, блокировка выключена)
oLockDoors = oNAME(oLockDoors), // 14 Запереть все двери
oUnlockDoors = oNAME(oUnlockDoors), // 15 Отпереть все двери
oUnlockDoorDrv = oNAME(oUnlockDoorDrv), // 16 Отпереть дверь водителя
oLockTrunk = oNAME(oLockTrunk), // 17 Запереть багажник
oUnlockTrunk = oNAME(oUnlockTrunk), // 18 Отпереть багажник
oLockHood = oNAME(oLockHood), // 19 Запереть Капот
oUnLockHood = oNAME(oUnLockHood), // 20 Отпереть капот
oCloseWindows = oNAME(oCloseWindows), // 21 Закрыть окна
oPreHeaterOn = oNAME(oPreHeaterOn), // 22 Включение предпускового подогревателя
oPreHeaterOff = oNAME(oPreHeaterOff), // 23 Выключение предпускового подогревателя
oImmOn = oNAME(oImmOn), // 24 Устройство включающее Иммобилайзер
oImmOff = oNAME(oImmOff), // 25 Устройство выключающее Иммобилайзер
oService = oNAME(oService), // 26 Устройство переводящее автомобиль в Сервисный режим
oDisarm = oNAME(oDisarm), // 27 Устройство осуществляющее снятие с Охраны (можно использовать как выход статической блокировки)
oArm = oNAME(oArm), // 28 Устройство осуществляющее постановку под Охрану (можно использовать как выход статической блокировки)
oAlarm = oNAME(oAlarm), // 29 Устройство осуществляющее включение тревоги (можно использовать как выход статической блокировки)
oAutoStart = oNAME(oAutoStart), // 30 Состояние Автозапуска
// Базовые устройства АвтоЗапуска (подменяют или имитируют присутствие водителя в автомобиле)
oDoorWag = oNAME(oDoorWag), // 31 Устройство махающее дверью
oIgn = oNAME(oIgn), // 32 Включение зажигания
oBrake = oNAME(oBrake), // 33 Педаль тормоза
oKeyIn = oNAME(oKeyIn), // 34 Ключ в замке
oAcc = oNAME(oAcc), // 35 Аксессуары
// oBrakeControl = oNAME(oBrakeControl), // 36 Отключение контроля педали тормоза
oAuxBrake = oNAME(oAuxBrake), // 37 Дополнительная линия педали тормоза
oAuxIgn = oNAME(oAuxIgn), // 38 Дополнительная линия зажигания
oSSButton = oNAME(oSSButton), // 39 Кнопка Старт/Стоп
oImmBypass = oNAME(oImmBypass), // 40 Обходчик встроенного иммобилайзера
oCrank = oNAME(oCrank), // 41 Стартер
oCrankDisable = oNAME(oCrankDisable), // 42 Блокировка Стартера
// Дополнительные
oLockIgn = oNAME(oLockIgn), // 43 Блокировка зажигания (когда включена, зажигание заблокировано)
oUnLockIgn = oNAME(oUnLockIgn), // 44 Разблокировка зажигания (когда включена, зажигание разблокировано)
oKLine1Relay = oNAME(oKLine1Relay), // 45 Устройство коммутирующее KLine интерфейс
oAux1 = oNAME(oAux1), // 46 Доп.канал #1
oAux2 = oNAME(oAux2), // 47 Доп.канал #2
oAux3 = oNAME(oAux3), // 48 Доп.канал #3
oEmergencyBraking=oNAME(oEmergencyBraking), // 49 Выход сигнала экстренного торможения
oIllumination = oNAME(oIllumination), // 50 Выход сигнала вежливой подсветки
oFoldMirrors = oNAME(oFoldMirrors), // 51 Сложить зеркала
oUnfoldMirrors = oNAME(oUnfoldMirrors), // 52 Разложить зеркала
oCloseSunroof = oNAME(oCloseSunroof), // 53 Закрыть люк
oMoveSunroof = oNAME(oMoveSunroof), // 54 Сдвинуть люк
oHeatedSeats = oNAME(oHeatedSeats), // 55 Обогрев сидений
oTriggerDoors = oNAME(oTriggerDoors), // 56 Триггерная кнопка ЦЗ
oIgnSupport = oNAME(oIgnSupport), // 57 Состояние поддержки зажигания
oArmWithoutTag = oNAME(oArmWithoutTag), // 58 Состояние "Охрана без метки"
oHeatedWindows = oNAME(oHeatedWindows), // 59 Обогрев окон
oKLine2Relay = oNAME(oKLine2Relay), // 60 m34x46: Коммутация Lin2
oDVR = oNAME(oDVR), // 61 m34x46: Выход на видеорегистратор
// Общее кол-во виртуальных устройств
oCOUNT = CSettings::oCOUNT,
};
// режимы входов
enum TInputActiveState {
ActiveGND = 1 // Активное состояние, когда на входе GND
};
// режимы подтяжек входов
enum TInputPullupMode {
PullNone = 0,
PullDown = 2,
PullUp = 3,
};
#undef iPIN
#undef oNAME
#undef iNAME
#ifndef CAN_FIRMWARE
void Init(void);
void UpdateSettings(const uint idSettings);
// проверка, что вход (физический) используется
static bool IsInputMapped(TInPins aPhInput);
// чтение и обработка мгновенных состояний входов для получения устойчивых физических состояний
uint32_t ReadInputPins(void);
// Конвертирование переданных физический состояний (REMAP) в соответствующие логические состояния
TInpMask RemapInputs(uint32_t iPins);
// установка физических выходов
void SetOutPhys(const TOutPins pin, const bool state);
// Установка логических выходов.
// Возвращает:
enum TSetOutputResult : uint {
soNone = 0, // нет такого выхода или он никуда не назначен
soExist = 1, // Выход назначен, но состояние не изменилось
soChanged = 2 // выход назначен и состояние было изменено
};
TSetOutputResult SetOutput(const TOutputs aOutput, const bool state);
// Запрос текущего состояния логического выхода
inline bool GetOutput(const TOutputs Output) const {return bbRAM(oStates,Output);};
// Вернуть состояние логических выходов (функций выходов)
inline TOutMask GetOutputs(void) const {return oStates;}
// Вернуть состояние логических входов (функций входов)
inline TInpMask GetInputs(void) const {return iStates;}
// Вернуть состояние физических выходов
inline uint32_t GetOutPhys(void) const {return opStates;}
inline bool GetOutPhys(const TOutPins pin) const
{ return GetOutPhys() & BIT(pin); }
// петля "тип коробки"
static bool StateAtMt(void);
private:
TOutMask oStates; // сохраненные состояния логических выходов (всех функций выходов)
TInpMask iStates; // сохраненные состояния логических входов (всех функций входов)
uint32_t ipStates, ipTemp; // физические состояния входов, очищенные от дребезга...
uint32_t opStates; // физические состояния выходов
struct TInputPin {
TimerMs Timer;
uint16_t TimeOut;
uint8_t Stage;
};
TInputPin iPin[ipCOUNT];
// получение мгновенных состояний со входов
static uint32_t GetInputPins(void);
// управляет состояниями подтяжек на входах
static void SetPullInput(TInPins Input, TInputPullupMode Mode);
inline void ClrOutputState(TOutputs Output) {bbRAM(oStates,Output) = 0;};
inline void SetOutputState(TOutputs Output) {bbRAM(oStates,Output) = 1;};
#endif // ! CAN_FIRMWARE
};
// глобальный объект портов ввода-вывода
extern CIO gIO;
#endif /* DRIVERS_IO_H_ */