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

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_ */