#ifndef MODULEEXCHANGE_H#define MODULEEXCHANGE_H#include <QObject>#include <QTcpServer>#include <QTcpSocket>#include <QStringList>#include <QThread>#include "common_gs.h"class ModuleExchange : public QObject{ Q_OBJECTpublic: explicit ModuleExchange(QObject *parent = 0); int portInput; _PAR_SORD parFromSord; // структура для записи текущих параметров управления на тко сорд гс QByteArray head; // Заголовок пакета 0xe0,0xe3,0xe5,0xe7 // установка порта на прослушивание void setPort(int port); // отправка данных void PacketSend(QByteArray); bool _connected; signals: // есть соединение по определенному порту void connected(); // нет соединения по конкретному порту void disconnected(); public slots: // включение или отключение прослушки отпределенного порта на сервере. void setEnableInput(bool _enable); // новое соединение void slot_new_connection(); // пришел сигнал разрыва соединения void slot_disconnected(); //слот чтения пакета void slot_readyRead(); // изменение состояния сокета void soc_chd(QAbstractSocket::SocketState);protected: QTcpServer *server; QTcpSocket * socket; virtual void parsePacket(QByteArray _packet); };#endif // MODULEEXCHANGE_H
#include "moduleexchange.h"const QString packetSeparator="|";const QString endSeparator="*";ModuleExchange::ModuleExchange(QObject *parent) : QObject(parent){ server= new QTcpServer(this); connect(server, SIGNAL(newConnection()),SLOT(slot_new_connection())); portInput=0; _connected=false; head.resize(4); head[0]=0xe0; head[1]=0xe3; head[2]=0xe5; head[3]=0xe7;}void ModuleExchange::slot_new_connection(){ qDebug()<<__FUNCTION__; socket=server->nextPendingConnection(); qDebug()<<"port"<<socket->localPort(); connect(socket,SIGNAL(disconnected()),socket, SLOT(slot_disconnected())); connect(socket,SIGNAL(readyRead()),this, SLOT(slot_readyRead())); connect(socket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(soc_chd(QAbstractSocket::SocketState))); _connected=true;}void ModuleExchange::slot_disconnected(){ socket->deleteLater();}void ModuleExchange::setPort(int port){ portInput=port;}void ModuleExchange::setEnableInput(bool _enable){ if(portInput==0) return; if(_enable) { server->listen(QHostAddress::Any,portInput); } else { server->close(); }}void ModuleExchange::slot_readyRead(){ qDebug()<<__FUNCTION__; if(!socket) return; quint64 NextBlockSize=0; QByteArray Packet; NextBlockSize=socket->bytesAvailable(); if(NextBlockSize<1) return; char dataP[NextBlockSize]; Packet.clear(); quint64 LenthPacket=0; socket->peek(dataP,NextBlockSize); Packet.setRawData(dataP,NextBlockSize); // номер в строке конца пакета("*") // для всех протоколов обмена кроме протокола с прибором 16 if((LenthPacket=Packet.indexOf(endSeparator))>0 && LenthPacket<=NextBlockSize) { // есть конец пакета char dataPacket[LenthPacket]; quint64 ReadDataSize=socket->read(dataPacket,(LenthPacket+1)); Packet.setRawData(dataPacket,LenthPacket); parsePacket(Packet); if(ReadDataSize<NextBlockSize) { slot_readyRead();// принято больше данных чем должно быть в одном пакете } } // наличие заголовка пакета при обмене с 16 прибором else if(Packet.contains(head)) { //ДОДЕЛАТЬ НЕ ВЕРНО ЕСЛИ ПАКЕТ ПРИХОДИТ ЗА 2 РАЗА, ТО У ВТОРОГО НЕТ ЗАГОЛОВКА char dataPacket[LenthPacket]; quint64 ReadDataSize=socket->read(dataPacket,NextBlockSize); Packet.setRawData(dataPacket,NextBlockSize); parsePacket(Packet); if(ReadDataSize<NextBlockSize) { slot_readyRead(); //не все данные считаны из канала } } else { slot_readyRead(); // в пакете нет символа конца пакета и заголовка, //т.е. меньше данных чем должно быть //или данные не соответствуют протоколам }}void ModuleExchange::parsePacket(QByteArray _packet){;}void ModuleExchange::PacketSend(QByteArray _packet){ qDebug()<<"1"; if(!_connected) return; if(socket->state()!=QAbstractSocket::ConnectedState) return; qDebug()<<"2"; int sz=socket->write(_packet,_packet.size()); if(sz!=_packet.size()) { qDebug()<<" not all information writes to protocol"; }}void ModuleExchange::soc_chd(QAbstractSocket::SocketState){ qDebug()<<"port"<<socket->localPort(); switch(socket->state()) { case QAbstractSocket::UnconnectedState: { qDebug("QAbstractSocket::UnconnectedState"); break;} case QAbstractSocket::HostLookupState: { qDebug("QAbstractSocket::HostLookupState");break;} case QAbstractSocket::ConnectingState: { qDebug("QAbstractSocket::ConnectingState");break;} case QAbstractSocket::ConnectedState: { qDebug("QAbstractSocket::ConnectedState");break;} case QAbstractSocket::BoundState: { qDebug("QAbstractSocket::BoundState");break;} case QAbstractSocket::ClosingState: { qDebug("QAbstractSocket::ClosingState");break;} case QAbstractSocket::ListeningState: { qDebug("QAbstractSocket::ListeningState");break;} default: { qDebug("QAbstractSocket DONT KNOW");break;} };}
#ifndef STRUCTURAEXCHANGE_16KP_H#define STRUCTURAEXCHANGE_16KP_H#include <QObject>#include <QSettings>#include <QTextCodec>#include "math.h"#include "moduleexchange.h"#include <QThread>class StructuraExchange_16KP : public ModuleExchange{ Q_OBJECTpublic: explicit StructuraExchange_16KP(QObject *parent = 0); QSettings *seting; unsigned short count_packet_to16KP; signals: void SignalRezim(unsigned short,unsigned short);// сигнал смены режима void SignBufferForSend(QByteArray);public slots: // отправка данных по протоколам обмена 16 прибора void slotSendDataToSord_16KP(unsigned short padr, unsigned short evnt, bool flag_s_h,double s_h, bool flag_dopInfo,double dopInfo,QString info);protected: void parsePacket(QByteArray _packet); };
#include "structuraexchange_16KP.h"#define packetSeparator "|"StructuraExchange_16KP::StructuraExchange_16KP(QObject *parent) : ModuleExchange(parent){ // moveToThread(this); count_packet_to16KP=0; seting= new QSettings( tr("net.ini"), QSettings::IniFormat, this ); seting->beginGroup("NET_PORT"); int PORT=seting->value("_PORT_16KP", QString("")).toInt(); qDebug()<<"PORT_client_16KP"<<PORT; seting->endGroup(); setPort(PORT); setEnableInput(true);}void StructuraExchange_16KP::parsePacket(QByteArray _packet){ qDebug()<<"arrData16KP"<<_packet; QByteArray arrData,rezData; int indTitle=0; if(_packet.size()>=1) { indTitle=_packet.indexOf(head,0); if(indTitle>=0) { rezData=_packet.mid(indTitle+3,_packet.size()-4);// слабое место переделать потом unsigned short padr=rezData.at(3); unsigned short part2=rezData.at(2); part2=part2<<8; padr=padr|part2; // qDebug()<<"padr"<<padr; switch(padr) { case 19: parFromSord.rezim=2; parFromSord.diapazon=rezData.at(5); emit SignalRezim(parFromSord.rezim,parFromSord.diapazon); break; case 20: parFromSord.rezim=2; parFromSord.diapazon=rezData.at(5); emit SignalRezim(parFromSord.rezim,parFromSord.diapazon); break; case 21: parFromSord.rezim=1; parFromSord.diapazon=rezData.at(5); emit SignalRezim(parFromSord.rezim,parFromSord.diapazon); break; case 17: parFromSord.rezim=3; parFromSord.diapazon=rezData.at(5); emit SignalRezim(parFromSord.rezim,parFromSord.diapazon); break; //case OTU_REZIM: parFromSord.rezim=0; break; case BUFF_ATGS: rezData=rezData.mid(5,rezData.size()-4); // qDebug()<<"SIZE"<<QString().number(rezData.size()); emit SignBufferForSend(rezData); break; case BUFF_KS: rezData=rezData.mid(5,rezData.size()-4); emit SignBufferForSend(rezData); break; default: break; } } }}void StructuraExchange_16KP::slotSendDataToSord_16KP(unsigned short padr, unsigned short evnt, bool flag_s_h,double s_h, bool flag_dopInfo,double dopInfo,QString info){ int sz=0;// if(socket_out->state()!=QAbstractSocket::ConnectedState)// return; QByteArray ass; QByteArray arr; QByteArray Packet; do { /** Шапка пакета **/ arr.resize(0); arr.append(head); // заголовок ass.resize(0); ass.append(count_packet_to16KP); ass.resize(2); arr.append(ass);// счетчик пакетов ass.resize(0); ass.append(padr); ass.resize(2); arr.append(ass);// подадрес ass.resize(0); ass.append(evnt); ass.resize(2); arr.append(ass);// код события /** Шапка пакета закончилась **/ /** Счетчик пакетов **/ count_packet_to16KP++; if(count_packet_to16KP>=pow(2,16)) count_packet_to16KP=0; /** Счетчик пакетов закончился**/ if(flag_s_h==true) { ass.resize(0); ass.append(abs(s_h)); ass.resize(2); arr.append(ass); } /** Есть дополнительня информация **/ if(flag_dopInfo==true) { ass.resize(0); ass.append(abs(dopInfo)); ass.resize(2); arr.append(ass);// дополнительная информация } /** Дополнительня информация закончилась**/ /** Есть информационные символы **/ ass.resize(0); if(info.size()>=4) { info.toUpper(); QTextCodec *codec= QTextCodec::codecForName("IBM 866"); ass=codec->fromUnicode(info); Packet.resize(0); Packet.append(arr); if(ass.size()>=INFO_LENGHT) { Packet.append(ass.left(INFO_LENGHT)); info=info.right(ass.size()-INFO_LENGHT); } else { Packet.append(ass); ass.clear(); } Packet.resize(72); PacketSend(Packet); } else { Packet.resize(0); Packet.append(arr); Packet.resize(72); PacketSend(Packet); } } while(ass.size()>0); /** Конец записи информации **/}#endif // STRUCTURAEXCHANGE_H
#ifndef STRUCTURAEXCHANGE2D8D_H#define STRUCTURAEXCHANGE2D8D_H#include <QObject>#include <QSettings>#include <QTimer>#include "moduleexchange.h"class StructuraExchange2D8D : public ModuleExchange{ Q_OBJECTpublic: explicit StructuraExchange2D8D(QObject *parent = 0); QSettings *seting; void SendData_2d_8d(QByteArray _pack); signals: void Radiation_on(QByteArray);public slots:protected: void parsePacket(QByteArray _packet); private slots: void sss();};#endif // STRUCTURAEXCHANGE_H
#include "structuraexchange_2D8D.h"//#include "/Structure/Structure.h"#define packetSeparator "|"StructuraExchange2D8D::StructuraExchange2D8D(QObject *parent) : ModuleExchange(parent){ seting= new QSettings( tr("net.ini"), QSettings::IniFormat, this ); seting->beginGroup("NET_PORT"); int PORT=seting->value("_PORT_2D_8D", QString("")).toInt(); qDebug()<<"PORT_client_2D8D"<<PORT; seting->endGroup(); setPort(PORT); setEnableInput(true);}void StructuraExchange2D8D::parsePacket(QByteArray _packet){ QByteArray arrData; arrData.resize(0); qDebug()<<"_packet from 2D_8D"<<_packet; if(_packet.size()>=1) { QString str; str=QString::fromAscii(_packet); str=_packet.mid(0,2); if(str=="@C") { _packet=_packet.right(3); _packet=_packet.left(2); switch(_packet.toShort()) { case 0: parFromSord.Moshnost=0;break; case 1: parFromSord.Moshnost=2;break; case 4: parFromSord.Moshnost=3;break; default: break; } SendData_2d_8d("@Y*"); } if(str=="@U") { SendData_2d_8d("@Y*"); } if(str=="@I") { emit SendData_2d_8d("@I"); } if(str=="@A") { SendData_2d_8d("@A8F*"); } if(str=="#M" ) { _packet=arrData.right(2); _packet=arrData.left(1); switch(_packet.toShort()) { case 1: parFromSord.Napravlenie=2; break; case 3: parFromSord.Napravlenie=3; break; default: break; }; SendData_2d_8d("#Y*"); } if(str=="#D" || str=="#U" ) { SendData_2d_8d("#Y*"); } if(str=="#R") { SendData_2d_8d("#Y*"); emit Radiation_on(_packet.mid(2,1)); } }}void StructuraExchange2D8D::SendData_2d_8d(QByteArray _pack){ PacketSend(_pack); qDebug()<<"Packet_sent_2D_8D"<<_pack;}
#include "Exchange_my/structuraexchange_16KP.h"#include "Exchange_my/structuraexchange_2D8D.h"private: StructuraExchange_16KP *exch_16_kp; StructuraExchange2D8D *exch_2d8d;
//.cppexch_16_kp= new StructuraExchange_16KP(this);exch_2d8d=new StructuraExchange2D8D(this); connect(this,SIGNAL(SignalSend(QByteArray)),exch_pod,SLOT(DataSend(QByteArray))); connect(this,SIGNAL(Signal_SendDataToSord_16KP(unsigned short,unsigned short,bool,double,bool,double,QString)),exch_16_kp,SLOT(slotSendDataToSord_16KP(unsigned short,unsigned short,bool,double,bool,double,QString)));
connect(server, SIGNAL(newConnection()),SLOT(slot_new_connection()));void ModuleExchange::slot_new_connection(){ qDebug()<<__FUNCTION__; socket=server->nextPendingConnection(); qDebug()<<"port"<<socket->localPort(); connect(socket,SIGNAL(disconnected()),socket, SLOT(slot_disconnected())); connect(socket,SIGNAL(readyRead()),this, SLOT(slot_readyRead())); connect(socket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(soc_chd(QAbstractSocket::SocketState))); _connected=true;}
StructuraExchange_16KP *exch_16_kp; StructuraExchange2D8D *exch_2d8d; exch_16_kp= new StructuraExchange_16KP(this);exch_2d8d=new StructuraExchange2D8D(this);