Module_ProduceUtils.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  1. /*
  2. * Module_ProduceUtils.c
  3. *
  4. * Created on: 2020-02-10
  5. * Author: Folus Wen
  6. */
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <sys/time.h>
  10. #include <sys/timeb.h>
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #include <sys/mman.h>
  14. #include <sys/socket.h>
  15. #include <netinet/in.h>
  16. #include <unistd.h>
  17. #include <stdarg.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <unistd.h>
  21. #include <fcntl.h>
  22. #include <termios.h>
  23. #include <errno.h>
  24. #include <errno.h>
  25. #include <string.h>
  26. #include <time.h>
  27. #include <ctype.h>
  28. #include <signal.h>
  29. #include "define.h"
  30. #include "Module_ProduceUtils.h"
  31. #define Debug
  32. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  33. #define PASS 1
  34. #define FAIL 0
  35. #define ON 1
  36. #define OFF 0
  37. #define MtdBlockSize 0x300000
  38. #define LISTEN_PORT 8234
  39. #define CONNECTION_LIMIT 3
  40. #define PROTOCOL_ADDR 0xff
  41. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  42. struct StatusCodeData *ShmStatusCodeData;
  43. struct OCPP16Data *ShmOCPP16Data;
  44. int StoreLogMsg(const char *fmt, ...)
  45. {
  46. char Buf[4096+256];
  47. char buffer[4096];
  48. time_t CurrentTime;
  49. struct tm *tm;
  50. va_list args;
  51. va_start(args, fmt);
  52. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  53. va_end(args);
  54. memset(Buf,0,sizeof(Buf));
  55. CurrentTime = time(NULL);
  56. tm=localtime(&CurrentTime);
  57. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]ProduceUtils_SystemLog",
  58. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  59. buffer,
  60. tm->tm_year+1900,tm->tm_mon+1);
  61. #ifdef SystemLogMessage
  62. system(Buf);
  63. #endif
  64. #ifdef ConsloePrintLog
  65. 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);
  66. #endif
  67. return rc;
  68. }
  69. int runShellCmd(const char*cmd)
  70. {
  71. int result = FAIL;
  72. char buf[256];
  73. FILE *fp;
  74. fp = popen(cmd, "r");
  75. if(fp != NULL)
  76. {
  77. while(fgets(buf, sizeof(buf), fp) != NULL)
  78. {
  79. DEBUG_INFO("%s\n", buf);
  80. }
  81. result = PASS;
  82. }
  83. pclose(fp);
  84. return result;
  85. }
  86. int DiffTimeb(struct timeb ST, struct timeb ET)
  87. {
  88. //return milli-second
  89. unsigned int StartTime,StopTime;
  90. StartTime=(unsigned int)ST.time;
  91. StopTime=(unsigned int)ET.time;
  92. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  93. }
  94. //==========================================
  95. // Init all share memory
  96. //==========================================
  97. int InitShareMemory()
  98. {
  99. int result = PASS;
  100. int MeterSMId;
  101. //creat ShmSysConfigAndInfo
  102. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  103. {
  104. #ifdef SystemLogMessage
  105. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  106. #endif
  107. result = FAIL;
  108. }
  109. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  110. {
  111. #ifdef SystemLogMessage
  112. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  113. #endif
  114. result = FAIL;
  115. }
  116. else
  117. {}
  118. //creat ShmStatusCodeData
  119. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  120. {
  121. #ifdef SystemLogMessage
  122. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  123. #endif
  124. result = FAIL;
  125. }
  126. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  127. {
  128. #ifdef SystemLogMessage
  129. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  130. #endif
  131. result = FAIL;
  132. }
  133. else
  134. {}
  135. //creat ShmOCPP16Data
  136. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  137. {
  138. #ifdef SystemLogMessage
  139. DEBUG_ERROR("shmget ShmOCPP16Data NG");
  140. #endif
  141. result = FAIL;
  142. }
  143. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  144. {
  145. #ifdef SystemLogMessage
  146. DEBUG_ERROR("shmat ShmOCPP16Data NG");
  147. #endif
  148. result = FAIL;
  149. }
  150. else
  151. {}
  152. return result;
  153. }
  154. //==========================================
  155. // Common routine
  156. //==========================================
  157. void trim(char *s)
  158. {
  159. int i=0, j, k, l=0;
  160. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  161. i++;
  162. j = strlen(s)-1;
  163. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  164. j--;
  165. if(i==0 && j==strlen(s)-1) { }
  166. else if(i==0) s[j+1] = '\0';
  167. else {
  168. for(k=i; k<=j; k++) s[l++] = s[k];
  169. s[l] = '\0';
  170. }
  171. }
  172. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  173. {
  174. strncpy(dest, src + start, cnt);
  175. dest[cnt] = 0;
  176. }
  177. int StoreUsrConfigData(struct SysConfigData *UsrData)
  178. {
  179. int result = PASS;
  180. int fd,wrd;
  181. unsigned int i,Chk;
  182. unsigned char *ptr, *BufTmp;
  183. Chk=0;
  184. ptr=(unsigned char *)UsrData;
  185. if((BufTmp=malloc(MtdBlockSize))!=NULL)
  186. {
  187. memset(BufTmp,0,MtdBlockSize);
  188. memcpy(BufTmp,ptr,sizeof(struct SysConfigData));
  189. for(i=ARRAY_SIZE(UsrData->CsuBootLoadFwRev);i<MtdBlockSize-4;i++)
  190. Chk+=*(BufTmp+i);
  191. memcpy(BufTmp+MtdBlockSize-4, &Chk, 4);
  192. // Output configuration to file.
  193. fd = open("/mnt/EvseConfig.bin", O_RDWR|O_CREAT);
  194. if (fd < 0)
  195. {
  196. DEBUG_ERROR("open /mnt/EvseConfig.bin NG\n");
  197. free(BufTmp);
  198. return 0;
  199. }
  200. wrd=write(fd, BufTmp, MtdBlockSize);
  201. close(fd);
  202. if(wrd<MtdBlockSize)
  203. {
  204. DEBUG_ERROR("write /mnt/EvseConfig.bin NG\n");
  205. free(BufTmp);
  206. return 0;
  207. }
  208. DEBUG_INFO("EvseConfig write to file in /mnt OK.\n");
  209. DEBUG_INFO("Erase /dev/mtd10.\n");
  210. runShellCmd("flash_erase /dev/mtd10 0 0");
  211. DEBUG_INFO("Write /dev/mtd10.\n");
  212. runShellCmd("nandwrite -p /dev/mtd10 /mnt/EvseConfig.bin");
  213. DEBUG_INFO("Erase /dev/mtd11.\n");
  214. runShellCmd("flash_erase /dev/mtd11 0 0");
  215. DEBUG_INFO("Write /dev/mtd11.\n");
  216. runShellCmd("nandwrite -p /dev/mtd11 /mnt/EvseConfig.bin");
  217. system("rm -f /mnt/EvseConfig.bin");
  218. DEBUG_INFO("EvseConfig write to flash OK\n");
  219. }
  220. else
  221. {
  222. DEBUG_ERROR("alloc BlockSize NG\r\n");
  223. result = FAIL;
  224. }
  225. if(BufTmp!=NULL)
  226. free(BufTmp);
  227. return result;
  228. }
  229. int isValidCheckSum(uint8_t *message)
  230. {
  231. uint8_t chksum=0;
  232. for(int idx = 0;idx<((message[4] | message[5]<<8)>1024?1024:(message[4] | message[5]<<8));idx++)
  233. {
  234. chksum ^= message[6+idx];
  235. }
  236. return ((chksum == message[6+((message[4] | message[5]<<8)>1024?1024:(message[4] | message[5]<<8))]) ? PASS : FAIL);
  237. }
  238. //==========================================
  239. // Main process
  240. //==========================================
  241. int main(void)
  242. {
  243. int sockFd = 0;
  244. int clientSockFd = 0;
  245. uint8_t inputBuffer[2048] = {};
  246. uint8_t outBuffer[2048] = {};
  247. uint8_t cmdBuf[128];
  248. uint8_t chksum;
  249. int8_t read_size;
  250. int8_t tx_size;
  251. struct sockaddr_in serverInfo, clientInfo;
  252. socklen_t addrlen = sizeof(clientInfo);
  253. struct timeb csuTime;
  254. struct tm *tmCSU;
  255. signal(SIGCHLD,SIG_IGN);
  256. if(InitShareMemory() == FAIL)
  257. {
  258. DEBUG_ERROR("InitShareMemory NG\n");
  259. if(ShmStatusCodeData!=NULL)
  260. {
  261. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  262. }
  263. sleep(5);
  264. return FAIL;
  265. }
  266. sockFd = socket(AF_INET , SOCK_STREAM , 0);
  267. if(sockFd == -1)
  268. {
  269. DEBUG_ERROR("InitSocketServer NG\n");
  270. sleep(5);
  271. return 0;
  272. }
  273. bzero(&serverInfo,sizeof(serverInfo));
  274. serverInfo.sin_family = PF_INET;
  275. serverInfo.sin_addr.s_addr = htonl(INADDR_ANY);
  276. serverInfo.sin_port = htons(LISTEN_PORT);
  277. if(bind(sockFd, (struct sockaddr *)&serverInfo, sizeof(serverInfo))<0)
  278. {
  279. DEBUG_ERROR("Socket bind error.\n");
  280. sleep(5);
  281. return 0;
  282. }
  283. if(listen(sockFd, CONNECTION_LIMIT)<0)
  284. {
  285. DEBUG_ERROR("Socket listen error.\n");
  286. sleep(5);
  287. return 0;
  288. }
  289. // Main loop
  290. for(;;)
  291. {
  292. clientSockFd = accept(sockFd, (struct sockaddr*) &clientInfo, &addrlen);
  293. DEBUG_INFO("Client connect in.\n");
  294. if(fork()==0)
  295. {
  296. // Child process
  297. while((read_size = recv(clientSockFd, inputBuffer, sizeof(inputBuffer), 0)) > 0)
  298. {
  299. if(isValidCheckSum(inputBuffer))
  300. {
  301. chksum = 0;
  302. memset(outBuffer, 0x00, sizeof(outBuffer));
  303. switch(inputBuffer[3])
  304. {
  305. case CMD_QUERY_FW_VER:
  306. DEBUG_INFO("Query firmware version: %s.\n", (char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
  307. tx_size= 7 + (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
  308. outBuffer[0] = 0xaa;
  309. outBuffer[1] = PROTOCOL_ADDR;
  310. outBuffer[2] = inputBuffer[1];
  311. outBuffer[3] = CMD_QUERY_FW_VER;
  312. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev)&0xff;
  313. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev)>>0x08) & 0xff;
  314. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);idx++)
  315. {
  316. outBuffer[6+idx] = ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[idx];
  317. }
  318. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  319. {
  320. chksum ^= outBuffer[6 + idx];
  321. }
  322. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  323. break;
  324. case CMD_QUERY_HW_VER:
  325. DEBUG_INFO("Query hardware version: %s.\n", (char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);
  326. tx_size = 7 + strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);
  327. outBuffer[0] = 0xaa;
  328. outBuffer[1] = PROTOCOL_ADDR;
  329. outBuffer[2] = inputBuffer[1];
  330. outBuffer[3] = CMD_QUERY_HW_VER;
  331. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev) & 0xff;
  332. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev)>>0x08) & 0xff;
  333. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);idx++)
  334. {
  335. outBuffer[6+idx] = (char)ShmSysConfigAndInfo->SysInfo.CsuHwRev[idx];
  336. }
  337. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  338. {
  339. chksum ^= outBuffer[6 + idx];
  340. }
  341. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  342. break;
  343. case CMD_QUERY_PRESENT_INPUTVOLTAGE:
  344. DEBUG_INFO("Query present input voltage.\n");
  345. DEBUG_INFO(" -Input R: %.2f.\n", ShmSysConfigAndInfo->SysInfo.InputVoltageR);
  346. DEBUG_INFO(" -Input S: %.2f.\n", ShmSysConfigAndInfo->SysInfo.InputVoltageS);
  347. DEBUG_INFO(" -Input T: %.2f.\n", ShmSysConfigAndInfo->SysInfo.InputVoltageT);
  348. tx_size = 14;
  349. outBuffer[0] = 0xaa;
  350. outBuffer[1] = PROTOCOL_ADDR;
  351. outBuffer[2] = inputBuffer[1];
  352. outBuffer[3] = CMD_QUERY_PRESENT_INPUTVOLTAGE;
  353. outBuffer[4] = 0x07;
  354. outBuffer[5] = 0x00;
  355. outBuffer[6] = 0x00;
  356. outBuffer[7] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageR*10)>>0) & 0xff);
  357. outBuffer[8] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageR*10)>>8) & 0xff);
  358. outBuffer[9] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageS*10)>>0) & 0xff);
  359. outBuffer[10] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageS*10)>>8) & 0xff);
  360. outBuffer[11] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageT*10)>>0) & 0xff);
  361. outBuffer[12] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageT*10)>>8) & 0xff);
  362. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  363. {
  364. chksum ^= outBuffer[6 + idx];
  365. }
  366. outBuffer[13] = chksum;
  367. break;
  368. case CMD_QUERY_PRESENT_OUTPUTVOLTAGE:
  369. break;
  370. case CMD_QUERY_FAN_SPEED:
  371. break;
  372. case CMD_QUERY_TEMPERATURE:
  373. DEBUG_INFO("Query temperature.\n");
  374. DEBUG_INFO(" -SystemAmbientTemp: %d\n", ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
  375. DEBUG_INFO(" -CcsConnectorTemp: %d\n", ShmSysConfigAndInfo->SysInfo.CcsConnectorTemp);
  376. tx_size = 15;
  377. outBuffer[0] = 0xaa;
  378. outBuffer[1] = PROTOCOL_ADDR;
  379. outBuffer[2] = inputBuffer[1];
  380. outBuffer[3] = CMD_QUERY_TEMPERATURE;
  381. outBuffer[4] = 0x08;
  382. outBuffer[5] = 0x00;
  383. outBuffer[6] = (((ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp+60)>>0) & 0xff);
  384. outBuffer[7] = (((ShmSysConfigAndInfo->SysInfo.CcsConnectorTemp+60)>>0) & 0xff);
  385. outBuffer[8] = 0x00;
  386. outBuffer[9] = 0x00;
  387. outBuffer[10] = 0x00;
  388. outBuffer[11] = 0x00;
  389. outBuffer[12] = 0x00;
  390. outBuffer[13] = 0x00;
  391. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  392. {
  393. chksum ^= outBuffer[6 + idx];
  394. }
  395. outBuffer[14] = chksum;
  396. break;
  397. case CMD_QUERY_AUX_POWERVOLTAGE:
  398. break;
  399. case CMD_QUERY_RELAY_OUTPUT:
  400. break;
  401. case CMD_QUERY_GFD_ADC:
  402. break;
  403. case CMD_QUERY_GPIO_INPUT:
  404. break;
  405. case CMD_QUERY_ALARM_LOG:
  406. break;
  407. case CMD_QUERY_SN:
  408. ftime(&csuTime);
  409. tmCSU = localtime(&csuTime.time);
  410. DEBUG_INFO("Query serial number: %s\n", (char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  411. tx_size = 15 + strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  412. outBuffer[0] = 0xaa;
  413. outBuffer[1] = PROTOCOL_ADDR;
  414. outBuffer[2] = inputBuffer[1];
  415. outBuffer[3] = CMD_QUERY_SN;
  416. outBuffer[4] = (strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber)+8)&0xff;
  417. outBuffer[5] = ((strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber)+8)>>0x08) & 0xff;
  418. outBuffer[6] = ((tmCSU->tm_year+1900)/1000)+'0';
  419. outBuffer[7] = (((tmCSU->tm_year+1900)%1000)/100)+'0';
  420. outBuffer[8] = (((tmCSU->tm_year+1900)%100)/10)+'0';
  421. outBuffer[9] = ((tmCSU->tm_year+1900)%10) +'0';
  422. outBuffer[10] = ((tmCSU->tm_mon+1)/10) +'0';
  423. outBuffer[11] = ((tmCSU->tm_mon+1)%10) +'0';
  424. outBuffer[12] = (tmCSU->tm_mday/10) +'0';
  425. outBuffer[13] = (tmCSU->tm_mday%10) +'0';
  426. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);idx++)
  427. {
  428. outBuffer[14+idx] = (char)ShmSysConfigAndInfo->SysConfig.SerialNumber[idx];
  429. }
  430. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  431. {
  432. chksum ^= outBuffer[6 + idx];
  433. }
  434. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  435. break;
  436. case CMD_QUERY_MODEL_NAME:
  437. DEBUG_INFO("Query model name: %s\n", (char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  438. tx_size = 7 + strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  439. outBuffer[0] = 0xaa;
  440. outBuffer[1] = PROTOCOL_ADDR;
  441. outBuffer[2] = inputBuffer[1];
  442. outBuffer[3] = CMD_QUERY_MODEL_NAME;
  443. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)&0xff;
  444. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)>>0x08) & 0xff;
  445. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName);idx++)
  446. {
  447. outBuffer[6+idx] = (char)ShmSysConfigAndInfo->SysConfig.ModelName[idx];
  448. }
  449. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  450. {
  451. chksum ^= outBuffer[6 + idx];
  452. }
  453. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  454. break;
  455. case CMD_QUERY_PARAMETER:
  456. break;
  457. case CMD_QUERY_RTC:
  458. DEBUG_INFO("Query system time.\n");
  459. ftime(&csuTime);
  460. tmCSU = localtime(&csuTime.time);
  461. tx_size = 21;
  462. outBuffer[0] = 0xaa;
  463. outBuffer[1] = PROTOCOL_ADDR;
  464. outBuffer[2] = inputBuffer[1];
  465. outBuffer[3] = CMD_QUERY_RTC;
  466. outBuffer[4] = 0x0e;
  467. outBuffer[5] = 0x00;
  468. outBuffer[6] = ((tmCSU->tm_year+1900)/1000)+'0';
  469. outBuffer[7] = (((tmCSU->tm_year+1900)%1000)/100)+'0';
  470. outBuffer[8] = (((tmCSU->tm_year+1900)%100)/10)+'0';
  471. outBuffer[9] = ((tmCSU->tm_year+1900)%10) +'0';
  472. outBuffer[10] = ((tmCSU->tm_mon+1)/10) +'0';
  473. outBuffer[11] = ((tmCSU->tm_mon+1)%10) +'0';
  474. outBuffer[12] = (tmCSU->tm_mday/10) +'0';
  475. outBuffer[13] = (tmCSU->tm_mday%10) +'0';
  476. outBuffer[14] = (tmCSU->tm_hour/10) +'0';
  477. outBuffer[15] = (tmCSU->tm_hour%10) +'0';
  478. outBuffer[16] = (tmCSU->tm_min/10) +'0';
  479. outBuffer[17] = (tmCSU->tm_min%10) +'0';
  480. outBuffer[18] = (tmCSU->tm_sec/10) +'0';
  481. outBuffer[19] = (tmCSU->tm_sec%10) +'0';
  482. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  483. {
  484. chksum ^= outBuffer[6 + idx];
  485. }
  486. outBuffer[20] = chksum;
  487. break;
  488. case CMD_QUERY_4G_REVISION:
  489. DEBUG_INFO("Query 4G module revision: %s\n", (char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer);
  490. tx_size = 7 + strlen((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer);
  491. outBuffer[0] = 0xaa;
  492. outBuffer[1] = PROTOCOL_ADDR;
  493. outBuffer[2] = inputBuffer[1];
  494. outBuffer[3] = CMD_QUERY_4G_REVISION;
  495. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer)&0xff;
  496. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer)>>0x08) & 0xff;
  497. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer);idx++)
  498. {
  499. outBuffer[6+idx] = (char)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer[idx];
  500. }
  501. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  502. {
  503. chksum ^= outBuffer[6 + idx];
  504. }
  505. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  506. break;
  507. case CMD_QUERY_4G_SIM_INFO:
  508. DEBUG_INFO("Query 4G SIM install status: %d\n", ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus);
  509. DEBUG_INFO("Query 4G SIM ICCID: %s\n", ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);
  510. DEBUG_INFO("Query 4G SIM IMSI: %s\n", ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
  511. tx_size = 46;
  512. outBuffer[0] = 0xaa;
  513. outBuffer[1] = PROTOCOL_ADDR;
  514. outBuffer[2] = inputBuffer[1];
  515. outBuffer[3] = CMD_QUERY_4G_SIM_INFO;
  516. outBuffer[4] = 0x27&0xff;
  517. outBuffer[5] = (0x27>>0x08) & 0xff;
  518. outBuffer[6] = ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus;
  519. for(uint8_t idx=0;idx<ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);idx++)
  520. {
  521. outBuffer[7+idx] = (char)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid[idx];
  522. }
  523. for(uint8_t idx=0;idx<ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);idx++)
  524. {
  525. outBuffer[(7+ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid))+idx] = (char)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi[idx];
  526. }
  527. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  528. break;
  529. case CMD_QUERY_AC_STATUS:
  530. break;
  531. case CMD_QUERY_AC_ALARM:
  532. break;
  533. case CMD_QUERY_BLE_CONFIG_DATA:
  534. break;
  535. case CMD_QUERY_POWER_CONSUMPTION:
  536. break;
  537. case CMD_QUERY_GUN_PLUGIN_TIMES:
  538. break;
  539. case CMD_CONFIG_FAN_SPEED:
  540. break;
  541. case CMD_CONFIG_SERIAL_NUMBER:
  542. memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber));
  543. memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId));
  544. for(uint16_t idx=0;idx<((inputBuffer[4] | (inputBuffer[5]<<8))-8);idx++)
  545. {
  546. ShmSysConfigAndInfo->SysConfig.SerialNumber[idx] = inputBuffer[14+idx];
  547. }
  548. ShmSysConfigAndInfo->SysConfig.SerialNumber[(inputBuffer[4] | (inputBuffer[5]<<8))-8] = '\0';
  549. memcpy(ShmSysConfigAndInfo->SysConfig.SystemId, ShmSysConfigAndInfo->SysConfig.ModelName, strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName));
  550. memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId[strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)], ShmSysConfigAndInfo->SysConfig.SerialNumber, (inputBuffer[4] | (inputBuffer[5]<<8)));
  551. tx_size = 8;
  552. outBuffer[0] = 0xaa;
  553. outBuffer[1] = PROTOCOL_ADDR;
  554. outBuffer[2] = inputBuffer[1];
  555. outBuffer[3] = CMD_CONFIG_SERIAL_NUMBER;
  556. outBuffer[4] = 0x01;
  557. outBuffer[5] = 0x00;
  558. outBuffer[6] = 0x01;
  559. outBuffer[7] = outBuffer[6];
  560. DEBUG_INFO("Config serial number: %s\n", (char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  561. break;
  562. case CMD_CONFIG_MODEL_NAME:
  563. memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber));
  564. memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId));
  565. for(uint16_t idx=0;idx<(inputBuffer[4] | (inputBuffer[5]<<8));idx++)
  566. {
  567. ShmSysConfigAndInfo->SysConfig.ModelName[idx] = inputBuffer[6+idx];
  568. }
  569. ShmSysConfigAndInfo->SysConfig.ModelName[(inputBuffer[4] | (inputBuffer[5]<<8))] = '\0';
  570. memcpy(ShmSysConfigAndInfo->SysConfig.SystemId, ShmSysConfigAndInfo->SysConfig.ModelName, strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName));
  571. memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId[strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)], ShmSysConfigAndInfo->SysConfig.SerialNumber, (inputBuffer[4] | (inputBuffer[5]<<8)));
  572. tx_size = 8;
  573. outBuffer[0] = 0xaa;
  574. outBuffer[1] = PROTOCOL_ADDR;
  575. outBuffer[2] = inputBuffer[1];
  576. outBuffer[3] = CMD_CONFIG_MODEL_NAME;
  577. outBuffer[4] = 0x01;
  578. outBuffer[5] = 0x00;
  579. outBuffer[6] = 0x01;
  580. outBuffer[7] = outBuffer[6];
  581. DEBUG_INFO("Config model name: %s\n", (char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  582. break;
  583. case CMD_CONFIG_RELAY_OUTPUT:
  584. break;
  585. case CMD_CONFIG_GPIO_OUTPUT:
  586. break;
  587. case CMD_CONFIG_RTC:
  588. DEBUG_INFO("Config system time.\n");
  589. tx_size = 8;
  590. outBuffer[0] = 0xaa;
  591. outBuffer[1] = PROTOCOL_ADDR;
  592. outBuffer[2] = inputBuffer[1];
  593. outBuffer[3] = CMD_CONFIG_RTC;
  594. outBuffer[4] = 0x01;
  595. outBuffer[5] = 0x00;
  596. outBuffer[6] = 0x01;
  597. outBuffer[7] = 0x01;
  598. sprintf((char*)cmdBuf, "date -u -s \"%04d-%02d-%02d %02d:%02d:%02d\"", (inputBuffer[6]-'0')*1000 + (inputBuffer[7]-'0')*100 + (inputBuffer[8]-'0')*10 + (inputBuffer[9]-'0'),
  599. (inputBuffer[10]-'0')*10+ (inputBuffer[11]-'0'),
  600. (inputBuffer[12]-'0')*10 + (inputBuffer[13]-'0'),
  601. (inputBuffer[14]-'0')*10 + (inputBuffer[15]-'0'),
  602. (inputBuffer[16]-'0')*10 + (inputBuffer[17]-'0'),
  603. (inputBuffer[18]-'0')*10 + (inputBuffer[19]-'0'));
  604. system((char*)cmdBuf);
  605. system("hwclock -w -u");
  606. system("hwclock -s");
  607. break;
  608. case CMD_CONFIG_AC_LED:
  609. break;
  610. case CMD_CONFIG_CURRENT_LINIT:
  611. break;
  612. case CMD_CONFIG_MCU_MODE:
  613. break;
  614. case CMD_CONFIG_MCU_RESET_REQUEST:
  615. break;
  616. case CMD_CONFIG_BREATHE_LED_TIMING:
  617. break;
  618. case CMD_CONFIG_SAVE_CONFIGURATION:
  619. tx_size = 8;
  620. outBuffer[0] = 0xaa;
  621. outBuffer[1] = PROTOCOL_ADDR;
  622. outBuffer[2] = inputBuffer[1];
  623. outBuffer[3] = CMD_CONFIG_SAVE_CONFIGURATION;
  624. outBuffer[4] = 0x01;
  625. outBuffer[5] = 0x00;
  626. outBuffer[6] = (StoreUsrConfigData(&ShmSysConfigAndInfo->SysConfig)!=0x01?0x00:0x01);
  627. outBuffer[7] = outBuffer[6];
  628. DEBUG_INFO("Save configuration\n");
  629. if((outBuffer[6] == PASS))
  630. {
  631. sprintf((char*)ShmOCPP16Data->Reset.Type, "Soft");
  632. ShmOCPP16Data->MsMsg.bits.ResetReq = ON;
  633. }
  634. break;
  635. case CMD_UPDATE_START:
  636. DEBUG_INFO("Upgrade firmware request.\n");
  637. tx_size = 8;
  638. outBuffer[0] = 0xaa;
  639. outBuffer[1] = PROTOCOL_ADDR;
  640. outBuffer[2] = inputBuffer[1];
  641. outBuffer[3] = CMD_UPDATE_START;
  642. outBuffer[4] = 0x01;
  643. outBuffer[5] = 0x00;
  644. outBuffer[6] = 0x01;
  645. outBuffer[7] = outBuffer[6];
  646. ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = ON;
  647. break;
  648. case CMD_UPDATE_ABOARD:
  649. break;
  650. case CMD_UPDATE_TRANSFER:
  651. break;
  652. case CMD_UPDATE_END:
  653. break;
  654. default:
  655. break;
  656. }
  657. }
  658. else
  659. {
  660. tx_size = 9;
  661. outBuffer[0] = 0xaa;
  662. outBuffer[1] = PROTOCOL_ADDR;
  663. outBuffer[2] = inputBuffer[1];
  664. outBuffer[3] = inputBuffer[3];
  665. outBuffer[4] = 0x01;
  666. outBuffer[5] = 0x00;
  667. outBuffer[6] = 0x00;
  668. outBuffer[7] = 0x00;
  669. }
  670. send(clientSockFd, outBuffer, tx_size, 0);
  671. }
  672. if(read_size == 0)
  673. {
  674. close(clientSockFd);
  675. DEBUG_INFO("Client disconnected.\n");
  676. fflush(stdout);
  677. }
  678. else if(read_size == -1)
  679. {
  680. close(clientSockFd);
  681. DEBUG_ERROR("Socket recv failed.\n");
  682. }
  683. exit(0);
  684. }
  685. else
  686. {
  687. // Parent process
  688. close(clientSockFd);
  689. }
  690. sleep(1);
  691. }
  692. }