vehicle_control.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #include "vehicle_control.h"
  2. extern std::string gstrserverip;
  3. extern std::string gstrcontrolPort;
  4. extern std::string gstrcontrolInterval;
  5. extern std::string gstruploadMapInterval;
  6. extern std::string gstrid;
  7. extern std::string gstrplateNumber;
  8. extern uint8_t gShift_Status;//3 p 4 r 5 n 6 d
  9. namespace iv {
  10. struct msgunit
  11. {
  12. char mstrmsgname[256];
  13. int mnBufferSize = 10000;
  14. int mnBufferCount = 1;
  15. void * mpa;
  16. std::shared_ptr<char> mpstrmsgdata;
  17. int mndatasize = 0;
  18. bool mbRefresh = false;
  19. bool mbImportant = false;
  20. int mnkeeptime = 100;
  21. };
  22. }
  23. extern iv::msgunit shmRemoteCtrl;
  24. using org::jeecg::defsControl::grpc::Empty; ///< other message
  25. using org::jeecg::defsControl::grpc::GPSPoint;
  26. using org::jeecg::defsControl::grpc::MapPoint;
  27. using org::jeecg::defsControl::grpc::CtrlMode; ///< other enum
  28. using org::jeecg::defsControl::grpc::ShiftStatus;
  29. VehicleControlClient::VehicleControlClient(std::shared_ptr<Channel> channel)
  30. {
  31. stub_ = VehicleControl::NewStub(channel);
  32. shmRemoteCtrl.mpa = iv::modulecomm::RegisterSend(shmRemoteCtrl.mstrmsgname,shmRemoteCtrl.mnBufferSize,shmRemoteCtrl.mnBufferCount);
  33. }
  34. VehicleControlClient::~VehicleControlClient(void)
  35. {
  36. }
  37. std::string VehicleControlClient::vehicleControl(void)
  38. {
  39. // Data we are sending to the server.
  40. Empty request;
  41. request.set_id(gstrid);
  42. // Container for the data we expect from the server.
  43. ControlReply reply;
  44. // Context for the client. It could be used to convey extra information to
  45. // the server and/or tweak certain RPC behaviors.
  46. ClientContext context;
  47. gpr_timespec timespec;
  48. timespec.tv_sec = 1;
  49. timespec.tv_nsec = 0;
  50. timespec.clock_type = GPR_TIMESPAN;
  51. context.set_deadline(timespec);
  52. // The actual RPC.
  53. Status status = stub_ -> vehicleControl(&context,request,&reply);
  54. // Act upon its status.
  55. if (status.ok()) {
  56. if(reply.id() == gstrid)
  57. {
  58. shiftCMD = reply.shiftcmd();
  59. steeringWheelAngleCMD = reply.steeringwheelanglecmd();
  60. throttleCMD = reply.throttlecmd();
  61. std::cout<<"throttle:"<<reply.throttlecmd()<<std::endl;
  62. brakeCMD = reply.brakecmd();
  63. }
  64. else
  65. {
  66. // std::cout<<"id:"<<reply.id()<<std::endl;
  67. // if(throttleCMD > 0)throttleCMD -= 1.5;
  68. // if(throttleCMD <= 0)throttleCMD = 0;
  69. // if(brakeCMD > 0)brakeCMD -= 1.5;
  70. // if(brakeCMD <= 0)brakeCMD = 0;
  71. }
  72. return "vehicleControl RPC successed";
  73. } else {
  74. std::cout << status.error_code() << ": " << status.error_message()
  75. << std::endl;
  76. if(status.error_code() == 4)
  77. {
  78. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  79. }
  80. return "vehicleControl RPC failed";
  81. }
  82. }
  83. void VehicleControlClient::updateControlData(void)
  84. {
  85. #if 0
  86. std::cout<<"shift:"<<shiftCMD<<std::endl;
  87. std::cout<<"steeringWheelAngle:"<<steeringWheelAngleCMD<<std::endl;
  88. std::cout<<"throttle:"<<throttleCMD<<std::endl;
  89. std::cout<<"brake:"<<brakeCMD<<std::endl;
  90. #endif
  91. // std::cout<<"\n"<<"shift:"<<shiftCMD<<std::endl;
  92. // std::cout<<"steeringWheelAngle:"<<steeringWheelAngleCMD<<std::endl;
  93. // std::cout<<"throttle:"<<throttleCMD<<std::endl;
  94. // std::cout<<"brake:"<<brakeCMD<<"\n"<<std::endl;
  95. gShift_Status = shiftCMD;
  96. iv::remotectrl xmsg;
  97. if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
  98. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_REMOTE);
  99. else if(modeCMD == CtrlMode::CMD_AUTO)
  100. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_AUTO);
  101. else if(modeCMD == CtrlMode::CMD_EMERGENCY_STOP)
  102. xmsg.set_ntype(iv::remotectrl::CtrlType::remotectrl_CtrlType_STOP);
  103. if(modeCMD == CtrlMode::CMD_REMOTE || modeCMD == CtrlMode::CMD_CLOUD_PLATFORM)
  104. {
  105. xmsg.set_acc(throttleCMD);
  106. xmsg.set_brake(brakeCMD);
  107. xmsg.set_wheel((-1)*steeringWheelAngleCMD/5.5f);
  108. if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_DRIVE)
  109. xmsg.set_shift(1);
  110. else if(shiftCMD == org::jeecg::defsControl::grpc::ShiftStatus::SHIFT_REVERSE)
  111. xmsg.set_shift(-1);
  112. else
  113. xmsg.set_shift(0);
  114. }
  115. else if(modeCMD == CtrlMode::CMD_AUTO)
  116. {
  117. xmsg.set_acc(0.0);
  118. xmsg.set_brake(0.0);
  119. xmsg.set_wheel(0.0);
  120. xmsg.set_shift(0);
  121. }
  122. else
  123. {
  124. xmsg.set_acc(0.0);
  125. xmsg.set_brake(100.0);
  126. xmsg.set_wheel(0.0);
  127. xmsg.set_shift(0);
  128. }
  129. int ndatasize = xmsg.ByteSize();
  130. char * str = new char[ndatasize];
  131. std::shared_ptr<char> pstr;pstr.reset(str);
  132. if(!xmsg.SerializeToArray(str,ndatasize))
  133. {
  134. std::cout<<"MainWindow::on_horizontalSlider_valueChanged serialize error."<<std::endl;
  135. return;
  136. }
  137. iv::modulecomm::ModuleSendMsg(shmRemoteCtrl.mpa,str,ndatasize);
  138. }
  139. void VehicleControlClient::run()
  140. {
  141. QTime xTime;
  142. xTime.start();
  143. uint64_t lastTime = xTime.elapsed();
  144. uint64_t interval = std::atoi(gstrcontrolInterval.c_str());
  145. while (true)
  146. {
  147. if((xTime.elapsed() - lastTime)>=interval)
  148. {
  149. std::string reply = vehicleControl();
  150. std::cout<< reply <<std::endl;
  151. updateControlData();
  152. lastTime = xTime.elapsed();
  153. }
  154. }
  155. }
  156. void VehicleControlClient::ctrlMode_Changed_Slot(org::jeecg::defsControl::grpc::CtrlMode ctrlMode)
  157. {
  158. modeCMD = ctrlMode;
  159. }
  160. VehicleChangeCtrlModeClient::VehicleChangeCtrlModeClient(std::shared_ptr<Channel> channel)
  161. {
  162. stub_ = VehicleControl::NewStub(channel);
  163. }
  164. VehicleChangeCtrlModeClient::~VehicleChangeCtrlModeClient(void)
  165. {
  166. }
  167. std::string VehicleChangeCtrlModeClient::changeCtrlMode(void)
  168. {
  169. // Data we are sending to the server.
  170. Empty request;
  171. request.set_id(gstrid);
  172. // Container for the data we expect from the server.
  173. CtrlModeReply reply;
  174. // Context for the client. It could be used to convey extra information to
  175. // the server and/or tweastd::cout<<"shift:"<<shiftCMD<<std::endl;k certain RPC behaviors.
  176. ClientContext context;
  177. gpr_timespec timespec;
  178. timespec.tv_sec = 1;
  179. timespec.tv_nsec = 0;
  180. timespec.clock_type = GPR_TIMESPAN;
  181. context.set_deadline(timespec);
  182. // The actual RPC.
  183. Status status = stub_ -> changeCtrlMode(&context,request,&reply);
  184. // Act upon its status.
  185. if (status.ok()) {
  186. if(reply.id() == gstrid)
  187. {
  188. modeCMD = reply.modecmd();
  189. }
  190. return "changeCtrlMode RPC successed";
  191. } else {
  192. std::cout << status.error_code() << ": " << status.error_message()
  193. << std::endl;
  194. if(status.error_code() == 4)
  195. {
  196. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  197. }
  198. return "changeCtrlMode RPC failed";
  199. }
  200. }
  201. void VehicleChangeCtrlModeClient::updateCtrolMode(void)
  202. {
  203. // std::cout<<"modeCMD:"<<modeCMD<<std::endl;
  204. emit ctrlMode_Changed(modeCMD);
  205. }
  206. void VehicleChangeCtrlModeClient::run()
  207. {
  208. QTime xTime;
  209. xTime.start();
  210. uint64_t lastTime = xTime.elapsed();
  211. uint64_t interval = std::atoi(gstrcontrolInterval.c_str());
  212. while (true)
  213. {
  214. if((xTime.elapsed() - lastTime)>=interval)
  215. {
  216. std::string reply = changeCtrlMode();
  217. std::cout<< reply <<std::endl;
  218. updateCtrolMode();
  219. lastTime = xTime.elapsed();
  220. }
  221. }
  222. }
  223. VehicleUploadMapClient::VehicleUploadMapClient(std::shared_ptr<Channel> channel)
  224. {
  225. stub_ = VehicleControl::NewStub(channel);
  226. }
  227. VehicleUploadMapClient::~VehicleUploadMapClient(void)
  228. {
  229. }
  230. std::string VehicleUploadMapClient::uploadMap(void)
  231. {
  232. // Data we are sending to the server.
  233. Empty request;
  234. request.set_id(gstrid);
  235. // Container for the data we expect from the server.
  236. UploadMapReply reply;
  237. // Context for the client. It could be used to convey extra information to
  238. // the server and/or tweak certain RPC behaviors.
  239. ClientContext context;
  240. gpr_timespec timespec;
  241. timespec.tv_sec = 2;
  242. timespec.tv_nsec = 0;
  243. timespec.clock_type = GPR_TIMESPAN;
  244. context.set_deadline(timespec);
  245. // The actual RPC.
  246. Status status = stub_ -> UploadMap(&context,request,&reply);
  247. // Act upon its status.
  248. if (status.ok()) {
  249. if(reply.id() == gstrid)
  250. {
  251. // std::cout<<reply.id()<<std::endl;
  252. isNeedMap = false;
  253. patrolPathID = "noPath";
  254. POIPoints.clear();
  255. isNeedMap = reply.isneedmap();
  256. // std::cout<<reply.isneedmap()<<std::endl;
  257. patrolPathID = reply.patrolpathid();
  258. // std::cout<<reply.patrolpathid()<<std::endl;
  259. for(int i = 0;i < reply.mappoints_size();i++)
  260. {
  261. POIPoints.append(reply.mappoints(i));
  262. // std::cout<<reply.mappoints(i).index()<<std::endl;
  263. }
  264. }
  265. return "UploadMap RPC successed";
  266. } else {
  267. std::cout << status.error_code() << ": " << status.error_message()
  268. << std::endl;
  269. if(status.error_code() == 4)
  270. {
  271. std::cout << "vehicleControl RPC connect timeout" << std::endl;
  272. }
  273. return "UploadMap RPC failed";
  274. }
  275. }
  276. void VehicleUploadMapClient::updateMapPOIData(void)
  277. {
  278. std::cout<<"isNeedMap:"<<isNeedMap<<std::endl;
  279. std::cout<<"patrolPathID:"<<patrolPathID<<std::endl;
  280. emit patrolPOI_Recieved(patrolPathID);
  281. }
  282. void VehicleUploadMapClient::run()
  283. {
  284. QTime xTime;
  285. xTime.start();
  286. uint64_t lastTime = xTime.elapsed();
  287. uint64_t interval = std::atoi(gstrcontrolInterval.c_str());
  288. while (true)
  289. {
  290. if((xTime.elapsed() - lastTime)>=interval)
  291. {
  292. if(isNeedMap == false)
  293. {
  294. std::string reply = uploadMap();
  295. // std::cout<< reply <<std::endl;
  296. if(isNeedMap == true)
  297. {
  298. updateMapPOIData();
  299. }
  300. }
  301. lastTime = xTime.elapsed();
  302. }
  303. }
  304. }
  305. void VehicleUploadMapClient::uploadPath_Finished_Slot(std::string pathID)
  306. {
  307. std::cout<<"Path ID:"<<pathID<<" upload finished"<<std::endl;
  308. if(isNeedMap == true)
  309. {
  310. isNeedMap = false;
  311. }
  312. }