Module_AlarmDetect.c 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637
  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>
  19. #include <fcntl.h>
  20. #include <termios.h>
  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 2
  29. #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
  30. #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
  31. #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __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[3];
  49. unsigned short int OT_AMB;
  50. unsigned short int GMI;
  51. unsigned short int Short[3];
  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 OCPP20Data *ShmOCPP20Data;
  66. struct Charger *ShmCharger;
  67. int StoreLogMsg(const char *fmt, ...)
  68. {
  69. char Buf[4096+256];
  70. char buffer[4096];
  71. time_t CurrentTime;
  72. struct tm *tm;
  73. struct timeval tv;
  74. va_list args;
  75. va_start(args, fmt);
  76. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  77. va_end(args);
  78. memset(Buf,0,sizeof(Buf));
  79. CurrentTime = time(NULL);
  80. tm=localtime(&CurrentTime);
  81. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  82. if((ShmSysConfigAndInfo->SysConfig.ModelName != NULL) && (ShmSysConfigAndInfo->SysConfig.SerialNumber != NULL) && (strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) >= 14))
  83. {
  84. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/SystemLog/[%04d.%02d]%s_%s_SystemLog",
  85. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  86. buffer,
  87. tm->tm_year+1900,tm->tm_mon+1,
  88. ShmSysConfigAndInfo->SysConfig.ModelName,
  89. ShmSysConfigAndInfo->SysConfig.SerialNumber);
  90. }
  91. else
  92. {
  93. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  94. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  95. buffer,
  96. tm->tm_year+1900,tm->tm_mon+1);
  97. }
  98. #ifdef SystemLogMessage
  99. system(Buf);
  100. #endif
  101. #ifdef ConsloePrintLog
  102. 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);
  103. #endif
  104. return rc;
  105. }
  106. int DiffTimeb(struct timeb ST, struct timeb ET)
  107. {
  108. //return milli-second
  109. unsigned int StartTime,StopTime;
  110. StartTime=(unsigned int)ST.time;
  111. StopTime=(unsigned int)ET.time;
  112. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  113. }
  114. //==========================================
  115. // Init all share memory
  116. //==========================================
  117. int InitShareMemory()
  118. {
  119. int result = PASS;
  120. int MeterSMId;
  121. //creat ShmSysConfigAndInfo
  122. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  123. {
  124. #ifdef SystemLogMessage
  125. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  126. #endif
  127. result = FAIL;
  128. }
  129. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  130. {
  131. #ifdef SystemLogMessage
  132. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  133. #endif
  134. result = FAIL;
  135. }
  136. else
  137. {}
  138. //creat ShmStatusCodeData
  139. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  140. {
  141. #ifdef SystemLogMessage
  142. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  143. #endif
  144. result = FAIL;
  145. }
  146. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  147. {
  148. #ifdef SystemLogMessage
  149. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  150. #endif
  151. result = FAIL;
  152. }
  153. else
  154. {}
  155. //creat ShmStatusCodeData
  156. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  157. {
  158. DEBUG_ERROR("shmget ShmCharger NG\n");
  159. result = FAIL;
  160. }
  161. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  162. {
  163. DEBUG_ERROR("shmat ShmCharger NG\n");
  164. result = FAIL;
  165. }
  166. else
  167. {}
  168. //creat ShmOCPP16Data
  169. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  170. {
  171. DEBUG_ERROR("shmget ShmOCPP16Data NG\n");
  172. result = FAIL;
  173. }
  174. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  175. {
  176. DEBUG_ERROR("shmat ShmOCPP16Data NG\n");
  177. result = FAIL;
  178. }
  179. else
  180. {}
  181. //creat ShmOCPP20Data
  182. if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), 0777)) < 0)
  183. {
  184. DEBUG_ERROR("shmget ShmOCPP20Data NG\n");
  185. result = FAIL;
  186. }
  187. else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  188. {
  189. DEBUG_ERROR("shmat ShmOCPP20Data NG\n");
  190. result = FAIL;
  191. }
  192. else
  193. {}
  194. return result;
  195. }
  196. //==========================================
  197. // Common routine
  198. //==========================================
  199. void trim(char *s)
  200. {
  201. int i=0, j, k, l=0;
  202. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  203. i++;
  204. j = strlen(s)-1;
  205. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  206. j--;
  207. if(i==0 && j==strlen(s)-1) { }
  208. else if(i==0) s[j+1] = '\0';
  209. else {
  210. for(k=i; k<=j; k++) s[l++] = s[k];
  211. s[l] = '\0';
  212. }
  213. }
  214. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  215. {
  216. strncpy(dest, src + start, cnt);
  217. dest[cnt] = 0;
  218. }
  219. void getNowDatetime(uint8_t *data)
  220. {
  221. time_t t = time(NULL);
  222. struct tm tm = *localtime(&t);
  223. sprintf((char*)data, "%04d-%02d-%02dT%02d:%02d:%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  224. }
  225. //==========================================
  226. // Main process
  227. //==========================================
  228. int main(void)
  229. {
  230. if(InitShareMemory() == FAIL)
  231. {
  232. DEBUG_ERROR("InitShareMemory NG\n");
  233. if(ShmStatusCodeData!=NULL)
  234. {
  235. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  236. }
  237. sleep(5);
  238. return FAIL;
  239. }
  240. for(;;)
  241. {
  242. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  243. {
  244. //=====================================
  245. // Over voltage detection
  246. //=====================================
  247. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_OVER_VOLTAGE)
  248. {
  249. if(Alarm_Counter[gun_index].OV[0] > FILTER_SPEC)
  250. {
  251. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == OFF)
  252. {
  253. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = ON;
  254. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L1_OVER_VOLTAGE;
  255. DEBUG_INFO("ALARM_L1_OVER_VOLTAGE : alarm \n");
  256. }
  257. }
  258. else
  259. {
  260. Alarm_Counter[gun_index].OV[0]++;
  261. }
  262. }
  263. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_OVER_VOLTAGE)))
  264. {
  265. Alarm_Counter[gun_index].OV[0] = 0;
  266. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == ON)
  267. {
  268. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = OFF;
  269. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L1_OVER_VOLTAGE;
  270. DEBUG_INFO("ALARM_L1_OVER_VOLTAGE : recover \n");
  271. }
  272. }
  273. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  274. {
  275. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_OVER_VOLTAGE)
  276. {
  277. if(Alarm_Counter[gun_index].OV[1] > FILTER_SPEC)
  278. {
  279. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == OFF)
  280. {
  281. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = ON;
  282. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L2_OVER_VOLTAGE;
  283. DEBUG_INFO("ALARM_L2_OVER_VOLTAGE : alarm \n");
  284. }
  285. }
  286. else
  287. {
  288. Alarm_Counter[gun_index].OV[1]++;
  289. }
  290. }
  291. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_OVER_VOLTAGE)))
  292. {
  293. Alarm_Counter[gun_index].OV[1] = 0;
  294. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == ON)
  295. {
  296. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = OFF;
  297. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L2_OVER_VOLTAGE;
  298. DEBUG_INFO("ALARM_L2_OVER_VOLTAGE : recover \n");
  299. }
  300. }
  301. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_OVER_VOLTAGE)
  302. {
  303. if(Alarm_Counter[gun_index].OV[2] > FILTER_SPEC)
  304. {
  305. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == OFF)
  306. {
  307. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = ON;
  308. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L3_OVER_VOLTAGE;
  309. DEBUG_INFO("ALARM_L3_OVER_VOLTAGE : alarm \n");
  310. }
  311. }
  312. else
  313. {
  314. Alarm_Counter[gun_index].OV[2]++;
  315. }
  316. }
  317. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_OVER_VOLTAGE)))
  318. {
  319. Alarm_Counter[gun_index].OV[2] = 0;
  320. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == ON)
  321. {
  322. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = OFF;
  323. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L3_OVER_VOLTAGE;
  324. DEBUG_INFO("ALARM_L3_OVER_VOLTAGE : recover \n");
  325. }
  326. }
  327. }
  328. //=====================================
  329. // Under voltage detection
  330. //=====================================
  331. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_UNDER_VOLTAGE)
  332. {
  333. if(Alarm_Counter[gun_index].UV[0] > FILTER_SPEC)
  334. {
  335. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == OFF)
  336. {
  337. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = ON;
  338. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L1_UNDER_VOLTAGE;
  339. DEBUG_INFO("ALARM_L1_UNDER_VOLTAGE : alarm \n");
  340. }
  341. }
  342. else
  343. {
  344. Alarm_Counter[gun_index].UV[0]++;
  345. }
  346. }
  347. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_UNDER_VOLTAGE)))
  348. {
  349. Alarm_Counter[gun_index].UV[0] = 0;
  350. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == ON)
  351. {
  352. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = OFF;
  353. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L1_UNDER_VOLTAGE;
  354. DEBUG_INFO("ALARM_L1_UNDER_VOLTAGE : recover \n");
  355. }
  356. }
  357. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  358. {
  359. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_UNDER_VOLTAGE)
  360. {
  361. if(Alarm_Counter[gun_index].UV[1] > FILTER_SPEC)
  362. {
  363. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == OFF)
  364. {
  365. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = ON;
  366. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L2_UNDER_VOLTAGE;
  367. DEBUG_INFO("ALARM_L2_UNDER_VOLTAGE : alarm \n");
  368. }
  369. }
  370. else
  371. {
  372. Alarm_Counter[gun_index].UV[1]++;
  373. }
  374. }
  375. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_UNDER_VOLTAGE)))
  376. {
  377. Alarm_Counter[gun_index].UV[1] = 0;
  378. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == ON)
  379. {
  380. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = OFF;
  381. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L2_UNDER_VOLTAGE;
  382. DEBUG_INFO("ALARM_L2_UNDER_VOLTAGE : recover \n");
  383. }
  384. }
  385. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_UNDER_VOLTAGE)
  386. {
  387. if(Alarm_Counter[gun_index].UV[2] > FILTER_SPEC)
  388. {
  389. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == OFF)
  390. {
  391. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = ON;
  392. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L3_UNDER_VOLTAGE;
  393. DEBUG_INFO("ALARM_L3_UNDER_VOLTAGE : alarm \n");
  394. }
  395. }
  396. else
  397. {
  398. Alarm_Counter[gun_index].UV[2]++;
  399. }
  400. }
  401. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_UNDER_VOLTAGE)))
  402. {
  403. Alarm_Counter[gun_index].UV[2] = 0;
  404. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == ON)
  405. {
  406. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = OFF;
  407. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L3_UNDER_VOLTAGE;
  408. DEBUG_INFO("ALARM_L3_UNDER_VOLTAGE : recover \n");
  409. }
  410. }
  411. }
  412. //=====================================
  413. // Over current detection
  414. //=====================================
  415. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_OVER_CURRENT)
  416. {
  417. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == OFF)
  418. {
  419. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = ON;
  420. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L1_OVER_CURRENT;
  421. DEBUG_INFO("ALARM_L1_OVER_CURRENT : alarm \n");
  422. }
  423. }
  424. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_OVER_CURRENT)))
  425. {
  426. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON)
  427. {
  428. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP = OFF;
  429. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L1_OVER_CURRENT;
  430. DEBUG_INFO("ALARM_L1_OVER_CURRENT : recover \n");
  431. }
  432. }
  433. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  434. {
  435. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_OVER_CURRENT)
  436. {
  437. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 == OFF)
  438. {
  439. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 = ON;
  440. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L2_OVER_CURRENT;
  441. DEBUG_INFO("ALARM_L2_OVER_CURRENT : alarm \n");
  442. }
  443. }
  444. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_OVER_CURRENT)))
  445. {
  446. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 == ON)
  447. {
  448. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 = OFF;
  449. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L2_OVER_CURRENT;
  450. DEBUG_INFO("ALARM_L2_OVER_CURRENT : recover \n");
  451. }
  452. }
  453. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_OVER_CURRENT)
  454. {
  455. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 == OFF)
  456. {
  457. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 = ON;
  458. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L3_OVER_CURRENT;
  459. DEBUG_INFO("ALARM_L3_OVER_CURRENT : alarm \n");
  460. }
  461. }
  462. else if ((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_OVER_CURRENT)))
  463. {
  464. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 == ON)
  465. {
  466. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 = OFF;
  467. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L3_OVER_CURRENT;
  468. DEBUG_INFO("ALARM_L3_OVER_CURRENT : recover \n");
  469. }
  470. }
  471. }
  472. //=====================================
  473. // Over temperature detection
  474. //=====================================
  475. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_TEMPERATURE)
  476. {
  477. if(Alarm_Counter[gun_index].OT_AMB > FILTER_SPEC)
  478. {
  479. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP == OFF)
  480. {
  481. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP = ON;
  482. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_OVER_TEMPERATURE;
  483. DEBUG_INFO("ALARM_OVER_TEMPERATURE : alarm \n");
  484. }
  485. }
  486. else
  487. {
  488. Alarm_Counter[gun_index].OT_AMB++;
  489. }
  490. }
  491. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_OVER_TEMPERATURE)))
  492. {
  493. Alarm_Counter[gun_index].OT_AMB = 0;
  494. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP == ON)
  495. {
  496. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAmbientOTP = OFF;
  497. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_OVER_TEMPERATURE;
  498. DEBUG_INFO("ALARM_OVER_TEMPERATURE : recover \n");
  499. }
  500. }
  501. //=====================================
  502. // Ground fault detection
  503. //=====================================
  504. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_GROUND_FAIL)
  505. {
  506. if(Alarm_Counter[gun_index].GMI > FILTER_SPEC)
  507. {
  508. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcGroundfaultFail == OFF)
  509. {
  510. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcGroundfaultFail = ON;
  511. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_GROUND_FAIL;
  512. DEBUG_INFO("ALARM_GROUND_FAIL : alarm \n");
  513. }
  514. }
  515. else
  516. {
  517. Alarm_Counter[gun_index].GMI++;
  518. }
  519. }
  520. else if (!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_GROUND_FAIL))
  521. {
  522. Alarm_Counter[gun_index].GMI = 0;
  523. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcGroundfaultFail == ON)
  524. {
  525. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcGroundfaultFail = OFF;
  526. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_GROUND_FAIL;
  527. DEBUG_INFO("ALARM_GROUND_FAIL : recover \n");
  528. }
  529. }
  530. //=====================================
  531. // CP level fail detection
  532. //=====================================
  533. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CP_ERROR)
  534. {
  535. if(Alarm_Counter[gun_index].CP_LevelFail > FILTER_SPEC)
  536. {
  537. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault == OFF)
  538. {
  539. ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = ON;
  540. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CP_ERROR;
  541. DEBUG_INFO("ALARM_CP_ERROR : alarm \n");
  542. }
  543. }
  544. else
  545. {
  546. Alarm_Counter[gun_index].CP_LevelFail++;
  547. }
  548. }
  549. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CP_ERROR))
  550. {
  551. Alarm_Counter[gun_index].CP_LevelFail= 0;
  552. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault == ON)
  553. {
  554. ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = OFF;
  555. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CP_ERROR;
  556. DEBUG_INFO("ALARM_CP_ERROR : recover \n");
  557. }
  558. }
  559. //=====================================
  560. // Current AC/DC leak detection
  561. //=====================================
  562. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC) ||
  563. (ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC))
  564. {
  565. if(Alarm_Counter[gun_index].Leakage > FILTER_SPEC)
  566. {
  567. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip == OFF)
  568. {
  569. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = ON;
  570. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC)
  571. {
  572. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CURRENT_LEAK_AC;
  573. ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage = ON;
  574. DEBUG_INFO("ALARM_CURRENT_LEAK_AC : alarm \n");
  575. }
  576. else if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC)
  577. {
  578. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_CURRENT_LEAK_DC;
  579. ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage = ON;
  580. DEBUG_INFO("ALARM_CURRENT_LEAK_DC : alarm \n");
  581. }
  582. }
  583. }
  584. else
  585. {
  586. Alarm_Counter[gun_index].Leakage++;
  587. }
  588. }
  589. else if((!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_AC)) ||
  590. (!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC)))
  591. {
  592. Alarm_Counter[gun_index].Leakage = 0;
  593. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip == ON)
  594. {
  595. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = OFF;
  596. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage == ON)
  597. {
  598. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CURRENT_LEAK_AC;
  599. ShmCharger->gun_info[gun_index].otherAlarmCode.isACLeakage = OFF;
  600. DEBUG_INFO("ALARM_CURRENT_LEAK_AC : recover \n");
  601. }
  602. else if(ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage == ON)
  603. {
  604. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_CURRENT_LEAK_DC;
  605. ShmCharger->gun_info[gun_index].otherAlarmCode.isDcLeakage = OFF;
  606. DEBUG_INFO("ALARM_CURRENT_LEAK_DC : recover \n");
  607. }
  608. }
  609. }
  610. //=====================================
  611. // MCU self test fail detection
  612. //=====================================
  613. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_MCU_TESTFAIL)
  614. {
  615. if(Alarm_Counter[gun_index].MCU_SelfTestFail > FILTER_SPEC)
  616. {
  617. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail == OFF)
  618. {
  619. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = ON;
  620. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_MCU_TESTFAIL;
  621. DEBUG_INFO("ALARM_MCU_TESTFAIL : alarm \n");
  622. }
  623. }
  624. else
  625. {
  626. Alarm_Counter[gun_index].MCU_SelfTestFail++;
  627. }
  628. }
  629. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_MCU_TESTFAIL))
  630. {
  631. Alarm_Counter[gun_index].MCU_SelfTestFail = 0;
  632. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail == ON)
  633. {
  634. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = OFF;
  635. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_MCU_TESTFAIL;
  636. DEBUG_INFO("ALARM_MCU_TESTFAIL : recover \n");
  637. }
  638. }
  639. //=====================================
  640. // Hand shaking timeout detection
  641. //=====================================
  642. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_HANDSHAKE_TIMEOUT)
  643. {
  644. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut == OFF)
  645. {
  646. ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut = ON;
  647. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_HANDSHAKE_TIMEOUT;
  648. DEBUG_INFO("ALARM_HANDSHAKE_TIMEOUT : alarm \n");
  649. }
  650. }
  651. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_HANDSHAKE_TIMEOUT))
  652. {
  653. if(ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut == ON)
  654. {
  655. ShmCharger->gun_info[gun_index].otherAlarmCode.isHandshakingTimeOut = OFF;
  656. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_HANDSHAKE_TIMEOUT;
  657. DEBUG_INFO("ALARM_HANDSHAKE_TIMEOUT : recover \n");
  658. }
  659. }
  660. //=====================================
  661. // Emergency stop detection
  662. //=====================================
  663. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_EMERGENCY_STOP)
  664. {
  665. if(Alarm_Counter[gun_index].EmrgencyBTN > FILTER_SPEC)
  666. {
  667. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == OFF)
  668. {
  669. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = ON;
  670. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_EMERGENCY_STOP;
  671. DEBUG_INFO("ALARM_EMERGENCY_STOP : alarm \n");
  672. }
  673. }
  674. else
  675. {
  676. Alarm_Counter[gun_index].EmrgencyBTN++;
  677. }
  678. }
  679. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_EMERGENCY_STOP))
  680. {
  681. Alarm_Counter[gun_index].EmrgencyBTN = 0;
  682. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == ON)
  683. {
  684. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = OFF;
  685. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_EMERGENCY_STOP;
  686. DEBUG_INFO("ALARM_EMERGENCY_STOP : recover \n");
  687. }
  688. }
  689. //=====================================
  690. // Relay welding detection
  691. //=====================================
  692. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_WELDING)
  693. {
  694. if(Alarm_Counter[gun_index].Relay_Welding > FILTER_SPEC)
  695. {
  696. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding == OFF)
  697. {
  698. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = ON;
  699. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_RELAY_WELDING;
  700. DEBUG_INFO("ALARM_RELAY_STATUS : alarm \n");
  701. }
  702. }
  703. else
  704. {
  705. Alarm_Counter[gun_index].Relay_Welding++;
  706. }
  707. }
  708. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_WELDING))
  709. {
  710. Alarm_Counter[gun_index].Relay_Welding = 0;
  711. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding == ON)
  712. {
  713. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = OFF;
  714. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_RELAY_WELDING;
  715. DEBUG_INFO("ALARM_RELAY_STATUS : recover \n");
  716. }
  717. }
  718. //=====================================
  719. // Relay driving fault detection
  720. //=====================================
  721. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_DRIVE_FAULT)
  722. {
  723. if(Alarm_Counter[gun_index].Relay_DrivingFault > FILTER_SPEC)
  724. {
  725. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault == OFF)
  726. {
  727. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault = ON;
  728. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_RELAY_DRIVE_FAULT;
  729. DEBUG_INFO("ALARM_RELAY_DRIVE_FAULT : alarm \n");
  730. }
  731. }
  732. else
  733. {
  734. Alarm_Counter[gun_index].Relay_DrivingFault++;
  735. }
  736. }
  737. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_RELAY_DRIVE_FAULT))
  738. {
  739. Alarm_Counter[gun_index].Relay_DrivingFault = 0;
  740. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault == ON)
  741. {
  742. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayDrivingFault = OFF;
  743. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_RELAY_DRIVE_FAULT;
  744. DEBUG_INFO("ALARM_RELAY_DRIVE_FAULT : recover \n");
  745. }
  746. }
  747. //=====================================
  748. // Current short detection
  749. //=====================================
  750. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_CIRCUIT_SHORT)
  751. {
  752. if(Alarm_Counter[gun_index].Short[0] > FILTER_SPEC)
  753. {
  754. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort == OFF)
  755. {
  756. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort = ON;
  757. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L1_CIRCUIT_SHORT;
  758. DEBUG_INFO("ALARM_L1_CIRCUIT_SHORT : alarm \n");
  759. }
  760. }
  761. else
  762. {
  763. Alarm_Counter[gun_index].Short[0]++;
  764. }
  765. }
  766. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L1_CIRCUIT_SHORT))
  767. {
  768. Alarm_Counter[gun_index].Short[0] = 0;
  769. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort == ON)
  770. {
  771. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort = OFF;
  772. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L1_CIRCUIT_SHORT;
  773. DEBUG_INFO("ALARM_L1_CIRCUIT_SHORT : recover \n");
  774. }
  775. }
  776. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  777. {
  778. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_CIRCUIT_SHORT)
  779. {
  780. if(Alarm_Counter[gun_index].Short[1] > FILTER_SPEC)
  781. {
  782. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 == OFF)
  783. {
  784. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 = ON;
  785. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L2_CIRCUIT_SHORT;
  786. DEBUG_INFO("ALARM_L2_CIRCUIT_SHORT : alarm \n");
  787. }
  788. }
  789. else
  790. {
  791. Alarm_Counter[gun_index].Short[1]++;
  792. }
  793. }
  794. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L2_CIRCUIT_SHORT))
  795. {
  796. Alarm_Counter[gun_index].Short[1] = 0;
  797. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 == ON)
  798. {
  799. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 = OFF;
  800. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L2_CIRCUIT_SHORT;
  801. DEBUG_INFO("ALARM_L2_CIRCUIT_SHORT : recover \n");
  802. }
  803. }
  804. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_CIRCUIT_SHORT)
  805. {
  806. if(Alarm_Counter[gun_index].Short[2] > FILTER_SPEC)
  807. {
  808. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 == OFF)
  809. {
  810. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 = ON;
  811. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_L3_CIRCUIT_SHORT;
  812. DEBUG_INFO("ALARM_L3_CIRCUIT_SHORT : alarm \n");
  813. }
  814. }
  815. else
  816. {
  817. Alarm_Counter[gun_index].Short[2]++;
  818. }
  819. }
  820. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_L3_CIRCUIT_SHORT))
  821. {
  822. Alarm_Counter[gun_index].Short[2] = 0;
  823. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 == ON)
  824. {
  825. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 = OFF;
  826. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_L3_CIRCUIT_SHORT;
  827. DEBUG_INFO("ALARM_L3_CIRCUIT_SHORT : recover \n");
  828. }
  829. }
  830. }
  831. //=====================================
  832. // Rotatory switch detection
  833. //=====================================
  834. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_ROTATORY_SWITCH_FAULT)
  835. {
  836. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.RotarySwitchFault == OFF)
  837. {
  838. ShmStatusCodeData->FaultCode.FaultEvents.bits.RotarySwitchFault = ON;
  839. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_ROTATORY_SWITCH_FAULT;
  840. DEBUG_INFO("ALARM_ROTATORY_SWITCH_FAULT : alarm \n");
  841. }
  842. }
  843. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_ROTATORY_SWITCH_FAULT))
  844. {
  845. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.RotarySwitchFault == ON)
  846. {
  847. ShmStatusCodeData->FaultCode.FaultEvents.bits.RotarySwitchFault = OFF;
  848. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_ROTATORY_SWITCH_FAULT;
  849. DEBUG_INFO("ALARM_ROTATORY_SWITCH_FAULT : recover \n");
  850. }
  851. }
  852. //=====================================
  853. // Leakage module detection
  854. //=====================================
  855. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LEAK_MODULE_FAIL)
  856. {
  857. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail == OFF)
  858. {
  859. ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = ON;
  860. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_LEAK_MODULE_FAIL;
  861. DEBUG_INFO("ALARM_LEAK_MODULE_FAIL : alarm \n");
  862. }
  863. }
  864. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LEAK_MODULE_FAIL))
  865. {
  866. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail == ON)
  867. {
  868. ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = OFF;
  869. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_LEAK_MODULE_FAIL;
  870. DEBUG_INFO("ALARM_LEAK_MODULE_FAIL : recover \n");
  871. }
  872. }
  873. //=====================================
  874. // Shutter detection
  875. //=====================================
  876. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_SHUTTER_FAULT)
  877. {
  878. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.ShutterFault == OFF)
  879. {
  880. ShmStatusCodeData->FaultCode.FaultEvents.bits.ShutterFault = ON;
  881. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_SHUTTER_FAULT;
  882. DEBUG_INFO("ALARM_SHUTTER_FAULT : alarm \n");
  883. }
  884. }
  885. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_SHUTTER_FAULT))
  886. {
  887. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.ShutterFault == ON)
  888. {
  889. ShmStatusCodeData->FaultCode.FaultEvents.bits.ShutterFault = OFF;
  890. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_SHUTTER_FAULT;
  891. DEBUG_INFO("ALARM_SHUTTER_FAULT : recover \n");
  892. }
  893. }
  894. //=====================================
  895. // Locker detection
  896. //=====================================
  897. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LOCKER_FAULT)
  898. {
  899. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcConnectorLockFail == OFF)
  900. {
  901. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcConnectorLockFail = ON;
  902. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_LOCKER_FAULT;
  903. DEBUG_INFO("ALARM_LOCKER_FAULT : alarm \n");
  904. }
  905. }
  906. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_LOCKER_FAULT))
  907. {
  908. if(ShmStatusCodeData->FaultCode.FaultEvents.bits.AcConnectorLockFail == ON)
  909. {
  910. ShmStatusCodeData->FaultCode.FaultEvents.bits.AcConnectorLockFail = OFF;
  911. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_LOCKER_FAULT;
  912. DEBUG_INFO("ALARM_LOCKER_FAULT : recover \n");
  913. }
  914. }
  915. //=====================================
  916. // Power drop detection
  917. //=====================================
  918. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_POWER_DROP)
  919. {
  920. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop == OFF)
  921. {
  922. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop = ON;
  923. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_POWER_DROP;
  924. DEBUG_INFO("ALARM_POWER_DROP : alarm \n");
  925. }
  926. }
  927. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_POWER_DROP))
  928. {
  929. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop == ON)
  930. {
  931. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop = OFF;
  932. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_POWER_DROP;
  933. DEBUG_INFO("ALARM_POWER_DROP : recover \n");
  934. }
  935. }
  936. //=====================================
  937. // Meter communication timeout detection
  938. //=====================================
  939. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_METER_TIMEOUT)
  940. {
  941. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout == OFF)
  942. {
  943. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = ON;
  944. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode |= ALARM_METER_TIMEOUT;
  945. DEBUG_INFO("ALARM_METER_TIMEOUT : alarm \n");
  946. }
  947. }
  948. else if(!(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_METER_TIMEOUT))
  949. {
  950. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout == ON)
  951. {
  952. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = OFF;
  953. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode &= ~ALARM_METER_TIMEOUT;
  954. DEBUG_INFO("ALARM_METER_TIMEOUT : recover \n");
  955. }
  956. }
  957. //=====================================
  958. // OCPP error code message
  959. //=====================================
  960. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  961. {
  962. if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_OVER_VOLTAGE) ||
  963. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_OVER_VOLTAGE) ||
  964. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_OVER_VOLTAGE))
  965. {
  966. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  967. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == ON)
  968. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012200");
  969. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == ON)
  970. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012201");
  971. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == ON)
  972. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012202");
  973. }
  974. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_UNDER_VOLTAGE) ||
  975. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_UNDER_VOLTAGE) ||
  976. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_UNDER_VOLTAGE))
  977. {
  978. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  979. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == ON)
  980. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012203");
  981. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == ON)
  982. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012204");
  983. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == ON)
  984. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012205");
  985. }
  986. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_OVER_CURRENT) ||
  987. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_OVER_CURRENT) ||
  988. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_OVER_CURRENT))
  989. {
  990. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  991. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON)
  992. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012216");
  993. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 == ON)
  994. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012299");
  995. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 == ON)
  996. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012300");
  997. }
  998. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_OVER_TEMPERATURE)
  999. {
  1000. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1001. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012223");
  1002. }
  1003. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_GROUND_FAIL)
  1004. {
  1005. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1006. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012256");
  1007. }
  1008. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CP_ERROR)
  1009. {
  1010. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1011. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "023703");
  1012. }
  1013. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_AC)
  1014. {
  1015. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1016. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012233");
  1017. }
  1018. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_DC)
  1019. {
  1020. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1021. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012233");
  1022. }
  1023. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_MCU_TESTFAIL)
  1024. {
  1025. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1026. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012257");
  1027. }
  1028. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_HANDSHAKE_TIMEOUT)
  1029. {
  1030. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1031. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "HandshakeTimeout");
  1032. }
  1033. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_EMERGENCY_STOP)
  1034. {
  1035. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1036. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012251");
  1037. }
  1038. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_WELDING)
  1039. {
  1040. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1041. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011009");
  1042. }
  1043. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LEAK_MODULE_FAIL)
  1044. {
  1045. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1046. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011004");
  1047. }
  1048. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_SHUTTER_FAULT)
  1049. {
  1050. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1051. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011034");
  1052. }
  1053. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LOCKER_FAULT)
  1054. {
  1055. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1056. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011027");
  1057. }
  1058. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_POWER_DROP)
  1059. {
  1060. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1061. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop == ON)
  1062. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012212");
  1063. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputDrop == ON)
  1064. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012213");
  1065. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputDrop == ON)
  1066. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012214");
  1067. }
  1068. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_CIRCUIT_SHORT) ||
  1069. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_CIRCUIT_SHORT) ||
  1070. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_CIRCUIT_SHORT))
  1071. {
  1072. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1073. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort == ON)
  1074. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012262");
  1075. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 == ON)
  1076. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012301");
  1077. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 == ON)
  1078. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012302");
  1079. }
  1080. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_ROTATORY_SWITCH_FAULT)
  1081. {
  1082. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1083. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011036");
  1084. }
  1085. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_DRIVE_FAULT)
  1086. {
  1087. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1088. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "011010");
  1089. }
  1090. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_METER_TIMEOUT)
  1091. {
  1092. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "OtherError");
  1093. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode , "012305");
  1094. }
  1095. else
  1096. {
  1097. sprintf((char*)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode , "NoError");
  1098. memset(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode, 0x00, ARRAY_SIZE(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode));
  1099. }
  1100. }
  1101. else if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  1102. {
  1103. if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_OVER_VOLTAGE) ||
  1104. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_OVER_VOLTAGE) ||
  1105. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_OVER_VOLTAGE))
  1106. {
  1107. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1108. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1109. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1110. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == ON)
  1111. {
  1112. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012200");
  1113. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L1 input OVP");
  1114. }
  1115. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == ON)
  1116. {
  1117. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012201");
  1118. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L2 input OVP");
  1119. }
  1120. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == ON)
  1121. {
  1122. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012202");
  1123. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L3 input OVP");
  1124. }
  1125. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1126. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Voltage");
  1127. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1128. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1129. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1130. }
  1131. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_UNDER_VOLTAGE) ||
  1132. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_UNDER_VOLTAGE) ||
  1133. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_UNDER_VOLTAGE))
  1134. {
  1135. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1136. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1137. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1138. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == ON)
  1139. {
  1140. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012203");
  1141. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L1 input UVP");
  1142. }
  1143. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == ON)
  1144. {
  1145. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012204");
  1146. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L2 input UVP");
  1147. }
  1148. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == ON)
  1149. {
  1150. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012205");
  1151. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L3 input UVP");
  1152. }
  1153. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1154. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Voltage");
  1155. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1156. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1157. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1158. }
  1159. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_OVER_CURRENT) ||
  1160. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_OVER_CURRENT) ||
  1161. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_OVER_CURRENT))
  1162. {
  1163. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1164. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1165. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1166. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCP == ON)
  1167. {
  1168. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012216");
  1169. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System AC output OCP L1");
  1170. }
  1171. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL2 == ON)
  1172. {
  1173. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012299");
  1174. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System AC output OCP L2");
  1175. }
  1176. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemAcOutputOCPL3 == ON)
  1177. {
  1178. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012300");
  1179. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System AC output OCP L3");
  1180. }
  1181. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1182. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Current");
  1183. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1184. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1185. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1186. }
  1187. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_OVER_TEMPERATURE)
  1188. {
  1189. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1190. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1191. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1192. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012223");
  1193. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System ambient/inlet OTP");
  1194. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1195. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Temperature");
  1196. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1197. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1198. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1199. }
  1200. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_GROUND_FAIL)
  1201. {
  1202. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1203. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1204. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1205. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012256");
  1206. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "AC Ground Fault");
  1207. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1208. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Ground(PE)");
  1209. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1210. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1211. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1212. }
  1213. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CP_ERROR)
  1214. {
  1215. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1216. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1217. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1218. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "023703");
  1219. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "pilot fault");
  1220. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1221. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Control pilot");
  1222. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1223. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1224. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1225. }
  1226. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_AC)
  1227. {
  1228. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1229. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1230. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1231. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012233");
  1232. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "RCD/CCID trip");
  1233. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1234. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "CCID");
  1235. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1236. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1237. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1238. }
  1239. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_CURRENT_LEAK_DC)
  1240. {
  1241. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1242. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1243. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1244. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012233");
  1245. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "RCD/CCID trip");
  1246. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1247. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "CCID");
  1248. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1249. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1250. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1251. }
  1252. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_MCU_TESTFAIL)
  1253. {
  1254. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1255. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1256. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1257. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012257");
  1258. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "MCU self-test Fault");
  1259. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1260. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "MCU");
  1261. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1262. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1263. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1264. }
  1265. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_HANDSHAKE_TIMEOUT)
  1266. {
  1267. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1268. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1269. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1270. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "HandshakeTimeout");
  1271. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "HandshakeTimeout");
  1272. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1273. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Operation");
  1274. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1275. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1276. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1277. }
  1278. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_EMERGENCY_STOP)
  1279. {
  1280. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1281. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1282. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1283. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012251");
  1284. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Emergency stop");
  1285. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1286. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Button");
  1287. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1288. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1289. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1290. }
  1291. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_WELDING)
  1292. {
  1293. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1294. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1295. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1296. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011009");
  1297. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "AC output relay welding");
  1298. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1299. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Relay");
  1300. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1301. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1302. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1303. }
  1304. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LEAK_MODULE_FAIL)
  1305. {
  1306. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1307. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1308. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1309. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011004");
  1310. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "RCD/CCID self-test fail");
  1311. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1312. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "CCID");
  1313. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1314. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1315. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1316. }
  1317. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_SHUTTER_FAULT)
  1318. {
  1319. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1320. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1321. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1322. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011034");
  1323. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Shutter fault");
  1324. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1325. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Shutter");
  1326. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1327. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1328. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1329. }
  1330. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_LOCKER_FAULT)
  1331. {
  1332. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1333. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1334. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1335. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011027");
  1336. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "AC connector lock fail");
  1337. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1338. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Locker");
  1339. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1340. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1341. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1342. }
  1343. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_POWER_DROP)
  1344. {
  1345. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1346. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1347. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1348. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop == ON)
  1349. {
  1350. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012212");
  1351. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L1 input drop");
  1352. }
  1353. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputDrop == ON)
  1354. {
  1355. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012213");
  1356. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L2 input drop");
  1357. }
  1358. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputDrop == ON)
  1359. {
  1360. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012214");
  1361. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "System L3 input drop");
  1362. }
  1363. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1364. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Voltage");
  1365. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1366. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1367. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1368. }
  1369. else if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L1_CIRCUIT_SHORT) ||
  1370. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L2_CIRCUIT_SHORT) ||
  1371. (ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_L3_CIRCUIT_SHORT))
  1372. {
  1373. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1374. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1375. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1376. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShort == ON)
  1377. {
  1378. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012262");
  1379. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Circuit Short L1");
  1380. }
  1381. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL2 == ON)
  1382. {
  1383. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012301");
  1384. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Circuit Short L2");
  1385. }
  1386. else if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CircuitShortL3 == ON)
  1387. {
  1388. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012302");
  1389. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Circuit Short L3");
  1390. }
  1391. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1392. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Current");
  1393. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1394. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1395. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1396. }
  1397. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_ROTATORY_SWITCH_FAULT)
  1398. {
  1399. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1400. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1401. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1402. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011036");
  1403. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Rotary switch fault");
  1404. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1405. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Rotary switch");
  1406. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1407. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1408. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1409. }
  1410. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_RELAY_DRIVE_FAULT)
  1411. {
  1412. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1413. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1414. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1415. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "011010");
  1416. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "AC output relay driving fault");
  1417. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1418. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Relay");
  1419. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1420. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1421. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1422. }
  1423. else if(ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode & ALARM_METER_TIMEOUT)
  1424. {
  1425. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[0].timestamp);
  1426. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].trigger, "Alerting");
  1427. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].actualValue, "true");
  1428. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techcode, "012305");
  1429. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].techInfo, "Meter communication timeout");
  1430. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].eventNotificationType, "HardWiredNotification");
  1431. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].component.name, "Meter");
  1432. ShmOCPP20Data->NotifyEvent.eventData[0].component.evse.connectorId = (gun_index+1);
  1433. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[0].variable.name, "Problem");
  1434. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  1435. }
  1436. else
  1437. {}
  1438. }
  1439. //=====================================
  1440. // Latch alarm recover in state A
  1441. //=====================================
  1442. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 1))
  1443. {
  1444. /*
  1445. TODO: Recover latch alarm here
  1446. */
  1447. }
  1448. //=====================================
  1449. // Latch alarm recover in state B1 and B2
  1450. //=====================================
  1451. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 2) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 3))
  1452. {
  1453. /*
  1454. TODO: Recover latch alarm here
  1455. */
  1456. }
  1457. //=====================================
  1458. // Latch alarm recover in state C
  1459. //=====================================
  1460. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == 4))
  1461. {
  1462. /*
  1463. TODO: Recover latch alarm here
  1464. */
  1465. }
  1466. ShmCharger->gun_info[gun_index].acCcsInfo.CSUAlarmStatusCode = ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode;
  1467. }
  1468. usleep(100000);
  1469. }
  1470. return FAIL;
  1471. }