Module_AlarmDetect.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055
  1. /*
  2. * Module_AlarmDetect.c
  3. *
  4. * Created on: 2020年01月15日
  5. * Author: Eason Yang
  6. */
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <sys/time.h>
  10. #include <sys/timeb.h>
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #include <sys/mman.h>
  14. #include <unistd.h>
  15. #include <stdarg.h>
  16. #include <stdio.h> /*標準輸入輸出定義*/
  17. #include <stdlib.h> /*標準函數庫定義*/
  18. #include <unistd.h> /*Unix 標準函數定義*/
  19. #include <fcntl.h> /*檔控制定義*/
  20. #include <termios.h> /*PPSIX 終端控制定義*/
  21. #include <errno.h> /*錯誤號定義*/
  22. #include <errno.h>
  23. #include <string.h>
  24. #include <time.h>
  25. #include <ctype.h>
  26. #include "define.h"
  27. #include "main.h"
  28. #define FILTER_SPEC 50
  29. #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  30. #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  31. #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  32. #define Debug
  33. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  34. #define PASS 1
  35. #define FAIL 0
  36. #define ON 1
  37. #define OFF 0
  38. #define SPEC_OV 275
  39. #define SPEC_UV 160
  40. #define SPEC_OC (32*1.1)
  41. #define SPEC_OT 85
  42. #define HYSTERETIC_OUV 10
  43. #define HYSTERETIC_OT 10
  44. #define HYSTERETIC_OC 10
  45. struct{
  46. unsigned short int OV[3];
  47. unsigned short int UV[3];
  48. unsigned short int OC;
  49. unsigned short int OT_AMB;
  50. unsigned short int GMI;
  51. unsigned short int Short;
  52. unsigned short int Leakage;
  53. unsigned short int HandShakingTimeout;
  54. unsigned short int EmrgencyBTN;
  55. unsigned short int Relay_Welding;
  56. unsigned short int Relay_DrivingFault;
  57. unsigned short int CP_LevelFail;
  58. unsigned short int MCU_SelfTestFail;
  59. }Alarm_Counter[2];
  60. void trim(char *s);
  61. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
  62. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  63. struct StatusCodeData *ShmStatusCodeData;
  64. struct OCPP16Data *ShmOCPP16Data;
  65. struct Charger *ShmCharger;
  66. int StoreLogMsg(const char *fmt, ...)
  67. {
  68. char Buf[4096+256];
  69. char buffer[4096];
  70. time_t CurrentTime;
  71. struct tm *tm;
  72. va_list args;
  73. va_start(args, fmt);
  74. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  75. va_end(args);
  76. memset(Buf,0,sizeof(Buf));
  77. CurrentTime = time(NULL);
  78. tm=localtime(&CurrentTime);
  79. sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/%04d-%02d_%s_%s_SystemLog",
  80. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  81. buffer,
  82. tm->tm_year+1900,tm->tm_mon+1,
  83. ShmSysConfigAndInfo->SysConfig.ModelName,
  84. ShmSysConfigAndInfo->SysConfig.SerialNumber);
  85. #ifdef SystemLogMessage
  86. system(Buf);
  87. #endif
  88. printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
  89. return rc;
  90. }
  91. int DiffTimeb(struct timeb ST, struct timeb ET)
  92. {
  93. //return milli-second
  94. unsigned int StartTime,StopTime;
  95. StartTime=(unsigned int)ST.time;
  96. StopTime=(unsigned int)ET.time;
  97. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  98. }
  99. //==========================================
  100. // Init all share memory
  101. //==========================================
  102. int InitShareMemory()
  103. {
  104. int result = PASS;
  105. int MeterSMId;
  106. //creat ShmSysConfigAndInfo
  107. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  108. {
  109. #ifdef SystemLogMessage
  110. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  111. #endif
  112. result = FAIL;
  113. }
  114. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  115. {
  116. #ifdef SystemLogMessage
  117. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  118. #endif
  119. result = FAIL;
  120. }
  121. else
  122. {}
  123. //creat ShmStatusCodeData
  124. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  125. {
  126. #ifdef SystemLogMessage
  127. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  128. #endif
  129. result = FAIL;
  130. }
  131. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  132. {
  133. #ifdef SystemLogMessage
  134. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  135. #endif
  136. result = FAIL;
  137. }
  138. else
  139. {}
  140. //creat ShmStatusCodeData
  141. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), IPC_CREAT | 0777)) < 0)
  142. {
  143. DEBUG_ERROR("shmget ShmCharger NG\r\n");
  144. result = FAIL;
  145. }
  146. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  147. {
  148. DEBUG_ERROR("shmat ShmCharger NG\r\n");
  149. result = FAIL;
  150. }
  151. else
  152. {}
  153. //creat ShmOCPP16Data
  154. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0)
  155. {
  156. DEBUG_ERROR("shmget ShmOCPP16Data NG\r\n");
  157. result = FAIL;
  158. }
  159. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  160. {
  161. DEBUG_ERROR("shmat ShmOCPP16Data NG\r\n");
  162. result = FAIL;
  163. }
  164. else
  165. {}
  166. return result;
  167. }
  168. //==========================================
  169. // Common routine
  170. //==========================================
  171. void trim(char *s)
  172. {
  173. int i=0, j, k, l=0;
  174. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  175. i++;
  176. j = strlen(s)-1;
  177. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  178. j--;
  179. if(i==0 && j==strlen(s)-1) { }
  180. else if(i==0) s[j+1] = '\0';
  181. else {
  182. for(k=i; k<=j; k++) s[l++] = s[k];
  183. s[l] = '\0';
  184. }
  185. }
  186. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  187. {
  188. strncpy(dest, src + start, cnt);
  189. dest[cnt] = 0;
  190. }
  191. //==========================================
  192. // Main process
  193. //==========================================
  194. int main(void)
  195. {
  196. if(InitShareMemory() == FAIL)
  197. {
  198. DEBUG_ERROR("InitShareMemory NG\n");
  199. if(ShmStatusCodeData!=NULL)
  200. {
  201. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  202. }
  203. sleep(5);
  204. return FAIL;
  205. }
  206. for(;;)
  207. {
  208. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  209. {
  210. //=====================================
  211. // Over voltage detection
  212. //=====================================
  213. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE))
  214. {
  215. if(Alarm_Counter[gun_index].OV[0] > FILTER_SPEC)
  216. {
  217. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == OFF))
  218. {
  219. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = ON;
  220. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_VOLTAGE;
  221. DEBUG_INFO("ALARM_OVER_VOLTAGE : alarm \r\n");
  222. }
  223. }
  224. else
  225. {
  226. Alarm_Counter[gun_index].OV[0]++;
  227. }
  228. }
  229. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE)))
  230. {
  231. Alarm_Counter[gun_index].OV[0] = 0;
  232. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == ON))
  233. {
  234. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = OFF;
  235. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_VOLTAGE;
  236. DEBUG_INFO("ALARM_OVER_VOLTAGE : recover \r\n");
  237. }
  238. }
  239. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  240. {
  241. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE))
  242. {
  243. if(Alarm_Counter[gun_index].OV[1] > FILTER_SPEC)
  244. {
  245. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == OFF))
  246. {
  247. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = ON;
  248. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_VOLTAGE;
  249. DEBUG_INFO("ALARM_OVER_VOLTAGE : alarm \r\n");
  250. }
  251. }
  252. else
  253. {
  254. Alarm_Counter[gun_index].OV[1]++;
  255. }
  256. }
  257. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE)))
  258. {
  259. Alarm_Counter[gun_index].OV[1] = 0;
  260. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == ON))
  261. {
  262. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = OFF;
  263. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_VOLTAGE;
  264. DEBUG_INFO("ALARM_OVER_VOLTAGE : recover \r\n");
  265. }
  266. }
  267. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE))
  268. {
  269. if(Alarm_Counter[gun_index].OV[2] > FILTER_SPEC)
  270. {
  271. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == OFF))
  272. {
  273. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = ON;
  274. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_VOLTAGE;
  275. DEBUG_INFO("ALARM_OVER_VOLTAGE : alarm \r\n");
  276. }
  277. }
  278. else
  279. {
  280. Alarm_Counter[gun_index].OV[2]++;
  281. }
  282. }
  283. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_VOLTAGE)))
  284. {
  285. Alarm_Counter[gun_index].OV[2] = 0;
  286. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == ON))
  287. {
  288. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = OFF;
  289. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_VOLTAGE;
  290. DEBUG_INFO("ALARM_OVER_VOLTAGE : recover \r\n");
  291. }
  292. }
  293. }
  294. //=====================================
  295. // Under voltage detection
  296. //=====================================
  297. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE))
  298. {
  299. if(Alarm_Counter[gun_index].UV[0] > FILTER_SPEC)
  300. {
  301. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == OFF))
  302. {
  303. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = ON;
  304. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_UNDER_VOLTAGE;
  305. DEBUG_INFO("ALARM_UNDER_VOLTAGE : alarm \r\n");
  306. }
  307. }
  308. else
  309. {
  310. Alarm_Counter[gun_index].UV[0]++;
  311. }
  312. }
  313. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE)))
  314. {
  315. Alarm_Counter[gun_index].UV[0] = 0;
  316. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == ON))
  317. {
  318. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = OFF;
  319. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_UNDER_VOLTAGE;
  320. DEBUG_INFO("ALARM_UNDER_VOLTAGE : recover \r\n");
  321. }
  322. }
  323. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  324. {
  325. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE))
  326. {
  327. if(Alarm_Counter[gun_index].UV[1] > FILTER_SPEC)
  328. {
  329. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == OFF))
  330. {
  331. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = ON;
  332. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_UNDER_VOLTAGE;
  333. DEBUG_INFO("ALARM_UNDER_VOLTAGE : alarm \r\n");
  334. }
  335. }
  336. else
  337. {
  338. Alarm_Counter[gun_index].UV[1]++;
  339. }
  340. }
  341. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE)))
  342. {
  343. Alarm_Counter[gun_index].UV[1] = 0;
  344. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == ON))
  345. {
  346. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = OFF;
  347. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_UNDER_VOLTAGE;
  348. DEBUG_INFO("ALARM_UNDER_VOLTAGE : recover \r\n");
  349. }
  350. }
  351. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE))
  352. {
  353. if(Alarm_Counter[gun_index].UV[2] > FILTER_SPEC)
  354. {
  355. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == OFF))
  356. {
  357. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = ON;
  358. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_UNDER_VOLTAGE;
  359. DEBUG_INFO("ALARM_UNDER_VOLTAGE : alarm \r\n");
  360. }
  361. }
  362. else
  363. {
  364. Alarm_Counter[gun_index].UV[2]++;
  365. }
  366. }
  367. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_UNDER_VOLTAGE)))
  368. {
  369. Alarm_Counter[gun_index].UV[2] = 0;
  370. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == ON))
  371. {
  372. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = OFF;
  373. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_UNDER_VOLTAGE;
  374. DEBUG_INFO("ALARM_UNDER_VOLTAGE : recover \r\n");
  375. }
  376. }
  377. }
  378. //=====================================
  379. // Over current detection
  380. //=====================================
  381. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT))
  382. {
  383. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == OFF))
  384. {
  385. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = ON;
  386. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_CURRENT;
  387. DEBUG_INFO("ALARM_OVER_CURRENT : alarm \r\n");
  388. }
  389. }
  390. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT)))
  391. {
  392. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON))
  393. {
  394. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = OFF;
  395. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_CURRENT;
  396. DEBUG_INFO("ALARM_OVER_CURRENT : recover \r\n");
  397. }
  398. }
  399. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  400. {
  401. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT))
  402. {
  403. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == OFF))
  404. {
  405. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = ON;
  406. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_CURRENT;
  407. DEBUG_INFO("ALARM_OVER_CURRENT : alarm \r\n");
  408. }
  409. }
  410. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT)))
  411. {
  412. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON))
  413. {
  414. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = OFF;
  415. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_CURRENT;
  416. DEBUG_INFO("ALARM_OVER_CURRENT : recover \r\n");
  417. }
  418. }
  419. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT))
  420. {
  421. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == OFF))
  422. {
  423. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = ON;
  424. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_CURRENT;
  425. DEBUG_INFO("ALARM_OVER_CURRENT : alarm \r\n");
  426. }
  427. }
  428. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_CURRENT)))
  429. {
  430. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON))
  431. {
  432. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = OFF;
  433. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_CURRENT;
  434. DEBUG_INFO("ALARM_OVER_CURRENT : recover \r\n");
  435. }
  436. }
  437. }
  438. //=====================================
  439. // Over temperature detection
  440. //=====================================
  441. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_TEMPERATURE))
  442. {
  443. if(Alarm_Counter[gun_index].OT_AMB > FILTER_SPEC)
  444. {
  445. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP == OFF))
  446. {
  447. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP = ON;
  448. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_TEMPERATURE;
  449. DEBUG_INFO("ALARM_OVER_TEMPERATURE : alarm \r\n");
  450. }
  451. }
  452. else
  453. {
  454. Alarm_Counter[gun_index].OT_AMB++;
  455. }
  456. }
  457. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_TEMPERATURE)))
  458. {
  459. Alarm_Counter[gun_index].OT_AMB = 0;
  460. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP == ON))
  461. {
  462. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP = OFF;
  463. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_TEMPERATURE;
  464. DEBUG_INFO("ALARM_OVER_TEMPERATURE : recover \r\n");
  465. }
  466. }
  467. //=====================================
  468. // Ground fault detection
  469. //=====================================
  470. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_GROUND_FAIL)
  471. {
  472. if(Alarm_Counter[gun_index].GMI > FILTER_SPEC)
  473. {
  474. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == OFF))
  475. {
  476. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = ON;
  477. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_GROUND_FAIL;
  478. DEBUG_INFO("ALARM_GROUND_FAIL : alarm \r\n");
  479. }
  480. }
  481. else
  482. {
  483. Alarm_Counter[gun_index].GMI++;
  484. }
  485. }
  486. else if (!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_GROUND_FAIL))
  487. {
  488. Alarm_Counter[gun_index].GMI = 0;
  489. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == ON ))
  490. {
  491. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = OFF;
  492. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_GROUND_FAIL;
  493. DEBUG_INFO("ALARM_GROUND_FAIL : recover \r\n");
  494. }
  495. }
  496. //=====================================
  497. // CP level fail detection
  498. //=====================================
  499. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CP_ERROR)
  500. {
  501. if(Alarm_Counter[gun_index].CP_LevelFail > FILTER_SPEC)
  502. {
  503. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault == OFF)
  504. {
  505. ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = ON;
  506. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CP_ERROR;
  507. DEBUG_INFO("ALARM_CP_ERROR : alarm \r\n");
  508. }
  509. }
  510. else
  511. {
  512. Alarm_Counter[gun_index].CP_LevelFail++;
  513. }
  514. }
  515. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CP_ERROR))
  516. {
  517. Alarm_Counter[gun_index].CP_LevelFail= 0;
  518. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault == ON)
  519. {
  520. ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = OFF;
  521. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CP_ERROR;
  522. DEBUG_INFO("ALARM_CP_ERROR : recover \r\n");
  523. }
  524. }
  525. //=====================================
  526. // Current AC/DC leak detection
  527. //=====================================
  528. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC) ||
  529. (ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC))
  530. {
  531. if(Alarm_Counter[gun_index].Leakage > FILTER_SPEC)
  532. {
  533. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip == OFF))
  534. {
  535. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = ON;
  536. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC)
  537. {
  538. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CURRENT_LEAK_AC;
  539. ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage = ON;
  540. DEBUG_INFO("ALARM_CURRENT_LEAK_AC : alarm \r\n");
  541. }
  542. else if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC)
  543. {
  544. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CURRENT_LEAK_DC;
  545. ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage = ON;
  546. DEBUG_INFO("ALARM_CURRENT_LEAK_DC : alarm \r\n");
  547. }
  548. }
  549. }
  550. else
  551. {
  552. Alarm_Counter[gun_index].Leakage++;
  553. }
  554. }
  555. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC)) ||
  556. (!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC)))
  557. {
  558. Alarm_Counter[gun_index].Leakage = 0;
  559. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip == ON))
  560. {
  561. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = OFF;
  562. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage == ON)
  563. {
  564. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CURRENT_LEAK_AC;
  565. ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage = OFF;
  566. DEBUG_INFO("ALARM_CURRENT_LEAK_AC : recover \r\n");
  567. }
  568. else if(ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage == ON)
  569. {
  570. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CURRENT_LEAK_DC;
  571. ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage = OFF;
  572. DEBUG_INFO("ALARM_CURRENT_LEAK_DC : recover \r\n");
  573. }
  574. }
  575. }
  576. //=====================================
  577. // MCU self test fail detection
  578. //=====================================
  579. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_MCU_TESTFAIL)
  580. {
  581. if(Alarm_Counter[gun_index].MCU_SelfTestFail > FILTER_SPEC)
  582. {
  583. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isMcuSelfTest == OFF)
  584. {
  585. ShmCharger->gun_info[gun_index].otherAlarmCode.isMcuSelfTest = ON;
  586. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_MCU_TESTFAIL;
  587. DEBUG_INFO("ALARM_MCU_TESTFAIL : alarm \r\n");
  588. }
  589. }
  590. else
  591. {
  592. Alarm_Counter[gun_index].MCU_SelfTestFail++;
  593. }
  594. }
  595. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_MCU_TESTFAIL))
  596. {
  597. Alarm_Counter[gun_index].MCU_SelfTestFail = 0;
  598. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isMcuSelfTest == ON)
  599. {
  600. ShmCharger->gun_info[gun_index].otherAlarmCode.isMcuSelfTest = OFF;
  601. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_MCU_TESTFAIL;
  602. DEBUG_INFO("ALARM_MCU_TESTFAIL : recover \r\n");
  603. }
  604. }
  605. //=====================================
  606. // Hand shaking timeout detection
  607. //=====================================
  608. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_HANDSHAKE_TIMEOUT)
  609. {
  610. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut == OFF)
  611. {
  612. ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut = ON;
  613. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_HANDSHAKE_TIMEOUT;
  614. DEBUG_INFO("ALARM_HANDSHAKE_TIMEOUT : alarm \r\n");
  615. }
  616. }
  617. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_HANDSHAKE_TIMEOUT))
  618. {
  619. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut == ON)
  620. {
  621. ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut = OFF;
  622. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_HANDSHAKE_TIMEOUT;
  623. DEBUG_INFO("ALARM_HANDSHAKE_TIMEOUT : recover \r\n");
  624. }
  625. }
  626. //=====================================
  627. // Emergency stop detection
  628. //=====================================
  629. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_EMERGENCY_STOP)
  630. {
  631. if(Alarm_Counter[gun_index].EmrgencyBTN > FILTER_SPEC)
  632. {
  633. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == OFF))
  634. {
  635. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = ON;
  636. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_EMERGENCY_STOP;
  637. DEBUG_INFO("ALARM_EMERGENCY_STOP : alarm \r\n");
  638. }
  639. }
  640. else
  641. {
  642. Alarm_Counter[gun_index].EmrgencyBTN++;
  643. }
  644. }
  645. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_EMERGENCY_STOP))
  646. {
  647. Alarm_Counter[gun_index].EmrgencyBTN = 0;
  648. if((ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == ON))
  649. {
  650. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = OFF;
  651. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_EMERGENCY_STOP;
  652. DEBUG_INFO("ALARM_EMERGENCY_STOP : recover \r\n");
  653. }
  654. }
  655. //=====================================
  656. // Relay welding detection
  657. //=====================================
  658. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_WELDING)
  659. {
  660. if(Alarm_Counter[gun_index].Relay_Welding > FILTER_SPEC)
  661. {
  662. if((ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding == OFF))
  663. {
  664. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = ON;
  665. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_RELAY_WELDING;
  666. DEBUG_INFO("ALARM_RELAY_STATUS : alarm \r\n");
  667. }
  668. }
  669. else
  670. {
  671. Alarm_Counter[gun_index].Relay_Welding++;
  672. }
  673. }
  674. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_WELDING))
  675. {
  676. Alarm_Counter[gun_index].Relay_Welding = 0;
  677. if((ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding == ON))
  678. {
  679. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = OFF;
  680. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_RELAY_WELDING;
  681. DEBUG_INFO("ALARM_RELAY_STATUS : recover \r\n");
  682. }
  683. }
  684. //=====================================
  685. // Relay driving fault detection
  686. //=====================================
  687. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_DRIVE_FAULT)
  688. {
  689. if(Alarm_Counter[gun_index].Relay_DrivingFault > FILTER_SPEC)
  690. {
  691. if((ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault == OFF))
  692. {
  693. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault = ON;
  694. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_RELAY_DRIVE_FAULT;
  695. DEBUG_INFO("ALARM_RELAY_DRIVE_FAULT : alarm \r\n");
  696. }
  697. }
  698. else
  699. {
  700. Alarm_Counter[gun_index].Relay_DrivingFault++;
  701. }
  702. }
  703. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_DRIVE_FAULT))
  704. {
  705. Alarm_Counter[gun_index].Relay_DrivingFault = 0;
  706. if((ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault == ON))
  707. {
  708. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault = OFF;
  709. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_RELAY_DRIVE_FAULT;
  710. DEBUG_INFO("ALARM_RELAY_DRIVE_FAULT : recover \r\n");
  711. }
  712. }
  713. //=====================================
  714. // Current short detection
  715. //=====================================
  716. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_SHORT)
  717. {
  718. if(Alarm_Counter[gun_index].Short > FILTER_SPEC)
  719. {
  720. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isCurrentShort == OFF)
  721. {
  722. ShmCharger->gun_info[gun_index].otherAlarmCode.isCurrentShort = ON;
  723. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CURRENT_SHORT;
  724. DEBUG_INFO("ALARM_CIRCUIT_SHORT : alarm \r\n");
  725. }
  726. }
  727. else
  728. {
  729. Alarm_Counter[gun_index].Short++;
  730. }
  731. }
  732. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_SHORT))
  733. {
  734. Alarm_Counter[gun_index].Short = 0;
  735. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isCurrentShort == ON)
  736. {
  737. ShmCharger->gun_info[gun_index].otherAlarmCode.isCurrentShort = OFF;
  738. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CURRENT_SHORT;
  739. DEBUG_INFO("ALARM_CIRCUIT_SHORT : recover \r\n");
  740. }
  741. }
  742. //=====================================
  743. // Rotatory switch detection
  744. //=====================================
  745. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_ROTATORY_SWITCH_FAULT)
  746. {
  747. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isRotatorySwitch == OFF)
  748. {
  749. ShmCharger->gun_info[gun_index].otherAlarmCode.isRotatorySwitch = ON;
  750. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_ROTATORY_SWITCH_FAULT;
  751. DEBUG_INFO("ALARM_ROTATORY_SWITCH_FAULT : alarm \r\n");
  752. }
  753. }
  754. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_ROTATORY_SWITCH_FAULT))
  755. {
  756. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isRotatorySwitch == ON)
  757. {
  758. ShmCharger->gun_info[gun_index].otherAlarmCode.isRotatorySwitch = OFF;
  759. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_ROTATORY_SWITCH_FAULT;
  760. DEBUG_INFO("ALARM_ROTATORY_SWITCH_FAULT : recover \r\n");
  761. }
  762. }
  763. //=====================================
  764. // Leakage module detection
  765. //=====================================
  766. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LEAK_MODULE_FAIL)
  767. {
  768. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isLeakageModule == OFF)
  769. {
  770. ShmCharger->gun_info[gun_index].otherAlarmCode.isLeakageModule = ON;
  771. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_LEAK_MODULE_FAIL;
  772. DEBUG_INFO("ALARM_LEAK_MODULE_FAIL : alarm \r\n");
  773. }
  774. }
  775. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LEAK_MODULE_FAIL))
  776. {
  777. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isLeakageModule == ON)
  778. {
  779. ShmCharger->gun_info[gun_index].otherAlarmCode.isLeakageModule = OFF;
  780. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_LEAK_MODULE_FAIL;
  781. DEBUG_INFO("ALARM_LEAK_MODULE_FAIL : recover \r\n");
  782. }
  783. }
  784. //=====================================
  785. // Shutter detection
  786. //=====================================
  787. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_SHUTTER_FAULT)
  788. {
  789. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isShutterFail == OFF)
  790. {
  791. ShmCharger->gun_info[gun_index].otherAlarmCode.isShutterFail = ON;
  792. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_SHUTTER_FAULT;
  793. DEBUG_INFO("ALARM_SHUTTER_FAULT : alarm \r\n");
  794. }
  795. }
  796. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_SHUTTER_FAULT))
  797. {
  798. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isShutterFail == ON)
  799. {
  800. ShmCharger->gun_info[gun_index].otherAlarmCode.isShutterFail = OFF;
  801. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_SHUTTER_FAULT;
  802. DEBUG_INFO("ALARM_SHUTTER_FAULT : recover \r\n");
  803. }
  804. }
  805. //=====================================
  806. // Locker detection
  807. //=====================================
  808. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LOCKER_FAULT)
  809. {
  810. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isLockerFault == OFF)
  811. {
  812. ShmCharger->gun_info[gun_index].otherAlarmCode.isLockerFault = ON;
  813. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_LOCKER_FAULT;
  814. DEBUG_INFO("ALARM_LOCKER_FAULT : alarm \r\n");
  815. }
  816. }
  817. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LOCKER_FAULT))
  818. {
  819. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isLockerFault== ON)
  820. {
  821. ShmCharger->gun_info[gun_index].otherAlarmCode.isLockerFault = OFF;
  822. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_LOCKER_FAULT;
  823. DEBUG_INFO("ALARM_LOCKER_FAULT : recover \r\n");
  824. }
  825. }
  826. //=====================================
  827. // Power drop detection
  828. //=====================================
  829. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_POWER_DROP)
  830. {
  831. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isPowerDrop == OFF)
  832. {
  833. ShmCharger->gun_info[gun_index].otherAlarmCode.isPowerDrop = ON;
  834. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_POWER_DROP;
  835. DEBUG_INFO("ALARM_POWER_DROP : alarm \r\n");
  836. }
  837. }
  838. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_POWER_DROP))
  839. {
  840. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isPowerDrop == ON)
  841. {
  842. ShmCharger->gun_info[gun_index].otherAlarmCode.isPowerDrop = OFF;
  843. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_POWER_DROP;
  844. DEBUG_INFO("ALARM_POWER_DROP : recover \r\n");
  845. }
  846. }
  847. //=====================================
  848. // OCPP error code message
  849. //=====================================
  850. if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_OVER_VOLTAGE)
  851. {
  852. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OverVoltage");
  853. }
  854. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_UNDER_VOLTAGE)
  855. {
  856. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "UnderVoltage");
  857. }
  858. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_OVER_CURRENT)
  859. {
  860. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OverCurrentFailure");
  861. }
  862. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_OVER_TEMPERATURE)
  863. {
  864. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "HighTemperature");
  865. }
  866. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_GROUND_FAIL)
  867. {
  868. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "GroundFailure");
  869. }
  870. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CP_ERROR)
  871. {
  872. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  873. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "CpError");
  874. }
  875. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_AC)
  876. {
  877. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  878. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "ACLeakage");
  879. }
  880. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_DC)
  881. {
  882. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  883. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "DCLeakage");
  884. }
  885. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_MCU_TESTFAIL)
  886. {
  887. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  888. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "McuTestFail");
  889. }
  890. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_HANDSHAKE_TIMEOUT)
  891. {
  892. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  893. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "HandshakeTimeout");
  894. }
  895. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_EMERGENCY_STOP)
  896. {
  897. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  898. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "EmergencyStop");
  899. }
  900. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_WELDING)
  901. {
  902. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  903. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "RelayWelding");
  904. }
  905. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LEAK_MODULE_FAIL)
  906. {
  907. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  908. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "LeakageModuleFail");
  909. }
  910. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_SHUTTER_FAULT)
  911. {
  912. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  913. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "ShutterFault");
  914. }
  915. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LOCKER_FAULT)
  916. {
  917. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "ConnectorLockFailure");
  918. }
  919. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_POWER_DROP)
  920. {
  921. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  922. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "PowerDrop");
  923. }
  924. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_SHORT)
  925. {
  926. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  927. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "CircuitShort");
  928. }
  929. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_ROTATORY_SWITCH_FAULT)
  930. {
  931. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  932. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "RotatorySwitchFault");
  933. }
  934. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_DRIVE_FAULT)
  935. {
  936. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  937. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "RelayDriveFault");
  938. }
  939. else
  940. {
  941. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "NoError");
  942. memset(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode, 0x00, ARRAY_SIZE(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode));
  943. }
  944. //=====================================
  945. // Latch alarm recover in state A
  946. //=====================================
  947. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 1))
  948. {
  949. /*
  950. TODO: Recover latch alarm here
  951. */
  952. }
  953. //=====================================
  954. // Latch alarm recover in state B1 and B2
  955. //=====================================
  956. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 2) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 3))
  957. {
  958. /*
  959. TODO: Recover latch alarm here
  960. */
  961. }
  962. //=====================================
  963. // Latch alarm recover in state C
  964. //=====================================
  965. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 4))
  966. {
  967. /*
  968. TODO: Recover latch alarm here
  969. */
  970. }
  971. }
  972. usleep(100000);
  973. }
  974. return FAIL;
  975. }