Files
SatelliteControl/msg.cpp
zhuo.li a0aed8f539 卫星终端控制软件_V1.1.0
1、增加信道/复位等参数配置
2026-01-04 13:49:35 +08:00

364 lines
13 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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);
}