123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include "kvasercan.h"
- #include <QTime>
- #include <iostream>
- #define BUF_SIZE 1000
- long gbaudlist[] = {canBITRATE_10K,canBITRATE_50K,canBITRATE_100K,canBITRATE_125K,
- canBITRATE_250K,canBITRATE_500K,canBITRATE_1M};
- extern iv::Ivfault *gfault;
- extern iv::Ivlog *givlog;
- kvasercan::kvasercan(int ch1baudindex,int ch2baudindex)
- {
- mbaud1 = canBITRATE_500K;
- mbaud2 = canBITRATE_500K;
- if((ch1baudindex>=0)&&(ch1baudindex<=6))
- {
- mbaud1 = gbaudlist[ch1baudindex];
- }
- if((ch2baudindex>=0)&&(ch2baudindex<=6))
- {
- mbaud2 = gbaudlist[ch2baudindex];
- }
- }
- void kvasercan::run()
- {
- canStatus stat;
- mbRunning = false;
- mkvaserch1 = canOpenChannel(0, 0);
- if(mkvaserch1 < 0)
- {
- emit SIG_CANOPENSTATE(false,-1,"open ch1 fail");
- return;
- }
- mkvaserch2 = canOpenChannel(1,0);
- if(mkvaserch2 <0)
- {
- emit SIG_CANOPENSTATE(false,-2,"open ch2 fail");
- return;
- }
- stat = canSetBusParams(mkvaserch1, mbaud1, 0, 0, 0, 0, 0);
- if (stat != canOK) {
- emit SIG_CANOPENSTATE(false,-3,"ch1 SetBusParams fail");
- return;
- }
- stat = canBusOn(mkvaserch1);
- if (stat != canOK) {
- emit SIG_CANOPENSTATE(false,-4,"ch1 Buson fail");
- return;
- }
- stat = canSetBusParams(mkvaserch2, mbaud2, 0, 0, 0, 0, 0);
- if (stat != canOK) {
- emit SIG_CANOPENSTATE(false,-5,"ch2 SetBusParams fail");
- return;
- }
- stat = canBusOn(mkvaserch2);
- if (stat != canOK) {
- emit SIG_CANOPENSTATE(false,-6,"ch2 Buson fail");
- return;
- }
- mbCANOpen = true;
- emit SIG_CANOPENSTATE(true,0,"open can card successfully");
- mkvaserch[0] = mkvaserch1;
- mkvaserch[1] = mkvaserch2;
- int nch;
- int res;
- while((!QThread::isInterruptionRequested())&&(mbCANOpen))
- {
- for(nch=0;nch < 2;nch++)
- {
- // res = VCI_Receive(4, mnDevNum, nch, receivedata, 2500, 100);
- long id;
- char msgdata[8];
- unsigned int dlc;
- unsigned int flag;
- unsigned long time;
- stat = canRead(mkvaserch[nch],&id,msgdata,&dlc,&flag,&time);
- if(stat == canOK)
- {
- // qDebug("nch %d id is %x",nch,id);
- mMutex.lock();
- basecan_msg msg;
- msg.id = id;
- // msg.isExtern = receivedata[i].ExternFlag;
- msg.isRemote = false;
- msg.nLen = dlc;
- memcpy(msg.data,msgdata,8);
- if(mMsgRecvBuf[nch].size()<BUF_SIZE)
- {
- mMsgRecvBuf[nch].push_back(msg);
- }
- mMutex.unlock();
- }
- else
- {
- if(stat != canERR_NOMSG)
- {
- givlog->error("check CAN, CAN Have Error,Error code is %d",(int)stat);
- gfault->SetFaultState(1, 0, "canErr");
- }
- else
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
- }
- }
- }
- for(nch =0;nch<2;nch++)
- {
- std::vector<basecan_msg> xMsgSendBuf;
- mMutex.lock();
- // xMsgSendBuf = mMsgSendBuf[nch];
- int j;
- for(j=0;j<mMsgSendBuf[nch].size();j++)
- {
- xMsgSendBuf.push_back(mMsgSendBuf[nch][j]);
- }
- mMsgSendBuf[nch].clear();
- mMutex.unlock();
- for(j=0;j<xMsgSendBuf.size();j++)
- {
- // qDebug("%ld ch is %d ",QDateTime::currentMSecsSinceEpoch(),nch);
- // qDebug("%02x %02x %02x %02x ",xMsgSendBuf[j].data[0],xMsgSendBuf[j].data[1],xMsgSendBuf[j].data[3],
- // xMsgSendBuf[j].data[4]);
- canWrite(mkvaserch[nch],xMsgSendBuf[j].id,(void *)xMsgSendBuf[j].data,xMsgSendBuf[j].nLen,canMSG_STD);
- // canFlushTransmitQueue(mkvaserch[nch]);
- // qDebug("time is %ld",QDateTime::currentMSecsSinceEpoch());
- }
- xMsgSendBuf.clear();
- }
- // std::this_thread::sleep_for(std::chrono::milliseconds(1));
- }
- }
- void kvasercan::startdev()
- {
- start();
- }
- void kvasercan::stopdev()
- {
- requestInterruption();
- QTime xTime;
- xTime.start();
- while(xTime.elapsed()<100)
- {
- if(mbRunning == false)
- {
- givlog->warn("can is closed at %d",xTime.elapsed());
- break;
- }
- }
- }
- int kvasercan::GetMessage(const int nch,basecan_msg *pMsg, const int nCap)
- {
- if((nch>1)||(nch < 0))return -1;
- if(mMsgRecvBuf[nch].size() == 0)return 0;
- int nRtn;
- nRtn = nCap;
- mMutex.lock();
- if(nRtn > mMsgRecvBuf[nch].size())nRtn = mMsgRecvBuf[nch].size();
- int i;
- for(i=0;i<nRtn;i++)
- {
- memcpy(&pMsg[i],&(mMsgRecvBuf[nch].at(i)),sizeof(basecan_msg));
- }
- std::vector<basecan_msg>::iterator iter;
- iter = mMsgRecvBuf[nch].begin();
- for(i=0;i<nRtn;i++)
- {
- iter = mMsgRecvBuf[nch].erase(iter);
- }
- mMutex.unlock();
- return nRtn;
- }
- int kvasercan::SetMessage(const int nch, basecan_msg *pMsg)
- {
- if((nch>1)||(nch < 0))return -1;
- if(mMsgSendBuf[nch].size() > BUF_SIZE)return -2;
- mMutex.lock();
- mMsgSendBuf[nch].push_back(*pMsg);
- mMutex.unlock();
- return 0;
- }
|