smartlightcommthread.cpp.bak 120 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637
  1. #include "smartlightcommthread.h"
  2. #include "smartlightshm.h"
  3. SmartLightCommThread::SmartLightCommThread(qintptr socketDescriptor, QObject *parent)
  4. : QThread (parent)
  5. {
  6. idx = -1;
  7. ErrorCount[0] = 0x0000;
  8. ErrorCount[1] = 0x0000;
  9. WirelessSignal = 0xff;
  10. keepcomm = false;
  11. CmdList.clear();
  12. this->SocketDescriptor = socketDescriptor;
  13. }
  14. SmartLightCommThread::~SmartLightCommThread()
  15. {
  16. deleteLater();
  17. }
  18. QString SmartLightCommThread::deviceID()
  19. {
  20. return DeviceID;
  21. }
  22. void SmartLightCommThread::run()
  23. {
  24. QTcpSocket *so = new QTcpSocket;
  25. if(!so->setSocketDescriptor(this->SocketDescriptor))
  26. {
  27. so->abort();
  28. return;
  29. }
  30. WaitEcho = false;
  31. WaitCount = 0;
  32. DevType = -1;
  33. DeviceID = "";
  34. keepcomm = true;
  35. err_count = 0;
  36. while (keepcomm) {
  37. if(so->state()!=QTcpSocket::ConnectedState){
  38. close_self(so);
  39. return;
  40. }
  41. if(so->waitForReadyRead(1000)){
  42. WaitCount = 0;
  43. readData(so);
  44. }
  45. if(CmdList.length()>0){
  46. if(!WaitEcho){
  47. QByteArray cmd = CmdList.first();
  48. so->write(cmd);
  49. so->flush();
  50. CmdList.removeFirst();
  51. QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
  52. .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
  53. for(int i=0;i<cmd.length();i++){
  54. Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
  55. }
  56. emit CommData(DeviceID, 2, Data);
  57. WaitCount = 0;
  58. }
  59. }
  60. if(WaitEcho)
  61. WaitCount++;
  62. if(WaitCount>30)
  63. WaitEcho=false;
  64. usleep(100000);
  65. }
  66. }
  67. quint16 SmartLightCommThread::chk_crcc(QByteArray buff, int len)
  68. {
  69. quint16 default_data = 0xa001;
  70. quint16 crc = 0xffff;
  71. for(int j=0;j<len;j++)
  72. {
  73. crc ^= static_cast<quint8>(buff[j]&0xff);
  74. for(int i=0;i<8;i++)
  75. {
  76. if(crc&0x01)
  77. {
  78. crc >>= 1;
  79. crc ^= default_data;
  80. }else
  81. crc >>= 1;
  82. }
  83. }
  84. return crc;
  85. }
  86. void SmartLightCommThread::mk_EventList_qry(QString deviceId, quint8 type, quint8 cur, quint8 num)
  87. {
  88. UN_REFERENCED_PARAMETER(deviceId);
  89. if((type==0x01)||(type==0x02)){
  90. QDateTime dt = QDateTime::currentDateTime();
  91. QByteArray body = QByteArray(21,0x00);
  92. body[0] = static_cast<char>(ServerAddr1&0xff);
  93. body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
  94. body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
  95. body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
  96. body[4] = static_cast<char>(ServerAddr0&0xff);
  97. body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
  98. body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
  99. body[7] = static_cast<char>(0x00);
  100. body[8] = static_cast<char>(0x0e);
  101. body[9] = static_cast<char>(0xe0);
  102. body[10] = static_cast<char>(0x00);
  103. body[11] = static_cast<char>(0x00);
  104. body[12] = static_cast<char>(type&0xff);
  105. body[13] = static_cast<char>(0x00);
  106. body[14] = static_cast<char>(cur&0xff);
  107. body[15] = static_cast<char>(num&0xff);
  108. body[16] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
  109. body[17] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
  110. body[18] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
  111. body[19] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
  112. body[20] = static_cast<char>(0x05);
  113. QByteArray cmd = mkDataFrame(body);
  114. CmdList.append(cmd);
  115. }
  116. }
  117. int SmartLightCommThread::get_fp_byte(int num)
  118. {
  119. if(num>0)
  120. return ((0x0100<<((num-1)&0x07))|(num>>3));
  121. return 0;
  122. }
  123. void SmartLightCommThread::mk_hisData_qry(QString deviceId, quint16 f_pno, quint16 f_fno, QDateTime t1, QDateTime t2, quint8 sep, quint8 num)
  124. {
  125. UN_REFERENCED_PARAMETER(deviceId);
  126. QDateTime dt = QDateTime::currentDateTime();
  127. QByteArray body = QByteArray(1,0x00);
  128. if((f_fno==2)||(f_fno==9)){
  129. body = QByteArray(22,0x00);
  130. }else if((f_fno==1)||(f_fno==17)||(f_fno==18)||(f_fno==19)||(f_fno==20)||(f_fno==21)||(f_fno==22)){
  131. body = QByteArray(26,0x00);
  132. }else if((f_fno==41)||(f_fno==42)||(f_fno==43)||(f_fno==61)||(f_fno==62)){
  133. body = QByteArray(29,0x00);
  134. }
  135. body[0] = static_cast<char>(ServerAddr1&0xff);
  136. body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
  137. body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
  138. body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
  139. body[4] = static_cast<char>(ServerAddr0&0xff);
  140. body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
  141. body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
  142. body[7] = static_cast<char>(0x00);
  143. body[8] = static_cast<char>(0x0d);
  144. body[9] = static_cast<char>(0xe0);
  145. int pno = get_fp_byte(f_pno);
  146. body[10] = static_cast<char>((pno>>8)&0xff);
  147. body[11] = static_cast<char>(pno&0xff);
  148. int fno = get_fp_byte(f_fno);
  149. body[12] = static_cast<char>((fno>>8)&0xff);
  150. body[13] = static_cast<char>(fno&0xff);
  151. if(body.length()==22){
  152. body[14] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
  153. body[15] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
  154. body[16] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
  155. body[17] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
  156. body[18] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
  157. body[19] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
  158. body[20] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
  159. body[21] = static_cast<char>(0x05);
  160. }else if(body.length()==26){
  161. body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
  162. body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
  163. body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
  164. body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
  165. body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
  166. body[19] = static_cast<char>(sep);
  167. body[20] = static_cast<char>(num);
  168. body[21] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
  169. body[22] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
  170. body[23] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
  171. body[24] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
  172. body[25] = static_cast<char>(0x05);
  173. }else if(body.length()==29){
  174. body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
  175. body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
  176. body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
  177. body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
  178. body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
  179. body[19] = static_cast<char>((((t2.time().minute()/10)&0x0f)<<4)|((t2.time().minute()%10)&0x0f));
  180. body[20] = static_cast<char>((((t2.time().hour()/10)&0x0f)<<4)|((t2.time().hour()%10)&0x0f));
  181. body[21] = static_cast<char>((((t2.date().day()/10)&0x0f)<<4)|((t2.date().day()%10)&0x0f));
  182. body[22] = static_cast<char>((((t2.date().month()/10)&0x0f)<<4)|((t2.date().month()%10)&0x0f));
  183. body[23] = static_cast<char>((((t2.date().year()/10)&0x0f)<<4)|((t2.date().year()%10)&0x0f));
  184. body[24] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
  185. body[25] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
  186. body[26] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
  187. body[27] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
  188. body[28] = static_cast<char>(0x05);
  189. }
  190. if(body.length()>1){
  191. QByteArray cmd = mkDataFrame(body);
  192. CmdList.append(cmd);
  193. }
  194. }
  195. void SmartLightCommThread::confirm_report(QTcpSocket *so)
  196. {
  197. QDateTime dt = QDateTime::currentDateTime();
  198. QByteArray body = QByteArray(20,0x00);
  199. body[0] = static_cast<char>(ServerAddr1&0xff);
  200. body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
  201. body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
  202. body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
  203. body[4] = static_cast<char>(ServerAddr0&0xff);
  204. body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
  205. body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
  206. body[7] = static_cast<char>(0x00);
  207. body[8] = static_cast<char>(0x00);
  208. body[9] = static_cast<char>(0xe0);
  209. body[10] = static_cast<char>(0x00);
  210. body[11] = static_cast<char>(0x00);
  211. body[12] = static_cast<char>(0x01);
  212. body[13] = static_cast<char>(0x00);
  213. body[14] = static_cast<char>(0x00);
  214. body[15] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
  215. body[16] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
  216. body[17] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
  217. body[18] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
  218. body[19] = static_cast<char>(0x05);
  219. QByteArray cmd = mkDataFrame(body);
  220. so->write(cmd);
  221. so->flush();
  222. QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
  223. .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
  224. for(int i=0;i<cmd.length();i++){
  225. Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
  226. }
  227. emit CommData(DeviceID, 2, Data);
  228. }
  229. QByteArray SmartLightCommThread::mkDataFrame(QByteArray body){
  230. QByteArray data = QByteArray(body.length()+9,0x00);
  231. int len = body.length();
  232. data[0] = static_cast<char>(0x68);
  233. data[1] = static_cast<char>(len&0xff);
  234. data[2] = static_cast<char>((len>>8)&0xff);
  235. data[3] = static_cast<char>(len&0xff);
  236. data[4] = static_cast<char>((len>>8)&0xff);
  237. data[5] = static_cast<char>(0x68);
  238. data[6] = static_cast<char>(ServerAddr1&0xff);
  239. data[7] = static_cast<char>((ServerAddr1>>8)&0xff);
  240. data[8] = static_cast<char>((ServerAddr1>>16)&0xff);
  241. data[9] = static_cast<char>((ServerAddr1>>24)&0xff);
  242. data[10] = static_cast<char>(ServerAddr0&0xff);
  243. data[11] = static_cast<char>((ServerAddr0>>8)&0xff);
  244. data[12] = static_cast<char>((ServerAddr0>>16)&0xff);
  245. data[13] = static_cast<char>(0x00);
  246. for(int i=8;i<body.length();i++)
  247. data[6+i] = static_cast<char>(body.at(i)&0xff);
  248. quint16 crc = chk_crcc(data.mid(6,len),len);
  249. data[data.length()-3] = static_cast<char>(crc&0xff);
  250. data[data.length()-2] = static_cast<char>((crc>>8)&0xff);
  251. data[data.length()-1] = static_cast<char>(0x16);
  252. return data;
  253. }
  254. float SmartLightCommThread::get_repValue(int type, QByteArray dat)
  255. {
  256. switch (type) {
  257. case 0x01:
  258. if(dat.length()==2){
  259. return static_cast<float>(((dat.at(1)&0xf0)>>4)*100
  260. +(dat.at(1)&0x0f)*10
  261. +((dat.at(0)&0xf0)>>4)
  262. +(dat.at(0)&0x0f)*0.1);
  263. }
  264. break;
  265. case 0x02:
  266. if(dat.length()==3){
  267. return static_cast<float>((((dat.at(2)&0x80)==0x80)?-1:1)
  268. *(((dat.at(2)&0x70)>>4)*100
  269. +(dat.at(2)&0x0f)*10
  270. +((dat.at(1)&0xf0)>>4)
  271. +((dat.at(1)&0x0f)*0.1)
  272. +(((dat.at(0)&0xf0)>>4)*0.01)
  273. +((dat.at(0)&0x0f)*0.001)));
  274. }
  275. break;
  276. case 0x03:
  277. case 0x05:
  278. case 0x07:
  279. if(dat.length()==2){
  280. int d = (((dat.at(1)&0x10)==0x10)?-1:1)
  281. *((dat.at(1)&0x0f)*100+((dat.at(0)&0xf0)>>4)*10+(dat.at(0)&0x0f));
  282. switch ((dat.at(1)>>5)&0x07) {
  283. case 0x00:
  284. return static_cast<float>(d*10000);
  285. break;
  286. case 0x01:
  287. return static_cast<float>(d*1000);
  288. break;
  289. case 0x02:
  290. return static_cast<float>(d*100);
  291. break;
  292. case 0x03:
  293. return static_cast<float>(d*10);
  294. break;
  295. case 0x04:
  296. return static_cast<float>(d);
  297. break;
  298. case 0x05:
  299. return static_cast<float>(d*0.1);
  300. break;
  301. case 0x06:
  302. return static_cast<float>(d*0.01);
  303. break;
  304. case 0x07:
  305. return static_cast<float>(d*0.001);
  306. break;
  307. }
  308. }
  309. break;
  310. case 0x04:
  311. case 0x06:
  312. case 0x08:
  313. if(dat.length()==2){
  314. return static_cast<float>((((dat.at(1)&0x80)==0x80)?-1:1)
  315. *(((dat.at(1)&0x70)>>4)*100
  316. +(dat.at(1)&0x0f)*10
  317. +((dat.at(0)&0xf0)>>4)
  318. +((dat.at(0)&0x0f)*0.1)));
  319. }
  320. break;
  321. }
  322. return static_cast<float>(0.0);
  323. }
  324. bool SmartLightCommThread::checkDataBody(QTcpSocket *so, QByteArray body)
  325. {
  326. int ud_cur=0;
  327. int len = body.length();
  328. quint8 f_dir=0x00;
  329. quint8 f_prm=0x00;
  330. quint8 f_afn=0x00;
  331. quint8 f_seq=0x00;
  332. quint8 f_con=0x00;
  333. quint8 f_fin=0x00;
  334. quint8 f_fir=0x00;
  335. quint8 f_tpv=0x00;
  336. quint16 f_dlen=0x0000;
  337. quint16 f_prof=0x0000;
  338. quint16 f_sn=0x0000;
  339. quint16 f_pno=0x0000;
  340. quint16 f_fno=0x0000;
  341. if(DevType==0x00){
  342. ud_cur = 8;
  343. }else{
  344. f_prof = (body.at(ud_cur+0)&0x00ff)|((body.at(ud_cur+1)&0x00ff)<<8);
  345. f_sn = (body.at(ud_cur+2)&0x00ff)|((body.at(ud_cur+3)&0x00ff)<<8);
  346. ud_cur =12;
  347. }
  348. f_dir = (body.at(ud_cur+0)&0x80)>>7;
  349. f_prm = (body.at(ud_cur+0)&0x40)>>6;
  350. f_afn = body.at(ud_cur+0)&0x1f;
  351. f_seq = body.at(ud_cur+1)&0x0f;
  352. f_con = (body.at(ud_cur+1)&0x10)>>4;
  353. f_fin = (body.at(ud_cur+1)&0x20)>>5;
  354. f_fir = (body.at(ud_cur+1)&0x40)>>6;
  355. f_tpv = (body.at(ud_cur+1)&0x80)>>7;
  356. f_pno = (body.at(ud_cur+3)&0x00ff)*8;
  357. for(int i=0;i<8;i++){
  358. int bit = 0x01<<i;
  359. if((body.at(ud_cur+2)&bit)==bit){
  360. f_pno += (i+1);
  361. break;
  362. }
  363. }
  364. f_fno = (body.at(ud_cur+5)&0x00ff)*8;
  365. for(int i=0;i<8;i++){
  366. int bit = 0x01<<i;
  367. if((body.at(ud_cur+4)&bit)==bit){
  368. f_fno += (i+1);
  369. break;
  370. }
  371. }
  372. switch (f_afn) {
  373. case 0x00://确认、否认
  374. break;
  375. case 0x01://复位
  376. break;
  377. case 0x02://链路接口检测
  378. if(f_pno==0){
  379. if(f_fno==1){//登录
  380. f_dlen=4;
  381. if(len>=(ud_cur+6+2)){
  382. ErrorCount[0] = body.at(ud_cur+6)&0xff;
  383. ErrorCount[1] = body.at(ud_cur+7)&0xff;
  384. if(f_con==0x01){
  385. confirm_report(so);
  386. }
  387. }
  388. }else if(f_fno==2){//退出
  389. f_dlen=4;
  390. if(len>=(ud_cur+6+2)){
  391. ErrorCount[0] = body.at(ud_cur+6)&0xff;
  392. ErrorCount[1] = body.at(ud_cur+7)&0xff;
  393. if(f_con==0x01){
  394. confirm_report(so);
  395. }
  396. }
  397. }else if(f_fno==3){//心跳
  398. f_dlen=5;
  399. if(len>=(ud_cur+6+3)){
  400. ErrorCount[0] = body.at(ud_cur+7)&0xff;
  401. ErrorCount[1] = body.at(ud_cur+8)&0xff;
  402. WirelessSignal = body.at(ud_cur+6)&0xff;
  403. if(f_con==0x01){
  404. confirm_report(so);
  405. }
  406. }
  407. }
  408. QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13")
  409. .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal);
  410. emit CommData(DeviceID, 1, o_Data);
  411. }
  412. break;
  413. case 0x04://设置参数
  414. break;
  415. case 0x05://控制命令
  416. break;
  417. case 0x09://请求终端配置
  418. break;
  419. case 0x0a://查询参数
  420. break;
  421. case 0x0c://请求实时数据
  422. break;
  423. case 0x0d://请求历史数据
  424. break;
  425. case 0x0e://请求事件数据
  426. if(f_pno==0){
  427. if(f_fno==1){//重要事件
  428. if(len>(ud_cur+6+4)){
  429. ErrorCount[0] = body.at(ud_cur+6)&0xff;
  430. ErrorCount[1] = body.at(ud_cur+7)&0xff;
  431. quint8 Err_Cur = body.at(ud_cur+8)&0xff;
  432. quint8 Err_End = body.at(ud_cur+9)&0xff;
  433. int err_len=0;
  434. slShm->smartLightList[idx].ErrCount[0]=(ErrorCount[0]&0xff);
  435. slShm->smartLightList[idx].ErrCount[1]=(ErrorCount[1]&0xff);
  436. for(quint8 i=0;i<=(Err_End-Err_Cur);i++){
  437. quint8 evid = (Err_Cur+i)&0xff;
  438. if(len>(ud_cur+6+4+err_len+2)){
  439. quint8 err_code = body.at(ud_cur+err_len+10)&0xff;
  440. quint8 evt_len = body.at(ud_cur+err_len+11)&0xff;
  441. QString o_data = "";
  442. if(len>=(ud_cur+6+4+err_len+2+evt_len)){
  443. o_data.append(QString("%1 ").arg(err_code,2,16,QChar('0')));
  444. o_data.append(QString("%1 ").arg(evt_len,2,16,QChar('0')));
  445. for(int j=0;j<evt_len;j++)
  446. o_data.append(QString("%1 ").arg(body.at(ud_cur+6+4+err_len+2+j)&0xff,2,16,QChar('0')));
  447. emit CommData(DeviceID, 1, o_data);
  448. switch (err_code) {
  449. case 1://ACU失电记录
  450. if(evt_len==6){
  451. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  452. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  453. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  454. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  455. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  456. 0));
  457. int sta = (body.at(ud_cur+err_len+17)&0x01);
  458. o_data = "";
  459. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  460. o_data.append(QString::fromUtf8(" ACU失电记录 "));
  461. if(sta==0x01)
  462. o_data.append(QString::fromUtf8("开始"));
  463. else
  464. o_data.append(QString::fromUtf8("恢复"));
  465. emit CommData(DeviceID, 1, o_data);
  466. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  467. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  468. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  469. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  470. emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
  471. }
  472. }
  473. break;
  474. case 2://正常开灯成功记录
  475. if(evt_len==5){
  476. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  477. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  478. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  479. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  480. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  481. 0));
  482. o_data = "";
  483. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  484. o_data.append(QString::fromUtf8(" 正常开灯成功记录 "));
  485. emit CommData(DeviceID, 1, o_data);
  486. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  487. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  488. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  489. emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
  490. }
  491. }
  492. break;
  493. case 3://正常开灯失败记录
  494. if(evt_len==5){
  495. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  496. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  497. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  498. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  499. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  500. 0));
  501. o_data = "";
  502. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  503. o_data.append(QString::fromUtf8(" 正常开灯失败记录 "));
  504. emit CommData(DeviceID, 1, o_data);
  505. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  506. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  507. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  508. emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
  509. }
  510. }
  511. break;
  512. case 4://正常关灯成功记录
  513. if(evt_len==5){
  514. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  515. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  516. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  517. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  518. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  519. 0));
  520. o_data = "";
  521. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  522. o_data.append(QString::fromUtf8(" 正常关开灯成功记录 "));
  523. emit CommData(DeviceID, 1, o_data);
  524. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  525. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  526. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  527. emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
  528. }
  529. }
  530. break;
  531. case 5://正常关灯失败记录
  532. if(evt_len==5){
  533. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  534. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  535. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  536. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  537. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  538. 0));
  539. o_data = "";
  540. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  541. o_data.append(QString::fromUtf8(" 正常关灯失败记录 "));
  542. emit CommData(DeviceID, 1, o_data);
  543. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  544. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  545. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  546. emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
  547. }
  548. }
  549. break;
  550. case 6://异常开灯记录
  551. if(evt_len==7){
  552. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  553. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  554. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  555. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  556. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  557. 0));
  558. int sta = (body.at(ud_cur+err_len+17)&0x01);
  559. uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
  560. o_data = "";
  561. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  562. o_data.append(QString::fromUtf8(" 异常开灯记录 "));
  563. if(sta==0x01)
  564. o_data.append(QString::fromUtf8("开始"));
  565. else
  566. o_data.append(QString::fromUtf8("恢复"));
  567. o_data.append(QString::fromUtf8(",异常原因:"));
  568. if(arg1==0x01)
  569. o_data.append(QString::fromUtf8("调试"));
  570. else
  571. o_data.append(QString::fromUtf8("未知"));
  572. emit CommData(DeviceID, 1, o_data);
  573. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  574. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  575. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  576. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  577. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  578. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
  579. }
  580. }
  581. break;
  582. case 7://异常关灯记录
  583. if(evt_len==7){
  584. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  585. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  586. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  587. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  588. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  589. 0));
  590. int sta = (body.at(ud_cur+err_len+17)&0x01);
  591. uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
  592. o_data = "";
  593. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  594. o_data.append(QString::fromUtf8(" 异常关灯记录 "));
  595. if(sta==0x01)
  596. o_data.append(QString::fromUtf8("开始"));
  597. else
  598. o_data.append(QString::fromUtf8("恢复"));
  599. o_data.append(QString::fromUtf8(",异常原因:"));
  600. if(arg1==0x01)
  601. o_data.append(QString::fromUtf8("调试"));
  602. else
  603. o_data.append(QString::fromUtf8("未知"));
  604. emit CommData(DeviceID, 1, o_data);
  605. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  606. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  607. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  608. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  609. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  610. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
  611. }
  612. }
  613. break;
  614. case 8://模拟量上限告警(关灯时间内)
  615. case 9://模拟量上限告警(开灯时间内)
  616. case 10://模拟量下限告警(开灯时间内)
  617. if(evt_len>=11){
  618. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  619. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  620. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  621. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  622. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  623. 0));
  624. int sta = (body.at(ud_cur+err_len+17)&0x01);
  625. uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
  626. uint arg2 = (body.at(ud_cur+err_len+19)&0x03);
  627. uint arg3 = (body.at(ud_cur+err_len+20)&0x07);
  628. float value = get_repValue(static_cast<int>(arg3),body.mid(ud_cur+err_len+21,evt_len-9));
  629. o_data = "";
  630. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  631. if((err_code==8)||(err_code==9))
  632. o_data.append(QString::fromUtf8(" 模拟量上限告警"));
  633. else if(err_code==10)
  634. o_data.append(QString::fromUtf8(" 模拟量下限告警"));
  635. if(err_code==8)
  636. o_data.append(QString::fromUtf8("(关灯时间内) "));
  637. else if((err_code==9)||(err_code==10))
  638. o_data.append(QString::fromUtf8("(开灯时间内) "));
  639. if(sta==0x01)
  640. o_data.append(QString::fromUtf8("开始"));
  641. else
  642. o_data.append(QString::fromUtf8("恢复"));
  643. o_data.append(QString::fromUtf8(" %1 %2 ").arg((arg1&0x7f)?QString::fromUtf8("%1").arg(arg1&0x7f):QString::fromUtf8("总")).arg((arg1&0x80)?QString::fromUtf8("出线"):QString::fromUtf8("进线")));
  644. if(arg2==0x00)
  645. o_data.append(QString::fromUtf8("相位:未知"));
  646. else if(arg2==0x01)
  647. o_data.append(QString::fromUtf8("相位:A相"));
  648. else if(arg2==0x02)
  649. o_data.append(QString::fromUtf8("相位:B相"));
  650. else if(arg2==0x03)
  651. o_data.append(QString::fromUtf8("相位:C相"));
  652. o_data.append(QString::fromUtf8(" 当前值:%1%2").arg(QString::number(static_cast<double>(value),'g',3))
  653. .arg(arg3==0x01?"V"
  654. :(arg3==0x02?"A"
  655. :(((arg3==0x03)||(arg3==0x04))?"W/VAR"
  656. :(arg3==0x05?"%"
  657. :(arg3==0x06?"Hz"
  658. :(arg3==0x07?"°"
  659. :(arg3==0x08?"lx"
  660. :""))))))));
  661. emit CommData(DeviceID, 1, o_data);
  662. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  663. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  664. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  665. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  666. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  667. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  668. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  669. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
  670. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
  671. }
  672. }
  673. break;
  674. case 11://终端通信故障
  675. if(evt_len==6){
  676. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  677. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  678. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  679. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  680. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  681. 0));
  682. int sta = (body.at(ud_cur+err_len+17)&0x01);
  683. o_data = "";
  684. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  685. o_data.append(QString::fromUtf8(" 终端通信故障 "));
  686. if(sta==0x01)
  687. o_data.append(QString::fromUtf8("开始"));
  688. else
  689. o_data.append(QString::fromUtf8("恢复"));
  690. emit CommData(DeviceID, 1, o_data);
  691. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  692. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  693. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  694. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  695. emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
  696. }
  697. }
  698. break;
  699. case 12://接口转换模块故障
  700. if(evt_len==6){
  701. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  702. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  703. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  704. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  705. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  706. 0));
  707. int sta = (body.at(ud_cur+err_len+17)&0x01);
  708. o_data = "";
  709. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  710. o_data.append(QString::fromUtf8(" 接口转换模块故障 "));
  711. if(sta==0x01)
  712. o_data.append(QString::fromUtf8("开始"));
  713. else
  714. o_data.append(QString::fromUtf8("恢复"));
  715. emit CommData(DeviceID, 1, o_data);
  716. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  717. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  718. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  719. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  720. emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
  721. }
  722. }
  723. break;
  724. case 13://接触器档位切换正常记录
  725. if(evt_len==8){
  726. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  727. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  728. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  729. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  730. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  731. 0));
  732. uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
  733. uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
  734. uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
  735. o_data = "";
  736. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  737. o_data.append(QString::fromUtf8(" 接触器档位正常切换 "));
  738. for(int i=0;i<8;i++)
  739. o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  740. for(int i=0;i<8;i++)
  741. o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  742. for(int i=0;i<8;i++)
  743. o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  744. emit CommData(DeviceID, 1, o_data);
  745. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  746. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  747. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  748. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  749. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  750. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  751. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
  752. }
  753. }
  754. break;
  755. case 14://接触器档位切换失败记录
  756. if(evt_len==8){
  757. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  758. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  759. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  760. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  761. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  762. 0));
  763. uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
  764. uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
  765. uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
  766. o_data = "";
  767. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  768. o_data.append(QString::fromUtf8(" 接触器档位切换失败 "));
  769. for(int i=0;i<8;i++)
  770. o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  771. for(int i=0;i<8;i++)
  772. o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  773. for(int i=0;i<8;i++)
  774. o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
  775. emit CommData(DeviceID, 1, o_data);
  776. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  777. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  778. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  779. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  780. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  781. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  782. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
  783. }
  784. }
  785. break;
  786. case 15://单灯正常开灯记录
  787. case 16://单灯正常关灯记录
  788. if(evt_len>=9){
  789. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  790. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  791. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  792. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  793. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  794. 0));
  795. uint arg1 = ((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8));
  796. uint arg2 = ((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
  797. if(evt_len==(9+arg2*2)){
  798. QString others="[";
  799. for(uint i=0;i<arg2;i++){
  800. if(i==0)
  801. others.append(QString("%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
  802. else
  803. others.append(QString(",%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
  804. }
  805. others.append("]");
  806. o_data = "";
  807. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  808. if(err_code==15){
  809. o_data.append(QString::fromUtf8(" 单灯正常开灯记录 "));
  810. o_data.append(QString::fromUtf8("开灯成功:%1 ").arg(arg1));
  811. o_data.append(QString::fromUtf8("开灯失败:%1 ").arg(arg2));
  812. }else if(err_code==16){
  813. o_data.append(QString::fromUtf8(" 单灯正常关灯记录 "));
  814. o_data.append(QString::fromUtf8("关灯成功:%1 ").arg(arg1));
  815. o_data.append(QString::fromUtf8("关灯失败:%1 ").arg(arg2));
  816. }
  817. if(arg2>0){
  818. o_data.append(QString::fromUtf8("失败灯号:"));
  819. o_data.append(others);
  820. }
  821. emit CommData(DeviceID, 1, o_data);
  822. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  823. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  824. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  825. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  826. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  827. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,others,t);
  828. }
  829. }
  830. }
  831. break;
  832. case 17://单灯异常开灯记录
  833. case 18://单灯异常关灯记录
  834. if(evt_len==9){
  835. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  836. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  837. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  838. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  839. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  840. 0));
  841. int sta = (body.at(ud_cur+err_len+17)&0xff);
  842. uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
  843. uint arg2 = (body.at(ud_cur+err_len+20)&0xff);
  844. o_data = "";
  845. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  846. if(err_code==17)
  847. o_data.append(QString::fromUtf8(" 单灯异常开灯 "));
  848. else if(err_code==18)
  849. o_data.append(QString::fromUtf8(" 单灯异常关灯 "));
  850. if(sta==0x01)
  851. o_data.append(QString::fromUtf8("开始"));
  852. else
  853. o_data.append(QString::fromUtf8("恢复"));
  854. o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
  855. if(arg2==0x01)
  856. o_data.append(QString::fromUtf8("原因:调试"));
  857. else if(arg2==0x00)
  858. o_data.append(QString::fromUtf8("原因:未知"));
  859. emit CommData(DeviceID, 1, o_data);
  860. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  861. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  862. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  863. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  864. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  865. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
  866. }
  867. }
  868. break;
  869. case 19://单灯过流记录
  870. case 20://单灯欠流记录
  871. if(evt_len>=10){
  872. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  873. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  874. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  875. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  876. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  877. 0));
  878. int sta = (body.at(ud_cur+err_len+17)&0xff);
  879. uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
  880. float value = get_repValue(2,body.mid(20,2));
  881. uint arg2 = (evt_len>10)?(body.at(ud_cur+err_len+22)&0xff):0x00;
  882. o_data = "";
  883. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  884. if(err_code==19)
  885. o_data.append(QString::fromUtf8(" 单灯过流记录 "));
  886. else if(err_code==20)
  887. o_data.append(QString::fromUtf8(" 单灯欠流记录 "));
  888. if(sta==0x01)
  889. o_data.append(QString::fromUtf8("开始"));
  890. else
  891. o_data.append(QString::fromUtf8("恢复"));
  892. o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
  893. o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
  894. o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
  895. emit CommData(DeviceID, 1, o_data);
  896. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  897. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  898. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  899. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  900. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  901. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  902. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
  903. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,0.0,"",t);
  904. }
  905. }
  906. break;
  907. case 21://单灯电流故障记录
  908. if(evt_len>=12){
  909. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  910. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  911. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  912. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  913. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  914. 0));
  915. int sta = (body.at(ud_cur+err_len+17)&0xff);
  916. uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
  917. float value = get_repValue(2,body.mid(20,2));
  918. float v2 = get_repValue(5,body.mid(22,2));
  919. uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
  920. o_data = "";
  921. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  922. o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
  923. if(sta==0x01)
  924. o_data.append(QString::fromUtf8("开始"));
  925. else
  926. o_data.append(QString::fromUtf8("恢复"));
  927. o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
  928. o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
  929. o_data.append(QString::fromUtf8(" 功率因素:%1%%").arg(QString::number(static_cast<double>(v2),'g',3)));
  930. o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
  931. emit CommData(DeviceID, 1, o_data);
  932. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  933. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  934. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  935. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  936. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  937. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  938. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
  939. slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
  940. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
  941. }
  942. }
  943. break;
  944. case 22://单灯灯具故障记录
  945. case 23://单灯熔丝故障记录
  946. if(evt_len>=12){
  947. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  948. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  949. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  950. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  951. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  952. 0));
  953. int sta = (body.at(ud_cur+err_len+17)&0xff);
  954. uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
  955. float value = get_repValue(1,body.mid(20,2));
  956. float v2 = get_repValue(2,body.mid(23,2));
  957. uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
  958. o_data = "";
  959. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  960. if(err_code==22)
  961. o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
  962. else if(err_code==23)
  963. o_data.append(QString::fromUtf8(" 单灯熔丝故障记录 "));
  964. if(sta==0x01)
  965. o_data.append(QString::fromUtf8("开始"));
  966. else
  967. o_data.append(QString::fromUtf8("恢复"));
  968. o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
  969. o_data.append(QString::fromUtf8("电压值:%1V").arg(QString::number(static_cast<double>(value),'g',3)));
  970. o_data.append(QString::fromUtf8(" 电流值:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
  971. emit CommData(DeviceID, 1, o_data);
  972. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  973. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  974. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  975. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  976. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  977. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  978. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
  979. slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
  980. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
  981. }
  982. }
  983. break;
  984. case 24://单灯通信故障记录
  985. if(evt_len==12){
  986. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  987. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  988. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  989. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  990. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  991. 0));
  992. uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8)));
  993. QDateTime t2 = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+23)&0xf0)>>4)*10+(body.at(ud_cur+err_len+23)&0x0f)),
  994. (((body.at(ud_cur+err_len+22)&0xf0)>>4)*10+(body.at(ud_cur+err_len+22)&0x0f)),
  995. (((body.at(ud_cur+err_len+21)&0xf0)>>4)*10+(body.at(ud_cur+err_len+21)&0x0f))),
  996. QTime((((body.at(ud_cur+err_len+20)&0xf0)>>4)*10+(body.at(ud_cur+err_len+20)&0x0f)),
  997. (((body.at(ud_cur+err_len+19)&0xf0)>>4)*10+(body.at(ud_cur+err_len+19)&0x0f)),
  998. 0));
  999. o_data = "";
  1000. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1001. o_data.append(QString::fromUtf8(" 单灯通信故障记录 "));
  1002. o_data.append(QString::fromUtf8(" 终端控制器设备序号:%1 ").arg(arg1));
  1003. o_data.append(QString::fromUtf8("最后通信时间:%1").arg(t2.toString("yyyy-MM-dd HH:mm:ss")));
  1004. emit CommData(DeviceID, 1, o_data);
  1005. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1006. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1007. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1008. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1009. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = t2.toTime_t();
  1010. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(t2.toTime_t()),0,0.0,0.0,"",t);
  1011. }
  1012. }
  1013. break;
  1014. case 25://设施物理状态报警记录
  1015. if(evt_len==9){
  1016. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1017. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1018. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1019. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1020. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1021. 0));
  1022. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1023. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1024. uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
  1025. uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
  1026. o_data = "";
  1027. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1028. o_data.append(QString::fromUtf8(" 设施物理状态报警记录 "));
  1029. if(sta==0x01)
  1030. o_data.append(QString::fromUtf8("开始"));
  1031. else
  1032. o_data.append(QString::fromUtf8("恢复"));
  1033. o_data.append(QString::fromUtf8(" 遥信点(设备)编号:%1").arg(arg1));
  1034. if(arg2==0x00)
  1035. o_data.append(QString::fromUtf8(" 遥信点类型:开关"));
  1036. else if(arg2==0x01)
  1037. o_data.append(QString::fromUtf8(" 遥信点类型:失电"));
  1038. else if(arg2==0x02)
  1039. o_data.append(QString::fromUtf8(" 遥信点类型:接触器状态"));
  1040. else if(arg2==0x03)
  1041. o_data.append(QString::fromUtf8(" 遥信点类型:节能档位状态"));
  1042. else if(arg2==0x04)
  1043. o_data.append(QString::fromUtf8(" 遥信点类型:中间继电器状态"));
  1044. else if(arg2==0x05)
  1045. o_data.append(QString::fromUtf8(" 遥信点类型:手自动切换"));
  1046. else if(arg2==0x06)
  1047. o_data.append(QString::fromUtf8(" 遥信点类型:门磁"));
  1048. else if(arg2==0x07)
  1049. o_data.append(QString::fromUtf8(" 遥信点类型:设施物理状态"));
  1050. o_data.append(QString::fromUtf8(" 设施状态:%1").arg(arg3));
  1051. emit CommData(DeviceID, 1, o_data);
  1052. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1053. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1054. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1055. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1056. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1057. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1058. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1059. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
  1060. }
  1061. }
  1062. break;
  1063. case 26://进线缺相事件记录
  1064. if(evt_len==7){
  1065. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1066. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1067. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1068. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1069. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1070. 0));
  1071. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1072. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1073. o_data = "";
  1074. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1075. o_data.append(QString::fromUtf8(" 进线缺相事件记录 "));
  1076. if(sta==0x01)
  1077. o_data.append(QString::fromUtf8("开始"));
  1078. else
  1079. o_data.append(QString::fromUtf8("恢复"));
  1080. o_data.append(QString::fromUtf8(" 第%1进线").arg(((arg1>>6)&0x03))+1);
  1081. if((arg1&0x08)){
  1082. if(arg1&0x01)
  1083. o_data.append(QString::fromUtf8(" A相正常"));
  1084. else
  1085. o_data.append(QString::fromUtf8(" A相缺相"));
  1086. }else{
  1087. o_data.append(QString::fromUtf8(" A相未接"));
  1088. }
  1089. if((arg1&0x10)){
  1090. if(arg1&0x02)
  1091. o_data.append(QString::fromUtf8(" B相正常"));
  1092. else
  1093. o_data.append(QString::fromUtf8(" B相缺相"));
  1094. }else{
  1095. o_data.append(QString::fromUtf8(" B相未接"));
  1096. }
  1097. if((arg1&0x20)){
  1098. if(arg1&0x04)
  1099. o_data.append(QString::fromUtf8(" C相正常"));
  1100. else
  1101. o_data.append(QString::fromUtf8(" C相缺相"));
  1102. }else{
  1103. o_data.append(QString::fromUtf8(" C相未接"));
  1104. }
  1105. emit CommData(DeviceID, 1, o_data);
  1106. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1107. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1108. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1109. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1110. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1111. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
  1112. }
  1113. }
  1114. break;
  1115. case 27://门磁状态变化事件
  1116. if(evt_len==7){
  1117. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1118. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1119. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1120. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1121. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1122. 0));
  1123. uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
  1124. uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
  1125. o_data = "";
  1126. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1127. o_data.append(QString::fromUtf8(" 门磁状态变化事件 "));
  1128. if((arg1==0x00)&&(arg2==0x00)){
  1129. o_data.append(QString::fromUtf8("门被关闭,告警解除"));
  1130. }else if((arg1==0x01)&&(arg2==0x01)){
  1131. o_data.append(QString::fromUtf8("门被打开,告警"));
  1132. }else if((arg1==0x02)&&(arg2==0x02)){
  1133. o_data.append(QString::fromUtf8("门被打开,正常"));
  1134. }
  1135. emit CommData(DeviceID, 1, o_data);
  1136. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1137. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1138. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1139. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1140. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1141. emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
  1142. }
  1143. }
  1144. break;
  1145. case 28://校时失败事件记录
  1146. case 29://校时成功事件记录
  1147. if(evt_len>=7){//结构有疑问,需要测试确认,yao
  1148. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1149. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1150. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1151. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1152. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1153. 0));
  1154. o_data = "";
  1155. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1156. if(err_code==28)
  1157. o_data.append(QString::fromUtf8(" 校时失败事件记录 "));
  1158. else if(err_code==29)
  1159. o_data.append(QString::fromUtf8(" 校时成功事件记录 "));
  1160. emit CommData(DeviceID, 1, o_data);
  1161. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1162. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1163. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1164. emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
  1165. }
  1166. }
  1167. break;
  1168. case 30://箱防雷失效事件
  1169. if(evt_len==6){
  1170. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1171. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1172. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1173. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1174. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1175. 0));
  1176. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1177. o_data = "";
  1178. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1179. o_data.append(QString::fromUtf8(" 箱防雷失效事件 "));
  1180. if(sta==0x01)
  1181. o_data.append(QString::fromUtf8("开始"));
  1182. else
  1183. o_data.append(QString::fromUtf8("恢复"));
  1184. emit CommData(DeviceID, 1, o_data);
  1185. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1186. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1187. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1188. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1189. emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
  1190. }
  1191. }
  1192. break;
  1193. case 33://回路切换事件记录
  1194. if(evt_len>=9){//结构有疑问,需要测试确认,yao
  1195. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1196. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1197. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1198. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1199. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1200. 0));
  1201. uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
  1202. uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
  1203. uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
  1204. int sta = (body.at(ud_cur+err_len+20)&0xff);
  1205. o_data = "";
  1206. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1207. o_data.append(QString::fromUtf8(" 回路切换事件记录 "));
  1208. if(sta==0x01)
  1209. o_data.append(QString::fromUtf8("计划自主操作"));
  1210. else if(sta==0x02)
  1211. o_data.append(QString::fromUtf8("应急操作"));
  1212. else if(sta==0x03)
  1213. o_data.append(QString::fromUtf8("根据光照度操作"));
  1214. emit CommData(DeviceID, 1, o_data);
  1215. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1216. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1217. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1218. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1219. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1220. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1221. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1222. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
  1223. }
  1224. }
  1225. break;
  1226. case 34://回路状态异常事件记录
  1227. if(evt_len>=9){//结构有疑问,需要测试确认,yao
  1228. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1229. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1230. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1231. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1232. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1233. 0));
  1234. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1235. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1236. uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
  1237. uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
  1238. o_data = "";
  1239. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1240. o_data.append(QString::fromUtf8(" 回路状态异常事件记录 "));
  1241. emit CommData(DeviceID, 1, o_data);
  1242. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1243. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1244. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1245. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1246. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1247. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1248. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1249. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
  1250. }
  1251. }
  1252. break;
  1253. case 35://出线状态异常事件记录
  1254. if(evt_len==10){
  1255. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1256. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1257. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1258. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1259. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1260. 0));
  1261. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1262. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1263. uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
  1264. uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
  1265. int value = (body.at(ud_cur+err_len+21)&0xff);
  1266. o_data = "";
  1267. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1268. o_data.append(QString::fromUtf8(" 出线状态异常事件记录 "));
  1269. if(sta==0x01)
  1270. o_data.append(QString::fromUtf8("开始"));
  1271. else
  1272. o_data.append(QString::fromUtf8("恢复"));
  1273. o_data.append(QString::fromUtf8(" 出线ID:%1 ").arg(arg1));
  1274. if(arg2==0x00)
  1275. o_data.append(QString::fromUtf8("相位:未知"));
  1276. else if(arg2==0x01)
  1277. o_data.append(QString::fromUtf8("相位:A相"));
  1278. else if(arg2==0x02)
  1279. o_data.append(QString::fromUtf8("相位:B相"));
  1280. else if(arg2==0x03)
  1281. o_data.append(QString::fromUtf8("相位:C相"));
  1282. o_data.append(QString::fromUtf8(" 隶属回路控制状态:%1").arg(arg3,8,2,QChar('0')));
  1283. o_data.append(QString::fromUtf8(" 出线当前状态:%1").arg(value,8,2,QChar('0')));
  1284. emit CommData(DeviceID, 1, o_data);
  1285. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1286. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1287. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1288. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1289. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1290. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1291. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1292. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = static_cast<float>(value);
  1293. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
  1294. }
  1295. }
  1296. break;
  1297. case 36://灯杆漏电事件记录
  1298. if(evt_len==12){
  1299. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1300. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1301. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1302. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1303. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1304. 0));
  1305. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1306. uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
  1307. float value = get_repValue(2,body.mid(20,2));
  1308. float v2 = get_repValue(1,body.mid(22,2));
  1309. o_data = "";
  1310. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1311. o_data.append(QString::fromUtf8(" 灯杆漏电事件记录 "));
  1312. if(sta==0x01)
  1313. o_data.append(QString::fromUtf8("开始"));
  1314. else
  1315. o_data.append(QString::fromUtf8("恢复"));
  1316. o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
  1317. o_data.append(QString::fromUtf8(" 漏电流:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
  1318. o_data.append(QString::fromUtf8(" 杆电压:%1V").arg(QString::number(static_cast<double>(v2),'g',3)));
  1319. emit CommData(DeviceID, 1, o_data);
  1320. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1321. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1322. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1323. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1324. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1325. slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
  1326. slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
  1327. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,value,v2,"",t);
  1328. }
  1329. }
  1330. break;
  1331. case 37://灯杆防雷器失效事件记录
  1332. if(evt_len==8){
  1333. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1334. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1335. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1336. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1337. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1338. 0));
  1339. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1340. uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
  1341. o_data = "";
  1342. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1343. o_data.append(QString::fromUtf8(" 灯杆防雷器失效事件记录 "));
  1344. if(sta==0x01)
  1345. o_data.append(QString::fromUtf8("开始"));
  1346. else
  1347. o_data.append(QString::fromUtf8("恢复"));
  1348. o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
  1349. emit CommData(DeviceID, 1, o_data);
  1350. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1351. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1352. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1353. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1354. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1355. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
  1356. }
  1357. }
  1358. break;
  1359. case 38://断线报警事件记录
  1360. if(evt_len==8){
  1361. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1362. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1363. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1364. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1365. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1366. 0));
  1367. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1368. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1369. uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
  1370. o_data = "";
  1371. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1372. o_data.append(QString::fromUtf8(" 断线报警事件记录 "));
  1373. if(sta==0x01)
  1374. o_data.append(QString::fromUtf8("开始"));
  1375. else
  1376. o_data.append(QString::fromUtf8("恢复"));
  1377. o_data.append(QString::fromUtf8(" 监测出线ID:%1 ").arg(arg1));
  1378. if(arg2==0x00)
  1379. o_data.append(QString::fromUtf8("正常"));
  1380. else if(arg2==0x01)
  1381. o_data.append(QString::fromUtf8("被盗"));
  1382. else if(arg2==0x02)
  1383. o_data.append(QString::fromUtf8("非法接入"));
  1384. emit CommData(DeviceID, 1, o_data);
  1385. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1386. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1387. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1388. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1389. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1390. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1391. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
  1392. }
  1393. }
  1394. break;
  1395. case 39://光感报警事件记录
  1396. if(evt_len==8){
  1397. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1398. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
  1399. (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
  1400. QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1401. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
  1402. 0));
  1403. int sta = (body.at(ud_cur+err_len+17)&0xff);
  1404. uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
  1405. uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
  1406. o_data = "";
  1407. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1408. o_data.append(QString::fromUtf8(" 光感报警事件记录 "));
  1409. if(sta==0x01)
  1410. o_data.append(QString::fromUtf8("开始"));
  1411. else
  1412. o_data.append(QString::fromUtf8("恢复"));
  1413. o_data.append(QString::fromUtf8("回路ID:%1 ").arg(arg1));
  1414. if(arg2==0x00)
  1415. o_data.append(QString::fromUtf8("光照度低于开灯光照度阈值"));
  1416. else if(arg2==0x01)
  1417. o_data.append(QString::fromUtf8("光照度高于开灯光照度阈值"));
  1418. emit CommData(DeviceID, 1, o_data);
  1419. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1420. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1421. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1422. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1423. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1424. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1425. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
  1426. }
  1427. }
  1428. break;
  1429. case 51://升级成功事件记录
  1430. if(evt_len==15){
  1431. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
  1432. (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1433. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
  1434. QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
  1435. (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1436. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
  1437. int sta = (body.at(ud_cur+err_len+18)&0xff);
  1438. uint arg1 = 0;
  1439. uint arg2 = 0;
  1440. uint arg3 = 0;
  1441. QString others = QString(body.mid(19,8));
  1442. QStringList vers = others.split(".");
  1443. if(vers.length()>0){
  1444. for(int v=0;v<vers.length();v++){
  1445. if(v==0)
  1446. arg1 = vers.at(v).toUInt();
  1447. else if(v==1)
  1448. arg2 = vers.at(v).toUInt();
  1449. else if(v==2)
  1450. arg3 = vers.at(v).toUInt();
  1451. else
  1452. break;
  1453. }
  1454. }
  1455. o_data = "";
  1456. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1457. o_data.append(QString::fromUtf8(" 升级成功事件记录 "));
  1458. if(sta==0x01)
  1459. o_data.append(QString::fromUtf8("升级失败"));
  1460. else
  1461. o_data.append(QString::fromUtf8("升级成功"));
  1462. o_data.append(QString::fromUtf8("版本号:%1").arg(others));
  1463. emit CommData(DeviceID, 1, o_data);
  1464. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1465. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1466. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1467. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1468. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1469. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1470. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1471. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,others,t);
  1472. }
  1473. }
  1474. break;
  1475. case 52://单灯状态变化记录
  1476. if(evt_len==20){
  1477. QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
  1478. (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
  1479. (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
  1480. QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
  1481. (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
  1482. (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
  1483. int sta = (body.at(ud_cur+err_len+18)&0xff);
  1484. uint arg1 = static_cast<uint>((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
  1485. uint arg2 = (body.at(ud_cur+err_len+21)&0xff);
  1486. uint arg3 = (body.at(ud_cur+err_len+22)&0xff);
  1487. float v1 = get_repValue(1,body.mid(23,2));
  1488. float v2 = get_repValue(2,body.mid(25,3));
  1489. float v3 = get_repValue(3,body.mid(28,2));
  1490. float v4 = get_repValue(5,body.mid(30,2));
  1491. o_data = "";
  1492. o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
  1493. o_data.append(QString::fromUtf8(" 单灯状态变化记录 "));
  1494. if(sta==0x01)
  1495. o_data.append(QString::fromUtf8("开始"));
  1496. else
  1497. o_data.append(QString::fromUtf8("恢复"));
  1498. o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
  1499. if(arg2==0)
  1500. o_data.append(QString::fromUtf8("开关灯状态:开"));
  1501. else if(arg2==1)
  1502. o_data.append(QString::fromUtf8("开关灯状态:关"));
  1503. else if(arg2==2){
  1504. o_data.append(QString::fromUtf8("开关灯状态:节能开关调档"));
  1505. o_data.append(QString::fromUtf8(" 节能档位:%1").arg(arg3));
  1506. }
  1507. o_data.append(QString::fromUtf8(" 电压:%1V").arg(QString::number(static_cast<double>(v1),'g',3)));
  1508. o_data.append(QString::fromUtf8(" 电流:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
  1509. o_data.append(QString::fromUtf8(" 有功功率:%1W/VAR").arg(QString::number(static_cast<double>(v3),'g',3)));
  1510. o_data.append(QString::fromUtf8(" 功率因素:%1%").arg(QString::number(static_cast<double>(v4),'g',3)));
  1511. emit CommData(DeviceID, 1, o_data);
  1512. if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
  1513. slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
  1514. slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
  1515. slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
  1516. slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
  1517. slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
  1518. slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
  1519. emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),v1,v2,
  1520. QString("%1,%2").arg(QString::number(static_cast<double>(v3),'g',3)).arg(QString::number(static_cast<double>(v4),'g',3)),t);
  1521. }
  1522. }
  1523. break;
  1524. }
  1525. err_len += (2+evt_len);
  1526. }else
  1527. break;
  1528. }else
  1529. break;
  1530. }
  1531. }
  1532. }else if(f_fno==2){//一般事件
  1533. }
  1534. }
  1535. break;
  1536. case 0x10://数据转发
  1537. break;
  1538. }
  1539. return true;
  1540. }
  1541. void SmartLightCommThread::check_idx()
  1542. {
  1543. quint8 idhash = 0x00;
  1544. char *deviceid = DeviceID.toLocal8Bit().data();
  1545. for(int i=0;i<strlen(deviceid);i++){
  1546. idhash = (idhash+deviceid[i]&0xff)&0xff;
  1547. }
  1548. for(int i=0;i<DevNum;i++){
  1549. if(slShm->smartLightList[i].Enabled==0x01){
  1550. if(idhash==slShm->smartLightList[i].LightCodeHash){
  1551. if(strcmp(deviceid,slShm->smartLightList[i].LigthCode)==0){
  1552. idx = i;
  1553. return;
  1554. }
  1555. }
  1556. }else{
  1557. idx = i;
  1558. sprintf(slShm->smartLightList[i].LigthCode,"%s",deviceid);
  1559. slShm->smartLightList[i].Enabled=0x01;
  1560. emit getNewDev(DeviceID);
  1561. return;
  1562. }
  1563. }
  1564. }
  1565. bool SmartLightCommThread::checkDataFrame(QTcpSocket *so, QByteArray dat)
  1566. {
  1567. int Len[2];
  1568. int len = dat.length();
  1569. if(((dat.at(0)&0xff)==0x68)&&((dat.at(5)&0xff)==0x68)&&((dat.at(len-1)&0xff)==0x16)){
  1570. Len[0] = (dat.at(1)&0x00ff)|((dat.at(2)&0x00ff)<<8);
  1571. Len[1] = (dat.at(3)&0x00ff)|((dat.at(4)&0x00ff)<<8);
  1572. if(Len[0]==Len[1]){
  1573. if(dat.length()==(Len[0]+9)){
  1574. quint16 crc = chk_crcc(dat.mid(6,Len[0]),Len[0]);
  1575. if(((dat.at(len-3)&0xff)==(crc&0xff))&&((dat.at(len-2)&0xff)==((crc>>8)&0xff))){
  1576. if(DevType<0){
  1577. DevType = dat.at(13)&0xff;
  1578. quint32 deviceId = 0;
  1579. for(int i=12;i>5;i--){
  1580. if((((dat.at(i)>>4)&0x0f)<10)&&((dat.at(i)&0x0f)<10)){
  1581. deviceId = deviceId*100+((dat.at(i)>>4)&0x0f)*10+(dat.at(i)&0x0f);
  1582. }else
  1583. return false;
  1584. }
  1585. DeviceID = QString("%1").arg(deviceId,14,10,QChar('0'));
  1586. }
  1587. if(DeviceID.length()==14){
  1588. if(idx<0)
  1589. check_idx();
  1590. return checkDataBody(so,dat.mid(6,Len[0]));
  1591. }
  1592. return false;
  1593. }
  1594. }
  1595. }
  1596. }
  1597. return false;
  1598. }
  1599. void SmartLightCommThread::readData(QTcpSocket *so){
  1600. QByteArray data = so->readAll();
  1601. QString Data = QString("[ %1 %2 %3 <<< ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
  1602. .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
  1603. for(int i=0;i<data.length();i++){
  1604. Data.append(QString(" %1").arg(data.at(i)&0xff,2,16,QChar('0')));
  1605. }
  1606. emit CommData(DeviceID, 1, Data);
  1607. bool data_ok = checkDataFrame(so, data);
  1608. }
  1609. void SmartLightCommThread::close_self(QTcpSocket *so)
  1610. {
  1611. so->abort();
  1612. keepcomm = false;
  1613. }
  1614. void SmartLightCommThread::stop()
  1615. {
  1616. keepcomm = false;
  1617. }