123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- #include "decodechassis.h"
- #include <iostream>
- #include "ivlog.h"
- #include "ivfault.h"
- iv::Ivlog * mygivlog;
- iv::Ivfault * mygivfault;
- /**
- * @brief ShareChassis
- * Share Chassis State
- * @param pa pointer to module communication handle
- * @param pchassis pointer to chassis state
- **/
- static void ShareChassis(void * pa,iv::chassis * pchassis)
- {
- char * str;
- int ndatasize = pchassis->ByteSize();
- str = new char[ndatasize];
- std::shared_ptr<char> pstr;
- pstr.reset(str);
- if(!pchassis->SerializeToArray(str,ndatasize))
- {
- std::cout<<"ShareChassis Error."<<std::endl;
- return;
- }
- iv::modulecomm::ModuleSendMsg(pa,str,ndatasize);
- }
- /**
- * @brief ProcGE3Chassis
- * Process GE3 Chassis State
- * @param pa pointer to module communication handle
- * @param pmsg pointer to CAN Message
- * @retval 0 No Chassis Message 1 Have Chassis Message And Update
- **/
- int ProcGE3Chassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- // mygivlog = new iv::Ivlog("chassis");
- // mygivfault = new iv::Ivfault("chassis");
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- if(praw->id() == 0x13)
- {
- std::cout<<"receive chassis."<<std::endl;
- memcpy(data,praw->data().data(),8);
- unsigned char EPSMode,EPBFault,DriveMode,Shift,AEBAvailable,CDDAvailable;
- unsigned short angle_feedback;
- EPSMode = (data[1] & 0x60)>>5; //EPS_mode,00:失效;01:人工;10自动
- EPBFault = (data[1] & 0x10)>>4; //EPB故障状态,0:无故障 1:故障
- DriveMode = (data[1] & 0x0C)>>2; //驾驶模式,1:Manual 3:Auto
- Shift = data[1] & 0x03; //Gear,00N,01D,10R,11p
- angle_feedback = data[2] * 256 + data[3];
- angle_feedback = angle_feedback * 0.1 - 780;
- //制动的两个状态为反馈,AEBAvailable 和CDDAvailable,这两个都为1的时候制动有效,有一个为0,制动失效
- AEBAvailable = data[4] & 0x01; //0=Not available,1=Available
- CDDAvailable = (data[4] & 0x02) >> 1; //0=Not available,1=Available
- iv::chassis xchassis;
- //xchassis.set_epsmode(EPSMode);
- if(EPSMode == 0)
- {
- std::cout<<"eps mode"<<std::endl;
- // mygivlog->warn("chassis"," Warning!! NOW GE3 chassis triggers a epsmode!!");
- }
- if(EPSMode == 1)
- {
- // mygivlog->info("chassis","OK!! NOW GE3 chassis epsmode is Manual!");
- }
- if(EPSMode == 2)
- {
- // mygivlog->info("chassis","OK!! NOW GE3 chassis epsmode is Auto!");
- }
- // xchassis.set_epsmode(2);//为了不退出自动驾驶,经讨论,在这个地方写定值。
- xchassis.set_epsmode(EPSMode);
- xchassis.set_epbfault(EPBFault);
- xchassis.set_drivemode(DriveMode);
- xchassis.set_shift(Shift);
- xchassis.set_aebavailable(AEBAvailable);
- xchassis.set_cddavailable(CDDAvailable);
- xchassis.set_angle_feedback(angle_feedback);
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- //struct Command_Response_Bit_0x14
- //{
- // unsigned char feedback_angle_H;
- // unsigned char feedback_angle_L;
- // unsigned char feedback_angle_speed;
- // unsigned char feedback_torque;
- // unsigned char feedback_speed_H;
- // unsigned char feedback_speed_L;
- // unsigned char feedback_battery_power;
- // unsigned char feedback_door_state:2;
- // unsigned char feedback_EPB_state:1;
- // unsigned char feedback_reserved:3;
- // unsigned char feedback_dangwei:2;
- //};
- //ServiceCarStatus.torque_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_torque;
- //ServiceCarStatus.dangwei_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_dangwei;
- //ServiceCarStatus.battery_st = ServiceControlStatus.command_reponse_0x14.bit.feedback_battery_power*0.4;
- //ServiceCarStatus.vehSpeed_st= (ServiceControlStatus.command_reponse_0x14.bit.feedback_speed_H*256+
- // ServiceControlStatus.command_reponse_0x14.bit.feedback_speed_L)*0.05625;
- int ProcPROBLUEChassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- if(praw->id() == 0x14)
- {
- memcpy(data,praw->data().data(),8);
- double torque,dangwei,soc,vehspeed;
- torque = data[3];
- dangwei = data[7]>>6;
- soc = data[6]; soc = soc *0.4;
- vehspeed = (data[4]*256.0 + data[5])*0.05625;
- iv::chassis xchassis;
- xchassis.set_torque(torque);
- xchassis.set_shift(dangwei);
- xchassis.set_soc(soc);
- xchassis.set_vel(vehspeed);
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- int ProcMIDCARChassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- if(praw->id() == 0x14)
- {
- memcpy(data,praw->data().data(),8);
- double torque,dangwei,soc,vehspeed;
- torque = data[3];
- dangwei = data[7]>>6;
- soc = data[6]; soc = soc *0.4;
- vehspeed = (data[4]*256.0 + data[5])*0.05625;
- iv::chassis xchassis;
- xchassis.set_torque(torque);
- xchassis.set_shift(dangwei);
- xchassis.set_soc(soc);
- xchassis.set_vel(vehspeed);
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- else if(praw->id() == 0xC2)
- {
- memcpy(data,praw->data().data(),8);
- float soc;
- soc = data[0];
- iv::chassis xchassis;
- xchassis.set_soc(soc);
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- int ProcVV7Chassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- if(praw->id() == 0x13)
- {
- memcpy(data,praw->data().data(),8);
- double engine_speed;
- engine_speed = (data[5]*256.0 + data[6])*0.125;
- iv::chassis xchassis;
- xchassis.set_engine_speed(engine_speed);
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- inline float gettwomotovalue(unsigned char * strdata,float fratio,float foff)
- {
- int a,b;
- a = strdata[0];
- b = strdata[1];
- float fvalue = a*256+ b;
- fvalue = fvalue * fratio + foff;
- return fvalue;
- }
- inline float getonevalue(unsigned char * strdata,float fratio,float foff)
- {
- int a;
- a = strdata[0];
- float fvalue = a;
- fvalue = fvalue * fratio + foff;
- // std::cout<<"hapo torque: "<<fvalue<<std::endl;
- return fvalue;
- }
- static bool ghave0x13= false;
- static bool ghave0x14= false;
- static bool ghave0x15= false;
- int ProcMIDBUSChassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- static iv::chassis xchassis;
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- memcpy(data,praw->data().data(),8);
- if(praw->id() == 0x13)
- {
- xchassis.set_angle_feedback(gettwomotovalue(data+0,0.1,-870));
- xchassis.set_torque(getonevalue(data+2,1.0,0));
- xchassis.set_brake_feedback(getonevalue(data+3,0.4,0));
- xchassis.set_vel(gettwomotovalue(data+4,0.05625,0));
- xchassis.set_epb_feedback(data[6]&0x03);
- xchassis.set_shift((data[6]&0xf0)>>4);
- xchassis.set_drivemode(data[7]&0x01);
- xchassis.set_emergencystop_feedback((data[7]&06)>>1);
- xchassis.set_brakelight_feedback((data[7]&0x08)>>3);
- ghave0x13 = true;
- }
- if(praw->id() == 0x14)
- {
- xchassis.set_range_feedback(data[0]);
- xchassis.set_soc(getonevalue(data+1,0.4,0));
- xchassis.set_drivectrltype_feedback(data[5]&0x0f);
- xchassis.set_brakectrltype_feedback((data[5]&0xf0)>>4);
- xchassis.set_epsctrltype_feedback(data[6]&0x0f);
- ghave0x14 = true;
- }
- if(praw->id() == 0x15)
- {
- xchassis.set_frontleftwheel_feedback(gettwomotovalue(data,0.05625,0));
- xchassis.set_frontrightwheel_feedback(gettwomotovalue(data+2,0.05625,0));
- xchassis.set_rearleftwheel_feedback(gettwomotovalue(data+4,0.05625,0));
- xchassis.set_rearrightwheel_feedback(gettwomotovalue(data+6,0.05625,0));
- ghave0x15 = true;
- }
- if(ghave0x13&&ghave0x14&&ghave0x15)
- {
- ghave0x13 = false;
- ghave0x14 = false;
- ghave0x15 = false;
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- int ProcHAPOChassis(void * pa, iv::can::canmsg * pmsg)
- {
- int i;
- int nRtn = 0;
- static iv::chassis xchassis;
- for(i=0;i<pmsg->rawmsg_size();i++)
- {
- const iv::can::canraw * praw = &(pmsg->rawmsg(i));
- unsigned char data[8];
- memcpy(data,praw->data().data(),8);
- if(praw->id() == 0x13)
- {
- xchassis.set_angle_feedback(gettwomotovalue(data+0,0.1,-870));
- xchassis.set_torque(getonevalue(data+2,0.4,0));
- xchassis.set_brake_feedback(getonevalue(data+3,0.4,0));
- xchassis.set_vel(gettwomotovalue(data+4,0.05625,0));
- xchassis.set_epb_feedback(data[6]&0x03);
- xchassis.set_shift((data[6]&0xf0)>>4);
- xchassis.set_drivemode(data[7]&0x01);
- xchassis.set_emergencystop_feedback((data[7]&06)>>1);
- xchassis.set_brakelight_feedback((data[7]&0x08)>>3);
- std::cout<<"torque is "<<xchassis.torque()<<std::endl;
- ghave0x13 = true;
- }
- if(praw->id() == 0x14)
- {
- xchassis.set_range_feedback(data[0]);
- xchassis.set_soc(getonevalue(data+1,0.4,0));
- xchassis.set_drivectrltype_feedback(data[5]&0x0f);
- xchassis.set_brakectrltype_feedback((data[5]&0xf0)>>4);
- xchassis.set_epsctrltype_feedback(data[6]&0x0f);
- ghave0x14 = true;
- }
- if(praw->id() == 0x15)
- {
- xchassis.set_frontleftwheel_feedback(gettwomotovalue(data,0.05625,0));
- xchassis.set_frontrightwheel_feedback(gettwomotovalue(data+2,0.05625,0));
- xchassis.set_rearleftwheel_feedback(gettwomotovalue(data+4,0.05625,0));
- xchassis.set_rearrightwheel_feedback(gettwomotovalue(data+6,0.05625,0));
- ghave0x15 = true;
- }
- if(ghave0x13&&ghave0x14&&ghave0x15)
- {
- ghave0x13 = false;
- ghave0x14 = false;
- ghave0x15 = false;
- ShareChassis(pa,&xchassis);
- nRtn = 1;
- }
- }
- return nRtn;
- }
- int ProcYUHESENChassis(void * pa, iv::can::canmsg * pmsg)
- {
- (void)pa;
- (void)pmsg;
- // int i;
- int nRtn = 0;
- return nRtn;
- }
|