main.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <linux/termios.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #include <stdlib.h>
  9. #include <sys/ipc.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/sockios.h>
  13. #include <linux/socket.h>
  14. #include <sys/socket.h>
  15. #include <netinet/in.h>
  16. #include <sys/time.h>
  17. #include <sys/timeb.h>
  18. #include <math.h>//for pow
  19. #include <unistd.h>
  20. #include "define.h"
  21. //#define Debug
  22. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  23. struct StatusCodeData *ShmStatusCodeData;
  24. struct CcsData *ShmCcsData;
  25. struct InternalComm *ShmInternalComm;
  26. #ifdef SystemLogMessage
  27. int StoreLogMsg(unsigned char *DataString)
  28. {
  29. unsigned char Buf[256];
  30. time_t CurrentTime;
  31. struct tm *tm;
  32. memset(Buf,0,sizeof(Buf));
  33. CurrentTime = time(NULL);
  34. tm=localtime(&CurrentTime);
  35. sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  36. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  37. DataString,
  38. tm->tm_year+1900,tm->tm_mon+1);
  39. system(Buf);
  40. #ifdef Debug
  41. printf("%s \n",DataString);
  42. #endif
  43. }
  44. #endif
  45. int DiffTimeb(struct timeb ST, struct timeb ET)
  46. {
  47. //return milli-second
  48. unsigned int StartTime,StopTime;
  49. StartTime=(unsigned int)ST.time;
  50. StopTime=(unsigned int)ET.time;
  51. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  52. }
  53. /**************************************************************************************/
  54. /**************************Create all share memory *********************************/
  55. /**************************************************************************************/
  56. int CreatShareMemory()
  57. {
  58. int MeterSMId;
  59. //creat ShmSysConfigAndInfo
  60. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  61. {
  62. #ifdef SystemLogMessage
  63. StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG");
  64. #endif
  65. return 0;
  66. }
  67. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  68. {
  69. #ifdef SystemLogMessage
  70. StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG");
  71. #endif
  72. return 0;
  73. }
  74. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  75. //creat ShmStatusCodeData
  76. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  77. {
  78. #ifdef SystemLogMessage
  79. StoreLogMsg("[main]CreatShareMemory:shmget ShmStatusCodeData NG");
  80. #endif
  81. return 0;
  82. }
  83. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  84. {
  85. #ifdef SystemLogMessage
  86. StoreLogMsg("[main]CreatShareMemory:shmat ShmStatusCodeData NG");
  87. #endif
  88. return 0;
  89. }
  90. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  91. //creat ShmCcsData
  92. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  93. {
  94. #ifdef SystemLogMessage
  95. StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG");
  96. #endif
  97. return 0;
  98. }
  99. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  100. {
  101. #ifdef SystemLogMessage
  102. StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG");
  103. #endif
  104. return 0;
  105. }
  106. memset(ShmCcsData,0,sizeof(struct CcsData));
  107. //creat ShmInternalComm
  108. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT|0777)) < 0)
  109. {
  110. #ifdef SystemLogMessage
  111. StoreLogMsg("[main]CreatShareMemory:shmget ShmInternalComm NG");
  112. #endif
  113. return 0;
  114. }
  115. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  116. {
  117. #ifdef SystemLogMessage
  118. StoreLogMsg("[main]CreatShareMemory:shmat ShmInternalComm NG");
  119. #endif
  120. return 0;
  121. }
  122. return 1;
  123. }
  124. /**************************************************************************************/
  125. /****************Following functions are CSU initialization***************************/
  126. /**************************************************************************************/
  127. void InitGPIO()
  128. {
  129. /*****************0~3, 4 bank, bank x 32+ num*********************/
  130. /***************************************************************/
  131. /*************** INPUT PIN ***************************************/
  132. /***************************************************************/
  133. /*GPIO2_0: QCA7000 interrupt */
  134. system("echo 64 > /sys/class/gpio/export");
  135. system("echo \"in\" > /sys/class/gpio/gpio64/direction");
  136. /***************************************************************/
  137. /*************** OUTPUT PIN ************************************/
  138. /***************************************************************/
  139. /*GPIO2_25: AM_IO_2, H: ?; L: ?*/
  140. system("echo 89 > /sys/class/gpio/export");
  141. system("echo \"out\" > /sys/class/gpio/gpio89/direction");
  142. system("echo 0 > /sys/class/gpio/gpio89/value");
  143. /*GPIO2_23: AM_IO_1, H: ?; L: ?*/
  144. system("echo 87 > /sys/class/gpio/export");
  145. system("echo \"out\" > /sys/class/gpio/gpio87/direction");
  146. system("echo 0 > /sys/class/gpio/gpio87/value");
  147. /*GPIO2_24: AM_QCA_PWR_RST, H: reset, L: noraml*/
  148. system("echo 88 > /sys/class/gpio/export");
  149. system("echo \"out\" > /sys/class/gpio/gpio88/direction");
  150. system("echo 0 > /sys/class/gpio/gpio88/value");
  151. /*GPIO2_22: Pilot_state E, H: state E, L: normal*/
  152. system("echo 86 > /sys/class/gpio/export");
  153. system("echo \"out\" > /sys/class/gpio/gpio86/direction");
  154. system("echo 0 > /sys/class/gpio/gpio86/value");
  155. #ifdef SystemLogMessage
  156. StoreLogMsg("[main]InitGPIO: Initial GPIO OK");
  157. #endif
  158. }
  159. int LoadSysConfigAndInfo(struct SysConfigData *ptr)
  160. {
  161. int fd,wrd;
  162. struct SysConfigData *buf;
  163. unsigned char *PtrBuf;
  164. unsigned int ChkSum,ChkSumOrg;
  165. if((buf=malloc(sizeof(struct SysConfigData)))==NULL)
  166. {
  167. #ifdef SystemLogMessage
  168. StoreLogMsg("[main]LoadSysConfigAndInfo:malloc buffer NG,rebooting..");
  169. #endif
  170. if(ShmStatusCodeData!=NULL)
  171. {
  172. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  173. }
  174. sleep(5);
  175. system("reboot -f");
  176. sleep(5);
  177. system("reboot -f");
  178. }
  179. memset(buf, 0, sizeof(struct SysConfigData));
  180. fd = open("/dev/mtdblock10", O_RDWR);
  181. if (fd < 0)
  182. {
  183. free(buf);
  184. #ifdef SystemLogMessage
  185. StoreLogMsg("[main]LoadSysConfigAndInfo:open mtdblock10 NG,rebooting..");
  186. #endif
  187. if(ShmStatusCodeData!=NULL)
  188. {
  189. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  190. }
  191. sleep(5);
  192. system("reboot -f");
  193. sleep(5);
  194. system("reboot -f");
  195. }
  196. wrd=read(fd, buf,sizeof(struct SysConfigData));
  197. close(fd);
  198. if(wrd!=(sizeof(struct SysConfigData)))
  199. {
  200. free(buf);
  201. #ifdef SystemLogMessage
  202. StoreLogMsg("[main]LoadSysConfigAndInfo: read SysConfigData data NG,rebooting..");
  203. #endif
  204. if(ShmStatusCodeData!=NULL)
  205. {
  206. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  207. }
  208. sleep(5);
  209. system("reboot -f");
  210. sleep(5);
  211. system("reboot -f");
  212. }
  213. PtrBuf=(unsigned char *)buf;
  214. ChkSum=0;
  215. for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++)
  216. {
  217. ChkSum+=PtrBuf[wrd];
  218. }
  219. ChkSumOrg=buf->Checksum;
  220. if(ChkSum!=ChkSumOrg)
  221. {
  222. #ifdef SystemLogMessage
  223. StoreLogMsg("[main]LoadSysConfigAndInfo: Primary SysConfigData checksum NG, read backup");
  224. #endif
  225. fd = open("/dev/mtdblock11", O_RDWR);
  226. if (fd < 0)
  227. {
  228. free(buf);
  229. #ifdef SystemLogMessage
  230. StoreLogMsg("[main]LoadSysConfigAndInfo: open mtdblock11 (backup) NG,rebooting..");
  231. #endif
  232. if(ShmStatusCodeData!=NULL)
  233. {
  234. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  235. }
  236. sleep(5);
  237. system("reboot -f");
  238. sleep(5);
  239. system("reboot -f");
  240. }
  241. memset(buf, 0, sizeof(struct SysConfigData));
  242. wrd=read(fd, buf,sizeof(struct SysConfigData));
  243. close(fd);
  244. if(wrd!=sizeof(struct SysConfigData))
  245. {
  246. free(buf);
  247. #ifdef SystemLogMessage
  248. StoreLogMsg("[main]LoadSysConfigAndInfo: read backup SysConfigData data NG,rebooting..");
  249. #endif
  250. if(ShmStatusCodeData!=NULL)
  251. {
  252. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  253. }
  254. sleep(5);
  255. system("reboot -f");
  256. sleep(5);
  257. system("reboot -f");
  258. }
  259. PtrBuf=(unsigned char *)buf;
  260. ChkSum=0;
  261. for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++)
  262. {
  263. ChkSum+=PtrBuf[wrd];
  264. }
  265. ChkSumOrg=buf->Checksum;
  266. if(ChkSum!=ChkSumOrg)
  267. {
  268. #ifdef SystemLogMessage
  269. StoreLogMsg("[main]LoadSysConfigAndInfo: backup SysConfigData checksum NG, read Factory default");
  270. #endif
  271. fd = open("/dev/mtdblock12", O_RDWR);
  272. if (fd < 0)
  273. {
  274. free(buf);
  275. #ifdef SystemLogMessage
  276. StoreLogMsg("[main]LoadSysConfigAndInfo: open mtdblock12 (Factory default) NG,rebooting..");
  277. #endif
  278. if(ShmStatusCodeData!=NULL)
  279. {
  280. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  281. }
  282. sleep(5);
  283. system("reboot -f");
  284. sleep(5);
  285. system("reboot -f");
  286. }
  287. memset(buf, 0, sizeof(struct SysConfigData));
  288. wrd=read(fd, buf,sizeof(struct SysConfigData));
  289. close(fd);
  290. if(wrd!=sizeof(struct SysConfigData))
  291. {
  292. free(buf);
  293. #ifdef SystemLogMessage
  294. StoreLogMsg("[main]LoadSysConfigAndInfo: read factory default SysConfigData data NG,rebooting..");
  295. #endif
  296. if(ShmStatusCodeData!=NULL)
  297. {
  298. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  299. }
  300. sleep(5);
  301. system("reboot -f");
  302. sleep(5);
  303. system("reboot -f");
  304. }
  305. PtrBuf=(unsigned char *)buf;
  306. ChkSum=0;
  307. for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++)
  308. {
  309. ChkSum+=PtrBuf[wrd];
  310. }
  311. ChkSumOrg=buf->Checksum;
  312. if(ChkSum!=ChkSumOrg)
  313. {
  314. #ifdef SystemLogMessage
  315. StoreLogMsg("[main]LoadSysConfigAndInfo: factory default SysConfigData checksum NG, restore factory default");
  316. #endif
  317. goto DefaultShm;
  318. }
  319. }
  320. }
  321. //load OK
  322. memcpy((struct SysConfigData *)ptr,(struct SysConfigData *)buf,sizeof(struct SysConfigData));
  323. free(buf);
  324. #ifdef SystemLogMessage
  325. StoreLogMsg("[main]LoadSysConfigAndInfo: Load SysConfigData OK");
  326. #endif
  327. return 1;
  328. DefaultShm:
  329. system("cd /root;./FactoryConfig");
  330. system("sync");
  331. sleep(5);
  332. system("reboot -f");
  333. sleep(5);
  334. system("reboot -f");
  335. }
  336. int Initialization()
  337. {
  338. unsigned char str[256];
  339. //init GPIO
  340. InitGPIO();
  341. //init ecap0
  342. memset(str,0,sizeof(str));
  343. system("echo 0 > /sys/class/pwm/pwmchip0/export");
  344. system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period");// nano seconds =>1k Hz
  345. system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //default 100%
  346. system("echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable");
  347. //system("echo 1 > /sys /class/pwm/pwmchip0/pwm0/polarity");
  348. LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
  349. #ifdef SystemLogMessage
  350. StoreLogMsg("[main]Initialization: Initialization OK");
  351. #endif
  352. }
  353. int SpawnTask()
  354. {
  355. system("/root/EventLogging &");
  356. system("/root/CsuComm &");
  357. system("/root/EvComm &");
  358. }
  359. int StoreUsrConfigData(struct SysConfigData *UsrData)
  360. {
  361. int fd,wrd;
  362. unsigned int i,Chk;
  363. unsigned char *ptr;
  364. Chk=0;
  365. ptr=(unsigned char *)UsrData;
  366. for(i=0;i<sizeof(struct SysConfigData)-4;i++)
  367. {
  368. Chk+=*(ptr+i);
  369. }
  370. UsrData->Checksum=Chk;
  371. fd = open("/dev/mtdblock10", O_RDWR);
  372. if (fd < 0)
  373. {
  374. #ifdef SystemLogMessage
  375. StoreLogMsg("[main]StoreUsrConfigData: open /dev/mtdblock10 NG");
  376. #endif
  377. return 0;
  378. }
  379. wrd=write(fd, UsrData, sizeof(struct SysConfigData));
  380. close(fd);
  381. if(wrd!=(sizeof(struct SysConfigData)))
  382. {
  383. #ifdef SystemLogMessage
  384. StoreLogMsg("[main]StoreUsrConfigData: write /dev/mtdblock10 NG");
  385. #endif
  386. return 0;
  387. }
  388. fd = open("/dev/mtdblock11", O_RDWR);
  389. if (fd < 0)
  390. {
  391. #ifdef SystemLogMessage
  392. StoreLogMsg("[main]StoreUsrConfigData: open /dev/mtdblock11(backup) NG");
  393. #endif
  394. return 0;
  395. }
  396. wrd=write(fd, UsrData, sizeof(struct SysConfigData));
  397. close(fd);
  398. if(wrd!=(sizeof(struct SysConfigData)))
  399. {
  400. #ifdef SystemLogMessage
  401. StoreLogMsg("[main]StoreUsrConfigData: write /dev/mtdblock11(backup) NG");
  402. #endif
  403. return 0;
  404. }
  405. return 1;
  406. }
  407. /**************************************************************/
  408. /************** main function********************************/
  409. /*************************************************************/
  410. int main(int argc,char *argv[])
  411. {
  412. int Rtn=0;
  413. unsigned int StartTime;
  414. struct timeb StartChargingTime,CurrentChargingTime,ChargingLoopTime;
  415. float ChargingPower,ChargingEnergy;
  416. //Create all share memory
  417. if(CreatShareMemory()==0)
  418. {
  419. #ifdef SystemLogMessage
  420. StoreLogMsg("[main]main:CreatShareMemory NG");
  421. #endif
  422. if(ShmStatusCodeData!=NULL)
  423. {
  424. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  425. }
  426. sleep(5);
  427. system("reboot -f");
  428. sleep(5);
  429. system("reboot -f");
  430. }
  431. //CSU Initialization
  432. Initialization();
  433. //task spawn
  434. //SpawnTask();
  435. /**************************************************************/
  436. /************** main Loop********************************/
  437. /*****************************************************************/
  438. while(1)
  439. {
  440. sleep(5);
  441. }//main while
  442. }