#ifndef USB_APPLICATION_SERVICE_DEF_H
#define USB_APPLICATION_SERVICE_DEF_H
    #include <stdint.h>
    #pragma pack( push, 2 )
    typedef struct
    {
        uint32_t dwProtocolVersion;
        //--------------------------------
        uint32_t  dwCapacity;
        uint32_t  dwFlashSize;
        uint16_t  wDriverVersion;
        uint8_t   bBank0Protection: 1;
        uint8_t   cReserved0      : 7;
        uint8_t   cReserved1;

        union
        {
           struct
           {
               uint8_t cDescLength;
               char          cDesc[ 31 ];
           };

           struct
           {
               char         ucDesc[ 32 ];
           };
        }
        ChipDescription;

        struct
        {
            uint16_t  wRBSCount;
            uint16_t  wReserved2;
            uint32_t   dwMaxWER;
            uint32_t   dwWER[ 3 ];
        }
        WERInfo; // Write-Erase-count Resource descriptor
    }
    TFlashMemInfo_t;
    #pragma pack( pop )

    #pragma pack( push, 1 )
    typedef struct
    {
        uint16_t requestVersion; // версия структуры (версия запроса)
        uint16_t firmwareId;     // версия ПО
        uint16_t deviceId;       // модель ACM (присвоенная через ОБЗОР)
        uint8_t  reserved[250];  // зарезервировано
    }
    TModelInfo_t;
    #pragma pack( pop )

    #pragma pack( push, 1 )
    typedef struct
      {
              uint16_t requestVersion; // версия структуры (версия запроса)
              uint16_t firmwareId;     // версия ПО
              uint16_t deviceId;       // модель ACM (присвоенная через ОБЗОР)
    }
    TModelInfo_base_t;

    typedef struct
      {
              uint16_t requestVersion; // версия структуры (версия запроса)
              uint16_t firmwareId;     // версия ПО
              uint16_t deviceId;       // модель ACM (присвоенная через ОБЗОР)
              uint8_t  reserved[250];  // зарезервировано
    }
    TModelInfo_v0_t;

    typedef struct
    {
              uint16_t requestVersion; // версия структуры (версия запроса)
              uint16_t firmwareId;     // версия ПО
              uint16_t deviceId;       // модель ACM (присвоенная через ОБЗОР)
              uint8_t  modelName[20];  // имя модели ACM
              uint8_t  ampSwitchList[60]; // список доступных состояний усилителей
              uint8_t  ampStatesCount;    // Число доступных состояний усилителей
              uint8_t  filtSwitchList[60];   // список доступных состояний фильтров
              uint8_t  filtStatesCount;   // Число доступных состояний фильтров
              uint8_t  reserved[108];     // зарезервировано
    }
    TModelInfo_v1_t;
    #pragma pack( pop )

    #pragma pack( push, 4 )
    typedef union
    {
        uint8_t raw_bytes[1];
        TFlashMemInfo_t svcReq_Flash;
        uint8_t         svcReq_FlashReady;
        TModelInfo_v1_t svcReq_Model;
    }
    TServiceRequestBuffer_t;
    #pragma pack( pop )
#endif