#include "../../define.h" #include "main.h" //========================== // System basic sample constant //========================== #define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L) #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 #define MtdBlockSize 0x300000 #define TMR_IDX_CHECK_TASK 0 #define EMSS_TEST_TASK 1 #define BMS_Relay1_TASK 2 #define BMS_Relay2_TASK 3 #define BMS_Relay3_TASK 4 #define BMS_Relay4_TASK 5 #define BMS_BATDIS_TASK 6 #define BMS_PREPARING_TASK 7 int wtdFd = -1; int CanFd = -1; int pollingStep = 0; int ADC_Index=0; //========================== // Declare share memory //========================== struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; struct BatteryInfoData *ShmBatteryInfo; struct EMSSInfoData *ShmEMSSInfo; struct timespec timerStartTime[10]; struct SysConfigData SysConfigOrg; char *valid_Internet[2] = {"8.8.8.8", "180.76.76.76"}; //================================= // Common routine //================================= int StoreLogMsg(const char *fmt, ...) { char Buf[4096+256]; char buffer[4096]; time_t CurrentTime; struct tm *tm; struct timeval tv; 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); gettimeofday(&tv, NULL); // get microseconds, 10^-6 sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%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,tv.tv_usec, buffer, tm->tm_year+1900,tm->tm_mon+1); #ifdef SystemLogMessage system(Buf); #endif #ifdef ConsloePrintLog 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); #endif return rc; } void substr(char *dest, const char* src, unsigned int start, unsigned int cnt) { strncpy(dest, src + start, cnt); dest[cnt] = 0; } void refreshStartTimer(struct timespec *timer) { clock_gettime(CLOCK_MONOTONIC, timer); } int getDiffSecNow(struct timespec timer) { struct timespec timerNow; clock_gettime(CLOCK_MONOTONIC, &timerNow); return (int)((((unsigned long)(timerNow.tv_sec - timer.tv_sec) * 1000) + ((unsigned long)((timerNow.tv_nsec / 1000000) - (timer.tv_nsec / 1000000))))/1000); } int getDiffSecBetween(struct timespec start, struct timespec end) { return (int)((((unsigned long)(end.tv_sec - start.tv_sec) * 1000) + ((unsigned long)((end.tv_nsec / 1000000) - (start.tv_nsec / 1000000))))/1000); } int getEth0MacAddress() { int result = PASS; FILE *fp; char cmd[256]; char buf[512]; char tmp[512]; strcpy(cmd, "ifconfig eth0"); fp = popen(cmd, "r"); if(fp != NULL) { while(fgets(buf, sizeof(buf), fp) != NULL) { if(strstr(buf, "eth0") > 0) { result = PASS; } if(strstr(buf, "eth0 Link encap:Ethernet HWaddr") > 0) { sscanf(buf, "%*s%*s%*s%*s%s", tmp); strcpy((char*)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthMacAddress, tmp); } } } pclose(fp); return result; } //====================================================== // Network interface related function //====================================================== 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; } int isReachableInternet() { int result = FAIL; FILE *fp; char cmd[256]; char buf[512]; char tmp[512]; // Get ip address & net mask strcpy(cmd, "ifconfig eth0"); fp = popen(cmd, "r"); if (fp != NULL) { while(fgets(buf, sizeof(buf), fp) != NULL) { if (strstr(buf, "inet addr:") > 0) { sscanf(buf, "%*s%s", tmp); substr(tmp, tmp, strspn(tmp, "addr:"), strlen(buf)-strspn(tmp, "addr:")); if (strcmp(tmp, (char *)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress) != 0) { strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress, tmp); } sscanf(buf, "%*s%*s%*s%s", tmp); substr(tmp, tmp, strspn(tmp, "Mask:"), strlen(buf)-strspn(tmp, "Mask:")); if (strcmp(tmp, (char *)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress) != 0) { strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress, tmp); } } } } pclose(fp); memset(buf, 0x00, sizeof(buf)); // Get gateway fp = popen("ip route", "r"); if(fp == NULL) result = FAIL; else { while(fgets(buf, sizeof(buf), fp) != NULL) { if((strstr(buf, "default") != NULL) && (strstr(buf, "eth0") != NULL)) break; } if(strstr(buf, "default") != NULL) { sscanf(buf, "%*s%*s%s", tmp); substr((char*)ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress, tmp, 0, strlen(tmp)); } } pclose(fp); memset(buf, 0x00, sizeof(buf)); for(int idx=0;idx 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; } int isRouteFail() { int result = YES; FILE *fp; char buf[512]; fp = popen("route -n", "r"); if(fp != NULL) { while(fgets(buf, sizeof(buf), fp) != NULL) { if(strstr(buf, "eth0") != NULL) result = NO; } } 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\n"); result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\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\n"); result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmStatusCodeData NG\n"); result = FAIL; } memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData)); //creat ShmBatteryInfo if ((MeterSMId = shmget(ShmBatteryInfoKey, sizeof(struct BatteryInfoData), IPC_CREAT | 0777)) < 0) { DEBUG_ERROR("shmget ShmBatteryInfo NG\n"); result = FAIL; } else if ((ShmBatteryInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmBatteryInfo NG\n"); result = FAIL; } memset(ShmBatteryInfo,0,sizeof(struct BatteryInfoData)); //creat ShmEMSSInfo if ((MeterSMId = shmget(ShmEMSSInfoKey, sizeof(struct EMSSInfoData), IPC_CREAT | 0777)) < 0) { DEBUG_ERROR("shmget ShmEMSSInfo NG\n"); result = FAIL; } else if ((ShmEMSSInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmEMSSInfo NG\n"); result = FAIL; } memset(ShmEMSSInfo,0,sizeof(struct EMSSInfoData)); return result; } 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..\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 //================================================ system("nanddump /dev/mtd10 -f /mnt/EvseConfig.bin"); fd = open("/mnt/EvseConfig.bin", O_RDWR); if (fd < 0) { free(buf); DEBUG_ERROR("open mtdblock10 NG,rebooting..\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(wrdAlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } ChkSum=0; for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrdModelName,buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)),ARRAY_SIZE(ptr->ModelName)); memcpy(&ptr->SerialNumber,buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)+ARRAY_SIZE(ptr->ModelName)+ARRAY_SIZE(ptr->AcModelName)),ARRAY_SIZE(ptr->SerialNumber)); //================================================ // Load configuration from mtdblock11 //================================================ if(ChkSum!=ChkSumOrg) { DEBUG_ERROR("Primary SysConfigData checksum NG, read backup\n"); system("nanddump /dev/mtd11 -f /mnt/EvseConfig.bin"); fd = open("/mnt/EvseConfig.bin", O_RDWR); if (fd < 0) { free(buf); DEBUG_ERROR("open mtdblock11 (backup) NG,rebooting..\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(wrdAlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } ChkSum=0; for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrdAlarmCode.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(wrdAlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } ChkSum=0; for(wrd=ARRAY_SIZE(ptr->CsuBootLoadFwRev);wrdCsuBootLoadFwRev)), &ptr->ModelName, ARRAY_SIZE(ptr->ModelName)); memcpy(buf+(ARRAY_SIZE(ptr->CsuBootLoadFwRev)+ARRAY_SIZE(ptr->ModelName)+ARRAY_SIZE(ptr->AcModelName)), &ptr->SerialNumber, ARRAY_SIZE(ptr->SerialNumber)); if(ChkSum!=ChkSumOrg) { DEBUG_WARN("factory default SysConfigData checksum NG, restore factory default\n"); free(buf); system("cd /root;./Module_FactoryConfig -m"); system("rm -f /Storage/OCPP/OCPPConfiguration"); 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); system("rm -f /mnt/EvseConfig.bin"); // SysConfig in flash is empty (0xffffffff) if((strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName)) || (strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber)) || (strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId)) || (ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0xff)) { if(strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName)) { memset(ShmSysConfigAndInfo->SysConfig.ModelName, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ModelName)); } if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber)) { memset(ShmSysConfigAndInfo->SysConfig.SerialNumber, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SerialNumber)); } if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) > ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId)) { memset(ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.SystemId)); } if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0xff) { DEBUG_INFO("Ethernet dhcp config is null.\n"); } if(strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) == 0x00) { DEBUG_INFO("Model name over length.\n"); } if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SerialNumber) == 0x00) { DEBUG_INFO("Model serial number over length.\n"); } if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) == 0x00) { DEBUG_INFO("SystemId over length.\n"); } system("cd /root;./Module_FactoryConfig -m"); sleep(3); system("/usr/bin/run_evse_restart.sh"); } DEBUG_INFO("Load SysConfigData OK\n"); 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 /sys/class/gpio/export", pin); system(buffer); } void gpio_unexport(int pin) { char buffer[64]; snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/unexport", pin); system(buffer); } void gpio_set_direction(int pin, unsigned char dir) { /* char buffer[64]; snprintf(buffer, sizeof(buffer), "echo %s > /sys/class/gpio/gpio%d/direction", dir == GPIO_DIR_INPUT ? "in" : "out", pin); system(buffer); */ int fd; char buffer[64]; snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/direction", pin); fd = open(buffer, O_WRONLY); if (fd < 0) { gpio_export(pin); fd = open(buffer, O_WRONLY); if(fd < 0) { printf("\r\nFailed to open gpio%d direction for writing!", pin); return; } } write(fd, dir == GPIO_DIR_INPUT ? "in" : "out", dir == GPIO_DIR_INPUT ? 2 : 3); close(fd); } void gpio_write(int pin, unsigned char value) { char buffer[64]; snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/gpio%d/value", value > 0 ? 1 : 0, pin); system(buffer); } int gpio_read(int pin) { int fd, value = 0; char ch; char buffer[64]; snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/value", pin); fd = open(buffer, O_RDONLY); if (fd < 0) { return -1; } if (read(fd, &ch, 4) < 0) { return -1; } value = atoi(&ch); close(fd); return value; } void InitIO(void) { printf("GPIO INIT \n"); /* GPMC_AD8 => GPIO0_22 *//*ID BD1_1*/ gpio_set_direction(PIN_ID_BD1_1, GPIO_DIR_OUTPUT); gpio_write(PIN_ID_BD1_1, 0); /* GPMC_AD9 => GPIO0_23 *//*ID BD1_2*/ gpio_set_direction(PIN_ID_BD1_2, GPIO_DIR_OUTPUT); gpio_write(PIN_ID_BD1_2, 0); /* GPMC_AD10 => GPIO0_26 *//*IO BD1_1*/ gpio_set_direction(PIN_IO_BD1_1, GPIO_DIR_OUTPUT); gpio_write(PIN_IO_BD1_1, 0); /* GPMC_AD11 => GPIO0_27 *//*IO BD1_2*/ //gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_OUTPUT); //gpio_write(PIN_IO_BD1_2, 0); /* GPMC_AD12 => GPIO1_12 *//*ID BD2_1*/ gpio_set_direction(PIN_ID_BD2_1, GPIO_DIR_OUTPUT); gpio_write(PIN_ID_BD2_1, 0); /* GPMC_AD13 => GPIO1_13 *//*ID BD2_2*/ gpio_set_direction(PIN_ID_BD2_2, GPIO_DIR_OUTPUT); gpio_write(PIN_ID_BD2_2, 0); /* GPMC_AD14 => GPIO1_14 *//*IO BD2_1*/ gpio_set_direction(PIN_IO_BD2_1, GPIO_DIR_OUTPUT); gpio_write(PIN_IO_BD2_1, 0); /* GPMC_AD15 => GPIO1_15 *//*IO BD2_2*/ gpio_set_direction(PIN_IO_BD2_2, GPIO_DIR_OUTPUT); gpio_write(PIN_IO_BD2_2, 0); /*XDMA_EVENT_INTR0 => GPIO0_19 *//*AM_RFID_RST*/ gpio_set_direction(PIN_AM_RFID_RST, GPIO_DIR_OUTPUT); gpio_write(PIN_AM_RFID_RST, 0); /*XDMA_EVENT_INTR1 => GPIO0_20 *//*AM_RFID_ICC*/ gpio_set_direction(PIN_AM_RFID_ICC, GPIO_DIR_OUTPUT); gpio_write(PIN_AM_RFID_ICC, 0); gpio_set_direction(PIN_BOARD1_PROXIMITY, GPIO_DIR_INPUT); gpio_set_direction(PIN_BOARD2_PROXIMITY, GPIO_DIR_INPUT); /* GPIO3_15 */ /*ENG_BNT_DET*/ gpio_set_direction(PIN_ENG_BNT, GPIO_DIR_INPUT); gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_INPUT); #if 0 if(gpio_read(PIN_AM_RFID_RST) == 1) { printf("PIN_AM_RFID_RST Test OK\n"); }else { printf("PIN_AM_RFID_RST Low Test 0\n"); } if(gpio_read(PIN_AM_RFID_ICC) == 1) { printf("PIN_AM_RFID_ICC Test OK\n"); }else { printf("PIN_AM_RFID_ICC Low Test 0\n"); } #endif } // ADC int adc_read(int adc_port) { int fd, value = 0; char ch[5]; char buffer[64]; snprintf(buffer,sizeof(buffer), "/sys/bus/iio/devices/iio\:device0/in_voltage%d_raw", adc_port); fd = open(buffer, O_RDONLY); if(fd < 0) { return -1; } if(read(fd, ch, 4) < 0) { return -1; } value = atoi(ch); printf("\r\nAIN%d = %d",adc_port,value); close(fd); return value; } void DoIOTest(void) { int ADC_Value=0; #if 1 if(gpio_read(PIN_ID_BD1_1) == 1) { printf("\r\nPIN_ID_BD1_1 HIGH"); } usleep(5000); if(gpio_read(PIN_IO_BD1_1) == 1) { printf("\r\nPIN_IO_BD1_1 HIGH"); } usleep(5000); if(gpio_read(PIN_ID_BD2_1) == 1) { printf("\r\nPIN_ID_BD2_1 HIGH"); } if(gpio_read(PIN_AM_RFID_RST) == 1) { printf("\r\PIN_AM_RFID_RST HIGH"); } usleep(5000); if(gpio_read(PIN_AM_RFID_ICC) == 1) { printf("\r\PIN_AM_RFID_ICC HIGH"); } usleep(5000); if(gpio_read(PIN_IO_BD2_2) == 1) { printf("\r\PIN_IO_BD2_2 HIGH"); } #endif usleep(5000); if(gpio_read(PIN_IO_BD2_1) == 1) { printf("\r\PIN_IO_BD2_1 HIGH"); } if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) { printf("\r\nRelay1 CLOSE OK"); } if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) { printf("\r\nRelay2 CLOSE OK"); } if(gpio_read(PIN_ENG_BNT) == 0) { printf("\r\nRelay3 CLOSE OK"); } if(gpio_read(PIN_IO_BD1_2) == 0) { printf("\r\nRelay4 CLOSE OK"); } ADC_Value=adc_read(ADC_Index); printf("\r\nAIN%d = %d",ADC_Index,ADC_Value); ADC_Index++; if(ADC_Index>=4) ADC_Index=0; #if 0 for(ADC_Index=0;ADC_Index<4;ADC_Index++) { ADC_Value=adc_read(ADC_Index); printf("\r\nAIN%d = %d",ADC_Index,ADC_Value); usleep(10000); } //usleep(100000); if(adc_read(ADC_AIN0) < 100 && adc_read(ADC_AIN1) < 100 && adc_read(ADC_AIN2) < 100 && adc_read(ADC_AIN3) < 100) { gpio_write(PIN_AM_RFID_ICC, 0); usleep(100000); if(adc_read(ADC_AIN0) > 4000 && adc_read(ADC_AIN1) > 4000 && adc_read(ADC_AIN2) > 4000 && adc_read(ADC_AIN3) > 4000) { printf("\r\nAIN0, AIN1, AIN2, AIN3 Test OK"); } else { printf("\r\nAIN0, AIN1, AIN2, AIN3 High Test Fail"); return; } } else { printf("\r\nAIN0, AIN1, AIN2, AIN3 Low Test Fail"); return; } gpio_write(PIN_AM_OK_FLAG, 1); #endif printf("\r\nIO Test Done!"); printf("\r\nSuccess!\r\n"); } void InitEthernet() { pid_t pid; uint8_t cnt_pingDNS_Fail; char tmpbuf[256]; //Init Eth0 for internet memset(tmpbuf,0,256); strcpy(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,"192.168.2.21"); strcpy(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress,"255.255.255.0"); sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &", ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress, ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress); DEBUG_INFO("eth0 config as ip: %s, netmask: %s\n", 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); system("ifconfig lo up &"); system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &"); //system("/sbin/ethtool -s eth0 speed 10 duplex full autoneg off"); //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) { sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId); system(tmpbuf); } // Upgrade system id to /etc/hostname sprintf(tmpbuf, "echo %s > /etc/hostname", ShmSysConfigAndInfo->SysConfig.SystemId); system(tmpbuf); // Ethernet MAC address getEth0MacAddress(); //check internet status pid = fork(); if(pid == 0) { for(;;) { if(isRouteFail()) { //DEBUG_ERROR("eth0 not in route, restart eth0.\n"); system("/sbin/ifconfig eth0 down;/sbin/ifconfig eth0 up"); if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0)) { system("pgrep -f \"udhcpc -i eth0\" | xargs kill"); sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId); system(tmpbuf); } else { system("pgrep -f \"udhcpc -i eth0\" | xargs kill"); 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(isReachableInternet() == PASS) { ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=OFF; cnt_pingDNS_Fail = 0; } else { if(cnt_pingDNS_Fail >= 3) { ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=ON; if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0)) { system("pgrep -f \"udhcpc -i eth0\" | xargs kill"); sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId); system(tmpbuf); } else { system("pgrep -f \"udhcpc -i eth0\" | xargs kill"); 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); } cnt_pingDNS_Fail = 0; } else { cnt_pingDNS_Fail++; } } if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet && ((ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == 0) || ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi) && ((ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled == 0) || ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi)) { ShmSysConfigAndInfo->SysInfo.InternetConn = OFF; } else { ShmSysConfigAndInfo->SysInfo.InternetConn = ON; } //============================================================ // Priority for internet 0 : First / 1 : Second / 2: Third //============================================================ if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet) { system("/sbin/ifmetric eth0 0"); if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric mlan0 1"); } if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric ppp0 2"); } } else if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi) { if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric eth0 1"); system("/sbin/ifmetric mlan0 0"); } if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric ppp0 2"); } } else if(!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi) { if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric mlan0 2"); } if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')) { system("/sbin/ifmetric eth0 1"); system("/sbin/ifmetric ppp0 0"); } } else {} sleep(5); } } DEBUG_INFO("Initial Ethernet OK\n"); } int InitWatchDog() { int fd; int timeout = 330; system("/usr/bin/fuser -k /dev/watchdog"); sleep(1); system("echo V > /dev/watchdog"); sleep(1); fd=open("/dev/watchdog", O_RDWR); if(fd<=0) { DEBUG_ERROR("System watch dog initial fail.\n"); } ioctl(fd, _IOWR('W', 6, int), &timeout); return fd; } int InitCanBus() { int s0,nbytes; struct timeval tv; struct ifreq ifr0; struct sockaddr_can addr0; system("/sbin/ip link set can1 down"); system("/sbin/ip link set can1 type can bitrate 250000 restart-ms 100"); system("/sbin/ip link set can1 up"); s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW); tv.tv_sec = 0; tv.tv_usec = 10000; if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0) { DEBUG_ERROR("Set SO_RCVTIMEO NG"); } nbytes=40960; if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0) { DEBUG_ERROR("Set SO_RCVBUF NG"); } nbytes=40960; if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0) { DEBUG_ERROR("Set SO_SNDBUF NG"); } strcpy(ifr0.ifr_name, "can1" ); ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */ addr0.can_family = AF_CAN; addr0.can_ifindex = ifr0.ifr_ifindex; bind(s0, (struct sockaddr *)&addr0, sizeof(addr0)); return s0; } int Initialization() { int result = PASS; InitEthernet(); if((wtdFd = InitWatchDog()) == FAIL) { DEBUG_ERROR("Watchdog initial fail.\n"); result = FAIL; } #if 0 CanFd = InitCanBus(); if(result == PASS) DEBUG_INFO("Initialization OK.\n"); else DEBUG_INFO("Initialization Fail.\n"); #endif InitIO(); return result; } //===================================================== // System 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_COMPLETE: result = "complete"; 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; case SYS_MODE_UPDATE: result = "upgrade"; break; case SYS_MODE_BATTERY_CHARGE: result = "battery charging"; break; case SYS_MODE_BATTERY_DISCHARGE: result = "battery discharging"; break; case SYS_MODE_BATTERY_ALARM: result = "battery alarm"; break; default: result = "unknown"; break; } return result; } void setChargerMode(unsigned char mode) { ShmEMSSInfo->PreviousSystemStatus = ShmEMSSInfo->SystemStatus; ShmEMSSInfo->SystemStatus = mode; //DEBUG_INFO("System mode switch from %s to %s\n", getSystemModeName(ShmBatteryInfo->PreviousSystemStatus), getSystemModeName(ShmBatteryInfo->SystemStatus)); printf("System mode switch from %s to %s\n", getSystemModeName(ShmEMSSInfo->PreviousSystemStatus), getSystemModeName(ShmEMSSInfo->SystemStatus)); } unsigned char isMode(unsigned char mode) { return ((ShmEMSSInfo->SystemStatus == mode)?YES:NO); } unsigned char isModeChange() { unsigned char result = NO; if(!isMode(ShmEMSSInfo->PreviousSystemStatus)) { result = YES; ShmEMSSInfo->PreviousSystemStatus = ShmEMSSInfo->SystemStatus; } return result; } //========================================== // Check routine //========================================== void checkTask() { /* * TODO: * 1. What task main need to monitor */ if((system("pidof -s Module_Dispenser > /dev/null") != 0)) { DEBUG_INFO("Module_Dispenser not running, restart it.\n"); //system ("/root/Module_Dispenser &"); } } int SpawnTask() { system("/root/EMSS_BMSComm &"); system("/root/EMSS_InternalComm &"); //system("/root/Module_EvComm &"); //system("/root/Module_LcmControl &"); //system("/root/Module_InternalComm &"); //system("/root/Module_PsuComm &"); return PASS; } void KillTask() { system("killall EMSS_BMSComm"); system("killall EMSS_InternalComm"); //system("killall Module_EvComm"); //system("killall Module_LcmControl"); //system("killall Module_InternalComm"); } void AllRelay_OFF() { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; } //====================================================== // Main process //====================================================== int main(void) { //================================================== // Create all share memory //================================================== if(CreatShareMemory() == FAIL) { DEBUG_ERROR("Create ShareMemory NG\n"); if(ShmStatusCodeData != NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } else { //LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig); //DEBUG_INFO("Create ShareMemory OK\n"); printf("Create ShareMemory OK\n"); } printf("Initializing. \n"); if(Initialization() != PASS) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = ON; } printf("Spawn all Task. \n"); SpawnTask(); //================================================== // Main loop //================================================== for(;;) { //============================================== // Period check for 10 seconds //============================================== if(getDiffSecNow(timerStartTime[TMR_IDX_CHECK_TASK]) > 10) { //============================================== // Check task processing //============================================== if(ShmEMSSInfo->SystemStatus != SYS_MODE_BOOTING) checkTask(); refreshStartTimer(&timerStartTime[TMR_IDX_CHECK_TASK]); } //============================================== // State machine loop //============================================== switch(ShmEMSSInfo->SystemStatus) { case SYS_MODE_BOOTING: //if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("BOOKING MODE \r\n"); } setChargerMode(SYS_MODE_PREPARING); refreshStartTimer(&timerStartTime[BMS_PREPARING_TASK]); break; case SYS_MODE_PREPARING: if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("PREPARING MODE \r\n"); } #if 1 if(getDiffSecNow(timerStartTime[BMS_PREPARING_TASK]) > 10) { if(ShmBatteryInfo->AlarmInfo.AlarmValue==0) { if(ShmBatteryInfo->RelayInfo.RelayValue==0 ) ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1; ShmEMSSInfo->BATStatus = POLLING_STEP_0; ShmEMSSInfo->ATOD1Status = POLLING_STEP_0; ShmEMSSInfo->ATOD2Status = POLLING_STEP_0; setChargerMode(SYS_MODE_IDLE); }else { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; #if 1 if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; #else if(gpio_read(PIN_IO_BD1_2) == 1) { usleep(100000); Relay4_on; usleep(1000000); ACTODC_Start_charging; } #endif if(ShmBatteryInfo->RelayInfo.RelayValue==1) ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; if(ShmBatteryInfo->RelayInfo.RelayValue==2) ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1; ShmEMSSInfo->ATOD1Status = POLLING_STEP_0; ShmEMSSInfo->ATOD2Status = POLLING_STEP_0; setChargerMode(SYS_MODE_BATTERY_ALARM); } } #else setChargerMode(SYS_MODE_IDLE); #endif break; case SYS_MODE_IDLE: { if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("IDLE MODE \r\n"); } #if 1 if(ShmBatteryInfo->SOC>=1 && ShmBatteryInfo->SOC<=10 && ShmBatteryInfo->AlarmInfo.AlarmValue==0 && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \ (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \ (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && \ (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) ) { AllRelay_OFF(); if(ShmBatteryInfo->RelayInfo.RelayValue==2) ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1; ShmEMSSInfo->BATStatus = POLLING_STEP_0; setChargerMode(SYS_MODE_BATTERY_CHARGE); break; }else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ) && ShmBatteryInfo->AlarmInfo.AlarmValue==0) { if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; if(ShmBatteryInfo->RelayInfo.RelayValue!=0x2) { //ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1; } //ShmEMSSInfo->BATStatus = POLLING_STEP_1; //refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); }else if( (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Authorizing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Authorizing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Fault) && (ShmBatteryInfo->AlarmInfo.AlarmValue!=0) ) { //printf("battery alarm MODE 1 \n"); if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; #if 1 if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; #else if(gpio_read(PIN_IO_BD1_2) == 1) { usleep(100000); Relay4_on; usleep(1000000); ACTODC_Start_charging; } #endif if(ShmBatteryInfo->RelayInfo.RelayValue==1) ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; if(ShmBatteryInfo->RelayInfo.RelayValue==2) ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1; ShmEMSSInfo->ATOD1Status = POLLING_STEP_0; ShmEMSSInfo->ATOD2Status = POLLING_STEP_0; setChargerMode(SYS_MODE_BATTERY_ALARM); } if( ShmBatteryInfo->SOC <= 10 && ShmBatteryInfo->AlarmInfo.AlarmValue==0) { //AllRelay_OFF(); if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; if(ShmBatteryInfo->RelayInfo.RelayValue==1) ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; if(ShmBatteryInfo->RelayInfo.RelayValue==2) ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1; //ShmEMSSInfo->BATStatus = POLLING_STEP_1; //refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); } /*if(ShmEMSSInfo->BATStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_BATDIS_TASK]) > 1) //BATTERY Discharging { if(ShmBatteryInfo->RelayInfo.RelayValue==0 ) { ShmBatteryInfo->packActionCmd.packAction.bits.Relay2On = 1; refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); }else if(ShmBatteryInfo->RelayInfo.RelayValue==0x2) { ShmEMSSInfo->BATStatus = POLLING_STEP_2; refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); } if(ShmBatteryInfo->AlarmInfo.AlarmValue!=0) { ShmEMSSInfo->BATStatus = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_BATDIS_TASK]) > 1) { if(ShmBatteryInfo->SOC <= 10 || ShmBatteryInfo->AlarmInfo.AlarmValue==0) { if(ShmBatteryInfo->RelayInfo.RelayValue!=0) { ShmBatteryInfo->packActionCmd.packAction.bits.Relay2Off = 1; }else { ShmEMSSInfo->BATStatus = POLLING_STEP_0; } } if(ShmBatteryInfo->AlarmInfo.AlarmValue!=0) { ShmEMSSInfo->BATStatus = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_BATDIS_TASK]); }*/ if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing && /*(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus < ChargerSystemStatus_Preparing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && \ */ ShmEMSSInfo->ATOD1Status == POLLING_STEP_0 ) { if(gpio_read(PIN_BOARD1_PROXIMITY) == 1) Relay1_on; //if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) //Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; ShmEMSSInfo->ATOD1Status = POLLING_STEP_1; refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) { ShmEMSSInfo->ATOD1Status = POLLING_STEP_2; }else { Relay1_on; } refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) { ShmEMSSInfo->ATOD1Status = POLLING_STEP_3; } refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) { Relay1_off; }else { ShmEMSSInfo->ATOD1Status = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); } if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing && ShmEMSSInfo->ATOD2Status == POLLING_STEP_0 ) { //if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) //Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 1) Relay2_on; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; if(gpio_read(PIN_IO_BD1_2) == 0) Relay4_off; ShmEMSSInfo->ATOD2Status = POLLING_STEP_1; refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) { ShmEMSSInfo->ATOD2Status = POLLING_STEP_2; }else { Relay2_on; } refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) { ShmEMSSInfo->ATOD2Status = POLLING_STEP_3; } refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) { Relay2_off; }else { ShmEMSSInfo->ATOD2Status = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); } #else if(getDiffSecNow(timerStartTime[EMSS_TEST_TASK]) > 2) { DoIOTest(); //for test refreshStartTimer(&timerStartTime[EMSS_TEST_TASK]); } #endif } break; case SYS_MODE_BATTERY_CHARGE: { if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("SYS_MODE_BATTERY_CHARGE MODE \r\n"); } if(ShmEMSSInfo->BATStatus == POLLING_STEP_0) { if(ShmBatteryInfo->RelayInfo.RelayValue==0 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1) { ShmBatteryInfo->packActionCmd.packAction.bits.Relay1On = 1; }else if(ShmBatteryInfo->RelayInfo.RelayValue==1 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 2) { if(gpio_read(PIN_ENG_BNT) == 1) { Relay3_on; }else { ShmEMSSInfo->BATStatus = POLLING_STEP_1; } } refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]); }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 2) { Battery_Start_charging; ShmEMSSInfo->BATStatus = POLLING_STEP_2; refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]); }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1) { if(ShmBatteryInfo->SOC >=90 || ShmBatteryInfo->AlarmInfo.AlarmValue!=0) { ShmEMSSInfo->BATStatus = POLLING_STEP_3; Battery_Stop_charging; } refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]); }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1) { if(ShmBatteryInfo->RelayInfo.RelayValue==1 ) { ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; }else { ShmEMSSInfo->BATStatus = POLLING_STEP_END; } refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]); }else if(ShmEMSSInfo->BATStatus == POLLING_STEP_END && getDiffSecNow(timerStartTime[BMS_Relay3_TASK]) > 1) { if(gpio_read(PIN_ENG_BNT) == 0) { Relay3_off; }else { ShmEMSSInfo->BATStatus = POLLING_STEP_0; setChargerMode(SYS_MODE_PREPARING); } refreshStartTimer(&timerStartTime[BMS_Relay3_TASK]); } if(ShmBatteryInfo->AlarmInfo.AlarmValue != 0 || ShmEMSSInfo->AlarmInfo.bits.isTransmissionFailure==1) { Battery_Stop_charging; usleep(1000000); Relay3_off; usleep(1000000); if(ShmBatteryInfo->RelayInfo.RelayValue==1 ) { ShmBatteryInfo->packActionCmd.packAction.bits.Relay1Off = 1; } setChargerMode(SYS_MODE_PREPARING); } } break; case SYS_MODE_BATTERY_ALARM: { if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("SYS_MODE_BATTERY_ALARM MODE \r\n"); } //printf("SYS_MODE_BATTERY_ALARM MODE 1 \n"); #if 1 if( ShmBatteryInfo->AlarmInfo.AlarmValue==0 && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <=ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >=ChargerSystemStatus_Terminating) ) { setChargerMode(SYS_MODE_PREPARING); } if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus == ChargerSystemStatus_Preparing && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && ShmEMSSInfo->ATOD1Status == POLLING_STEP_0 ) { #if 0 if(gpio_read(PIN_IO_BD1_2) == 0) { ACTODC_Stop_charging; usleep(1000000); Relay4_off; } usleep(1000000); #endif if(gpio_read(PIN_BOARD1_PROXIMITY) == 1) { Relay1_on; printf("Relay1 ON \r\n"); } //if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) //Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; ShmEMSSInfo->ATOD1Status = POLLING_STEP_1; refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) { ShmEMSSInfo->ATOD1Status = POLLING_STEP_2; }else { Relay1_on; } refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) { ShmEMSSInfo->ATOD1Status = POLLING_STEP_3; } refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); }else if(ShmEMSSInfo->ATOD1Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay1_TASK]) > 1) { #if 1 Relay1_off; #else if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) { Relay1_off; }else { ShmEMSSInfo->ATOD1Status = POLLING_STEP_0; if(gpio_read(PIN_BOARD2_PROXIMITY) == 1) { Relay4_on; usleep(1000000); ACTODC_Start_charging; } } #endif refreshStartTimer(&timerStartTime[BMS_Relay1_TASK]); } printf("GUN 2 %d \r\n",ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus); if( ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus == ChargerSystemStatus_Preparing && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Alarm) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Alarm) && ShmEMSSInfo->ATOD2Status == POLLING_STEP_0 ) { #if 0 if(gpio_read(PIN_IO_BD1_2) == 0) { ACTODC_Stop_charging; usleep(1000000); Relay4_off; } usleep(1000000); #endif //if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) //Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 1) { Relay2_on; printf("Relay 2 on \r\n"); } if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; ShmEMSSInfo->ATOD2Status = POLLING_STEP_1; refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) { ShmEMSSInfo->ATOD2Status = POLLING_STEP_2; }else { Relay2_on; } refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) { ShmEMSSInfo->ATOD2Status = POLLING_STEP_3; } refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); }else if(ShmEMSSInfo->ATOD2Status == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay2_TASK]) > 1) { #if 1 Relay2_off; #else if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) { Relay2_off; }else { ShmEMSSInfo->ATOD2Status = POLLING_STEP_0; if(gpio_read(PIN_BOARD1_PROXIMITY) == 1) { Relay4_on; usleep(1000000); ACTODC_Start_charging; } } #endif refreshStartTimer(&timerStartTime[BMS_Relay2_TASK]); } #if 0 if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus==ChargerSystemStatus_Preparing ) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && ShmEMSSInfo->DTODStatus == POLLING_STEP_0) { if(gpio_read(PIN_BOARD1_PROXIMITY) == 0) Relay1_off; if(gpio_read(PIN_BOARD2_PROXIMITY) == 0) Relay2_off; if(gpio_read(PIN_ENG_BNT) == 0) Relay3_off; if(gpio_read(PIN_IO_BD1_2) == 1) { usleep(1000000); Relay4_on; usleep(1000000); ACTODC_Start_charging; } ShmEMSSInfo->DTODStatus = POLLING_STEP_1; refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]); }else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_1 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1) { if(gpio_read(PIN_IO_BD1_2) == 0) { ShmEMSSInfo->DTODStatus = POLLING_STEP_2; }else { Relay4_on; } refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]); }else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_2 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1) { if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[2].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[0].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[3].GeneralChargingData.SystemStatus <= ChargerSystemStatus_Idle || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[1].GeneralChargingData.SystemStatus >= ChargerSystemStatus_Terminating) ) { //ACTODC_Stop_charging; ShmEMSSInfo->DTODStatus = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]); }/*else if(ShmEMSSInfo->DTODStatus == POLLING_STEP_3 && getDiffSecNow(timerStartTime[BMS_Relay4_TASK]) > 1) { if(gpio_read(PIN_IO_BD1_2) == 1) { ShmEMSSInfo->DTODStatus = POLLING_STEP_0; } refreshStartTimer(&timerStartTime[BMS_Relay4_TASK]); }*/ #endif #endif } break; case SYS_MODE_FAULT: if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("FAULT MODE"); } /* * TODO: * 1. Run some thing here */ break; case SYS_MODE_UPDATE: if(isModeChange()) { /* * TODO: * 1. Only run one time, if previous system mode is different */ printf("UPDATE MODE"); } /* * TODO: * 1. Run some thing here */ break; default: break; } // System watch dog feed write(wtdFd, "a", 1); usleep(50000); } return FAIL; }