Initial commit

This commit is contained in:
2025-10-22 20:40:25 +03:00
commit 63d038ee63
57 changed files with 104378 additions and 0 deletions

73
libs/Buffer.h Normal file
View File

@@ -0,0 +1,73 @@
/*
* Buffer.h
*
* Created on: 03 апр. 2015 г.
* Author: esaulenko
*/
#ifndef _BUFFER_H_
#define _BUFFER_H_
#include <cstdint>
// простейший кольцевой буфер.
// проверки при добавлении/извлечении данных отсутствуют, надо проверять отдельно!!
template <typename Type = char, int Size = 32>
class CircularBuffer
{
private:
Type buff[Size];
volatile uint32_t putIdx;
volatile uint32_t getIdx;
public:
CircularBuffer()
{
Flush ();
}
void Put (const Type & data)
{
buff[putIdx] = data;
putIdx = (putIdx + 1) % Size;
}
Type Get ()
{
Type data = buff[getIdx];
getIdx = (getIdx + 1) % Size;
return data;
}
Type & View ()
{
return buff[getIdx];
}
uint32_t Avail () const
{
int32_t avail = putIdx - getIdx;
if (avail < 0) avail += Size;
return avail;
}
uint32_t Free () const
{
int32_t free = getIdx - putIdx - 1;
if (free < 0) free += Size;
return free;
}
void Flush ()
{
putIdx = getIdx = 0;
}
};
#endif /* _BUFFER_H_ */

288
libs/Can.h Normal file
View File

@@ -0,0 +1,288 @@
/*
* Can.h
*
* Created on: 01 июня 2015 г.
* Author: esaulenko
*/
#ifndef DRIVERS_CAN_CAN_H_
#define DRIVERS_CAN_CAN_H_
#include <stdint.h>
#include "CommonTypes.h"
#ifndef CAN_FIRMWARE
#include "SysTimer.h"
#include "Buffer.h"
#include "scmRTOS.h"
#endif
struct TCanPkt
{
uint32_t id;
uint8_t data[8];
uint8_t data_len;
TCanPkt() { }
TCanPkt (uint32_t pkt_id):
id(pkt_id) { }
// принимает строку, заполняет данные пакета. Неуказанные данные заполняются нулями
template <int N>
inline void SetData (const char (&data_str)[N])
{
int data_size = (N <= 8) ? (N - 1) : 8;
for (int i = 0; i < data_size; i++)
data[i] = data_str[i];
for (int i = data_size; i < 8; i++)
data[i] = 0x00;
}
inline void SetData (uint8_t A)
{ data_len = 1;
data[0] = A; data[1] = 0; data[2] = 0; data[3] = 0;
data[4] = 0; data[5] = 0; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B)
{ data_len = 2;
data[0] = A; data[1] = B; data[2] = 0; data[3] = 0;
data[4] = 0; data[5] = 0; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C)
{ data_len = 3;
data[0] = A; data[1] = B; data[2] = C; data[3] = 0;
data[4] = 0; data[5] = 0; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C, uint8_t D)
{ data_len = 4;
data[0] = A; data[1] = B; data[2] = C; data[3] = D;
data[4] = 0; data[5] = 0; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C, uint8_t D, uint8_t E)
{ data_len = 5;
data[0] = A; data[1] = B; data[2] = C; data[3] = D;
data[4] = E; data[5] = 0; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C, uint8_t D, uint8_t E, uint8_t F)
{ data_len = 6;
data[0] = A; data[1] = B; data[2] = C; data[3] = D;
data[4] = E; data[5] = F; data[6] = 0; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C, uint8_t D, uint8_t E, uint8_t F, uint8_t G)
{ data_len = 7;
data[0] = A; data[1] = B; data[2] = C; data[3] = D;
data[4] = E; data[5] = F; data[6] = G; data[7] = 0;
}
inline void SetData (uint8_t A, uint8_t B, uint8_t C, uint8_t D, uint8_t E, uint8_t F, uint8_t G, uint8_t H)
{ data_len = 8;
data[0] = A; data[1] = B; data[2] = C; data[3] = D;
data[4] = E; data[5] = F; data[6] = G; data[7] = H;
}
};
struct TCanInit
{
uint32_t baudrate; // "сырое" значение регистра BTR, см. TCanBaudrate
uint8_t mode; // в наст. момент не используется. TODO Должно быть RO / RW
uint64_t filters[27]; // массив со значениями для пар регистров; заполняется Filters::xxx
};
class CCan
{
public:
enum TCanState : uint8_t
{
CanActive,
CanRxOnly, // внешний драйвер выключен
CanSleep, // внешний драйвер выключен, модуль в спящем режиме
CanInitError = 0xFE,
CanBusOff = 0xFF,
};
/* TIME QUANTUM FREQUENCY:
Ftq = Ntq * Fbaud
where 8 <= Ntq <= 25, and Ntq - is integer!
BAUD RATE PRESCALER:
BRP = (Fcan/Ftq)–1
INDIVIDUAL BIT TIME SEGMENTS:
(Bit Time) = (Sync Segment) + (Time Segment 1) + (Time Segment 2)
where
(Sync Segment) = 1*Tq (constant)
(Time Segment 2) ~= 30% of Nominal Bit Time = Ntq/3
(Time Segment 2) > 1*Tq
(Time Segment 1) > 3*Tq
(Time Segment 1) > (Time Segment 2)
(Time Segment 1) <= (Time Segment 2)+8
(Synchronous Jump Width) <= (Time Segment 2)
Table of Parameters:
--------+-----------------------------------------------------+
BRP@Fcan| Ntq |
9MHz |25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8|
--------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
500.000 | | | | | | | | 0| | | | | | | | | 1| |
250.000 | | | | | | | | 1| | | | | | 2| | | 3| |
125.000 | | 2| | | | | | 3| | | | | | 5| | | 7| 8|
100.000 | | | | | | | | 4| | | 5| | | | | 8| 9| |
83.333 | | | | | | | | 5| | | | | | 8| | |11| |
50.000 | | | | | | 8| | 9| | |11| | |14| |17|19| |
33.333 | | | | | | | |14| | |17| | | | |26|29| |
20.000 |17| | | | | | |24| | |29| | | | |44|49| |
15.000 |23|24| | | |29| | | | |39| | |49| |59| |74|
10.000 |35| | | | |44| |49| | |59| | |74| |89|99| |
--------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*/
#define CAN_BTR(BRP,TSEG1,TSEG2,SJW) (((((((SJW)&0x03)<<4)|((TSEG2)&0x07))<<4)|((TSEG1)&0x0F))<<16)|((BRP)&0x3FF)
// значения регистра BTR
enum TCanBaudrate {
CanBaudrate500 = CAN_BTR(0,10,5,3),
CanBaudrate250 = CAN_BTR(1,10,5,3),
// CanBaudrate125 = CAN_BTR(2,14,7,3),
CanBaudrate125 = CAN_BTR(3,10,5,3),
CanBaudrate100 = CAN_BTR(4,10,5,3),
CanBaudrate83 = CAN_BTR(5,10,5,3),
// CanBaudrate50 = CAN_BTR(8,11,6,3),
CanBaudrate50 = CAN_BTR(9,10,5,3),
CanBaudrate33 = CAN_BTR(14,10,5,3),
CanBaudrate20 = CAN_BTR(17,15,7,3),
// CanBaudrate20 = CAN_BTR(24,10,5,3),
CanBaudrate15 = CAN_BTR(23,15,7,3),
// CanBaudrate15 = CAN_BTR(24,14,7,3),
// CanBaudrate15 = CAN_BTR(29,11,6,3),
CanBaudrate10 = CAN_BTR(35,15,7,3),
// CanBaudrate10 = CAN_BTR(44,11,6,3),
// CanBaudrate10 = CAN_BTR(49,10,5,3),
};
#ifndef CAN_FIRMWARE
CCan ();
uint32_t Init (TCanChannel aCh, const TCanInit * apInit);
uint32_t Send (TCanChannel aCh, TCanPkt * apPkt, uint32_t aTimeout);
void ReceivedIsr (TCanChannel aCh, TCanPkt * apPkt);
uint32_t ProcessQueue ();
uint32_t GetRcv (TCanChannel aCh, TCanPkt * apPkt);
uint32_t GetRcvTimeout (TCanChannel aCh)
{ return _rx_tmr[aCh].Value(); }
#endif // CAN_FIRMWARE
// объявление фильтров при инициализации
struct Filter {
// добавить пару идентификаторов для точного соответствия
static constexpr uint64_t List11 (uint16_t id1, uint16_t id2)
{
return ((uint64_t) (IdStd (id1) | 0x01) << 32) |
(uint64_t) (IdStd (id2) | 0x01);
}
static constexpr uint64_t List29 (uint32_t id1, uint32_t id2)
{
return ((uint64_t) (IdExt (id1) | 0x01) << 32) |
(uint64_t) (IdExt (id2) | 0x01);
}
// добавить один идентификатор
static constexpr uint64_t List11 (uint16_t id1)
{
return ((uint64_t) (IdStd (id1) | 0x01) << 32) |
(uint64_t) (IdStd (id1) | 0x01);
}
static constexpr uint64_t List29 (uint32_t id1)
{
return ((uint64_t) (IdExt (id1) | 0x01) << 32) |
(uint64_t) (IdExt (id1) | 0x01);
}
// добавить один идентификатор с маской
static constexpr uint64_t Mask11 (uint16_t id, uint16_t mask)
{
return ((uint64_t) (IdStd (id)) << 32) |
(uint64_t) (IdStd (mask) | 0x01);
}
static constexpr uint64_t Mask29 (uint32_t id, uint32_t mask)
{
return ((uint64_t) (IdExt (id)) << 32) |
(uint64_t) (IdExt (mask) | 0x01);
}
private:
// формирование ID для фильтров
static constexpr uint32_t IdStd (uint16_t id)
{ return (id & 0x7FFul) << 21; }
static constexpr uint32_t IdExt (uint32_t id)
{ return ((id & 0x1FFFFFFFul) << 3) | 0x04; }
};
#ifndef CAN_FIRMWARE
private:
uint8_t sleep_en;
bool IsSleepEn (TCanChannel aCh)
{ return sleep_en & aCh; }
// очередь пакетов на отправку - тот же TCanPkt, но с таймером
struct TCanPktTxInt: public TCanPkt {
uint32_t timeout;
TimerMs tmr;
};
typedef CircularBuffer<TCanPkt, 16> TRxBuf;
typedef CircularBuffer<TCanPktTxInt, 32> TTxBuf;
TRxBuf _rx_buf[2];
TTxBuf _tx_buf[2];
uint32_t TxByTimeout (TCanChannel aCh);
bool IsTxQueueEmpty (TCanChannel aCh);
TCanState _state[2];
// Send() и обработка очереди вызываются из разных потоков, нужна защита
OS::TMutex can_mutex;
// сбрасывается по приёму любого пакета
TimerMs _rx_tmr[2];
#endif // CAN_FIRMWARE
};
extern CCan gCan;
#endif /* DRIVERS_CAN_CAN_H_ */

99
libs/CanFwInterface.cpp Normal file
View File

@@ -0,0 +1,99 @@
/*
* CanFwInterface.cpp
*
* Created on: 13 мая 2015 г.
* Author: esaulenko
*/
#include "ModelName.h"
#include "source/SourcePath.h"
#include SRC_HEADER
#include "CanFwInterface.h"
#include "Utils.h"
#include "Settings.h"
#include "Version.h"
#include <stddef.h>
// заглушка для неиспользуемых функций
//void Empty (__attribute__((unused)) void * apCanFwMem) {};
void Empty () {};
// контрольная сумма, располагается линкером в самом конце прошивки
__attribute__ ((section(".CheckSum")))
static const uint32_t CanChksum = CHKSUM_DEBUG;
// описание прошивки
const TCanFwInfo gCanFwInfo =
{
(CAN_FW_VERSION << 24) | BUILD_DATE, // Version - Версия ПО
GIT_BUILD, // Хеш коммита в репозитории git
&CanChksum, // *pCRC32 - Адрес, где расположена CRC32
0, // reserved2
M_NAME CAN_FW_DESCRIPTION "_" GIT_VERSION // TextInfo[64] - Текстовая информация
};
// структура с функциями CAN, которые вызываются из ядра
__attribute__ ((section(".entrance_vector")))
TCanFunctions CanFuctTable =
{
&gCanFwInfo, // pCanFwInfo
(uint8_t *) & CSettings::CanSettingsTable, // pSettingsTable
CSettings::CanSettingsName, // pSettingsNames
Init,
PeriodicProcess,
SettingChanged,
Empty, // Reserved6
InputChanged,
OutputChanged,
GuardEvent,
Can1Received,
Can2Received,
SequenceStart,
SequenceStop,
Command,
Lin1Received,
Lin2Received,
Lin1Transmitted,
Lin2Transmitted,
#if defined MOBICAR_1_2
Empty, // Reserved19
Empty, // Reserved20
#elif defined MOBICAR_3
Lin3Received,
Lin3Transmitted,
#endif
Empty, // Reserved21
Empty, // Reserved22
Empty, // Reserved23
Empty, // Reserved24
Empty, // Reserved25
Empty, // Reserved26
Empty, // Reserved27
Empty, // Reserved28
Empty, // Reserved29
Empty, // Reserved30
Empty, // Reserved31
};
// проверка, что переменные влезают в соотв.область
static_assert (sizeof(TCanFwMem) <= gCanFwMemSize, "Превышен максимальный размер TCanFwMem");

291
libs/CanFwInterface.h Normal file
View File

@@ -0,0 +1,291 @@
/*
* 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_ */

56
libs/CanSources.cpp Normal file
View File

@@ -0,0 +1,56 @@
/*
* CanSources.cpp
*
* Created on: 01 дек. 2015 г.
* Author: esaulenko
*/
#include "source/SourcePath.h"
#ifdef SRC_HEADER
#include SRC_HEADER
#endif
#ifdef SRC_FILE1
#include SRC_FILE1
#endif
#ifdef SRC_FILE2
#include SRC_FILE2
#endif
#ifdef SRC_FILE3
#include SRC_FILE3
#endif
#ifdef SRC_FILE4
#include SRC_FILE4
#endif
#ifdef SRC_FILE5
#include SRC_FILE5
#endif
#ifdef SRC_FILE6
#include SRC_FILE6
#endif
#ifdef SRC_FILE7
#include SRC_FILE7
#endif
#ifdef SRC_FILE8
#include SRC_FILE8
#endif
#ifdef SRC_FILE9
#include SRC_FILE9
#endif
#ifdef SRC_FILE10
#include SRC_FILE10
#endif

335
libs/CommonTypes.h Normal file
View File

@@ -0,0 +1,335 @@
/*
* CommonTypes.h
*
* Created on: 16 апр. 2015 г.
* Author: esaulenko
*/
#ifndef COMMON_COMMONTYPES_H_
#define COMMON_COMMONTYPES_H_
#include <cstdint>
#define member_size(type, member) sizeof(((type*)nullptr)->member)
//typedef uint8_t byte;
//typedef uint16_t word;
typedef unsigned int uint;
typedef unsigned long ulong;
//#define bbRAM(Var,Bit) ((uint*)(((uint)&Var + 0x22000000/32)*32))[Bit]
#define bbRAM(Var,Bit) ((volatile uint*)(((uint)&Var + SRAM_BB_BASE/32)*32))[Bit]
// !!! Начиная с компилятора версии 7, что-то в оптимизаторе изменилось.. и теперь, без volatile
// программа компилируется неверно. Поэтому добавляем признак volatile !!!
#define KByte *1024
union TSysStateRecord
{
uint16_t Record;
struct {
uint8_t Value; // Значение состояния Системы
uint8_t Check; // Проверка данных
} __attribute__((packed));
} __attribute__((packed));
typedef TSysStateRecord TSysState[2 KByte / sizeof(TSysStateRecord)];
struct TFwRegions
{
#if defined MOBICAR_1_2
// страницы по 2 кбайта
const uint8_t Boot[16 KByte];
const uint8_t Core[96 KByte];
const uint8_t CanFw[16 KByte];
const uint8_t Upload[96 KByte];
const uint8_t Settings1[4 KByte];
const uint8_t Settings2[4 KByte];
const uint8_t Reserved[20 KByte];
const uint8_t ImmoLearn[2 KByte];
const TSysState SysState;
#elif defined MOBICAR_3
const uint8_t Boot[16 KByte]; // sector 0
const uint8_t Settings1[16 KByte]; // sector 1
const uint8_t Settings2[16 KByte]; // sector 2
const uint8_t CanFw[16 KByte]; // sector 3
struct {
const uint8_t UploadAux[64 KByte - sizeof(TSysState)]; // sector 4
const TSysState SysState;
} __attribute__((packed));
union {
const uint8_t Upload[128 KByte]; // sector 5
const uint8_t ImmoLearn[2 KByte];
} __attribute__((packed));
const uint8_t Core[2 * 128 KByte]; // sector 6, 7
#endif
};
#define FW_AREAS ((TFwRegions const *)0x08000000)
// специальное значение для контрольной суммы - используется только в отладочной прошивке
#define CHKSUM_DEBUG 0xDebac0ab
// битовая настройка, используется в модуле настроек. Для простоты реализации занимает в ОЗУ 1 байт.
typedef uint8_t bit_t;
// **********
// * Версия *
// **********
union TVersion
{
uint32_t Value;
struct {
uint8_t Day;
uint8_t Month;
uint8_t Year;
uint8_t Version;
} __attribute__((packed));
} __attribute__((packed));
struct TBootInfo {
TVersion Version; // Версия загрузчика
uint16_t Build; // Номер билда загрузчика
uint8_t HwVer; // Версия железа
uint8_t Model; // Модель устройства. Mobicar1 = 0 (!), Mobicar2 = 2
uint32_t SerialNumber; // Серийный номер устройства
uint32_t reserved2;
uint8_t FirmwareKey[32]; // Ключ дешифрования прошивки
uint8_t ServerRegKey[12]; // ключ регистрации на сервере
uint8_t ServerExchKey[16]; // ключ установки соединения с сервером
uint32_t BluetoothPairingCode; // статический код для подшивания BLE устройств
uint32_t reserved[120];
} __attribute__((packed, aligned(4)));
#define TBootInfoSize __builtin_offsetof (TBootInfo, FirmwareKey)
static_assert (TBootInfoSize == 16, "TBootInfo changed!");
struct TCoreInfo {
TVersion Version; // Версия ПО
uint16_t Build; // Номер билда ядра
uint16_t reserved1;
uint32_t const * pCRC32; // Адрес, где расположена CRC32 в прошивке Ядра
uint32_t reserved2;
char TextInfo[64]; // Текстовая информация о прошивке Ядра
} __attribute__((packed, aligned(4)));
static_assert (sizeof(TCoreInfo) == 80, "TCoreInfo changed!");
// Структура массива информации о CAN-прошивке
struct TCanFwInfo {
TVersion Version; // Версия ПО
uint32_t Build; // Хеш коммита в репозитории git
uint32_t const * pCRC32; // Адрес, где расположена CRC32
uint32_t reserved2;
uint8_t TextInfo[64]; // Текстовая информация
} __attribute__((packed, aligned(4)));
static_assert (sizeof(TCanFwInfo) == 80, "TCanFwInfo changed!");
// ********************
// * НАСТРОЙКА ВХОДОВ *
// ********************
struct TInputPinSettings {
uint16_t T1:14; // период активного импульса
uint16_t P1:2; // Подтяжка: [xy]: непрограммируемая(x=0)/программируемая(x=1)/pulldown(y=0)/pullup(y=1).
uint16_t T2:14; // период пассивного импульса
uint16_t P2:2; // Подтяжка: [xy]: непрограммируемая(x=0)/программируемая(x=1)/pulldown(y=0)/pullup(y=1).
// Таблица истинности:
// T1 P1 T2 P2 Debounce
// 0 p 0 x tick статика, без антидребезга
// >0 p 0 x T1 статика с периодом антидребезга равного T1
// 0 p >0 p tick динамика, P1 включается на TICK, затем P2 включается на T2, без антидребезга.
// >0 p >0 p T1 динамика, P1 включается на T1*2, затем P2 включается на T2, антидребезг T1.
} __attribute__((packed));
struct TInputSettings {
uint8_t Input:7; // номер физического входа
uint8_t Invert:1; // Инвертировать состояние
bool operator== (const TInputSettings &other)
{ return *((uint8_t*)this) == *((uint8_t*)(&other)); }
bool operator!= (const TInputSettings &other)
{ return ! (*this == other); }
} __attribute__((packed));
enum {
SequenceLength = 16,
maxSequences = 32, // кол-во импульсных последовательностей одновременно запущенных
};
// последовательности управления выходами
union TSequence {
uint8_t Byte[SequenceLength];
union {
uint8_t Value;
struct {
uint8_t Mantissa:5;
uint8_t Power:3;
};
} Step;
} __attribute__((packed));
typedef uint8_t TKeyAES[16]; // ключ шифрования радио
typedef uint8_t TVehicleID[17]; // VIN-код
//typedef uint8_t TImmoKey[124]; // ключ обходчика иммобилайзера
typedef uint8_t TImmoKey[32]; // ключ обходчика иммобилайзера
// настройка таймера запуска
struct TStartTimerSetting {
uint16_t Time; // количество минут с начала суток. У выключенного таймера биты инвертированы
uint8_t DayMask; // Биты дней недели, когда разрешён запуск - 0..6. Для "старого" механизма устанавливается 0xFF
} __attribute__((packed));
// CAN data forward declarations
struct TCanInit;
struct TCanPkt;
enum TCanChannel {
CANch1 = 0,
CANch2 = 1,
};
enum TLinChannel {
LINch1 = 0,
LINch2 = 1,
#if defined MOBICAR_3
LINch3 = 2,
#endif
};
enum TGuardEvents {
geSetSysMode = 0, // события о смене режима Системы
geRESET = 0, // событие сброс по Питанию
geTEST = 1, // включился режим Теста
geSERVICE = 2, // включился режим Автосервис
geDISARM = 3, // включился режим Вне Охраны
geHIJACK = 4, // включился режим Антизахват
geARM = 5, // включился режим Охрана
geGM6 = 6, // резерв
geGM7 = 7, // резерв
aseSetMode = 8, // события о смене режима Автозапуска
aseIDLE = 8, // Дежурный режим
aseREADY = 9, // Включение поддержки зажигания
asePRESTART_WaitForIgnOn = 10, // Подготовка к запуску двигателя: Ожидание включения Зажигания
asePRESTART_WaitForIgnOff = 11, // Подготовка к запуску двигателя: Ожидание выключения Зажигания
aseCRANK = 12, // Запуск двигателя (стартер)
asePRESUPPORT = 13, //
aseSUPPORT = 14, // Поддержка зажигания после запуска
asePITSTOP = 15, // Режим PITSTOP
aseSTOP = 16, // Режим STOP
aseISOFF = 17, // Режим ISOFF
aseDoorWag = 18, // Махание дверью
aseStopDoorWag = 19, // Остановка процесса махания дверью
aseSetIDLE = 20, // Переход в дежурный режим
aseSetREADY = 21, // Переход в режим поддержки зажигания
aseSetPITSTOP = 22, // Переход в режим PITSTOP
aseSetPRESTART = 23, // Переход в режим подготовки к запуску двигателя
aseSetSUPPORT = 24, // Переход в режим поддержки зажигания
aseSetSTOP = 25, // Остановка двигателя
aseSetISOFF = 26, // Выключение поддержки зажигания
aseLauncher = 27, // Мотор запущен внешним запуском
asePreHeater = 28, // Предпусковой подогреватель включен
aseASM21 = 29, // резерв
aseReloadTimer = 30, // продление/перезагрузка времени режима
aseCommandError = 31, // ошибка выполнения команды или не возможность выполнить команду
// Общие события
geLocked = 32, // ЦЗ закрыт
geUnLocked = 33, // ЦЗ открыт
geBlockageOff = 34, // Блокировка выключена
geBlockageOn = 35, // Блокировка включена
geReservationOff = 36, // Резервирование выключено
geReservationOn = 37, // Резервирование включено
geEngineStopped = 38, // Двигатель остановился
geEngineRuns = 39, // Двигатель завелся
geTurboTimerEnd = 40, // Турботаймер завершился
geTurboTimerStart = 41, // Турботаймер запустился
gePanicOff = 42, // выключился режим Паника
gePanicOn = 43, // включился режим Паника
geArmDefeatZone = 44, // оповещение об открытых зонах во время постановки в Охрану
geAlarmOff = 45, // выключился режим Тревоги
geAlarmOn = 46, // включить тревогу снова
geDoorsAlarm = 47, // включилась Тревога по дверям (салону)
geTrunkAlarm = 48, // включилась Тревога по багажнику
geHoodAlarm = 49, // включилась Тревога по капоту
geIgnAlarm = 50, // включилась Тревога по зажиганию
geShockAlarm = 51, // включилась Тревога по датчику Удара
geResetAlarm = 52, // включилась Тревога по сбросу Питания
geDoorsDefeated = 53, // отключилась охранная зона по двери
geTrunkDefeated = 54, // отключилась охранная зона по багажнику
geHoodDefeated = 55, // отключилась охранная зона по капоту
geIgnDefeated = 56, // отключилась охранная зона по зажиганию
geShockDefeated = 57, // отключилась охранная зона по датчику Удара
geTrunkOpened = 58, // багажник открыт
geTrunkClosed = 59, // багажник закрыт
geShockNotify = 60, // предупреждение по датчику Удара
geShockArmOff = 61, // оперативное отключение зоны датчика Удара
geCarOwnerCall = 62, // вызов владельца автомобиля
geTiltAlarm = 63, // включилась Тревога по датчику Наклона
geTiltDefeated = 64, // отключилась охранная зона по датчику Наклона
geValetArm = 65, // событие поставить в Охрану в режиме Автосервис
geValetDisarm = 66, // событие снять с Охраны в режиме Автосервис
geAlarmEnd = 67, // событие прекращения тревоги
geTrunkUnLock = 68, // багажник отпирается или отперт
geTrunkLock = 69, // багажник запирается или заперт
geImHereOff = 70, // выключился механизм поиска Автомобиля на стоянке
geImHereOn = 71, // включился механизм поиска Автомобиля на стоянке
geMotionAlarm = 72, // включилась Тревога по датчику Перемещений
geMotionDefeated = 73, // отключилась охранная зона по датчику Перемещений
geArmed = 74, // Система встала под Охрану
geArmReturnOff = 75, // Перепостановка отключена
geArmReturnOn = 76, // Активирован режим перепостановки
geAux1Off = 77, // Доп.канал #1 выключен
geAux1On = 78, // Доп.канал #1 включен
geAux2Off = 79, // Доп.канал #2 выключен
geAux2On = 80, // Доп.канал #2 включен
geAux3Off = 81, // Доп.канал #3 выключен
geAux3On = 82, // Доп.канал #3 включен
geSensorAlarm = 83, // тревога по внешнему Сенсору
geSensorDefeated = 84, // отключилась охранная зона по входу от внешнего Сенсора
geHandsfreeDisabled = 85, // сообщение о временном запрете Автопостановки/Автоснятия
geHandsfreeEnabled = 86, // сообщение о разрешении Автопостановки/Автоснятия
geValetDisabledByImm = 87, // включение режима Автосервис заблокировано по причине активированного Иммобилайзера
geDisarmDisabledByTag = 88, // снятие с Охраны заблокировано по причине отсутствия Метки
geUnTrunkDisabledByTag = 89, // отпирание багажника заблокировано по причине отсутствия Метки
geImmoIndicationStart = 90, // индикация включенного иммобилайзера
geSensorNotify = 91, // предупреждение по внешнему Сенсору
geDrivingEnabled = 92, // поездка разрешена (иммобилайзер был отключен ПИН кодом)
geTripFinish = 93, // Поездка закончилась
geTripStart = 94, // Поездка началась
geTripPaused = 95, // Поездка приостановилась
// Команды Брелока (176+)
bcSendState = 0xB0, // Выслать текущий режим Системы (она же ресинхронизация)
bcChangeSoundMode, // Изменение режима выдачи звуков
bcChangeShockMode, // Изменение режима работы датчика Удара
bcChangeAutomatics, // Изменения в режимах работы Автоматических запусков
bcChangeInternetOption, // Изменения в режиме работы INTERNET опции
bcProgMenuEnter, // Перевести брелок в меню программирования
bcProgMenuExit, // Выход из меню программирования Брелока
vmShowPinCode, // Показать на индикаторе текущее значение ПИН-кода
bcProgMenu2, // Переход к меню 2
bcBleMenuEnter, // Переход к меню спаривания BLE
bcHandsfreeModeChange, // Изменение режима работы "Свободных рук"
geDEBUG = 0xFE,
geNONE = 0xFF // нет события, т.е. его не нужно никуда отправлять
};
union TDiagnosticTroubleCode {
uint16_t B1B0;
uint8_t Byte[2];
struct {
uint8_t B0;
uint8_t B1;
} __attribute__((packed));
struct {
uint16_t X:4;
uint16_t N:2;
uint16_t K:2;
uint16_t Z:4;
uint16_t Y:4;
} __attribute__((packed));
} __attribute__((packed));
#endif /* COMMON_COMMONTYPES_H_ */

329
libs/IO.h Normal file
View 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_ */

212
libs/LinBus.h Normal file
View File

@@ -0,0 +1,212 @@
/*
* LinBus.h
*
* Created on: 17 дек. 2015 г.
* Author: esaulenko
*/
#ifndef DRIVERS_LINBUS_H_
#define DRIVERS_LINBUS_H_
#ifndef CAN_FIRMWARE
#include "KLineDrv.h"
#include "ImoDrv.h"
#include "Buffer.h"
#include "SysTimer.h"
#include "scmRTOS/scmRTOS.h"
extern CLin LinBus1;
extern CLin LinBus2;
extern CLin LinBus3;
union TLinInit;
#endif // CAN_FIRMWARE
#include "LinFrame.h"
class CLin
{
public:
enum TLinMode {
Mode_RawNoParity, // без стандарта, принимает-передаёт любые пакеты (без чётности)
Mode_Master, // LIN-мастер
Mode_Slave, // LIN-слейв
Mode_RawEvenParity, // без стандарта, байты с проверкой на чётность
Mode_RawOddParity, // без стандарта, байты с проверкой на нечётность
Mode_Raw9bit, // без стандарта, в байте 9 бит данных без чётности
Mode_RawIgnoreError, // без стандарта, принимаются байты без чётности, стоп-бита и т.д.
Mode_RawStop2bit, // без стандарта, 2 стоп-бита
Mode_ImoImi, // протокол Toyota (старый), 48.8 бит/сек, 16 бит данных
Mode_ImoRenault, // протокол Renault, 81,4 бит/с
Mode_ImoImi2, // протокол Toyota (новый), 195.3 бит/сек, 32 бита данных
Mode_FordDstTx, // протокол Ford DST80 (ШИМ, 1 бит = 1 мс / 0,5 мс)
Mode_FordUartRx, // протокол Ford (UART 15625 бит/с, 384 мкс между байтами)
Mode_Haval, // протокол с импульсами подтверждения (фильтрация/генерация)
Mode_FordDstInversion, // протокол Ford DST80 (ШИМ, 1 бит = 1 мс / 0,5 мс, ИНВЕРСНЫЙ сигнал)
};
#ifndef CAN_FIRMWARE
CLin(const KLineHw & cfg) : _drv(cfg, this), _imoDrv(this, cfg)
{}
uint32_t Init(const TLinInit & init);
// Для режима Haval
void InitEXTI(void);
void DeinitEXTI(void);
void EdgeRcv(const bool newVal);
void CheckTimeout(void);
int32_t GetFrame(TLinFrame & aFrame);
uint32_t SendFrame(const TLinFrame & aFrame);
void Sleep(const bool sleepEnable);
// вызывается из обработчиков прерываний:
// приём/передача UART
void IrqUart(void)
{ _drv.IrqProcess(); }
// передача UART по таймеру
uint32_t IrqTimerSend(void)
{ return _drv.IrqTimerSend(); }
// фронт в режиме IMO/IMI
void IrqImoEdge(const bool val)
{
Sleep(false);
if (_mode == Mode_Haval)
EdgeRcv(val);
else
_imoDrv.rx.EdgeRcv(val);
}
// таймер передачи в режиме IMO/IMI (только для LIN1)
void IrqImoSend(void)
{ _imoDrv.tx.IrqSetNextBit(); }
// управление выходом напрямую, как GPIO
void SetOutput(const bool setZero);
private:
CKLineDrv _drv;
CImoDrv _imoDrv;
// вызывается из прерывания по приёму
void DataRcvd(uint16_t data);
void BreakRcvd(void);
void ErrorRcvd(void);
// вызывается из прерываний IMO/IMI
void DataImiRcvd(const uint8_t * data, uint32_t data_len);
// вызывается из прерывания по передаче
bool IsTxData(void)
{ return _tx_buf.Avail() > 0; }
uint16_t GetTxData(void)
{ return _tx_buf.Get(); }
void TxComplete(void);
friend CKLineDrv;
friend CImoDrv;
TLinMode _mode;
union {
bool _mode9bit = false;
bool _InverseSignal; // инверсия входного сигнала
};
// не-UART протоколы на таймере
bool isCustomMode(void) const
{
return _mode == Mode_ImoImi ||
_mode == Mode_ImoImi2 ||
_mode == Mode_ImoRenault ||
_mode == Mode_FordDstTx ||
_mode == Mode_FordDstInversion;
}
enum {
State_NoInit,
State_BusOff,
State_Idle,
State_WaitSync,
State_WaitId,
State_WaitData,
State_SlaveTxData,
} _state = State_NoInit;
TLinFrame _rx_frame;
TimerMs _rx_tmr;
uint32_t _rx_timeout;
TimerMs _sleep_tmr;
uint32_t _sleep_timeout;
uint8_t _bytecnt; // счетчик байт для Mode_Haval
uint8_t _bytes_noack; // кол-во байт без подтверждения для Mode_Haval
uint8_t _bytes_ack; // кол-во байт c подтверждением для Mode_Haval
// TimerUs _ack_tmr; // таймер для генерации импульов Mode_Haval
uint8_t _bit_length_us;
uint16_t _ack_pause_us;
bool FrameToRxQueue(void);
CircularBuffer<TLinFrame, 8> _rx_queue;
CircularBuffer<uint16_t, 16> _tx_buf; // буфер на передачу
TLinFrame _tx_fr_buf[16]; // кадры для передачи slave'ом
TLinFrame*_tx_fr_cur = _tx_fr_buf; // текущий передающийся кадр
bool StartSlaveTx(uint8_t id); // функция отправки этого кадра
TLinFrame * getTxFrame(void) // забрать фрейм из буфера (для imo_drv)
{
for (auto & it: _tx_fr_buf)
if (it.data_len > 0)
return &it;
return nullptr;
}
// возвращает номер канала
inline TLinChannel Instance(void) const
{
#ifdef MOBICAR_3
if (this == &LinBus3)
return LINch3;
#endif
if (this == &LinBus2)
return LINch2;
return LINch1;
}
#endif // not CAN_FIRMWARE
};
union TLinInit
{
struct TLin
{
uint16_t baudrate;
CLin::TLinMode mode;
uint32_t rxTimeout;
uint32_t sleepTimeout;
}Lin;
struct THaval
{
uint16_t baudrate;
CLin::TLinMode mode;
uint16_t rxTimeout;
uint32_t sleepTimeout;
uint8_t bytes_noack; // кол-во байт без подтверждения
uint8_t bytes_ack; // кол-во байт c подтверждением
uint16_t ack_pause_us; // пауза в us перед ack в режиме генерации (0-режим фильтрации)
}Haval;
};
#endif /* DRIVERS_LINBUS_H_ */

81
libs/LinFrame.h Normal file
View File

@@ -0,0 +1,81 @@
/*
* LinFrame.h
*
* Created on: 26 дек. 2015 г.
* Author: esaulenko
*/
#ifndef DRIVERS_LIN_LINFRAME_H_
#define DRIVERS_LIN_LINFRAME_H_
#include <cstdint>
#include "Utils.h"
class TLinFrame
{
private:
enum { MaxDataLen = 16, };
public:
TLinFrame():
data_len(-1) // изначально буфер пустой
{}
uint8_t id;
int8_t data_len; // знак используется при приёме
uint16_t data[MaxDataLen + 1]; // data + chksum
// посчитать контрольную сумму по стандарту 1.1 (без ID) или по стандарту 2.0 (c ID)
uint8_t CalcChksum (bool new_mode)
{
data_len = MIN (data_len, MaxDataLen);
uint32_t chksum = new_mode ? id : 0;
for (int i = 0; i < data_len; i++)
{
chksum += data[i];
if (chksum > 0xFF)
chksum -= 0xFF;
}
return ~ chksum;
}
// добавить контрольную сумму в пакет
void AddChksum (bool new_mode)
{ data[data_len] = CalcChksum (new_mode); }
// проверить контрольную сумму пакета
bool IsChksumCorrect (bool new_mode)
{ return data[data_len] == CalcChksum (new_mode); }
// посчитать контрольные (старшие) биты в идентификаторе
void CalcIdChksum (uint8_t aId)
{
// byte = p7 p6 b5..b0
// P6 = b0 ^ b1 ^ b2 ^ b4
// P7 = ~ (b1 ^ b3 ^ b4 ^ b5)
uint8_t P6 = (aId >> 0) ^ (aId >> 1) ^ (aId >> 2) ^ (aId >> 4);
uint8_t P7 = (aId >> 1) ^ (aId >> 3) ^ (aId >> 4) ^ (aId >> 5);
P6 = ( P6 & 0x01) << 6;
P7 = ((~P7) & 0x01) << 7;
id = P7 | P6 | (aId & 0x3F);
}
// скопировать данные в кадр (до 8 байт)
template <int N>
inline void SetData (const char (&data_str)[N])
{
data_len = MIN (N - 1, MaxDataLen);
for (int i = 0; i < data_len; i++)
data[i] = (uint8_t)data_str[i];
}
};
#endif /* DRIVERS_LIN_LINFRAME_H_ */

9
libs/ModelName.h Normal file
View File

@@ -0,0 +1,9 @@
#pragma once
#if defined MOBICAR_1_2
#define M_NAME "M2_"
#elif defined MOBICAR_3
#define M_NAME "M3_"
#endif

166
libs/Periodic.h Normal file
View File

@@ -0,0 +1,166 @@
/*
* Periodic.h
*
* Создан: 09 окт. 2015 г.
* Автор: esaulenko
*
* Изменен: 21 ноя. 2019 г.
* Автор: gavrilov
*/
#ifndef PERIODIC_H_
#define PERIODIC_H_
#include <cstdint>
#include <cstddef>
#include "SysTimer.h"
#include "Utils.h"
template <uint nTasks>
class CPeriodic
{
private:
typedef void (* TPeriodicTask) (TCanFwMem * apMem);
public:
// добавить новую функцию для периодического вызова. Обычно выполняется один раз.
void AddTask(const uint iTask, TPeriodicTask TaskHandler = nullptr, const uint32_t msTime = 0)
{
if (iTask < nTasks)
{
Tasks[iTask].Handler = TaskHandler;
SetTimeout(iTask, msTime);
}
}
// Установить время, через которое надо будет вызвать периодическую функцию
void SetTimeout(const uint iTask, uint32_t msTime = 0)
{
if (iTask < nTasks)
{// индекс не превышает размер массива
// Если вызов происходит из <Process>, то местный таймер уже был сброшен.. и, соответственно, нужно только обновить
// значение периода.. а пересчет минимального времени, также произойдет при выходе из <Process>..
// При вызове же вне <Process>, ни местный таймер не сбрасывается, ни пересчет периода не происходит..
if (!Mutex)
{// При вызове вне <Process>:
// 1. Нужно обязательно вызывать метод <SetNextCall>, т.к. следующий период может как удлиниться, так и укоротиться.
// 2. А для того, чтобы метод <SetNextCall> правильно выставил время следующего вызова <Process>,
// требуется пересчитать все текущие периоды с учетом набега времени.
// 3. А раз нам требуется пересчитать все текущие периоды, то значит мы должны пересбросить местный
// таймер отсчета времени.
// 4. Однако, т.к. отсюда нельзя вызывать обработчики, то тем периодам, что окончились здесь,
// приходится ставить минимальное значение =1, чтобы обеспечить как можно скорее вызов обработчика <Process>.
//
auto elapsed = Timer.Restart();
if (elapsed)
for (auto & Task: Tasks)
// Пройдемся по всем задачам..
if (Task.Timeout)
{
// task enabled
if (Task.Timeout > elapsed)
Task.Timeout -= elapsed;
else
// Отсюда мы не можем вызвать обработчик, поэтому просто ставим минимальное время..
Task.Timeout = 1;
}
}
if (Tasks[iTask].Handler == nullptr)
// Если обработчик неопределен.. остановить задачу..
msTime = 0;
// Установить время..
Tasks[iTask].Timeout = msTime;
// Всегда сбрасывать признак выполненной задачи, т.к. только-что для нее был выставлен новый период..
// ..следовательно, предыдущий период уже стал неактуальным..
Tasks[iTask].Done = false;
// Пересчитать интервалы..
if (!Mutex)
// ..здесь только для вызывов извне <Process>..
SetNextCall();
}
}
// остановить задачу
void Stop(const uint iTask)
{
if (iTask < nTasks)
{
Tasks[iTask].Timeout = 0;
Tasks[iTask].Done = false;
}
}
// проверить, что задача запущена
bool isActive(const uint iTask) const
{
if (iTask < nTasks)
if (Tasks[iTask].Handler != nullptr)
if (Tasks[iTask].Timeout)
return true;
return false;
}
private:
struct {
TPeriodicTask Handler = nullptr;
uint32_t Timeout = 0;
bool Done = false;
} Tasks[nTasks];
TimerMs Timer;
volatile bool Mutex = false;
// Обработчик, вызывается из PeriodicProcess()
void Process(TCanFwMem * apCanMemory)
{
auto elapsed = Timer.Restart();
if (elapsed)
{
// Сначала нужно обновить периоды всех периодических функций..
for (auto & Task: Tasks)
// Пройдемся по всем задачам..
if (Task.Timeout)
{
// task enabled
if (Task.Timeout > elapsed)
Task.Timeout -= elapsed;
else
{
Task.Done = true;
Task.Timeout = 0;
}
}
// Затем запустить все сработавшие задачи..
Mutex = true; // выставить признак того, что метод <SetTimeout> будет вызван из метода <Process>
for (auto & Task: Tasks)
// Пройдемся по всем задачам..
if (Task.Done)
{// Если задача сработала..
Task.Done = false;
if (Task.Handler != nullptr)
// task exist
Task.Handler(apCanMemory); // ..запустить ее
}
Mutex = false;
// Запустить перерасчет и установку минимального интревала времени для вызова следующей периодической функции
SetNextCall();
}
}
friend void PeriodicProcess(TCanFwMem * vars);
// Расчитать минимальное значение интервала времени для вызова следующей периодической функции
void SetNextCall(void)
{
uint32_t minTime = UINT32_MAX;
for (const auto & Task: Tasks)
if (Task.Timeout)
if (Task.Timeout < minTime)
minTime = Task.Timeout;
if (minTime == UINT32_MAX)
minTime = 0; // Остановить вызов <PeriodicProcess>
CoreFunc->SetPeriod(minTime);
}
};
#endif /* PERIODIC_H_ */

67
libs/Settings.cpp Normal file
View File

@@ -0,0 +1,67 @@
/*
* Settings.cpp
*
* Created on: 12 мая 2015 г.
* Author: esaulenko
*/
#include "Settings.h"
#include "IO.h"
#include "Utils.h"
#include "CanFwInterface.h"
// строки с названиями настроек
#define SETTING(...)
#define SETTING_CAN(...)
#define SETTING_RSRV(...)
#define SETTING_NAME(name, string) \
__attribute__ ((section(".SettingsVarName"))) \
static const char name ## String[] = string;
#include SRC_SETTINGS
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME
// таблица с настройками CAN-прошивки
__attribute__ ((section(".SettingsTable")))
const CSettings::TCANSettingsTable CSettings::CanSettingsTable = {
#define SETTING(name, attr, type, def_val...) \
name, kind_ ## type, attr, sizeof(THeader)+sizeof(type), def_val,
#define SETTING_CAN(name, attr, type, def_val, description) \
name, kind_ ## type, attr, sizeof(THeader)+sizeof(type), def_val,
#define SETTING_RSRV(...) // не используется
#define SETTING_NAME(name, string) \
name, 0x1F, NotFixed, sizeof(THeader)+sizeof(char*), name ## String,
#include SRC_SETTINGS
// 0xffff //LastVal
CSettings::LastVal
};
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME
__attribute__ ((section(".SettingsCanName")))
const char * const CSettings::CanSettingsName[] = {
#define SETTING(...) // names not used
#define SETTING_CAN(name, attr, type, def_val, description) description,
#define SETTING_RSRV(...) // не используется
#define SETTING_NAME(...) // не используется
#include SRC_SETTINGS
};
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME

267
libs/Settings.h Normal file
View File

@@ -0,0 +1,267 @@
/*
* Settings.h
*
* Created on: 12 мая 2015 г.
* Author: esaulenko
*/
#ifndef COMMON_SETTINGS_H_
#define COMMON_SETTINGS_H_
#include "CommonTypes.h"
#include "source/SourcePath.h"
#ifdef SRC_TYPES
#include SRC_TYPES
#endif
class CSettings
{
public:
// глобальная структура с настройками
struct TSettings
{
#define SETTING(...) // не используется
#define SETTING_CAN(name, attrib, type, ...) type name;
#define SETTING_RSRV(...) // не используется
#define SETTING_NAME(...) // не используется
#include SRC_SETTINGS
} __attribute__((packed));
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME
// объявляем номера настроек. этот enum может расти только вниз!
enum TSettingsID : uint16_t
{
#define SETTING(name, ...) name,
#define SETTING_RSRV(name) name,
#define SETTING_ALIAS(name) name,
#include "SettingsTable.h" // настройки ядра
CanSettingsStart = 0x600, // отсюда начинаются настройки CAN-прошивки (ПРИЧЕМ, самой 0x600 не может быть!!! т.к. это enum)
#define SETTING(name, ...) // не используется
#define SETTING_RSRV(name) name,
#define SETTING_CAN(name,...) name,
#define SETTING_NAME(...) // не используется
#include SRC_SETTINGS // собственные настройки CAN-прошивки
LastVal = 0x7FF // последний параметр
};
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME
// значения по умолчанию
enum DefaultValues {
minTimeZone = -9, // значение <-9> из-за ограничения при ручной установке пояса с брелока
defTimeZone = 0,
maxTimeZone = 12,
defClockSyncMode = 2,
maxClockSyncMode = 2,
defTimeZoneSyncMode = 2,
maxTimeZoneSyncMode = 2,
defLightsAutoStartMode = 2,
maxLightsAutoStartMode = 2,
defIlluminationMode = 0,
maxIlluminationMode = 3,
defLockByDriveMode = 0,
maxLockByDriveMode = 3,
defUnlockByParkMode = 0,
maxUnlockByParkMode = 2,
defArmReturnTimeIndex = 0,
minPlafondAlarmDelay = 1,
defPlafondAlarmDelay = 20,//60,
maxPlafondAlarmDelay = 120,
minDoorsLampDeciseconds = 0,
defDoorsLampDeciseconds = 30,
maxDoorsLampDeciseconds = 100,
minTrunkLampDeciseconds = 0,
defTrunkLampDeciseconds = 30,
maxTrunkLampDeciseconds = 100,
minAlarmDoorsDeciseconds = 0,
defAlarmDoorsDeciseconds = 5, // 0.5сек по умолчанию
maxAlarmDoorsDeciseconds = 50, // 5сек максимум
minAlarmTrunkDeciseconds = 0,
defAlarmTrunkDeciseconds = 5, // 0.5сек по умолчанию
maxAlarmTrunkDeciseconds = 100, // 10сек максимум
minKillEngineDeciseconds = 10, // 1.0сек минимум
defKillEngineDeciseconds = 0x80, // по умолчанию, выключено
maxKillEngineDeciseconds = 127, // 12.7сек максимум
defTurboTimerIndex = 0,
minReadyMinutes = 1,
defReadyMinutes = 2,
maxReadyMinutes = 8,
minSupportMinutes = 10,
defSupportMinutes = 20,
maxSupportMinutes = 60,
defPitStopTimeIndex = 1,
minPreHeaterMinutes = 1,
defPreHeaterMinutes = 10,
maxPreHeaterMinutes = 60,
defSetReadyMode = 0,
maxSetReadyMode = 2,
minManualAttempts = 1,
defManualAttempts = 1,
maxManualAttempts = 3,
defClrReadyMode = 0,
maxClrReadyMode = 1,
defPrestartSSB = 0,
maxPrestartSSB = 3,
defStopSSB = 0,
maxStopSSB = 3,
minCrankDelaySeconds = 1,
defCrankDelaySeconds = 3,
maxCrankDelaySeconds = 20,
minAutoStartBatteryLevel = 108,
defAutoStartBatteryLevel = 110|0x80, // выключено по-умолчанию
maxAutoStartBatteryLevel = 126,
minAutoStartTemperature = -30,
defAutoStartTemperature = 0-128, // выключена по-умолчанию
maxAutoStartTemperature = 60,
defDailyRunCountIndex = 0,
defAutomaticsPeriodIndex = 0,
defAutomaticsLimitIndex = 0,
minEngineStartPercent = 40/2,
defEngineStartPercent = 70/2,
maxEngineStartPercent = 100/2,
minEngineRunPercent = 30/2,
defEngineRunPercent = 60/2,
maxEngineRunPercent = 80/2,
minTurboTimerPercent = 150/2,
defTurboTimerPercent = 300/2,
maxTurboTimerPercent = 350/2,
minExternalHeatersTemperature = -20,
defExternalHeatersTemperature = 0-128, // выключена по-умолчанию
maxExternalHeatersTemperature = 20,
maxExternalTemperatureSensorType = 1,
defEmergencyBraking = 2,
maxEmergencyBraking = 2,
maxShockSensTable = 1,
minWaitAnswerTimeout = 5,
defWaitAnswerTimeout = 20,
maxWaitAnswerTimeout = 60,
minCallEndTimeout = 5,
defCallEndTimeout = 10,
maxCallEndTimeout = 60,
minTripEndTimeout = 5,
defTripEndTimeout = 15,
maxTripEndTimeout = 60,
minLowBatteryVoltage = 110,
defLowBatteryVoltage = 118,
maxLowBatteryVoltage = 125,
};
private:
// заголовок таблицы настроек
struct THeader
{
uint16_t ID :11; // идентификатор. Erase=0x000; Core=[0x001..0x5FF]; CanFw=[0x601..0x7FE]; LastVal=0x7FF
uint16_t Kind : 5; // тип данных, см. SettingKind
uint8_t Fixed : 1;
uint8_t Len : 7; // длина с учётом заголовка
// uint8_t Data[0];
bool operator == (const THeader & Header) const // fixed не проверяется!
// { return (ID == Header.ID) && (Kind == Header.Kind) && (Len == Header.Len); }
// { return (*(uint16_t*)this == *(uint16_t*)&Header) && (Len == Header.Len); }
{ return (*(uint16_t*)this == *(uint16_t*)&Header); } // и длина не проверяется!
} __attribute__ ((packed)); // sizeof() = 3
enum {
minRecordSize = sizeof(THeader)+1,
maxRecordSize = sizeof(THeader)+124 // 127 = 3+124 - самый максимум, т.к. Len = 7 бит.
};
// список допустимых типов данных.
// важно! при добавлении новых необходимо расширять список!
enum SettingKind // 0..31
{
kind_bit_t,
kind_uint8_t,
kind_uint16_t,
kind_uint32_t,
kind_int8_t,
kind_int16_t,
kind_int32_t,
kind_array_t,
kind_TInputPinSettings = kind_array_t,
kind_TInputSettings = kind_array_t,
kind_TSequence = kind_array_t,
kind_TCanOutMask = kind_array_t,
kind_uint64_t = kind_array_t,
kind_TKeyAES = kind_array_t,
kind_TVehicleID = kind_array_t,
kind_TStartTimerSetting = kind_array_t,
kind_TImmoKey = kind_array_t,
kind_TPhoneNumber = kind_array_t,
kind_TModemAPN = kind_array_t,
kind_TModemLogin = kind_array_t,
kind_TModemPassword = kind_array_t,
kind_TTagRSSI = kind_array_t,
kind_SettingName = 0x1F // спецзначение - указатель на описание настройки в CAN-прошивке
};
enum SettingAttr
{
NotFixed = 0,
Fixed = 1,
};
// Подбор ближайшего множителя к указанным милисекундам: MUL = ((2^p - 1)*2^5) + m*2^p = 2^(p+5) - 2^5 + m*2^p = (m + 2^5)*2^p - 2^5
static constexpr uint8_t qMS(int ms, int p = 0)
{ return ms < ((127<<p)-64)/2 ? p*32+((2*ms+64-(63<<p))>>(p+1)) : p < 7 ? qMS(ms, p+1) : 0xFF; }
public:
// таблица с настройками CAN-прошивки
struct TCANSettingsTable
{
#define SETTING(name, attr, type, ...) \
THeader hdr_ ## name; type name;
#define SETTING_CAN(name, attr, type, ...) \
THeader hdr_ ## name; type name;
#define SETTING_RSRV(...) // не используется
#define SETTING_NAME(name,string) \
THeader hdr_ ## name ## Str; const char * p ## name ## Str;
#include SRC_SETTINGS
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS
#undef SETTING_CAN
#undef SETTING_NAME
uint16_t last_val;
} __attribute__ ((packed));
// таблица с настройками CAN-прошивки
static const TCANSettingsTable CanSettingsTable;
// таблица с названиями полей CAN-прошивки
static const char * const CanSettingsName[];
};
#endif // COMMON_SETTINGS_H_

687
libs/SettingsTable.h Normal file
View File

@@ -0,0 +1,687 @@
// таблица с используемыми настройками
// выше должно быть определение того, какие поля используются
//#define SETTING(name, attrib, type, def_val)
// при добавлении новых типов данных необходимо расширить enum SettingKind
// SETTING_RSRV позволяет сделать "дырки" в номерах настроек
// если не определена, значит, она не используется
#ifndef SETTING_RSRV
#define SETTING_RSRV(name)
#endif
// SETTING_ALIAS позволяет задавать альтернативные имена для настроек
#ifndef SETTING_ALIAS
#define SETTING_ALIAS(alt_name)
#endif
SETTING_RSRV(Erased = 0) // нулевая настройка используется при удалении какого-либо идентификатора.
// настройки физических входов: 1..9 + 1 резерв
SETTING (iRedBlack, NotFixed, TInputPinSettings, {50, 3, 0})
SETTING (iGreyBlack, NotFixed, TInputPinSettings, {50, 3, 0})
SETTING (iBrownBlack, NotFixed, TInputPinSettings, {50, 3, 0})
SETTING (iGreen, NotFixed, TInputPinSettings, {50, 0, 0})
SETTING (iLBlueBlack, NotFixed, TInputPinSettings, {50, 1, 0})
SETTING (iBlackWhite, NotFixed, TInputPinSettings, {50, 0, 0})
SETTING (iBlackPink, NotFixed, TInputPinSettings, {50, 1, 0})
SETTING (iYellowBlue, NotFixed, TInputPinSettings, {50, 1, 0})
SETTING (iYellowWhite, NotFixed, TInputPinSettings, {50, 1, 0})
#ifndef ipFIRST
#define ipFIRST iRedBlack
#endif
SETTING_ALIAS(ipLAST)
SETTING_ALIAS(ipOFFSET = ipFIRST)
SETTING_ALIAS(ipCOUNT = (ipLAST-ipFIRST))
SETTING_RSRV(ReservedPins = 10)
/* Значения по-умолчанию:
Connector input wires table for FW rev 198:
Red-black wire Doors input (active low)
Grey-black wire Trunk input (active low)
Brown-black wire Hood input (active low)
Green wire Ignition input (active high)
Blue-black wire Handbrake/parking input (active low)
Black-white wire Brake input (active high)
Black-pink wire Tachometer input
*/
// настройки логических входов - 11..74
// Состояние неопределенных устройств (объектов)
SETTING (iDevice1, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice2, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice3, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice4, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice5, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice6, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice7, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDevice8, NotFixed, TInputSettings, {CIO::iNone, 0})
SETTING (iDoorDrv, NotFixed, TInputSettings, {CIO::iRedBlack, CIO::ActiveGND}) // дверь водитель
SETTING (iDoorFP, NotFixed, TInputSettings, {CIO::iRedBlack, CIO::ActiveGND}) // дверь переднего пассажира
SETTING (iDoorRL, NotFixed, TInputSettings, {CIO::iRedBlack, CIO::ActiveGND}) // дверь задняя левая
SETTING (iDoorRR, NotFixed, TInputSettings, {CIO::iRedBlack, CIO::ActiveGND}) // дверь задняя правая
SETTING (iTrunk, NotFixed, TInputSettings, {CIO::iGreyBlack, CIO::ActiveGND}) // багажник
SETTING (iHood, NotFixed, TInputSettings, {CIO::iBrownBlack, CIO::ActiveGND}) // капот
SETTING (iIgn, NotFixed, TInputSettings, {CIO::iGreen, 0}) // Зажигание
SETTING (iHBrake, NotFixed, TInputSettings, {CIO::iLBlueBlack, CIO::ActiveGND}) // ручник
SETTING (iLamp, NotFixed, TInputSettings, {CIO::iNone, 0}) // Головное освещение (фары)
SETTING (iPark, NotFixed, TInputSettings, {CIO::iLBlueBlack, CIO::ActiveGND}) // положение ПАРК
SETTING (iBrake, NotFixed, TInputSettings, {CIO::iBlackWhite, 0}) // педаль тормоза
SETTING (iLeftTurnLight, NotFixed, TInputSettings, {CIO::iNone, 0}) // Включен левый сигнал поворота
SETTING (iRightTurnLight, NotFixed, TInputSettings, {CIO::iNone, 0}) // Включен правый сигнал поворота
SETTING (iArm, NotFixed, TInputSettings, {CIO::iNone, 0}) // для подключения внешнего GSM модуля, например
SETTING (iSensorAlarm, NotFixed, TInputSettings, {CIO::iNone, 0}) // зона тревоги с внешнего Сенсора (MWS или SHOCK)
SETTING (iSensorNotify, NotFixed, TInputSettings, {CIO::iNone, 0}) // зона предупреждения с внешнего Сенсора (MWS или SHOCK)
SETTING (iEngine, NotFixed, TInputSettings, {CIO::iNone, 0}) // двигатель работает
SETTING (iLock, NotFixed, TInputSettings, {CIO::iNone, 0}) // ЦЗ заперт
SETTING (iPreHeater, NotFixed, TInputSettings, {CIO::iNone, 0}) // подогреватель
SETTING (iLowFuelLevel, NotFixed, TInputSettings, {CIO::iNone, 0}) // Датчик низкого уровня топлива
SETTING (iACC, NotFixed, TInputSettings, {CIO::iNone, 0}) // аксессуары
SETTING (iKeyIn, NotFixed, TInputSettings, {CIO::iNone, 0}) // ключ в замке (не нужен!?)
SETTING (iSpark, NotFixed, TInputSettings, {CIO::iNone, 0}) // свечи накаливания дизеля
SETTING (iDoorsLamp, NotFixed, TInputSettings, {CIO::iNone, 0}) // Плафон освещения салона
SETTING (iTrunkLamp, NotFixed, TInputSettings, {CIO::iNone, 0}) // Плафон освещения багажника
SETTING (iTrunkWindow, NotFixed, TInputSettings, {CIO::iNone, 0}) // Концевик окна багажника
SETTING (iStartStop, NotFixed, TInputSettings, {CIO::iNone, 0}) // Вход Старт/Стоп от GSM модуля, например
SETTING (iNeutral, NotFixed, TInputSettings, {CIO::iNone, 0}) // Состояние нейтрали (для РКПП)
SETTING (iLauncher, NotFixed, TInputSettings, {CIO::iNone, 0}) // Состояние внешнего/стороннего модуля Запуска
SETTING (iDisarm, NotFixed, TInputSettings, {CIO::iNone, 0}) // для подключения внешнего GSM модуля, например
SETTING (iUnTrunk, NotFixed, TInputSettings, {CIO::iNone, 0}) // уведомление об отпирании багажника
SETTING (iUnLock, NotFixed, TInputSettings, {CIO::iNone, 0}) // ЦЗ отперт
#ifndef iFIRST
#define iFIRST iDevice1
#endif
SETTING_ALIAS(iLAST)
SETTING_ALIAS(iOFFSET = iFIRST)
SETTING_ALIAS(iCOUNT = (iLAST-iFIRST))
// дырка 75..93
SETTING_RSRV(ReservedInp = 93)
#if defined MOBICAR_3 || defined MAGICAR_X
SETTING (oWirePolarity, NotFixed, uint32_t, 0) // битовая маска: положительная полярность выходных проводов
SETTING (iTaho, NotFixed, TInputSettings, {CIO::iBlackPink, 0}) // мультиплексор для сигнала тахометра
#else
SETTING_RSRV(oWirePolarity)
SETTING (iTaho, NotFixed, TInputSettings, {CIO::iNone, 0}) // мультиплексор для сигнала тахометра
#endif
// настройки выходов - 96..159
// Неопределенные устройства
SETTING (oDevice1, NotFixed, uint32_t, 0)
SETTING (oDevice2, NotFixed, uint32_t, 0)
SETTING (oDevice3, NotFixed, uint32_t, 0)
SETTING (oDevice4, NotFixed, uint32_t, 0)
SETTING (oDevice5, NotFixed, uint32_t, 0)
SETTING (oDevice6, NotFixed, uint32_t, 0)
SETTING (oDevice7, NotFixed, uint32_t, 0)
SETTING (oDevice8, NotFixed, uint32_t, 0)
#if defined MOBICAR_1_2
// Базовые устройства Охранной системы
SETTING (oSiren, NotFixed, uint32_t, oBIT(oBrown)) // Сирена
SETTING (oHorn, NotFixed, uint32_t, 0) // Клаксон
SETTING (oLights, NotFixed, uint32_t, oBIT(oVioletYellow)|oBIT(oVioletBrown))// Поворотники
SETTING (oLamp, NotFixed, uint32_t, 0) // Головное освещение или габариты
SETTING (oPassiveBlockage, NotFixed, uint32_t, 0) // Пассивная блокировка (когда выключена, цепь разомкнута, блокировка включена)
SETTING (oActiveBlockage, NotFixed, uint32_t, oBIT(oBlue)) // Активная блокировка (когда выключена, цепь замкнута, блокировка выключена)
SETTING (oLockDoors, NotFixed, uint32_t, oBIT(oGreen)) // Запереть все двери
SETTING (oUnlockDoors, NotFixed, uint32_t, oBIT(oYellow)) // Отпереть все двери
SETTING (oUnlockDoorDrv, NotFixed, uint32_t, 0) // Отпереть дверь водителя
SETTING (oLockTrunk, NotFixed, uint32_t, 0) // Запереть багажник
SETTING (oUnlockTrunk, NotFixed, uint32_t, 0) // Отпереть багажник
SETTING (oLockHood, NotFixed, uint32_t, 0) // Запереть Капот
SETTING (oUnLockHood, NotFixed, uint32_t, 0) // Отпереть капот
SETTING (oCloseWindows, NotFixed, uint32_t, 0) // Закрыть окна
SETTING (oPreHeaterOn, NotFixed, uint32_t, 0) // Включение предпускового подогревателя
SETTING (oPreHeaterOff, NotFixed, uint32_t, 0) // Выключение предпускового подогревателя
SETTING (oImmOn, NotFixed, uint32_t, 0) // Устройство включающее Иммобилайзер
SETTING (oImmOff, NotFixed, uint32_t, 0) // Устройство выключающее Иммобилайзер
SETTING (oService, NotFixed, uint32_t, 0) // Устройство переводящее автомобиль в Сервисный режим
SETTING (oDisarm, NotFixed, uint32_t, 0) // Устройство осуществляющее снятие с Охраны (можно использовать как выход статической блокировки)
SETTING (oArm, NotFixed, uint32_t, 0) // Устройство осуществляющее постановку под Охрану (можно использовать как выход статической блокировки)
SETTING (oAlarm, NotFixed, uint32_t, 0) // Устройство осуществляющее включение тревоги (можно использовать как выход статической блокировки)
SETTING (oAutoStart, NotFixed, uint32_t, 0) // Состояние Автозапуска
// Базовые устройства АвтоЗапуска (подменяют или имитируют присутствие водителя в автомобиле)
SETTING (oDoorWag, NotFixed, uint32_t, 0) // Устройство махающее дверью
SETTING (oIgn, NotFixed, uint32_t, oBIT(oBrownGreen)) // Включение зажигания
SETTING (oBrake, NotFixed, uint32_t, 0) // Педаль тормоза
SETTING (oKeyIn, NotFixed, uint32_t, 0) // Ключ в замке
SETTING (oAcc, NotFixed, uint32_t, oBIT(oBrownWhite)) // Аксессуары
SETTING (oBrakeControl, Fixed, uint32_t, 0) // не используется. Делать "дырку" нельзя, ломается индексация массива
SETTING (oAuxBrake, NotFixed, uint32_t, 0) // Дополнительная линия педали тормоза
SETTING (oAuxIgn, NotFixed, uint32_t, oBIT(oBrownViolet)) // Дополнительная линия зажигания
SETTING (oSSButton, NotFixed, uint32_t, 0) // Кнопка Старт/Стоп
SETTING (oImmBypass, NotFixed, uint32_t, 0) // Обходчик встроенного иммобилайзера
SETTING (oCrank, NotFixed, uint32_t, oBIT(oBrownYellow)) // Стартер
SETTING (oCrankDisable, NotFixed, uint32_t, 0) // Блокировка Стартера
// Дополнительные
SETTING (oLockIgn, NotFixed, uint32_t, 0) // Блокировка зажигания (когда включена, зажигание заблокировано)
SETTING (oUnLockIgn, NotFixed, uint32_t, 0) // Разблокировка зажигания (когда включена, зажигание разблокировано)
SETTING (oKLine1Relay, NotFixed, uint32_t, 0) // Устройство коммутирующее KLine интерфейс
SETTING (oAux1, NotFixed, uint32_t, 0) // Доп.канал #1
SETTING (oAux2, NotFixed, uint32_t, 0) // Доп.канал #2
SETTING (oAux3, NotFixed, uint32_t, 0) // Доп.канал #3
SETTING (oEmergencyBraking, NotFixed, uint32_t, 0) // Выход сигнала Экстренного торможения
SETTING (oIllumination, NotFixed, uint32_t, 0) // Выход для сигналов вежливой подсветки
SETTING (oFoldMirrors, NotFixed, uint32_t, 0) // Сложить зеркала
SETTING (oUnfoldMirrors, NotFixed, uint32_t, 0) // Разложить зеркала
SETTING (oCloseSunroof, NotFixed, uint32_t, 0) // Закрыть люк
SETTING (oMoveSunroof, NotFixed, uint32_t, 0) // Сдвинуть люк
SETTING (oHeatedSeats, NotFixed, uint32_t, 0) // Обогрев сидений
SETTING (oTriggerDoors, NotFixed, uint32_t, 0) // Триггерное управление замками дверей
SETTING (oIgnSupport, NotFixed, uint32_t, 0) // Состояние поддержки зажигания
SETTING (oArmWithoutTag, NotFixed, uint32_t, 0) // Состояние "Охрана без метки"
SETTING (oHeatedWindows, NotFixed, uint32_t, 0) // Обогрев окон
SETTING (oKLine2Relay, Fixed, uint32_t, 0) // Mobicar3: Устройство коммутирующее KLine интерфейс
SETTING (oDVR, NotFixed, uint32_t, 0) // Выход на видеорегистратор
#elif defined MOBICAR_3 || defined MAGICAR_X
// Базовые устройства Охранной системы
SETTING (oSiren, NotFixed, uint32_t, oBIT(oBrown)) // Сирена
SETTING (oHorn, NotFixed, uint32_t, 0) // Клаксон
SETTING (oLights, NotFixed, uint32_t, oBIT(oBrownViolet)|oBIT(oBrownWhite))// Поворотники
SETTING (oLamp, NotFixed, uint32_t, 0) // Головное освещение или габариты
SETTING (oPassiveBlockage, NotFixed, uint32_t, 0) // Пассивная блокировка (когда выключена, цепь разомкнута, блокировка включена)
SETTING (oActiveBlockage, NotFixed, uint32_t, oBIT(oBlue)) // Активная блокировка (когда выключена, цепь замкнута, блокировка выключена)
SETTING (oLockDoors, NotFixed, uint32_t, oBIT(oBrownGreen)) // Запереть все двери
SETTING (oUnlockDoors, NotFixed, uint32_t, oBIT(oBrownYellow)) // Отпереть все двери
SETTING (oUnlockDoorDrv, NotFixed, uint32_t, 0) // Отпереть дверь водителя
SETTING (oLockTrunk, NotFixed, uint32_t, 0) // Запереть багажник
SETTING (oUnlockTrunk, NotFixed, uint32_t, 0) // Отпереть багажник
SETTING (oLockHood, NotFixed, uint32_t, 0) // Запереть Капот
SETTING (oUnLockHood, NotFixed, uint32_t, 0) // Отпереть капот
SETTING (oCloseWindows, NotFixed, uint32_t, 0) // Закрыть окна
SETTING (oPreHeaterOn, NotFixed, uint32_t, 0) // Включение предпускового подогревателя
SETTING (oPreHeaterOff, NotFixed, uint32_t, 0) // Выключение предпускового подогревателя
SETTING (oImmOn, NotFixed, uint32_t, 0) // Устройство включающее Иммобилайзер
SETTING (oImmOff, NotFixed, uint32_t, 0) // Устройство выключающее Иммобилайзер
SETTING (oService, NotFixed, uint32_t, 0) // Устройство переводящее автомобиль в Сервисный режим
SETTING (oDisarm, NotFixed, uint32_t, 0) // Устройство осуществляющее снятие с Охраны (можно использовать как выход статической блокировки)
SETTING (oArm, NotFixed, uint32_t, 0) // Устройство осуществляющее постановку под Охрану (можно использовать как выход статической блокировки)
SETTING (oAlarm, NotFixed, uint32_t, 0) // Устройство осуществляющее включение тревоги (можно использовать как выход статической блокировки)
SETTING (oAutoStart, NotFixed, uint32_t, 0) // Состояние Автозапуска
// Базовые устройства АвтоЗапуска (подменяют или имитируют присутствие водителя в автомобиле)
SETTING (oDoorWag, NotFixed, uint32_t, 0) // Устройство махающее дверью
SETTING (oIgn, NotFixed, uint32_t, oBIT(oGreenRelay)) // Включение зажигания
SETTING (oBrake, NotFixed, uint32_t, 0) // Педаль тормоза
SETTING (oKeyIn, NotFixed, uint32_t, 0) // Ключ в замке
SETTING (oAcc, NotFixed, uint32_t, oBIT(oWhiteRelay)) // Аксессуары
SETTING (oBrakeControl, Fixed, uint32_t, 0) // не используется. Выкидывать нельзя, ломается адресация выходов как массива
SETTING (oAuxBrake, NotFixed, uint32_t, 0) // Дополнительная линия педали тормоза
SETTING (oAuxIgn, NotFixed, uint32_t, 0) // Дополнительная линия зажигания
SETTING (oSSButton, NotFixed, uint32_t, 0) // Кнопка Старт/Стоп
SETTING (oImmBypass, NotFixed, uint32_t, 0) // Обходчик встроенного иммобилайзера
SETTING (oCrank, NotFixed, uint32_t, oBIT(oYellowRelay)) // Стартер
SETTING (oCrankDisable, NotFixed, uint32_t, 0) // Блокировка Стартера
// Дополнительные
SETTING (oLockIgn, NotFixed, uint32_t, 0) // Блокировка зажигания (когда включена, зажигание заблокировано)
SETTING (oUnLockIgn, NotFixed, uint32_t, 0) // Разблокировка зажигания (когда включена, зажигание разблокировано)
SETTING (oKLine1Relay, NotFixed, uint32_t, oBIT(oOrangeBreak)) // Устройство коммутирующее KLine интерфейс
SETTING (oAux1, NotFixed, uint32_t, 0) // Доп.канал #1
SETTING (oAux2, NotFixed, uint32_t, 0) // Доп.канал #2
SETTING (oAux3, NotFixed, uint32_t, 0) // Доп.канал #3
SETTING (oEmergencyBraking, NotFixed, uint32_t, 0) // Выход сигнала Экстренного торможения
SETTING (oIllumination, NotFixed, uint32_t, 0) // Выход для сигналов вежливой подсветки
SETTING (oFoldMirrors, NotFixed, uint32_t, 0) // Сложить зеркала
SETTING (oUnfoldMirrors, NotFixed, uint32_t, 0) // Разложить зеркала
SETTING (oCloseSunroof, NotFixed, uint32_t, 0) // Закрыть люк
SETTING (oMoveSunroof, NotFixed, uint32_t, 0) // Сдвинуть люк
SETTING (oHeatedSeats, NotFixed, uint32_t, 0) // Обогрев сидений
SETTING (oTriggerDoors, NotFixed, uint32_t, 0) // Триггерное управление замками дверей
SETTING (oIgnSupport, NotFixed, uint32_t, 0) // Состояние поддержки зажигания
SETTING (oArmWithoutTag, NotFixed, uint32_t, 0) // Состояние "Охрана без метки"
SETTING (oHeatedWindows, NotFixed, uint32_t, 0) // Обогрев окон
SETTING (oKLine2Relay, NotFixed, uint32_t, oBIT(oPinkBreak)) // Mobicar3: Устройство коммутирующее KLine интерфейс
SETTING (oDVR, NotFixed, uint32_t, 0) // Выход на видеорегистратор
//SETTING (oTriggerLights, NotFixed, uint32_t, 0) // Выход на триггерную кнопку включения аварийки
#endif // outputs
#ifndef oFIRST
#define oFIRST oDevice1
#endif
SETTING_ALIAS(oLAST)
SETTING_ALIAS(oOFFSET = oFIRST)
SETTING_ALIAS(oCOUNT = (oLAST-oFIRST))
SETTING_RSRV(ReservedOutput = 159)
// Общий принцип настройки последовательностей:
// Если выход один, либо существует возможность соединить два выхода параллельно, то
// активное значение последовательности должно быть немного (на 10-50мс) задержано по времени
// по отношению к моменту включения пассивного состояния на противоположенной последовательности.
// Например, если у последовательности выключения выхода пассивное состояние наступает через 100мс,
// то активное состояние у последовательности включения должно быть задержано на 110-150мс от начала.
// Еще одно замечание.
// Существуют устройства, которые сами могут отключаться, например, "Замки"/"Зеркала"/"Люк"/"Багажник",
// соответственно их можно только закрыть или открыть.
// А существуют устройства, которые включаются/выключаются по команде.. такие устройства, как правило,
// с бесконечным временем работы, например, "Подогрев сидений"/"Аварийка"/"Фары" и т.п., соответственно их
// можно включить или выключить.
// Соответственно, для устройств, которые могут быть включены/выключены, используются двойные/комплементарные
// импульсные последовательности.
// настройки последовательностей: 160..299
SETTING (seqSirenArm, NotFixed, TSequence, {qMS( 10),5}) // Сирена: Постановка под Охрану
SETTING (seqSirenDisarm, NotFixed, TSequence, {qMS( 10),5,10,5}) // Сирена: Снятие с Охраны
SETTING (seqSirenAlarm, NotFixed, TSequence, {qMS(100),0xF0}) // Сирена: Тревога
SETTING (seqSirenWarning, NotFixed, TSequence, {qMS( 10),0xF2,10,5,10,5,10,5}) // Сирена: Внимание!
SETTING (seqSirenCaution, NotFixed, TSequence, {qMS( 10),5,5,5}) // Сирена: Предупреждение
SETTING (seqSirenNotify, NotFixed, TSequence, {qMS( 10),5}) // Сирена: Извещение
SETTING (seqSirenShockNotify, NotFixed, TSequence, {qMS( 10),0xF2,5,5,5,5,5,5}) // Сирена: Предупреждение по датчику Удара
SETTING (seqSirenService, NotFixed, TSequence, {qMS( 10),0xF2,10,5,10,5,10,5}) // Сирена: Сервисный режим
SETTING (seqSirenDisarmAfterAlarm, NotFixed, TSequence, {qMS( 10),0xF2,10,5,10,5,10,5,10,5})// Сирена: Снятие с Охраны после тревоги
SETTING (seqSirenImHere, NotFixed, TSequence, {qMS( 50),0xF2,4,4,4,4,4,4,4,4,128,0xF3})// Сирена: Поиск автомобиля на парковке
SETTING (seqSirenReserved2, NotFixed, TSequence, {qMS( 0)}) // Сирена: Резерв
SETTING (seqHornArm, NotFixed, TSequence, {qMS( 10),3}) // Клаксон: Постановка под Охрану
SETTING (seqHornDisarm, NotFixed, TSequence, {qMS( 10),3,10,3}) // Клаксон: Снятие с Охраны
SETTING (seqHornAlarm, NotFixed, TSequence, {qMS( 10),5,10,0xF1}) // Клаксон: Тревога
SETTING (seqHornWarning, NotFixed, TSequence, {qMS( 10),0xF2,10,3,10,3,10,3}) // Клаксон: Внимание!
SETTING (seqHornCaution, NotFixed, TSequence, {qMS( 10),3,5,3}) // Клаксон: Предупреждение
SETTING (seqHornNotify, NotFixed, TSequence, {qMS( 10),3}) // Клаксон: Извещение
SETTING (seqHornShockNotify, NotFixed, TSequence, {qMS( 10),0xF2,5,3,5,3,5,3}) // Клаксон: Предупреждение по датчику Удара
SETTING (seqHornService, NotFixed, TSequence, {qMS( 10),0xF2,10,3,10,3,10,3}) // Клаксон: Сервисный режим
SETTING (seqHornDisarmAfterAlarm, NotFixed, TSequence, {qMS( 10),0xF2,10,5,10,5,10,5,10,5})// Клаксон: Снятие с Охраны после тревоги
SETTING (seqHornImHere, NotFixed, TSequence, {qMS( 50),0xF2,4,1,4,1,4,1,4,1,128,0xF3})// Клаксон: Поиск автомобиля на парковке
SETTING (seqHornReserved2, NotFixed, TSequence, {qMS( 0)}) // Клаксон: Резерв
SETTING (seqLightsArm, NotFixed, TSequence, {qMS(100),5}) // Поворотники: Постановка под Охрану
SETTING (seqLightsDisarm, NotFixed, TSequence, {qMS(100),5,5,5}) // Поворотники: Снятие с Охраны
SETTING (seqLightsAlarm, NotFixed, TSequence, {qMS(100),5,5,0xF1}) // Поворотники: Тревога
SETTING (seqLightsWarning, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5}) // Поворотники: Внимание!
SETTING (seqLightsCaution, NotFixed, TSequence, {qMS(100),2,2,2}) // Поворотники: Предупреждение
SETTING (seqLightsNotify, NotFixed, TSequence, {qMS(100),2}) // Поворотники: Извещение
SETTING (seqLightsShockNotify, NotFixed, TSequence, {qMS(100),3}) // Поворотники: Предупреждение по датчику Удара
SETTING (seqLightsService, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5}) // Поворотники: Сервисный режим
SETTING (seqLightsDisarmAfterAlarm, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5,5,5})// Поворотники: Снятие с Охраны после тревоги
SETTING (seqLightsImHere, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,0xF3}) // Поворотники: Поиск автомобиля на парковке
SETTING (seqLightsAutoStartMode, NotFixed, TSequence, {qMS(100),0xF2,10,5,30,0xF3}) // Поворотники: Режим AutoStart
SETTING (seqLightsAutoStartOnOff, NotFixed, TSequence, {qMS(100),14}) // Поворотники: Включение/выключение режима AutoStart
SETTING (seqLampArm, NotFixed, TSequence, {qMS(100),5}) // Фары/габариты: Постановка под Охрану
SETTING (seqLampDisarm, NotFixed, TSequence, {qMS(100),5,5,5}) // Фары/габариты: Снятие с Охраны
SETTING (seqLampAlarm, NotFixed, TSequence, {qMS(100),5,5,0xF1}) // Фары/габариты: Тревога
SETTING (seqLampWarning, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5}) // Фары/габариты: Внимание!
SETTING (seqLampCaution, NotFixed, TSequence, {qMS(100),2,2,2}) // Фары/габариты: Предупреждение
SETTING (seqLampNotify, NotFixed, TSequence, {qMS(100),2}) // Фары/габариты: Извещение
SETTING (seqLampShockNotify, NotFixed, TSequence, {qMS(100),3}) // Фары/габариты: Предупреждение по датчику Удара
SETTING (seqLampService, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5}) // Фары/габариты: Сервисный режим
SETTING (seqLampDisarmAfterAlarm, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,5,5,5,5,5})// Фары/габариты: Снятие с Охраны после тревоги
SETTING (seqLampImHere, NotFixed, TSequence, {qMS(100),0xF2,2,5,5,0xF3}) // Фары/габариты: Поиск автомобиля на парковке
SETTING (seqLampAutoStartMode, NotFixed, TSequence, {qMS(100),0xF2,10,5,30,0xF3}) // Фары/габариты: Режим AutoStart
SETTING (seqLampAutoStartOnOff, NotFixed, TSequence, {qMS(100),14}) // Фары/габариты: Включение/выключение режима AutoStart
SETTING (seqActiveBlockageOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включить активную блокировку
SETTING (seqActiveBlockageOff, NotFixed, TSequence, {qMS( 10),0}) // Выключить активную блокировку
SETTING (seqPassiveBlockageOn, NotFixed, TSequence, {qMS( 10),0}) // Включить пассивную блокировку
SETTING (seqPassiveBlockageOff, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Выключить пассивную блокировку
SETTING (seqLockDoors, NotFixed, TSequence, {qMS( 10),0xF2,1,50}) // Запереть центральный замок (периметр/двери)
SETTING (seqUnlockDoors, NotFixed, TSequence, {qMS( 10),0xF2,1,50}) // Отпереть центральный замок
SETTING (seqUnlockDoorDrv, NotFixed, TSequence, {qMS( 10),0xF2,1,50}) // Отпереть только дверь водителя
SETTING (seqLockHood, NotFixed, TSequence, {qMS( 10),0xF2,1,80}) // Запереть капот
SETTING (seqUnlockHood, NotFixed, TSequence, {qMS( 10),0xF2,1,80}) // Отпереть капот
SETTING (seqUnlockHoodService, NotFixed, TSequence, {qMS(100),0xF2,25,8}) // Отпереть капот в режиме Автосервис
SETTING (seqLockTrunk, NotFixed, TSequence, {qMS( 10),0xF2,1,50}) // Запереть багажник
SETTING (seqUnlockTrunk, NotFixed, TSequence, {qMS( 10),0xF2,1,50}) // Отпереть багажник
SETTING (seqCloseWindows, NotFixed, TSequence, {qMS(100),200}) // Закрыть окна
SETTING (seqPreHeaterOn, NotFixed, TSequence, {qMS(100),0xF2,1,0xF0}) // Включить предпусковой подогреватель <oPreHeaterOn>
SETTING (seqPreHeaterOff, NotFixed, TSequence, {qMS(100),0xF2,1,10}) // Выключить предпусковой подогреватель <oPreHeaterOff>
SETTING (seqUnused1, NotFixed, TSequence, {qMS( 0)}) // Неиспользуется
SETTING (seqUnused2, NotFixed, TSequence, {qMS( 0)}) // Неиспользуется
SETTING (seqUnused3, NotFixed, TSequence, {qMS( 0)}) // Неиспользуется
SETTING (seqUnused4, NotFixed, TSequence, {qMS( 0)}) // Неиспользуется
SETTING (seqImmOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включить Иммобилайзер <oImmOn>
SETTING (seqImmOff, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Выключить Иммобилайзер <oImmOff>
SETTING (seqServiceOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включение <oService>
SETTING (seqServiceOff, NotFixed, TSequence, {qMS( 10),0}) // Выключение <oService>
SETTING (seqDisarmOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включение <oDisarm>
SETTING (seqDisarmOff, NotFixed, TSequence, {qMS( 10),0}) // Выключение <oDisarm>
SETTING (seqArmOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включение Охраны <oArm>
SETTING (seqArmOff, NotFixed, TSequence, {qMS( 10),0}) // Выключение Охраны <oArm>
SETTING (seqAlarmOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включение Тревоги <oAlarm>
SETTING (seqAlarmOff, NotFixed, TSequence, {qMS( 10),0}) // Выключение Тревоги <oAlarm>
SETTING (seqAutoStartOn, NotFixed, TSequence, {qMS(100),0}) // Включение Автозапуска <oAutoStart>
SETTING (seqAutoStartDone, NotFixed, TSequence, {qMS(100),0}) // Успешный пуск Автозапуска <oAutoStart>
SETTING (seqAutoStartOff, NotFixed, TSequence, {qMS(100),0}) // Выключение Автозапуска <oAutoStart>
SETTING (seqLockIgnOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включить блокировку зажигания <oLockIgn>
SETTING (seqLockIgnOff, NotFixed, TSequence, {qMS( 10),0}) // Выключить блокировку зажигания <oLockIgn>
SETTING (seqUnLockIgnOn, NotFixed, TSequence, {qMS( 10),0xF2,1,0xF0}) // Включить разблокировку зажигания <oUnLockIgn>
SETTING (seqUnLockIgnOff, NotFixed, TSequence, {qMS( 10),0}) // Выключить разблокировку зажигания <oUnLockIgn>
SETTING (seqAux1, NotFixed, TSequence, {qMS(100),5}) // Сигнал включения Доп.канала #1 <oAux1>
SETTING (seqAux2, NotFixed, TSequence, {qMS(100),5}) // Сигнал включения Доп.канала #2 <oAux2>
SETTING (seqAux3, NotFixed, TSequence, {qMS(100),5}) // Сигнал включения Доп.канала #3 <oAux3>
// Последовательности для модуля Запуска
SETTING (seqDoorWag, NotFixed, TSequence, {qMS(100),0xF2,5,5,5}) // Махнуть дверью: пауза для некоторых тормозных НИССАНов (Демин/Семибратов просили добавить)
SETTING (seqImmByOff, NotFixed, TSequence, {qMS(100),6}) // Обходчик иммобилайзера: выключить
SETTING (seqImmByOn, NotFixed, TSequence, {qMS(100),0xF2,1,0xF0}) // Обходчик иммобилайзера: включить
SETTING (seqKeyInOff, NotFixed, TSequence, {qMS(100),5}) // Ключ в замке: выключить
SETTING (seqKeyInOn, NotFixed, TSequence, {qMS(100),0xF2,2,0xF0}) // Ключ в замке: включить
SETTING (seqAccOff, NotFixed, TSequence, {qMS(100),4}) // Аксессуары: выключить
SETTING (seqAccOn, NotFixed, TSequence, {qMS(100),0xF2,3,0xF0}) // Аксессуары: включить
SETTING (seqIgnOff, NotFixed, TSequence, {qMS(100),3}) // Зажигание 1: выключить
SETTING (seqIgnOn, NotFixed, TSequence, {qMS(100),0xF2,5,0xF0}) // Зажигание 1: включить
SETTING (seqBrakeOff, NotFixed, TSequence, {qMS(100),2}) // Педаль тормоза: выключить
SETTING (seqBrakeOn, NotFixed, TSequence, {qMS(100),0xF2,5,0xF0}) // Педаль тормоза: включить
SETTING (seqCrankOn, NotFixed, TSequence, {qMS(100),0xF2,10,30}) // Стартер: включить
SETTING (seqCrankDisableOff, NotFixed, TSequence, {qMS(100),7}) // Блокировка стартера: выключить
SETTING (seqCrankDisableOn, NotFixed, TSequence, {qMS(100),0xF0}) // Блокировка стартера: включить
SETTING (seqAuxIgnOff, NotFixed, TSequence, {qMS(100),3}) // Зажигание 2: выключить
SETTING (seqAuxIgnOn, NotFixed, TSequence, {qMS(100),0xF2,5,0xF0}) // Зажигание 2: включить
SETTING (seqAuxBrakeOff, NotFixed, TSequence, {qMS(100),1}) // Педаль тормоза 2: выключить
SETTING (seqAuxBrakeOn, NotFixed, TSequence, {qMS(100),0xF2,6,0xF0}) // Педаль тормоза 2: включить
SETTING (seqPrestartSSB, NotFixed, TSequence, {qMS(100),0xF2,10,6}) // Первое нажатие на SSB в SetPRESTART
SETTING (seqCrankSSB, NotFixed, TSequence, {qMS(100),0xF2,10,30}) // Нажатие на SSB во время CRANK
SETTING (seqStopSSB, NotFixed, TSequence, {qMS(100),0xF2,21,6}) // Первое нажатие на SSB в SetSTOP, при неавтоматическом подборе нажатий! (пауза в начале для учета параллельных процессов связанных с окончанием, например, включение/выключение обходчика и др.)
SETTING (seqPressSSB, NotFixed, TSequence, {qMS(100),0xF2,10,6}) // Сигнал дополнительных/повторных нажатий на SSB (PRESTART/STOP)
SETTING (seqEmergencyBraking, NotFixed, TSequence, {qMS(100),0xF2,5,5,0xF2}) // Сигнал экстренного торможения
SETTING (seqIllumination, NotFixed, TSequence, {qMS(100),20,0xF3,10,0xF5,20,0xF7,20,0xF9,20,0xFB,20,0xFD,20,0xFF,20})// Сигнал вежливой подсветки
SETTING (seqFoldMirrors, NotFixed, TSequence, {qMS(100),0}) // Сложить зеркала
SETTING (seqUnfoldMirrors, NotFixed, TSequence, {qMS(100),0}) // Разложить зеркала
SETTING (seqCloseSunroof, NotFixed, TSequence, {qMS(100),0}) // Закрыть люк
SETTING (seqMoveSunroof, NotFixed, TSequence, {qMS(100),0}) // Сдвинуть люк
SETTING (seqShockAlarmTestMode, NotFixed, TSequence, {qMS( 10),0xF2,5,50}) // Сигнал тревоги по датчику удара в режиме настройки
SETTING (seqHeatedSeatsOn, NotFixed, TSequence, {qMS(100),0}) // Включение подогрева сидений
SETTING (seqHeatedSeatsOff, NotFixed, TSequence, {qMS(100),0}) // Выключение подогрева сидений
SETTING (seqIgnSupportOn, NotFixed, TSequence, {qMS(100),0xF0}) // Статус включение поддержки зажигания
SETTING (seqIgnSupportOff, NotFixed, TSequence, {qMS(100),0}) // Статус выключение поддержки зажигания
SETTING (seqArmWithoutTagOn, NotFixed, TSequence, {qMS(100),0xF2,10,0xF0}) // Включение состояния "Охрана без метки"
SETTING (seqArmWithoutTagOff, NotFixed, TSequence, {qMS(100),0}) // Выключение состояния "Охрана без метки"
SETTING (seqHeatedWindowsOn, NotFixed, TSequence, {qMS(100),0}) // Включение подогрева окон
SETTING (seqHeatedWindowsOff, NotFixed, TSequence, {qMS(100),0}) // Выключение подогрева окон
//SETTING (seqTriggerStart, NotFixed, TSequence, {qMS(100),30}) // Сигнал первого нажатия на триггерную кнопку
//SETTING (seqTriggerNext, NotFixed, TSequence, {qMS( 10),10,10}) // Сигнал всех последующих нажатий на триггерную кнопку
#ifndef seqFIRST // последовательности ядра
#define seqFIRST seqSirenArm
#endif
SETTING_ALIAS(seqHOLE)
SETTING_RSRV(seqProgs = 283)
// Шаблоны CAN прошивки (обезличиненные, приобретают смысл в CAN прошивке)
// В Universe, доп. импульсные последовательности используются максимум 4ре штуки...
// Поэтому, при нехватке последователльностей, можно "откусывать" от программируемых.
SETTING (seqProg16, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg15, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg14, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg13, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg12, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg11, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg10, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg9, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg8, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg7, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg6, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg5, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg4, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg3, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg2, NotFixed, TSequence, {qMS( 0)})
SETTING (seqProg1, NotFixed, TSequence, {qMS( 0)})
SETTING_ALIAS(seqOFFSET = seqFIRST)
SETTING_ALIAS(seqCOUNT = (seqProg1+1-seqFIRST))
SETTING_RSRV(seqLAST = 299)
// прочие системные настройки: 300
SETTING (KeyAES, NotFixed, TKeyAES, {0}) // ключ шифрования
SETTING (Kxx, NotFixed, uint16_t, 37) // ~690RPM // Калибровочный коэф. холостого хода
SETTING (VIN, NotFixed, TVehicleID, {0}) // VIN-код авто
SETTING (ImmoKeyArr, NotFixed, TImmoKey, {0}) // Ключ обходчика иммобилайзера
SETTING_RSRV(BrelokCount) // Количество подшитых брелков X1/X2
SETTING (ImmoKeyAuxArr, NotFixed, TImmoKey, {0}) // Расширение ключа обходчика иммобилайзера (дополнительное поле)
SETTING_RSRV(LastSystemSettings = 0x013F) // 319
// настройки индикации светом: 0x0140 (320)
SETTING (LightsArm, NotFixed, bit_t, 1) // при включении охраны
SETTING (LightsDisarm, NotFixed, bit_t, 1) // при выключении охраны
SETTING (LightsAlarm, NotFixed, bit_t, 1) // при тревоге
SETTING (LightsTrunkLock, NotFixed, bit_t, 0) // при запирании багажника
SETTING (LightsAutoStartMode, NotFixed, uint8_t, defLightsAutoStartMode) // режим работы световой индикации при автозапуске: 0=OFF; 1=при вкл/выкл Автозапуска; 2=..и во время Автозапуска
SETTING_RSRV(AutoStartLightsAlwaysOn) // при работе автозапуска
SETTING_RSRV(LightsAutoStartOff) // при выключении автозапуска
SETTING_RSRV(LightsAuxChannelOn) // при включении дополнительного канала
SETTING (IlluminationMode, NotFixed, uint8_t, defIlluminationMode) // режим включения вежливой подсветки: 0=OFF; 1=Arm; 2=Disarm; 3=Arm+Disarm.
SETTING_RSRV(IndLightIllumDuration) // вежливая подсветка, длительность
SETTING (LightsShockNotify, NotFixed, bit_t, 1) // при срабатывании предупреждения датчика удара
SETTING_RSRV(LightsSelfArming) // предупреждение об автопостановке
SETTING_RSRV(_EmergencyBraking) // выдавать сигнал об экстренном торможении
SETTING_RSRV(LightsHiJackOff) // при выходе из хайджека
SETTING_RSRV(LightsImmoOff) // при выходе из иммобилайзера
SETTING_RSRV(LightsNoReservation) // не выполнена подготовка к автозапуску
SETTING_RSRV(LightsHeadLampOn) // не выключены фары
SETTING_RSRV(IndLightReserved = 0x015F)
// настройки индикации сиреной: 0x0160 (352)
SETTING (SoundArm, NotFixed, bit_t, 1) // при включении охраны
SETTING (SoundDisarm, NotFixed, bit_t, 1) // при выключении охраны
SETTING (SoundsDisable, NotFixed, bit_t, 0) // отключение всех звуков: тревога/подтверждения
SETTING_RSRV(SoundAutoStartOn) // при включении автозапуска
SETTING_RSRV(SoundAutoStartMode) // при остатке времени автозапуска 2 минуты
SETTING_RSRV(SoundAutoStartOff) // при выключении автозапуска
SETTING_RSRV(SoundAuxChannelOn) // при включении дополнительного канала
SETTING_RSRV(SoundShockNotify) // при срабатывании предупреждения датчика удара
SETTING_RSRV(SoundHeadLampOn) // не выключены фары
SETTING_RSRV(SoundSelfArming) // предупреждение об автопостановке
SETTING_RSRV(SoundHiJackOff) // при выходе из режима хайджек
SETTING_RSRV(SoundServiceNotify) // напоминание о необходимости выйти из режима Автосервис
SETTING_RSRV(SoundImmoOff) // при выходе из режима иммобилайзера
SETTING_RSRV(SoundNoReservation) // не выполнена подготовка к автозапуску
SETTING (SoundsNoticesDisable, NotFixed, bit_t, 0) // Отключить все звуки уведомлений
SETTING_RSRV(SoundsReserved = 0x017F)
// настройки центрального замка: 0x0180 (384)
SETTING_RSRV(LockOnAutoArm) // запирание при автопостановке
SETTING_RSRV(LockOnArmReturn) // запирание при возврате в охрану
SETTING (LockByDriveMode, NotFixed, uint8_t, defLockByDriveMode) // режим запирания ЦЗ: нет / по педали тормоза / по началу движения / по включению зажигания
SETTING (LockOnAutostartBegin, NotFixed, bit_t, 0) // запирание при начале автозапуска
SETTING (LockOnAutostartEnd, NotFixed, bit_t, 0) // запирание по окончанию автозапуска
SETTING (LockOnAlarmEnd, NotFixed, bit_t, 0) // запирание при выходе из тревоги
SETTING (LockOnTrunkClose, NotFixed, bit_t, 0) // запирание по завершению процедуры открытия багажника в Охране
SETTING (UnlockByParkMode, NotFixed, uint8_t, defUnlockByParkMode)// отпирание при выключении зажигания
SETTING_RSRV(UnlockByEmergencyBraking) // отпирание при экстренном торможении
SETTING (UnlockPriority, NotFixed, bit_t, 0) // приоритетное отпирание замков
SETTING (DriveDoorsAutostart, NotFixed, bit_t, 0) // Управлять замками дверей по SlaveArm/SlaveDisarm в режиме Автозапуска
SETTING_RSRV(LockReserved = 0x019F)
// настройки режимов "охрана", "снято с охраны": 0x01A0 (416)
SETTING_RSRV(ArmAuto) // автопостановка при закрытии дверей, нет / по закрытию дверей / по отсутствию метки
SETTING_RSRV(ArmAutoTimeout) // таймаут автопостановки
SETTING (Comfort, NotFixed, uint8_t, 1) // управление функциями "комфорта": зеркала, стекла, люк
SETTING (ArmReturnTimeIndex, NotFixed, uint8_t, defArmReturnTimeIndex) // индекс массива времен автоматической перепостановки
SETTING (PlafondAlarmDelay, NotFixed, uint8_t, defPlafondAlarmDelay) // время блокировки тревог от сигналов освещения багажника и салона
SETTING (DoorsLampDeciseconds, NotFixed, uint8_t, defDoorsLampDeciseconds)// таймер отсрочки выключенного состояния плафона освещения салона
SETTING (TrunkLampDeciseconds, NotFixed, uint8_t, defTrunkLampDeciseconds)// таймер отсрочки выключенного состояния плафона освещения багажника
SETTING (HandsfreeMode, NotFixed, uint8_t, 0) // постановка/снятие при появлении телефона-метки: бит 0 - автопостановка, бит 1 - автоснятие
SETTING (DisarmWithTagOnly, NotFixed, bit_t, 0) // снятие с охраны только при наличии телефона-метки, прерывание тревоги не запрещает
SETTING (DriveBuiltinSystem, NotFixed, bit_t, 1) // управлять штатной системой авто
SETTING (SlaveModeEnable, NotFixed, bit_t, 0) // управление от штатной системы
SETTING (SlaveComfort, NotFixed, bit_t, 0) // управлять комфортом при постановке в Охрану по SLAVE.
SETTING (DisarmEmergPinVal, NotFixed, uint16_t, 1111) // ПИН-код для аварийного снятия с охраны
SETTING_RSRV(ArmAutoReadyNote) // предупреждение о готовности к автопостановке
SETTING (SlaveDisarmWithTagOnly,NotFixed, bit_t, 0) // снятие с охраны по SLAVE-входу только при наличии телефона-метки, прерывание тревоги не запрещает
SETTING_RSRV(ArmReserved = 0x01BF)
// настройки режима "тревога": 0x01C0 (448)
SETTING (AlarmDoorsDeciseconds, NotFixed, uint8_t, defAlarmDoorsDeciseconds) // Задержка тревоги по входам дверей (*100мс)
SETTING (AlarmTrunkDeciseconds, NotFixed, uint8_t, defAlarmTrunkDeciseconds) // Задержка тревоги по входам багажника (*100мс)
SETTING (KillEngineDeciseconds, Fixed, uint8_t, defKillEngineDeciseconds) // Период выдачи команды <ccKillEngine>: 0:Single; >127:OFF..
SETTING_RSRV(AlarmReserved = 0x01DF)
// настройки режима "хайджек" и работы с Меткой: 0x01E0 (480)
SETTING_RSRV(TagsRSSI) // Значения уровней RSSI метки для Автопостановки/Автоснятия
SETTING_RSRV(HijackReserved = 0x01FF)
// настройки режима "иммобилайзер": 0x0200 (512)
SETTING (Immobilizer, NotFixed, bit_t, 0) // функция иммобилайзер
SETTING_RSRV(ImmoReserved = 0x021F)
// настройки режима "автосервис": 0x0220 (544)
// не используются
SETTING_RSRV(ServiceReserved = 0x023F)
// настройки автозапуска: 0x0240 (576)
SETTING (TurboTimerIndex, NotFixed, uint8_t, defTurboTimerIndex) // индекс массива настроек турботаймера: 0=Off, 1=On, 2=Auto
SETTING (ReadyMinutes, NotFixed, uint8_t, defReadyMinutes) // длительность режима READY, в минутах
SETTING (SupportMinutes, NotFixed, uint8_t, defSupportMinutes) // длительность режима SUPPORT, в минутах
SETTING (PitStopTimeIndex, NotFixed, uint8_t, defPitStopTimeIndex)// индекс массива длительностей режима PITSTOP
SETTING (PreHeaterMinutes, NotFixed, uint8_t, defPreHeaterMinutes)// длительность работы PreHeater, в минутах
SETTING (SSB, NotFixed, bit_t, 0) // StartStopButton
SETTING_RSRV(WakeUpBySSB)//, NotFixed, bit_t, 0) // Будить автомобиль нажатием на кнопку SSB
SETTING (SetReadyMode, NotFixed, uint8_t, defSetReadyMode) // режим включения поддержки зажигания
SETTING (SkipPreStartMode, Fixed, bit_t, 0) // сразу же (без проверки статусов автомобиля) запустить двигатель - только для SSB!
SETTING (PowerStart, NotFixed, bit_t, 0) // запуск автомобиля с SSB по силе - только для SSB!
SETTING (ManualAttempts, NotFixed, uint8_t, defManualAttempts) // кол-во попыток запуска по команде с Брелока
SETTING (ReadyDisableImmBypass, NotFixed, bit_t, 1) // запрет включения обходчика при включении поддержки
SETTING (CrankAuxIgnOff, NotFixed, bit_t, 1) // выключать выход <AuxIgn> во время работы <oCrank>
SETTING (SupportImmBypassOff, NotFixed, bit_t, 1) // выключать обходчик после успешного пуска двигателя
SETTING (StopByDisarm, NotFixed, bit_t, 0) // глушить при снятии с охраны
SETTING (ClrReadyMode, NotFixed, uint8_t, defClrReadyMode) // режим выключения поддержки зажигания
SETTING (AutostartShockEnable, NotFixed, bit_t, 0) // разрешение тревоги по датчику удара в режимах Автозапуска
SETTING (PrestartSSB, NotFixed, uint8_t, defPrestartSSB) // Максимальное кол-во нажатий на SSB в PRESTART: 0-по умолчанию
SETTING (StopSSB, NotFixed, uint8_t, defStopSSB) // Максимальное кол-во нажатий на SSB в STOP: 0-по умолчанию
SETTING (CrankDelaySeconds, NotFixed, uint8_t, defCrankDelaySeconds) // Задержка перед включением стартера, в секундах
SETTING (AutostartBatteryLevel, NotFixed, uint8_t, defAutoStartBatteryLevel) // автозапуск при разряде аккумулятора (десятые доли вольта)
SETTING (AutostartTemperature, NotFixed, int8_t, defAutoStartTemperature) // автозапуск по температуре салона
SETTING_RSRV(MorningRun) // утренний запуск
SETTING_RSRV(EveningRun) // вечерний запуск
SETTING (DailyRunCountIndex, NotFixed, uint8_t, defDailyRunCountIndex) // индекс массива настроек кол-ва суток действия таймерных запусков: бесконечность<0, отключить все таймерные запуски=0.
SETTING (AutomaticsPeriodIndex, NotFixed, uint8_t, defAutomaticsPeriodIndex) // индекс массива настроек таймеров блокировки автоматических запусков
SETTING (AutomaticsLimitIndex, NotFixed, uint8_t, defAutomaticsLimitIndex) // индекс массива настроек ограничителей автоматических запусков за сессию Охраны
SETTING (EngineStartPercent, NotFixed, uint8_t, defEngineStartPercent) // процент от ХХ*2 для детектора состояния запущенного двигателя
SETTING (EngineRunPercent, NotFixed, uint8_t, defEngineRunPercent) // процент от ХХ*2 для детектора состояния работающего двигателя
SETTING (TurboTimerPercent, NotFixed, uint8_t, defTurboTimerPercent) // процент от ХХ*2 для детектора состояния работающего двигателя
SETTING (TimerRun0, NotFixed, TStartTimerSetting, {0x8000, 0}) // таймерный запуск
SETTING (TimerRun1, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun2, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun3, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun4, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun5, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun6, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun7, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun8, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun9, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun10, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun11, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun12, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (TimerRun13, NotFixed, TStartTimerSetting, {0x8000, 0})
SETTING (SlaveStartStop, NotFixed, bit_t, 1) // Запуск/Останов двигателя по SLAVE команде со штатного брелока
SETTING (ExternalHeatersEnable, NotFixed, bit_t, 1) // разрешение управлять внешними нагревателями
SETTING (ExternalHeatersTemperature,NotFixed, int8_t, defExternalHeatersTemperature) // пороговая температура включения нагревателя
SETTING (ExternalTemperatureSensorType,NotFixed,uint8_t, 0) // Тип внешнего датчика температуры (0=SEMITEC 103AT-2; 1=MF52A103J3950)
SETTING_RSRV(AutoStartReserved = 0x027F)
// настройки обработчика Акселерометра: 0x0280 (640)
SETTING (ShockNotify, NotFixed, uint8_t, 6) // чувствительность предупреждения по датчику Удара [2..9]
SETTING (ShockAlarm, NotFixed, uint8_t, 5) // чувствительность тревоги по датчику Удара [1..8]
SETTING (TiltAlarm, NotFixed, uint8_t, 5) // чувствительность тревоги по датчику Наклона [1..9]
SETTING (MotionAlarm, NotFixed, uint8_t, 5) // чувствительность тревоги по датчику Передвижения/Перемещения [1..9]
SETTING (EmergencyBraking, NotFixed, uint8_t, defEmergencyBraking) // 0-ничего не делать; 1-только моргать; 2-моргать и отпиреть ЦЗ;
// Формат вышеуказанных полей состоит в том, что старший бит - это флажок Disable.
// Т.е. если он стоит, то датчик с указанным уровнем чувствительности выключен.
SETTING (ShockSensTable, NotFixed, uint8_t, 0) // Индекс таблицы чувствительностей (варианты шкал чувствительностей)
//SETTING_ALIAS(AccelSTART = ShockNotify)
SETTING_RSRV(AccelLAST = 0x029F)
#ifdef MOBICAR_3
// настройки Абонентских оповещений: 0x02A0 (672)
SETTING_RSRV(PhoneNumber1) // телефонный номер 1го абонента
SETTING_RSRV(PhoneNumber2) // телефонный номер 2го абонента
SETTING_RSRV(PhoneNumber3) // телефонный номер 3го абонента
SETTING_RSRV(PhoneNumber4) // телефонный номер 4го абонента
SETTING_RSRV(SMS1) // SMS оповещения 1го абонента
SETTING_RSRV(SMS2) // SMS оповещения 2го абонента
SETTING_RSRV(SMS3) // SMS оповещения 3го абонента
SETTING_RSRV(SMS4) // SMS оповещения 4го абонента
SETTING_RSRV(Call1) // Голосовые оповещения 1го абонента
SETTING_RSRV(Call2) // Голосовые оповещения 2го абонента
SETTING_RSRV(Call3) // Голосовые оповещения 3го абонента
SETTING_RSRV(Call4) // Голосовые оповещения 4го абонента
SETTING_RSRV(SubscriberNotifications = 0x02AF)
// настройки Модема: 0x02B0 (688)
SETTING_RSRV(USSD) // USSD запрос
SETTING_RSRV(VoiceRoamEnable) // разрешены голосовые оповещения в роуминге
SETTING_RSRV(DataRoamEnable) // разрешена передача данных по GPRS в роуминге
SETTING_RSRV(SMSRoamEnable) // разрешена отправка SMS в роуминге
SETTING_RSRV(WaitAnswerTimeout) // время ожидания ответа абонента при оповещении, сек
SETTING_RSRV(CallEndTimeout) // таймаут окончания звонка при бездействии абонента, сек
SETTING_RSRV(TripEndTimeout) // таймаут окончания поездки при выключении зажигания, сек
SETTING_RSRV(LowBatteryVoltage) // уровень входного напряжения генерации оповещения (десятые доли вольта)
SETTING_RSRV(ModemBaseOptions = 0x02BF)
// настройки Модема расширенные: 0x02C0 (704)
SETTING_RSRV(ParkingLocRequest) // определять место парковки по БС
SETTING_RSRV(TripLocTimeout) // интервал запроса информации по БС во время поездки, *10сек (=0 не определять)
SETTING_RSRV(EvacLocTimeout) // интервал запроса информации по БС во время эвакуации, *10сек (=0 не определять)
SETTING_RSRV(SMSLoc) // добавлять координаты в SMS
SETTING_RSRV(TimeZone) // Часовой пояс, в часах
SETTING_RSRV(Internet) // признак версии PRO (соединение по Internet)
SETTING_RSRV(ModemAPN) // Строка APN
SETTING_RSRV(ModemLogin) // Строка Login
SETTING_RSRV(ModemPassword) // Строка Password
SETTING_RSRV(DTCRequestTimeout) // интервал времени после выключения зажигания для запроса DTC, *1сек (=0 не определять)
SETTING_RSRV(ClockSyncMode) // Режим синхронизации Системных часов: 0=OFF, 1=PhoneClock, 2=NetworkClock
SETTING_RSRV(TimeZoneSyncMode) // Режим синхронизации Системной зоны: 0=OFF, 1=PhoneTimeZone, 2=NetworkTimeZone
#endif
SETTING_RSRV(ModemExtOptions = 0x02CF)
SETTING_RSRV(CoreReserved = 0x05EF)
// настройки 0x5F0 .. 0x5FF - настройки ядра под CAN-прошивку
SETTING (iCanAvail_Mask, Fixed, uint32_t, 0) // входы, доступные в CAN-прошивке, битовая маска
SETTING (oCanAvail_Mask, Fixed, uint64_t, 0) // выходы, доступные в CAN-прошивке, битовая маска
SETTING (valCanAvail_Mask, Fixed, uint32_t, 0) // числовые значения, доступные в CAN-прошивке, битовая маска
SETTING (valCanEn_Mask, NotFixed, uint32_t, 0) // используемые числовые значения из CAN-прошивки, битовая маска
#undef SETTING
#undef SETTING_RSRV
#undef SETTING_ALIAS

83
libs/SysTimer.h Normal file
View File

@@ -0,0 +1,83 @@
#ifndef SYSTIMER_H
#define SYSTIMER_H
#include <cstdint>
#include "CanFwInterface.h"
// миллисекундный таймер. Макс. таймаут - 2**32 мс.
class TimerMs {
public:
typedef uint32_t T_Timer;
TimerMs()
{ Restart(); }
virtual ~TimerMs()
{ }
virtual inline T_Timer Restart(void)
{
auto prev = _tmr;
_tmr = CntValue();
return _tmr - prev;
}
inline T_Timer Value(void) const
{ return CntValue() - _tmr; }
inline T_Timer Rest(const T_Timer timeout) const
{
T_Timer elapsed = Value();
if (elapsed < timeout)
return timeout - elapsed;
return 0;
}
inline bool CheckTimeout(const T_Timer timeout) const
{ return Value() > timeout; }
private:
T_Timer _tmr;
static inline T_Timer CntValue(void)
{ return CoreFunc->GetTickMs(); }
};
class TimerMsOnce : public TimerMs
{
public:
TimerMsOnce() : TimerMs()
{ started = true; }
virtual ~TimerMsOnce()
{ }
virtual inline T_Timer Restart(void)
{
auto elapsed = TimerMs::Restart();
started = true;
return elapsed;
}
inline bool IsStarted(void) const
{ return started; }
inline void Stop(void)
{ started = false; }
virtual inline bool CheckTimeout(T_Timer timeout)
{
if (started)
{
if (Value() <= timeout)
return false;
Stop();
}
return true;
}
private:
bool started;
};
#endif // SYSTIMER_H

73
libs/Utils.h Normal file
View File

@@ -0,0 +1,73 @@
/*
* Utils.h
*
* Created on: 29 мая 2015 г.
* Author: esaulenko
*/
#ifndef UTILS_H_
#define UTILS_H_
#include <cstdint>
#include "IO.h"
uint32_t constexpr BIT (uint32_t n)
{ return 1UL << n; }
uint64_t constexpr BIT64 (uint32_t n)
{ return 1ULL << n; }
template <typename T1, typename T2> uint32_t MAX (T1 a, T2 b)
{
if (a > b) return a;
else return b;
}
template <typename T1, typename T2> uint32_t MIN (T1 a, T2 b)
{
if (a > b) return b;
else return a;
}
#define countof(array) (sizeof(array)/sizeof(array[0]))
// установка/снятие бита
template <typename T> void BSET (T &x, uint32_t bitNo) ///< установить бит
{ x |= BIT64 (bitNo); }
template <typename T> void BCLR (T &x, uint32_t bitNo) ///< стереть бит
{ x &= ~BIT64 (bitNo); }
///< определить (стереть (Value=0) или установить(Value=1)) бит
template <typename T> void BDEF (T &x, uint32_t bitNo, uint32_t Value)
{
if (Value) BSET (x, bitNo);
else BCLR (x, bitNo);
}
// возвращает номер старшего бита
constexpr int8_t bitmask2offset (uint32_t val)
{
return (int8_t) ( (val > 1) ? ( bitmask2offset (val/2) + 1 ) : 0 );
}
// управление последовательностями
// использовать в CoreFunc->RunSequence()
#define SEQ(x,y) CIO::x, CSettings::y-CSettings::seqOFFSET
#endif /* UTILS_H_ */

40
libs/WeakFunc.cpp Normal file
View File

@@ -0,0 +1,40 @@
#include "source/SourcePath.h"
#include SRC_HEADER
// функции-пустышки
// инициализирует ОЗУ, вызывается при старте контроллера
__attribute__((weak)) void Init (TCanFwMem * vars) { }
// Вызывается при изменении настроек (на каждую настройку)
__attribute__((weak)) void SettingChanged (TCanFwMem * vars, uint16_t id) { }
// принимает и обрабатывает пакет из CAN
__attribute__((weak)) void Can1Received (TCanFwMem * vars, TCanPkt *apPkt) { }
__attribute__((weak)) void Can2Received (TCanFwMem * vars, TCanPkt *apPkt) { }
// обрабатывает события изменения входов-выходов
__attribute__((weak)) void InputChanged (TCanFwMem * vars, uint32_t aInputNum, bool aSwitchedOn) { }
__attribute__((weak)) void OutputChanged (TCanFwMem * vars, uint32_t aOutputNum, bool aSwitchedOn) { }
__attribute__((weak)) void GuardEvent (TCanFwMem * vars, TGuardEvents aEvent) { }
// события начала и конца последовательностей
__attribute__((weak)) void SequenceStart (TCanFwMem * vars, uint32_t aEvent) { }
__attribute__((weak)) void SequenceStop (TCanFwMem * vars, uint32_t aEvent) { }
// команда от ядра
__attribute__((weak)) void Command (TCanFwMem * vars, TCanFwCommands aCmd, uint32_t aCmdParam) { }
// вызывается по таймауту
__attribute__((weak)) void PeriodicProcess (TCanFwMem * vars) { }
// LIN
__attribute__((weak)) void Lin1Received (TCanFwMem * vars, TLinFrame *apFrame) { }
__attribute__((weak)) void Lin2Received (TCanFwMem * vars, TLinFrame *apFrame) { }
__attribute__((weak)) void Lin1Transmitted (TCanFwMem * vars, uint8_t aFrameId) { }
__attribute__((weak)) void Lin2Transmitted (TCanFwMem * vars, uint8_t aFrameId) { }
// Mobicar3 LIN
__attribute__((weak)) void Lin3Received (TCanFwMem * vars, TLinFrame *apFrame) { }
__attribute__((weak)) void Lin3Transmitted (TCanFwMem * vars, uint8_t aFrameId) { }