pcmsgbuffer.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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)
  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. nrtn = muid;
  56. muid++;
  57. mvectormsg.push_back(cmsg);
  58. iv::pcmsgstate xpms;xpms.nsendid = cmsg.nsendid;
  59. xpms.nsendtime = QDateTime::currentMSecsSinceEpoch();
  60. mvectorpcmsgstate.push_back(xpms);
  61. mMutex.unlock();
  62. return nrtn;
  63. }
  64. if((pmsg->mbImportant != true)||((QDateTime::currentMSecsSinceEpoch() - pmsg->mlastuptime)>=pmsg->mkeeptime))
  65. {
  66. changesendstate(pmsg->nsendid,-2);
  67. pmsg->mbImportant = bImportant;
  68. pmsg->mkeeptime = nkeeptime;
  69. pmsg->id = id;
  70. pmsg->ntime = ntime;
  71. pmsg->strctrlMD5 = strctrlMD5;
  72. pmsg->xdata.clear();
  73. pmsg->nsendid = muid;
  74. // cmsg.mlastuptime = QDateTime::currentMSecsSinceEpoch();
  75. nrtn = muid;
  76. iv::pcmsgstate xpms;xpms.nsendid = pmsg->nsendid;
  77. pmsg->mlastuptime = QDateTime::currentMSecsSinceEpoch();
  78. mvectorpcmsgstate.push_back(xpms);
  79. muid++;
  80. if(pxdata->size()>0)
  81. {
  82. pmsg->xdata.resize(pxdata->size());
  83. memcpy(pmsg->xdata.data(),pxdata->data(),pxdata->size());
  84. }
  85. }
  86. mMutex.unlock();
  87. return nrtn;
  88. }
  89. int pcmsgbuffer::getmsg(std::string strVIN, std::string strctrlMD5, int &id, qint64 &ntime, std::vector<char> *pxdata)
  90. {
  91. mMutex.lock();
  92. iv::pcmsg * pmsg = 0;
  93. int nsize = mvectormsg.size();
  94. int i;
  95. int npos;
  96. for(i=0;i<nsize;i++)
  97. {
  98. if(strncmp(mvectormsg[i].strVIN.data(),strVIN.data(),255) == 0)
  99. {
  100. pmsg = &mvectormsg[i];
  101. npos = i;
  102. break;
  103. }
  104. }
  105. if(pmsg == 0)
  106. {
  107. // std::cout<<" no this vin data"<<std::endl;;
  108. mMutex.unlock();
  109. return 0;
  110. }
  111. if(strctrlMD5 != pmsg->strctrlMD5)
  112. {
  113. std::cout<<" ctrl error."<<std::endl;
  114. changesendstate(pmsg->nsendid,-1);
  115. mMutex.unlock();
  116. return -2;
  117. }
  118. id = pmsg->id;
  119. ntime = pmsg->ntime;
  120. pxdata->clear();
  121. int ndatasize = pmsg->xdata.size();
  122. pxdata->resize(ndatasize);
  123. memcpy(pxdata->data(),pmsg->xdata.data(),ndatasize);
  124. changesendstate(pmsg->nsendid,1);
  125. mvectormsg.erase(mvectormsg.begin()+npos);
  126. mMutex.unlock();
  127. return 1;
  128. }
  129. void pcmsgbuffer::changesendstate(int nsendid, int nstate)
  130. {
  131. int nstatesize = mvectorpcmsgstate.size();
  132. int i;
  133. for(i=0;i<nstatesize;i++)
  134. {
  135. if(nsendid == mvectorpcmsgstate[i].nsendid)
  136. {
  137. mvectorpcmsgstate[i].nstate = nstate; //Send OK
  138. break;
  139. }
  140. }
  141. }
  142. int pcmsgbuffer::querysendstate(int nsendid)
  143. {
  144. int nrtn = -2;
  145. mMutex.lock();
  146. int nstatesize = mvectorpcmsgstate.size();
  147. int i;
  148. for(i=0;i<nstatesize;i++)
  149. {
  150. if(nsendid == mvectorpcmsgstate[i].nsendid)
  151. {
  152. nrtn = mvectorpcmsgstate[i].nstate;
  153. break;
  154. }
  155. }
  156. mMutex.unlock();
  157. return nrtn;
  158. }