robot_sensor.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. #include <stdint.h>
  2. #include "../common/comm.h"
  3. #include "../common/iobuffer.h"
  4. #include "../common/sensor_socket.h"
  5. #include "protocol.pb.h"
  6. #include "robot_sensor.h"
  7. #include "message_queue.h"
  8. #include "Rtk.h"
  9. #include <thread>
  10. #include <math.h>
  11. struct can_array
  12. {
  13. int32_t count;
  14. cannet_frame frames[1];
  15. };
  16. #pragma pack()
  17. uint8_t HIBYTE(int16_t value)
  18. {
  19. return (uint8_t)((value>>8)&0xFF);
  20. }
  21. uint8_t LOBYTE(int16_t value)
  22. {
  23. return (uint8_t)((value)&0xFF);
  24. }
  25. int16_t make_int16(int8_t h,int8_t l)
  26. {
  27. int16_t hi=(int16_t)(h&0x00FF);
  28. int16_t low= (int16_t)(l&0x00FF);
  29. return (hi<<8)|low;
  30. }
  31. float b2f(uint8_t m0, uint8_t m1, uint8_t m2, uint8_t m3)
  32. {
  33. //求符号位
  34. float sig = 1.;
  35. if (m0 >=128.)
  36. sig = -1.;
  37. //求阶码
  38. float jie = 0.;
  39. if (m0 >=128.)
  40. {
  41. jie = m0-128. ;
  42. }
  43. else
  44. {
  45. jie = m0;
  46. }
  47. jie = jie * 2.;
  48. if (m1 >=128.)
  49. jie += 1.;
  50. jie -= 127.;
  51. //求尾码
  52. float tail = 0.;
  53. if (m1 >=128.)
  54. m1 -= 128.;
  55. tail = m3 + (m2 + m1 * 256.) * 256.;
  56. tail = (tail)/8388608; // 8388608 = 2^23
  57. float f = sig * pow(2., jie) * (1+tail);
  58. return f;
  59. }
  60. CRobotSensor::CRobotSensor(CMessageQueue * q):_message(q)
  61. {
  62. for (int32_t i = 0; i < 4; i++)
  63. memset(&_msg[i], 0, sizeof(TPCANMsg));
  64. }
  65. void CRobotSensor::Start()
  66. {
  67. _message->btimeStopedCar = false;
  68. _run = true;
  69. //_can_thread = std::thread(&CRobotSensor::CanSendProc, this);
  70. }
  71. void CRobotSensor::Stop()
  72. {
  73. /*_run = false;
  74. auto tn = _can_thread.native_handle();
  75. if(tn != 0)
  76. _can_thread.join();*/
  77. if (_run)
  78. {
  79. _run = false;
  80. //_can_thread.join();
  81. }
  82. for (int32_t i = 0; i < 4; i++)
  83. memset(&_msg[i], 0, sizeof(TPCANMsg));
  84. }
  85. void CRobotSensor::SendStatusToMSG()
  86. {
  87. RemoNet::State req;
  88. /*
  89. req.set_engine_speed(_data.Engine_speed);
  90. req.set_travel_speed(_data.Travel_speed);
  91. req.set_fuel_level(_data.Fuel_level);
  92. req.set_engine_temperature(_data.Engine_temperature);
  93. req.set_hydraulic_oil_temperature(_data.Hydraulic_oil_temperature);
  94. req.set_main_pump_1_pressure(_data.Main_pump_1_pressure);
  95. req.set_main_pump_2_pressure(_data.Main_pump_2_pressure);
  96. req.set_hand_gear(_data.Hand_gear);
  97. req.set_actual_gear(_data.Actual_gear);
  98. req.set_gripper_height(_data.Gripper_height);
  99. req.set_amplitude(_data.amplitude);
  100. req.set_boom_angle(_data.Boom_angle);
  101. req.set_stick_angle(_data.Stick_angle);
  102. req.set_idle_protection(_data.Idle_protection);
  103. req.set_front_toggle(_data.Front_toggle);
  104. req.set_back_toggle(_data.Back_toggle);
  105. */
  106. //std::string s;
  107. //s.assign((char*)_data.Error_Buff);
  108. //req.set_error_buff(s.c_str());
  109. req.set_error_buff((char *)_data.Error_Buff,8);
  110. //req.set_error_buff(s,s.size());
  111. /*
  112. req.set_low_oil_pressure(_data.Low_oil_pressure);
  113. req.set_low_coolant_level(_data.Low_coolant_level);
  114. req.set_high_coolant_level(_data.High_coolant_level);
  115. req.set_hydraulic_oil_temperature_high(_data.hydraulic_oil_temperature_high);
  116. req.set_hydraulic_oil_temperature_low(_data.hydraulic_oil_temperature_low);
  117. req.set_accumulator_pressure_abnormal(_data.accumulator_pressure_abnormal);
  118. req.set_engine_spn_failure(_data.Engine_SPN_failure);
  119. req.set_engine_warming_up(_data.engine_warming_up);
  120. req.set_engine_warming_up_timeout(_data.engine_warming_up_timeout);
  121. req.set_low_battery_voltage(_data.Low_battery_voltage);
  122. req.set_high_battery_voltage(_data.High_battery_voltage);
  123. req.set_system_overloaded(_data.system_overloaded);
  124. */
  125. MessageHead Head;
  126. CIOBuffer pBuffer;
  127. Head.Command = RemoNet::CC_STATE;
  128. Head.Length = req.ByteSizeLong();
  129. Head.Serialize(pBuffer.Buffer);
  130. auto ptr = pBuffer.Buffer + MessageHead::Size();
  131. req.SerializeToArray(ptr, Head.Length);
  132. pBuffer.Length = MessageHead::Size() + Head.Length;
  133. _message->WritePacket(ChannelType::CHANNEL_CAR, pBuffer);
  134. }
  135. void CRobotSensor::CanSendProc()
  136. {
  137. while (_run)
  138. {
  139. ////volatile int64_t tick = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  140. ////if (tick - _last_can_uptime < 50)
  141. {
  142. std::lock_guard<std::mutex> lg(_last_can_lock);
  143. for (int32_t i = 0; i < sizeof(_msg) / sizeof(TPCANMsg); i++)
  144. {
  145. if (_msg[i].ID != 0)
  146. {
  147. _socket->Write(&_msg[i]);
  148. if((_msg[i].ID == 0x182) && (_msg[i].DATA[0] != 0))
  149. std::cout << "182" << _msg[i].DATA[0] << _msg[i].DATA[1] << std::endl;
  150. }
  151. }
  152. }
  153. std::this_thread::sleep_for(std::chrono::milliseconds(20));
  154. }
  155. }
  156. void CRobotSensor::Notify(TPCANMsg *buffer, int32_t size)
  157. {
  158. //cannet_frame_receive* Source_data = reinterpret_cast<cannet_frame_receive*>(buffer);
  159. //std::cout << std::hex << Source_data->canid << std::endl;
  160. if(_run)
  161. {
  162. /*
  163. switch (buffer->ID)
  164. {
  165. case 0x283:
  166. _data.Main_pump_1_pressure = make_int16(buffer->DATA[1],buffer->DATA[0]);//主泵1压力
  167. _data.Main_pump_2_pressure = make_int16(buffer->DATA[3],buffer->DATA[2]);//主泵2压力
  168. break;
  169. case 0x285:
  170. _data.Stick_angle = make_int16(buffer->DATA[1],buffer->DATA[0]);//斗杆角度
  171. _data.Boom_angle = make_int16(buffer->DATA[3],buffer->DATA[2]);//动臂角度
  172. break;
  173. case 0x286:
  174. _data.Hydraulic_oil_temperature = make_int16(buffer->DATA[1],buffer->DATA[0]);//液压油油温
  175. _data.Fuel_level = (int32_t)buffer->DATA[6];//燃油油位
  176. break;
  177. case 0x28A:
  178. _data.Travel_speed = make_int16(buffer->DATA[1],buffer->DATA[0]);//行驶速度
  179. _data.Engine_temperature = make_int16(buffer->DATA[3],buffer->DATA[2]);//发动机水温
  180. _data.Hand_gear = make_int16(buffer->DATA[5],buffer->DATA[4]);//水箱水位
  181. _data.Actual_gear = make_int16(buffer->DATA[7],buffer->DATA[6]);//发动机机油压力
  182. break;
  183. case 0x28B:
  184. _data.Engine_speed = make_int16(buffer->DATA[1],buffer->DATA[0]);//发动机转速
  185. if(_data.Engine_speed > 700 && _message->bStopedCar)
  186. _message->bStopedCar = false;
  187. break;
  188. case 0x28D:
  189. _data.Gripper_height = b2f(buffer->DATA[3], buffer->DATA[2], buffer->DATA[1],
  190. buffer->DATA[0]);//抓具高度
  191. _data.amplitude = b2f(buffer->DATA[7], buffer->DATA[6], buffer->DATA[5],
  192. buffer->DATA[4]);//幅度
  193. break;
  194. case 0x28F:
  195. _data.Idle_protection = (buffer->DATA[3] & 0x80) == 0x80 ? 1 : 0;//怠速保护
  196. _data.Front_toggle = (buffer->DATA[1] & 0x08) == 0x08 ? 1 : 0;//前轮对中
  197. _data.Back_toggle = (buffer->DATA[1] & 0x10) == 0x10 ? 1 : 0;//后轮对中
  198. break;
  199. case 0x280:
  200. memcpy(_data.Error_Buff,buffer->DATA,buffer->LEN);
  201. SendStatusToMSG();
  202. break;
  203. default:
  204. break;
  205. }
  206. */
  207. }
  208. /*
  209. can_array* data = reinterpret_cast<can_array*>(buffer);
  210. for (auto i = 0; i < data->count; i++)
  211. {
  212. // TPCANMsg msg;
  213. cannet_frame& frame = data->frames[i];
  214. if (frame.canid == 0x386)
  215. {
  216. RemoNet::State req;
  217. req.set_engine_speed(_data.Engine_speed);
  218. req.set_travel_speed(_data.Travel_speed);
  219. req.set_fuel_level(_data.Fuel_level);
  220. req.set_engine_temperature(_data.Engine_temperature);
  221. req.set_hydraulic_oil_temperature(_data.Hydraulic_oil_temperature);
  222. req.set_main_pump_1_pressure(_data.Main_pump_1_pressure);
  223. req.set_main_pump_2_pressure(_data.Main_pump_2_pressure);
  224. req.set_hand_gear(_data.Hand_gear);
  225. req.set_actual_gear(_data.Actual_gear);
  226. req.set_gripper_height(_data.Gripper_height);
  227. req.set_amplitude(_data.amplitude);
  228. req.set_boom_angle(_data.Boom_angle);
  229. req.set_stick_angle(_data.Stick_angle);
  230. req.set_can_communication_alarm(_data.Can_Communication_alarm);
  231. req.set_low_oil_pressure(_data.Low_oil_pressure);
  232. req.set_low_coolant_level(_data.Low_coolant_level);
  233. req.set_high_coolant_level(_data.High_coolant_level);
  234. req.set_hydraulic_oil_temperature_high(_data.hydraulic_oil_temperature_high);
  235. req.set_hydraulic_oil_temperature_low(_data.hydraulic_oil_temperature_low);
  236. req.set_accumulator_pressure_abnormal(_data.accumulator_pressure_abnormal);
  237. req.set_engine_spn_failure(_data.Engine_SPN_failure);
  238. req.set_engine_warming_up(_data.engine_warming_up);
  239. req.set_engine_warming_up_timeout(_data.engine_warming_up_timeout);
  240. req.set_low_battery_voltage(_data.Low_battery_voltage);
  241. req.set_high_battery_voltage(_data.High_battery_voltage);
  242. req.set_system_overloaded(_data.system_overloaded);
  243. req.set_idle_protection(_data.Idle_protection);
  244. MessageHead Head;
  245. CIOBuffer pBuffer;
  246. Head.Command = RemoNet::CC_STATE;
  247. Head.Length = req.ByteSizeLong();
  248. Head.Serialize(pBuffer.Buffer);
  249. auto ptr = pBuffer.Buffer + MessageHead::Size();
  250. req.SerializeToArray(ptr, Head.Length);
  251. pBuffer.Length = MessageHead::Size() + Head.Length;
  252. _message->WritePacket(ChannelType::CHANNEL_CAR, &pBuffer);
  253. }
  254. }
  255. */
  256. }
  257. void CRobotSensor::OnMessage(cannet_frame* frames, int32_t count)
  258. {
  259. //std::lock_guard<std::mutex> lg(_last_can_lock);
  260. //_last_can_uptime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  261. for (int32_t i = 0; i < count; i++)
  262. {
  263. cannet_frame& frame = frames[i];
  264. // TPCANMsg msg;
  265. // msg.LEN=frame.dlc;
  266. // msg.MSGTYPE=PCAN_MESSAGE_STANDARD;
  267. int32_t canid = frame.canid;
  268. //std::cout << std::hex << canid << std::endl;
  269. switch (canid)
  270. {
  271. case 0x181:
  272. _msg[0].ID = 0x181;
  273. _msg[0].LEN = frame.dlc;
  274. _msg[0].MSGTYPE = PCAN_MESSAGE_STANDARD;
  275. memcpy(_msg[0].DATA, frame.data, frame.dlc);
  276. _socket->Write(&_msg[0]);
  277. //std::cout << "revice 181" << std::endl;
  278. break;
  279. case 0x182:
  280. _msg[1].ID = 0x182;
  281. _msg[1].LEN = frame.dlc;
  282. _msg[1].MSGTYPE = PCAN_MESSAGE_STANDARD;
  283. memcpy(_msg[1].DATA, frame.data, frame.dlc);
  284. _socket->Write(&_msg[1]);
  285. //if(_msg[1].DATA[0] != 0)
  286. // std::cout << "182" << _msg[i].DATA[0] << _msg[i].DATA[1] << std::endl;
  287. break;
  288. case 0x183:
  289. _msg[2].ID = 0x183;
  290. _msg[2].LEN = frame.dlc;
  291. _msg[2].MSGTYPE = PCAN_MESSAGE_STANDARD;
  292. memcpy(_msg[2].DATA, frame.data, frame.dlc);
  293. _socket->Write(&_msg[2]);
  294. //std::cout << "revice 183" << std::endl;
  295. break;
  296. case 0x184:
  297. _msg[3].ID = 0x184;
  298. _msg[3].LEN = frame.dlc;
  299. _msg[3].MSGTYPE = PCAN_MESSAGE_STANDARD;
  300. //模式
  301. model = (_msg[3].DATA[3] & 0x04) == 0x04 ? 1 : 0;
  302. //切换前后摄像头
  303. _front_view = (_msg[3].DATA[4] & 0x04) == 0x04 ? false: true;
  304. _message->SwitchCamera(_front_view);
  305. //b_ready = (_msg[3].DATA[4] & 0x10) == 0x10 ? 1 : 0;
  306. if((_msg[3].DATA[4] & 0x10) == 0x10 ? 1 : 0)//已就绪 抓钢机就绪状态,待无人车入场
  307. {
  308. _message->SendZGJStatus(1);
  309. std::cout << "SendZGJStatus" << std::endl;
  310. //_msg[3].DATA[4] &= 0xEF;
  311. }
  312. //b_over = (_msg[3].DATA[4] & 0x20) == 0x20 ? 1 : 0;
  313. if((_msg[3].DATA[4] & 0x20) == 0x20 ? 1 : 0)//已完成 抓钢机抓钢结束,待无人车离场
  314. {
  315. _message->SendZGJStatus(2);
  316. //_msg[3].DATA[4] &= 0xD7;
  317. }
  318. if(!_message->btimeStopedCar)
  319. {
  320. memcpy(_msg[3].DATA, frame.data, frame.dlc);
  321. }
  322. else
  323. {
  324. long long tick=std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  325. if(tick-_message->_curStopTick > 500)
  326. {
  327. Emergency();
  328. _message->btimeStopedCar = false;
  329. }
  330. }
  331. _socket->Write(&_msg[3]);
  332. //std::cout << "revice 184" << std::endl;
  333. //_last_can_uptime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  334. break;
  335. }
  336. }
  337. }
  338. unsigned int CRobotSensor:: CRC16(uint8_t *buf, int len)
  339. {
  340. unsigned int crc = 0xFFFF;
  341. for (int pos = 0; pos < len; pos++)
  342. {
  343. crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc
  344. for (int i = 8; i != 0; i--)
  345. { // Loop over each bit
  346. if ((crc & 0x0001) != 0)
  347. { // If the LSB is set
  348. crc >>= 1; // Shift right and XOR 0xA001
  349. crc ^= 0xA001;
  350. }
  351. else // Else LSB is not set
  352. crc >>= 1; // Just shift right
  353. }
  354. }
  355. return crc;
  356. }
  357. bool CRobotSensor::Emergency()
  358. {
  359. if(model)
  360. {
  361. _msg[3].ID = 0x184;
  362. _msg[3].LEN = 8;
  363. _msg[3].MSGTYPE = PCAN_MESSAGE_STANDARD;
  364. _msg[3].DATA[3] &= 0xFD;
  365. _socket->Write(&_msg[3]);
  366. }
  367. return false;
  368. }
  369. void CRobotSensor::OnPark(bool on)
  370. {
  371. if(model)
  372. {
  373. _msg[0].ID = 0x181;
  374. _msg[0].LEN = 8;
  375. _msg[0].MSGTYPE = PCAN_MESSAGE_STANDARD;
  376. _msg[0].DATA[4] = 0x13;
  377. _msg[0].DATA[5] = 0x88;
  378. }
  379. }
  380. void CRobotSensor::Run()
  381. {
  382. }
  383. void CRobotSensor::SetSensorSocket(SensorPeakCan<CRobotSensor>* can)
  384. {
  385. _socket=can;
  386. }