pcmsgbuffer.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "pcmsgbuffer.h"
  2. pcmsgbuffer::pcmsgbuffer()
  3. {
  4. }
  5. void pcmsgbuffer::run()
  6. {
  7. while(!QThread::isInterruptionRequested())
  8. {
  9. mMutex.lock();
  10. qint64 nowtime = QDateTime::currentMSecsSinceEpoch();
  11. int i;
  12. for(i=0;i<mvectorpcmsgstate.size();i++)
  13. {
  14. if((nowtime - mvectorpcmsgstate[i].nsendtime) > OVERTIME)
  15. {
  16. mvectorpcmsgstate.erase(mvectorpcmsgstate.begin() + i);
  17. i--;
  18. }
  19. }
  20. mMutex.unlock();
  21. msleep(100);
  22. }
  23. }
  24. unsigned int pcmsgbuffer::addmsg(int id, qint64 ntime, std::string strVIN, std::string strctrlMD5, std::vector<char> *pxdata,bool bImportant,int nkeeptime,float framerate)
  25. {
  26. unsigned int nrtn;
  27. mMutex.lock();
  28. iv::pcmsg * pmsg = 0;
  29. int nsize = mvectormsg.size();
  30. int i;
  31. for(i=0;i<nsize;i++)
  32. {
  33. if(strncmp(mvectormsg[i].strVIN.data(),strVIN.data(),255) == 0)
  34. {
  35. pmsg = &mvectormsg[i];
  36. break;
  37. }
  38. }
  39. if(pmsg == 0)
  40. {
  41. iv::pcmsg cmsg;
  42. cmsg.id = id;
  43. cmsg.ntime = ntime;
  44. cmsg.strVIN = strVIN;
  45. cmsg.strctrlMD5 = strctrlMD5;
  46. if(pxdata->size() > 0)
  47. {
  48. cmsg.xdata.resize(pxdata->size());
  49. memcpy(cmsg.xdata.data(),pxdata->data(),pxdata->size());
  50. }
  51. cmsg.mlastuptime = QDateTime::currentMSecsSinceEpoch();
  52. cmsg.nsendid = muid;
  53. cmsg.mbImportant = bImportant;
  54. cmsg.mkeeptime = nkeeptime;
  55. cmsg.framerate = framerate;
  56. nrtn = muid;
  57. muid++;
  58. mvectormsg.push_back(cmsg);
  59. iv::pcmsgstate xpms;xpms.nsendid = cmsg.nsendid;
  60. xpms.nsendtime = QDateTime::currentMSecsSinceEpoch();
  61. mvectorpcmsgstate.push_back(xpms);
  62. mMutex.unlock();
  63. return nrtn;
  64. }
  65. if((pmsg->mbImportant != true)||((QDateTime::currentMSecsSinceEpoch() - pmsg->mlastuptime)>=pmsg->mkeeptime))
  66. {
  67. changesendstate(pmsg->nsendid,-2);
  68. pmsg->mbImportant = bImportant;
  69. pmsg->mkeeptime = nkeeptime;
  70. pmsg->id = id;
  71. pmsg->ntime = ntime;
  72. pmsg->strctrlMD5 = strctrlMD5;
  73. pmsg->xdata.clear();
  74. pmsg->nsendid = muid;
  75. // cmsg.mlastuptime = QDateTime::currentMSecsSinceEpoch();
  76. nrtn = muid;
  77. iv::pcmsgstate xpms;xpms.nsendid = pmsg->nsendid;
  78. pmsg->mlastuptime = QDateTime::currentMSecsSinceEpoch();
  79. mvectorpcmsgstate.push_back(xpms);
  80. muid++;
  81. if(pxdata->size()>0)
  82. {
  83. pmsg->xdata.resize(pxdata->size());
  84. memcpy(pmsg->xdata.data(),pxdata->data(),pxdata->size());
  85. }
  86. }
  87. mMutex.unlock();
  88. return nrtn;
  89. }
  90. int pcmsgbuffer::getmsg(std::string strVIN, std::string strctrlMD5, int &id, qint64 &ntime, std::vector<char> *pxdata,float * framerate)
  91. {
  92. mMutex.lock();
  93. iv::pcmsg * pmsg = 0;
  94. int nsize = mvectormsg.size();
  95. int i;
  96. int npos;
  97. for(i=0;i<nsize;i++)
  98. {
  99. if(strncmp(mvectormsg[i].strVIN.data(),strVIN.data(),255) == 0)
  100. {
  101. pmsg = &mvectormsg[i];
  102. npos = i;
  103. break;
  104. }
  105. }
  106. if(pmsg == 0)
  107. {
  108. // std::cout<<" no this vin data"<<std::endl;;
  109. mMutex.unlock();
  110. return 0;
  111. }
  112. if(strctrlMD5 != pmsg->strctrlMD5)
  113. {
  114. std::cout<<" ctrl error."<<std::endl;
  115. changesendstate(pmsg->nsendid,-1);
  116. mMutex.unlock();
  117. return -2;
  118. }
  119. id = pmsg->id;
  120. ntime = pmsg->ntime;
  121. *framerate = pmsg->framerate;
  122. pxdata->clear();
  123. int ndatasize = pmsg->xdata.size();
  124. pxdata->resize(ndatasize);
  125. memcpy(pxdata->data(),pmsg->xdata.data(),ndatasize);
  126. changesendstate(pmsg->nsendid,1);
  127. mvectormsg.erase(mvectormsg.begin()+npos);
  128. mMutex.unlock();
  129. return 1;
  130. }
  131. void pcmsgbuffer::changesendstate(int nsendid, int nstate)
  132. {
  133. int nstatesize = mvectorpcmsgstate.size();
  134. int i;
  135. for(i=0;i<nstatesize;i++)
  136. {
  137. if(nsendid == mvectorpcmsgstate[i].nsendid)
  138. {
  139. mvectorpcmsgstate[i].nstate = nstate; //Send OK
  140. break;
  141. }
  142. }
  143. }
  144. int pcmsgbuffer::querysendstate(int nsendid)
  145. {
  146. int nrtn = -2;
  147. mMutex.lock();
  148. int nstatesize = mvectorpcmsgstate.size();
  149. int i;
  150. for(i=0;i<nstatesize;i++)
  151. {
  152. if(nsendid == mvectorpcmsgstate[i].nsendid)
  153. {
  154. nrtn = mvectorpcmsgstate[i].nstate;
  155. break;
  156. }
  157. }
  158. mMutex.unlock();
  159. return nrtn;
  160. }