Module_PhBackend.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461
  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. while(!ShmSysConfigAndInfo->SysInfo.InternetConn)
  1077. {
  1078. sleep(1);
  1079. }
  1080. bzero(&info,sizeof(info));
  1081. ghbn = gethostbyname((char*)server_addr);
  1082. info.sin_family = PF_INET;
  1083. info.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]));
  1084. info.sin_port = htons(server_port);
  1085. DEBUG_INFO("Connecto to %s:%d\n", inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]), server_port);
  1086. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  1087. if (sockfd == -1)
  1088. {
  1089. DEBUG_ERROR("Fail to create a socket.");
  1090. return 0;
  1091. }
  1092. if(connect(sockfd, (struct sockaddr *)&info,sizeof(info)) ==-1)
  1093. {
  1094. DEBUG_ERROR("Connection error");
  1095. }
  1096. else
  1097. {
  1098. DEBUG_INFO("Connect success.\n");
  1099. tv.tv_sec = 0;
  1100. tv.tv_usec = 500000;
  1101. setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  1102. socketEnable = ON;
  1103. }
  1104. while(socketEnable)
  1105. {
  1106. memset(input.buffer, 0, ARRAY_SIZE(input.buffer));
  1107. if((input.size = recv(sockfd, input.buffer, ARRAY_SIZE(input.buffer), 0)) > 0)
  1108. {
  1109. if(input.size < ARRAY_SIZE(input.buffer))
  1110. {
  1111. //DEBUG_INFO("Receive size: %d.\n", input.size);
  1112. for(uint16_t idx=0;idx<input.size;idx++)
  1113. {
  1114. if((input.buffer[idx] == ((message_header>>8) & 0xff)) && (input.buffer[idx+1] == ((message_header>>0) & 0xff)))
  1115. {
  1116. //DEBUG_INFO("idx: %d\n", idx);
  1117. memset(&intputBuf.buffer[0], 0x00, ARRAY_SIZE(intputBuf.buffer));
  1118. memcpy(&intputBuf.buffer[0], &input.buffer[idx], input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8));
  1119. intputBuf.size = input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8);
  1120. idx += (input.buffer[idx+2] | (uint16_t)input.buffer[idx+3]) -1;
  1121. server_cmd_sn = intputBuf.buffer[10] | ((uint16_t)intputBuf.buffer[11]<<8);
  1122. if(!checksum_valid(&intputBuf))
  1123. DEBUG_INFO("Message checksum wrong.\n");
  1124. else
  1125. {
  1126. showCmdRaw(&intputBuf, OFF);
  1127. switch(intputBuf.buffer[6] | ((uint16_t)intputBuf.buffer[7]<<8))
  1128. {
  1129. case 1001:
  1130. handle_cmd_1001(&intputBuf, &output);
  1131. send(sockfd, output.buffer, output.size, 0);
  1132. break;
  1133. case 1003:
  1134. handle_cmd_1003(&intputBuf, &output);
  1135. send(sockfd, output.buffer, output.size, 0);
  1136. break;
  1137. case 1005:
  1138. handle_cmd_1005(&intputBuf, &output);
  1139. send(sockfd, output.buffer, output.size, 0);
  1140. break;
  1141. case 1101:
  1142. handle_cmd_1101(&intputBuf);
  1143. break;
  1144. case 1103:
  1145. handle_cmd_1103(&intputBuf);
  1146. break;
  1147. case 1105:
  1148. handle_cmd_1105(&intputBuf);
  1149. break;
  1150. case 2303:
  1151. handle_cmd_2303(&intputBuf, &output);
  1152. send(sockfd, output.buffer, output.size, 0);
  1153. break;
  1154. case 2305:
  1155. handle_cmd_2305(&intputBuf, &output);
  1156. send(sockfd, output.buffer, output.size, 0);
  1157. break;
  1158. }
  1159. }
  1160. }
  1161. }
  1162. }
  1163. }
  1164. else if(input.size == 0)
  1165. {
  1166. DEBUG_INFO("Disconnected.\n");
  1167. fflush(stdout);
  1168. backend_info.isSignin = OFF;
  1169. socketEnable = OFF;
  1170. }
  1171. else if(input.size == -1)
  1172. {
  1173. // Sign in reqyest
  1174. if(!backend_info.isSignin)
  1175. {
  1176. create_Cmd_1106(&output);
  1177. send(sockfd, output.buffer, output.size, 0);
  1178. }
  1179. // Heart beat request
  1180. if(backend_info.isSignin && (difftime(time((time_t*)NULL), backend_info.st_hearbeat) > backend_info.interval_heartbeat))
  1181. {
  1182. create_Cmd_1102(&output);
  1183. send(sockfd, output.buffer, output.size, 0);
  1184. backend_info.st_hearbeat = time((time_t*)NULL);
  1185. backend_info.counter_heartbeat_retry++;
  1186. }
  1187. // Heart beat retry fail
  1188. if(backend_info.isSignin && (backend_info.counter_heartbeat_retry > backend_info.retry_heartbeat))
  1189. {
  1190. fflush(stdout);
  1191. backend_info.isSignin = OFF;
  1192. socketEnable = OFF;
  1193. DEBUG_ERROR("Heart beat retry over count.\n");
  1194. }
  1195. }
  1196. usleep(100000);
  1197. }
  1198. close(sockfd);
  1199. sleep(5);
  1200. }
  1201. return 0;
  1202. }