Common.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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 "Common.h"
  15. int StoreSysLogMsg(const char *fmt, ...)
  16. {
  17. char Buf[4096+256];
  18. char buffer[4096];
  19. va_list args;
  20. struct timeb SeqEndTime;
  21. struct tm *tm;
  22. va_start(args, fmt);
  23. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  24. va_end(args);
  25. memset(Buf,0,sizeof(Buf));
  26. ftime(&SeqEndTime);
  27. SeqEndTime.time = time(NULL);
  28. tm=localtime(&SeqEndTime.time);
  29. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  30. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  31. buffer,
  32. tm->tm_year+1900,tm->tm_mon+1);
  33. system(Buf);
  34. return rc;
  35. }
  36. int StorePsuLogMsg(const char *fmt, ...)
  37. {
  38. char Buf[4096+256];
  39. char buffer[4096];
  40. va_list args;
  41. struct timeb SeqEndTime;
  42. struct tm *tm;
  43. va_start(args, fmt);
  44. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  45. va_end(args);
  46. memset(Buf,0,sizeof(Buf));
  47. ftime(&SeqEndTime);
  48. SeqEndTime.time = time(NULL);
  49. tm=localtime(&SeqEndTime.time);
  50. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]PsuLog",
  51. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  52. buffer,
  53. tm->tm_year+1900,tm->tm_mon+1);
  54. system(Buf);
  55. return rc;
  56. }
  57. int StoreEventLogMsg(const char *fmt, ...)
  58. {
  59. char Buf[4096+256];
  60. char buffer[4096];
  61. va_list args;
  62. struct timeb SeqEndTime;
  63. struct tm *tm;
  64. va_start(args, fmt);
  65. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  66. va_end(args);
  67. memset(Buf,0,sizeof(Buf));
  68. ftime(&SeqEndTime);
  69. SeqEndTime.time = time(NULL);
  70. tm=localtime(&SeqEndTime.time);
  71. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/EventLog/[%04d.%02d]EventLog",
  72. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  73. buffer,
  74. tm->tm_year+1900,tm->tm_mon+1);
  75. system(Buf);
  76. return rc;
  77. }
  78. int StoreAuthLogMsg(const char *fmt, ...)
  79. {
  80. char Buf[4096+256];
  81. char buffer[4096];
  82. va_list args;
  83. struct timeb SeqEndTime;
  84. struct tm *tm;
  85. va_start(args, fmt);
  86. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  87. va_end(args);
  88. memset(Buf,0,sizeof(Buf));
  89. ftime(&SeqEndTime);
  90. SeqEndTime.time = time(NULL);
  91. tm=localtime(&SeqEndTime.time);
  92. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]AuthLog",
  93. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  94. buffer,
  95. tm->tm_year+1900,tm->tm_mon+1);
  96. system(Buf);
  97. return rc;
  98. }
  99. int StoreEvCommMsg(const char *fmt, ...)
  100. {
  101. char Buf[4096+256];
  102. char buffer[4096];
  103. va_list args;
  104. struct timeb SeqEndTime;
  105. struct tm *tm;
  106. va_start(args, fmt);
  107. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  108. va_end(args);
  109. memset(Buf,0,sizeof(Buf));
  110. ftime(&SeqEndTime);
  111. SeqEndTime.time = time(NULL);
  112. tm=localtime(&SeqEndTime.time);
  113. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]EvCommLog",
  114. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  115. buffer,
  116. tm->tm_year+1900,tm->tm_mon+1);
  117. system(Buf);
  118. return rc;
  119. }
  120. void GetClockTime(struct timespec *_now_time)
  121. {
  122. clock_gettime(CLOCK_MONOTONIC, _now_time);
  123. }
  124. // return value unit: 1us
  125. unsigned long GetTimeoutValue(struct timespec _start_time)
  126. {
  127. struct timespec ts_end;
  128. unsigned long ret = 0;
  129. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  130. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000000) + ((unsigned long)((ts_end.tv_nsec / 1000) - (_start_time.tv_nsec/ 1000)));
  131. /*
  132. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%06ld ns",
  133. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  134. (ret / 1000000), (ret % 1000000));
  135. */
  136. #if 0
  137. struct timespec ts_interval;
  138. ts_interval.tv_sec = ts_end.tv_sec - _start_time.tv_sec;
  139. ts_interval.tv_nsec = ts_end.tv_nsec - _start_time.tv_nsec;
  140. if(ts_interval.tv_nsec < 0)
  141. {
  142. ts_interval.tv_nsec += 1000000000;
  143. ts_interval.tv_sec--;
  144. }
  145. #endif
  146. return ret;
  147. }
  148. // return value unit: 1s
  149. unsigned long GetSecTimeoutValue(struct timespec _start_time)
  150. {
  151. struct timespec ts_end;
  152. unsigned long ret = 0;
  153. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  154. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000) + ((unsigned long)((ts_end.tv_nsec / 1000000) - (_start_time.tv_nsec / 1000000)));
  155. /*
  156. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%03ld ms",
  157. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  158. (ret / 1000), (ret % 1000));
  159. */
  160. ret /= 1000;
  161. return ret;
  162. }
  163. int StatusCodeCompose(char *oriCode, char *newCode)
  164. {
  165. if(strlen(oriCode) > 0)
  166. {
  167. strcat(oriCode, ",");
  168. }
  169. strcat(oriCode, newCode);
  170. return strlen(oriCode);
  171. }
  172. void getNowDatetime(unsigned char *data)
  173. {
  174. time_t t = time(NULL);
  175. struct tm tm = *localtime(&t);
  176. 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);
  177. }
  178. int IsModelNameMatch_ForUpdate(char *model_1, char *model_2)
  179. {
  180. if(strlen(model_1) < MODELNAME_LENGTH || strlen(model_2) < MODELNAME_LENGTH)
  181. {
  182. return NO;
  183. }
  184. if(model_1[0] == model_2[0] &&
  185. model_1[1] == model_2[1] &&
  186. model_1[7] == model_2[7] &&
  187. model_1[8] == model_2[8] &&
  188. model_1[9] == model_2[9] &&
  189. model_1[11] == model_2[11] &&
  190. model_1[12] == model_2[12] &&
  191. model_1[13] == model_2[13])
  192. {
  193. return YES;
  194. }
  195. return NO;
  196. }
  197. int IsCabinetModelNameLegal(char *modelName)
  198. {
  199. if(strlen(modelName) != MODELNAME_LENGTH || modelName[0] != 'D')
  200. {
  201. return false;
  202. }
  203. if(modelName[1] != 'O' && modelName[1] != 'B' && modelName[1] != 'K')
  204. {
  205. return false;
  206. }
  207. return true;
  208. }
  209. int IsSerialNumberLegal(char *sn)
  210. {
  211. if(strlen(sn) != SERIAL_NUMBER_LENGTH)
  212. {
  213. return false;
  214. }
  215. return true;
  216. }
  217. int IsSystemIdLegal(char *systemId)
  218. {
  219. if(strlen(systemId) > SYSTEM_ID_LENGTH)
  220. {
  221. return false;
  222. }
  223. return true;
  224. }
  225. char *strrpc(char *str, char *oldStr, char *newStr)
  226. {
  227. char bstr[strlen(str)];
  228. memset(bstr, 0x00, sizeof(bstr));
  229. for(int i = 0; i < strlen(str); i++)
  230. {
  231. if(!strncmp(str+i, oldStr, strlen(oldStr)))
  232. {
  233. strcat(bstr, newStr);
  234. i += strlen(oldStr) - 1;
  235. }
  236. else
  237. {
  238. strncat(bstr, str + i, 1);
  239. }
  240. }
  241. strcpy(str,bstr);
  242. return str;
  243. }
  244. // return the start position of the first occurrence
  245. int StringInStr(char *string, char *key)
  246. {
  247. int startIndex = -1;
  248. char *startPtr;
  249. startPtr = strstr(string, key);
  250. if(startPtr > 0)
  251. {
  252. startIndex = (int)startPtr - (int)string;
  253. }
  254. return startIndex;
  255. }
  256. int FindStringInStr(char *sourceString, char *key, char *findString)
  257. {
  258. int len = 0;
  259. char *findPtr = strstr(sourceString, key);
  260. if(findPtr > 0)
  261. {
  262. len = StringInStr(findPtr, " ");
  263. if(len > 0)
  264. {
  265. memcpy(findString, findPtr, len);
  266. findString[len] = '\0';
  267. }
  268. }
  269. return len;
  270. }
  271. // return quantity of number
  272. int Trim_String(char *string , int len)
  273. {
  274. bool find = false;
  275. int quantity = 0;
  276. for(int i = 0 ; i < len; i++)
  277. {
  278. if(!(string[i] == '.' || (string[i] >= '0' && string[i] <= '9')))
  279. {
  280. if(find)
  281. {
  282. string[i] = ' ';
  283. }
  284. else
  285. {
  286. char temp[256];
  287. memset(temp, 0x00, sizeof(temp));
  288. memcpy(temp, &string[i + 1], len - i);
  289. strncpy(&string[i], temp, len - i);
  290. i -= 1;
  291. len -= 1;
  292. }
  293. find = false;
  294. }
  295. else
  296. {
  297. if(!find)
  298. {
  299. quantity++;
  300. }
  301. find = true;
  302. }
  303. }
  304. string[len] = '\0';
  305. return quantity;
  306. }
  307. int Split(char **array, char *strSource, const char *key)
  308. {
  309. int quantity = 0;
  310. char *ptrSave, *ptrToken;
  311. ptrToken = strtok_r(strSource, key, &ptrSave);
  312. while(ptrToken != NULL)
  313. {
  314. *array++ = ptrToken;
  315. quantity++;
  316. ptrToken = strtok_r(NULL, key, &ptrSave);
  317. }
  318. return quantity;
  319. }
  320. float PriceParsing(char *PriceString, char *ParseKey, char *SplitKey)
  321. {
  322. char strSource[1024];
  323. char *splitStringList[128];
  324. int splitQuantity = 0;
  325. float fee = 0;
  326. memset(strSource, 0x00, sizeof(strSource));
  327. strcpy(strSource, PriceString);
  328. if(strlen(ParseKey) > 0)
  329. {
  330. splitQuantity = Split(splitStringList, strSource, SplitKey);
  331. for(int i = 0; (i < splitQuantity && i < 128); i++)
  332. {
  333. if(strstr(splitStringList[i], ParseKey) > 0)
  334. {
  335. Trim_String(splitStringList[i], strlen(splitStringList[i]));
  336. fee = atof(splitStringList[i]);
  337. break;
  338. }
  339. }
  340. }
  341. else
  342. {
  343. Trim_String(PriceString, strlen(PriceString));
  344. fee = atof(PriceString);
  345. }
  346. return fee;
  347. }
  348. // Shell Default & User Price Parsing
  349. // input: priceString
  350. // output: resultPrice
  351. char *ShellPriceParsing(char *priceString, char *resultPrice)
  352. {
  353. char strSource[1024];
  354. memset(strSource, 0x00, sizeof(strSource));
  355. strcpy(strSource, priceString);
  356. strcpy(strSource, strrpc(strSource,"\n", " "));
  357. strcpy(resultPrice, strSource);
  358. return resultPrice;
  359. }
  360. // Shell RunningCost Parsing
  361. float ShellRunningCostParsing(char *runningCostString)
  362. {
  363. int splitCnt = 0;
  364. float energy = 0, fee = 0;
  365. int connector = 0;
  366. char *splitStringList[128];
  367. char strSource[1024];
  368. int trimCnt = 0;
  369. memset(strSource, 0x00, sizeof(strSource));
  370. strcpy(strSource, runningCostString);
  371. splitCnt = Split(splitStringList, strSource, "\n");
  372. for(int i = 0; i < splitCnt; i++)
  373. {
  374. if(strstr(splitStringList[i], "Current Total") > 0)
  375. {
  376. trimCnt = Trim_String(splitStringList[i], strlen(splitStringList[i]));
  377. if(trimCnt == 3)
  378. {
  379. sscanf(splitStringList[i], "%f %f %d", &energy, &fee, &connector);
  380. }
  381. break;
  382. }
  383. }
  384. return fee;
  385. }
  386. // Shell FinalCost
  387. float ShellFinalCostParsing(char *finalCostString)
  388. {
  389. int splitCnt = 0;
  390. float fee = 0;
  391. char *splitStringList[128];
  392. char strSource[1024];
  393. memset(strSource, 0x00, sizeof(strSource));
  394. strcpy(strSource, finalCostString);
  395. splitCnt = Split(splitStringList, strSource, "\n");
  396. for(int i = 0; i < splitCnt; i++)
  397. {
  398. if(strstr(splitStringList[i], "Total") > 0)
  399. {
  400. for(int j = i + 1; j < splitCnt; j++)
  401. {
  402. if(strstr(splitStringList[j], "Cost:") > 0)
  403. {
  404. Trim_String(splitStringList[j], strlen(splitStringList[j]));
  405. fee = atof(splitStringList[j]);
  406. break;
  407. }
  408. }
  409. break;
  410. }
  411. }
  412. return fee;
  413. }
  414. int GetShellReceiptInfo(char *finalCostString, char *receiptInfo)
  415. {
  416. int splitCnt = 0;
  417. int length = 0;
  418. char *splitStringList[128];
  419. char strSource[1024];
  420. memset(strSource, 0x00, sizeof(strSource));
  421. strcpy(strSource, finalCostString);
  422. splitCnt = Split(splitStringList, strSource, "\n");
  423. for(int i = 0; i < splitCnt; i++)
  424. {
  425. if(strstr(splitStringList[i], "Total") > 0)
  426. {
  427. for(int j = i + 1; j < splitCnt; j++)
  428. {
  429. if(strstr(splitStringList[j], "Receipt:") > 0)
  430. {
  431. length = FindStringInStr(splitStringList[j], "http", receiptInfo);
  432. }
  433. }
  434. break;
  435. }
  436. }
  437. return length;
  438. }