364 lines
13 KiB
C++
364 lines
13 KiB
C++
#include "msg.h"
|
||
#include <QtEndian>
|
||
|
||
void pack_len(QByteArray& cmd,uint16_t len){
|
||
uint16_t v = qToBigEndian(len);
|
||
memcpy(&cmd[0],reinterpret_cast<const char*>(&v),2);
|
||
}
|
||
void calc_checksum(QByteArray&cmd){
|
||
#if 0
|
||
// 初始化校验和
|
||
char checksum = 0;
|
||
// 检查字节数组长度
|
||
if (cmd.size() < 2) {
|
||
return;
|
||
}
|
||
|
||
// 创建临时数组(排除最后一个字节)
|
||
QByteArray tempArray = cmd.mid(0, cmd.size() - 1);
|
||
|
||
// 使用foreach遍历计算除最后一个字节之外的字节
|
||
foreach (const char byte, tempArray) {
|
||
checksum ^= byte;
|
||
}
|
||
|
||
// 将校验和存储到数组末尾
|
||
cmd[cmd.size() - 1] = checksum;
|
||
#endif
|
||
// 如果字节数组太小(不足2字节),无法计算校验和
|
||
if (cmd.size() < 2) {
|
||
return;
|
||
}
|
||
|
||
// 初始化校验和为0 (0x00)
|
||
char checksum = 0;
|
||
|
||
// 计算校验和(排除最后一个字节)
|
||
// 从索引0开始到倒数第二个字节 (size()-2)
|
||
for (int i = 0; i < (cmd.size() - 1); i++) {
|
||
checksum ^= cmd[i]; // 逐字节异或
|
||
}
|
||
|
||
// 将校验和存储到最后一个字节
|
||
cmd[cmd.size() - 1] = checksum;
|
||
}
|
||
QByteArray pack_tiantong_dial_cmd(const std::string& number){
|
||
assert(number.size() <= 20);
|
||
QByteArray cmd(FRAME_MIN_LEN+20, '\0');
|
||
pack_len(cmd,2+20);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kTianTongVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(TianTongVoiceSubCommandType::kDial);
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],number.c_str(),number.size());
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
QByteArray pack_tiantong_hang_up_cmd(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kTianTongVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(TianTongVoiceSubCommandType::kHangUp);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
QByteArray pack_tiantong_answer(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kTianTongVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(TianTongVoiceSubCommandType::kAnswer);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
QByteArray pack_tiantong_send_keys_when_on_line_cmd(const std::string& keys){
|
||
assert(keys.size() <= 12);
|
||
QByteArray cmd(FRAME_MIN_LEN + 12, '\0');
|
||
pack_len(cmd,2 + 12);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kTianTongVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(TianTongVoiceSubCommandType::kSendKeysWhenOnLine);
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],keys.c_str(),keys.size());
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_uhf_dial_cmd(const std::string& number){
|
||
assert(number.size() <= 20);
|
||
QByteArray cmd(FRAME_MIN_LEN+20, '\0');
|
||
pack_len(cmd,2 + 20);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kUhfVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(UhfVoiceSubCommandType::kDial);
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],number.c_str(),number.size());
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
QByteArray pack_uhf_hang_up_cmd(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kUhfVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(UhfVoiceSubCommandType::kHangUp);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
QByteArray pack_uhf_answer(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kUhfVoice);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(UhfVoiceSubCommandType::kAnswer);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_UCattierType(uint8_t type){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kUCattierType);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_URate(uint8_t type){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kURate);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_SFreq(uint16_t freq){
|
||
QByteArray cmd(FRAME_MIN_LEN + 2, '\0');
|
||
pack_len(cmd,2 + 2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kSFreq);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = (freq >> 8) & 0xFF;
|
||
cmd[COMMAND_DATA_BEGIN_INDEX + 1] = freq & 0xFF;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_SRate(uint8_t type){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kSRate);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_PASwitch(uint8_t s_switch, uint8_t u_switch, uint8_t bd_switch){
|
||
QByteArray cmd(FRAME_MIN_LEN + 3, '\0');
|
||
pack_len(cmd,2 + 3);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kPASwitch);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = s_switch;
|
||
cmd[COMMAND_DATA_BEGIN_INDEX + 1] = u_switch;
|
||
cmd[COMMAND_DATA_BEGIN_INDEX + 2] = bd_switch;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_ZTCtrl(uint8_t type){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kZTCtrl);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_debug_cmd_CmdCtrl(uint8_t type, const std::string& cmd_content){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1 + cmd_content.size(), '\0');
|
||
pack_len(cmd,2 + 1 + cmd_content.size());
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kDebugCmd);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(DebugCommandType::kCmdCtrl);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX + 1],cmd_content.c_str(),cmd_content.size());
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_DefaultChannelGet(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultChannel);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_DefaultChannelSet(uint8_t type){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultChannel);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_UDataChannelKeepTimeGet(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdUDataChannelKeepTime);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_UDataChannelKeepTimeSet(uint16_t time){
|
||
QByteArray cmd(FRAME_MIN_LEN + 2, '\0');
|
||
pack_len(cmd,2 + 2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdUDataChannelKeepTime);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = (time >> 8) & 0xFF;
|
||
cmd[COMMAND_DATA_BEGIN_INDEX + 1] = time & 0xFF;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_DefaultNumberGet(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultNumber);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_DefaultNumberSet(const std::string& u_number, const std::string& s_number){
|
||
assert((u_number.size() <= 20) && (s_number.size() <= 20));
|
||
QByteArray cmd(FRAME_MIN_LEN + 20 + 20, '\0');
|
||
pack_len(cmd,2 + 20 + 20);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultNumber);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],u_number.c_str(),u_number.size());
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX + 20],s_number.c_str(),s_number.size());
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_SoftVersionGet(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdSoftVersion);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_SoftResetSet(){
|
||
QByteArray cmd(FRAME_MIN_LEN, '\0');
|
||
pack_len(cmd,2);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdSoftReset);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_config_cmd_SDataSwitchSet(uint8_t onoff){
|
||
QByteArray cmd(FRAME_MIN_LEN + 1, '\0');
|
||
pack_len(cmd,2 + 1);
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdSDataSwitch);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
|
||
cmd[COMMAND_DATA_BEGIN_INDEX] = onoff;
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_short_message_cmd(CommandType cmd_type,const std::string& number, const std::u16string& message){
|
||
assert(number.size() <= 20);
|
||
QByteArray cmd(FRAME_MIN_LEN+20+message.size()*sizeof(char16_t), '\0');
|
||
pack_len(cmd,2 + 20 + message.size()*sizeof(char16_t));
|
||
cmd[COMMAND_TYPE_INDEX] = uint8_t(cmd_type);
|
||
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ShortMessageSubCommandType::kSendMessage);
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],number.c_str(),number.size());
|
||
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX+20],message.c_str(),message.size()*sizeof(char16_t));
|
||
calc_checksum(cmd);
|
||
return pack_slip(cmd);
|
||
}
|
||
|
||
QByteArray pack_slip(QByteArray &message){
|
||
// 创建临时数组,最多数据内容*2+加帧头尾
|
||
QByteArray tempArray((message.size()*2 + 2), '\0');
|
||
int index = 0;
|
||
|
||
tempArray[index++] = FRAME_SLIP_C0;
|
||
|
||
for(int i = 0; i < message.size(); i++)
|
||
{
|
||
if(static_cast<uint8_t>(message[i]) == FRAME_SLIP_C0)
|
||
{
|
||
tempArray[index++] = FRAME_SLIP_DB;
|
||
tempArray[index++] = FRAME_SLIP_DC;
|
||
}
|
||
else if(static_cast<uint8_t>(message[i]) == FRAME_SLIP_DB)
|
||
{
|
||
tempArray[index++] = FRAME_SLIP_DB;
|
||
tempArray[index++] = FRAME_SLIP_DD;
|
||
}
|
||
else
|
||
{
|
||
tempArray[index++] = message[i];
|
||
}
|
||
}
|
||
|
||
tempArray[index++] = FRAME_SLIP_C0;
|
||
|
||
return tempArray.mid(0, index);
|
||
}
|
||
|
||
int pack_deslip(QByteArray &message){
|
||
int i = 0;
|
||
int index = 0;
|
||
unsigned char crc = 0;
|
||
|
||
if((static_cast<uint8_t>(message[0]) != 0xC0) || (static_cast<uint8_t>(message[message.size() - 1]) != 0xC0))
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
//去掉头和尾
|
||
for(i = 1; i < (message.size() - 1); i++)
|
||
{
|
||
if ((static_cast<uint8_t>(message[i]) == FRAME_SLIP_DB) && (static_cast<uint8_t>(message[i + 1]) == FRAME_SLIP_DC))
|
||
{
|
||
message[index] = FRAME_SLIP_C0;
|
||
i++;
|
||
}
|
||
else if ((static_cast<uint8_t>(message[i]) == FRAME_SLIP_DB) && (static_cast<uint8_t>(message[i + 1]) == FRAME_SLIP_DD))
|
||
{
|
||
message[index] = FRAME_SLIP_DB;
|
||
i++;
|
||
}
|
||
else
|
||
{
|
||
message[index] = message[i];
|
||
}
|
||
index++;
|
||
}
|
||
crc = message[index - 1];
|
||
QByteArray tempArray = message.mid(0, index);
|
||
calc_checksum(tempArray);
|
||
if(crc != static_cast<uint8_t>(tempArray[index - 1]))//crc校验出错
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
message.resize(index); //保留校验字节
|
||
|
||
return index;
|
||
}
|
||
|
||
QByteArray pack_tiantong_short_message_cmd(const std::string& number, const std::u16string& message){
|
||
return pack_short_message_cmd(CommandType::kTianTongShortMessage,number,message);
|
||
}
|
||
QByteArray pack_uhf_short_message_cmd(const std::string& number, const std::u16string& message){
|
||
return pack_short_message_cmd(CommandType::kUhfShortMessage,number,message);
|
||
}
|
||
QByteArray pack_beidou_short_message_cmd(const std::string& number, const std::u16string& message){
|
||
return pack_short_message_cmd(CommandType::kBeiDouShortMessage,number,message);
|
||
}
|