半导体:Gem/Secs基本协议库的开发(3)

发布时间:2023年12月18日

接着上一篇《半导体:Gem/Secs基本协议库的开发(2)》继续,模拟工具延到下一篇,别催!

【codes】

//hsmsmessageheader.h
/****************************************
 *         HsmsMessageHeader
 ****************************************/

#ifndef HSMSMESSAGEHEADER_H
#define HSMSMESSAGEHEADER_H

#include "JcHsms.h"

class JCHSMS_EXPORT HsmsMessageHeader
{
   
public:
    HsmsMessageHeader();  // originate
    HsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,
                      uint8_t ptype, uint8_t stype,  uint32_t systembytes);
    HsmsMessageHeader(QByteArray source); // interpret

    QByteArray toByteArray();
    QByteArray toByteArray(uint16_t sessionID,uint8_t stream,uint8_t function,
                           uint8_t ptype,uint8_t stype,uint32_t systembytes);

    uint16_t GetSessionID();
    uint8_t  Getstream();
    uint8_t  Getfunction();
    uint8_t  GetpType();
    uint8_t  GetsType();
    uint32_t GetSystemBytes();
    MessageType GetMessageType();

    static uint16_t GetSessionID(const QByteArray& source);
    static uint8_t  Getstream(const QByteArray& source);
    static uint8_t  Getfunction(const QByteArray& source);
    static uint8_t  GetpType(const QByteArray& source);
    static uint8_t  GetsType(const QByteArray& source);
    static uint32_t GetSystemBytes(const QByteArray& source);
    static MessageType GetMessageType(const QByteArray& source);

    void SetSessionID(uint16_t id);
    void SetStreamFunction(uint8_t stream, uint8_t function);
    void SetWBit(WBit bit);
    void SetPSType(uint8_t ptype, uint8_t stype);
    void SetSystemBytes(uint32_t systemByte);

    uint32_t uniqueSystemBytes();

public:
    static uint32_t m_systembytes;  /// 4 bytes SystemBytes.
    static uint32_t SystemBytes_counter;
private:
    QByteArray m_source;            /// 10 bytes.fixed.
    uint16_t m_sessionID;           /// 2 bytes
    uint8_t m_stream;               /// 1 byte stream
    uint8_t m_function;             /// 1 byte function
    uint8_t m_stype;                /// 1 byte stype
    uint8_t m_ptype;                /// 1 byte ptype
};

#endif // HSMSMESSAGEHEADER_H
// hsmsmessageheader.cpp

/******************************************************************************
 *   HsmsMessageHeader
 ******************************************************************************/

#include "hsmsmessageheader.h"

uint32_t HsmsMessageHeader::m_systembytes = 0;
uint32_t HsmsMessageHeader::SystemBytes_counter = 0;

/*!
 * \brief The HsmsMessageHeader struct
 *  10 bytes message header
 * segment ==>|session id |  stream | function | pType | SType |     system bytes             |
 *            |hDev |lDev |------------------------------------| source num | transaction num |
 * bytes   ==>|    2      |    1    |   1      |   1   |  1    |            4                 |
 */
HsmsMessageHeader::HsmsMessageHeader()
{
   
    m_source.resize(10);

}

HsmsMessageHeader::HsmsMessageHeader(QByteArray source)
{
   
    assert(m_source.length() != HSMS_MESSAGEHEADER_LEN);

    m_source.resize(10);

    m_source = source;
    m_sessionID = GetSessionID(source);
    m_stream = Getstream(source);
    m_function = Getfunction(source);
    m_stype = GetsType(source);
    m_ptype = GetpType(source);
    m_systembytes = GetSystemBytes(source);
}

HsmsMessageHeader::HsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,
                                     uint8_t ptype, uint8_t stype,  uint32_t systembytes)
{
   
    m_sessionID = sessionID;
    m_stream = stream;
    m_function = function;
    m_stype = stype;
    m_ptype = ptype;
    m_systembytes = systembytes;

    m_source.resize(10);
    toByteArray();

}

QByteArray HsmsMessageHeader::toByteArray()
{
   
    SetSessionID(m_sessionID);
    SetStreamFunction(m_stream,m_function);
    SetPSType(m_ptype,m_stype);
    SetSystemBytes(m_systembytes);
    return m_source;
}

QByteArray HsmsMessageHeader::toByteArray(uint16_t sessionID, uint8_t stream,
                                          uint8_t  function, uint8_t ptype,
                                          uint8_t  stype   , uint32_t systembytes)
{
   
    SetSessionID(sessionID);
    SetStreamFunction(stream,function);
    SetPSType(ptype,stype);
    SetSystemBytes(systembytes);
    return m_source;
}

uint16_t HsmsMessageHeader::GetSessionID()
{
   
    return m_sessionID;
}

uint8_t HsmsMessageHeader::Getstream()
{
   
    return m_stream;
}

uint8_t HsmsMessageHeader::Getfunction()
{
   
    return m_function;
}

uint8_t HsmsMessageHeader::GetpType()
{
   
    return m_ptype;
}

uint8_t HsmsMessageHeader::GetsType()
{
   
    return m_stype;
}

uint32_t HsmsMessageHeader::GetSystemBytes()
{
   
    return m_systembytes;
}

MessageType HsmsMessageHeader::GetMessageType()
{
   
    if(m_source.size() < 10)
    {
   
        return ErrorMessageType;
    }

    if( GetpType() != 0)
    {
   
        return ErrorMessageType;
    }

    if( Getstream() & ( !GetsType() ) )
    {
   
        return DataMessage;
    }

    if( GetsType() >= 0 && GetsType() < 10)
    {
   
        return static_cast<MessageType>(GetsType());
    }
    else
    {
   
        return ErrorMessageType;
    }
}

uint16_t HsmsMessageHeader::GetSessionID(const QByteArray &source)
{
   
    uint16_t id = static_cast<uint16_t>(source.at(0));
    id = (id << 8) + static_cast<uint16_t>(source.at(1));
    return id;
}

uint8_t HsmsMessageHeader::Getstream(const QByteArray &source)
{
   
    return static_cast<uint8_t>(source.at(2) & 0b01111111);
}

uint8_t HsmsMessageHeader::Getfunction(const QByteArray &source)
{
   
    return static_cast<uint8_t>(source.at(3));
}

uint8_t HsmsMessageHeader::GetpType(const QByteArray &source)
{
   
    return static_cast<uint8_t>(source.at(4));
}

uint8_t HsmsMessageHeader::GetsType(const QByteArray &source)
{
   
    return static_cast<uint8_t>(source.at(5));
}

uint32_t HsmsMessageHeader::GetSystemBytes(const QByteArray &source)
{
   
    uint32_t lenA[4] = {
   0};
    uint32_t len = 0;
    lenA[0] = static_cast<uint32_t>(source.at(6));
    lenA[1] = static_cast<uint32_t>(source.at(7));
    lenA[2] = static_cast<uint32_t>(source.at(8));
    lenA[3] = static_cast<uint32_t>(source.at(9));

#if ENDIAN == LITTLE_ENDIAN
    for(int i = 0; i < 4;i++) len += (lenA[i] << ((3-i)*8 ));
#else
    for(int i = 0; i < 4;i++)  len += (lenA[i] << (i*8 ));
#endif

    return len;
}

MessageType HsmsMessageHeader::GetMessageType(const QByteArray &source)
{
   
    if(source.size() < 10)
    {
   
        return ErrorMessageType;
    }

    if( GetpType(source) != 0)
    {
   
        return ErrorMessageType;
    }

    if( Getstream(source) & ( !GetsType(source) ) )
    {
   
        return DataMessage;
    }

    if( GetsType(source) >= 0 && GetsType(source) < 10)
    {
   
        return static_cast<MessageType>(GetsType(source));
    }
    else
    {
   
        return ErrorMessageType;
    }
}

void HsmsMessageHeader::SetSessionID(uint16_t id)
{
   
#if  ENDIAN == LITTLE_ENDIAN
    m_source[0] = static_cast<char>( (id >> 8) & 0xff); //header byte 0
    m_source[1] = static_cast<char>( (id >> 0) & 0xff); //header byte 1
#else
    m_source[1] = static_cast<char>( (id >> 8) & 0xff); //header byte 1
    m_source[0] = static_cast<char>( (id >> 0) & 0xff); //header byte 0
#endif
    m_sessionID = id;
}

void HsmsMessageHeader::SetStreamFunction(uint8_t stream, uint8_t function)
{
   
    m_source[2] = static_cast<char>(stream);   //header byte 2
    m_source[3] = static_cast<char>(function); //header byte 3
    m_stream = stream;
    m_function = function;
}

void HsmsMessageHeader::SetWBit(WBit bit)
{
   
    uint8_t f = Getfunction();
    uint8_t s = Getstream();
    if(bit == NeedReply){
   
        s = s | 0b10000000;
    }
    else{
   
        s = s & 0b01111111;
    }
    SetStreamFunction(s, f);
}

void HsmsMessageHeader::SetPSType(uint8_t ptype, uint8_t stype)
{
   
    m_source[4] = static_cast<char>(ptype);  //header byte 4
    m_source[5] = static_cast<char>(stype);  //header byte 5
    m_ptype = ptype;
    m_stype = stype;
}

void HsmsMessageHeader::SetSystemBytes(uint32_t systemByte)
{
   
    m_source[6] = static_cast<uchar>( (systemByte >> 24) & 0xff); //header byte 6
    m_source[7] = static_cast<uchar>( (systemByte >> 16) & 0xff); //header byte 7
    m_source[8] = static_cast<uchar>( (systemByte >> 8 ) & 0xff); //header byte 8
    m_source[9] = static_cast<uchar>( (systemByte >> 0 ) & 0xff); //header byte 9
    m_systembytes = systemByte;
}

uint32_t HsmsMessageHeader::uniqueSystemBytes()
{
   
    SystemBytes_counter ++;
    uint32_t timeDate = QDateTime::currentDateTime().toTime_t();  // 获取当前时间,将当前时间转为时间戳
    m_systembytes = timeDate<<4;
    m_systembytes += SystemBytes_counter%16;
    return m_systembytes;
}
//  secs2item.h

/****************************************
 *         Secs2Item
 ****************************************
 * ItemHeader      | Item Body     |
 * format_lenbytes | Len | context |
 * format|len bytes| Len | context |
 ****************************************/

#ifndef SECS2ITEM_H
#define SECS2ITEM_H

#include "JcHsms_global.h"

class JCHSMS_EXPORT Secs2Item
{
   
public:
    Secs2Item() {
   }
    Secs2Item(QString name);
    Secs2Item(ItemFormatCode format,QVariant val);
    Secs2Item(QByteArray source); // interpret

    QByteArray toByteArray() const;
    int format() const;
    bool isEmpty() const;

    static int  format(const QByteArray &array);
    static bool isValidFormat(ItemFormatCode format);
    static int  itemHeaderSize(const QByteArray &array);
    static int  bytes(const QByteArray& array);
    const int bytes() const;

    QByteArray itemHeader() const;
    QByteArray itemBody() const;
    QByteArray itemDataAll() const;

    int buildItemHeader();

    void AddBinary(const QByteArray& x);

    void AddASCII(QString str);
    void AddASCII(const char* str,int len);

    void AddJIS8(const char * str); // unicode

    void AddBoolean(const bool x);
    void AddBoolean(const bool x[], int N);

    void AddInt8(const int8_t x);
    void AddInt8(const int8_t x[], int N);
    void AddInt8
文章来源:https://blog.csdn.net/weixin_39568531/article/details/135020827
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。