main.c 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072
  1. #include "../../define.h"
  2. #include "main.h"
  3. //==========================
  4. // System basic sample constant
  5. //==========================
  6. #define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L)
  7. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  8. #define PASS 1
  9. #define FAIL -1
  10. #define YES 1
  11. #define NO 0
  12. #define ON 1
  13. #define OFF 0
  14. #define BUFFER_SIZE 128
  15. #define MtdBlockSize 0x300000
  16. #define TMR_IDX_CHECK_TASK 0
  17. #define EMSS_TEST_TASK 1
  18. #define BMS_Relay1_TASK 2
  19. #define BMS_Relay2_TASK 3
  20. #define BMS_Relay3_TASK 4
  21. #define BMS_Relay4_TASK 5
  22. #define BMS_BATDIS_TASK 6
  23. #define BMS_PREPARING_TASK 7
  24. int wtdFd = -1;
  25. int CanFd = -1;
  26. int pollingStep = 0;
  27. int ADC_Index=0;
  28. //==========================
  29. // Declare share memory
  30. //==========================
  31. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  32. struct StatusCodeData *ShmStatusCodeData;
  33. struct BatteryInfoData *ShmBatteryInfo;
  34. struct EMSSInfoData *ShmEMSSInfo;
  35. struct timespec timerStartTime[10];
  36. struct SysConfigData SysConfigOrg;
  37. char *valid_Internet[2] = {"8.8.8.8", "180.76.76.76"};
  38. //=================================
  39. // Common routine
  40. //=================================
  41. int StoreLogMsg(const char *fmt, ...)
  42. {
  43. char Buf[4096+256];
  44. char buffer[4096];
  45. time_t CurrentTime;
  46. struct tm *tm;
  47. struct timeval tv;
  48. va_list args;
  49. va_start(args, fmt);
  50. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  51. va_end(args);
  52. memset(Buf,0,sizeof(Buf));
  53. CurrentTime = time(NULL);
  54. tm=localtime(&CurrentTime);
  55. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  56. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  57. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  58. buffer,
  59. tm->tm_year+1900,tm->tm_mon+1);
  60. #ifdef SystemLogMessage
  61. system(Buf);
  62. #endif
  63. #ifdef ConsloePrintLog
  64. printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer);
  65. #endif
  66. return rc;
  67. }
  68. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  69. {
  70. strncpy(dest, src + start, cnt);
  71. dest[cnt] = 0;
  72. }
  73. void refreshStartTimer(struct timespec *timer)
  74. {
  75. clock_gettime(CLOCK_MONOTONIC, timer);
  76. }
  77. int getDiffSecNow(struct timespec timer)
  78. {
  79. struct timespec timerNow;
  80. clock_gettime(CLOCK_MONOTONIC, &timerNow);
  81. return (int)((((unsigned long)(timerNow.tv_sec - timer.tv_sec) * 1000) + ((unsigned long)((timerNow.tv_nsec / 1000000) - (timer.tv_nsec / 1000000))))/1000);
  82. }
  83. int getDiffSecBetween(struct timespec start, struct timespec end)
  84. {
  85. return (int)((((unsigned long)(end.tv_sec - start.tv_sec) * 1000) + ((unsigned long)((end.tv_nsec / 1000000) - (start.tv_nsec / 1000000))))/1000);
  86. }
  87. int getEth0MacAddress()
  88. {
  89. int result = PASS;
  90. FILE *fp;
  91. char cmd[256];
  92. char buf[512];
  93. char tmp[512];
  94. strcpy(cmd, "ifconfig eth0");
  95. fp = popen(cmd, "r");
  96. if(fp != NULL)
  97. {
  98. while(fgets(buf, sizeof(buf), fp) != NULL)
  99. {
  100. if(strstr(buf, "eth0") > 0)
  101. {
  102. result = PASS;
  103. }
  104. if(strstr(buf, "eth0 Link encap:Ethernet HWaddr") > 0)
  105. {
  106. sscanf(buf, "%*s%*s%*s%*s%s", tmp);
  107. strcpy((char*)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthMacAddress, tmp);
  108. }
  109. }
  110. }
  111. pclose(fp);
  112. return result;
  113. }
  114. //======================================================
  115. // Network interface related function
  116. //======================================================
  117. int isInterfaceUp(const char *interface)
  118. {
  119. int result = FAIL;
  120. FILE *fp;
  121. char cmd[256];
  122. char buf[512];
  123. strcpy(cmd, "ifconfig");;
  124. fp = popen(cmd, "r");
  125. if(fp != NULL)
  126. {
  127. while(fgets(buf, sizeof(buf), fp) != NULL)
  128. {
  129. if(strstr(buf, interface) > 0)
  130. {
  131. result = PASS;
  132. }
  133. }
  134. }
  135. pclose(fp);
  136. return result;
  137. }
  138. int isReachableInternet()
  139. {
  140. int result = FAIL;
  141. FILE *fp;
  142. char cmd[256];
  143. char buf[512];
  144. char tmp[512];
  145. // Get ip address & net mask
  146. strcpy(cmd, "ifconfig eth0");
  147. fp = popen(cmd, "r");
  148. if (fp != NULL)
  149. {
  150. while(fgets(buf, sizeof(buf), fp) != NULL)
  151. {
  152. if (strstr(buf, "inet addr:") > 0)
  153. {
  154. sscanf(buf, "%*s%s", tmp);
  155. substr(tmp, tmp, strspn(tmp, "addr:"), strlen(buf)-strspn(tmp, "addr:"));
  156. if (strcmp(tmp, (char *)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress) != 0)
  157. {
  158. strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress, tmp);
  159. }
  160. sscanf(buf, "%*s%*s%*s%s", tmp);
  161. substr(tmp, tmp, strspn(tmp, "Mask:"), strlen(buf)-strspn(tmp, "Mask:"));
  162. if (strcmp(tmp, (char *)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress) != 0)
  163. {
  164. strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress, tmp);
  165. }
  166. }
  167. }
  168. }
  169. pclose(fp);
  170. memset(buf, 0x00, sizeof(buf));
  171. // Get gateway
  172. fp = popen("ip route", "r");
  173. if(fp == NULL)
  174. result = FAIL;
  175. else
  176. {
  177. while(fgets(buf, sizeof(buf), fp) != NULL)
  178. {
  179. if((strstr(buf, "default") != NULL) && (strstr(buf, "eth0") != NULL))
  180. break;
  181. }
  182. if(strstr(buf, "default") != NULL)
  183. {
  184. sscanf(buf, "%*s%*s%s", tmp);
  185. substr((char*)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress, tmp, 0, strlen(tmp));
  186. }
  187. }
  188. pclose(fp);
  189. memset(buf, 0x00, sizeof(buf));
  190. for(int idx=0;idx<ARRAY_SIZE(valid_Internet);idx++)
  191. {
  192. sprintf(cmd, "ping -c 1 -w 3 -I eth0 %s", valid_Internet[idx]);
  193. fp = popen(cmd, "r");
  194. if(fp != NULL)
  195. {
  196. while(fgets(buf, sizeof(buf), fp) != NULL)
  197. {
  198. if(strstr(buf, "transmitted") > 0)
  199. {
  200. //sscanf(buf, "%*s%*s%*s%*s%*s%*s%s", tmp);
  201. if(strstr(buf,"100%") != NULL)
  202. {
  203. }
  204. else
  205. {
  206. result = PASS;
  207. }
  208. //DEBUG_INFO("%s",buf);
  209. //DEBUG_INFO("%s\n",tmp);
  210. }
  211. }
  212. }
  213. pclose(fp);
  214. }
  215. return result;
  216. }
  217. int isRouteFail()
  218. {
  219. int result = YES;
  220. FILE *fp;
  221. char buf[512];
  222. fp = popen("route -n", "r");
  223. if(fp != NULL)
  224. {
  225. while(fgets(buf, sizeof(buf), fp) != NULL)
  226. {
  227. if(strstr(buf, "eth0") != NULL)
  228. result = NO;
  229. }
  230. }
  231. pclose(fp);
  232. return result;
  233. }
  234. //======================================================
  235. // Create all share memory
  236. //======================================================
  237. int CreatShareMemory()
  238. {
  239. int result = PASS;
  240. int MeterSMId;
  241. //creat ShmSysConfigAndInfo
  242. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  243. {
  244. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  245. result = FAIL;
  246. }
  247. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  248. {
  249. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  250. result = FAIL;
  251. }
  252. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  253. //creat ShmStatusCodeData
  254. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  255. {
  256. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  257. result = FAIL;
  258. }
  259. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  260. {
  261. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  262. result = FAIL;
  263. }
  264. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  265. //creat ShmBatteryInfo
  266. if ((MeterSMId = shmget(ShmBatteryInfoKey, sizeof(struct BatteryInfoData), IPC_CREAT | 0777)) < 0)
  267. {
  268. DEBUG_ERROR("shmget ShmBatteryInfo NG\n");
  269. result = FAIL;
  270. }
  271. else if ((ShmBatteryInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  272. {
  273. DEBUG_ERROR("shmat ShmBatteryInfo NG\n");
  274. result = FAIL;
  275. }
  276. memset(ShmBatteryInfo,0,sizeof(struct BatteryInfoData));
  277. //creat ShmEMSSInfo
  278. if ((MeterSMId = shmget(ShmEMSSInfoKey, sizeof(struct EMSSInfoData), IPC_CREAT | 0777)) < 0)
  279. {
  280. DEBUG_ERROR("shmget ShmEMSSInfo NG\n");
  281. result = FAIL;
  282. }
  283. else if ((ShmEMSSInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  284. {
  285. DEBUG_ERROR("shmat ShmEMSSInfo NG\n");
  286. result = FAIL;
  287. }
  288. memset(ShmEMSSInfo,0,sizeof(struct EMSSInfoData));
  289. return result;
  290. }
  291. int LoadSysConfigAndInfo(struct SysConfigData *ptr)
  292. {
  293. int fd,wrd;
  294. unsigned char *buf;
  295. unsigned int ChkSum,ChkSumOrg;
  296. if((buf=malloc(MtdBlockSize))==NULL)
  297. {
  298. DEBUG_ERROR("malloc buffer NG,rebooting..\n");
  299. if(ShmStatusCodeData!=NULL)
  300. {
  301. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  302. }
  303. sleep(5);
  304. system("reboot -f");
  305. sleep(5);
  306. system("reboot -f");
  307. }
  308. memset(buf, 0, MtdBlockSize);
  309. //================================================
  310. // Load configuration from mtdblock10
  311. //================================================
  312. system("nanddump /dev/mtd10 -f /mnt/EvseConfig.bin");
  313. fd = open("/mnt/EvseConfig.bin", O_RDWR);
  314. if (fd < 0)
  315. {
  316. free(buf);
  317. DEBUG_ERROR("open mtdblock10 NG,rebooting..\n");
  318. if(ShmStatusCodeData!=NULL)
  319. {
  320. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  321. }
  322. sleep(5);
  323. system("reboot -f");
  324. sleep(5);
  325. system("reboot -f");
  326. }
  327. wrd=read(fd, buf, MtdBlockSize);
  328. close(fd);
  329. if(wrd<MtdBlockSize)
  330. {
  331. free(buf);
  332. DEBUG_ERROR("read SysConfigData data NG,rebooting..\n");
  333. if(ShmStatusCodeData!=NULL)
  334. {
  335. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  336. }
  337. sleep(5);
  338. system("reboot -f");
  339. sleep(5);
  340. system("reboot -f");
  341. }
  342. ChkSum=0;
  343. for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrd<MtdBlockSize-4;wrd++)
  344. {
  345. ChkSum+=buf[wrd];
  346. }
  347. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  348. memcpy(&ptr->ModelName,buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)),ARRAY_SIZE(ptr->ModelName));
  349. memcpy(&ptr->SerialNumber,buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)+ARRAY_SIZE(ptr->ModelName)+ARRAY_SIZE(ptr->AcModelName)),ARRAY_SIZE(ptr->SerialNumber));
  350. //================================================
  351. // Load configuration from mtdblock11
  352. //================================================
  353. if(ChkSum!=ChkSumOrg)
  354. {
  355. DEBUG_ERROR("Primary SysConfigData checksum NG, read backup\n");
  356. system("nanddump /dev/mtd11 -f /mnt/EvseConfig.bin");
  357. fd = open("/mnt/EvseConfig.bin", O_RDWR);
  358. if (fd < 0)
  359. {
  360. free(buf);
  361. DEBUG_ERROR("open mtdblock11 (backup) NG,rebooting..\n");
  362. if(ShmStatusCodeData!=NULL)
  363. {
  364. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  365. }
  366. sleep(5);
  367. system("reboot -f");
  368. sleep(5);
  369. system("reboot -f");
  370. }
  371. memset(buf, 0, MtdBlockSize);
  372. wrd=read(fd, buf,MtdBlockSize);
  373. close(fd);
  374. if(wrd<MtdBlockSize)
  375. {
  376. free(buf);
  377. DEBUG_ERROR("read backup SysConfigData data NG,rebooting..\n");
  378. if(ShmStatusCodeData!=NULL)
  379. {
  380. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  381. }
  382. sleep(5);
  383. system("reboot -f");
  384. sleep(5);
  385. system("reboot -f");
  386. }
  387. ChkSum=0;
  388. for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrd<MtdBlockSize-4;wrd++)
  389. {
  390. ChkSum+=buf[wrd];
  391. }
  392. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  393. //================================================
  394. // Load configuration from mtdblock12 (Factory default)
  395. //================================================
  396. if(ChkSum!=ChkSumOrg)
  397. {
  398. DEBUG_WARN("backup SysConfigData checksum NG, read Factory default\n");
  399. system("nanddump /dev/mtd12 -f /mnt/EvseConfig.bin");
  400. fd = open("/mnt/EvseConfig.bin", O_RDWR);
  401. if (fd < 0)
  402. {
  403. DEBUG_ERROR("open mtdblock12 (Factory default) NG,rebooting..\n");
  404. free(buf);
  405. if(ShmStatusCodeData!=NULL)
  406. {
  407. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  408. }
  409. sleep(5);
  410. system("reboot -f");
  411. sleep(5);
  412. system("reboot -f");
  413. }
  414. memset(buf, 0, MtdBlockSize);
  415. wrd=read(fd, buf,MtdBlockSize);
  416. close(fd);
  417. if(wrd<MtdBlockSize)
  418. {
  419. DEBUG_ERROR("read factory default SysConfigData data NG,rebooting..\n");
  420. free(buf);
  421. if(ShmStatusCodeData!=NULL)
  422. {
  423. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  424. }
  425. sleep(5);
  426. system("reboot -f");
  427. sleep(5);
  428. system("reboot -f");
  429. }
  430. ChkSum=0;
  431. for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrd<MtdBlockSize-4;wrd++)
  432. {
  433. ChkSum+=buf[wrd];
  434. }
  435. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  436. memcpy(buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)), &ptr->ModelName, ARRAY_SIZE(ptr->ModelName));
  437. memcpy(buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)+ARRAY_SIZE(ptr->ModelName)+ARRAY_SIZE(ptr->AcModelName)), &ptr->SerialNumber, ARRAY_SIZE(ptr->SerialNumber));
  438. if(ChkSum!=ChkSumOrg)
  439. {
  440. DEBUG_WARN("factory default SysConfigData checksum NG, restore factory default\n");
  441. free(buf);
  442. system("cd /root;./Module_FactoryConfig -m");
  443. system("rm -f /Storage/OCPP/OCPPConfiguration");
  444. system("sync");
  445. sleep(5);
  446. system("reboot -f");
  447. sleep(5);
  448. system("reboot -f");
  449. return FAIL;
  450. }
  451. }
  452. }
  453. //load OK
  454. memcpy((struct SysConfigData *)ptr,buf,sizeof(struct SysConfigData));
  455. free(buf);
  456. system("rm -f /mnt/EvseConfig.bin");
  457. // SysConfig in flash is empty (0xffffffff)
  458. if((strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName)) ||
  459. (strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber)) ||
  460. (strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId)) ||
  461. (ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0xff))
  462. {
  463. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName))
  464. {
  465. memset(ShmSysConfigAndInfo->SysConfig.ModelName, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName));
  466. }
  467. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber))
  468. {
  469. memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber));
  470. }
  471. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId))
  472. {
  473. memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId));
  474. }
  475. if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0xff)
  476. {
  477. DEBUG_INFO("Ethernet dhcp config is null.\n");
  478. }
  479. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) == 0x00)
  480. {
  481. DEBUG_INFO("Model name over length.\n");
  482. }
  483. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) == 0x00)
  484. {
  485. DEBUG_INFO("Model serial number over length.\n");
  486. }
  487. if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) == 0x00)
  488. {
  489. DEBUG_INFO("SystemId over length.\n");
  490. }
  491. system("cd /root;./Module_FactoryConfig -m");
  492. sleep(3);
  493. system("/usr/bin/run_evse_restart.sh");
  494. }
  495. DEBUG_INFO("Load SysConfigData OK\n");
  496. return PASS;
  497. }
  498. int StoreUsrConfigData(struct SysConfigData *UsrData)
  499. {
  500. int result = PASS;
  501. int fd,wrd;
  502. unsigned int i,Chk;
  503. unsigned char *ptr, *BufTmp;
  504. Chk=0;
  505. ptr=(unsigned char *)UsrData;
  506. if((BufTmp=malloc(MtdBlockSize))!=NULL)
  507. {
  508. memset(BufTmp,0,MtdBlockSize);
  509. memcpy(BufTmp,ptr,sizeof(struct SysConfigData));
  510. for(i=0;i<MtdBlockSize-4;i++)
  511. Chk+=*(BufTmp+i);
  512. memcpy(BufTmp+MtdBlockSize-4, &Chk, 4);
  513. // Output configuration to file.
  514. fd = open("/mnt/EvseConfig.bin", O_RDWR|O_CREAT);
  515. if (fd < 0)
  516. {
  517. DEBUG_ERROR("open /mnt/EvseConfig.bin NG\n");
  518. free(BufTmp);
  519. return 0;
  520. }
  521. wrd=write(fd, BufTmp, MtdBlockSize);
  522. close(fd);
  523. if(wrd<MtdBlockSize)
  524. {
  525. DEBUG_ERROR("write /mnt/EvseConfig.bin NG\n");
  526. free(BufTmp);
  527. return 0;
  528. }
  529. DEBUG_INFO("EvseConfig write to file in /mnt OK.\n");
  530. DEBUG_INFO("Erase /dev/mtd10.\n");
  531. runShellCmd("flash_erase /dev/mtd10 0 0");
  532. DEBUG_INFO("Write /dev/mtd10.\n");
  533. runShellCmd("nandwrite -p /dev/mtd10 /mnt/EvseConfig.bin");
  534. DEBUG_INFO("Erase /dev/mtd11.\n");
  535. runShellCmd("flash_erase /dev/mtd11 0 0");
  536. DEBUG_INFO("Write /dev/mtd11.\n");
  537. runShellCmd("nandwrite -p /dev/mtd11 /mnt/EvseConfig.bin");
  538. system("rm -f /mnt/EvseConfig.bin");
  539. DEBUG_INFO("EvseConfig write to flash OK\n");
  540. }
  541. else
  542. {
  543. DEBUG_ERROR("alloc BlockSize NG\r\n");
  544. result = FAIL;
  545. }
  546. if(BufTmp!=NULL)
  547. free(BufTmp);
  548. return result;
  549. }
  550. // GOPIO
  551. const int System_GPIO_Pin_Table[ ] =
  552. {
  553. PIN_IO_BD1_1, PIN_IO_BD1_2, PIN_IO_BD2_1, PIN_IO_BD2_2, PIN_ID_BD1_1, PIN_ID_BD1_2, PIN_ID_BD2_1,
  554. PIN_ID_BD2_2, PIN_AM_RFID_RST, PIN_AM_RFID_ICC, PIN_BOARD1_PROXIMITY, PIN_BOARD2_PROXIMITY, PIN_AM_DE_1, PIN_AM_RE_1, PIN_ENG_BNT
  555. };
  556. void gpio_export(int pin)
  557. {
  558. char buffer[64];
  559. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/export", pin);
  560. system(buffer);
  561. }
  562. void gpio_unexport(int pin)
  563. {
  564. char buffer[64];
  565. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/unexport", pin);
  566. system(buffer);
  567. }
  568. void gpio_set_direction(int pin, unsigned char dir)
  569. {
  570. /*
  571. char buffer[64];
  572. snprintf(buffer, sizeof(buffer), "echo %s > /sys/class/gpio/gpio%d/direction", dir == GPIO_DIR_INPUT ? "in" : "out", pin);
  573. system(buffer);
  574. */
  575. int fd;
  576. char buffer[64];
  577. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/direction", pin);
  578. fd = open(buffer, O_WRONLY);
  579. if (fd < 0)
  580. {
  581. gpio_export(pin);
  582. fd = open(buffer, O_WRONLY);
  583. if(fd < 0)
  584. {
  585. printf("\r\nFailed to open gpio%d direction for writing!", pin);
  586. return;
  587. }
  588. }
  589. write(fd, dir == GPIO_DIR_INPUT ? "in" : "out", dir == GPIO_DIR_INPUT ? 2 : 3);
  590. close(fd);
  591. }
  592. void gpio_write(int pin, unsigned char value)
  593. {
  594. char buffer[64];
  595. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/gpio%d/value", value > 0 ? 1 : 0, pin);
  596. system(buffer);
  597. }
  598. int gpio_read(int pin)
  599. {
  600. int fd, value = 0;
  601. char ch;
  602. char buffer[64];
  603. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/value", pin);
  604. fd = open(buffer, O_RDONLY);
  605. if (fd < 0)
  606. {
  607. return -1;
  608. }
  609. if (read(fd, &ch, 4) < 0)
  610. {
  611. return -1;
  612. }
  613. value = atoi(&ch);
  614. close(fd);
  615. return value;
  616. }
  617. void InitIO(void)
  618. {
  619. printf("GPIO INIT \n");
  620. /* GPMC_AD8 => GPIO0_22 *//*ID BD1_1*/
  621. gpio_set_direction(PIN_ID_BD1_1, GPIO_DIR_OUTPUT);
  622. gpio_write(PIN_ID_BD1_1, 0);
  623. /* GPMC_AD9 => GPIO0_23 *//*ID BD1_2*/
  624. gpio_set_direction(PIN_ID_BD1_2, GPIO_DIR_OUTPUT);
  625. gpio_write(PIN_ID_BD1_2, 0);
  626. /* GPMC_AD10 => GPIO0_26 *//*IO BD1_1*/
  627. gpio_set_direction(PIN_IO_BD1_1, GPIO_DIR_OUTPUT);
  628. gpio_write(PIN_IO_BD1_1, 0);
  629. /* GPMC_AD11 => GPIO0_27 *//*IO BD1_2*/
  630. //gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_OUTPUT);
  631. //gpio_write(PIN_IO_BD1_2, 0);
  632. /* GPMC_AD12 => GPIO1_12 *//*ID BD2_1*/
  633. gpio_set_direction(PIN_ID_BD2_1, GPIO_DIR_OUTPUT);
  634. gpio_write(PIN_ID_BD2_1, 0);
  635. /* GPMC_AD13 => GPIO1_13 *//*ID BD2_2*/
  636. gpio_set_direction(PIN_ID_BD2_2, GPIO_DIR_OUTPUT);
  637. gpio_write(PIN_ID_BD2_2, 0);
  638. /* GPMC_AD14 => GPIO1_14 *//*IO BD2_1*/
  639. gpio_set_direction(PIN_IO_BD2_1, GPIO_DIR_OUTPUT);
  640. gpio_write(PIN_IO_BD2_1, 0);
  641. /* GPMC_AD15 => GPIO1_15 *//*IO BD2_2*/
  642. gpio_set_direction(PIN_IO_BD2_2, GPIO_DIR_OUTPUT);
  643. gpio_write(PIN_IO_BD2_2, 0);
  644. /*XDMA_EVENT_INTR0 => GPIO0_19 *//*AM_RFID_RST*/
  645. gpio_set_direction(PIN_AM_RFID_RST, GPIO_DIR_OUTPUT);
  646. gpio_write(PIN_AM_RFID_RST, 0);
  647. /*XDMA_EVENT_INTR1 => GPIO0_20 *//*AM_RFID_ICC*/
  648. gpio_set_direction(PIN_AM_RFID_ICC, GPIO_DIR_OUTPUT);
  649. gpio_write(PIN_AM_RFID_ICC, 0);
  650. gpio_set_direction(PIN_BOARD1_PROXIMITY, GPIO_DIR_INPUT);
  651. gpio_set_direction(PIN_BOARD2_PROXIMITY, GPIO_DIR_INPUT);
  652. /* GPIO3_15 */ /*ENG_BNT_DET*/
  653. gpio_set_direction(PIN_ENG_BNT, GPIO_DIR_INPUT);
  654. gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_INPUT);
  655. #if 0
  656. if(gpio_read(PIN_AM_RFID_RST) == 1)
  657. {
  658. printf("PIN_AM_RFID_RST Test OK\n");
  659. }else
  660. {
  661. printf("PIN_AM_RFID_RST Low Test 0\n");
  662. }
  663. if(gpio_read(PIN_AM_RFID_ICC) == 1)
  664. {
  665. printf("PIN_AM_RFID_ICC Test OK\n");
  666. }else
  667. {
  668. printf("PIN_AM_RFID_ICC Low Test 0\n");
  669. }
  670. #endif
  671. }
  672. // ADC
  673. int adc_read(int adc_port)
  674. {
  675. int fd, value = 0;
  676. char ch[5];
  677. char buffer[64];
  678. snprintf(buffer,sizeof(buffer), "/sys/bus/iio/devices/iio\:device0/in_voltage%d_raw", adc_port);
  679. fd = open(buffer, O_RDONLY);
  680. if(fd < 0)
  681. {
  682. return -1;
  683. }
  684. if(read(fd, ch, 4) < 0)
  685. {
  686. return -1;
  687. }
  688. value = atoi(ch);
  689. printf("\r\nAIN%d = %d",adc_port,value);
  690. close(fd);
  691. return value;
  692. }
  693. void DoIOTest(void)
  694. {
  695. int ADC_Value=0;
  696. #if 1
  697. if(gpio_read(PIN_ID_BD1_1) == 1)
  698. {
  699. printf("\r\nPIN_ID_BD1_1 HIGH");
  700. }
  701. usleep(5000);
  702. if(gpio_read(PIN_IO_BD1_1) == 1)
  703. {
  704. printf("\r\nPIN_IO_BD1_1 HIGH");
  705. }
  706. usleep(5000);
  707. if(gpio_read(PIN_ID_BD2_1) == 1)
  708. {
  709. printf("\r\nPIN_ID_BD2_1 HIGH");
  710. }
  711. if(gpio_read(PIN_AM_RFID_RST) == 1)
  712. {
  713. printf("\r\PIN_AM_RFID_RST HIGH");
  714. }
  715. usleep(5000);
  716. if(gpio_read(PIN_AM_RFID_ICC) == 1)
  717. {
  718. printf("\r\PIN_AM_RFID_ICC HIGH");
  719. }
  720. usleep(5000);
  721. if(gpio_read(PIN_IO_BD2_2) == 1)
  722. {
  723. printf("\r\PIN_IO_BD2_2 HIGH");
  724. }
  725. #endif
  726. usleep(5000);
  727. if(gpio_read(PIN_IO_BD2_1) == 1)
  728. {
  729. printf("\r\PIN_IO_BD2_1 HIGH");
  730. }
  731. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  732. {
  733. printf("\r\nRelay1 CLOSE OK");
  734. }
  735. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  736. {
  737. printf("\r\nRelay2 CLOSE OK");
  738. }
  739. if(gpio_read(PIN_ENG_BNT) == 0)
  740. {
  741. printf("\r\nRelay3 CLOSE OK");
  742. }
  743. if(gpio_read(PIN_IO_BD1_2) == 0)
  744. {
  745. printf("\r\nRelay4 CLOSE OK");
  746. }
  747. ADC_Value=adc_read(ADC_Index);
  748. printf("\r\nAIN%d = %d",ADC_Index,ADC_Value);
  749. ADC_Index++;
  750. if(ADC_Index>=4)
  751. ADC_Index=0;
  752. #if 0
  753. for(ADC_Index=0;ADC_Index<4;ADC_Index++)
  754. {
  755. ADC_Value=adc_read(ADC_Index);
  756. printf("\r\nAIN%d = %d",ADC_Index,ADC_Value);
  757. usleep(10000);
  758. }
  759. //usleep(100000);
  760. if(adc_read(ADC_AIN0) < 100 && adc_read(ADC_AIN1) < 100 && adc_read(ADC_AIN2) < 100 && adc_read(ADC_AIN3) < 100)
  761. {
  762. gpio_write(PIN_AM_RFID_ICC, 0);
  763. usleep(100000);
  764. if(adc_read(ADC_AIN0) > 4000 && adc_read(ADC_AIN1) > 4000 && adc_read(ADC_AIN2) > 4000 && adc_read(ADC_AIN3) > 4000)
  765. {
  766. printf("\r\nAIN0, AIN1, AIN2, AIN3 Test OK");
  767. }
  768. else
  769. {
  770. printf("\r\nAIN0, AIN1, AIN2, AIN3 High Test Fail");
  771. return;
  772. }
  773. }
  774. else
  775. {
  776. printf("\r\nAIN0, AIN1, AIN2, AIN3 Low Test Fail");
  777. return;
  778. }
  779. gpio_write(PIN_AM_OK_FLAG, 1);
  780. #endif
  781. printf("\r\nIO Test Done!");
  782. printf("\r\nSuccess!\r\n");
  783. }
  784. void InitEthernet()
  785. {
  786. pid_t pid;
  787. uint8_t cnt_pingDNS_Fail;
  788. char tmpbuf[256];
  789. //Init Eth0 for internet
  790. memset(tmpbuf,0,256);
  791. strcpy(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,"192.168.2.21");
  792. strcpy(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress,"255.255.255.0");
  793. sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
  794. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
  795. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
  796. DEBUG_INFO("eth0 config as ip: %s, netmask: %s\n", ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
  797. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
  798. system(tmpbuf);
  799. memset(tmpbuf,0,256);
  800. sprintf(tmpbuf,"route add default gw %s eth0 &",
  801. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
  802. system(tmpbuf);
  803. system("ifconfig lo up &");
  804. system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &");
  805. //system("/sbin/ethtool -s eth0 speed 10 duplex full autoneg off");
  806. //Run DHCP client if enabled
  807. system("killall udhcpc");
  808. system("rm -rf /etc/resolv.conf");
  809. system("echo nameserver 8.8.8.8 >> /etc/resolv.conf"); //Google DNS server
  810. system("echo nameserver 180.76.76.76 >> /etc/resolv.conf"); //Baidu DNS server
  811. if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0)
  812. {
  813. sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
  814. system(tmpbuf);
  815. }
  816. // Upgrade system id to /etc/hostname
  817. sprintf(tmpbuf, "echo %s > /etc/hostname", ShmSysConfigAndInfo->SysConfig.SystemId);
  818. system(tmpbuf);
  819. // Ethernet MAC address
  820. getEth0MacAddress();
  821. //check internet status
  822. pid = fork();
  823. if(pid == 0)
  824. {
  825. for(;;)
  826. {
  827. if(isRouteFail())
  828. {
  829. //DEBUG_ERROR("eth0 not in route, restart eth0.\n");
  830. system("/sbin/ifconfig eth0 down;/sbin/ifconfig eth0 up");
  831. if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0))
  832. {
  833. system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
  834. sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
  835. system(tmpbuf);
  836. }
  837. else
  838. {
  839. system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
  840. memset(tmpbuf,0,256);
  841. sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
  842. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
  843. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
  844. system(tmpbuf);
  845. memset(tmpbuf,0,256);
  846. sprintf(tmpbuf,"route add default gw %s eth0 &",
  847. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
  848. system(tmpbuf);
  849. }
  850. }
  851. if(isReachableInternet() == PASS)
  852. {
  853. ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=OFF;
  854. cnt_pingDNS_Fail = 0;
  855. }
  856. else
  857. {
  858. if(cnt_pingDNS_Fail >= 3)
  859. {
  860. ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=ON;
  861. if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0))
  862. {
  863. system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
  864. sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
  865. system(tmpbuf);
  866. }
  867. else
  868. {
  869. system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
  870. memset(tmpbuf,0,256);
  871. sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
  872. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
  873. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
  874. system(tmpbuf);
  875. memset(tmpbuf,0,256);
  876. sprintf(tmpbuf,"route add default gw %s eth0 &",
  877. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
  878. system(tmpbuf);
  879. }
  880. cnt_pingDNS_Fail = 0;
  881. }
  882. else
  883. {
  884. cnt_pingDNS_Fail++;
  885. }
  886. }
  887. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet &&
  888. ((ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == 0) || ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi) &&
  889. ((ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled == 0) || ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi))
  890. {
  891. ShmSysConfigAndInfo->SysInfo.InternetConn = OFF;
  892. }
  893. else
  894. {
  895. ShmSysConfigAndInfo->SysInfo.InternetConn = ON;
  896. }
  897. //============================================================
  898. // Priority for internet 0 : First / 1 : Second / 2: Third
  899. //============================================================
  900. if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet)
  901. {
  902. system("/sbin/ifmetric eth0 0");
  903. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  904. {
  905. system("/sbin/ifmetric mlan0 1");
  906. }
  907. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  908. {
  909. system("/sbin/ifmetric ppp0 2");
  910. }
  911. }
  912. else if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi)
  913. {
  914. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  915. {
  916. system("/sbin/ifmetric eth0 1");
  917. system("/sbin/ifmetric mlan0 0");
  918. }
  919. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  920. {
  921. system("/sbin/ifmetric ppp0 2");
  922. }
  923. }
  924. else if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi)
  925. {
  926. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  927. {
  928. system("/sbin/ifmetric mlan0 2");
  929. }
  930. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
  931. {
  932. system("/sbin/ifmetric eth0 1");
  933. system("/sbin/ifmetric ppp0 0");
  934. }
  935. }
  936. else
  937. {}
  938. sleep(5);
  939. }
  940. }
  941. DEBUG_INFO("Initial Ethernet OK\n");
  942. }
  943. int InitWatchDog()
  944. {
  945. int fd;
  946. int timeout = 330;
  947. system("/usr/bin/fuser -k /dev/watchdog");
  948. sleep(1);
  949. system("echo V > /dev/watchdog");
  950. sleep(1);
  951. fd=open("/dev/watchdog", O_RDWR);
  952. if(fd<=0)
  953. {
  954. DEBUG_ERROR("System watch dog initial fail.\n");
  955. }
  956. ioctl(fd, _IOWR('W', 6, int), &timeout);
  957. return fd;
  958. }
  959. int InitCanBus()
  960. {
  961. int s0,nbytes;
  962. struct timeval tv;
  963. struct ifreq ifr0;
  964. struct sockaddr_can addr0;
  965. system("/sbin/ip link set can1 down");
  966. system("/sbin/ip link set can1 type can bitrate 250000 restart-ms 100");
  967. system("/sbin/ip link set can1 up");
  968. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  969. tv.tv_sec = 0;
  970. tv.tv_usec = 10000;
  971. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  972. {
  973. DEBUG_ERROR("Set SO_RCVTIMEO NG");
  974. }
  975. nbytes=40960;
  976. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  977. {
  978. DEBUG_ERROR("Set SO_RCVBUF NG");
  979. }
  980. nbytes=40960;
  981. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  982. {
  983. DEBUG_ERROR("Set SO_SNDBUF NG");
  984. }
  985. strcpy(ifr0.ifr_name, "can1" );
  986. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  987. addr0.can_family = AF_CAN;
  988. addr0.can_ifindex = ifr0.ifr_ifindex;
  989. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  990. return s0;
  991. }
  992. int Initialization()
  993. {
  994. int result = PASS;
  995. InitEthernet();
  996. if((wtdFd = InitWatchDog()) == FAIL)
  997. {
  998. DEBUG_ERROR("Watchdog initial fail.\n");
  999. result = FAIL;
  1000. }
  1001. #if 0
  1002. CanFd = InitCanBus();
  1003. if(result == PASS)
  1004. DEBUG_INFO("Initialization OK.\n");
  1005. else
  1006. DEBUG_INFO("Initialization Fail.\n");
  1007. #endif
  1008. InitIO();
  1009. return result;
  1010. }
  1011. //=====================================================
  1012. // System common routine
  1013. //=====================================================
  1014. char* getSystemModeName(unsigned char mode)
  1015. {
  1016. char* result;
  1017. switch(mode)
  1018. {
  1019. case SYS_MODE_BOOTING:
  1020. result = "booting";
  1021. break;
  1022. case SYS_MODE_IDLE:
  1023. result = "idle";
  1024. break;
  1025. case SYS_MODE_AUTHORIZING:
  1026. result = "authorizing";
  1027. break;
  1028. case SYS_MODE_PREPARING:
  1029. result = "preparing";
  1030. break;
  1031. case SYS_MODE_CHARGING:
  1032. result = "charging";
  1033. break;
  1034. case SYS_MODE_TERMINATING:
  1035. result = "terminating";
  1036. break;
  1037. case SYS_MODE_COMPLETE:
  1038. result = "complete";
  1039. break;
  1040. case SYS_MODE_ALARM:
  1041. result = "alarm";
  1042. break;
  1043. case SYS_MODE_FAULT:
  1044. result = "fault";
  1045. break;
  1046. case SYS_MODE_MAINTAIN:
  1047. result = "maintain";
  1048. break;
  1049. case SYS_MODE_RESERVATION:
  1050. result = "reservation";
  1051. break;
  1052. case SYS_MODE_BOOKING:
  1053. result = "booking";
  1054. break;
  1055. case SYS_MODE_DEBUG:
  1056. result = "debug";
  1057. break;
  1058. case SYS_MODE_UPDATE:
  1059. result = "upgrade";
  1060. break;
  1061. case SYS_MODE_BATTERY_CHARGE:
  1062. result = "battery charging";
  1063. break;
  1064. case SYS_MODE_BATTERY_DISCHARGE:
  1065. result = "battery discharging";
  1066. break;
  1067. case SYS_MODE_BATTERY_ALARM:
  1068. result = "battery alarm";
  1069. break;
  1070. default:
  1071. result = "unknown";
  1072. break;
  1073. }
  1074. return result;
  1075. }
  1076. void setChargerMode(unsigned char mode)
  1077. {
  1078. ShmEMSSInfo->PreviousSystemStatus = ShmEMSSInfo->SystemStatus;
  1079. ShmEMSSInfo->SystemStatus = mode;
  1080. //DEBUG_INFO("System mode switch from %s to %s\n", getSystemModeName(ShmBatteryInfo->PreviousSystemStatus), getSystemModeName(ShmBatteryInfo->SystemStatus));
  1081. printf("System mode switch from %s to %s\n", getSystemModeName(ShmEMSSInfo->PreviousSystemStatus), getSystemModeName(ShmEMSSInfo->SystemStatus));
  1082. }
  1083. unsigned char isMode(unsigned char mode)
  1084. {
  1085. return ((ShmEMSSInfo->SystemStatus == mode)?YES:NO);
  1086. }
  1087. unsigned char isModeChange()
  1088. {
  1089. unsigned char result = NO;
  1090. if(!isMode(ShmEMSSInfo->PreviousSystemStatus))
  1091. {
  1092. result = YES;
  1093. ShmEMSSInfo->PreviousSystemStatus = ShmEMSSInfo->SystemStatus;
  1094. }
  1095. return result;
  1096. }
  1097. //==========================================
  1098. // Check routine
  1099. //==========================================
  1100. void checkTask()
  1101. {
  1102. /*
  1103. * TODO:
  1104. * 1. What task main need to monitor
  1105. */
  1106. if((system("pidof -s Module_Dispenser > /dev/null") != 0))
  1107. {
  1108. DEBUG_INFO("Module_Dispenser not running, restart it.\n");
  1109. //system ("/root/Module_Dispenser &");
  1110. }
  1111. }
  1112. int SpawnTask()
  1113. {
  1114. system("/root/EMSS_BMSComm &");
  1115. system("/root/EMSS_InternalComm &");
  1116. //system("/root/Module_EvComm &");
  1117. //system("/root/Module_LcmControl &");
  1118. //system("/root/Module_InternalComm &");
  1119. //system("/root/Module_PsuComm &");
  1120. return PASS;
  1121. }
  1122. void KillTask()
  1123. {
  1124. system("killall EMSS_BMSComm");
  1125. system("killall EMSS_InternalComm");
  1126. //system("killall Module_EvComm");
  1127. //system("killall Module_LcmControl");
  1128. //system("killall Module_InternalComm");
  1129. }
  1130. void AllRelay_OFF()
  1131. {
  1132. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1133. Relay1_off;
  1134. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1135. Relay2_off;
  1136. if(gpio_read(PIN_ENG_BNT) == 0)
  1137. Relay3_off;
  1138. if(gpio_read(PIN_IO_BD1_2) == 0)
  1139. Relay4_off;
  1140. }
  1141. //======================================================
  1142. // Main process
  1143. //======================================================
  1144. int main(void)
  1145. {
  1146. //==================================================
  1147. // Create all share memory
  1148. //==================================================
  1149. if(CreatShareMemory() == FAIL)
  1150. {
  1151. DEBUG_ERROR("Create ShareMemory NG\n");
  1152. if(ShmStatusCodeData != NULL)
  1153. {
  1154. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1155. }
  1156. sleep(5);
  1157. system("reboot -f");
  1158. sleep(5);
  1159. system("reboot -f");
  1160. }
  1161. else
  1162. {
  1163. //LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
  1164. //DEBUG_INFO("Create ShareMemory OK\n");
  1165. printf("Create ShareMemory OK\n");
  1166. }
  1167. printf("Initializing. \n");
  1168. if(Initialization() != PASS)
  1169. {
  1170. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = ON;
  1171. }
  1172. printf("Spawn all Task. \n");
  1173. SpawnTask();
  1174. //==================================================
  1175. // Main loop
  1176. //==================================================
  1177. for(;;)
  1178. {
  1179. //==============================================
  1180. // Period check for 10 seconds
  1181. //==============================================
  1182. if(getDiffSecNow(timerStartTime[TMR_IDX_CHECK_TASK]) > 10)
  1183. {
  1184. //==============================================
  1185. // Check task processing
  1186. //==============================================
  1187. if(ShmEMSSInfo->SystemStatus != SYS_MODE_BOOTING)
  1188. checkTask();
  1189. refreshStartTimer(&timerStartTime[TMR_IDX_CHECK_TASK]);
  1190. }
  1191. //==============================================
  1192. // State machine loop
  1193. //==============================================
  1194. switch(ShmEMSSInfo->SystemStatus)
  1195. {
  1196. case SYS_MODE_BOOTING:
  1197. //if(isModeChange())
  1198. {
  1199. /*
  1200. * TODO:
  1201. * 1. Only run one time, if previous system mode is different
  1202. */
  1203. printf("BOOKING MODE \r\n");
  1204. }
  1205. setChargerMode(SYS_MODE_PREPARING);
  1206. refreshStartTimer(&timerStartTime[BMS_PREPARING_TASK]);
  1207. break;
  1208. case SYS_MODE_PREPARING:
  1209. if(isModeChange())
  1210. {
  1211. /*
  1212. * TODO:
  1213. * 1. Only run one time, if previous system mode is different
  1214. */
  1215. printf("PREPARING MODE \r\n");
  1216. }
  1217. #if 1
  1218. if(getDiffSecNow(timerStartTime[BMS_PREPARING_TASK]) > 10)
  1219. {
  1220. if(ShmBatteryInfo->AlarmInfo.AlarmValue==0)
  1221. {
  1222. if(ShmBatteryInfo->RelayInfo.RelayValue==0 )
  1223. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1;
  1224. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1225. ShmEMSSInfo->ATOD1Status = POLLING_STEP_0;
  1226. ShmEMSSInfo->ATOD2Status = POLLING_STEP_0;
  1227. setChargerMode(SYS_MODE_IDLE);
  1228. }else
  1229. {
  1230. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1231. Relay1_off;
  1232. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1233. Relay2_off;
  1234. if(gpio_read(PIN_ENG_BNT) == 0)
  1235. Relay3_off;
  1236. #if 1
  1237. if(gpio_read(PIN_IO_BD1_2) == 0)
  1238. Relay4_off;
  1239. #else
  1240. if(gpio_read(PIN_IO_BD1_2) == 1)
  1241. {
  1242. usleep(100000);
  1243. Relay4_on;
  1244. usleep(1000000);
  1245. ACTODC_Start_charging;
  1246. }
  1247. #endif
  1248. if(ShmBatteryInfo->RelayInfo.RelayValue==1)
  1249. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1250. if(ShmBatteryInfo->RelayInfo.RelayValue==2)
  1251. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1;
  1252. ShmEMSSInfo->ATOD1Status = POLLING_STEP_0;
  1253. ShmEMSSInfo->ATOD2Status = POLLING_STEP_0;
  1254. setChargerMode(SYS_MODE_BATTERY_ALARM);
  1255. }
  1256. }
  1257. #else
  1258. setChargerMode(SYS_MODE_IDLE);
  1259. #endif
  1260. break;
  1261. case SYS_MODE_IDLE:
  1262. {
  1263. if(isModeChange())
  1264. {
  1265. /*
  1266. * TODO:
  1267. * 1. Only run one time, if previous system mode is different
  1268. */
  1269. printf("IDLE MODE \r\n");
  1270. }
  1271. #if 1
  1272. if(ShmBatteryInfo->SOC>=1 &&
  1273. ShmBatteryInfo->SOC<=10 &&
  1274. ShmBatteryInfo->AlarmInfo.AlarmValue==0 &&
  1275. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \
  1276. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \
  1277. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \
  1278. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault)
  1279. )
  1280. {
  1281. AllRelay_OFF();
  1282. if(ShmBatteryInfo->RelayInfo.RelayValue==2)
  1283. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1;
  1284. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1285. setChargerMode(SYS_MODE_BATTERY_CHARGE);
  1286. break;
  1287. }else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ||
  1288. ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ) &&
  1289. ShmBatteryInfo->AlarmInfo.AlarmValue==0)
  1290. {
  1291. if(gpio_read(PIN_ENG_BNT) == 0)
  1292. Relay3_off
  1293. if(gpio_read(PIN_IO_BD1_2) == 0)
  1294. Relay4_off;
  1295. if(ShmBatteryInfo->RelayInfo.RelayValue!=0x2)
  1296. {
  1297. //ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1298. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1;
  1299. }
  1300. //ShmEMSSInfo->BATStatus = POLLING_STEP_1;
  1301. //refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1302. }else if(
  1303. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Authorizing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) &&
  1304. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Authorizing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) &&
  1305. (ShmBatteryInfo->AlarmInfo.AlarmValue!=0)
  1306. )
  1307. {
  1308. //printf("battery alarm MODE 1 \n");
  1309. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1310. Relay1_off;
  1311. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1312. Relay2_off;
  1313. if(gpio_read(PIN_ENG_BNT) == 0)
  1314. Relay3_off;
  1315. #if 1
  1316. if(gpio_read(PIN_IO_BD1_2) == 0)
  1317. Relay4_off;
  1318. #else
  1319. if(gpio_read(PIN_IO_BD1_2) == 1)
  1320. {
  1321. usleep(100000);
  1322. Relay4_on;
  1323. usleep(1000000);
  1324. ACTODC_Start_charging;
  1325. }
  1326. #endif
  1327. if(ShmBatteryInfo->RelayInfo.RelayValue==1)
  1328. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1329. if(ShmBatteryInfo->RelayInfo.RelayValue==2)
  1330. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1;
  1331. ShmEMSSInfo->ATOD1Status = POLLING_STEP_0;
  1332. ShmEMSSInfo->ATOD2Status = POLLING_STEP_0;
  1333. setChargerMode(SYS_MODE_BATTERY_ALARM);
  1334. }
  1335. if( ShmBatteryInfo->SOC <= 10 && ShmBatteryInfo->AlarmInfo.AlarmValue==0)
  1336. {
  1337. //AllRelay_OFF();
  1338. if(gpio_read(PIN_ENG_BNT) == 0)
  1339. Relay3_off;
  1340. if(gpio_read(PIN_IO_BD1_2) == 0)
  1341. Relay4_off;
  1342. if(ShmBatteryInfo->RelayInfo.RelayValue==1)
  1343. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1344. if(ShmBatteryInfo->RelayInfo.RelayValue==2)
  1345. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1;
  1346. //ShmEMSSInfo->BATStatus = POLLING_STEP_1;
  1347. //refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1348. }
  1349. /*if(ShmEMSSInfo->BATStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_BATDIS_TASK]) > 1) //BATTERY Discharging
  1350. {
  1351. if(ShmBatteryInfo->RelayInfo.RelayValue==0 )
  1352. {
  1353. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1;
  1354. refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1355. }else if(ShmBatteryInfo->RelayInfo.RelayValue==0x2)
  1356. {
  1357. ShmEMSSInfo->BATStatus = POLLING_STEP_2;
  1358. refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1359. }
  1360. if(ShmBatteryInfo->AlarmInfo.AlarmValue!=0)
  1361. {
  1362. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1363. }
  1364. refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1365. }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_BATDIS_TASK]) > 1)
  1366. {
  1367. if(ShmBatteryInfo->SOC <= 10 || ShmBatteryInfo->AlarmInfo.AlarmValue==0)
  1368. {
  1369. if(ShmBatteryInfo->RelayInfo.RelayValue!=0)
  1370. {
  1371. ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1;
  1372. }else
  1373. {
  1374. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1375. }
  1376. }
  1377. if(ShmBatteryInfo->AlarmInfo.AlarmValue!=0)
  1378. {
  1379. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1380. }
  1381. refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]);
  1382. }*/
  1383. if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing &&
  1384. /*(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus < ChargerSystemStatus_Preparing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && \ */
  1385. ShmEMSSInfo->ATOD1Status == POLLING_STEP_0
  1386. )
  1387. {
  1388. if(gpio_read(PIN_BOARD1_PROXIMITY) == 1)
  1389. Relay1_on;
  1390. //if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1391. //Relay2_off;
  1392. if(gpio_read(PIN_ENG_BNT) == 0)
  1393. Relay3_off;
  1394. if(gpio_read(PIN_IO_BD1_2) == 0)
  1395. Relay4_off;
  1396. ShmEMSSInfo->ATOD1Status = POLLING_STEP_1;
  1397. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1398. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1399. {
  1400. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1401. {
  1402. ShmEMSSInfo->ATOD1Status = POLLING_STEP_2;
  1403. }else
  1404. {
  1405. Relay1_on;
  1406. }
  1407. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1408. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1409. {
  1410. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating)
  1411. {
  1412. ShmEMSSInfo->ATOD1Status = POLLING_STEP_3;
  1413. }
  1414. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1415. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1416. {
  1417. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1418. {
  1419. Relay1_off;
  1420. }else
  1421. {
  1422. ShmEMSSInfo->ATOD1Status = POLLING_STEP_0;
  1423. }
  1424. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1425. }
  1426. if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing &&
  1427. ShmEMSSInfo->ATOD2Status == POLLING_STEP_0
  1428. )
  1429. {
  1430. //if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1431. //Relay1_off;
  1432. if(gpio_read(PIN_BOARD2_PROXIMITY) == 1)
  1433. Relay2_on;
  1434. if(gpio_read(PIN_ENG_BNT) == 0)
  1435. Relay3_off;
  1436. if(gpio_read(PIN_IO_BD1_2) == 0)
  1437. Relay4_off;
  1438. ShmEMSSInfo->ATOD2Status = POLLING_STEP_1;
  1439. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1440. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1441. {
  1442. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1443. {
  1444. ShmEMSSInfo->ATOD2Status = POLLING_STEP_2;
  1445. }else
  1446. {
  1447. Relay2_on;
  1448. }
  1449. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1450. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1451. {
  1452. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating)
  1453. {
  1454. ShmEMSSInfo->ATOD2Status = POLLING_STEP_3;
  1455. }
  1456. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1457. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1458. {
  1459. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1460. {
  1461. Relay2_off;
  1462. }else
  1463. {
  1464. ShmEMSSInfo->ATOD2Status = POLLING_STEP_0;
  1465. }
  1466. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1467. }
  1468. #else
  1469. if(getDiffSecNow(timerStartTime[EMSS_TEST_TASK]) > 2)
  1470. {
  1471. DoIOTest(); //for test
  1472. refreshStartTimer(&timerStartTime[EMSS_TEST_TASK]);
  1473. }
  1474. #endif
  1475. }
  1476. break;
  1477. case SYS_MODE_BATTERY_CHARGE:
  1478. {
  1479. if(isModeChange())
  1480. {
  1481. /*
  1482. * TODO:
  1483. * 1. Only run one time, if previous system mode is different
  1484. */
  1485. printf("SYS_MODE_BATTERY_CHARGE MODE \r\n");
  1486. }
  1487. if(ShmEMSSInfo->BATStatus == POLLING_STEP_0)
  1488. {
  1489. if(ShmBatteryInfo->RelayInfo.RelayValue==0 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1)
  1490. {
  1491. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1On = 1;
  1492. }else if(ShmBatteryInfo->RelayInfo.RelayValue==1 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 2)
  1493. {
  1494. if(gpio_read(PIN_ENG_BNT) == 1)
  1495. {
  1496. Relay3_on;
  1497. }else
  1498. {
  1499. ShmEMSSInfo->BATStatus = POLLING_STEP_1;
  1500. }
  1501. }
  1502. refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]);
  1503. }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 2)
  1504. {
  1505. Battery_Start_charging;
  1506. ShmEMSSInfo->BATStatus = POLLING_STEP_2;
  1507. refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]);
  1508. }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1)
  1509. {
  1510. if(ShmBatteryInfo->SOC >=90 || ShmBatteryInfo->AlarmInfo.AlarmValue!=0)
  1511. {
  1512. ShmEMSSInfo->BATStatus = POLLING_STEP_3;
  1513. Battery_Stop_charging;
  1514. }
  1515. refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]);
  1516. }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1)
  1517. {
  1518. if(ShmBatteryInfo->RelayInfo.RelayValue==1 )
  1519. {
  1520. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1521. }else
  1522. {
  1523. ShmEMSSInfo->BATStatus = POLLING_STEP_END;
  1524. }
  1525. refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]);
  1526. }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_END && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1)
  1527. {
  1528. if(gpio_read(PIN_ENG_BNT) == 0)
  1529. {
  1530. Relay3_off;
  1531. }else
  1532. {
  1533. ShmEMSSInfo->BATStatus = POLLING_STEP_0;
  1534. setChargerMode(SYS_MODE_PREPARING);
  1535. }
  1536. refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]);
  1537. }
  1538. if(ShmBatteryInfo->AlarmInfo.AlarmValue != 0 || ShmEMSSInfo->AlarmInfo.bits.isTransmissionFailure==1)
  1539. {
  1540. Battery_Stop_charging;
  1541. usleep(1000000);
  1542. Relay3_off;
  1543. usleep(1000000);
  1544. if(ShmBatteryInfo->RelayInfo.RelayValue==1 )
  1545. {
  1546. ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1;
  1547. }
  1548. setChargerMode(SYS_MODE_PREPARING);
  1549. }
  1550. }
  1551. break;
  1552. case SYS_MODE_BATTERY_ALARM:
  1553. {
  1554. if(isModeChange())
  1555. {
  1556. /*
  1557. * TODO:
  1558. * 1. Only run one time, if previous system mode is different
  1559. */
  1560. printf("SYS_MODE_BATTERY_ALARM MODE \r\n");
  1561. }
  1562. //printf("SYS_MODE_BATTERY_ALARM MODE 1 \n");
  1563. #if 1
  1564. if( ShmBatteryInfo->AlarmInfo.AlarmValue==0 &&
  1565. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) &&
  1566. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) &&
  1567. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) &&
  1568. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating)
  1569. )
  1570. {
  1571. setChargerMode(SYS_MODE_PREPARING);
  1572. }
  1573. if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus == ChargerSystemStatus_Preparing &&
  1574. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) &&
  1575. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) &&
  1576. ShmEMSSInfo->ATOD1Status == POLLING_STEP_0
  1577. )
  1578. {
  1579. #if 0
  1580. if(gpio_read(PIN_IO_BD1_2) == 0)
  1581. {
  1582. ACTODC_Stop_charging;
  1583. usleep(1000000);
  1584. Relay4_off;
  1585. }
  1586. usleep(1000000);
  1587. #endif
  1588. if(gpio_read(PIN_BOARD1_PROXIMITY) == 1)
  1589. {
  1590. Relay1_on;
  1591. printf("Relay1 ON \r\n");
  1592. }
  1593. //if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1594. //Relay2_off;
  1595. if(gpio_read(PIN_ENG_BNT) == 0)
  1596. Relay3_off;
  1597. ShmEMSSInfo->ATOD1Status = POLLING_STEP_1;
  1598. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1599. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1600. {
  1601. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1602. {
  1603. ShmEMSSInfo->ATOD1Status = POLLING_STEP_2;
  1604. }else
  1605. {
  1606. Relay1_on;
  1607. }
  1608. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1609. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1610. {
  1611. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating)
  1612. {
  1613. ShmEMSSInfo->ATOD1Status = POLLING_STEP_3;
  1614. }
  1615. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1616. }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1)
  1617. {
  1618. #if 1
  1619. Relay1_off;
  1620. #else
  1621. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1622. {
  1623. Relay1_off;
  1624. }else
  1625. {
  1626. ShmEMSSInfo->ATOD1Status = POLLING_STEP_0;
  1627. if(gpio_read(PIN_BOARD2_PROXIMITY) == 1)
  1628. {
  1629. Relay4_on;
  1630. usleep(1000000);
  1631. ACTODC_Start_charging;
  1632. }
  1633. }
  1634. #endif
  1635. refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]);
  1636. }
  1637. printf("GUN 2 %d \r\n",ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus);
  1638. if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus == ChargerSystemStatus_Preparing &&
  1639. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Alarm) &&
  1640. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Alarm) &&
  1641. ShmEMSSInfo->ATOD2Status == POLLING_STEP_0
  1642. )
  1643. {
  1644. #if 0
  1645. if(gpio_read(PIN_IO_BD1_2) == 0)
  1646. {
  1647. ACTODC_Stop_charging;
  1648. usleep(1000000);
  1649. Relay4_off;
  1650. }
  1651. usleep(1000000);
  1652. #endif
  1653. //if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1654. //Relay1_off;
  1655. if(gpio_read(PIN_BOARD2_PROXIMITY) == 1)
  1656. {
  1657. Relay2_on;
  1658. printf("Relay 2 on \r\n");
  1659. }
  1660. if(gpio_read(PIN_ENG_BNT) == 0)
  1661. Relay3_off;
  1662. ShmEMSSInfo->ATOD2Status = POLLING_STEP_1;
  1663. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1664. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1665. {
  1666. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1667. {
  1668. ShmEMSSInfo->ATOD2Status = POLLING_STEP_2;
  1669. }else
  1670. {
  1671. Relay2_on;
  1672. }
  1673. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1674. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1675. {
  1676. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating)
  1677. {
  1678. ShmEMSSInfo->ATOD2Status = POLLING_STEP_3;
  1679. }
  1680. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1681. }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1)
  1682. {
  1683. #if 1
  1684. Relay2_off;
  1685. #else
  1686. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1687. {
  1688. Relay2_off;
  1689. }else
  1690. {
  1691. ShmEMSSInfo->ATOD2Status = POLLING_STEP_0;
  1692. if(gpio_read(PIN_BOARD1_PROXIMITY) == 1)
  1693. {
  1694. Relay4_on;
  1695. usleep(1000000);
  1696. ACTODC_Start_charging;
  1697. }
  1698. }
  1699. #endif
  1700. refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]);
  1701. }
  1702. #if 0
  1703. if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ||
  1704. ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ) &&
  1705. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) &&
  1706. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) &&
  1707. ShmEMSSInfo->DTODStatus == POLLING_STEP_0)
  1708. {
  1709. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0)
  1710. Relay1_off;
  1711. if(gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1712. Relay2_off;
  1713. if(gpio_read(PIN_ENG_BNT) == 0)
  1714. Relay3_off;
  1715. if(gpio_read(PIN_IO_BD1_2) == 1)
  1716. {
  1717. usleep(1000000);
  1718. Relay4_on;
  1719. usleep(1000000);
  1720. ACTODC_Start_charging;
  1721. }
  1722. ShmEMSSInfo->DTODStatus = POLLING_STEP_1;
  1723. refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]);
  1724. }else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1)
  1725. {
  1726. if(gpio_read(PIN_IO_BD1_2) == 0)
  1727. {
  1728. ShmEMSSInfo->DTODStatus = POLLING_STEP_2;
  1729. }else
  1730. {
  1731. Relay4_on;
  1732. }
  1733. refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]);
  1734. }else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1)
  1735. {
  1736. if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) &&
  1737. (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating)
  1738. )
  1739. {
  1740. //ACTODC_Stop_charging;
  1741. ShmEMSSInfo->DTODStatus = POLLING_STEP_0;
  1742. }
  1743. refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]);
  1744. }/*else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1)
  1745. {
  1746. if(gpio_read(PIN_IO_BD1_2) == 1)
  1747. {
  1748. ShmEMSSInfo->DTODStatus = POLLING_STEP_0;
  1749. }
  1750. refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]);
  1751. }*/
  1752. #endif
  1753. #endif
  1754. }
  1755. break;
  1756. case SYS_MODE_FAULT:
  1757. if(isModeChange())
  1758. {
  1759. /*
  1760. * TODO:
  1761. * 1. Only run one time, if previous system mode is different
  1762. */
  1763. printf("FAULT MODE");
  1764. }
  1765. /*
  1766. * TODO:
  1767. * 1. Run some thing here
  1768. */
  1769. break;
  1770. case SYS_MODE_UPDATE:
  1771. if(isModeChange())
  1772. {
  1773. /*
  1774. * TODO:
  1775. * 1. Only run one time, if previous system mode is different
  1776. */
  1777. printf("UPDATE MODE");
  1778. }
  1779. /*
  1780. * TODO:
  1781. * 1. Run some thing here
  1782. */
  1783. break;
  1784. default:
  1785. break;
  1786. }
  1787. // System watch dog feed
  1788. write(wtdFd, "a", 1);
  1789. usleep(50000);
  1790. }
  1791. return FAIL;
  1792. }