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

2023-12-15 21:36

本文主要是介绍半导体:Gem/Secs基本协议库的开发(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

【codes】

//hsmsmessageheader.h
/*****************************************         HsmsMessageHeader****************************************/#ifndef HSMSMESSAGEHEADER_H
#define HSMSMESSAGEHEADER_H#include "JcHsms.h"class JCHSMS_EXPORT HsmsMessageHeader
{
public:HsmsMessageHeader();  // originateHsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,uint8_t ptype, uint8_t stype,  uint32_t systembytes);HsmsMessageHeader(QByteArray source); // interpretQByteArray 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 bytesuint8_t m_stream;               /// 1 byte streamuint8_t m_function;             /// 1 byte functionuint8_t m_stype;                /// 1 byte stypeuint8_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_ENDIANfor(int i = 0; i < 4;i++) len += (lenA[i] << ((3-i)*8 ));
#elsefor(int i = 0; i < 4;i++)  len += (lenA[i] << (i*8 ));
#endifreturn 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_ENDIANm_source[0] = static_cast<char>( (id >> 8) & 0xff); //header byte 0m_source[1] = static_cast<char>( (id >> 0) & 0xff); //header byte 1
#elsem_source[1] = static_cast<char>( (id >> 8) & 0xff); //header byte 1m_source[0] = static_cast<char>( (id >> 0) & 0xff); //header byte 0
#endifm_sessionID = id;
}void HsmsMessageHeader::SetStreamFunction(uint8_t stream, uint8_t function)
{m_source[2] = static_cast<char>(stream);   //header byte 2m_source[3] = static_cast<char>(function); //header byte 3m_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 4m_source[5] = static_cast<char>(stype);  //header byte 5m_ptype = ptype;m_stype = stype;
}void HsmsMessageHeader::SetSystemBytes(uint32_t systemByte)
{m_source[6] = static_cast<uchar>( (systemByte >> 24) & 0xff); //header byte 6m_source[7] = static_cast<uchar>( (systemByte >> 16) & 0xff); //header byte 7m_source[8] = static_cast<uchar>( (systemByte >> 8 ) & 0xff); //header byte 8m_source[9] = static_cast<uchar>( (systemByte >> 0 ) & 0xff); //header byte 9m_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); // interpretQByteArray 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); // unicodevoid 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

这篇关于半导体:Gem/Secs基本协议库的开发(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/497971

相关文章

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt