Common.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. /*
  2. * Common.c
  3. *
  4. * Created on: 2021年8月7日
  5. * Author: Wendell
  6. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <stdbool.h>
  10. #include <string.h>
  11. #include <stdarg.h>
  12. #include <time.h>
  13. #include <sys/timeb.h>
  14. #include <fcntl.h>
  15. #include <sys/stat.h>
  16. #include <unistd.h>
  17. #include "Common.h"
  18. int StoreSysLogMsg(const char *fmt, ...)
  19. {
  20. char Buf[4096+256];
  21. char buffer[4096];
  22. va_list args;
  23. struct timeb SeqEndTime;
  24. struct tm *tm;
  25. va_start(args, fmt);
  26. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  27. va_end(args);
  28. memset(Buf,0,sizeof(Buf));
  29. ftime(&SeqEndTime);
  30. SeqEndTime.time = time(NULL);
  31. tm=localtime(&SeqEndTime.time);
  32. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  33. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  34. buffer,
  35. tm->tm_year+1900,tm->tm_mon+1);
  36. system(Buf);
  37. return rc;
  38. }
  39. int StorePsuLogMsg(const char *fmt, ...)
  40. {
  41. char Buf[4096+256];
  42. char buffer[4096];
  43. va_list args;
  44. struct timeb SeqEndTime;
  45. struct tm *tm;
  46. va_start(args, fmt);
  47. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  48. va_end(args);
  49. memset(Buf,0,sizeof(Buf));
  50. ftime(&SeqEndTime);
  51. SeqEndTime.time = time(NULL);
  52. tm=localtime(&SeqEndTime.time);
  53. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]PsuLog",
  54. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  55. buffer,
  56. tm->tm_year+1900,tm->tm_mon+1);
  57. system(Buf);
  58. return rc;
  59. }
  60. int StoreAuthLogMsg(const char *fmt, ...)
  61. {
  62. char Buf[4096+256];
  63. char buffer[4096];
  64. va_list args;
  65. struct timeb SeqEndTime;
  66. struct tm *tm;
  67. va_start(args, fmt);
  68. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  69. va_end(args);
  70. memset(Buf,0,sizeof(Buf));
  71. ftime(&SeqEndTime);
  72. SeqEndTime.time = time(NULL);
  73. tm=localtime(&SeqEndTime.time);
  74. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]AuthLog",
  75. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  76. buffer,
  77. tm->tm_year+1900,tm->tm_mon+1);
  78. system(Buf);
  79. return rc;
  80. }
  81. int StoreEvCommMsg(const char *fmt, ...)
  82. {
  83. char Buf[4096+256];
  84. char buffer[4096];
  85. va_list args;
  86. struct timeb SeqEndTime;
  87. struct tm *tm;
  88. va_start(args, fmt);
  89. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  90. va_end(args);
  91. memset(Buf,0,sizeof(Buf));
  92. ftime(&SeqEndTime);
  93. SeqEndTime.time = time(NULL);
  94. tm=localtime(&SeqEndTime.time);
  95. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]EvCommLog",
  96. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  97. buffer,
  98. tm->tm_year+1900,tm->tm_mon+1);
  99. system(Buf);
  100. return rc;
  101. }
  102. int StoreDbMsg(const char *fmt, ...)
  103. {
  104. char Buf[4096+256];
  105. char buffer[4096];
  106. va_list args;
  107. struct timeb SeqEndTime;
  108. struct tm *tm;
  109. va_start(args, fmt);
  110. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  111. va_end(args);
  112. memset(Buf,0,sizeof(Buf));
  113. ftime(&SeqEndTime);
  114. SeqEndTime.time = time(NULL);
  115. tm=localtime(&SeqEndTime.time);
  116. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]DbLog",
  117. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  118. buffer,
  119. tm->tm_year+1900,tm->tm_mon+1);
  120. system(Buf);
  121. return rc;
  122. }
  123. int StoreOccupancyMsg(const char *fmt, ...)
  124. {
  125. char Buf[4096+256];
  126. char buffer[4096];
  127. va_list args;
  128. struct timeb SeqEndTime;
  129. struct tm *tm;
  130. va_start(args, fmt);
  131. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  132. va_end(args);
  133. memset(Buf,0,sizeof(Buf));
  134. ftime(&SeqEndTime);
  135. SeqEndTime.time = time(NULL);
  136. tm=localtime(&SeqEndTime.time);
  137. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]OccupancyLog",
  138. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  139. buffer,
  140. tm->tm_year+1900,tm->tm_mon+1);
  141. system(Buf);
  142. return rc;
  143. }
  144. int StoreReadCmdLineMsg(const char *fmt, ...)
  145. {
  146. char Buf[4096+256];
  147. char buffer[4096];
  148. va_list args;
  149. struct timeb SeqEndTime;
  150. struct tm *tm;
  151. va_start(args, fmt);
  152. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  153. va_end(args);
  154. memset(Buf,0,sizeof(Buf));
  155. ftime(&SeqEndTime);
  156. SeqEndTime.time = time(NULL);
  157. tm=localtime(&SeqEndTime.time);
  158. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]ReadCmdLineLog",
  159. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  160. buffer,
  161. tm->tm_year+1900,tm->tm_mon+1);
  162. system(Buf);
  163. return rc;
  164. }
  165. void GetClockTime(struct timespec *_now_time)
  166. {
  167. clock_gettime(CLOCK_MONOTONIC, _now_time);
  168. }
  169. // return value unit: 1us
  170. unsigned long GetTimeoutValue(struct timespec _start_time)
  171. {
  172. struct timespec ts_end;
  173. unsigned long ret = 0;
  174. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  175. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000000) + ((unsigned long)((ts_end.tv_nsec / 1000) - (_start_time.tv_nsec/ 1000)));
  176. /*
  177. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%06ld ns",
  178. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  179. (ret / 1000000), (ret % 1000000));
  180. */
  181. #if 0
  182. struct timespec ts_interval;
  183. ts_interval.tv_sec = ts_end.tv_sec - _start_time.tv_sec;
  184. ts_interval.tv_nsec = ts_end.tv_nsec - _start_time.tv_nsec;
  185. if(ts_interval.tv_nsec < 0)
  186. {
  187. ts_interval.tv_nsec += 1000000000;
  188. ts_interval.tv_sec--;
  189. }
  190. #endif
  191. return ret;
  192. }
  193. // return value unit: 1s
  194. unsigned long GetSecTimeoutValue(struct timespec _start_time)
  195. {
  196. struct timespec ts_end;
  197. unsigned long ret = 0;
  198. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  199. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000) + ((unsigned long)((ts_end.tv_nsec / 1000000) - (_start_time.tv_nsec / 1000000)));
  200. /*
  201. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%03ld ms",
  202. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  203. (ret / 1000), (ret % 1000));
  204. */
  205. ret /= 1000;
  206. return ret;
  207. }
  208. int StatusCodeCompose(char *oriCode, char *newCode)
  209. {
  210. if(strlen(oriCode) > 0)
  211. {
  212. strcat(oriCode, ",");
  213. }
  214. strcat(oriCode, newCode);
  215. return strlen(oriCode);
  216. }
  217. void getNowDatetime(unsigned char *data)
  218. {
  219. time_t t = time(NULL);
  220. struct tm tm = *localtime(&t);
  221. sprintf((char*)data, "%04d-%02d-%02dT%02d:%02d:%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  222. }
  223. int IsModelNameMatch_ForUpdate(char *model_1, char *model_2)
  224. {
  225. if(strlen(model_1) < MODELNAME_LENGTH || strlen(model_2) < MODELNAME_LENGTH)
  226. {
  227. return NO;
  228. }
  229. if(model_1[0] == model_2[0] &&
  230. model_1[1] == model_2[1] &&
  231. model_1[7] == model_2[7] &&
  232. model_1[8] == model_2[8] &&
  233. model_1[9] == model_2[9] &&
  234. model_1[11] == model_2[11] &&
  235. model_1[12] == model_2[12] &&
  236. model_1[13] == model_2[13])
  237. {
  238. return YES;
  239. }
  240. return NO;
  241. }
  242. int IsCabinetModelNameLegal(char *modelName)
  243. {
  244. if(strlen(modelName) != MODELNAME_LENGTH || modelName[0] != 'D')
  245. {
  246. return false;
  247. }
  248. if(modelName[1] != 'O' && modelName[1] != 'B' && modelName[1] != 'K')
  249. {
  250. return false;
  251. }
  252. return true;
  253. }
  254. int IsSerialNumberLegal(char *sn)
  255. {
  256. if(strlen(sn) != SERIAL_NUMBER_LENGTH)
  257. {
  258. return false;
  259. }
  260. return true;
  261. }
  262. int IsSystemIdLegal(char *systemId)
  263. {
  264. if(strlen(systemId) > SYSTEM_ID_LENGTH)
  265. {
  266. return false;
  267. }
  268. return true;
  269. }
  270. char *strrpc(char *str, char *oldStr, char *newStr)
  271. {
  272. char bstr[strlen(str)];
  273. memset(bstr, 0x00, sizeof(bstr));
  274. for(int i = 0; i < strlen(str); i++)
  275. {
  276. if(!strncmp(str+i, oldStr, strlen(oldStr)))
  277. {
  278. strcat(bstr, newStr);
  279. i += strlen(oldStr) - 1;
  280. }
  281. else
  282. {
  283. strncat(bstr, str + i, 1);
  284. }
  285. }
  286. strcpy(str,bstr);
  287. return str;
  288. }
  289. // return the start position of the first occurrence
  290. int StringInStr(char *string, char *key)
  291. {
  292. int startIndex = -1;
  293. char *startPtr;
  294. startPtr = strstr(string, key);
  295. if(startPtr > 0)
  296. {
  297. startIndex = (int)startPtr - (int)string;
  298. }
  299. return startIndex;
  300. }
  301. int FindStringInStr(char *sourceString, char *key, char *findString)
  302. {
  303. int len = 0;
  304. char *findPtr = strstr(sourceString, key);
  305. if(findPtr > 0)
  306. {
  307. len = StringInStr(findPtr, " ");
  308. if(len > 0)
  309. {
  310. memcpy(findString, findPtr, len);
  311. findString[len] = '\0';
  312. }
  313. }
  314. return len;
  315. }
  316. // return quantity of number
  317. int Trim_String(char *string , int len)
  318. {
  319. bool find = false;
  320. int quantity = 0;
  321. for(int i = 0 ; i < len; i++)
  322. {
  323. if(!(string[i] == '.' || (string[i] >= '0' && string[i] <= '9')))
  324. {
  325. if(find)
  326. {
  327. string[i] = ' ';
  328. }
  329. else
  330. {
  331. memmove(&string[i], &string[i + 1], len - i);
  332. i -= 1;
  333. len -= 1;
  334. }
  335. find = false;
  336. }
  337. else
  338. {
  339. if(!find)
  340. {
  341. quantity++;
  342. }
  343. find = true;
  344. }
  345. }
  346. string[len] = '\0';
  347. return quantity;
  348. }
  349. int Split(char **array, char *strSource, const char *key)
  350. {
  351. int quantity = 0;
  352. char *ptrSave, *ptrToken;
  353. ptrToken = strtok_r(strSource, key, &ptrSave);
  354. while(ptrToken != NULL)
  355. {
  356. *array++ = ptrToken;
  357. quantity++;
  358. ptrToken = strtok_r(NULL, key, &ptrSave);
  359. }
  360. return quantity;
  361. }
  362. float PriceParsing(char *PriceString, char *ParseKey, char *SplitKey)
  363. {
  364. char strSource[1024];
  365. char *splitStringList[128];
  366. int splitQuantity = 0;
  367. float fee = 0;
  368. memset(strSource, 0x00, sizeof(strSource));
  369. strcpy(strSource, PriceString);
  370. if(strlen(ParseKey) > 0)
  371. {
  372. splitQuantity = Split(splitStringList, strSource, SplitKey);
  373. for(int i = 0; (i < splitQuantity && i < 128); i++)
  374. {
  375. if(strstr(splitStringList[i], ParseKey) > 0)
  376. {
  377. Trim_String(splitStringList[i], strlen(splitStringList[i]));
  378. fee = atof(splitStringList[i]);
  379. break;
  380. }
  381. }
  382. }
  383. else
  384. {
  385. Trim_String(PriceString, strlen(PriceString));
  386. fee = atof(PriceString);
  387. }
  388. return fee;
  389. }
  390. // Shell Default & User Price Parsing
  391. // input: priceString
  392. // output: resultPrice
  393. char *ShellPriceParsing(char *priceString, char *resultPrice)
  394. {
  395. char strSource[1024];
  396. memset(strSource, 0x00, sizeof(strSource));
  397. strcpy(strSource, priceString);
  398. strcpy(strSource, strrpc(strSource,"\n", " "));
  399. strcpy(resultPrice, strSource);
  400. return resultPrice;
  401. }
  402. // Shell RunningCost Parsing
  403. float ShellRunningCostParsing(char *runningCostString)
  404. {
  405. int splitCnt = 0;
  406. float energy = 0, fee = 0;
  407. int connector = 0;
  408. char *splitStringList[128];
  409. char strSource[1024];
  410. int trimCnt = 0;
  411. memset(strSource, 0x00, sizeof(strSource));
  412. strcpy(strSource, runningCostString);
  413. splitCnt = Split(splitStringList, strSource, "\n");
  414. for(int i = 0; i < splitCnt; i++)
  415. {
  416. if(strstr(splitStringList[i], "Current Total") > 0)
  417. {
  418. trimCnt = Trim_String(splitStringList[i], strlen(splitStringList[i]));
  419. if(trimCnt == 3)
  420. {
  421. sscanf(splitStringList[i], "%f %f %d", &energy, &fee, &connector);
  422. }
  423. break;
  424. }
  425. }
  426. return fee;
  427. }
  428. // Shell FinalCost
  429. float ShellFinalCostParsing(char *finalCostString)
  430. {
  431. int splitCnt = 0;
  432. float fee = 0;
  433. char *splitStringList[128];
  434. char strSource[1024];
  435. memset(strSource, 0x00, sizeof(strSource));
  436. strcpy(strSource, finalCostString);
  437. splitCnt = Split(splitStringList, strSource, "\n");
  438. for(int i = 0; i < splitCnt; i++)
  439. {
  440. if(strstr(splitStringList[i], "Total") > 0)
  441. {
  442. for(int j = i + 1; j < splitCnt; j++)
  443. {
  444. if(strstr(splitStringList[j], "Cost:") > 0)
  445. {
  446. Trim_String(splitStringList[j], strlen(splitStringList[j]));
  447. fee = atof(splitStringList[j]);
  448. break;
  449. }
  450. }
  451. break;
  452. }
  453. }
  454. return fee;
  455. }
  456. int GetShellReceiptInfo(char *finalCostString, char *receiptInfo)
  457. {
  458. int splitCnt = 0;
  459. int length = 0;
  460. char *splitStringList[128];
  461. char strSource[1024];
  462. memset(strSource, 0x00, sizeof(strSource));
  463. strcpy(strSource, finalCostString);
  464. splitCnt = Split(splitStringList, strSource, "\n");
  465. for(int i = 0; i < splitCnt; i++)
  466. {
  467. if(strstr(splitStringList[i], "Total") > 0)
  468. {
  469. for(int j = i + 1; j < splitCnt; j++)
  470. {
  471. if(strstr(splitStringList[j], "Receipt:") > 0)
  472. {
  473. length = FindStringInStr(splitStringList[j], "http", receiptInfo);
  474. }
  475. }
  476. break;
  477. }
  478. }
  479. return length;
  480. }
  481. float DefaultPriceParsing(char *StringItem)
  482. {
  483. char *ptrSave, *ptrToken;
  484. char strSource[128];
  485. float fee = 0;
  486. memcpy(strSource, StringItem, 128);
  487. ptrToken = strtok_r(strSource, ",", &ptrSave);
  488. while(ptrToken != NULL)
  489. {
  490. char *strFee = strstr(ptrToken, "$");
  491. if(strFee != NULL)
  492. {
  493. strFee++;
  494. fee = atof(strFee);
  495. break;
  496. }
  497. else
  498. {
  499. fee = atof(ptrToken);
  500. break;
  501. }
  502. ptrToken = strtok_r(NULL, ",", &ptrSave);
  503. }
  504. return fee;
  505. }
  506. float GetNowTimePricing(float *price)
  507. {
  508. float fee = 0;
  509. time_t CurrentTime;
  510. struct tm *tm;
  511. CurrentTime = time(NULL);
  512. tm=localtime(&CurrentTime);
  513. fee = price[tm->tm_hour];
  514. return fee;
  515. }
  516. // Shell RunningCost Parsing
  517. float TccDefaultPriceParsing(char *costString, float *price)
  518. {
  519. int splitCnt = 0;
  520. float fee = 0;
  521. char *splitStringList[128];
  522. char strSource[1024];
  523. memset(strSource, 0x00, sizeof(strSource));
  524. strcpy(strSource, costString);
  525. splitCnt = Split(splitStringList, strSource, "|");
  526. if(splitCnt == 24)
  527. {
  528. for(int i = 0; i < splitCnt; i++)
  529. {
  530. Trim_String(splitStringList[i], strlen(splitStringList[i]));
  531. price[i] = atof(splitStringList[i]);
  532. }
  533. fee = GetNowTimePricing(price);
  534. }
  535. return fee;
  536. }
  537. unsigned short ParsingRatingPower(char *modelname)
  538. {
  539. char strVal[3], strExp[2];
  540. unsigned short value = 0, exponent = 0;
  541. memset(strVal, 0x00, sizeof(strVal));
  542. memset(strExp, 0x00, sizeof(strExp));
  543. memcpy(strVal, &modelname[4], 2);
  544. memcpy(strExp, &modelname[6], 1);
  545. value = atoi(strVal);
  546. exponent = atoi(strExp);
  547. if(value < 0 || exponent < 0)
  548. {
  549. return 0;
  550. }
  551. for(int i = 0; i < exponent; i++)
  552. {
  553. value *= 10;
  554. }
  555. return value;
  556. }
  557. unsigned int cal_crc32(unsigned char *data, unsigned int length)
  558. {
  559. unsigned int crc = 0xFFFFFFFF;
  560. for(size_t i = 0; i < length; i++)
  561. {
  562. char ch = data[i];
  563. for(size_t j = 0; j < 8; j++)
  564. {
  565. unsigned int b = (ch ^ crc) & 1;
  566. crc >>= 1;
  567. if(b)
  568. {
  569. crc=crc^0xEDB88320;
  570. }
  571. ch>>=1;
  572. }
  573. }
  574. return ~crc;
  575. }
  576. unsigned int getFileCrc32(char *filename)
  577. {
  578. unsigned int result = 0;
  579. int fd = open(filename, O_RDONLY);
  580. if(fd < 0)
  581. {
  582. LOG_ERROR("Get File Crc32 Error, Can not open file %s", filename);
  583. }
  584. else
  585. {
  586. struct stat st;
  587. stat(filename, &st);
  588. unsigned char *data;
  589. data = malloc(st.st_size);
  590. if(read(fd,data,st.st_size) == st.st_size)
  591. {
  592. result = cal_crc32(data, st.st_size);
  593. close(fd);
  594. }
  595. else
  596. {
  597. LOG_ERROR("Read file Error %d", st.st_size);
  598. }
  599. free(data);
  600. }
  601. return result;
  602. }
  603. #define GUN_TYPE_QUANTITY 16
  604. bool IsAvalibleGunType(char name, unsigned char *type)
  605. {
  606. // 20210817 remove type "R"
  607. // 0: Chademo, 1: CCS, 2: GB
  608. char modelList[GUN_TYPE_QUANTITY] = {'J', 'U', 'V', 'E', 'F', 'G', 'T', 'D', 'K', 'P', 'S', 'Y', 'Z', 'I', 'Q', 'O'};
  609. unsigned char typeList[GUN_TYPE_QUANTITY] = { 0, 1, 1, 1, 1, 2, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0};
  610. for(int i = 0; i < GUN_TYPE_QUANTITY; i++)
  611. {
  612. if(name == modelList[i])
  613. {
  614. *type = typeList[i];
  615. return true;
  616. }
  617. }
  618. return false;
  619. }
  620. // Input: _MainVer, _ModelName
  621. // Output: _FullVer
  622. void GetFullFirmwareVersion(char *_MainVer, char *_ModelName, char *_FullVer)
  623. {
  624. int count = 0, chademo = 0, ccs = 0, gb = 0;
  625. unsigned char _type = 0;
  626. strcpy(_FullVer, _MainVer);
  627. for(int idx = 0; idx < 3; idx++)
  628. {
  629. if(IsAvalibleGunType(_ModelName[7 + idx], &_type))
  630. {
  631. switch(_type)
  632. {
  633. // CHAdeMO
  634. case 0:
  635. chademo++;
  636. count++;
  637. break;
  638. // CCS
  639. case 1:
  640. ccs++;
  641. count++;
  642. break;
  643. // GBT
  644. case 2:
  645. gb++;
  646. count++;
  647. break;
  648. }
  649. }
  650. }
  651. if(count == 1)
  652. {
  653. if(chademo > 0)
  654. {
  655. _FullVer[7] = '1';
  656. }
  657. else if(ccs > 0)
  658. {
  659. _FullVer[7] = '2';
  660. }
  661. else if(gb > 0)
  662. {
  663. _FullVer[7] = '3';
  664. }
  665. }
  666. else
  667. {
  668. if(chademo > 0 && ccs > 0)
  669. {
  670. _FullVer[7] = '4';
  671. }
  672. else if(chademo > 0 && gb > 0)
  673. {
  674. _FullVer[7] = '5';
  675. }
  676. else if(ccs > 0 && gb > 0)
  677. {
  678. _FullVer[7] = '6';
  679. }
  680. }
  681. // Get network option from model name
  682. switch(_ModelName[10])
  683. {
  684. case 'B':
  685. case 'U':
  686. //Blue tooth
  687. _FullVer[9] = '3';
  688. break;
  689. case 'W':
  690. // WIFI
  691. _FullVer[9] = '1';
  692. break;
  693. case 'T':
  694. // 3G/4G
  695. _FullVer[9] = '2';
  696. break;
  697. case 'D':
  698. _FullVer[9] = '5';
  699. break;
  700. default:
  701. // LAN
  702. _FullVer[9] = '0';
  703. break;
  704. }
  705. // Get rating power from model name
  706. memcpy(&_FullVer[10], &_ModelName[4], 0x03);
  707. // Get customer code
  708. memcpy(&_FullVer[14], &_ModelName[12], 2);
  709. }
  710. //***************************************** No Use *****************************************
  711. float TariffParsing(char *StringItem, char *TariffCode)
  712. {
  713. char *ptrSave, *ptrToken;
  714. char strSource[128];
  715. float fee = 0;
  716. memcpy(strSource, StringItem, 128);
  717. ptrToken = strtok_r(strSource, ";", &ptrSave);
  718. while(ptrToken != NULL)
  719. {
  720. char *strTariff = strstr(ptrToken, TariffCode);
  721. if(strTariff != NULL)
  722. {
  723. char *strFee = strstr(strTariff, "$");
  724. if(strFee != NULL)
  725. {
  726. strFee++;
  727. fee = atof(strFee);
  728. break;
  729. }
  730. }
  731. ptrToken = strtok_r(NULL, ";", &ptrSave);
  732. }
  733. return fee;
  734. }
  735. float PhTariffParsing(char *StringItem, char *TariffCode)
  736. {
  737. char *ptrSave, *ptrToken;
  738. char strSource[128];
  739. float fee = 0;
  740. memcpy(strSource, StringItem, 128);
  741. ptrToken = strtok_r(strSource, ",", &ptrSave);
  742. while(ptrToken != NULL)
  743. {
  744. char *strTariff = strstr(ptrToken, TariffCode);
  745. if(strTariff != NULL)
  746. {
  747. char *strFee = strstr(strTariff, ":");
  748. if(strFee != NULL)
  749. {
  750. strFee++;
  751. fee = atof(strFee);
  752. break;
  753. }
  754. }
  755. ptrToken = strtok_r(NULL, ",", &ptrSave);
  756. }
  757. return fee;
  758. }
  759. //***************************************** No Use *****************************************