Skip to content
Snippets Groups Projects
Select Git revision
  • 768a85686fbc6942bafc62b25fbd1ee9e6d6831d
  • master default protected
2 results

packet.h

Blame
  • user avatar
    Christian Koernig authored
    768a8568
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    packet.h 6.14 KiB
    #ifndef PACKET_H
    #define PACKET_H
    
    #include <vector>
    #include <string>
    #include <sstream>
    #include "types.h"
    
    #define MIN_PACKET_LEN 8
    
    using namespace std;
    
    enum Offset 
    {
        SYNC1,
        SYNC2,
        PID1,
        PID2,
        LEN_MSB,
        LEN_LSB,
        DATA
    };
    
    // Packet impementation and hex values are based on the DP5 Programmers Guide, Version B1
    
    // Packet ID first byte (packet group)
    enum PID1_TYPE{
        DP5_P1_STATUS_REQUEST       = 0x01,
        DP5_P1_SPECTRUM_REQUEST     = 0x02,
        DP5_P1_DATA_REQUEST         = 0x03,
        DP5_P1_SCA_REQUEST          = 0x04,
        DP5_P1_TEXTCONFIG_REQUEST   = 0x20,
        DP5_P1_COMMAND_REQUEST      = 0xF0,
        DP5_P1_COMMTEST_REQUEST     = 0xF1,
    
        DP5_P1_STATUS_RESPONSE      = 0x80,
        DP5_P1_SPECTRUM_RESPONSE    = 0x81,
        DP5_P1_DATA_RESPONSE        = 0x82,
        DP5_P1_COMMTEST_RESPONSE    = 0x8F,
    
        DP5_P1_ACK                  = 0xFF,
    };
    
    
    // Packet ID second byte (one enum per group)
    
    enum PID2_SUBTYPE_STATUS_REQUEST{
        DP5_P2_STATUS_REQUEST_INFO = 0x01,
    };
    
    enum PID2_SUBTYPE_SPECTRUM_REQUEST{
        DP5_P2_SPECTRUM_REQUEST_SPECTRUM              = 0x01,
        DP5_P2_SPECTRUM_REQUEST_SPECTRUM_CLEAR        = 0x02,
        DP5_P2_SPECTRUM_REQUEST_SPECTRUM_STATUS       = 0x03,
        DP5_P2_SPECTRUM_REQUEST_SPECTRUM_STATUS_CLEAR = 0x04,
        DP5_P2_SPECTRUM_REQUEST_BUFFER                = 0x05,
        DP5_P2_SPECTRUM_REQUEST_BUFFER_CLEAR          = 0x06,
        DP5_P2_SPECTRUM_REQUEST_GET_BUFFER            = 0x07,
    };
    enum PID2_SUBTYPE_DATA_REQUEST{
        DP5_P2_DATA_REQUEST_LISTDATA = 0x09,
    };
    enum PID2_SUBTYPE_COMMAND_REQUEST{
        DP5_P2_COMMAND_REQUEST_CLEAR_SPECTRUM         = 0x01,
        DP5_P2_COMMAND_REQUEST_ENABLE                 = 0x02,
        DP5_P2_COMMAND_REQUEST_DISABLE                = 0x03,
        DP5_P2_COMMAND_REQUEST_CLEAR_GPCOUNTER        = 0x10,
        DP5_P2_COMMAND_REQUEST_CLEAR_TIMER            = 0x16,
        DP5_P2_COMMAND_REQUEST_RESTART_BUFFER         = 0x1E,
        DP5_P2_COMMAND_REQUEST_CANCEL_BUFFER          = 0x1F,
        DP5_P2_COMMAND_REQUEST_KEEP_ALIVE_NO_SHARE    = 0x21,
    };
    enum PID2_SUBTYPE_COMMTEST_REQUEST{
        DP5_P2_COMMTEST_REQUEST_ACK                   = 0xF1,
        DP5_P2_COMMTEST_REQUEST_STREAM                = 0x7E,
        DP5_P2_COMMTEST_REQUEST_ECHO                  = 0x7F,
    };
    enum PID2_SUBTYPE_STATUS_RESPONSE{
        DP5_P2_STATUS_RESPONSE_INFO = 0x01,
    };
    enum PID2_SUBTYPE_SPECTRUM_RESPONSE{
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM256          = 0x01,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM256_STATUS   = 0x02,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM512          = 0x03,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM512_STATUS   = 0x04,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM1024         = 0x05,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM1024_STATUS  = 0x06,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM2048         = 0x07,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM2048_STATUS  = 0x08,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM4096         = 0x09,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM4096_STATUS  = 0x0A,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192         = 0x0B,
        DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192_STATUS  = 0x0C,
    };
    
    enum PID2_SUBTYPE_TEXTCONFIG_REQUEST{
        DP5_P2_TEXTCONFIG_REQUEST_SET = 0x02,
        DP5_P2_TEXTCONFIG_REQUEST_GET = 0x03,
    };
    
    enum PID2_SUBTYPE_DATA_RESPONSE{
        DP5_P2_DATA_RESPONSE_CONFIG_READBACK = 0x07,
        DP5_P2_DATA_RESPONSE_LISTDATA        = 0x0A,
        DP5_P2_DATA_RESPONSE_LISTDATA_FULL   = 0x0B,
    };
    
    enum PID2_SUBTYPE_COMMTEST_RESPONSE{
        DP5_P2_COMMTEST_RESPONSE_ECHO = 0x7F,
    };
    
    
    enum PID2_SUBTYPE_ACK{
        DP5_P2_ACK_OK =                0x00,
        DP5_P2_ACK_SYNC_ERR =          0x01,
        DP5_P2_ACK_PID_ERR =           0x02,
        DP5_P2_ACK_LEN_ERR =           0x03,
        DP5_P2_ACK_CHECKSUM_ERR =      0x04,
        DP5_P2_ACK_BADPARAM_ERR =      0x05,
        DP5_P2_ACK_BADHEX_ERR =        0x06,
        DP5_P2_ACK_BADCMD_ERR =        0x07,
        DP5_P2_ACK_FPGA_ERR =          0x08,
        DP5_P2_ACK_CP2201_ERR =        0x09,
        DP5_P2_ACK_SCOPE_ERR =         0x0A,
        DP5_P2_ACK_PC5_ERR =           0x0B,
        DP5_P2_ACK_OK_SHARING =        0x0C,
        DP5_P2_ACK_BUSY_ERR =          0x0D,
        DP5_P2_ACK_I2C_ERR =           0x0E,
        DP5_P2_ACK_OK_FPGAADDR =       0x0F,
        DP5_P2_ACK_VERSION_ERR =       0x10,
        DP5_P2_ACK_CALIB_ERR =         0x11
    };
    
    class AmptekException : public std::runtime_error
    {
    public:
        AmptekException(std::string what) : runtime_error(what){}
        ~AmptekException(){}
    };
    
    
    class Packet: public vector<byte>
    {
        friend class vector;
    
    public:
    
        Packet();
        Packet(unsigned short initSize);
        Packet(byte pid1, byte pid2, byte* data, word16 datasize);
        word16 dataLength;
        void initSync();
        void setPid1(byte p1);
        void setPid2(byte p2);
        word16 calcLen() const;
        word16 calcChecksum() const;
        void calcAndFillChecksum();
        void validateChecksum();
        void setData(byte* data, word16 size);
        string toString() const;
        void fromByteArray(byte* response);
    
        bool isType( word16 );
        bool isType( std::vector<word16> );
        bool isType( byte, byte );
    
    
    
    public:
        static const Packet DP5_PKT_REQUEST_SPECTRUM;
        static const Packet DP5_PKT_REQUEST_SPECTRUM_AND_STATUS;
        static const Packet DP5_PKT_REQUEST_STATUS;
        static const Packet DP5_PKT_REQUEST_ENABLE;
        static const Packet DP5_PKT_REQUEST_DISABLE;
        static const Packet DP5_PKT_REQUEST_CLEAR_SPECTRUM;
        static const Packet DP5_PKT_REQUEST_KEEP_ALIVE_NO_SHARING;
        static const Packet DP5_PKT_REQUEST_RESTART_SEQ_BUFFERING;
        static const Packet DP5_PKT_REQUEST_CANCEL_SEQ_BUFFERING;
        static const Packet DP5_PKT_REQUEST_LIST_DATA;
        static const Packet DP5_PKT_REQUEST_CLEAR_LIST_TIMER;
        static const Packet DP5_PKT_REQUEST_STOP_STREAM_COMMTEST;
    
        static const Packet gernerateSetConfigurationRequest(std::string text_configuration);
        static const Packet gernerateGetConfigurationRequest(std::string text_configuration);
    
        static const Packet generateBufferRequest(uint16_t buffer_index);
        static const Packet generateBufferAndClearRequest(uint16_t buffer_index);
        static const Packet generateGetBufferRequest(uint16_t buffer_index);
    
        static const Packet generateCommtestStreamingRequest(uint16_t min_channel,uint16_t max_channel, 
                                                              uint16_t increment, uint16_t period);
    
    };
    
    #endif