Initial commit
This commit is contained in:
329
libs/IO.h
Normal file
329
libs/IO.h
Normal file
@@ -0,0 +1,329 @@
|
||||
/*
|
||||
* 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_ */
|
||||
Reference in New Issue
Block a user