Module_ProduceUtils.c 24 KB

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