mainwindow.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. iv::Ivlog *givlog;
  4. unsigned int gv2xEn = false;
  5. void ListenV2xStEn(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  6. {
  7. // if(nSize < sizeof(iv::v2x::v2xStEn))
  8. // {
  9. // givlog->error("v2x","ListenV2xStEn size error %d",nSize,sizeof(iv::v2x::v2xStEn));
  10. // return;
  11. // }
  12. iv::v2x::v2xStEn xv2xStEnMsg;
  13. if(!xv2xStEnMsg.ParseFromArray(strdata,nSize))
  14. {
  15. givlog->error("iv::v2x::v2xStEn::ListenV2xStEn parse error");
  16. return;
  17. }
  18. gv2xEn = xv2xStEnMsg.v2xsten();
  19. givlog->info("v2x", "v2x enable st: %d", gv2xEn);
  20. }
  21. MainWindow::MainWindow(QWidget *parent) :
  22. QMainWindow(parent),
  23. ui(new Ui::MainWindow)
  24. {
  25. ui->setupUi(this);
  26. socket=new QTcpSocket();
  27. ui->lineEdit_ip->setText("47.95.196.28");
  28. ui->lineEdit_port->setText("12123");
  29. //连接信号槽
  30. givlog = new iv::Ivlog("v2x");
  31. connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
  32. connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
  33. mp_v2xSend = iv::modulecomm::RegisterSend("v2x",1000,3);
  34. iv::modulecomm::RegisterRecv("v2xStEn", ListenV2xStEn);
  35. mp_v2xStSend = iv::modulecomm::RegisterSend("v2xStReq",1000,1);
  36. shareV2xStReqMsg();
  37. }
  38. MainWindow::~MainWindow()
  39. {
  40. delete this->socket;
  41. delete ui;
  42. }
  43. void MainWindow::socket_Read_Data()
  44. {
  45. QByteArray buffer;
  46. //读取缓冲区数据
  47. buffer = socket->readAll();
  48. if(!buffer.isEmpty())
  49. {
  50. //QString str = QString::fromLocal8Bit(buffer);
  51. QString str = QString(buffer);
  52. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  53. QStringList list = str.split(",");
  54. int length=list.size();
  55. // if(str.contains("FFCC")) {
  56. // QString len=QString::number(length);
  57. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  58. // ui->textEdit_messages->insertPlainText("服务器消息:"+len+"\n");
  59. // }
  60. if(length>=4) {
  61. if(checkVehicle(list[2])) {
  62. ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  63. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is ok!\n");
  64. int downstream_id =getDownStreamId(list[0]);
  65. switch (downstream_id) {
  66. case StopCommand:
  67. ProStopCommand(list[3]);
  68. break;
  69. case AutoPilotControl:
  70. if(length>4) {
  71. ProAutoPilotControl(list);
  72. }
  73. break;
  74. case StationCommand:
  75. ProStationCommand(list[3]);
  76. break;
  77. default:
  78. break;
  79. }
  80. } else {
  81. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is wrong!\n");
  82. }
  83. }
  84. }
  85. }
  86. //云平台急停指令
  87. void MainWindow::ProStopCommand(QString str)
  88. {
  89. int tmp;
  90. iv::v2x::v2x msgV2xProto;
  91. msgV2xProto.Clear();
  92. QStringList list=str.split("]");
  93. if(list.size()>0) {
  94. tmp = list[0].toInt();
  95. if(tmp==0) {
  96. msgV2xProto.set_emergencystop(0);
  97. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop cancel!\n");
  98. shareV2xProtoMsg(msgV2xProto);
  99. }
  100. else if(tmp==1) {
  101. msgV2xProto.set_emergencystop(1);
  102. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop enable!\n");
  103. shareV2xProtoMsg(msgV2xProto);
  104. }
  105. }
  106. }
  107. //云平台工作模式&坐标索引指令
  108. void MainWindow::ProAutoPilotControl(QStringList list)
  109. {
  110. iv::v2x::v2x msgV2xProto;
  111. iv::v2x::stationsGPS *stGps;
  112. msgV2xProto.Clear();
  113. int tmp = list[3].toInt();
  114. int length=list.size();
  115. int stationId;
  116. if(tmp==1) {
  117. msgV2xProto.set_carmode(1);
  118. if(length>5) {
  119. QStringList tmp_list0=list[4].split("[");
  120. list[4]=tmp_list0[1];
  121. QStringList tmp_list1=list[length-1].split("]]");
  122. list[length-1]=tmp_list1[0];
  123. for(int i=4;i<length;i++) {
  124. stationId = list[i].toInt();
  125. msgV2xProto.add_stationid(stationId);
  126. stGps=msgV2xProto.add_stgps();
  127. stGps->set_lat(0);
  128. stGps->set_lon(0);
  129. ui->textEdit_messages->insertPlainText("服务器消息:car station has "+list[i]+"\n");
  130. }
  131. } else {
  132. ui->textEdit_messages->insertPlainText("服务器消息:car station at least 2!\n");
  133. }
  134. } else {
  135. msgV2xProto.set_carmode(0);
  136. ui->textEdit_messages->insertPlainText("服务器消息:car autoDrive mode cancle!\n");
  137. }
  138. shareV2xProtoMsg(msgV2xProto);
  139. }
  140. //云平台站点停止指令
  141. void MainWindow::ProStationCommand(QString str)
  142. {
  143. int tmp;
  144. iv::v2x::v2x msgV2xProto;
  145. msgV2xProto.Clear();
  146. QStringList list=str.split("]");
  147. if(list.size()>0) {
  148. tmp = list[0].toInt();
  149. if(tmp==0) {
  150. msgV2xProto.set_stationstop(1);//站点启动
  151. shareV2xProtoMsg(msgV2xProto);
  152. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station start!\n");
  153. }
  154. else if(tmp==1) {
  155. msgV2xProto.set_stationstop(0);//下一站停车
  156. shareV2xProtoMsg(msgV2xProto);
  157. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station top!\n");
  158. }
  159. }
  160. }
  161. bool MainWindow::checkVehicle(QString str)
  162. {
  163. return true;
  164. }
  165. int MainWindow::getDownStreamId(QString str)
  166. {
  167. int downstream_id=-1;
  168. if(str.contains("FFAA")) {
  169. ui->textEdit_messages->insertPlainText("服务器消息:StopCommand!\n");
  170. downstream_id=1;
  171. return downstream_id;
  172. }
  173. if(str.contains("FFCC")) {
  174. ui->textEdit_messages->insertPlainText("服务器消息:AutoPilotControl!\n");
  175. downstream_id=2;
  176. return downstream_id;
  177. }
  178. if(str.contains("FFBB")) {
  179. ui->textEdit_messages->insertPlainText("服务器消息:StationCommand!\n");
  180. downstream_id=3;
  181. return downstream_id;
  182. }
  183. return downstream_id;
  184. }
  185. void MainWindow::socket_Disconnected()
  186. {
  187. //修改按键文字
  188. ui->pushButton_connect->setText("connect");
  189. ui->textEdit_messages->insertPlainText("服务器消息:Disconnected");
  190. }
  191. void MainWindow::on_pushButton_connect_clicked()
  192. {
  193. if(ui->pushButton_connect->text() == tr("connect"))
  194. {
  195. QString IP;
  196. int port;
  197. //获取IP地址
  198. IP = ui->lineEdit_ip->text();
  199. //获取端口号
  200. port = ui->lineEdit_port->text().toInt();
  201. ui->textEdit_messages->setText("");
  202. ui->textEdit_messages->insertPlainText("正在连接"+ui->lineEdit_ip->text()+":"+ui->lineEdit_port->text()+"\n");
  203. //取消已有的连接
  204. socket->abort();
  205. //连接服务器
  206. socket->connectToHost(IP, port);
  207. //等待连接成功
  208. if(!socket->waitForConnected(30000))
  209. {
  210. QMessageBox::warning(this,tr("消息"),tr("连接失败!请重新连接"),QMessageBox::Yes);
  211. ui->textEdit_messages->insertPlainText("连接失败\n");
  212. return;
  213. }
  214. ui->textEdit_messages->insertPlainText("连接成功\n");
  215. QMessageBox::information(this,tr("消息"),tr("连接成功"),QMessageBox::Yes);
  216. //修改按键文字
  217. ui->pushButton_connect->setText("disconnect");
  218. }
  219. else
  220. {
  221. //断开连接
  222. ui->textEdit_messages->setText("断开连接\n");
  223. socket->disconnectFromHost();
  224. //修改按键文字
  225. ui->pushButton_connect->setText("connect");
  226. }
  227. }
  228. void MainWindow::on_textEdit_messages_textChanged()
  229. {
  230. ui->textEdit_messages->moveCursor(QTextCursor::End);
  231. }
  232. QString MainWindow::getTimeStamp()
  233. {
  234. QDateTime time = QDateTime::currentDateTime();
  235. int current_timestamp=time.toTime_t();
  236. QString str=QString::number(current_timestamp);
  237. return str;
  238. }
  239. void MainWindow::shareV2xProtoMsg(iv::v2x::v2x msgV2xProto)
  240. {
  241. int nsize = msgV2xProto.ByteSize();
  242. char * strdata = new char[msgV2xProto.ByteSize()];
  243. if(msgV2xProto.SerializePartialToArray(strdata,nsize))
  244. {
  245. iv::modulecomm::ModuleSendMsg(mp_v2xSend,strdata,nsize);
  246. }
  247. givlog->info("v2x","share v2x controll Msg");
  248. delete strdata;
  249. }
  250. //请求v2状态,是否接收v2x的控制,由ui发送
  251. void MainWindow::shareV2xStReqMsg()
  252. {
  253. iv::v2x::v2xStReq x;
  254. x.set_v2xstreq(1);
  255. int nsize = x.ByteSize();
  256. char * str = new char[nsize];
  257. if(x.SerializeToArray(str,nsize))
  258. {
  259. iv::modulecomm::ModuleSendMsg(mp_v2xStSend,str,nsize);
  260. }
  261. else
  262. {
  263. givlog->error("v2x","send require error");
  264. }
  265. givlog->info("v2x","send st req");
  266. delete str;
  267. }
  268. //void MainWindow::on_pushButton_sendVehicle_clicked()
  269. //{
  270. // QString head= "[";
  271. // QString packageID="'DDFF'";
  272. // QString time_stamp=getTimeStamp();
  273. // QString test="['DDFF',"+time_stamp+",[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2,0]]";
  274. // //QByteArray bytes = test.toUtf8();
  275. // QByteArray bytes = test.toLatin1();
  276. // socket->write(bytes);
  277. //}