Module_ProduceUtils.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  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 "define.h"
  29. #include "Module_ProduceUtils.h"
  30. #define Debug
  31. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  32. #define PASS 1
  33. #define FAIL 0
  34. #define MtdBlockSize 0x600000
  35. #define LISTEN_PORT 8234
  36. #define CONNECTION_LIMIT 1
  37. #define PROTOCOL_ADDR 0
  38. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  39. struct StatusCodeData *ShmStatusCodeData;
  40. int StoreLogMsg(const char *fmt, ...)
  41. {
  42. char Buf[4096+256];
  43. char buffer[4096];
  44. time_t CurrentTime;
  45. struct tm *tm;
  46. va_list args;
  47. va_start(args, fmt);
  48. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  49. va_end(args);
  50. memset(Buf,0,sizeof(Buf));
  51. CurrentTime = time(NULL);
  52. tm=localtime(&CurrentTime);
  53. sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]ProduceUtils_SystemLog",
  54. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  55. buffer,
  56. tm->tm_year+1900,tm->tm_mon+1);
  57. #ifdef SystemLogMessage
  58. system(Buf);
  59. #endif
  60. 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);
  61. return rc;
  62. }
  63. int DiffTimeb(struct timeb ST, struct timeb ET)
  64. {
  65. //return milli-second
  66. unsigned int StartTime,StopTime;
  67. StartTime=(unsigned int)ST.time;
  68. StopTime=(unsigned int)ET.time;
  69. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  70. }
  71. //==========================================
  72. // Init all share memory
  73. //==========================================
  74. int InitShareMemory()
  75. {
  76. int result = PASS;
  77. int MeterSMId;
  78. //creat ShmSysConfigAndInfo
  79. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  80. {
  81. #ifdef SystemLogMessage
  82. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  83. #endif
  84. result = FAIL;
  85. }
  86. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  87. {
  88. #ifdef SystemLogMessage
  89. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  90. #endif
  91. result = FAIL;
  92. }
  93. else
  94. {}
  95. //creat ShmStatusCodeData
  96. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  97. {
  98. #ifdef SystemLogMessage
  99. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  100. #endif
  101. result = FAIL;
  102. }
  103. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  104. {
  105. #ifdef SystemLogMessage
  106. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  107. #endif
  108. result = FAIL;
  109. }
  110. else
  111. {}
  112. return result;
  113. }
  114. //==========================================
  115. // Common routine
  116. //==========================================
  117. void trim(char *s)
  118. {
  119. int i=0, j, k, l=0;
  120. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  121. i++;
  122. j = strlen(s)-1;
  123. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  124. j--;
  125. if(i==0 && j==strlen(s)-1) { }
  126. else if(i==0) s[j+1] = '\0';
  127. else {
  128. for(k=i; k<=j; k++) s[l++] = s[k];
  129. s[l] = '\0';
  130. }
  131. }
  132. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  133. {
  134. strncpy(dest, src + start, cnt);
  135. dest[cnt] = 0;
  136. }
  137. int StoreUsrConfigData(struct SysConfigData *UsrData)
  138. {
  139. int result = PASS;
  140. int fd,wrd;
  141. unsigned int i,Chk;
  142. unsigned char *ptr, *BufTmp;
  143. Chk=0;
  144. ptr=(unsigned char *)UsrData;
  145. if((BufTmp=malloc(MtdBlockSize))!=NULL)
  146. {
  147. memset(BufTmp,0,MtdBlockSize);
  148. memcpy(BufTmp,ptr,sizeof(struct SysConfigData));
  149. for(i=0;i<MtdBlockSize-4;i++)
  150. Chk+=*(BufTmp+i);
  151. memcpy( BufTmp+MtdBlockSize-4,&Chk,4);
  152. fd = open("/dev/mtdblock10", O_RDWR);
  153. if (fd>0)
  154. {
  155. wrd=write(fd, BufTmp, MtdBlockSize);
  156. close(fd);
  157. if(wrd>=MtdBlockSize)
  158. {
  159. fd = open("/dev/mtdblock11", O_RDWR);
  160. if (fd>0)
  161. {
  162. wrd=write(fd, BufTmp, MtdBlockSize);
  163. close(fd);
  164. if(wrd<MtdBlockSize)
  165. {
  166. DEBUG_ERROR("write /dev/mtdblock11(backup) NG\r\n");
  167. result = FAIL;
  168. }
  169. }
  170. else
  171. {
  172. DEBUG_ERROR("open /dev/mtdblock11(backup) NG\r\n");
  173. result = FAIL;
  174. }
  175. }
  176. else
  177. {
  178. DEBUG_ERROR("write /dev/mtdblock10 NG\r\n");
  179. result = FAIL;
  180. }
  181. }
  182. else
  183. {
  184. DEBUG_ERROR("open /dev/mtdblock10 NG\r\n");
  185. result = FAIL;
  186. }
  187. }
  188. else
  189. {
  190. DEBUG_ERROR("alloc BlockSize NG\r\n");
  191. result = FAIL;
  192. }
  193. if(BufTmp!=NULL)
  194. free(BufTmp);
  195. return result;
  196. }
  197. int isValidCheckSum(uint8_t *message)
  198. {
  199. uint8_t chksum=0;
  200. for(int idx = 0;idx<((message[4] | message[5]<<8)>1024?1024:(message[4] | message[5]<<8));idx++)
  201. {
  202. chksum ^= message[6+idx];
  203. }
  204. return ((chksum == message[6+((message[4] | message[5]<<8)>1024?1024:(message[4] | message[5]<<8))]) ? PASS : FAIL);
  205. }
  206. //==========================================
  207. // Main process
  208. //==========================================
  209. int main(void)
  210. {
  211. int sockFd = 0;
  212. int clientSockFd = 0;
  213. uint8_t inputBuffer[2048] = {};
  214. uint8_t outBuffer[2048] = {};
  215. uint8_t cmdBuf[128];
  216. uint8_t chksum;
  217. int8_t read_size;
  218. int8_t tx_size;
  219. struct sockaddr_in serverInfo, clientInfo;
  220. socklen_t addrlen = sizeof(clientInfo);
  221. struct timeb csuTime;
  222. struct tm *tmCSU;
  223. if(InitShareMemory() == FAIL)
  224. {
  225. DEBUG_ERROR("InitShareMemory NG\n");
  226. if(ShmStatusCodeData!=NULL)
  227. {
  228. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  229. }
  230. sleep(5);
  231. return FAIL;
  232. }
  233. sockFd = socket(AF_INET , SOCK_STREAM , 0);
  234. if(sockFd == -1)
  235. {
  236. DEBUG_ERROR("InitSocketServer NG\n");
  237. sleep(5);
  238. return 0;
  239. }
  240. bzero(&serverInfo,sizeof(serverInfo));
  241. serverInfo.sin_family = PF_INET;
  242. serverInfo.sin_addr.s_addr = INADDR_ANY;
  243. serverInfo.sin_port = htons(LISTEN_PORT);
  244. bind(sockFd, (struct sockaddr *)&serverInfo, sizeof(serverInfo));
  245. listen(sockFd, CONNECTION_LIMIT);
  246. // Main loop
  247. for(;;)
  248. {
  249. clientSockFd = accept(sockFd, (struct sockaddr*) &clientInfo, &addrlen);
  250. DEBUG_INFO("Client connect in.\r\n");
  251. while((read_size = recv(clientSockFd, inputBuffer, sizeof(inputBuffer), 0)) > 0)
  252. {
  253. if(isValidCheckSum(inputBuffer))
  254. {
  255. chksum = 0;
  256. memset(outBuffer, 0x00, sizeof(outBuffer));
  257. switch(inputBuffer[3])
  258. {
  259. case CMD_QUERY_FW_VER:
  260. DEBUG_INFO("Query firmware version: %s.\r\n", (char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
  261. tx_size= 7 + (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
  262. outBuffer[0] = 0xaa;
  263. outBuffer[1] = PROTOCOL_ADDR;
  264. outBuffer[2] = inputBuffer[1];
  265. outBuffer[3] = CMD_QUERY_FW_VER;
  266. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev)&0xff;
  267. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev)>>0x08) & 0xff;
  268. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);idx++)
  269. {
  270. outBuffer[6+idx] = ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[idx];
  271. }
  272. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  273. {
  274. chksum ^= outBuffer[6 + idx];
  275. }
  276. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  277. break;
  278. case CMD_QUERY_HW_VER:
  279. DEBUG_INFO("Query hardware version: %s.\r\n", (char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);
  280. tx_size = 7 + strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);
  281. outBuffer[0] = 0xaa;
  282. outBuffer[1] = PROTOCOL_ADDR;
  283. outBuffer[2] = inputBuffer[1];
  284. outBuffer[3] = CMD_QUERY_HW_VER;
  285. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev) & 0xff;
  286. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev)>>0x08) & 0xff;
  287. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev);idx++)
  288. {
  289. outBuffer[6+idx] = (char)ShmSysConfigAndInfo->SysInfo.CsuHwRev[idx];
  290. }
  291. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  292. {
  293. chksum ^= outBuffer[6 + idx];
  294. }
  295. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  296. break;
  297. case CMD_QUERY_PRESENT_INPUTVOLTAGE:
  298. DEBUG_INFO("Query present input voltage.\r\n");
  299. DEBUG_INFO(" -Input R: %.2f.\r\n", ShmSysConfigAndInfo->SysInfo.InputVoltageR);
  300. DEBUG_INFO(" -Input S: %.2f.\r\n", ShmSysConfigAndInfo->SysInfo.InputVoltageS);
  301. DEBUG_INFO(" -Input T: %.2f.\r\n", ShmSysConfigAndInfo->SysInfo.InputVoltageT);
  302. tx_size = 14;
  303. outBuffer[0] = 0xaa;
  304. outBuffer[1] = PROTOCOL_ADDR;
  305. outBuffer[2] = inputBuffer[1];
  306. outBuffer[3] = CMD_QUERY_PRESENT_INPUTVOLTAGE;
  307. outBuffer[4] = 0x07;
  308. outBuffer[5] = 0x00;
  309. outBuffer[6] = 0x00;
  310. outBuffer[7] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageR*10)>>0) & 0xff);
  311. outBuffer[8] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageR*10)>>8) & 0xff);
  312. outBuffer[9] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageS*10)>>0) & 0xff);
  313. outBuffer[10] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageS*10)>>8) & 0xff);
  314. outBuffer[11] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageT*10)>>0) & 0xff);
  315. outBuffer[12] = (((int)(ShmSysConfigAndInfo->SysInfo.InputVoltageT*10)>>8) & 0xff);
  316. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  317. {
  318. chksum ^= outBuffer[6 + idx];
  319. }
  320. outBuffer[13] = chksum;
  321. break;
  322. case CMD_QUERY_PRESENT_OUTPUTVOLTAGE:
  323. break;
  324. case CMD_QUERY_FAN_SPEED:
  325. break;
  326. case CMD_QUERY_TEMPERATURE:
  327. DEBUG_INFO("Query temperature.\r\n");
  328. DEBUG_INFO(" -SystemAmbientTemp: %d\r\n", ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
  329. DEBUG_INFO(" -CcsConnectorTemp: %d\r\n", ShmSysConfigAndInfo->SysInfo.CcsConnectorTemp);
  330. tx_size = 15;
  331. outBuffer[0] = 0xaa;
  332. outBuffer[1] = PROTOCOL_ADDR;
  333. outBuffer[2] = inputBuffer[1];
  334. outBuffer[3] = CMD_QUERY_TEMPERATURE;
  335. outBuffer[4] = 0x08;
  336. outBuffer[5] = 0x00;
  337. outBuffer[6] = (((ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp+60)>>0) & 0xff);
  338. outBuffer[7] = (((ShmSysConfigAndInfo->SysInfo.CcsConnectorTemp+60)>>0) & 0xff);
  339. outBuffer[8] = 0x00;
  340. outBuffer[9] = 0x00;
  341. outBuffer[10] = 0x00;
  342. outBuffer[11] = 0x00;
  343. outBuffer[12] = 0x00;
  344. outBuffer[13] = 0x00;
  345. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  346. {
  347. chksum ^= outBuffer[6 + idx];
  348. }
  349. outBuffer[14] = chksum;
  350. break;
  351. case CMD_QUERY_AUX_POWERVOLTAGE:
  352. break;
  353. case CMD_QUERY_RELAY_OUTPUT:
  354. break;
  355. case CMD_QUERY_GFD_ADC:
  356. break;
  357. case CMD_QUERY_GPIO_INPUT:
  358. break;
  359. case CMD_QUERY_ALARM_LOG:
  360. break;
  361. case CMD_QUERY_SN:
  362. ftime(&csuTime);
  363. tmCSU = localtime(&csuTime.time);
  364. DEBUG_INFO("Query serial number: %s\r\n", (char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  365. tx_size = 15 + strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  366. outBuffer[0] = 0xaa;
  367. outBuffer[1] = PROTOCOL_ADDR;
  368. outBuffer[2] = inputBuffer[1];
  369. outBuffer[3] = CMD_QUERY_SN;
  370. outBuffer[4] = (strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber)+8)&0xff;
  371. outBuffer[5] = ((strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber)+8)>>0x08) & 0xff;
  372. outBuffer[6] = ((tmCSU->tm_year+1900)/1000)+'0';
  373. outBuffer[7] = (((tmCSU->tm_year+1900)%1000)/100)+'0';
  374. outBuffer[8] = (((tmCSU->tm_year+1900)%100)/10)+'0';
  375. outBuffer[9] = ((tmCSU->tm_year+1900)%10) +'0';
  376. outBuffer[10] = ((tmCSU->tm_mon+1)/10) +'0';
  377. outBuffer[11] = ((tmCSU->tm_mon+1)%10) +'0';
  378. outBuffer[12] = (tmCSU->tm_mday/10) +'0';
  379. outBuffer[13] = (tmCSU->tm_mday%10) +'0';
  380. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);idx++)
  381. {
  382. outBuffer[14+idx] = (char)ShmSysConfigAndInfo->SysConfig.SerialNumber[idx];
  383. }
  384. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  385. {
  386. chksum ^= outBuffer[6 + idx];
  387. }
  388. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  389. break;
  390. case CMD_QUERY_MODEL_NAME:
  391. DEBUG_INFO("Query model name: %s\r\n", (char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  392. tx_size = 7 + strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  393. outBuffer[0] = 0xaa;
  394. outBuffer[1] = PROTOCOL_ADDR;
  395. outBuffer[2] = inputBuffer[1];
  396. outBuffer[3] = CMD_QUERY_MODEL_NAME;
  397. outBuffer[4] = strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)&0xff;
  398. outBuffer[5] = (strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)>>0x08) & 0xff;
  399. for(uint8_t idx=0;idx<strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName);idx++)
  400. {
  401. outBuffer[6+idx] = (char)ShmSysConfigAndInfo->SysConfig.ModelName[idx];
  402. }
  403. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  404. {
  405. chksum ^= outBuffer[6 + idx];
  406. }
  407. outBuffer[6+(outBuffer[4] | (outBuffer[5]<<8))] = chksum;
  408. break;
  409. case CMD_QUERY_PARAMETER:
  410. break;
  411. case CMD_QUERY_RTC:
  412. DEBUG_INFO("Query system time.\r\n");
  413. ftime(&csuTime);
  414. tmCSU = localtime(&csuTime.time);
  415. tx_size = 21;
  416. outBuffer[0] = 0xaa;
  417. outBuffer[1] = PROTOCOL_ADDR;
  418. outBuffer[2] = inputBuffer[1];
  419. outBuffer[3] = CMD_QUERY_RTC;
  420. outBuffer[4] = 0x0e;
  421. outBuffer[5] = 0x00;
  422. outBuffer[6] = ((tmCSU->tm_year+1900)/1000)+'0';
  423. outBuffer[7] = (((tmCSU->tm_year+1900)%1000)/100)+'0';
  424. outBuffer[8] = (((tmCSU->tm_year+1900)%100)/10)+'0';
  425. outBuffer[9] = ((tmCSU->tm_year+1900)%10) +'0';
  426. outBuffer[10] = ((tmCSU->tm_mon+1)/10) +'0';
  427. outBuffer[11] = ((tmCSU->tm_mon+1)%10) +'0';
  428. outBuffer[12] = (tmCSU->tm_mday/10) +'0';
  429. outBuffer[13] = (tmCSU->tm_mday%10) +'0';
  430. outBuffer[14] = (tmCSU->tm_hour/10) +'0';
  431. outBuffer[15] = (tmCSU->tm_hour%10) +'0';
  432. outBuffer[16] = (tmCSU->tm_min/10) +'0';
  433. outBuffer[17] = (tmCSU->tm_min%10) +'0';
  434. outBuffer[18] = (tmCSU->tm_sec/10) +'0';
  435. outBuffer[19] = (tmCSU->tm_sec%10) +'0';
  436. for(uint16_t idx=0;idx<(outBuffer[4] | (outBuffer[5]<<8));idx++)
  437. {
  438. chksum ^= outBuffer[6 + idx];
  439. }
  440. outBuffer[20] = chksum;
  441. break;
  442. case CMD_QUERY_PRESENT_OUTPUTCURRENT:
  443. break;
  444. case CMD_QUERY_AC_STATUS:
  445. break;
  446. case CMD_QUERY_AC_ALARM:
  447. break;
  448. case CMD_QUERY_BLE_CONFIG_DATA:
  449. break;
  450. case CMD_QUERY_POWER_CONSUMPTION:
  451. break;
  452. case CMD_QUERY_GUN_PLUGIN_TIMES:
  453. break;
  454. case CMD_CONFIG_FAN_SPEED:
  455. break;
  456. case CMD_CONFIG_SERIAL_NUMBER:
  457. memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber));
  458. memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId));
  459. for(uint16_t idx=0;idx<((inputBuffer[4] | (inputBuffer[5]<<8))-8);idx++)
  460. {
  461. ShmSysConfigAndInfo->SysConfig.SerialNumber[idx] = inputBuffer[14+idx];
  462. }
  463. ShmSysConfigAndInfo->SysConfig.SerialNumber[(inputBuffer[4] | (inputBuffer[5]<<8))-8] = '\0';
  464. memcpy(ShmSysConfigAndInfo->SysConfig.SystemId, ShmSysConfigAndInfo->SysConfig.ModelName, strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName));
  465. memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId[strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)], ShmSysConfigAndInfo->SysConfig.SerialNumber, (inputBuffer[4] | (inputBuffer[5]<<8)));
  466. tx_size = 8;
  467. outBuffer[0] = 0xaa;
  468. outBuffer[1] = PROTOCOL_ADDR;
  469. outBuffer[2] = inputBuffer[1];
  470. outBuffer[3] = CMD_CONFIG_SERIAL_NUMBER;
  471. outBuffer[4] = 0x01;
  472. outBuffer[5] = 0x00;
  473. outBuffer[6] = (StoreUsrConfigData(&ShmSysConfigAndInfo->SysConfig)!=0x01?0x00:0x01);
  474. outBuffer[7] = outBuffer[6];
  475. DEBUG_INFO("Config serial number: %s\r\n", (char*)ShmSysConfigAndInfo->SysConfig.SerialNumber);
  476. break;
  477. case CMD_CONFIG_MODEL_NAME:
  478. memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber));
  479. memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId));
  480. for(uint16_t idx=0;idx<(inputBuffer[4] | (inputBuffer[5]<<8));idx++)
  481. {
  482. ShmSysConfigAndInfo->SysConfig.ModelName[idx] = inputBuffer[6+idx];
  483. }
  484. ShmSysConfigAndInfo->SysConfig.ModelName[(inputBuffer[4] | (inputBuffer[5]<<8))] = '\0';
  485. memcpy(ShmSysConfigAndInfo->SysConfig.SystemId, ShmSysConfigAndInfo->SysConfig.ModelName, strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName));
  486. memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId[strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName)], ShmSysConfigAndInfo->SysConfig.SerialNumber, (inputBuffer[4] | (inputBuffer[5]<<8)));
  487. tx_size = 8;
  488. outBuffer[0] = 0xaa;
  489. outBuffer[1] = PROTOCOL_ADDR;
  490. outBuffer[2] = inputBuffer[1];
  491. outBuffer[3] = CMD_CONFIG_MODEL_NAME;
  492. outBuffer[4] = 0x01;
  493. outBuffer[5] = 0x00;
  494. outBuffer[6] = (StoreUsrConfigData(&ShmSysConfigAndInfo->SysConfig)!=0x01?0x00:0x01);
  495. outBuffer[7] = outBuffer[6];
  496. DEBUG_INFO("Config model name: %s\r\n", (char*)ShmSysConfigAndInfo->SysConfig.ModelName);
  497. break;
  498. case CMD_CONFIG_RELAY_OUTPUT:
  499. break;
  500. case CMD_CONFIG_GPIO_OUTPUT:
  501. break;
  502. case CMD_CONFIG_RTC:
  503. DEBUG_INFO("Config system time.\r\n");
  504. tx_size = 8;
  505. outBuffer[0] = 0xaa;
  506. outBuffer[1] = PROTOCOL_ADDR;
  507. outBuffer[2] = inputBuffer[1];
  508. outBuffer[3] = CMD_CONFIG_RTC;
  509. outBuffer[4] = 0x01;
  510. outBuffer[5] = 0x00;
  511. outBuffer[6] = 0x01;
  512. outBuffer[7] = 0x01;
  513. 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'),
  514. (inputBuffer[10]-'0')*10+ (inputBuffer[11]-'0'),
  515. (inputBuffer[12]-'0')*10 + (inputBuffer[13]-'0'),
  516. (inputBuffer[14]-'0')*10 + (inputBuffer[15]-'0'),
  517. (inputBuffer[16]-'0')*10 + (inputBuffer[17]-'0'),
  518. (inputBuffer[18]-'0')*10 + (inputBuffer[19]-'0'));
  519. system((char*)cmdBuf);
  520. system("hwclock -w -u");
  521. system("hwclock -s");
  522. break;
  523. case CMD_CONFIG_AC_LED:
  524. break;
  525. case CMD_CONFIG_CURRENT_LINIT:
  526. break;
  527. case CMD_CONFIG_MCU_MODE:
  528. break;
  529. case CMD_CONFIG_MCU_RESET_REQUEST:
  530. break;
  531. case CMD_CONFIG_BREATHE_LED_TIMING:
  532. break;
  533. case CMD_UPDATE_START:
  534. break;
  535. case CMD_UPDATE_ABOARD:
  536. break;
  537. case CMD_UPDATE_TRANSFER:
  538. break;
  539. default:
  540. break;
  541. }
  542. }
  543. else
  544. {
  545. tx_size = 9;
  546. outBuffer[0] = 0xaa;
  547. outBuffer[1] = PROTOCOL_ADDR;
  548. outBuffer[2] = inputBuffer[1];
  549. outBuffer[3] = inputBuffer[3];
  550. outBuffer[4] = 0x01;
  551. outBuffer[5] = 0x00;
  552. outBuffer[6] = 0x00;
  553. outBuffer[7] = 0x00;
  554. }
  555. send(clientSockFd, outBuffer, tx_size, 0);
  556. }
  557. if(read_size == 0)
  558. {
  559. DEBUG_INFO("Client disconnected.\r\n");
  560. fflush(stdout);
  561. }
  562. else if(read_size == -1)
  563. {
  564. DEBUG_ERROR("Socket recv failed.\r\n");
  565. }
  566. sleep(1);
  567. }
  568. }