Module_PhBackend.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456
  1. /*
  2. * Module_PhBackend.c
  3. *
  4. * Created on: 2020/06/11
  5. * Author: foluswen
  6. */
  7. #include "Module_PhBackend.h"
  8. int StoreLogMsg(const char *fmt, ...)
  9. {
  10. char Buf[4096+256];
  11. char buffer[4096];
  12. time_t CurrentTime;
  13. struct tm *tm;
  14. va_list args;
  15. va_start(args, fmt);
  16. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  17. va_end(args);
  18. memset(Buf,0,sizeof(Buf));
  19. CurrentTime = time(NULL);
  20. tm=localtime(&CurrentTime);
  21. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]Module_PhBackend",
  22. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  23. buffer,
  24. tm->tm_year+1900,tm->tm_mon+1);
  25. #ifdef SystemLogMessage
  26. system(Buf);
  27. #endif
  28. #ifdef ConsloePrintLog
  29. printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
  30. #endif
  31. return rc;
  32. }
  33. uint8_t split(char *src, const char *separator, char **dest)
  34. {
  35. char *pNext;
  36. int count = 0;
  37. if (src == NULL || strlen(src) == 0)
  38. return count;
  39. if (separator == NULL || strlen(separator) == 0)
  40. return count;
  41. pNext = (char *)strtok(src,separator);
  42. while(pNext != NULL)
  43. {
  44. *dest++ = pNext;
  45. ++count;
  46. pNext = (char *)strtok(NULL,separator);
  47. }
  48. return count;
  49. }
  50. //==========================================
  51. // Init all share memory
  52. //==========================================
  53. int InitShareMemory()
  54. {
  55. int result = PASS;
  56. int MeterSMId;
  57. //creat ShmSysConfigAndInfo
  58. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  59. {
  60. #ifdef SystemLogMessage
  61. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  62. #endif
  63. result = FAIL;
  64. }
  65. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  66. {
  67. #ifdef SystemLogMessage
  68. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  69. #endif
  70. result = FAIL;
  71. }
  72. else
  73. {}
  74. //creat ShmStatusCodeData
  75. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  76. {
  77. #ifdef SystemLogMessage
  78. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  79. #endif
  80. result = FAIL;
  81. }
  82. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  83. {
  84. #ifdef SystemLogMessage
  85. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  86. #endif
  87. result = FAIL;
  88. }
  89. else
  90. {}
  91. return result;
  92. }
  93. uint8_t checksum_valid(struct Message *message)
  94. {
  95. uint8_t chksum = 0;
  96. for(uint16_t idx=6;idx<(message->buffer[2] | ((uint16_t)message->buffer[3]<<8));idx++)
  97. chksum += message->buffer[idx];
  98. chksum += 11;
  99. return ((chksum&0xff)==message->buffer[(message->buffer[2] | ((uint16_t)message->buffer[3]<<8))-1]?PASS:FAIL);
  100. }
  101. uint8_t checksum_cal(struct Message *message)
  102. {
  103. uint8_t chksum = 0;
  104. for(uint16_t idx=6;idx<(message->size-1);idx++)
  105. chksum += message->buffer[idx];
  106. chksum += 11;
  107. return (chksum & 0xff);
  108. }
  109. void showCmdRaw(struct Message *message, uint8_t isTx)
  110. {
  111. if(isTx)
  112. DEBUG_INFO("%s -----> Server\n", ShmSysConfigAndInfo->SysConfig.SystemId);
  113. else
  114. DEBUG_INFO("%s <----- Server\n", ShmSysConfigAndInfo->SysConfig.SystemId);
  115. DEBUG_INFO("- CMD_%04d ------------------------------------\n", (message->buffer[6] | ((uint16_t)message->buffer[7]<<8)));
  116. DEBUG_INFO("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
  117. DEBUG_INFO("-----------------------------------------------\n");
  118. for(uint8_t idx=0;idx<((message->size/16)+1);idx++)
  119. {
  120. DEBUG_INFO("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", message->buffer[idx*16+0],
  121. message->buffer[idx*16+1],
  122. message->buffer[idx*16+2],
  123. message->buffer[idx*16+3],
  124. message->buffer[idx*16+4],
  125. message->buffer[idx*16+5],
  126. message->buffer[idx*16+6],
  127. message->buffer[idx*16+7],
  128. message->buffer[idx*16+8],
  129. message->buffer[idx*16+9],
  130. message->buffer[idx*16+10],
  131. message->buffer[idx*16+11],
  132. message->buffer[idx*16+12],
  133. message->buffer[idx*16+13],
  134. message->buffer[idx*16+14],
  135. message->buffer[idx*16+15]);
  136. }
  137. DEBUG_INFO("-----------------------------------------------\n");
  138. }
  139. void handle_cmd_1001(struct Message *in, struct Message *out)
  140. {
  141. uint32_t startAddr;
  142. uint32_t offset = 0;
  143. uint8_t count;
  144. uint32_t value;
  145. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  146. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  147. if(in->buffer[12])
  148. DEBUG_INFO("CMD Type: Set\n");
  149. else
  150. DEBUG_INFO("CMD Type: Query\n");
  151. startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
  152. count = in->buffer[17];
  153. if(in->buffer[12])
  154. {
  155. for(int idx=startAddr;idx<(startAddr+count);idx++)
  156. {
  157. value = in->buffer[20+(offset*4)] | ((uint32_t)in->buffer[21+(offset*4)]<<8) | ((uint32_t)in->buffer[22+(offset*4)]<<16) | ((uint32_t)in->buffer[23+(offset*4)]<<24);
  158. switch(idx)
  159. {
  160. case 1:
  161. DEBUG_INFO("Sign in interval: %d\n", value);
  162. offset++;
  163. break;
  164. case 2:
  165. DEBUG_INFO("Charger type: %d\n", value);
  166. offset++;
  167. break;
  168. case 3:
  169. DEBUG_INFO("Charger gun count: %d\n", value);
  170. offset++;
  171. break;
  172. case 4:
  173. DEBUG_INFO("Communication No: %d\n", value);
  174. offset++;
  175. break;
  176. case 5:
  177. offset++;
  178. break;
  179. case 6:
  180. offset++;
  181. break;
  182. case 7:
  183. offset++;
  184. break;
  185. case 8:
  186. offset++;
  187. break;
  188. case 9:
  189. offset++;
  190. break;
  191. case 10:
  192. offset++;
  193. break;
  194. case 11:
  195. offset++;
  196. break;
  197. case 12:
  198. offset++;
  199. break;
  200. case 13:
  201. offset++;
  202. break;
  203. case 14:
  204. offset++;
  205. break;
  206. case 15:
  207. offset++;
  208. break;
  209. case 16:
  210. offset++;
  211. break;
  212. case 17:
  213. offset++;
  214. break;
  215. case 18:
  216. offset++;
  217. break;
  218. case 19:
  219. offset++;
  220. break;
  221. case 20:
  222. DEBUG_INFO("Report interval: %d\n", value);
  223. offset++;
  224. break;
  225. case 21:
  226. DEBUG_INFO("Heart beat interval: %d\n", value);
  227. backend_info.interval_heartbeat = value;
  228. offset++;
  229. break;
  230. case 22:
  231. DEBUG_INFO("Heart beat overtime count: %d\n", value);
  232. backend_info.retry_heartbeat = value;
  233. offset++;
  234. break;
  235. case 23:
  236. DEBUG_INFO("Status report interval: %d\n", value);
  237. offset++;
  238. break;
  239. case 24:
  240. offset++;
  241. break;
  242. case 25:
  243. offset++;
  244. break;
  245. case 26:
  246. offset++;
  247. break;
  248. case 27:
  249. DEBUG_INFO("Service price: %.2f\n", (value/100.0));
  250. offset++;
  251. break;
  252. case 28:
  253. DEBUG_INFO("Charging price: %.2f\n", (value/100.0));
  254. offset++;
  255. break;
  256. case 29:
  257. offset++;
  258. break;
  259. case 30:
  260. offset++;
  261. break;
  262. case 31:
  263. offset++;
  264. break;
  265. case 32:
  266. offset++;
  267. break;
  268. case 33:
  269. offset++;
  270. break;
  271. case 34:
  272. offset++;
  273. break;
  274. case 35:
  275. offset++;
  276. break;
  277. }
  278. }
  279. }
  280. create_Cmd_1002(out, in->buffer[12], startAddr, count);
  281. }
  282. void handle_cmd_1003(struct Message *in, struct Message *out)
  283. {
  284. uint32_t startAddr;
  285. uint8_t data[in->size-11-9];
  286. uint8_t *server_info[3];
  287. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  288. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  289. if(in->buffer[12])
  290. DEBUG_INFO("CMD Type: Set\n");
  291. else
  292. DEBUG_INFO("CMD Type: Query\n");
  293. startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
  294. memcpy(&data[0], &in->buffer[19], ARRAY_SIZE(data));
  295. switch(startAddr)
  296. {
  297. case 1:
  298. break;
  299. case 2:
  300. DEBUG_INFO("Server time: %02X%02X-%02X-%02X %02X:%02X:%02X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
  301. break;
  302. case 3:
  303. break;
  304. case 4:
  305. break;
  306. case 5:
  307. break;
  308. case 6:
  309. break;
  310. case 7:
  311. break;
  312. case 8:
  313. break;
  314. case 9:
  315. break;
  316. case 10:
  317. break;
  318. case 11:
  319. memset(server_addr, 0x00, ARRAY_SIZE(server_addr));
  320. memcpy(&server_addr[0], &in->buffer[19], 128);
  321. split((char*)server_addr, ":", (char**)server_info);
  322. message_header = strtol((char*)server_info[2], NULL, 16);
  323. server_port = atoi((char*)server_info[1]);
  324. sprintf((char*)server_addr, "%s", (char*)server_info[0]);
  325. DEBUG_INFO("Server address: %s\n", server_addr);
  326. DEBUG_INFO("Server port: %d\n", server_port);
  327. DEBUG_INFO("Message header: %04X\n", message_header);
  328. break;
  329. case 12:
  330. DEBUG_INFO("Customer ID: %s\n", data);
  331. break;
  332. }
  333. create_Cmd_1004(out, in->buffer[12], startAddr, &data[0], ARRAY_SIZE(data));
  334. }
  335. void handle_cmd_1005(struct Message *in, struct Message *out)
  336. {
  337. uint32_t startAddr;
  338. uint32_t offset = 0;
  339. uint8_t count;
  340. uint32_t value;
  341. uint8_t gun_index;
  342. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  343. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  344. gun_index = in->buffer[12];
  345. startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
  346. count = in->buffer[17];
  347. for(int idx=startAddr;idx<(startAddr+count);idx++)
  348. {
  349. value = in->buffer[20+(offset*4)] | ((uint32_t)in->buffer[21+(offset*4)]<<8) | ((uint32_t)in->buffer[22+(offset*4)]<<16) | ((uint32_t)in->buffer[23+(offset*4)]<<24);
  350. switch(idx)
  351. {
  352. case 1:
  353. if(value == 0x55)
  354. {
  355. DEBUG_INFO("Charger start.\n");
  356. }
  357. offset++;
  358. break;
  359. case 2:
  360. if(value == 0x55)
  361. {
  362. DEBUG_INFO("Charger stop.\n");
  363. }
  364. offset++;
  365. break;
  366. case 3:
  367. if(value == 0)
  368. {
  369. DEBUG_INFO("Charge soon.\n");
  370. }
  371. else if(value ==1)
  372. {
  373. DEBUG_INFO("Charge reserve.\n");
  374. }
  375. offset++;
  376. break;
  377. case 4:
  378. if(value == 0x55)
  379. {
  380. }
  381. offset++;
  382. break;
  383. case 5:
  384. if(value == 0x55)
  385. {
  386. }
  387. offset++;
  388. break;
  389. case 6:
  390. if(value == 0x55)
  391. {
  392. }
  393. offset++;
  394. break;
  395. case 7:
  396. if(value == 0x55)
  397. {
  398. }
  399. offset++;
  400. break;
  401. case 8:
  402. if(value == 0x55)
  403. {
  404. }
  405. offset++;
  406. break;
  407. case 9:
  408. if(value == 0x55)
  409. {
  410. }
  411. offset++;
  412. break;
  413. case 10:
  414. if(value == 0x55)
  415. {
  416. }
  417. offset++;
  418. break;
  419. case 11:
  420. if(value == 0x55)
  421. {
  422. }
  423. offset++;
  424. break;
  425. case 12:
  426. if(value == 0x55)
  427. {
  428. }
  429. offset++;
  430. break;
  431. case 13:
  432. if(value == 0x55)
  433. {
  434. }
  435. offset++;
  436. break;
  437. case 14:
  438. if(value == 0x55)
  439. {
  440. }
  441. offset++;
  442. break;
  443. case 15:
  444. if(value == 0x55)
  445. {
  446. }
  447. offset++;
  448. break;
  449. case 16:
  450. if(value == 0x55)
  451. {
  452. }
  453. offset++;
  454. break;
  455. case 17:
  456. if(value == 0x55)
  457. {
  458. DEBUG_INFO("Upload log request.\n");
  459. system("/usr/bin/run_tmate_restart.sh");
  460. }
  461. offset++;
  462. break;
  463. case 18:
  464. if(value == 0x55)
  465. {
  466. }
  467. offset++;
  468. break;
  469. case 19:
  470. if(value == 0x55)
  471. {
  472. }
  473. offset++;
  474. break;
  475. case 20:
  476. if(value == 0x55)
  477. {
  478. }
  479. offset++;
  480. break;
  481. }
  482. }
  483. create_Cmd_1006(out, gun_index, startAddr, count, true);
  484. }
  485. void handle_cmd_1101(struct Message *in)
  486. {
  487. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  488. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  489. backend_info.sn_heartbeat = (in->buffer[12] | ((uint16_t)in->buffer[13]<<8));
  490. backend_info.counter_heartbeat_retry = 0;
  491. }
  492. void handle_cmd_1103(struct Message *in)
  493. {
  494. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  495. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  496. DEBUG_INFO("Connector id: %d\n", in->buffer[12]);
  497. }
  498. void handle_cmd_1105(struct Message *in)
  499. {
  500. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  501. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  502. DEBUG_INFO("Charger sign in OK.\n");
  503. backend_info.isSignin = ON;
  504. backend_info.st_hearbeat = time((time_t*)NULL);
  505. backend_info.counter_heartbeat_retry = 0;
  506. backend_info.interval_heartbeat = 10;
  507. }
  508. void handle_cmd_2303(struct Message *in, struct Message *out)
  509. {
  510. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  511. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  512. create_Cmd_2304(out);
  513. }
  514. void handle_cmd_2305(struct Message *in, struct Message *out)
  515. {
  516. DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
  517. DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
  518. create_Cmd_2306(out);
  519. }
  520. void create_Cmd_1002(struct Message *out, uint8_t cmd_type, uint32_t address, uint32_t count)
  521. {
  522. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  523. out->size = 9 + 43 + (count*4);
  524. // Message header
  525. out->buffer[0x00] = (message_header>>8) & 0xff;
  526. out->buffer[0x01] = (message_header>>0) & 0xff;
  527. // Message length
  528. out->buffer[0x02] = (out->size>>0) & 0xff;
  529. out->buffer[0x03] = (out->size>>8) & 0xff;
  530. // Message protocol version
  531. out->buffer[0x04] = PROTOCOL_VER;
  532. // Message server command serial number
  533. out->buffer[0x05] = server_cmd_sn & 0xff;
  534. // Message command
  535. out->buffer[0x06] = (1002>>0) & 0xff;
  536. out->buffer[0x07] = (1002>>8) & 0xff;
  537. // Message user id
  538. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  539. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  540. // Message server command serial number
  541. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  542. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  543. // Charger ID
  544. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);
  545. // Command type (0:Check 1:Set)
  546. out->buffer[0x2c] = cmd_type;
  547. // Start adress
  548. out->buffer[0x2d] = (address>>0) & 0xff;
  549. out->buffer[0x2e] = (address>>8) & 0xff;
  550. out->buffer[0x2f] = (address>>16) & 0xff;
  551. out->buffer[0x30] = (address>>24) & 0xff;
  552. // Count
  553. out->buffer[0x31] = count;
  554. // Result (0:Success 1:Fail)
  555. out->buffer[0x31] = 0x00;
  556. memset(&out->buffer[0x32], 0x00, (count*4));
  557. // Checksum
  558. out->buffer[out->size-1] = checksum_cal(out);
  559. showCmdRaw(out, true);
  560. }
  561. void create_Cmd_1004(struct Message *out, uint8_t cmd_type, uint32_t address, uint8_t *data, uint8_t data_len)
  562. {
  563. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  564. out->size = 9 + 42 + data_len;
  565. // Message header
  566. out->buffer[0x00] = (message_header>>8) & 0xff;
  567. out->buffer[0x01] = (message_header>>0) & 0xff;
  568. // Message length
  569. out->buffer[0x02] = (out->size>>0) & 0xff;
  570. out->buffer[0x03] = (out->size>>8) & 0xff;
  571. // Message protocol version
  572. out->buffer[0x04] = PROTOCOL_VER;
  573. // Message server command serial number
  574. out->buffer[0x05] = server_cmd_sn & 0xff;
  575. // Message command
  576. out->buffer[0x06] = (1004>>0) & 0xff;
  577. out->buffer[0x07] = (1004>>8) & 0xff;
  578. // Message user id
  579. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  580. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  581. // Message server command serial number
  582. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  583. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  584. // Charger ID
  585. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);
  586. // Command type (0:Check 1:Set)
  587. out->buffer[0x2c] = cmd_type;
  588. // Start adress
  589. out->buffer[0x2d] = (address>>0) & 0xff;
  590. out->buffer[0x2e] = (address>>8) & 0xff;
  591. out->buffer[0x2f] = (address>>16) & 0xff;
  592. out->buffer[0x30] = (address>>24) & 0xff;
  593. // Result (0:Success 1:Fail)
  594. out->buffer[0x31] = 0x00;
  595. // Result data
  596. memcpy(&out->buffer[0x32], &data[0], data_len);
  597. // Checksum
  598. out->buffer[out->size-1] = checksum_cal(out);
  599. showCmdRaw(out, true);
  600. }
  601. void create_Cmd_1006(struct Message *out, uint8_t gun_index, uint32_t address, uint8_t count, uint8_t isExecuted)
  602. {
  603. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  604. out->size = 0x34;
  605. // Message header
  606. out->buffer[0x00] = (message_header>>8) & 0xff;
  607. out->buffer[0x01] = (message_header>>0) & 0xff;
  608. // Message length
  609. out->buffer[0x02] = (out->size>>0) & 0xff;
  610. out->buffer[0x03] = (out->size>>8) & 0xff;
  611. // Message protocol version
  612. out->buffer[0x04] = PROTOCOL_VER;
  613. // Message server command serial number
  614. out->buffer[0x05] = server_cmd_sn & 0xff;
  615. // Message command
  616. out->buffer[0x06] = (1006>>0) & 0xff;
  617. out->buffer[0x07] = (1006>>8) & 0xff;
  618. // Message user id
  619. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  620. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  621. // Message server command serial number
  622. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  623. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  624. // Charger ID
  625. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);
  626. // Gun index
  627. out->buffer[0x2c] = gun_index;
  628. // Start adress
  629. out->buffer[0x2d] = (address>>0) & 0xff;
  630. out->buffer[0x2e] = (address>>8) & 0xff;
  631. out->buffer[0x2f] = (address>>16) & 0xff;
  632. out->buffer[0x30] = (address>>24) & 0xff;
  633. // Command count
  634. out->buffer[0x31] = count;
  635. // Command execute result;
  636. out->buffer[0x32] = isExecuted;
  637. // Checksum
  638. out->buffer[out->size-1] = checksum_cal(out);
  639. showCmdRaw(out, true);
  640. }
  641. void create_Cmd_1102(struct Message *out)
  642. {
  643. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  644. out->size = 0x2f;
  645. // Message header
  646. out->buffer[0x00] = (message_header>>8) & 0xff;
  647. out->buffer[0x01] = (message_header>>0) & 0xff;
  648. // Message length
  649. out->buffer[0x02] = (out->size>>0) & 0xff;
  650. out->buffer[0x03] = (out->size>>8) & 0xff;
  651. // Message protocol version
  652. out->buffer[0x04] = PROTOCOL_VER;
  653. // Message server command serial number
  654. out->buffer[0x05] = server_cmd_sn & 0xff;
  655. // Message command
  656. out->buffer[0x06] = (1102>>0) & 0xff;
  657. out->buffer[0x07] = (1102>>8) & 0xff;
  658. // Message user id
  659. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  660. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  661. // Message server command serial number
  662. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  663. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  664. // Charger ID
  665. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);
  666. // Heart beat sn
  667. out->buffer[0x2c] = (backend_info.sn_heartbeat>>0) & 0xff;
  668. out->buffer[0x2d] = (backend_info.sn_heartbeat>>8) & 0xff;
  669. // Checksum
  670. out->buffer[out->size-1] = checksum_cal(out);
  671. showCmdRaw(out, true);
  672. }
  673. void create_Cmd_1104(struct Message *out, uint8_t gun_index)
  674. {
  675. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  676. out->size = 0xd7;
  677. // Message header
  678. out->buffer[0x00] = (message_header>>8) & 0xff;
  679. out->buffer[0x01] = (message_header>>0) & 0xff;
  680. // Message length
  681. out->buffer[0x02] = (out->size>>0) & 0xff;
  682. out->buffer[0x03] = (out->size>>8) & 0xff;
  683. // Message protocol version
  684. out->buffer[0x04] = PROTOCOL_VER;
  685. // Message server command serial number
  686. out->buffer[0x05] = server_cmd_sn & 0xff;
  687. // Message command
  688. out->buffer[0x06] = (1102>>0) & 0xff;
  689. out->buffer[0x07] = (1102>>8) & 0xff;
  690. // Message user id
  691. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  692. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  693. // Message server command serial number
  694. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  695. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  696. // Charger ID
  697. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 0x20);
  698. // Charger connector quantity
  699. out->buffer[0x2c] = AC_QUANTITY + CCS_QUANTITY + GB_QUANTITY + CHAdeMO_QUANTITY;
  700. // Connector id
  701. out->buffer[0x2d] = gun_index;
  702. // Charger model type (1: DC, 2: AC)
  703. out->buffer[0x2e] = (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'?1:2);
  704. // Connector status
  705. switch(ShmSysConfigAndInfo->SysConfig.ModelName[7+gun_index])
  706. {
  707. case '1' ... '9':
  708. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_UPDATE))
  709. out->buffer[0x2f] = 7;
  710. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_IDLE)
  711. out->buffer[0x2f] = 0;
  712. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_PREPARING))
  713. out->buffer[0x2f] = 1;
  714. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_TERMINATING))
  715. out->buffer[0x2f] = 2;
  716. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_COMPLETE)
  717. out->buffer[0x2f] = 3;
  718. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_FAULT))
  719. out->buffer[0x2f] = 6;
  720. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[9-gun_index].SystemStatus == SYS_MODE_RESERVATION)
  721. out->buffer[0x2f] = 5;
  722. else
  723. out->buffer[0x2f] = 0;
  724. break;
  725. case 'J':
  726. if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_UPDATE))
  727. out->buffer[0x2f] = 7;
  728. else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_IDLE)
  729. out->buffer[0x2f] = 0;
  730. else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARING))
  731. out->buffer[0x2f] = 1;
  732. else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_TERMINATING))
  733. out->buffer[0x2f] = 2;
  734. else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_COMPLETE)
  735. out->buffer[0x2f] = 3;
  736. else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_FAULT))
  737. out->buffer[0x2f] = 6;
  738. else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[7+gun_index].SystemStatus == SYS_MODE_RESERVATION)
  739. out->buffer[0x2f] = 5;
  740. else
  741. out->buffer[0x2f] = 0;
  742. break;
  743. case 'U':
  744. case 'E':
  745. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_UPDATE))
  746. out->buffer[0x2f] = 7;
  747. else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_IDLE)
  748. out->buffer[0x2f] = 0;
  749. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARING))
  750. out->buffer[0x2f] = 1;
  751. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_TERMINATING))
  752. out->buffer[0x2f] = 2;
  753. else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_COMPLETE)
  754. out->buffer[0x2f] = 3;
  755. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_FAULT))
  756. out->buffer[0x2f] = 6;
  757. else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[7+gun_index].SystemStatus == SYS_MODE_RESERVATION)
  758. out->buffer[0x2f] = 5;
  759. else
  760. out->buffer[0x2f] = 0;
  761. break;
  762. case 'G':
  763. if((ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_UPDATE))
  764. out->buffer[0x2f] = 7;
  765. else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_IDLE)
  766. out->buffer[0x2f] = 0;
  767. else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARING))
  768. out->buffer[0x2f] = 1;
  769. else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_TERMINATING))
  770. out->buffer[0x2f] = 2;
  771. else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_COMPLETE)
  772. out->buffer[0x2f] = 3;
  773. else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_FAULT))
  774. out->buffer[0x2f] = 6;
  775. else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[7+gun_index].SystemStatus == SYS_MODE_RESERVATION)
  776. out->buffer[0x2f] = 5;
  777. else
  778. out->buffer[0x2f] = 0;
  779. break;
  780. default:
  781. break;
  782. }
  783. // SOC
  784. out->buffer[0x30] = 0x00;
  785. // Alarm code
  786. out->buffer[0x31] = 0x00;
  787. out->buffer[0x32] = 0x00;
  788. out->buffer[0x33] = 0x00;
  789. out->buffer[0x34] = 0x00;
  790. // Connect status
  791. out->buffer[0x35] = 0x00;
  792. // Charging amount
  793. out->buffer[0x36] = 0x00;
  794. out->buffer[0x37] = 0x00;
  795. out->buffer[0x38] = 0x00;
  796. out->buffer[0x39] = 0x00;
  797. // Charging temperature
  798. out->buffer[0x3a] = 0x00;
  799. out->buffer[0x3b] = 0x00;
  800. out->buffer[0x3c] = 0x00;
  801. out->buffer[0x3d] = 0x00;
  802. // Total power consumption
  803. out->buffer[0x3e] = 0x00;
  804. out->buffer[0x3f] = 0x00;
  805. out->buffer[0x40] = 0x00;
  806. out->buffer[0x41] = 0x00;
  807. // DC voltage
  808. out->buffer[0x42] = 0x00;
  809. out->buffer[0x43] = 0x00;
  810. // DC current
  811. out->buffer[0x44] = 0x00;
  812. out->buffer[0x45] = 0x00;
  813. // BMS voltage request
  814. out->buffer[0x46] = 0x00;
  815. out->buffer[0x47] = 0x00;
  816. // BMS current request
  817. out->buffer[0x48] = 0x00;
  818. out->buffer[0x49] = 0x00;
  819. // BMS charging mode
  820. out->buffer[0x4a] = 0x00;
  821. // AC L1 voltage
  822. out->buffer[0x4b] = 0x00;
  823. out->buffer[0x4c] = 0x00;
  824. // AC L2 voltage
  825. out->buffer[0x4d] = 0x00;
  826. out->buffer[0x4e] = 0x00;
  827. // AC L3 voltage
  828. out->buffer[0x4f] = 0x00;
  829. out->buffer[0x50] = 0x00;
  830. // AC L1 current
  831. out->buffer[0x51] = 0x00;
  832. out->buffer[0x52] = 0x00;
  833. // AC L2 current
  834. out->buffer[0x53] = 0x00;
  835. out->buffer[0x54] = 0x00;
  836. // AC L3 current
  837. out->buffer[0x55] = 0x00;
  838. out->buffer[0x56] = 0x00;
  839. // Charging remind time
  840. out->buffer[0x57] = 0x00;
  841. out->buffer[0x58] = 0x00;
  842. // Charging time
  843. out->buffer[0x59] = 0x00;
  844. out->buffer[0x5a] = 0x00;
  845. out->buffer[0x5b] = 0x00;
  846. out->buffer[0x5c] = 0x00;
  847. // Charging power consumption
  848. out->buffer[0x5d] = 0x00;
  849. out->buffer[0x5e] = 0x00;
  850. out->buffer[0x5f] = 0x00;
  851. out->buffer[0x60] = 0x00;
  852. // Before charging meter value
  853. out->buffer[0x61] = 0x00;
  854. out->buffer[0x62] = 0x00;
  855. out->buffer[0x63] = 0x00;
  856. out->buffer[0x64] = 0x00;
  857. // After charging meter value
  858. out->buffer[0x65] = 0x00;
  859. out->buffer[0x66] = 0x00;
  860. out->buffer[0x67] = 0x00;
  861. out->buffer[0x68] = 0x00;
  862. // Start method
  863. out->buffer[0x69] = 0x00;
  864. // Charging strategy
  865. out->buffer[0x6a] = 0x00;
  866. // Charging parameter
  867. out->buffer[0x6b] = 0x00;
  868. out->buffer[0x6c] = 0x00;
  869. out->buffer[0x6d] = 0x00;
  870. out->buffer[0x6e] = 0x00;
  871. // Reservation flag
  872. out->buffer[0x6f] = 0x00;
  873. // User
  874. memset(&out->buffer[0x70], 0x00, 0x24);
  875. // Reservation over time
  876. out->buffer[0x94] = 0x00;
  877. // Start time
  878. memset(&out->buffer[0x95], 0x00, 0x08);
  879. // Surplus
  880. memset(&out->buffer[0x9d], 0x00, 0x04);
  881. // System variable reserve
  882. memset(&out->buffer[0xa1], 0x00, 0x14);
  883. // RFID/Member flag
  884. out->buffer[0xb5] = 0x00;
  885. // Order No.
  886. memset(&out->buffer[0xb6], 0x00, 0x20);
  887. // SN
  888. memset(&out->buffer[0xd6], 0x00, 0x10);
  889. // Checksum
  890. out->buffer[out->size-1] = checksum_cal(out);
  891. showCmdRaw(out, true);
  892. }
  893. void create_Cmd_1106(struct Message *out)
  894. {
  895. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  896. out->size = 0x63;
  897. // Message header
  898. out->buffer[0x00] = (message_header>>8) & 0xff;
  899. out->buffer[0x01] = (message_header>>0) & 0xff;
  900. // Message length
  901. out->buffer[0x02] = (out->size>>0) & 0xff;
  902. out->buffer[0x03] = (out->size>>8) & 0xff;
  903. // Message protocol version
  904. out->buffer[0x04] = PROTOCOL_VER;
  905. // Message server command serial number
  906. out->buffer[0x05] = server_cmd_sn & 0xff;
  907. // Message command
  908. out->buffer[0x06] = (1106>>0) & 0xff;
  909. out->buffer[0x07] = (1106>>8) & 0xff;
  910. // Message user id
  911. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  912. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  913. // Message server command serial number
  914. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  915. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  916. // Charger ID
  917. memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);
  918. // Charger type (0:Normal 1:none polar 2:polling)
  919. out->buffer[0x2c] = 0x00;
  920. // Software version
  921. out->buffer[0x2d] = 0x01;
  922. out->buffer[0x2e] = 0x00;
  923. out->buffer[0x2f] = 0x00;
  924. out->buffer[0x30] = 0x00;
  925. // Charger item type
  926. out->buffer[0x31] = 0x00;
  927. out->buffer[0x32] = 0x00;
  928. // Start count
  929. out->buffer[0x33] = 0x00;
  930. out->buffer[0x34] = 0x00;
  931. out->buffer[0x35] = 0x00;
  932. out->buffer[0x36] = 0x00;
  933. // Data upload type (1:Handshake 2:Report)
  934. out->buffer[0x37] = 0x02;
  935. // Register time (Minute)
  936. out->buffer[0x38] = 0x00;
  937. out->buffer[0x39] = 0x00;
  938. // Spare
  939. out->buffer[0x3a] = 0x00;
  940. // Charge gun count
  941. out->buffer[0x3b] = 0x01;
  942. // Heart beat upload cycle
  943. out->buffer[0x3c] = 0x98;
  944. // Heart beat overtime count
  945. out->buffer[0x3d] = 0x00;
  946. // Charge record count
  947. out->buffer[0x3e] = 0x00;
  948. out->buffer[0x3f] = 0x00;
  949. out->buffer[0x40] = 0x00;
  950. out->buffer[0x41] = 0x00;
  951. // Current system time
  952. out->buffer[0x42] = 0x20;
  953. out->buffer[0x43] = 0x20;
  954. out->buffer[0x44] = 0x06;
  955. out->buffer[0x45] = 0x11;
  956. out->buffer[0x46] = 0x11;
  957. out->buffer[0x47] = 0x02;
  958. out->buffer[0x48] = 0x18;
  959. out->buffer[0x49] = 0xff;
  960. // Latest charge time
  961. out->buffer[0x4a] = 0x20;
  962. out->buffer[0x4b] = 0x20;
  963. out->buffer[0x4c] = 0x06;
  964. out->buffer[0x4d] = 0x11;
  965. out->buffer[0x4e] = 0x11;
  966. out->buffer[0x4f] = 0x01;
  967. out->buffer[0x50] = 0x52;
  968. out->buffer[0x51] = 0xff;
  969. // Latest start time
  970. out->buffer[0x52] = 0x20;
  971. out->buffer[0x53] = 0x20;
  972. out->buffer[0x54] = 0x06;
  973. out->buffer[0x55] = 0x11;
  974. out->buffer[0x56] = 0x11;
  975. out->buffer[0x57] = 0x01;
  976. out->buffer[0x58] = 0x52;
  977. out->buffer[0x59] = 0xff;
  978. // Latest register time
  979. out->buffer[0x5a] = 0x20;
  980. out->buffer[0x5b] = 0x20;
  981. out->buffer[0x5c] = 0x06;
  982. out->buffer[0x5d] = 0x11;
  983. out->buffer[0x5e] = 0x11;
  984. out->buffer[0x5f] = 0x02;
  985. out->buffer[0x60] = 0x08;
  986. out->buffer[0x61] = 0xff;
  987. // Checksum
  988. out->buffer[out->size-1] = checksum_cal(out);
  989. showCmdRaw(out, true);
  990. }
  991. void create_Cmd_2304(struct Message *out)
  992. {
  993. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  994. out->size = 0x0e;
  995. // Message header
  996. out->buffer[0x00] = (message_header>>8) & 0xff;
  997. out->buffer[0x01] = (message_header>>0) & 0xff;
  998. // Message length
  999. out->buffer[0x02] = (out->size>>0) & 0xff;
  1000. out->buffer[0x03] = (out->size>>8) & 0xff;
  1001. // Message protocol version
  1002. out->buffer[0x04] = PROTOCOL_VER;
  1003. // Message server command serial number
  1004. out->buffer[0x05] = server_cmd_sn & 0xff;
  1005. // Message command
  1006. out->buffer[0x06] = (2304>>0) & 0xff;
  1007. out->buffer[0x07] = (2304>>8) & 0xff;
  1008. // Message user id
  1009. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  1010. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  1011. // Message server command serial number
  1012. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  1013. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  1014. // Result (0:Success 1:Fail)
  1015. out->buffer[0x0c] = 0x00;
  1016. // Checksum
  1017. out->buffer[out->size-1] = checksum_cal(out);
  1018. showCmdRaw(out, true);
  1019. }
  1020. void create_Cmd_2306(struct Message *out)
  1021. {
  1022. memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
  1023. out->size = 0x11;
  1024. // Message header
  1025. out->buffer[0x00] = (message_header>>8) & 0xff;
  1026. out->buffer[0x01] = (message_header>>0) & 0xff;
  1027. // Message length
  1028. out->buffer[0x02] = (out->size>>0) & 0xff;
  1029. out->buffer[0x03] = (out->size>>8) & 0xff;
  1030. // Message protocol version
  1031. out->buffer[0x04] = PROTOCOL_VER;
  1032. // Message server command serial number
  1033. out->buffer[0x05] = server_cmd_sn & 0xff;
  1034. // Message command
  1035. out->buffer[0x06] = (2306>>0) & 0xff;
  1036. out->buffer[0x07] = (2306>>8) & 0xff;
  1037. // Message user id
  1038. out->buffer[0x08] = (server_user_id>>0) & 0xff;
  1039. out->buffer[0x09] = (server_user_id>>8) & 0xff;
  1040. // Message server command serial number
  1041. out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
  1042. out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;
  1043. // Result (0:Success 1:Fail)
  1044. out->buffer[0x0c] = 0x00;
  1045. out->buffer[0x0d] = 0x00;
  1046. out->buffer[0x0e] = 0x00;
  1047. out->buffer[0x0f] = 0x00;
  1048. // Checksum
  1049. out->buffer[out->size-1] = checksum_cal(out);
  1050. showCmdRaw(out, true);
  1051. }
  1052. int main(void)
  1053. {
  1054. int sockfd;
  1055. struct sockaddr_in info;
  1056. struct hostent *ghbn;
  1057. struct timeval tv;
  1058. uint8_t socketEnable;
  1059. struct Message input;
  1060. struct Message intputBuf;
  1061. struct Message output;
  1062. sprintf((char*)server_addr, "evsocket.phihong.com.tw");
  1063. server_port = 9999;
  1064. if(InitShareMemory() == FAIL)
  1065. {
  1066. DEBUG_ERROR("InitShareMemory NG\n");
  1067. if(ShmStatusCodeData!=NULL)
  1068. {
  1069. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=ON;
  1070. }
  1071. sleep(5);
  1072. return 0;
  1073. }
  1074. for(;;)
  1075. {
  1076. bzero(&info,sizeof(info));
  1077. ghbn = gethostbyname((char*)server_addr);
  1078. info.sin_family = PF_INET;
  1079. info.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]));
  1080. info.sin_port = htons(server_port);
  1081. DEBUG_INFO("Connecto to %s:%d\n", inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]), server_port);
  1082. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  1083. if (sockfd == -1)
  1084. {
  1085. DEBUG_ERROR("Fail to create a socket.");
  1086. return 0;
  1087. }
  1088. if(connect(sockfd, (struct sockaddr *)&info,sizeof(info)) ==-1)
  1089. {
  1090. DEBUG_ERROR("Connection error");
  1091. }
  1092. else
  1093. {
  1094. DEBUG_INFO("Connect success.\n");
  1095. tv.tv_sec = 0;
  1096. tv.tv_usec = 500000;
  1097. setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  1098. socketEnable = ON;
  1099. }
  1100. while(socketEnable)
  1101. {
  1102. memset(input.buffer, 0, ARRAY_SIZE(input.buffer));
  1103. if((input.size = recv(sockfd, input.buffer, ARRAY_SIZE(input.buffer), 0)) > 0)
  1104. {
  1105. if(input.size < ARRAY_SIZE(input.buffer))
  1106. {
  1107. //DEBUG_INFO("Receive size: %d.\n", input.size);
  1108. for(uint16_t idx=0;idx<input.size;idx++)
  1109. {
  1110. if((input.buffer[idx] == ((message_header>>8) & 0xff)) && (input.buffer[idx+1] == ((message_header>>0) & 0xff)))
  1111. {
  1112. //DEBUG_INFO("idx: %d\n", idx);
  1113. memset(&intputBuf.buffer[0], 0x00, ARRAY_SIZE(intputBuf.buffer));
  1114. memcpy(&intputBuf.buffer[0], &input.buffer[idx], input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8));
  1115. intputBuf.size = input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8);
  1116. idx += (input.buffer[idx+2] | (uint16_t)input.buffer[idx+3]) -1;
  1117. server_cmd_sn = intputBuf.buffer[10] | ((uint16_t)intputBuf.buffer[11]<<8);
  1118. if(!checksum_valid(&intputBuf))
  1119. DEBUG_INFO("Message checksum wrong.\n");
  1120. else
  1121. {
  1122. showCmdRaw(&intputBuf, OFF);
  1123. switch(intputBuf.buffer[6] | ((uint16_t)intputBuf.buffer[7]<<8))
  1124. {
  1125. case 1001:
  1126. handle_cmd_1001(&intputBuf, &output);
  1127. send(sockfd, output.buffer, output.size, 0);
  1128. break;
  1129. case 1003:
  1130. handle_cmd_1003(&intputBuf, &output);
  1131. send(sockfd, output.buffer, output.size, 0);
  1132. break;
  1133. case 1005:
  1134. handle_cmd_1005(&intputBuf, &output);
  1135. send(sockfd, output.buffer, output.size, 0);
  1136. break;
  1137. case 1101:
  1138. handle_cmd_1101(&intputBuf);
  1139. break;
  1140. case 1103:
  1141. handle_cmd_1103(&intputBuf);
  1142. break;
  1143. case 1105:
  1144. handle_cmd_1105(&intputBuf);
  1145. break;
  1146. case 2303:
  1147. handle_cmd_2303(&intputBuf, &output);
  1148. send(sockfd, output.buffer, output.size, 0);
  1149. break;
  1150. case 2305:
  1151. handle_cmd_2305(&intputBuf, &output);
  1152. send(sockfd, output.buffer, output.size, 0);
  1153. break;
  1154. }
  1155. }
  1156. }
  1157. }
  1158. }
  1159. }
  1160. else if(input.size == 0)
  1161. {
  1162. DEBUG_INFO("Disconnected.\n");
  1163. fflush(stdout);
  1164. backend_info.isSignin = OFF;
  1165. socketEnable = OFF;
  1166. }
  1167. else if(input.size == -1)
  1168. {
  1169. // Sign in reqyest
  1170. if(!backend_info.isSignin)
  1171. {
  1172. create_Cmd_1106(&output);
  1173. send(sockfd, output.buffer, output.size, 0);
  1174. }
  1175. // Heart beat request
  1176. if(backend_info.isSignin && (difftime(time((time_t*)NULL), backend_info.st_hearbeat) > backend_info.interval_heartbeat))
  1177. {
  1178. create_Cmd_1102(&output);
  1179. send(sockfd, output.buffer, output.size, 0);
  1180. backend_info.st_hearbeat = time((time_t*)NULL);
  1181. backend_info.counter_heartbeat_retry++;
  1182. }
  1183. // Heart beat retry fail
  1184. if(backend_info.isSignin && (backend_info.counter_heartbeat_retry > backend_info.retry_heartbeat))
  1185. {
  1186. fflush(stdout);
  1187. backend_info.isSignin = OFF;
  1188. socketEnable = OFF;
  1189. DEBUG_ERROR("Heart beat retry over count.\n");
  1190. }
  1191. }
  1192. usleep(100000);
  1193. }
  1194. close(sockfd);
  1195. sleep(5);
  1196. }
  1197. return 0;
  1198. }