#include #include #include #include "control/control_status.h" #include "control/controller.h" #include "xmlparam.h" #include "modulecomm.h" #include "ivbacktrace.h" #include "ivversion.h" #include "canmsg.pb.h" #include "decition.pb.h" #include "chassis.pb.h" #include "torquebrake.h" #include void * gpacansend; void * gpadecition; void * gpachassis; std::string gstrmemdecition; std::string gstrmemcansend; std::string gstrmemchassis; bool gbSendRun = true; bool gbChassisEPS = false; iv::brain::decition gdecition_def; iv::brain::decition gdecition; QTime gTime; int gnLastSendTime = 0; int gnLastRecvDecTime = -1000; int gnDecitionNum = 0; //when is zero,send default; const int gnDecitionNumMax = 100; int gnIndex = 0; static bool gbHaveVehSpd = false; static double gfVehSpd = 0.0; boost::shared_ptr gcontroller; //实际车辆控制器 static QMutex gMutex; // signal: @ACC_LatAngReq //更改CANid #define ECU_1C4_ACC_LatAngReq_CovFactor (0.1) // conversion value to CAN signal #define ECU_1C4_ACC_LatAngReq_toS(x) ((int16_t)((x) / 0.1 + 7200)) // signal: @ACC_MotorTorqueMaxLimitRequest #define ECU_1C4_ACC_MotorTorqueMaxLimitRequest_CovFactor (0.02) // conversion value to CAN signal #define ECU_1C4_ACC_MotorTorqueMaxLimitRequest_toS(x) ((int16_t)((x) / 0.02 + 1024)) // signal: @ACC_MotorTorqueMinLimitRequest #define ECU_1C4_ACC_MotorTorqueMinLimitRequest_CovFactor (0.02) // conversion value to CAN signal #define ECU_1C4_ACC_MotorTorqueMinLimitRequest_toS(x) ((int16_t)((x) / 0.02 + 1024)) typedef struct { int16_t ACC_LatAngReq; //uint8_t ADS_Reqmode; //20221102, 新车没有此信号 int16_t ACC_MotorTorqueMaxLimitRequest; uint8_t ACC_LatAngReqActive; int16_t ACC_MotorTorqueMinLimitRequest; //uint8_t ACC_ADCReqType; //20221102, 新车没有此信号 } ECU_1C4_t; // signal: @ACC_AccTrqReq #define ECU_24E_ACC_AccTrqReq_CovFactor (1) // conversion value to CAN signal #define ECU_24E_ACC_AccTrqReq_toS(x) ((int16_t)((x) + 16384)) // signal: @ACC_ACCTargetAcceleration #define ECU_24E_ACC_ACCTargetAcceleration_CovFactor (0.05) // conversion value to CAN signal #define ECU_24E_ACC_ACCTargetAcceleration_toS(x) ((int16_t)((x) / 0.05 + 200)) // signal: @ACC_AEBTargetDeceleration #define ECU_24E_ACC_AEBTargetDeceleration_CovFactor (0.0005) // conversion value to CAN signal #define ECU_24E_ACC_AEBTargetDeceleration_toS(x) ((int32_t)((x) / 0.0005 + 32000)) typedef struct { int16_t ACC_AccTrqReq; uint8_t ACC_AccTrqReqActive; int16_t ACC_ACCTargetAcceleration; int32_t ACC_AEBTargetDeceleration; uint8_t ACC_AEBVehilceHoldReq; uint8_t ADCReqMode; uint8_t ACC_AEBActive; uint8_t ACC_Driveoff_Request; uint8_t ACC_DecToStop; uint8_t ACC_CDDActive; uint8_t ACC_ACCMode; } ECU_24E_t; typedef struct { uint8_t ADS_UDLCTurnLightReq; } ECU_36E_t; unsigned char byte_1C4[64];//byte_144[8]; unsigned char byte_24E[64]; unsigned char byte_36E[64]; ECU_1C4_t _m1C4 = {0,0,0,0}; ECU_24E_t _m24E = {0,0,0,0,0,0,0,0,0,0,0}; ECU_36E_t _m36E = {0}; void ExecSend(); void executeDecition(const iv::brain::decition &decition) { static int xieya = 50; // std::cout<<"acc is "<(-0.0000001)) { //_m144.ACC_ADCReqType = 0;//ADC请求类型(制动时为1,其余情况为0)//20221102,新车没有此信号 // _m24B.ADCReqMode = 0;//20221102,新车没有此信号 _m24E.ACC_DecToStop =0; } else { //_m144.ACC_ADCReqType = 1;//20221102,新车没有此信号 // _m24B.ADCReqMode = 1;//20221102,新车没有此信号 _m24E.ACC_DecToStop =1; } // std::cout<<" type: "<<(int)_m144.ACC_ADCReqType<(-0.0000001)) { if(xieya > 0) { _m24E.ACC_CDDActive = 1; _m24E.ACC_ACCTargetAcceleration = ECU_24E_ACC_ACCTargetAcceleration_toS(0.5); _m24E.ACC_AccTrqReq = ECU_24E_ACC_AccTrqReq_toS(0); _m24E.ACC_Driveoff_Request = 1; //_m144.ACC_ADCReqType = 1;//20221102,新车没有此信号 //_m24B.ADCReqMode = 1; //20221102,新车没有此信号 _m24E.ACC_DecToStop =1; xieya--; std::cout<<" xieya. now veh speed: "<> 9) & (0x1FU)) | ((_m144.ADS_Reqmode & (0x07U)) << 5); // qDebug(" req mode: %d byte: %02X ",_m144.ADS_Reqmode, byte_144[0]); // byte_144[1] = ((_m144.ACC_LatAngReq >> 1) & (0xFFU)); //byte_144[2] = ((_m144.ACC_LatAngReq & (0x01U)) << 7) | ((_m144.ACC_MotorTorqueMaxLimitRequest >> 5) & (0x3FU)) | ((_m144.ACC_LatAngReqActive & (0x01U)) << 6); //byte_144[3] = ((_m144.ACC_MotorTorqueMaxLimitRequest & (0x1FU)) << 3) | ((_m144.ACC_MotorTorqueMinLimitRequest >> 8) & (0x07U)); //byte_144[4] = (_m144.ACC_MotorTorqueMinLimitRequest & (0xFFU)); //byte_144[5] = ((_m144.ACC_ADCReqType & (0x03U)) << 6); byte_1C4[0] = ((_m1C4.ACC_MotorTorqueMaxLimitRequest >> 3) & (0xFFU)); // qDebug(" req mode: %d byte: %02X ",_m144.ADS_Reqmode, byte_144[0]); byte_1C4[1] = ((_m1C4.ACC_MotorTorqueMaxLimitRequest & (0x07U)) << 5) | ((_m1C4.ACC_MotorTorqueMinLimitRequest >> 6) & (0x1FU)); byte_1C4[2] = ((_m1C4.ACC_MotorTorqueMinLimitRequest & (0x3FU)) << 2) | ((_m1C4.ACC_LatAngReq >> 12) & (0x03U)); byte_1C4[3] = (((_m1C4.ACC_LatAngReq>>4 )& (0xFFU))); // byte_1C4[4] = (((_m1C4.ACC_LatAngReq<<4) & (0xF0U)))|((_m1C4.ACC_LatAngReqActive&(0x01U))<<3); byte_1C4[4] = (((_m1C4.ACC_LatAngReq)& (0x0fU))<<4)|((_m1C4.ACC_LatAngReqActive&(0x01U))<<3); //byte_1C4[5] = ((_m144.ACC_ADCReqType & (0x03U)) << 6); // _m24B.ACC_AEBTargetDeceleration = 0; // _m24B.ACC_AEBVehilceHoldReq = 0; // _m24B.ADCReqMode = 0; // _m24B.ACC_AEBActive = 0; // _m24B.ACC_Driveoff_Request = 0; // _m24B.ACC_DecToStop = 0; // std::cout<<" brake : "<(-0.0000001)) { _m24E.ACC_CDDActive = 0; _m24E.ACC_Driveoff_Request = 1; if(xieya > 0) { _m24E.ACC_ACCTargetAcceleration = ECU_24E_ACC_ACCTargetAcceleration_toS(0.5); xieya--; } else { _m24E.ACC_ACCTargetAcceleration = ECU_24E_ACC_ACCTargetAcceleration_toS(0); } } else { _m24E.ACC_CDDActive = 1; _m24E.ACC_Driveoff_Request = 0; if(gbHaveVehSpd) { if(gfVehSpd < 0.01) { if(xieya != 50)std::cout<<"need xieya. "<> 7) & (0xFFU)); //byte_24B[1] = ((_m24B.ACC_AccTrqReq & (0x7FU)) << 1) | (_m24B.ACC_AccTrqReqActive & (0x01U)); //byte_24B[2] = ((_m24B.ACC_ACCTargetAcceleration >> 3) & (0x1FU)); //byte_24B[3] = ((_m24B.ACC_ACCTargetAcceleration & (0x07U)) << 5) | ((_m24B.ACC_AEBTargetDeceleration >> 15) & (0x01U)); //byte_24B[4] = ((_m24B.ACC_AEBTargetDeceleration >> 7) & (0xFFU)); //byte_24B[5] = ((_m24B.ACC_AEBTargetDeceleration & (0x7FU)) << 1) | (_m24B.ACC_AEBVehilceHoldReq & (0x01U)); //byte_24B[6] = ((_m24B.ADCReqMode & (0x03U)) << 1) | ((_m24B.ACC_AEBActive & (0x01U)) << 3) | ((_m24B.ACC_Driveoff_Request & (0x01U)) << 5) | ((_m24B.ACC_DecToStop & (0x01U)) << 6) | ((_m24B.ACC_CDDActive & (0x01U)) << 7); //byte_24B[7] = (_m24B.ACC_ACCMode & (0x07U)); byte_24E[0] = ((_m24E.ACC_ACCTargetAcceleration) & (0xFFU)); //byte_24E[1] = ((_m24B.ACC_AccTrqReq & (0x7FU)) << 1) | (_m24B.ACC_AccTrqReqActive & (0x01U)); //byte_24E[2] = ((_m24B.ACC_ACCTargetAcceleration >> 3) & (0x1FU)); byte_24E[3] = ((_m24E.ACC_DecToStop & (0x01U)) << 7);// | ((_m24B.ACC_AEBTargetDeceleration >> 15) & (0x01U)); //byte_24E[4] = ((_m24B.ACC_AEBTargetDeceleration >> 7) & (0xFFU)); byte_24E[5] = ((_m24E.ACC_CDDActive & (0x01U)) << 4);//((_m24E.ACC_AEBTargetDeceleration & (0x7FU)) << 1) | (_m24E.ACC_AEBVehilceHoldReq & (0x01U)); byte_24E[6] = ((_m24E.ACC_Driveoff_Request & (0x01U)) << 7)|((_m24E.ACC_ACCMode & (0x07U))<<4);//((_m24E.ADCReqMode & (0x03U)) << 1) | ((_m24E.ACC_AEBActive & (0x01U)) << 3) | ((_m24E.ACC_Driveoff_Request & (0x01U)) << 5) | ((_m24E.ACC_DecToStop & (0x01U)) << 6) | ((_m24E.ACC_CDDActive & (0x01U)) << 7); byte_24E[8] = ((_m24E.ACC_AEBTargetDeceleration>>8) & (0xFFU)); byte_24E[9] = ((_m24E.ACC_AEBTargetDeceleration) & (0xFFU)); byte_24E[10] = ((_m24E.ACC_AEBActive & (0x01U)) << 7); byte_24E[11] = ((_m24E.ACC_AccTrqReq>>13 )& (0x03U)); byte_24E[12] = ((_m24E.ACC_AccTrqReq>>5 )& (0xFFU)); //byte_24E[13] = ((_m24E.ACC_AccTrqReq & (0x1FU)<<3))| ((_m24E.ACC_AccTrqReqActive & (0x01U)) << 2); byte_24E[13] = (((_m24E.ACC_AccTrqReq & (0x1FU))<<3))| ((_m24E.ACC_AccTrqReqActive & (0x01U)) << 2); // if(decition.leftlamp() == true && decition.rightlamp() == false) // _m36E.ADS_UDLCTurnLightReq = 3; // else if(decition.leftlamp() == false && decition.rightlamp() == true) // _m36E.ADS_UDLCTurnLightReq = 4; // else // _m36E.ADS_UDLCTurnLightReq = 0; // byte_36E[0] = ((_m36E.ADS_UDLCTurnLightReq & (0x07U)) << 5); } void Activate() { std::this_thread::sleep_for(std::chrono::milliseconds(100)); iv::brain::decition xdecition; // for(int j=0;j<100000;j++) // { std::cout<<" run "<CopyFrom(xraw); // qDebug(" 0x144: %02X %02X %02X %02X %02X %02X %02X %02X",byte_144[0],byte_144[1],byte_144[2],byte_144[3], // byte_144[4],byte_144[5],byte_144[6],byte_144[7]); xmsg.set_channel(0); xmsg.set_index(gnIndex); xraw.set_id(0x24E); xraw.set_data(byte_24E,64); xraw.set_bext(false); xraw.set_bremote(false); xraw.set_len(64); if(nCount%2 == 1) { iv::can::canraw * pxraw24E = xmsg.add_rawmsg(); pxraw24E->CopyFrom(xraw); } xmsg.set_channel(0); xmsg.set_index(gnIndex); // xraw.set_id(0x36E); // xraw.set_data(byte_36E,8); // xraw.set_bext(false); // xraw.set_bremote(false); // xraw.set_len(8); // if(nCount == 10) // { // iv::can::canraw * pxraw36E = xmsg.add_rawmsg(); // pxraw36E->CopyFrom(xraw); // nCount = 0; // } // xmsg.set_channel(0); // xmsg.set_index(gnIndex); gnIndex++; xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch()); int ndatasize = xmsg.ByteSize(); char * strser = new char[ndatasize]; std::shared_ptr pstrser; pstrser.reset(strser); if(xmsg.SerializeToArray(strser,ndatasize)) { iv::modulecomm::ModuleSendMsg(gpacansend,strser,ndatasize); } else { std::cout<<"MainWindow::onTimer serialize error."<(new iv::control::Controller()); iv::xmlparam::Xmlparam xp(strpath.toStdString()); gstrmemcansend = xp.GetParam("cansend","cansend0"); gstrmemdecition = xp.GetParam("dection","deciton"); gstrmemchassis = xp.GetParam("chassismsgname","chassis"); gpacansend = iv::modulecomm::RegisterSend(gstrmemcansend.data(),10000,1); gpadecition = iv::modulecomm::RegisterRecv(gstrmemdecition.data(),ListenDeciton); gpachassis = iv::modulecomm::RegisterRecv(gstrmemchassis.data(),UpdateChassis); #ifdef TORQUEBRAKETEST EnableTorqueBrakeTest(); #endif std::thread xthread(sendthread); return a.exec(); }