添加自研批检仪检测命令

This commit is contained in:
ranchuan
2023-11-27 14:31:00 +08:00
parent b3a0d7b57c
commit a0b0f41c39
45 changed files with 3778 additions and 2628 deletions

View File

@@ -1,20 +1,14 @@
#include "interface/codec.h"
Codec *codecFind(const char *name)
{
extern const int __start_codecdef;
extern const int __stop_codecdef;
codec_def *start=(codec_def *)&__start_codecdef;
codec_def *end=(codec_def *)&__stop_codecdef;
extern const int __start_codecdef;
extern const int __stop_codecdef;
codec_def *start = (codec_def *)&__start_codecdef;
codec_def *end = (codec_def *)&__stop_codecdef;
codec_def *item = 0;
for (item=start;item<end;item++)
for (item = start; item < end; item++)
{
if (item != nullptr)
{
@@ -25,10 +19,3 @@ Codec *codecFind(const char *name)
qWarning("can not find codec named '%s'", name);
return nullptr;
}

View File

@@ -14,14 +14,14 @@ public:
}
virtual ~Codec() {}
// 返回true,则是一个完整的帧
// virtual bool packCheck(myarray data){return false;}
// virtual bool recvByte(int byte){return false;}
// virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data){return myarray();}
// virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data){return myarray();}
virtual bool packCheck(myarray data)=0;
virtual bool recvByte(int byte)=0;
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data)=0;
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)=0;
// virtual bool packCheck(myarray data){return false;}
// virtual bool recvByte(int byte){return false;}
// virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data){return myarray();}
// virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data){return myarray();}
virtual bool packCheck(myarray data) = 0;
virtual bool recvByte(int byte) = 0;
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data) = 0;
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) = 0;
myarray decode(int &srcAddr, int &dstAddr, int &cmd)
{
if (fullFrame == true)
@@ -37,31 +37,19 @@ protected:
myarray data;
};
Codec *codecFind(const char *name);
typedef struct
{
const char *name;
Codec *(*codec_get_fun)();
} codec_def;
typedef struct{
const char *name;
Codec *(*codec_get_fun)();
}codec_def;
#define codec_export(name_,fun_) \
#define codec_export(name_, fun_) \
const static char __codec_##name_##_name[] __attribute__((section(".rodata.codecstr"))) = #name_; \
__attribute__((used)) static codec_def _codec_##name_ __attribute__((section("codecdef")))={\
.name=__codec_##name_##_name,\
.codec_get_fun=fun_,\
}
__attribute__((used)) static codec_def _codec_##name_ __attribute__((section("codecdef"))) = { \
.name = __codec_##name_##_name, \
.codec_get_fun = fun_, \
}
#endif // CODEC_H

View File

@@ -1,91 +1,86 @@
#include "codec_m4.h"
#include "QDebug"
bool codec_m4::recvByte(int byte)
{
bool ack = false;
if (fullFrame == true)
{
return fullFrame;
}
data.append(byte);
switch (data.size()) {
case 1:
if(uint8_t(data[0])==0xff)
{
num_to_read=2;
}
else
{
data.remove(0,1);
num_to_read=0;
}
break;
case 2:
{
int len=data[1];
num_to_read=len+2;
}
break;
default:
break;
}
// 此时一帧数据已完成
if(num_to_read>0&&num_to_read==data.size())
{
data.remove(0,2);
qDebug()<<"recv_m4:"<<QString(data)<<endl;
ack=true;
num_to_read=0;
}
fullFrame=ack;
bool ack = false;
if (fullFrame == true)
{
return fullFrame;
}
data.append(byte);
switch (data.size())
{
case 1:
if (uint8_t(data[0]) == 0xff)
{
num_to_read = 2;
}
else
{
data.remove(0, 1);
num_to_read = 0;
}
break;
case 2:
{
int len = data[1];
num_to_read = len + 2;
}
break;
default:
break;
}
// 此时一帧数据已完成
if (num_to_read > 0 && num_to_read == data.size())
{
data.remove(0, 2);
qDebug() << "recv_m4:" << QString(data) << endl;
ack = true;
num_to_read = 0;
}
fullFrame = ack;
return fullFrame;
}
bool codec_m4::packCheck(myarray data)
{
if(data[0]!=0xff){
return false;
}
if(data.size()>=2&&(data.size()==(data[1]+2))){
return true;
}
if (data[0] != 0xff)
{
return false;
}
if (data.size() >= 2 && (data.size() == (data[1] + 2)))
{
return true;
}
return false;
}
myarray codec_m4::encode(int srcAddr, int dstAddr, int cmd, myarray data)
{
myarray r;
r.append(0xff);
r.append(char(data.size()));
r.append(data);
return r;
myarray r;
r.append(0xff);
r.append(char(data.size()));
r.append(data);
return r;
}
myarray codec_m4::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
{
if(packCheck(data)){
return myarray(data.mid(2));
}
if (packCheck(data))
{
return data.mid(2);
}
return myarray();
}
Codec *codec_get()
{
static Codec *codec_=nullptr;
if(codec_==nullptr){
codec_=new codec_m4();
}
return codec_;
static Codec *codec_ = nullptr;
if (codec_ == nullptr)
{
codec_ = new codec_m4();
}
return codec_;
}
codec_export(codec_m4,codec_get);
codec_export(codec_m4, codec_get);

View File

@@ -2,17 +2,17 @@
#define CODEC_M4_H
#include "interface/codec.h"
class codec_m4:public Codec
class codec_m4 : public Codec
{
public:
codec_m4(){num_to_read=0;}
virtual bool packCheck(myarray data);
virtual bool recvByte(int byte);
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data);
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data);
codec_m4() { num_to_read = 0; }
virtual bool packCheck(myarray data);
virtual bool recvByte(int byte);
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data);
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data);
protected:
int num_to_read;
int num_to_read;
};
#endif // CODEC_M4_H

View File

@@ -1,86 +1,78 @@
#include "codec_slave.h"
#include "base/crc.h"
myarray codec_slave::encode(int srcAddr, int dstAddr, int cmd, myarray data)
{
Q_UNUSED(srcAddr);
myarray t;
uint16_t len=data.size()+10;
cmd_no++;
Q_UNUSED(srcAddr);
myarray t;
uint16_t len = data.size() + 10;
cmd_no++;
t.append('Y');
t.append('e');
t.append(len&0xff);
t.append(len>>8);
t.append(char(0));// 源地址
t.append(char(dstAddr&0xff));// 目标地址
t.append(cmd);// 命令码
t.append(cmd_no&0xff);
t.append(cmd_no>>8);
t.append(data);
t.append(crc::crc8((uint8_t *)t.data(),t.size()));
return t;
t.append('Y');
t.append('e');
t.append(len & 0xff);
t.append(len >> 8);
t.append(char(0)); // 源地址
t.append(char(dstAddr & 0xff)); // 目标地址
t.append(cmd); // 命令码
t.append(cmd_no & 0xff);
t.append(cmd_no >> 8);
t.append(data);
t.append(crc::crc8((uint8_t *)t.data(), t.size()));
return t;
}
myarray codec_slave::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
{
myarray r;
QString str_err="ok";
if(data.size()<10)
{
// 一帧数据至少10字节
qWarning("recv data len too less");
str_err="recv data len too less.";
return r;
}
uint16_t len=data[2]|(data[3]<<8);
uint8_t crc=crc::crc8((uint8_t *)data.data(),data.size()-1);
if(len!=data.size())
{
// 如果长度不相等则产生了数据丢失
qWarning("recv data have lossed");
str_err="recv data have lossed.";
return r;
}
srcAddr=data[4];
dstAddr=data[5];
uint16_t no=data[7]|(data[8]<<8);
uint16_t h_no=cmd_no;
if(no!=h_no)
{
// 发送一条指令应等待其返回,此时流水号应相同
//qWarning()<<"alave_addr="<<src_addr<<" cmd_no error:host="<<h_no<<",slave="<<no<<endl;
//return r;
//str_err="cmd no err.";
}
if(crc!=uint8_t(data[len-1]))
{
// crc校验不对
qWarning("recv data crc check error:%02x,%02x",crc,uint8_t(data[len-1]));
qWarning("data=%s",data.toHex(' ').data());
str_err="crc check err.";
}
cmd=data[6];
r=data.mid(9,len-10);
myarray r;
QString str_err = "ok";
if (data.size() < 10)
{
// 一帧数据至少10字节
qWarning("recv data len too less");
str_err = "recv data len too less.";
return r;
}
uint16_t len = data[2] | (data[3] << 8);
uint8_t crc = crc::crc8((uint8_t *)data.data(), data.size() - 1);
if (len != data.size())
{
// 如果长度不相等则产生了数据丢失
qWarning("recv data have lossed");
str_err = "recv data have lossed.";
return r;
}
srcAddr = data[4];
dstAddr = data[5];
uint16_t no = data[7] | (data[8] << 8);
uint16_t h_no = cmd_no;
if (no != h_no)
{
// 发送一条指令应等待其返回,此时流水号应相同
// qWarning()<<"alave_addr="<<src_addr<<" cmd_no error:host="<<h_no<<",slave="<<no<<endl;
// return r;
// str_err="cmd no err.";
}
if (crc != uint8_t(data[len - 1]))
{
// crc校验不对
qWarning("recv data crc check error:%02x,%02x", crc, uint8_t(data[len - 1]));
qWarning("data=%s", data.toHex(' ').data());
str_err = "crc check err.";
}
cmd = data[6];
r = data.mid(9, len - 10);
return r;
}
Codec *codec_slave_get()
{
static Codec *codec_=nullptr;
if(codec_==nullptr){
codec_=new codec_slave();
}
return codec_;
static Codec *codec_ = nullptr;
if (codec_ == nullptr)
{
codec_ = new codec_slave();
}
return codec_;
}
codec_export(codec_slave,codec_slave_get);
codec_export(codec_slave, codec_slave_get);

View File

@@ -3,19 +3,19 @@
#include "interface/codec.h"
class codec_slave: public Codec
class codec_slave : public Codec
{
public:
codec_slave(): Codec(){
codec_slave() : Codec()
{
}
virtual bool packCheck(myarray data) { return false; }
virtual bool recvByte(int byte) { return false; }
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data);
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data);
}
virtual bool packCheck(myarray data){return false;}
virtual bool recvByte(int byte){return false;}
virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data);
virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data);
protected:
uint16_t cmd_no;
uint16_t cmd_no;
};
#endif // CODEC_SLAVE_H

View File

@@ -3,181 +3,179 @@
#include "base/crc.h"
#include "interface/codec_ym.h"
// 重载接收字节函数
bool CodecYm::recvByte(int byte)
// 重载接收字节函数
bool CodecYm::recvByte(int byte)
{
bool ack = false;
if (fullFrame == true)
{
bool ack = false;
if (fullFrame == true)
{
return fullFrame;
}
data.append(uint8_t(byte));
switch (data.size())
{
case 2:
if (uint8_t(data[0]) == 0x59u && uint8_t(data[1]) == 0x6du)
{
is_big_data = false;
num_to_read = 4; // 帧头+2byte负载长度
}
else
{
data.remove(0, 1);
num_to_read = 0;
}
break;
case 4:
{
int len = data[2] | (data[3] << 8);
if (len < 65535)
{
is_big_data = false;
num_to_read += len + 2; // 负载+2byte校验
qDebug("normal data. len=%d", len);
}
else
{
is_big_data = true;
num_to_read = 11; // 扩展数据长度
qDebug("big data.");
}
}
break;
case 11:
{
if (is_big_data == true)
{
int len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24);
num_to_read = 4 + len + 2; // 负载+2byte校验
qDebug("big data. len=%d", len);
}
}
default:
break;
}
// 此时一帧数据已完成
if (num_to_read > 0 && num_to_read == data.size())
{
ack = true;
num_to_read = 0;
}
fullFrame = ack;
return fullFrame;
}
// 重载解码函数
myarray CodecYm::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
data.append(uint8_t(byte));
switch (data.size())
{
Q_UNUSED(srcAddr);
Q_UNUSED(dstAddr);
myarray r;
if(packCheck(data)==true){
cmd=this->cmd;
if (is_big_data == false)
r = data.mid(7, len - 3);
else
r = data.mid(11, len - 7);
}
return r;
}
bool CodecYm::packCheck(myarray data)
{
bool ack=false;
if (data.size() < 9)
case 2:
if (uint8_t(data[0]) == 0x59u && uint8_t(data[1]) == 0x6du)
{
// 主机一帧数据至少9字节
qWarning("recv data len too less");
return ack;
}
if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du))
{
// 帧头不对
qWarning("frame head not 0x59 0x6d");
return ack;
}
len = (data[2] | (data[3] << 8));
if (len == 65535)
{
// 重新设置数据长度
len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24);
is_big_data = true;
is_big_data = false;
num_to_read = 4; // 帧头+2byte负载长度
}
else
{
is_big_data = false;
data.remove(0, 1);
num_to_read = 0;
}
if (len + 6 != data.size())
{
// 如果长度不相等则产生了数据丢失
qWarning("recv data have lossed");
return ack;
}
uint8_t chk_a = 0, chk_b = 0;
crc::crc16((uint8_t *)data.data(),2,len+4,&chk_a,&chk_b);
if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1]))
{
// crc校验不对
qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]),
int(data[data.size() - 1]));
}
// 保存此流水号
cmd_no = data[5] | (data[6] << 8);
cmd = data[4];
// 数据负载
return true;
}
myarray CodecYm::encode(int srcAddr, int dstAddr, int cmd, myarray data)
break;
case 4:
{
Q_UNUSED(srcAddr);
Q_UNUSED(dstAddr);
myarray t;
uint32_t len=data.size()+3;
t.append(0x59u);
t.append(0x6du);
t.append(0x43u);
if(len<65535)
{
t.append((len)&0xff);
t.append((len)>>8);
t.append(cmd);
t.append(cmd_no&0xff);
t.append(cmd_no>>8);
}else{
len+=4;
t.append(0xff);
t.append(0xff);
t.append(cmd);
t.append(cmd_no&0xff);
t.append(cmd_no>>8);
t.append(len&0xff);
t.append((len>>8)&0xff);
t.append((len>>16)&0xff);
t.append((len>>24)&0xff);
}
t.append(data);
uint8_t chk_a,chk_b;
crc::crc16((uint8_t *)t.data(),3,len+5,&chk_a,&chk_b);
t.append(chk_a);
t.append(chk_b);
return t;
int len = data[2] | (data[3] << 8);
if (len < 65535)
{
is_big_data = false;
num_to_read += len + 2; // 负载+2byte校验
qDebug("normal data. len=%d", len);
}
else
{
is_big_data = true;
num_to_read = 11; // 扩展数据长度
qDebug("big data.");
}
}
break;
case 11:
{
if (is_big_data == true)
{
int len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24);
num_to_read = 4 + len + 2; // 负载+2byte校验
qDebug("big data. len=%d", len);
}
}
default:
break;
}
// 此时一帧数据已完成
if (num_to_read > 0 && num_to_read == data.size())
{
ack = true;
num_to_read = 0;
}
fullFrame = ack;
return fullFrame;
}
// 重载解码函数
myarray CodecYm::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
{
Q_UNUSED(srcAddr);
Q_UNUSED(dstAddr);
myarray r;
if (packCheck(data) == true)
{
cmd = this->cmd;
if (is_big_data == false)
r = data.mid(7, len - 3);
else
r = data.mid(11, len - 7);
}
return r;
}
bool CodecYm::packCheck(myarray data)
{
bool ack = false;
if (data.size() < 9)
{
// 主机一帧数据至少9字节
qWarning("recv data len too less");
return ack;
}
if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du))
{
// 帧头不对
qWarning("frame head not 0x59 0x6d");
return ack;
}
len = (data[2] | (data[3] << 8));
if (len == 65535)
{
// 重新设置数据长度
len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24);
is_big_data = true;
}
else
{
is_big_data = false;
}
if (len + 6 != data.size())
{
// 如果长度不相等则产生了数据丢失
qWarning("recv data have lossed");
return ack;
}
uint8_t chk_a = 0, chk_b = 0;
crc::crc16((uint8_t *)data.data(), 2, len + 4, &chk_a, &chk_b);
if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1]))
{
// crc校验不对
qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]),
int(data[data.size() - 1]));
}
// 保存此流水号
cmd_no = data[5] | (data[6] << 8);
cmd = data[4];
// 数据负载
return true;
}
myarray CodecYm::encode(int srcAddr, int dstAddr, int cmd, myarray data)
{
Q_UNUSED(srcAddr);
Q_UNUSED(dstAddr);
myarray t;
uint32_t len = data.size() + 3;
t.append(0x59u);
t.append(0x6du);
t.append(0x43u);
if (len < 65535)
{
t.append((len) & 0xff);
t.append((len) >> 8);
t.append(cmd);
t.append(cmd_no & 0xff);
t.append(cmd_no >> 8);
}
else
{
len += 4;
t.append(0xff);
t.append(0xff);
t.append(cmd);
t.append(cmd_no & 0xff);
t.append(cmd_no >> 8);
t.append(len & 0xff);
t.append((len >> 8) & 0xff);
t.append((len >> 16) & 0xff);
t.append((len >> 24) & 0xff);
}
t.append(data);
uint8_t chk_a, chk_b;
crc::crc16((uint8_t *)t.data(), 3, len + 5, &chk_a, &chk_b);
t.append(chk_a);
t.append(chk_b);
return t;
}
Codec *codec_ym_get()
{
static Codec *codec_=nullptr;
if(codec_==nullptr){
codec_=new CodecYm();
}
return codec_;
static Codec *codec_ = nullptr;
if (codec_ == nullptr)
{
codec_ = new CodecYm();
}
return codec_;
}
codec_export(codec_ym,codec_ym_get);
codec_export(codec_ym, codec_ym_get);

View File

@@ -19,6 +19,7 @@ public:
myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data);
bool packCheck(myarray data);
myarray encode(int srcAddr, int dstAddr, int cmd, myarray data);
private:
bool is_big_data;
int num_to_read;
@@ -27,13 +28,4 @@ private:
int len;
};
#endif // CODEC_YM_H

View File

@@ -4,183 +4,168 @@
if_tcp::if_tcp()
{
this->connect_state=false;
this->timer_reconnect_=nullptr;
this->tcp_socket_=nullptr;
this->reconnect_timeout_ms=10000;
this->cfg_=syscfg();
this->connect_state = false;
this->timer_reconnect_ = nullptr;
this->tcp_socket_ = nullptr;
this->reconnect_timeout_ms = 10000;
this->cfg_ = syscfg();
this->timer_recv_end_=nullptr;
this->recv_end_timeout_ms=100;
qDebug("tcp created.");
this->timer_recv_end_ = nullptr;
this->recv_end_timeout_ms = 100;
qDebug("tcp created.");
}
if_tcp::~if_tcp()
{
}
void if_tcp::init()
{
if(nullptr == timer_reconnect_)
{
timer_reconnect_ = new QTimer(this);
if (nullptr == timer_reconnect_)
{
timer_reconnect_ = new QTimer(this);
connect(timer_reconnect_, &QTimer::timeout, this, &if_tcp::reconnect_cb);
}
timer_reconnect_->start(reconnect_timeout_ms);
connect(timer_reconnect_, &QTimer::timeout, this, &if_tcp::reconnect_cb);
}
timer_reconnect_->start(reconnect_timeout_ms);
if (nullptr == tcp_socket_)
{
tcp_socket_ = new QTcpSocket(this);
connect(tcp_socket_, SIGNAL(connected()), this, SLOT(connected_cb()));
connect(tcp_socket_, SIGNAL(disconnected()), this, SLOT(disconnected_cb()));
connect(tcp_socket_, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(state_changed_cb(QAbstractSocket::SocketState)));
connect(tcp_socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_error_cb(QAbstractSocket::SocketError)));
connect(tcp_socket_, SIGNAL(readyRead()), this, SLOT(ready_read_cb()));
if(nullptr == tcp_socket_)
{
tcp_socket_ = new QTcpSocket(this);
connect(tcp_socket_, SIGNAL(connected()), this, SLOT(connected_cb()));
connect(tcp_socket_, SIGNAL(disconnected()), this, SLOT(disconnected_cb()));
connect(tcp_socket_, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(state_changed_cb(QAbstractSocket::SocketState)));
connect(tcp_socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_error_cb(QAbstractSocket::SocketError)));
connect(tcp_socket_, SIGNAL(readyRead()), this, SLOT(ready_read_cb()));
tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1);// 禁用Nagle算法.
tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
if(cfg_->tcp_enable)
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
}
tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1); // 禁用Nagle算法.
tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
if (cfg_->tcp_enable)
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
}
}
// 获取本机地址
QString if_tcp::get_local_ip()
{
QList<QNetworkInterface> network =QNetworkInterface::allInterfaces();
foreach (QNetworkInterface net, network)
QList<QNetworkInterface> network = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface net, network)
{
QString netName = net.humanReadableName();
if (netName == "eth0")
{
QString netName=net.humanReadableName();
if(netName=="eth0")
QList<QNetworkAddressEntry> list = net.addressEntries(); // 获取IP地址与子掩码等
foreach (QNetworkAddressEntry address, list)
{
if (address.ip().protocol() == QAbstractSocket::IPv4Protocol) // 获取IPv4的地址
{
QList<QNetworkAddressEntry> list=net.addressEntries(); // 获取IP地址与子掩码等
foreach(QNetworkAddressEntry address,list)
{
if(address.ip().protocol()==QAbstractSocket::IPv4Protocol) // 获取IPv4的地址
{
return address.ip().toString();
}
}
return address.ip().toString();
}
}
}
return QString();
}
return QString();
}
void if_tcp::reconnect_cb()
{
if(connect_state!=true)
if (connect_state != true)
{
QNetworkConfigurationManager mgr;
if (mgr.isOnline() == true)
{
QNetworkConfigurationManager mgr;
if(mgr.isOnline()==true)
{
if(cfg_->tcp_enable){
qDebug("network is online.");
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
}
}
else
{
if(cfg_->tcp_enable){
qDebug("network is not online.");
}
}
// 设置为配置的ip地址
//if(QHostAddress(get_local_ip())!=QHostAddress(local_ip))
if(get_local_ip().isEmpty())
{
qDebug("modify local ip addr.");
QString str="ifconfig eth0 %1";
system(str.arg(cfg_->local_ip).toLocal8Bit().data());
str="route add default gw %1";
system(str.arg(cfg_->gateway_ip).toLocal8Bit().data());
}
if (cfg_->tcp_enable)
{
qDebug("network is online.");
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
}
}
else
{
if (cfg_->tcp_enable)
{
qDebug("network is not online.");
}
}
// 设置为配置的ip地址
// if(QHostAddress(get_local_ip())!=QHostAddress(local_ip))
if (get_local_ip().isEmpty())
{
qDebug("modify local ip addr.");
QString str = "ifconfig eth0 %1";
system(str.arg(cfg_->local_ip).toLocal8Bit().data());
str = "route add default gw %1";
system(str.arg(cfg_->gateway_ip).toLocal8Bit().data());
}
}
}
void if_tcp::connected_cb()
{
timer_reconnect_->start();
connect_state=true;
emit tcp_connected_signal();
qInfo("connected");
timer_reconnect_->start();
connect_state = true;
emit tcp_connected_signal();
qInfo("connected");
}
void if_tcp::disconnected_cb()
{
connect_state=false;
qInfo("disconnected");
connect_state = false;
qInfo("disconnected");
}
void if_tcp::state_changed_cb(QAbstractSocket::SocketState nSocketState)
{
qInfo("state changed:%d",nSocketState);
qInfo("state changed:%d", nSocketState);
}
void if_tcp::on_error_cb(QAbstractSocket::SocketError nErrCode)
{
connect_state=false;
qWarning("on error:%d",nErrCode);
connect_state = false;
qWarning("on error:%d", nErrCode);
}
void if_tcp::ready_read_cb()
{
QByteArray data = tcp_socket_->readAll();
timer_reconnect_->start();
if(irq_fun){
irq_fun(myarray(data));
}
// qInfo()<< "recv data from tcp:"<<crc::byte_array_to_string(recv)<<endl;
QByteArray data = tcp_socket_->readAll();
timer_reconnect_->start();
if (irq_fun)
{
irq_fun(myarray(data));
}
// qInfo()<< "recv data from tcp:"<<crc::byte_array_to_string(recv)<<endl;
}
int if_tcp::write(myarray data)
{
if(nullptr == tcp_socket_ || false == connect_state)
{
//qWarning() << "Cant send data , TcpClient socket not connect.";
return 0;
}
if (nullptr == tcp_socket_ || false == connect_state)
{
// qWarning() << "Cant send data , TcpClient socket not connect.";
return 0;
}
int wb = tcp_socket_->write(data);
if(!tcp_socket_->flush())
{
//connect_state=false;
qWarning("write fial:[%s]",data.toHex(' ').data());
}
else
{
timer_reconnect_->start();
}
return wb;
int wb = tcp_socket_->write(data);
if (!tcp_socket_->flush())
{
// connect_state=false;
qWarning("write fial:[%s]", data.toHex(' ').data());
}
else
{
timer_reconnect_->start();
}
return wb;
}
InterFace *if_tcp_get()
{
static InterFace *if_=nullptr;
if(if_==nullptr){
if_=new if_tcp();
QTimer::singleShot(0,if_,&if_->init);
}
return if_;
static InterFace *if_ = nullptr;
if (if_ == nullptr)
{
if_ = new if_tcp();
QTimer::singleShot(0, if_, &InterFace::init);
}
return if_;
}
if_export(tcp,if_tcp_get);
if_export(tcp, if_tcp_get);

View File

@@ -33,6 +33,7 @@ protected slots:
void ready_read_cb();
signals:
void tcp_connected_signal();
protected:
mycfg *cfg_;
QTimer *timer_reconnect_;
@@ -42,7 +43,6 @@ protected:
QTimer *timer_recv_end_;
int recv_end_timeout_ms;
};
#endif // IF_TCP_H

View File

@@ -3,19 +3,14 @@
#include "string.h"
#include "QDebug"
InterFace *interFaceFind(const char *name)
{
extern const int __start_ifdef;
extern const int __stop_ifdef;
if_def *start=(if_def *)&__start_ifdef;
if_def *end=(if_def *)&__stop_ifdef;
extern const int __start_ifdef;
extern const int __stop_ifdef;
if_def *start = (if_def *)&__start_ifdef;
if_def *end = (if_def *)&__stop_ifdef;
if_def *item = 0;
for (item=start;item<end;item++)
for (item = start; item < end; item++)
{
if (item != nullptr)
{
@@ -26,7 +21,3 @@ InterFace *interFaceFind(const char *name)
qWarning("can not find interface named '%s'", name);
return nullptr;
}

View File

@@ -14,34 +14,32 @@ class InterFace : public QObject
{
Q_OBJECT
public:
InterFace() {irq_fun=nullptr;}
InterFace() { irq_fun = nullptr; }
virtual ~InterFace() {}
virtual void init() = 0;
virtual int write(myarray data) = 0;
virtual void set_irq(irq_cb fun){
this->irq_fun=fun;
virtual void set_irq(irq_cb fun)
{
this->irq_fun = fun;
}
protected:
irq_cb irq_fun;
};
InterFace *interFaceFind(const char *name);
typedef struct
{
const char *name;
InterFace *(*if_get_fun)();
} if_def;
typedef struct{
const char *name;
InterFace *(*if_get_fun)();
}if_def;
#define if_export(name_,fun_) \
#define if_export(name_, fun_) \
const static char __if_##name_##_name[] __attribute__((section(".rodata.ifstr"))) = #name_; \
__attribute__((used)) static if_def _if_##name_ __attribute__((section("ifdef")))={\
.name=__if_##name_##_name,\
.if_get_fun=fun_,\
}
__attribute__((used)) static if_def _if_##name_ __attribute__((section("ifdef"))) = { \
.name = __if_##name_##_name, \
.if_get_fun = fun_, \
}
#endif // INTERFACE_H