Common.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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. int StoreDbMsg(const char *fmt, ...)
  121. {
  122. char Buf[4096+256];
  123. char buffer[4096];
  124. va_list args;
  125. struct timeb SeqEndTime;
  126. struct tm *tm;
  127. va_start(args, fmt);
  128. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  129. va_end(args);
  130. memset(Buf,0,sizeof(Buf));
  131. ftime(&SeqEndTime);
  132. SeqEndTime.time = time(NULL);
  133. tm=localtime(&SeqEndTime.time);
  134. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]DbLog",
  135. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  136. buffer,
  137. tm->tm_year+1900,tm->tm_mon+1);
  138. system(Buf);
  139. return rc;
  140. }
  141. int StoreOccupancyMsg(const char *fmt, ...)
  142. {
  143. char Buf[4096+256];
  144. char buffer[4096];
  145. va_list args;
  146. struct timeb SeqEndTime;
  147. struct tm *tm;
  148. va_start(args, fmt);
  149. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  150. va_end(args);
  151. memset(Buf,0,sizeof(Buf));
  152. ftime(&SeqEndTime);
  153. SeqEndTime.time = time(NULL);
  154. tm=localtime(&SeqEndTime.time);
  155. sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]OccupancyLog",
  156. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
  157. buffer,
  158. tm->tm_year+1900,tm->tm_mon+1);
  159. system(Buf);
  160. return rc;
  161. }
  162. void GetClockTime(struct timespec *_now_time)
  163. {
  164. clock_gettime(CLOCK_MONOTONIC, _now_time);
  165. }
  166. // return value unit: 1us
  167. unsigned long GetTimeoutValue(struct timespec _start_time)
  168. {
  169. struct timespec ts_end;
  170. unsigned long ret = 0;
  171. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  172. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000000) + ((unsigned long)((ts_end.tv_nsec / 1000) - (_start_time.tv_nsec/ 1000)));
  173. /*
  174. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%06ld ns",
  175. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  176. (ret / 1000000), (ret % 1000000));
  177. */
  178. #if 0
  179. struct timespec ts_interval;
  180. ts_interval.tv_sec = ts_end.tv_sec - _start_time.tv_sec;
  181. ts_interval.tv_nsec = ts_end.tv_nsec - _start_time.tv_nsec;
  182. if(ts_interval.tv_nsec < 0)
  183. {
  184. ts_interval.tv_nsec += 1000000000;
  185. ts_interval.tv_sec--;
  186. }
  187. #endif
  188. return ret;
  189. }
  190. // return value unit: 1s
  191. unsigned long GetSecTimeoutValue(struct timespec _start_time)
  192. {
  193. struct timespec ts_end;
  194. unsigned long ret = 0;
  195. clock_gettime(CLOCK_MONOTONIC, &ts_end);
  196. ret = ((unsigned long)(ts_end.tv_sec - _start_time.tv_sec) * 1000) + ((unsigned long)((ts_end.tv_nsec / 1000000) - (_start_time.tv_nsec / 1000000)));
  197. /*
  198. printf("\r\n TimeInterval: %ld.%09ld - %ld.%09ld = %ld.%03ld ms",
  199. ts_end.tv_sec, ts_end.tv_nsec, _start_time.tv_sec, _start_time.tv_nsec,
  200. (ret / 1000), (ret % 1000));
  201. */
  202. ret /= 1000;
  203. return ret;
  204. }
  205. int StatusCodeCompose(char *oriCode, char *newCode)
  206. {
  207. if(strlen(oriCode) > 0)
  208. {
  209. strcat(oriCode, ",");
  210. }
  211. strcat(oriCode, newCode);
  212. return strlen(oriCode);
  213. }
  214. void getNowDatetime(unsigned char *data)
  215. {
  216. time_t t = time(NULL);
  217. struct tm tm = *localtime(&t);
  218. 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);
  219. }
  220. int IsModelNameMatch_ForUpdate(char *model_1, char *model_2)
  221. {
  222. if(strlen(model_1) < MODELNAME_LENGTH || strlen(model_2) < MODELNAME_LENGTH)
  223. {
  224. return NO;
  225. }
  226. if(model_1[0] == model_2[0] &&
  227. model_1[1] == model_2[1] &&
  228. model_1[7] == model_2[7] &&
  229. model_1[8] == model_2[8] &&
  230. model_1[9] == model_2[9] &&
  231. model_1[11] == model_2[11] &&
  232. model_1[12] == model_2[12] &&
  233. model_1[13] == model_2[13])
  234. {
  235. return YES;
  236. }
  237. return NO;
  238. }
  239. int IsCabinetModelNameLegal(char *modelName)
  240. {
  241. if(strlen(modelName) != MODELNAME_LENGTH || modelName[0] != 'D')
  242. {
  243. return false;
  244. }
  245. if(modelName[1] != 'O' && modelName[1] != 'B' && modelName[1] != 'K')
  246. {
  247. return false;
  248. }
  249. return true;
  250. }
  251. int IsSerialNumberLegal(char *sn)
  252. {
  253. if(strlen(sn) != SERIAL_NUMBER_LENGTH)
  254. {
  255. return false;
  256. }
  257. return true;
  258. }
  259. int IsSystemIdLegal(char *systemId)
  260. {
  261. if(strlen(systemId) > SYSTEM_ID_LENGTH)
  262. {
  263. return false;
  264. }
  265. return true;
  266. }
  267. char *strrpc(char *str, char *oldStr, char *newStr)
  268. {
  269. char bstr[strlen(str)];
  270. memset(bstr, 0x00, sizeof(bstr));
  271. for(int i = 0; i < strlen(str); i++)
  272. {
  273. if(!strncmp(str+i, oldStr, strlen(oldStr)))
  274. {
  275. strcat(bstr, newStr);
  276. i += strlen(oldStr) - 1;
  277. }
  278. else
  279. {
  280. strncat(bstr, str + i, 1);
  281. }
  282. }
  283. strcpy(str,bstr);
  284. return str;
  285. }
  286. // return the start position of the first occurrence
  287. int StringInStr(char *string, char *key)
  288. {
  289. int startIndex = -1;
  290. char *startPtr;
  291. startPtr = strstr(string, key);
  292. if(startPtr > 0)
  293. {
  294. startIndex = (int)startPtr - (int)string;
  295. }
  296. return startIndex;
  297. }
  298. int FindStringInStr(char *sourceString, char *key, char *findString)
  299. {
  300. int len = 0;
  301. char *findPtr = strstr(sourceString, key);
  302. if(findPtr > 0)
  303. {
  304. len = StringInStr(findPtr, " ");
  305. if(len > 0)
  306. {
  307. memcpy(findString, findPtr, len);
  308. findString[len] = '\0';
  309. }
  310. }
  311. return len;
  312. }
  313. // return quantity of number
  314. int Trim_String(char *string , int len)
  315. {
  316. bool find = false;
  317. int quantity = 0;
  318. for(int i = 0 ; i < len; i++)
  319. {
  320. if(!(string[i] == '.' || (string[i] >= '0' && string[i] <= '9')))
  321. {
  322. if(find)
  323. {
  324. string[i] = ' ';
  325. }
  326. else
  327. {
  328. memmove(&string[i], &string[i + 1], len - i);
  329. i -= 1;
  330. len -= 1;
  331. }
  332. find = false;
  333. }
  334. else
  335. {
  336. if(!find)
  337. {
  338. quantity++;
  339. }
  340. find = true;
  341. }
  342. }
  343. string[len] = '\0';
  344. return quantity;
  345. }
  346. int Split(char **array, char *strSource, const char *key)
  347. {
  348. int quantity = 0;
  349. char *ptrSave, *ptrToken;
  350. ptrToken = strtok_r(strSource, key, &ptrSave);
  351. while(ptrToken != NULL)
  352. {
  353. *array++ = ptrToken;
  354. quantity++;
  355. ptrToken = strtok_r(NULL, key, &ptrSave);
  356. }
  357. return quantity;
  358. }
  359. float PriceParsing(char *PriceString, char *ParseKey, char *SplitKey)
  360. {
  361. char strSource[1024];
  362. char *splitStringList[128];
  363. int splitQuantity = 0;
  364. float fee = 0;
  365. memset(strSource, 0x00, sizeof(strSource));
  366. strcpy(strSource, PriceString);
  367. if(strlen(ParseKey) > 0)
  368. {
  369. splitQuantity = Split(splitStringList, strSource, SplitKey);
  370. for(int i = 0; (i < splitQuantity && i < 128); i++)
  371. {
  372. if(strstr(splitStringList[i], ParseKey) > 0)
  373. {
  374. Trim_String(splitStringList[i], strlen(splitStringList[i]));
  375. fee = atof(splitStringList[i]);
  376. break;
  377. }
  378. }
  379. }
  380. else
  381. {
  382. Trim_String(PriceString, strlen(PriceString));
  383. fee = atof(PriceString);
  384. }
  385. return fee;
  386. }
  387. // Shell Default & User Price Parsing
  388. // input: priceString
  389. // output: resultPrice
  390. char *ShellPriceParsing(char *priceString, char *resultPrice)
  391. {
  392. char strSource[1024];
  393. memset(strSource, 0x00, sizeof(strSource));
  394. strcpy(strSource, priceString);
  395. strcpy(strSource, strrpc(strSource,"\n", " "));
  396. strcpy(resultPrice, strSource);
  397. return resultPrice;
  398. }
  399. // Shell RunningCost Parsing
  400. float ShellRunningCostParsing(char *runningCostString)
  401. {
  402. int splitCnt = 0;
  403. float energy = 0, fee = 0;
  404. int connector = 0;
  405. char *splitStringList[128];
  406. char strSource[1024];
  407. int trimCnt = 0;
  408. memset(strSource, 0x00, sizeof(strSource));
  409. strcpy(strSource, runningCostString);
  410. splitCnt = Split(splitStringList, strSource, "\n");
  411. for(int i = 0; i < splitCnt; i++)
  412. {
  413. if(strstr(splitStringList[i], "Current Total") > 0)
  414. {
  415. trimCnt = Trim_String(splitStringList[i], strlen(splitStringList[i]));
  416. if(trimCnt == 3)
  417. {
  418. sscanf(splitStringList[i], "%f %f %d", &energy, &fee, &connector);
  419. }
  420. break;
  421. }
  422. }
  423. return fee;
  424. }
  425. // Shell FinalCost
  426. float ShellFinalCostParsing(char *finalCostString)
  427. {
  428. int splitCnt = 0;
  429. float fee = 0;
  430. char *splitStringList[128];
  431. char strSource[1024];
  432. memset(strSource, 0x00, sizeof(strSource));
  433. strcpy(strSource, finalCostString);
  434. splitCnt = Split(splitStringList, strSource, "\n");
  435. for(int i = 0; i < splitCnt; i++)
  436. {
  437. if(strstr(splitStringList[i], "Total") > 0)
  438. {
  439. for(int j = i + 1; j < splitCnt; j++)
  440. {
  441. if(strstr(splitStringList[j], "Cost:") > 0)
  442. {
  443. Trim_String(splitStringList[j], strlen(splitStringList[j]));
  444. fee = atof(splitStringList[j]);
  445. break;
  446. }
  447. }
  448. break;
  449. }
  450. }
  451. return fee;
  452. }
  453. int GetShellReceiptInfo(char *finalCostString, char *receiptInfo)
  454. {
  455. int splitCnt = 0;
  456. int length = 0;
  457. char *splitStringList[128];
  458. char strSource[1024];
  459. memset(strSource, 0x00, sizeof(strSource));
  460. strcpy(strSource, finalCostString);
  461. splitCnt = Split(splitStringList, strSource, "\n");
  462. for(int i = 0; i < splitCnt; i++)
  463. {
  464. if(strstr(splitStringList[i], "Total") > 0)
  465. {
  466. for(int j = i + 1; j < splitCnt; j++)
  467. {
  468. if(strstr(splitStringList[j], "Receipt:") > 0)
  469. {
  470. length = FindStringInStr(splitStringList[j], "http", receiptInfo);
  471. }
  472. }
  473. break;
  474. }
  475. }
  476. return length;
  477. }
  478. float DefaultPriceParsing(char *StringItem)
  479. {
  480. char *ptrSave, *ptrToken;
  481. char strSource[128];
  482. float fee = 0;
  483. memcpy(strSource, StringItem, 128);
  484. ptrToken = strtok_r(strSource, ",", &ptrSave);
  485. while(ptrToken != NULL)
  486. {
  487. char *strFee = strstr(ptrToken, "$");
  488. if(strFee != NULL)
  489. {
  490. strFee++;
  491. fee = atof(strFee);
  492. break;
  493. }
  494. else
  495. {
  496. fee = atof(ptrToken);
  497. break;
  498. }
  499. ptrToken = strtok_r(NULL, ",", &ptrSave);
  500. }
  501. return fee;
  502. }
  503. float GetNowTimePricing(float *price)
  504. {
  505. float fee = 0;
  506. time_t CurrentTime;
  507. struct tm *tm;
  508. CurrentTime = time(NULL);
  509. tm=localtime(&CurrentTime);
  510. fee = price[tm->tm_hour];
  511. return fee;
  512. }
  513. // Shell RunningCost Parsing
  514. float TccDefaultPriceParsing(char *costString, float *price)
  515. {
  516. int splitCnt = 0;
  517. float fee = 0;
  518. char *splitStringList[128];
  519. char strSource[1024];
  520. memset(strSource, 0x00, sizeof(strSource));
  521. strcpy(strSource, costString);
  522. splitCnt = Split(splitStringList, strSource, "|");
  523. if(splitCnt == 24)
  524. {
  525. for(int i = 0; i < splitCnt; i++)
  526. {
  527. Trim_String(splitStringList[i], strlen(splitStringList[i]));
  528. price[i] = atof(splitStringList[i]);
  529. }
  530. fee = GetNowTimePricing(price);
  531. }
  532. return fee;
  533. }
  534. unsigned short ParsingRatingPower(char *modelname)
  535. {
  536. char strVal[3], strExp[2];
  537. unsigned short value = 0, exponent = 0;
  538. memset(strVal, 0x00, sizeof(strVal));
  539. memset(strExp, 0x00, sizeof(strExp));
  540. memcpy(strVal, &modelname[4], 2);
  541. memcpy(strExp, &modelname[6], 1);
  542. value = atoi(strVal);
  543. exponent = atoi(strExp);
  544. if(value < 0 || exponent < 0)
  545. {
  546. return 0;
  547. }
  548. for(int i = 0; i < exponent; i++)
  549. {
  550. value *= 10;
  551. }
  552. return value;
  553. }
  554. //***************************************** No Use *****************************************
  555. float TariffParsing(char *StringItem, char *TariffCode)
  556. {
  557. char *ptrSave, *ptrToken;
  558. char strSource[128];
  559. float fee = 0;
  560. memcpy(strSource, StringItem, 128);
  561. ptrToken = strtok_r(strSource, ";", &ptrSave);
  562. while(ptrToken != NULL)
  563. {
  564. char *strTariff = strstr(ptrToken, TariffCode);
  565. if(strTariff != NULL)
  566. {
  567. char *strFee = strstr(strTariff, "$");
  568. if(strFee != NULL)
  569. {
  570. strFee++;
  571. fee = atof(strFee);
  572. break;
  573. }
  574. }
  575. ptrToken = strtok_r(NULL, ";", &ptrSave);
  576. }
  577. return fee;
  578. }
  579. float PhTariffParsing(char *StringItem, char *TariffCode)
  580. {
  581. char *ptrSave, *ptrToken;
  582. char strSource[128];
  583. float fee = 0;
  584. memcpy(strSource, StringItem, 128);
  585. ptrToken = strtok_r(strSource, ",", &ptrSave);
  586. while(ptrToken != NULL)
  587. {
  588. char *strTariff = strstr(ptrToken, TariffCode);
  589. if(strTariff != NULL)
  590. {
  591. char *strFee = strstr(strTariff, ":");
  592. if(strFee != NULL)
  593. {
  594. strFee++;
  595. fee = atof(strFee);
  596. break;
  597. }
  598. }
  599. ptrToken = strtok_r(NULL, ",", &ptrSave);
  600. }
  601. return fee;
  602. }
  603. //***************************************** No Use *****************************************