#ifndef VERSION_H
#define VERSION_H

// FIRMWARE_VERSION
// введена 11/09/18
// Требуется соблюдать соответствие версии FIRMWARE_VERSION и FIRMWARE_DRIVER_VERSION
//
#define         FIRMWARE_VERSION                        0x01
// Используется схожая нумерация версий с ACMx4: версия 0x20 - с SCPI
// Версия 0x1X - первая версия, без SCPI интерфеса
// Версия 0x2X - вторая версия, поддержка SCPI интерфейса
// Версия 0x10 - 25.11.2020: альфа-версия.
// Версия 0x11 - 10.12.2020: введена поддержка состояний O2ALR и O2BLR в протокол
// Версия 0x12 - 10.12.2020: введена поддержка состояний O1ALR и O1BLR в протокол
// Версия 0x13 - 11.12.2020: порты A и B поменяны местами. Коды управления по USB сохранены.
// Версия 0x14 - 03.02.2021: исправление ошибок флеш-драйвера и FSEQ
// Версия 0x20 - 12.02.2021: Поддержка SCPI
// Версия 0x21 - 17.03.2021: Исправления: исправлена команда MEM:TABLE:FREQ:SEGM:DATA
// Версия 0x22 - 23.04.2021: Добавлена поддержка 2543.2
// Версия 0x23 - 27.04.2021: Обновление карты состояний ключей для 2543.1 и 2543.2:
//                           - удалены O1ALR и O1BLR для 2543.1
//                           - исправление проверки аругмента команды SWIT:STAT
//                           - Добавлена поддержка состояний O1ALR, O1BLR, L2BOR, L2AOR, в 2543.2
// Версия 0x24 - 27.04.2021: 
//                           - Удален разворот портов A-B для 2543.2;
//                           - исправление включения короткой весрии состояния "CHEC" (CHECk)
//                           - удалены неиспользуемые кодировки состояний для 2543.1

#define         FIRMWARE_DRIVER_VERSION                 0x01
// FIRMWARE_DRIVER_VERSION
// Была задумана как версия драйвера управления, т.к. не было версии ПО.
// Использовалась во внутренних интерфейсах и при тестировании внутренними программами
// на производстве. 
// Используется схожая нумерация версий с ACMx4
// версия 0xXX00 - первая версия прошивки с поддержкой сервисного запроса
// версия 0xXX01 - исправлена ошибка зависания при записи во Flash по USB, впервые реализован 07.04.16 - 
// версия 0xXX02 - добавлен сервисный запрос на получение информации о прошивке (0x003)
//                 также, теперь для версии драйвера остался только 1 байт - младший, старший используется
//                 для версии ПО, впервые реализован 11.09.18
// ----------------------------------------------------------------------------------
// 11.09.18 - реализован интерфейс SCPI (USBTMC)
// теперь старшая тетрада версии драйвера зарезервирована: 0xAABB 
// 0xAA - это теперь версия прошивки, отвечает в т.ч. за SCPI (есть или нет), см FIRMWARE_VERSION
// 0xBB - это версия драйвера сервисного запроса. тут же можно смотреть, исправлена ли ошибка зависания при записи
// С версии драйвера 0x02 также реализован програмнной версии FIRMWARE_VERSION отдельным сервисным запросом
// ----------------------------------------------------------------------------------
// Старшая тетрада VERSION это версия ПО (FIRMWARE_VERSION), младшая - версия драйвера сервисного запроса
#define         VERSION                                (((0xFF & FIRMWARE_VERSION) << 8) | ((0xFF & FIRMWARE_DRIVER_VERSION)))

#define         HARDWARE_VERSION                       0x0000       // undefined yet (12/09/18)
                                                       
#define         COMMENTS_FORMAT_TEXT                   0
                                                       
#define         PROGVER_TAG_v0                         0xA1DB10C0   // Progversion Identifier v0: "A ID Block v0" -> "AIDBLOCK0" -> "AIDBlOC0" -> "A1DB10C0"
#define         PROGVER_FILLER_v0(TXTCOMMENTS)\
                {\
                   .tagId            = PROGVER_TAG_v0,         \
                   .reserved0        = { 0 },                  \
                   .comments_id      = COMMENTS_FORMAT_TEXT,   \
                   .reserved1        = { 0 },                  \
                   .comments         = TXTCOMMENTS,            \
                   .reserved2        = { 0 },                  \
                   .firmware_version = VERSION,                \
                   .hardware_version = HARDWARE_VERSION,       \
                }
 
#include <stdint.h>
#pragma pack( push, 1 )
typedef const struct
{ 
    uint32_t tagId;               // ProgVer structure ID
    uint8_t  reserved0[12];       // Reserved for future    
    uint8_t  comments_id;         // comments format
    uint8_t  reserved1[3];        // Reserved for future
    uint8_t  comments[64];        // optional comments
    uint8_t  reserved2[160];      // Reserved for future
    uint16_t firmware_version;    // firmware version
    uint16_t hardware_version;    // hardware version
    uint32_t progver_crc32;       // ProgVer structure CRC32 (unused)
}
sProgVer_t;
typedef const struct
{ 
    uint32_t firmware_crc32;      // Firmware CRC32
}
sProgVerCRC_t;
#pragma pack( pop )

extern volatile const sProgVer_t * pProgramVersion;

#endif