12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186 |
- #include "define.h"
- #include "main.h"
- //==========================
- // System basic sample constant
- //==========================
- #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
- #define PASS 1
- #define FAIL -1
- #define YES 1
- #define NO 0
- #define ON 1
- #define OFF 0
- #define BUFFER_SIZE 128
- //==========================
- // Timer interval
- //==========================
- #define TMR_IDX_HANDSHAKING 0
- #define TMR_IDX_AUTH 1
- #define TMR_IDX_2 2
- #define TMR_IDX_3 3
- #define TMR_IDX_4 4
- #define TMR_IDX_5 5
- #define TMR_IDX_6 6
- #define TMR_IDX_7 7
- #define TMR_IDX_8 8
- #define TMR_IDX_9 9
- #define TIMEOUT_SPEC_HANDSHAKING 180000
- #define TIMEOUT_SPEC_AUTH 30000
- #define TIMEOUT_SPEC_HANDSHAKING_LED 185000
- #define MtdBlockSize 0x600000
- //==========================
- // Declare method
- //==========================
- void trim(char *s);
- int mystrcmp(char *p1,char *p2);
- void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
- void split(char **arr, char *str, const char *del);
- int isReachableInternet();
- int InitRfidPort(void);
- int GetAlarmValue(void);
- int GetInfoValue(void);
- int GetFaultValue(void);
- int GetCardSerialNumber();
- void setLedMotion(unsigned char gun_index,unsigned char led_mode);
- void setRelay(unsigned char gun_index,unsigned char isOn);
- void setSpeaker(unsigned char isOn, unsigned char speaker_mode);
- //==========================
- // Declare RFID module type
- //==========================
- #define MODULE_EWT 0
- int rfidFd = -1;
- char* rfidPortName = "/dev/ttyS2";
- RFID rfid;
- char *valid_Internet[2] = {"8.8.8.8", "180.76.76.76"};
- //==========================
- // Declare share memory
- //==========================
- struct SysConfigAndInfo *ShmSysConfigAndInfo;
- struct StatusCodeData *ShmStatusCodeData;
- struct PsuData *ShmPsuData;
- struct CHAdeMOData *ShmCHAdeMOData;
- struct CcsData *ShmCcsData;
- struct PrimaryMcuData *ShmPrimaryMcuData;
- struct FanModuleData *ShmFanModuleData;
- struct RelayModuleData *ShmRelayModuleData;
- struct OCPP16Data *ShmOCPP16Data;
- struct Charger *ShmCharger;
- struct timeb startTime[AC_QUANTITY][10];
- struct timeb startChargingTime[AC_QUANTITY];
- struct timeb endChargingTime[AC_QUANTITY];
- //=================================
- // Common routine
- //=================================
- void trim(char *s)
- {
- int i=0, j, k, l=0;
- while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
- i++;
- j = strlen(s)-1;
- while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
- j--;
- if(i==0 && j==strlen(s)-1) { }
- else if(i==0) s[j+1] = '\0';
- else {
- for(k=i; k<=j; k++) s[l++] = s[k];
- s[l] = '\0';
- }
- }
- int mystrcmp(char *p1,char *p2)
- {
- while(*p1==*p2)
- {
- if(*p1=='\0' || *p2=='\0')
- break;
- p1++;
- p2++;
- }
- if(*p1=='\0' && *p2=='\0')
- return(PASS);
- else
- return(FAIL);
- }
- void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
- {
- strncpy(dest, src + start, cnt);
- dest[cnt] = 0;
- }
- void split(char **arr, char *str, const char *del)
- {
- char *s = strtok(str, del);
- while(s != NULL)
- {
- *arr++ = s;
- s = strtok(NULL, del);
- }
- }
- int StoreLogMsg(const char *fmt, ...)
- {
- char Buf[4096+256];
- char buffer[4096];
- time_t CurrentTime;
- struct tm *tm;
- va_list args;
- va_start(args, fmt);
- int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
- va_end(args);
- memset(Buf,0,sizeof(Buf));
- CurrentTime = time(NULL);
- tm=localtime(&CurrentTime);
- sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
- tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
- buffer,
- tm->tm_year+1900,tm->tm_mon+1);
- #ifdef SystemLogMessage
- system(Buf);
- #endif
- 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);
- return rc;
- }
- int DiffTimebWithNow(struct timeb ST)
- {
- //return milli-second
- struct timeb ET;
- unsigned int StartTime,StopTime;
- ftime(&ET);
- StartTime=(unsigned int)ST.time;
- StopTime=(unsigned int)ET.time;
- return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
- }
- int DiffTimeb(struct timeb ST, struct timeb ET)
- {
- //return milli-second
- unsigned int StartTime,StopTime;
- StartTime=(unsigned int)ST.time;
- StopTime=(unsigned int)ET.time;
- return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
- }
- //======================================================
- // Check interface status
- //======================================================
- int isInterfaceUp(const char *interface)
- {
- int result = FAIL;
- FILE *fp;
- char cmd[256];
- char buf[512];
- strcpy(cmd, "ifconfig");;
- fp = popen(cmd, "r");
- if(fp != NULL)
- {
- while(fgets(buf, sizeof(buf), fp) != NULL)
- {
- if(strstr(buf, interface) > 0)
- {
- result = PASS;
- }
- }
- }
- pclose(fp);
- return result;
- }
- //======================================================
- // Create all share memory
- //======================================================
- int CreatShareMemory()
- {
- int result = PASS;
- int MeterSMId;
- //creat ShmSysConfigAndInfo
- if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\r\n");
- result = FAIL;
- }
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\r\n");
- result = FAIL;
- }
- memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
- //creat ShmStatusCodeData
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmStatusCodeData NG\r\n");
- result = FAIL;
- }
- else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmStatusCodeData NG\r\n");
- result = FAIL;
- }
- memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
- //creat ShmPsuData
- if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmPsuData NG\r\n");
- result = FAIL;
- }
- else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmPsuData NG\r\n");
- result = FAIL;
- }
- memset(ShmPsuData,0,sizeof(struct PsuData));
- //creat ShmCHAdeMOData
- if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmCHAdeMOData NG1\r\n");
- result = FAIL;
- }
- else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmCHAdeMOData NG2\r\n");
- result = FAIL;
- }
- memset(ShmCHAdeMOData,0,sizeof(struct CHAdeMOData));
- //creat ShmCcsData
- if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmCcsData NG\r\n");
- result = FAIL;
- }
- else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmCcsData NG\r\n");
- result = FAIL;
- }
- memset(ShmCcsData,0,sizeof(struct CcsData));
- //creat ShmPrimaryMcuData
- if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmPrimaryMcuData NG\r\n");
- result = FAIL;
- }
- else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmPrimaryMcuData NG\r\n");
- result = FAIL;
- }
- memset(ShmPrimaryMcuData,0,sizeof(struct PrimaryMcuData));
- /*
- //creat ShmFanModuleData
- if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmFanModuleData NG\r\n");
- result = FAIL;
- }
- else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmFanModuleData NG\r\n");
- result = FAIL;
- }
- memset(ShmFanModuleData,0,sizeof(struct FanModuleData));
- //creat ShmRelayModuleData
- if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmRelayModuleData NG\r\n");
- result = FAIL;
- }
- else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmRelayModuleData NG\r\n");
- result = FAIL;
- }
- memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));*/
- //creat ShmOCPP16Data
- if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmOCPP16Data NG\r\n");
- result = FAIL;
- }
- else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmOCPP16Data NG\r\n");
- result = FAIL;
- }
- memset(ShmOCPP16Data,0,sizeof(struct OCPP16Data));
- //creat ShmCharger
- if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmCharger NG\r\n");
- result = FAIL;
- }
- else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmCharger NG\r\n");
- result = FAIL;
- }
- memset(ShmCharger,0,sizeof(struct Charger));
- return result;
- }
- //======================================================
- // Peripheral initial
- //======================================================
- void InitGPIO()
- {
- /*****************0~3, 4 bank, bank x 32+ num*********************/
- /***************************************************************/
- /*************** INPUT PIN ***************************************/
- /***************************************************************/
- /***************************************************************/
- /*************** OUTPUT PIN ************************************/
- /***************************************************************/
- /*MCU request:GPIO3_20 => H:ON; L:OFF*/
- system("echo 116 > /sys/class/gpio/export");
- system("echo \"out\" > /sys/class/gpio/gpio116/direction");
- system("echo 0 > /sys/class/gpio/gpio116/value");
- /*Rfid:GPIO0_19 => Reset_PING H:ON; L:OFF*/
- system("echo 19 > /sys/class/gpio/export");
- system("echo \"out\" > /sys/class/gpio/gpio19/direction");
- system("echo 1 > /sys/class/gpio/gpio19/value");
- /*Speaker:GPIO2_1 => H:ON; L:OFF*/
- system("echo 65 > /sys/class/gpio/export");
- system("echo \"out\" > /sys/class/gpio/gpio65/direction");
- system("echo 0 > /sys/class/gpio/gpio65/value");
- DEBUG_INFO("Initial GPIO OK\r\n");
- }
- int LoadSysConfigAndInfo(struct SysConfigData *ptr)
- {
- int fd,wrd;
- unsigned char *buf;
- unsigned int ChkSum,ChkSumOrg;
- if((buf=malloc(MtdBlockSize))==NULL)
- {
- DEBUG_ERROR("malloc buffer NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- memset(buf, 0, MtdBlockSize);
- //================================================
- // Load configuration from mtdblock10
- //================================================
- fd = open("/dev/mtdblock10", O_RDWR);
- if (fd < 0)
- {
- free(buf);
- DEBUG_ERROR("open mtdblock10 NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- wrd=read(fd, buf, MtdBlockSize);
- close(fd);
- if(wrd<MtdBlockSize)
- {
- free(buf);
- DEBUG_ERROR("read SysConfigData data NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- ChkSum=0;
- for(wrd=0;wrd<MtdBlockSize-4;wrd++)
- {
- ChkSum+=buf[wrd];
- }
- memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
- //================================================
- // Load configuration from mtdblock11
- //================================================
- if(ChkSum!=ChkSumOrg)
- {
- DEBUG_ERROR("Primary SysConfigData checksum NG, read backup\r\n");
- fd = open("/dev/mtdblock11", O_RDWR);
- if (fd < 0)
- {
- free(buf);
- DEBUG_ERROR("open mtdblock11 (backup) NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- memset(buf, 0, MtdBlockSize);
- wrd=read(fd, buf,MtdBlockSize);
- close(fd);
- if(wrd<MtdBlockSize)
- {
- free(buf);
- DEBUG_ERROR("read backup SysConfigData data NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- ChkSum=0;
- for(wrd=0;wrd<MtdBlockSize-4;wrd++)
- {
- ChkSum+=buf[wrd];
- }
- memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
- //================================================
- // Load configuration from mtdblock12 (Factory default)
- //================================================
- if(ChkSum!=ChkSumOrg)
- {
- DEBUG_WARN("backup SysConfigData checksum NG, read Factory default\r\n");
- fd = open("/dev/mtdblock12", O_RDWR);
- if (fd < 0)
- {
- free(buf);
- DEBUG_ERROR("open mtdblock12 (Factory default) NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- memset(buf, 0, MtdBlockSize);
- wrd=read(fd, buf,MtdBlockSize);
- close(fd);
- if(wrd<MtdBlockSize)
- {
- free(buf);
- DEBUG_ERROR("read factory default SysConfigData data NG,rebooting..\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- ChkSum=0;
- for(wrd=0;wrd<MtdBlockSize-4;wrd++)
- {
- ChkSum+=buf[wrd];
- }
- memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
- if(ChkSum!=ChkSumOrg)
- {
- DEBUG_WARN("factory default SysConfigData checksum NG, restore factory default\r\n");
- free(buf);
- system("cd /root;./Module_FactoryConfig -m");
- system("sync");
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- return FAIL;
- }
- }
- }
- //load OK
- memcpy((struct SysConfigData *)ptr,buf,sizeof(struct SysConfigData));
- free(buf);
- DEBUG_INFO("Load SysConfigData OK\r\n");
- return PASS;
- }
- void InitEthernet()
- {
- pid_t pid;
- uint8_t cnt_pingDNS_Fail;
- char tmpbuf[256];
- //unsigned int address;
- //Init Eth0 for internet
- if(isInterfaceUp("eth0")==PASS)
- {
- memset(tmpbuf,0,256);
- sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up",
- ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
- ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
- system(tmpbuf);
- memset(tmpbuf,0,256);
- sprintf(tmpbuf,"route add default gw %s eth0 ",
- ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
- system(tmpbuf);
- }
- if(isInterfaceUp("eth1")==PASS)
- {
- //Init Eth1 for administrator tool
- memset(tmpbuf,0,256);
- sprintf(tmpbuf,"/sbin/ifconfig eth1 %s netmask %s up",
- ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthIpAddress,
- ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthSubmaskAddress);
- system(tmpbuf);
- }
- //Run DHCP client if enabled
- system("killall udhcpc");
- system("rm -rf /etc/resolv.conf");
- system("echo nameserver 8.8.8.8 > /etc/resolv.conf"); //Google DNS server
- system("echo nameserver 180.76.76.76 > /etc/resolv.conf"); //Baidu DNS server
- if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0)
- system("/sbin/udhcpc -i eth0 -s /root/dhcp_script/eth0.script > /dev/null &");
- //check internet status
- pid = fork();
- if(pid == 0)
- {
- for(;;)
- {
- if(isReachableInternet() == PASS)
- {
- ShmSysConfigAndInfo->SysInfo.InternetConn = ON;
- ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=OFF;
- cnt_pingDNS_Fail = 0;
- }
- else
- {
- if(++cnt_pingDNS_Fail > 3)
- {
- ShmSysConfigAndInfo->SysInfo.InternetConn = OFF;
- ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=ON;
- }
- }
- sleep(5);
- }
- }
- DEBUG_INFO("Initial Ethernet OK\r\n");
- }
- int SpawnTask()
- {
- system ("pkill Module_4g");
- system ("pkill Module_Wifi");
- system ("pkill Module_EventLogging");
- system ("pkill OcppBackend");
- system ("pkill Module_AlarmDetect");
- system ("pkill Module_InternalComm");
- system ("pkill Module_Speaker");
- if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
- {
- system("/root/Module_4g &");
- }
- else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
- {
- system("/root/Module_Wifi &");
- }
- system("/root/Module_EventLogging &");
- if(strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0)
- {
- system("/root/OcppBackend &");
- }
- system("/root/Module_AlarmDetect &");
- system("/root/Module_InternalComm &");
- system ("/root/Module_Speaker &");
- return PASS;
- }
- int StoreUsrConfigData(struct SysConfigData *UsrData)
- {
- int result = PASS;
- int fd,wrd;
- unsigned int i,Chk;
- unsigned char *ptr, *BufTmp;
- Chk=0;
- ptr=(unsigned char *)UsrData;
- if((BufTmp=malloc(MtdBlockSize))!=NULL)
- {
- memset(BufTmp,0,MtdBlockSize);
- memcpy(BufTmp,ptr,sizeof(struct SysConfigData));
- for(i=0;i<MtdBlockSize-4;i++)
- Chk+=*(BufTmp+i);
- memcpy( BufTmp+MtdBlockSize-4,&Chk,4);
- fd = open("/dev/mtdblock10", O_RDWR);
- if (fd>0)
- {
- wrd=write(fd, BufTmp, MtdBlockSize);
- close(fd);
- if(wrd>=MtdBlockSize)
- {
- fd = open("/dev/mtdblock11", O_RDWR);
- if (fd>0)
- {
- wrd=write(fd, BufTmp, MtdBlockSize);
- close(fd);
- if(wrd<MtdBlockSize)
- {
- DEBUG_ERROR("write /dev/mtdblock11(backup) NG\r\n");
- result = FAIL;
- }
- }
- else
- {
- DEBUG_ERROR("open /dev/mtdblock11(backup) NG\r\n");
- result = FAIL;
- }
- }
- else
- {
- DEBUG_ERROR("write /dev/mtdblock10 NG\r\n");
- result = FAIL;
- }
- }
- else
- {
- DEBUG_ERROR("open /dev/mtdblock10 NG\r\n");
- result = FAIL;
- }
- }
- else
- {
- DEBUG_ERROR("alloc BlockSize NG\r\n");
- result = FAIL;
- }
- if(BufTmp!=NULL)
- free(BufTmp);
- return result;
- }
- int Initialization()
- {
- LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
- InitGPIO();
- InitEthernet();
- rfidFd = InitRfidPort();
- DEBUG_INFO("Initialization OK\r\n");
- return PASS;
- }
- //=====================================================
- // Common routine
- //=====================================================
- char* getSystemModeName(unsigned char mode)
- {
- char* result;
- switch(mode)
- {
- case SYS_MODE_BOOTING:
- result = "booting";
- break;
- case SYS_MODE_IDLE:
- result = "idle";
- break;
- case SYS_MODE_AUTHORIZING:
- result = "authorizing";
- break;
- case SYS_MODE_PREPARING:
- result = "preparing";
- break;
- case SYS_MODE_CHARGING:
- result = "charging";
- break;
- case SYS_MODE_TERMINATING:
- result = "terminating";
- break;
- case SYS_MODE_ALARM:
- result = "alarm";
- break;
- case SYS_MODE_FAULT:
- result = "fault";
- break;
- case SYS_MODE_MAINTAIN:
- result = "maintain";
- break;
- case SYS_MODE_RESERVATION:
- result = "reservation";
- break;
- case SYS_MODE_BOOKING:
- result = "booking";
- break;
- case SYS_MODE_DEBUG:
- result = "debug";
- break;
- }
- return result;
- }
- void setChargerMode(unsigned char gun_index, unsigned char mode)
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus;
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus = mode;
- DEBUG_INFO("Gun-%02d mode switch from %s to %s\r\n", gun_index, getSystemModeName(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus), getSystemModeName(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus));
- }
- unsigned char isMode(unsigned char gun_index, unsigned char mode)
- {
- return ((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == mode)?YES:NO);
- }
- unsigned char isModeChange(unsigned char gun_index)
- {
- unsigned char result = NO;
- if(!isMode(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus))
- {
- result = YES;
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus;
- }
- return result;
- }
- //===============================================
- // Get firmware version
- //===============================================
- void get_firmware_version(unsigned char gun_index)
- {
- FILE *fp;
- char cmd[512];
- char buf[512];
- // Get CSU hardware version
- sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev, "REV.XXXXXXX");
- // Get CSU boot loader version
- memcpy(ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev, ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev));
- // Get CSU kernel version
- sprintf(cmd, "/bin/uname -r");
- fp = popen(cmd, "r");
- if(fp == NULL)
- sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, "Unknown version");
- else
- {
- while(fgets(buf, sizeof(buf), fp) != NULL)
- {
- strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, buf);
- }
- }
- // Get CSU root file system version
- sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "D0.02.40.0007.PH");
- // Get MCU firmware version
- strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev, ShmCharger->gun_info[gun_index].ver.Version_FW);
- DEBUG_INFO("CSU hardware version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuHwRev);
- DEBUG_INFO("CSU boot loader version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev);
- DEBUG_INFO("CSU kernel version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev);
- DEBUG_INFO("CSU root file system version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
- DEBUG_INFO("CSU MCU-%2d firmware version: %s\r\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW);
- }
- //===============================================
- // Upgrade firmware
- //===============================================
- int upgrade_check()
- {
- int result = PASS;
- int fd;
- DIR *dir;
- struct dirent *file;
- char cmd[512];
- long int MaxLen=48*1024*1024;
- if ((dir = opendir ("/mnt")) != NULL)
- {
- /* print all the files and directories within directory */
- while ((file = readdir (dir)) != NULL)
- {
- if(strlen(file->d_name)>2)
- {
- memset(&ShmCharger->fwUpgradeInfo, 0xFF, sizeof(Fw_Upgrade_Info));
- DEBUG_INFO("New firmware file: %s\n", file->d_name);
- sprintf(ShmCharger->fwUpgradeInfo.location, "/mnt/%s", file->d_name);
- if((fd=open(ShmCharger->fwUpgradeInfo.location, O_RDONLY)) >= 0)
- {
- unsigned char *ptr = malloc(MaxLen); //-48 is take out the header
- memset(ptr, 0xFF, MaxLen); //-48 is take out the header
- read(fd, ptr, MaxLen);
- close(fd);
- ShmCharger->fwUpgradeInfo.fwType = ((ptr[0x13]<<0) | (ptr[0x12]<<8) | (ptr[0x11]<<16) | (ptr[0x10]<<24));
- substr(ShmCharger->fwUpgradeInfo.modelName, (char *)ptr, 0, 0x10);
- DEBUG_INFO("New firmware type: %X\r\n", ShmCharger->fwUpgradeInfo.fwType);
- DEBUG_INFO("New firmware model name: %s, %s\r\n", ShmCharger->fwUpgradeInfo.modelName, ShmSysConfigAndInfo->SysConfig.ModelName);
- if((strcmp(ShmCharger->fwUpgradeInfo.modelName, (char*)ShmSysConfigAndInfo->SysConfig.ModelName)==0) && (ShmCharger->fwUpgradeInfo.fwType>0))
- {
- switch(ShmCharger->fwUpgradeInfo.fwType)
- {
- case CSU_BOOTLOADER:
- case CSU_KERNEL_CONFIGURATION:
- case CSU_KERNEL_IMAGE:
- case CSU_ROOT_FILE_SYSTEM:
- case CSU_USER_CONFIGURATION:
- case CSU_PRIMARY_CONTROLLER:
- if(Upgrade_Flash(ShmCharger->fwUpgradeInfo.fwType, ShmCharger->fwUpgradeInfo.location, ShmCharger->fwUpgradeInfo.modelName) != PASS)
- result = FAIL;
- sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
- system(cmd);
- break;
- case AC_WALLMOUNT_CONTROLLER:
- for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
- ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq = ON;
- break;
- default:
- DEBUG_WARN("Image file is unknown type.\r\n");
- sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
- system(cmd);
- break;
- }
- }
- free(ptr);
- }
- else
- {
- // File open error
- DEBUG_ERROR("New firmware open error.\r\n");
- }
- }
- }
- closedir (dir);
- }
- else
- {
- DEBUG_ERROR("/mnt does not valid.\r\n");
- }
- return result;
- }
- //===============================================
- // Check RFID is match with start user
- //===============================================
- int isMatchStartUser(unsigned char gun_index)
- {
- uint8_t tmpUser[32];
- if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
- {
- // Big endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
- break;
- }
- }
- else
- {
- // Little endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)tmpUser, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- }
- }
- return ((strcmp((char*)tmpUser, (char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId)==0)?YES:NO);
- }
- //===============================================
- // Read RFID Serial Number
- //===============================================
- int GetCardSerialNumber()
- {
- int isSuccess = FAIL;
- int module_type = MODULE_EWT;
- if(getRequestCardSN(rfidFd,module_type,&rfid))
- {
- if(rfid.cardType == ISO14443A)
- {
- if(rfid.snType == RFID_SN_TYPE_4BYTE)
- {
- isSuccess = PASS;
- }
- else if (rfid.snType == RFID_SN_TYPE_7BYTE)
- {
- isSuccess = PASS;
- }
- }
- else if(rfid.cardType == IS014443B)
- {
- isSuccess = PASS;
- }
- else if(rfid.cardType == FELICA)
- {
- isSuccess = PASS;
- }
- else
- {}
- }
- else
- {}
- return isSuccess;
- }
- //===============================================
- // Alarm value check
- //===============================================
- int GetAlarmValue()
- {
- int result = PASS;
- if( (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[0] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[1] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[2] > 0) ||
- (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[3] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[4] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[5] > 0) ||
- (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[6] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[7] > 0))
- {
- result = FAIL;
- }
- return result;
- }
- //===============================================
- // Info value check
- //===============================================
- int GetInfoValue()
- {
- int result = PASS;
- if( (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[0] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[1] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[2] > 0) ||
- (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[3] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[4] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[5] > 0) ||
- (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[6] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[7] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[8] > 0) ||
- (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[9] > 0))
- {
- result = FAIL;
- }
- return result;
- }
- //===============================================
- // Fault value check
- //===============================================
- int GetFaultValue()
- {
- int result = PASS;
- if( (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[0] > 0) ||
- (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[1] > 0) ||
- (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[2] > 0) ||
- (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[3] > 0))
- {
- result = FAIL;
- }
- return result;
- }
- //===============================================
- // Authorizing Response Status
- //===============================================
- int isAuthorizedPass()
- {
- int result = FAIL;
- char tmp[16] = "";
- memset(tmp, 0, ARRAY_SIZE(tmp));
- for(int index = 0; index < strlen((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);index++)
- {
- sprintf(tmp + (index - 1) * 2, "%02X",ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status[index]);
- }
- sprintf(tmp, "%s", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
- DEBUG_INFO("Authorize Response Id TagInfo: %s\r\n", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
- if(strstr(tmp, "Accepted") != 0)
- {
- result = PASS;
- }
- else
- {}
- return result;
- }
- //===============================================
- // BootNotification Response Status
- //===============================================
- int isBootNotificationSignature()
- {
- int result = FAIL;
- char tmp[16] = "";
- memset(tmp, 0, ARRAY_SIZE(tmp));
- for(int index = 0; index < strlen((char *)ShmOCPP16Data->BootNotification.ResponseStatus);index++)
- {
- sprintf(tmp + (index - 1) * 2, "%02X",ShmOCPP16Data->BootNotification.ResponseStatus[index]);
- }
- sprintf(tmp, "%s",ShmOCPP16Data->BootNotification.ResponseStatus);
- DEBUG_INFO("BootNotification Response Status: %s\r\n", ShmOCPP16Data->BootNotification.ResponseStatus);
- if(strstr(tmp, "Accepted") != 0)
- {
- result = PASS;
- }
- else
- {}
- return result;
- }
- //===============================================
- // Set led motion
- //===============================================
- void setLedMotion(unsigned char gun_index,unsigned char led_mode)
- {
- switch(led_mode)
- {
- case LED_ACTION_INIT:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_INIT;
- break;
- case LED_ACTION_IDLE:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_IDLE;
- break;
- case LED_ACTION_AUTHED:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_AUTHED;
- break;
- case LED_ACTION_CONNECTED:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_CONNECTED;
- break;
- case LED_ACTION_CHARGING:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_CHARGING;
- break;
- case LED_ACTION_STOP:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_STOP;
- break;
- case LED_ACTION_ALARM:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_ALARM;
- break;
- case LED_ACTION_MAINTAIN:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_MAINTAIN;
- break;
- case LED_ACTION_RFID_PASS:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_RFID_PASS;
- break;
- case LED_ACTION_RFID_FAIL:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_RFID_FAIL;
- break;
- case LED_ACTION_BLE_CONNECT:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_BLE_CONNECT;
- break;
- case LED_ACTION_BLE_DISABLE:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_BLE_DISABLE;
- break;
- case LED_ACTION_DEBUG:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_DEBUG;
- break;
- case LED_ACTION_ALL_OFF:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_ALL_OFF;
- break;
- case LED_RELAY_ON:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_ON;
- break;
- case LED_RELAY_OFF:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_OFF;
- break;
- case LED_ACTION_HANDSHAKE_FAIL:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_HANDSHAKE_FAIL;
- break;
- case LED_ACTION_INTERNET_DISCONNECT:
- ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_INTERNET_DISCONNECT;
- break;
- }
- }
- //===============================================
- // Relay on/off request
- //===============================================
- void setRelay(unsigned char gun_index,unsigned char isOn)
- {
- if(isOn == ON)
- {
- if(ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest == OFF)
- {
- ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest = ON;
- DEBUG_INFO("Gun-%d Output relay sts: ON \r\n",gun_index);
- }
- }
- else
- {
- if(ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest == ON)
- {
- ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest = OFF;
- DEBUG_INFO("Gun-%d Output relay sts: OFF \r\n",gun_index);
- }
- }
- }
- //===============================================
- // Set speaker on/off request
- //===============================================
- void setSpeaker(unsigned char isOn, unsigned char speaker_mode)
- {
- if(isOn == ON)
- {
- ShmCharger->isSpeakerOn = ON;
- ShmCharger->speaker_type = speaker_mode;
- }
- }
- //===============================================
- // Initialization RFID communication port
- //===============================================
- int InitRfidPort()
- {
- int uartO2 = open(rfidPortName, O_RDWR);
- struct termios tios;
- if (uartO2 != FAIL)
- {
- ioctl (uartO2, TCGETS, &tios);
- tios.c_cflag = B19200 | CS8 | CLOCAL | CREAD;
- tios.c_lflag = 0;
- tios.c_iflag = 0;
- tios.c_oflag = 0;
- tios.c_cc[VMIN] = 0;
- tios.c_cc[VTIME] = (unsigned char) 1;
- tios.c_lflag = 0;
- tcflush(uartO2, TCIFLUSH);
- ioctl(uartO2, TCSETS, &tios);
- }
- if (uartO2 < 0)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RfidModuleCommFail = 1;
- }
- return uartO2;
- }
- //==========================================
- // Check internet access status
- //==========================================
- int isReachableInternet()
- {
- int result = FAIL;
- FILE *fp;
- char cmd[256];
- char buf[512];
- //char tmp[512];
- for(int idx=0;idx<ARRAY_SIZE(valid_Internet);idx++)
- {
- strcpy(cmd, "ping -c 1 -w 3 ");
- strcat(cmd, valid_Internet[idx]);
- fp = popen(cmd, "r");
- if(fp != NULL)
- {
- while(fgets(buf, sizeof(buf), fp) != NULL)
- {
- if(strstr(buf, "transmitted") > 0)
- {
- //sscanf(buf, "%*s%*s%*s%*s%*s%*s%s", tmp);
- if(strstr(buf,"100%") != NULL)
- {
- }
- else
- {
- result = PASS;
- }
- //DEBUG_INFO("%s",buf);
- //DEBUG_INFO("%s\n",tmp);
- }
- }
- }
- pclose(fp);
- }
- return result;
- }
- //===============================================
- // Check reservation date is expired
- //===============================================
- int isReservationExpired(unsigned char gun_index)
- {
- int result = NO;
- struct tm expiredDate;
- struct timeb expiredTime;
- if(sscanf((char*)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%4d-%2d-%2dT%2d:%2d:%2d", &expiredDate.tm_year, &expiredDate.tm_mon, &expiredDate.tm_mday, &expiredDate.tm_hour, &expiredDate.tm_min, &expiredDate.tm_sec) == 6)
- {
- expiredTime.time = mktime(&expiredDate);
- if(DiffTimebWithNow(expiredTime)>0)
- {
- result = YES;
- }
- }
- else
- DEBUG_WARN("Expired date parsing error\r\n");
- return result;
- }
- //===============================================
- // Main process
- //===============================================
- int main(void)
- {
- //Create all share memory
- if(CreatShareMemory()==0)
- {
- DEBUG_ERROR("CreatShareMemory NG\r\n");
- if(ShmStatusCodeData!=NULL)
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
- }
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- else
- {
- DEBUG_INFO("CreatShareMemory OK\r\n");
- }
- for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = 0xff;
- }
- // Main loop
- for(;;)
- {
- //==========================================
- // Synchronize share memory from OCPP struct
- //==========================================
- ShmSysConfigAndInfo->SysInfo.OcppConnStatus = ShmOCPP16Data->OcppConnStatus;
- //==========================================
- // Something need run in Idle mode
- //==========================================
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_IDLE) &&
- (AC_QUANTITY>1?(ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_IDLE):true))
- {
- //======================================
- // Check restore factory setting request
- //======================================
- if(ShmSysConfigAndInfo->SysInfo.FactoryConfiguration)
- {
- system("cd /root;./Module_FactoryConfig -m");
- system("sync");
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- //======================================
- // Check upgrade firmware request
- //======================================
- if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate ||
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq)
- {
- ShmCharger->isUpdateSuccess = FAIL;
- for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
- setChargerMode(gun_index, SYS_MODE_MAINTAIN);
- }
- }
- //==========================================
- // Check remote reset request
- //==========================================
- if(ShmOCPP16Data->MsMsg.bits.ResetReq)
- {
- if((!isMode(0, SYS_MODE_CHARGING) && !isMode(0, SYS_MODE_TERMINATING)) &&
- (AC_QUANTITY>1?(!isMode(1, SYS_MODE_CHARGING) && !isMode(1, SYS_MODE_TERMINATING)):true))
- {
- ShmOCPP16Data->MsMsg.bits.ResetReq = OFF;
- if(strcmp((char*)ShmOCPP16Data->Reset.Type, "Hard") == 0)
- {
- system("sync");
- sleep(5);
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- else
- {
- system("/usr/bin/run_evse_restart.sh");
- }
- }
- }
- //==========================================
- // Check RFID
- //==========================================
- if(!ShmCharger->rfidReq)
- {
- if(GetCardSerialNumber()!= FAIL)
- {
- ShmCharger->rfidReq = ON;
- }
- }
- //==========================================
- // Connector loop
- //==========================================
- for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
- {
- // Assign connector location index for OCPP
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].Index = gun_index;
- // Alarm event check
- if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode>0))
- {
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus != SYS_MODE_ALARM)
- {
- setChargerMode(gun_index, SYS_MODE_ALARM);
- }
- }
- else
- {
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_ALARM)
- {
- }
- else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == 0XFF)
- {
- setChargerMode(gun_index, SYS_MODE_BOOTING);
- }
- }
- // Reservation request check
- if(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq)
- {
- ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq = OFF;
- if(isMode(gun_index, SYS_MODE_IDLE) && !isReservationExpired(gun_index))
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId = ShmOCPP16Data->ReserveNow[gun_index].ReservationId;
- setChargerMode(gun_index, SYS_MODE_RESERVATION);
- }
- DEBUG_INFO("Reservation request on connector-%d.\r\n", gun_index);
- ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
- }
- // Change availability check
- if(ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq)
- {
- if(strcmp((char*)ShmOCPP16Data->ChangeAvailability[gun_index].Type, "Operative") == 0)
- {
- if(isMode(gun_index, SYS_MODE_MAINTAIN))
- {
- setChargerMode(gun_index, SYS_MODE_IDLE);
- ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq = OFF;
- }
- }
- else
- {
- if(isMode(gun_index, SYS_MODE_IDLE))
- {
- setChargerMode(gun_index, SYS_MODE_MAINTAIN);
- ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq = OFF;
- }
- }
- }
- // Connector process
- switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus)
- {
- case SYS_MODE_BOOTING:
- if(isModeChange(gun_index))
- {
- setLedMotion(gun_index,LED_ACTION_INIT);
- //CSU Initialization & task spawn
- if((Initialization() != PASS) ||
- (SpawnTask() != PASS) )
- {
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = ON;
- }
- }
- if(ShmCharger->gun_info[gun_index].mcuFlag.isReadFwVerPass &&
- ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass &&
- ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass)
- {
- // Firmware version
- get_firmware_version(gun_index);
- // OCPP BootNotification info set
- memcpy((char*)ShmOCPP16Data->OcppServerURL, (char*)ShmSysConfigAndInfo->SysConfig.OcppServerURL, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.OcppServerURL));
- memcpy((char*)ShmOCPP16Data->ChargeBoxId, (char*)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ChargeBoxId));
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.chargePointVendor, "Phihong Technology");
- sprintf((char*)ShmOCPP16Data->BootNotification.CpFwVersion, (char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
- sprintf((char*)ShmOCPP16Data->BootNotification.CpMeterSerialNumber, "N/A");
- sprintf((char*)ShmOCPP16Data->BootNotification.CpMeterType, "AC");
- DEBUG_INFO("Wifi mode: %d\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
- DEBUG_INFO("Wifi SSID: %s\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiSsid);
- DEBUG_INFO("Wifi password: %s\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiPassword);
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- break;
- case SYS_MODE_IDLE:
- if(isModeChange(gun_index))
- {
- setLedMotion(gun_index,LED_ACTION_IDLE);
- setRelay(gun_index,OFF);
- ShmCharger->rfidReq = OFF;
- ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart = OFF;
- ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop = OFF;
- ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = OFF;
- ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq = OFF;
- ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode = 0x00;
- ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = 0;
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy = 0;
- setLedMotion(gun_index,LED_ACTION_IDLE);
- }
- if(((ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B)) ||
- (ShmCharger->rfidReq == ON) ||
- (ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart == ON) ||
- (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq == ON))
- {
- // Clean User id & Card Number
- memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
- memset(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].CardNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].CardNumber));
- if((ShmCharger->rfidReq == ON))
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_RFID;
- DEBUG_INFO("Start Method : RFID...\r\n");
- if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
- {
- // Big endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
- break;
- }
- }
- else
- {
- // Little endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- }
- }
- memcpy((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].CardNumber, ShmSysConfigAndInfo->SysConfig.UserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
- DEBUG_INFO("Start request User Id : %s\r\n", ShmSysConfigAndInfo->SysConfig.UserId);
- DEBUG_INFO("Card number : %s\r\n", ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].CardNumber);
- }
- else if(ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq)
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_BACKEND;
- memcpy(ShmSysConfigAndInfo->SysConfig.UserId, ShmOCPP16Data->RemoteStartTransaction[gun_index].IdTag, ARRAY_SIZE(ShmOCPP16Data->RemoteStartTransaction[gun_index].IdTag));
- DEBUG_INFO("Start Method : BACKEND...\r\n");
- }
- else if(ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart == ON)
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_BLE;
- memcpy(ShmSysConfigAndInfo->SysConfig.UserId, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, ARRAY_SIZE(ShmCharger->gun_info[gun_index].bleLoginCentralId.id));
- DEBUG_INFO("Start Method : BLE...\r\n");
- }
- else
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_FREE;
- DEBUG_INFO("Start Method : FREE..\r\n");
- }
- ShmCharger->rfidReq = OFF;
- ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = OFF;
- ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart = OFF;
- setChargerMode(gun_index, SYS_MODE_AUTHORIZING);
- }
- else
- {}
- break;
- case SYS_MODE_AUTHORIZING:
- if(isModeChange(gun_index))
- {
- setLedMotion(gun_index,LED_ACTION_AUTHED);
- ftime(&startTime[gun_index][TMR_IDX_AUTH]);
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod == START_METHOD_RFID)
- {
- switch(ShmSysConfigAndInfo->SysConfig.AuthorisationMode)
- {
- case AUTH_MODE_PH_RFID:
- break;
- case AUTH_MODE_BACKEND_OCPP:
- if(ShmOCPP16Data->OcppConnStatus)
- {
- // On line
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
- }
- else
- {
- // Off line
- switch(ShmSysConfigAndInfo->SysConfig.OfflinePolicy)
- {
- case OFF_POLICY_LOCALLIST:
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
- break;
- case OFF_POLICY_PH_RFID:
- break;
- case OFF_POLICY_FREE:
- break;
- case OFF_POLICY_NOCHARGE:
- default:
- break;
- }
- }
- break;
- case AUTH_MODE_BACKEND_PH:
- break;
- case AUTH_MODE_FREE:
- default:
- break;
- }
- }
- }
- if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_AUTH]) > TIMEOUT_SPEC_AUTH)
- {
- // Authorization timeout process.
- ShmCharger->rfidReq = OFF;
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- else
- {
- switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod)
- {
- case START_METHOD_RFID:
- if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
- (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
- !ShmOCPP16Data->OcppConnStatus)
- {
- if((strcmp((char*)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted")==0) ||
- (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
- (!ShmOCPP16Data->OcppConnStatus&&(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)))
- {
- setSpeaker(ON,SPEAKER_SHORT);
- setChargerMode(gun_index, SYS_MODE_PREPARING);
- }
- else
- {
- setSpeaker(ON,SPEAKER_INTERVAL_3COUNT);
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- ShmCharger->rfidReq = OFF;
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = OFF;
- }
- break;
- case START_METHOD_BACKEND:
- case START_METHOD_BLE:
- case START_METHOD_FREE:
- default:
- setSpeaker(ON,SPEAKER_SHORT);
- setChargerMode(gun_index, SYS_MODE_PREPARING);
- break;
- }
- }
- break;
- case SYS_MODE_PREPARING:
- if(isModeChange(gun_index))
- {
- ftime(&startTime[gun_index][TMR_IDX_HANDSHAKING]);
- setRelay(gun_index, ON);
- }
- if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_HANDSHAKING]) > TIMEOUT_SPEC_HANDSHAKING)
- {
- setLedMotion(gun_index, LED_ACTION_HANDSHAKE_FAIL);
- if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_HANDSHAKING]) > TIMEOUT_SPEC_HANDSHAKING_LED)
- {
- DEBUG_INFO("HANDSHAKINNG TIMEOUT...");
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- }
- else if((ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON))
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].OutputEnergy = 0;
- ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ((float)ShmCharger->gun_info[gun_index].powerConsumption.power_consumption/100);
- memcpy((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
- ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = ON;
- setChargerMode(gun_index, SYS_MODE_CHARGING);
- }
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B))
- {
- setLedMotion(gun_index,LED_ACTION_CONNECTED);
- }
- break;
- case SYS_MODE_CHARGING:
- if(isModeChange(gun_index))
- {
- ShmCharger->rfidReq = OFF;
- ftime(&startChargingTime[gun_index]);
- }
- if((ShmCharger->rfidReq == ON) ||
- (ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop == ON) ||
- (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq == ON)||
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState != CP_STATE_C) ||
- ShmOCPP16Data->MsMsg.bits.ResetReq)
- {
- // If RFID SN different with start user, it need to authorize ID
- if((ShmCharger->rfidReq == ON) && !isMatchStartUser(gun_index))
- {
- ShmCharger->rfidReq = OFF;
- if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_AUTH]) > TIMEOUT_SPEC_AUTH)
- {
- // Request authorization
- ftime(&startTime[gun_index][TMR_IDX_AUTH]);
- memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
- if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
- {
- // Big endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
- break;
- }
- }
- else
- {
- // Little endian
- switch(rfid.snType)
- {
- case RFID_SN_TYPE_6BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_7BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_10BYTE:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- case RFID_SN_TYPE_4BYTE:
- default:
- sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
- break;
- }
- }
- DEBUG_INFO("End request User Id : %s\r\n", ShmSysConfigAndInfo->SysConfig.UserId);
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod == START_METHOD_RFID)
- {
- switch(ShmSysConfigAndInfo->SysConfig.AuthorisationMode)
- {
- case AUTH_MODE_PH_RFID:
- break;
- case AUTH_MODE_BACKEND_OCPP:
- if(ShmOCPP16Data->OcppConnStatus)
- {
- // On line
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
- }
- else
- {
- // Off line
- switch(ShmSysConfigAndInfo->SysConfig.OfflinePolicy)
- {
- case OFF_POLICY_LOCALLIST:
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
- break;
- case OFF_POLICY_PH_RFID:
- break;
- case OFF_POLICY_FREE:
- break;
- case OFF_POLICY_NOCHARGE:
- default:
- break;
- }
- }
- break;
- case AUTH_MODE_BACKEND_PH:
- break;
- case AUTH_MODE_FREE:
- default:
- break;
- }
- }
- }
- else
- {
- if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
- (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
- !ShmOCPP16Data->OcppConnStatus)
- {
- if((strcmp((char*)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted")==0) ||
- (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
- (!ShmOCPP16Data->OcppConnStatus&&(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)))
- {
- ShmCharger->gun_info[gun_index].isAuthPassEnd = ON;
- setChargerMode(gun_index, SYS_MODE_TERMINATING);
- }
- ShmCharger->rfidReq = OFF;
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = OFF;
- }
- }
- }
- else
- {
- setChargerMode(gun_index, SYS_MODE_TERMINATING);
- }
- }
- else
- {
- /*
- * TODO:
- * 1. Update charging cycle information.
- * 2. CP PWM duty dynamic control logic.
- */
- setRelay(gun_index,ON);
- setLedMotion(gun_index,LED_ACTION_CHARGING);
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ((float)ShmCharger->gun_info[gun_index].powerConsumption.power_consumption/100.0) - ShmOCPP16Data->StartTransaction[gun_index].MeterStart;
- ftime(&endChargingTime[gun_index]);
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index]);
- }
- break;
- case SYS_MODE_TERMINATING:
- if(isModeChange(gun_index))
- {
- setLedMotion(gun_index,LED_ACTION_STOP);
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration != 0)
- {
- ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index]);
- }
- }
- if(((ShmCharger->rfidReq == ON) && isMatchStartUser(gun_index)) ||
- (ShmCharger->gun_info[gun_index].isAuthPassEnd) ||
- (ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop == ON) ||
- (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq == ON) ||
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A) ||
- ShmOCPP16Data->MsMsg.bits.ResetReq)
- {
- /*
- * TODO:
- * 1. Record charging history.
- */
- if(ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest == ON)
- {
- setSpeaker(ON,SPEAKER_SHORT);
- if(ShmOCPP16Data->MsMsg.bits.ResetReq)
- {
- if(strcmp((char*)ShmOCPP16Data->Reset.Type, "Hard")==0)
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "HardReset");
- else
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "SoftReset");
- }
- else if(ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq)
- {
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Remote");
- }
- else if(ShmCharger->rfidReq || ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop)
- {
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
- }
- else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A)
- {
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
- }
- else
- {
- sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Other");
- }
- ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = ON;
- }
- setRelay(gun_index,OFF);
- if(!ShmCharger->gun_info[gun_index].primaryMcuState.relay_state)
- {
- ShmCharger->rfidReq = OFF;
- ShmCharger->gun_info[gun_index].isAuthPassEnd = OFF;
- ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop = OFF;
- ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq = OFF;
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- }
- else
- {
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C))
- {
- setChargerMode(gun_index, SYS_MODE_CHARGING);
- }
- }
- setLedMotion(gun_index,LED_ACTION_STOP);
- break;
- case SYS_MODE_ALARM:
- if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode == 0))
- {
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus == SYS_MODE_CHARGING) ||
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus == SYS_MODE_TERMINATING))
- {
- setChargerMode(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus);
- }
- else
- {
- setChargerMode(gun_index, SYS_MODE_IDLE);
- }
- }
- setLedMotion(gun_index,LED_ACTION_ALARM);
- break;
- case SYS_MODE_FAULT:
- if(isModeChange(gun_index))
- {
- /*
- * TODO:
- * 1. LED control depend on relay status
- * 2. Alarm latch & release logic
- */
- }
- break;
- case SYS_MODE_MAINTAIN:
- if(isModeChange(gun_index))
- {
- /*
- * TODO:
- * 1. LED control depend on relay status
- * 2. Wait maintenance release command
- */
- setLedMotion(gun_index,LED_ACTION_MAINTAIN);
- }
- //======================================
- // Check local upgrade firmware request
- //======================================
- if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate)
- {
- DEBUG_INFO("Firmware local upgrading...\r\n");
- ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = OFF;
- if(upgrade_check())
- {
- ShmCharger->isUpdateSuccess = PASS;
- }
- else
- {
- ShmCharger->isUpdateSuccess = FAIL;
- }
- }
- else if(ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq)
- {
- //======================================
- // Check remote upgrade firmware request
- //======================================
- if(strcmp((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "DownloadFailed")==0)
- {
- DEBUG_INFO("Firmware remote upgraded fail...\r\n");
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = OFF;
- }
- else if(strcmp((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Downloaded")==0)
- {
- DEBUG_INFO("Firmware remote upgrading...\r\n");
- sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = OFF;
- if(upgrade_check())
- {
- ShmCharger->isUpdateSuccess = PASS;
- }
- else
- {
- ShmCharger->isUpdateSuccess = FAIL;
- }
- }
- else
- {}
- }
- else
- {
- //======================================
- // Upgrade complete reboot system
- //======================================
- if(!ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq && ((AC_QUANTITY>1)?!ShmCharger->gun_info[gun_index^1].mcuFlag.isMcuUpgradeReq:YES))
- {
- if(ShmCharger->isUpdateSuccess == PASS)
- {
- sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
- DEBUG_WARN("Firmware upgrade success.\r\n");
- sleep(5);
- DEBUG_INFO("Firmware upgraded, reboot...\r\n");
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- else
- {
- sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
- DEBUG_WARN("Firmware upgrade fail.\r\n");
- }
- }
- }
- break;
- case SYS_MODE_RESERVATION:
- if(isModeChange(gun_index))
- {
- setLedMotion(gun_index,LED_ACTION_MAINTAIN);
- }
- if(isReservationExpired(gun_index) || ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq)
- {
- setChargerMode(gun_index, SYS_MODE_IDLE);
- ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = OFF;
- ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf = ON;
- }
- break;
- case SYS_MODE_BOOKING:
- if(isModeChange(gun_index))
- {
- /*
- * TODO:
- * 1. LED control depend on relay status
- * 2. Check booking start is on time?
- */
- }
- break;
- case SYS_MODE_DEBUG:
- if(isModeChange(gun_index))
- {
- /*
- * TODO:
- * 1. LED control depend on relay status
- */
- }
- setLedMotion(gun_index,LED_ACTION_DEBUG);
- break;
- }
- }
- usleep(50000);
- }
- return FAIL;
- }
|