mainwindow.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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. //Start Get init param
  27. QString strpath = QCoreApplication::applicationDirPath();
  28. qDebug()<<strpath;
  29. strpath = strpath + "/v2xTcpClient.xml";
  30. iv::xmlparam::Xmlparam xp(strpath.toStdString());
  31. std::string strCarVIN = xp.GetParam("carVIN","catarc001");
  32. std::string strHostIP = xp.GetParam("hostIP","47.95.196.28");
  33. std::string strHostPort = xp.GetParam("hostPort","12123");
  34. std::string strStationCount = xp.GetParam("stationCount","20");
  35. int count = std::stoi(strStationCount,nullptr,10);
  36. stationGps location;
  37. for(int i = 0; i < count; i++)
  38. {
  39. std::string strLatName = "lat" + std::to_string(i);
  40. std::string strLonName = "lon" + std::to_string(i);
  41. std::cout<<strLatName<<strLonName<<std::endl;
  42. std::string strLatValue = xp.GetParam(strLatName,"0");
  43. std::string strLonValue = xp.GetParam(strLonName,"0");
  44. location.lat = std::stof(strLatValue,0);
  45. location.lon = std::stof(strLonValue,0);
  46. mstationGps.append(location);
  47. }//END get init param
  48. socket=new QTcpSocket();
  49. ui->lineEdit_ip->setText(QString::fromStdString(strHostIP));
  50. ui->lineEdit_port->setText(QString::fromStdString(strHostPort));
  51. ui->pushButton_connect->setEnabled(false);
  52. //连接信号槽
  53. givlog = new iv::Ivlog("v2x");
  54. connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
  55. connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
  56. mp_v2xSend = iv::modulecomm::RegisterSend("v2x",1000,3);
  57. iv::modulecomm::RegisterRecv("v2xStEn", ListenV2xStEn);
  58. mp_v2xStSend = iv::modulecomm::RegisterSend("v2xStReq",1000,1);
  59. shareV2xStReqMsg();
  60. //heart beat,jiaolili,20210207
  61. m_bEnablePlatform=false;
  62. m_bIsConnect=false;
  63. QTimer *timer = new QTimer(this);
  64. connect(timer,SIGNAL(timeout()),SLOT(heartBeat()));
  65. timer->start(1000);
  66. ///////////////////////////////////////////
  67. }
  68. MainWindow::~MainWindow()
  69. {
  70. delete this->socket;
  71. delete ui;
  72. }
  73. void MainWindow::heartBeat()
  74. {
  75. if(gv2xEn) {
  76. if(!m_bEnablePlatform) {
  77. connectPlatform();
  78. }
  79. if(m_bIsConnect) {
  80. upDataStream();
  81. } else {
  82. connectPlatform();
  83. }
  84. } else {
  85. if(m_bEnablePlatform) {
  86. disconnectPlatform();
  87. }
  88. }
  89. m_bEnablePlatform = gv2xEn;
  90. }
  91. void MainWindow::upDataStream()
  92. {
  93. // upVehicleStatus();
  94. // upHardwareStatus();
  95. // upObstacleDataStatus();
  96. upSoftwareStatus();
  97. }
  98. void MainWindow::socket_Read_Data()
  99. {
  100. QByteArray buffer;
  101. //读取缓冲区数据
  102. buffer = socket->readAll();
  103. if(!buffer.isEmpty())
  104. {
  105. //QString str = QString::fromLocal8Bit(buffer);
  106. QString str = QString(buffer);
  107. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  108. QStringList list = str.split(",");
  109. int length=list.size();
  110. // if(str.contains("FFCC")) {
  111. // QString len=QString::number(length);
  112. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  113. // ui->textEdit_messages->insertPlainText("服务器消息:"+len+"\n");
  114. // }
  115. if(length>=4) {
  116. if(checkVehicle(list[2])) {
  117. ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  118. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is ok!\n");
  119. int downstream_id =getDownStreamId(list[0]);
  120. switch (downstream_id) {
  121. case StopCommand:
  122. ProStopCommand(list[3]);
  123. break;
  124. case AutoPilotControl:
  125. if(length>4) {
  126. ProAutoPilotControl(list);
  127. }
  128. break;
  129. case StationCommand:
  130. ProStationCommand(list[3]);
  131. break;
  132. default:
  133. break;
  134. }
  135. } else {
  136. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is wrong!\n");
  137. }
  138. }
  139. }
  140. }
  141. //云平台急停指令
  142. void MainWindow::ProStopCommand(QString str)
  143. {
  144. int tmp;
  145. iv::v2x::v2x msgV2xProto;
  146. msgV2xProto.Clear();
  147. QStringList list=str.split("]");
  148. if(list.size()>0) {
  149. tmp = list[0].toInt();
  150. if(tmp==0) {
  151. msgV2xProto.set_emergencystop(0);
  152. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop cancel!\n");
  153. shareV2xProtoMsg(msgV2xProto);
  154. }
  155. else if(tmp==1) {
  156. msgV2xProto.set_emergencystop(1);
  157. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop enable!\n");
  158. shareV2xProtoMsg(msgV2xProto);
  159. }
  160. }
  161. }
  162. //云平台工作模式&坐标索引指令
  163. void MainWindow::ProAutoPilotControl(QStringList list)
  164. {
  165. iv::v2x::v2x msgV2xProto;
  166. iv::v2x::stationsGPS *stGps;
  167. msgV2xProto.Clear();
  168. int tmp = list[3].toInt();
  169. int length=list.size();
  170. int stationId;
  171. if(tmp==1) {
  172. msgV2xProto.set_carmode(1);
  173. if(length>5) {
  174. QStringList tmp_list0=list[4].split("[");
  175. list[4]=tmp_list0[1];
  176. QStringList tmp_list1=list[length-1].split("]]");
  177. list[length-1]=tmp_list1[0];
  178. for(int i=4;i<length;i++) {
  179. stationId = list[i].toInt();
  180. msgV2xProto.add_stationid(stationId);
  181. stGps=msgV2xProto.add_stgps();
  182. stGps->set_lat(mstationGps.at(i-4).lat);
  183. stGps->set_lon(mstationGps.at(i-4).lon);
  184. ui->textEdit_messages->insertPlainText("服务器消息:car station has "+list[i]+"\n");
  185. }
  186. } else {
  187. ui->textEdit_messages->insertPlainText("服务器消息:car station at least 2!\n");
  188. }
  189. } else {
  190. msgV2xProto.set_carmode(0);
  191. ui->textEdit_messages->insertPlainText("服务器消息:car autoDrive mode cancle!\n");
  192. }
  193. shareV2xProtoMsg(msgV2xProto);
  194. }
  195. //云平台站点停止指令
  196. void MainWindow::ProStationCommand(QString str)
  197. {
  198. int tmp;
  199. iv::v2x::v2x msgV2xProto;
  200. msgV2xProto.Clear();
  201. QStringList list=str.split("]");
  202. if(list.size()>0) {
  203. tmp = list[0].toInt();
  204. if(tmp==0) {
  205. msgV2xProto.set_stationstop(1);//站点启动
  206. shareV2xProtoMsg(msgV2xProto);
  207. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station start!\n");
  208. }
  209. else if(tmp==1) {
  210. msgV2xProto.set_stationstop(0);//下一站停车
  211. shareV2xProtoMsg(msgV2xProto);
  212. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station top!\n");
  213. }
  214. }
  215. }
  216. bool MainWindow::checkVehicle(QString str)
  217. {
  218. return true;
  219. }
  220. int MainWindow::getDownStreamId(QString str)
  221. {
  222. int downstream_id=-1;
  223. if(str.contains("FFAA")) {
  224. ui->textEdit_messages->insertPlainText("服务器消息:StopCommand!\n");
  225. downstream_id=1;
  226. return downstream_id;
  227. }
  228. if(str.contains("FFCC")) {
  229. ui->textEdit_messages->insertPlainText("服务器消息:AutoPilotControl!\n");
  230. downstream_id=2;
  231. return downstream_id;
  232. }
  233. if(str.contains("FFBB")) {
  234. ui->textEdit_messages->insertPlainText("服务器消息:StationCommand!\n");
  235. downstream_id=3;
  236. return downstream_id;
  237. }
  238. return downstream_id;
  239. }
  240. void MainWindow::socket_Disconnected()
  241. {
  242. //修改按键文字
  243. ui->pushButton_connect->setText("connect");
  244. ui->textEdit_messages->insertPlainText("服务器消息:Disconnected");
  245. }
  246. void MainWindow::connectPlatform()
  247. {
  248. QString IP;
  249. int port;
  250. //获取IP地址
  251. IP = ui->lineEdit_ip->text();
  252. //获取端口号
  253. port = ui->lineEdit_port->text().toInt();
  254. ui->textEdit_messages->setText("");
  255. ui->textEdit_messages->insertPlainText("正在连接"+ui->lineEdit_ip->text()+":"+ui->lineEdit_port->text()+"\n");
  256. //取消已有的连接
  257. socket->abort();
  258. //连接服务器
  259. socket->connectToHost(IP, port);
  260. //等待连接成功
  261. if(!socket->waitForConnected(30000)) {
  262. ui->textEdit_messages->insertPlainText("连接失败\n");
  263. return;
  264. }
  265. m_bIsConnect = true;
  266. ui->textEdit_messages->insertPlainText("连接成功\n");
  267. //修改按键文字
  268. ui->pushButton_connect->setText("disconnect");
  269. }
  270. void MainWindow::disconnectPlatform()
  271. {
  272. //断开连接
  273. ui->textEdit_messages->setText("断开连接\n");
  274. socket->disconnectFromHost();
  275. //修改按键文字
  276. ui->pushButton_connect->setText("connect");
  277. m_bIsConnect=false;
  278. }
  279. void MainWindow::on_pushButton_connect_clicked()
  280. {
  281. if(ui->pushButton_connect->text() == tr("connect"))
  282. {
  283. QString IP;
  284. int port;
  285. //获取IP地址
  286. IP = ui->lineEdit_ip->text();
  287. //获取端口号
  288. port = ui->lineEdit_port->text().toInt();
  289. ui->textEdit_messages->setText("");
  290. ui->textEdit_messages->insertPlainText("正在连接"+ui->lineEdit_ip->text()+":"+ui->lineEdit_port->text()+"\n");
  291. //取消已有的连接
  292. socket->abort();
  293. //连接服务器
  294. socket->connectToHost(IP, port);
  295. //等待连接成功
  296. if(!socket->waitForConnected(30000))
  297. {
  298. QMessageBox::warning(this,tr("消息"),tr("连接失败!请重新连接"),QMessageBox::Yes);
  299. ui->textEdit_messages->insertPlainText("连接失败\n");
  300. return;
  301. }
  302. ui->textEdit_messages->insertPlainText("连接成功\n");
  303. QMessageBox::information(this,tr("消息"),tr("连接成功"),QMessageBox::Yes);
  304. //修改按键文字
  305. ui->pushButton_connect->setText("disconnect");
  306. }
  307. else
  308. {
  309. //断开连接
  310. ui->textEdit_messages->setText("断开连接\n");
  311. socket->disconnectFromHost();
  312. //修改按键文字
  313. ui->pushButton_connect->setText("connect");
  314. }
  315. }
  316. void MainWindow::on_textEdit_messages_textChanged()
  317. {
  318. ui->textEdit_messages->moveCursor(QTextCursor::End);
  319. }
  320. QString MainWindow::getTimeStamp()
  321. {
  322. QDateTime time = QDateTime::currentDateTime();
  323. int current_timestamp=time.toTime_t();
  324. QString str=QString::number(current_timestamp);
  325. return str;
  326. }
  327. void MainWindow::shareV2xProtoMsg(iv::v2x::v2x msgV2xProto)
  328. {
  329. int nsize = msgV2xProto.ByteSize();
  330. char * strdata = new char[msgV2xProto.ByteSize()];
  331. if(msgV2xProto.SerializePartialToArray(strdata,nsize))
  332. {
  333. iv::modulecomm::ModuleSendMsg(mp_v2xSend,strdata,nsize);
  334. }
  335. givlog->info("v2x","share v2x controll Msg");
  336. delete strdata;
  337. }
  338. //请求v2状态,是否接收v2x的控制,由ui发送
  339. void MainWindow::shareV2xStReqMsg()
  340. {
  341. iv::v2x::v2xStReq x;
  342. x.set_v2xstreq(1);
  343. int nsize = x.ByteSize();
  344. char * str = new char[nsize];
  345. if(x.SerializeToArray(str,nsize))
  346. {
  347. iv::modulecomm::ModuleSendMsg(mp_v2xStSend,str,nsize);
  348. }
  349. else
  350. {
  351. givlog->error("v2x","send require error");
  352. }
  353. givlog->info("v2x","send st req");
  354. delete str;
  355. }
  356. //void MainWindow::on_pushButton_sendVehicle_clicked()
  357. //{
  358. // QString head= "[";
  359. // QString packageID="'DDFF'";
  360. // QString time_stamp=getTimeStamp();
  361. // QString test="['DDFF',"+time_stamp+",[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2,0]]";
  362. // //QByteArray bytes = test.toUtf8();
  363. // QByteArray bytes = test.toLatin1();
  364. // socket->write(bytes);
  365. //}
  366. void MainWindow::upVehicleStatus()
  367. {
  368. QString time_stamp=getTimeStamp();
  369. QString test="['CCFF',"+time_stamp+",'catarc001',1,0,0,100,0,0,0,0,0]";
  370. //QByteArray bytes = test.toUtf8();
  371. QByteArray bytes = test.toLatin1();
  372. socket->write(bytes);
  373. }
  374. void MainWindow::upHardwareStatus()
  375. {
  376. QString time_stamp=getTimeStamp();
  377. QString test="['DDFF',"+time_stamp+",[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[[0,0],[0,0]],[2,0]]";
  378. //QByteArray bytes = test.toUtf8();
  379. QByteArray bytes = test.toLatin1();
  380. socket->write(bytes);
  381. }
  382. void MainWindow::upObstacleDataStatus()
  383. {
  384. QString time_stamp=getTimeStamp();
  385. QString test="['EEFF',"+time_stamp+",[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]";
  386. //QByteArray bytes = test.toUtf8();
  387. QByteArray bytes = test.toLatin1();
  388. socket->write(bytes);
  389. }
  390. void MainWindow::upSoftwareStatus()
  391. {
  392. QString time_stamp=getTimeStamp();
  393. QString test="['FFFF',"+time_stamp+",[1,10,1,10,1,10,1,10],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0]]";
  394. //QByteArray bytes = test.toUtf8();
  395. QByteArray bytes = test.toLatin1();
  396. socket->write(bytes);
  397. }