#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "define.h" #include "main.h" #include "Module_InternalComm.h" //#define SIMULATION #define FAIL_SPEC_COMM 100 #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0])) #define PASS 1 #define FAIL 0 #define ON 1 #define OFF 0 #define PRIORITY_HIGH 0 #define PRIORITY_LOW 1 struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; struct PrimaryMcuData *ShmPrimaryMcuData; struct OCPP16Data *ShmOCPP16Data; struct Charger *ShmCharger; uint16_t stepIndex=21, logIndex; long long tsLast, tsNow, tsPrintLog[2]; uint64_t tmpPowerConsumption; uint64_t tmpL1PowerConsumption; uint64_t tmpL2PowerConsumption; uint64_t tmpL3PowerConsumption; 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 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]Module_InterCommLog", 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; } 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; } long long current_timestamp() { struct timeval te; gettimeofday(&te, NULL); // get current time long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds return milliseconds; } //================================= // 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); } } //========================================== // Init all share memory //========================================== int InitShareMemory() { int result = PASS; int MeterSMId; //Initial ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n"); #endif result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("[shmat ShmSysConfigAndInfo NG\n"); #endif result = FAIL; } //Initial ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("shmget ShmStatusCodeData NG\n"); #endif result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("shmat ShmStatusCodeData NG\n"); #endif result = FAIL; } //Initial ShmPrimaryMcuKey if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("shmget ShmPrimaryMcuData NG\n"); #endif result = FAIL; } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("shmat ShmPrimaryMcuData NG\n"); #endif result = FAIL; } //creat ShmOCPP16Data if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("shmget ShmOCPP16Data NG"); #endif result = FAIL; } else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("shmat ShmOCPP16Data NG"); #endif result = FAIL; } else {} //Initial ShmCharger if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("shmget ShmChargerKey NG\n"); #endif result = FAIL; } else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("shmat ShmChargerKey NG\n"); #endif result = FAIL; } return result; } int InitComPort() { int fd; struct termios tios; fd = open("/dev/ttyS1", O_RDWR); if(fd<=0) { #ifdef SystemLogMessage DEBUG_ERROR("open /dev/ttyS1 NG\n"); #endif return -1; } ioctl (fd, TCGETS, &tios); tios.c_cflag = B115200| 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)5; // timeout 0.5 secod tios.c_lflag=0; tcflush(fd, TCIFLUSH); ioctl (fd, TCSETS, &tios); return fd; } void ack_delay(unsigned char cmd) { switch(cmd) { case CMD_UPDATE_START: case CMD_UPDATE_END: usleep(300000); break; case CMD_QUERY_PTB_METER_MESSAGE: usleep(500000); break; default: usleep(100000); break; } } int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx) { int len; tcflush(fd,TCIOFLUSH); if(write(fd, cmd, cmd_len) >= cmd_len) { ack_delay(cmd[3]); len = read(fd, rx, 2048); } else { #ifdef SystemLogMessage DEBUG_ERROR("Serial command %s response fail.\n", cmd); #endif } return len; } unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_FW_VER, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { strncpy(Ret_Buf->Version_FW, (char *)rx+6, (rx[4] | rx[5]<<8)); result = PASS; } } return result; } unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_HW_VER, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { strncpy(Ret_Buf->Version_HW, (char *)rx+6, (rx[4] | rx[5]<<8)); result = PASS; } } return result; } unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_INPUTVOLTAGE, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->inputType = rx[6]; Ret_Buf->L1N_L12 =( rx[7] | (rx[8]<<8))/10.0; if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf->L2N_L23 =( rx[9] | (rx[10]<<8))/10.0; Ret_Buf->L3N_L31 =( rx[11] | (rx[12]<<8))/10.0; } result = PASS; } } return result; } unsigned char Query_Present_OutputVoltage(unsigned char fd, unsigned char targetAddr, PresentOutputVoltage *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_OUTPUTVOLTAGE, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->behindFuse_Voltage_C1 =(rx[6] | (rx[7]<<8))/10.0; Ret_Buf->behindRelay_Voltage_C1 =(rx[8] | (rx[9]<<8))/10.0; if((rx[4] | rx[5]<<8) > 4) { Ret_Buf->behindFuse_Voltage_C2 =(rx[10] | (rx[11]<<8))/10.0; Ret_Buf->behindRelay_Voltage_C2 =(rx[12] | (rx[13]<<8))/10.0; } result = PASS; } } return result; } unsigned char Query_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_FAN_SPEED, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { for(int idx=0;idx<((rx[4] | rx[5]<<8)>>1);idx++) Ret_Buf->speed[idx] =(rx[6+(2*idx)] | (rx[6+(2*idx)+1]<<8)); result = PASS; } } return result; } unsigned char Query_Temperature(unsigned char fd, unsigned char targetAddr, Temperature *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_TEMPERATURE, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) Ret_Buf->point[idx] = rx[6+idx] - 60; result = PASS; } } return result; } unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targetAddr, AuxPower *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AUX_POWERVOLTAGE, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) Ret_Buf->voltage[idx] = rx[6+idx]; result = PASS; } } return result; } unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_RELAY_OUTPUT, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { for(int idx_connector=0;idx_connector<(rx[4] | rx[5]<<8);idx_connector++) { for(int idx=0;idx<8;idx++) Ret_Buf->relay_status[idx_connector][idx] = (rx[6+idx_connector]>>idx) & 0x01; } result = PASS; } } return result; } unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GFD_ADC, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { for(int idx_connector=0;idx_connector<((rx[4] | rx[5]<<8)>>2);idx_connector++) { Ret_Buf->adc_value_positive[idx_connector] = (rx[6+(4*idx_connector)] | rx[6+(4*idx_connector)+1]<<8); Ret_Buf->adc_value_negative[idx_connector] = (rx[6+(4*idx_connector)+2] | rx[6+(4*idx_connector)+3]<<8);; } result = PASS; } } return result; } unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GPIO_INPUT, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->AC_Connector = (rx[6] >> 0) & 0x01; Ret_Buf->AC_MainBreaker = (rx[6] >> 1) & 0x01; Ret_Buf->SPD = (rx[6] >> 2) & 0x01; Ret_Buf->Door_Open = (rx[6] >> 3) & 0x01; Ret_Buf->GFD[0] = (rx[6] >> 4) & 0x01; Ret_Buf->GFD[1] = (rx[6] >> 5) & 0x01; Ret_Buf->Button[0] = (rx[6] >> 6) & 0x01; Ret_Buf->Button[1] = (rx[6] >> 7) & 0x01; Ret_Buf->Button_Emergency = (rx[7] >> 0) & 0x01; Ret_Buf->Button_Mode_Switch = (rx[7] >> 7) & 0x01; result = PASS; } } return result; } unsigned char Query_Alarm_Log(unsigned char fd, unsigned char targetAddr, Alarm_Log *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[10] = {0xaa, 0x00, targetAddr, CMD_QUERY_ALARM_LOG, 0x03, 0x00, Ret_Buf->logArea, Ret_Buf->alarmIndex&0xff, ((Ret_Buf->alarmIndex>>8)&0xff), 0x00}; unsigned char rx[512]; unsigned char chksum = Ret_Buf->logArea ^ (Ret_Buf->alarmIndex&0xff) ^ ((Ret_Buf->alarmIndex>>8)&0xff); unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { memcpy(&Ret_Buf->log[0], &rx[8], 8); result = PASS; } } return result; } unsigned char Query_RTC(unsigned char fd, unsigned char targetAddr, Rtc *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_RTC, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->year = ((rx[6]-'0')*1000) + ((rx[7]-'0')*100) + ((rx[8]-'0')*10) + ((rx[9]-'0')*1); Ret_Buf->month = ((rx[10]-'0')*10) + ((rx[11]-'0')*1); Ret_Buf->day = ((rx[12]-'0')*10) + ((rx[13]-'0')*1); Ret_Buf->hour = ((rx[14]-'0')*10) + ((rx[15]-'0')*1); Ret_Buf->min = ((rx[16]-'0')*10) + ((rx[17]-'0')*1); Ret_Buf->sec = ((rx[18]-'0')*10) + ((rx[19]-'0')*1); result = PASS; } } return result; } unsigned char Query_AC_MCU_Status(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AC_STATUS, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->cp_state = rx[6]; Ret_Buf->current_limit = rx[7] | (rx[8]<<0x08); Ret_Buf->cp_voltage_positive = (rx[9] | (rx[10]<<0x08))/100.0; Ret_Buf->cp_voltage_negtive = (rx[11] | (rx[12]<<0x08))/100.0; Ret_Buf->locker_state = rx[13]; Ret_Buf->relay_state = rx[14]; Ret_Buf->shutter_state = rx[15]; Ret_Buf->meter_state = rx[16]; Ret_Buf->pp_state = rx[17]; Ret_Buf->rating_current = rx[18]; Ret_Buf->rotatory_switch = (rx[19] & 0x0F); Ret_Buf->socket_e.isSocketEMode = (rx[20] & 0x01); Ret_Buf->socket_e.isSocketEPinOn = ((rx[20]>>1) & 0x01); result = PASS; } } return result; } unsigned char Query_AC_MCU_Alarm(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Alarm *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AC_ALARM, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { //rx[6] Ret_Buf->bits.OVP_L1 = (((rx[6]>>0)&0x01)?1:0); Ret_Buf->bits.UVP_L1 = (((rx[6]>>1)&0x01)?1:0); Ret_Buf->bits.OCP_L1 = (((rx[6]>>2)&0x01)?1:0); Ret_Buf->bits.OTP = (((rx[6]>>3)&0x01)?1:0); Ret_Buf->bits.gmi_fault = (((rx[6]>>4)&0x01)?1:0); Ret_Buf->bits.cp_fault = (((rx[6]>>5)&0x01)?1:0); Ret_Buf->bits.ac_leak = (((rx[6]>>6)&0x01)?1:0); Ret_Buf->bits.dc_leak = (((rx[6]>>7)&0x01)?1:0); //rx[7] Ret_Buf->bits.mcu_selftest_fail = (((rx[7]>>0)&0x01)?1:0); Ret_Buf->bits.handshaking_timeout = (((rx[7]>>1)&0x01)?1:0); Ret_Buf->bits.emergency_stop = (((rx[7]>>2)&0x01)?1:0); Ret_Buf->bits.relay_welding = (((rx[7]>>3)&0x01)?1:0); Ret_Buf->bits.leak_module_fail = (((rx[7]>>4)&0x01)?1:0); Ret_Buf->bits.shutter_fault = (((rx[7]>>5)&0x01)?1:0); Ret_Buf->bits.locker_fault = (((rx[7]>>6)&0x01)?1:0); Ret_Buf->bits.power_drop = (((rx[7]>>7)&0x01)?1:0); //rx[8] bit 3 reserved Ret_Buf->bits.short_circuit_L1 = (((rx[8]>>0)&0x01)?1:0); Ret_Buf->bits.rotate_switch_fault = (((rx[8]>>1)&0x01)?1:0); Ret_Buf->bits.relay_drive_fault = (((rx[8]>>2)&0x01)?1:0); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf->bits.OVP_L2 = (((rx[8]>>4)&0x01)?1:0); Ret_Buf->bits.OVP_L3 = (((rx[8]>>5)&0x01)?1:0); Ret_Buf->bits.UVP_L2 = (((rx[8]>>6)&0x01)?1:0); Ret_Buf->bits.UVP_L3 = (((rx[8]>>7)&0x01)?1:0); } //rx[9] bits 6 & 7 Reserved if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf->bits.OCP_L2 = (((rx[9]>>0)&0x01)?1:0); Ret_Buf->bits.OCP_L3 = (((rx[9]>>1)&0x01)?1:0); Ret_Buf->bits.short_circuit_L2 = (((rx[9]>>2)&0x01)?1:0); Ret_Buf->bits.short_circuit_L3 = (((rx[9]>>3)&0x01)?1:0); } Ret_Buf->bits.meter_comm_timeout = (((rx[9]>>4)&0x01)?1:0); Ret_Buf->bits.meter_ic_comm_timeout = (((rx[9]>>5)&0x01)?1:0); Ret_Buf->bits.pilot_negative_error = (((rx[9]>>6)&0x01)?1:0); result = PASS; } } return result; } unsigned char Query_Present_OutputCurrent(unsigned char fd, unsigned char targetAddr, Presentoutputcurrent *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_OUTPUTCURRENT, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 0) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->L1N_L12[0] = (rx[6] | (rx[7]<<8))/10.0; if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf->L2N_L23[0] = (rx[8] | (rx[9]<<8))/10.0; Ret_Buf->L3N_L31[0] = (rx[10] | (rx[11]<<8))/10.0; } Ret_Buf->L1N_L12[1] = (rx[12] | (rx[13]<<8))/10.0; if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf->L2N_L23[1] = (rx[14] | (rx[15]<<8))/10.0; Ret_Buf->L3N_L31[1] = (rx[16] | (rx[17]<<8))/10.0; } result = PASS; } } return result; } unsigned char Query_Ble_Config(unsigned char fd, unsigned char targetAddr, Ble_Config_Data *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_BLE_CONFIG_DATA, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 0) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf->isLogin = (rx[6]?0x01:0x00); Ret_Buf->isRequestStart = (rx[7]?0x01:0x00); Ret_Buf->isRequestStop = (rx[8]?0x01:0x00); result = PASS; } } return result; } unsigned char Query_Ble_Central_ID(unsigned char fd, unsigned char targetAddr, Ble_Login_Central_Id *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_BLE_CENTRAL_ID, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 0) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { memset(Ret_Buf->id, 0x00, ARRAY_SIZE(Ret_Buf->id)); memcpy(&Ret_Buf->id[0], &rx[6], (rx[4] | (rx[5]<<8))); result = PASS; } } return result; } unsigned char Query_Power_Consumption(unsigned char fd, unsigned char targetAddr, Power_Consumption *Ret_Buf_T, Power_Consumption *Ret_Buf_L1, Power_Consumption *Ret_Buf_L2, Power_Consumption *Ret_Buf_L3) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_POWER_CONSUMPTION, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 0) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { #ifndef SIMULATION Ret_Buf_T-> power_consumption = ((uint64_t)rx[6] | (((uint64_t)rx[7])<<8) | (((uint64_t)rx[8])<<16) | (((uint64_t)rx[9])<<24) | (((uint64_t)rx[10])<<32) | (((uint64_t)rx[11])<<40) | (((uint64_t)rx[12])<<48) | (((uint64_t)rx[13])<<56)); Ret_Buf_L1-> power_consumption = ((uint64_t)rx[14] | (((uint64_t)rx[15])<<8) | (((uint64_t)rx[16])<<16) | (((uint64_t)rx[17])<<24) | (((uint64_t)rx[18])<<32) | (((uint64_t)rx[19])<<40) | (((uint64_t)rx[20])<<48) | (((uint64_t)rx[21])<<56)); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { Ret_Buf_L2-> power_consumption = ((uint64_t)rx[22] | (((uint64_t)rx[23])<<8) | (((uint64_t)rx[24])<<16) | (((uint64_t)rx[25])<<24) | (((uint64_t)rx[26])<<32) | (((uint64_t)rx[27])<<40) | (((uint64_t)rx[28])<<48) | (((uint64_t)rx[29])<<56)); Ret_Buf_L3-> power_consumption = ((uint64_t)rx[30] | (((uint64_t)rx[31])<<8) | (((uint64_t)rx[32])<<16) | (((uint64_t)rx[33])<<24) | (((uint64_t)rx[34])<<32) | (((uint64_t)rx[35])<<40) | (((uint64_t)rx[36])<<48) | (((uint64_t)rx[37])<<56)); } #else //SIMULATION tsNow = current_timestamp(); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { tmpPowerConsumption += ((uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0)) + (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL2*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL2)*((tsNow-tsLast)/360000.0)) + (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL3*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL3)*((tsNow-tsLast)/360000.0))); tmpL1PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0)); tmpL2PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL2*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL2)*((tsNow-tsLast)/360000.0)); tmpL3PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL3*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL3)*((tsNow-tsLast)/360000.0)); Ret_Buf_L1-> power_consumption = tmpL1PowerConsumption; Ret_Buf_L2-> power_consumption = tmpL2PowerConsumption; Ret_Buf_L3-> power_consumption = tmpL3PowerConsumption; } else { tmpPowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0)); } Ret_Buf_T-> power_consumption = tmpPowerConsumption; tsLast = tsNow; #endif //SIMULATION result = PASS; } } return result; } unsigned char Query_MeterIc_CorrectionPara(unsigned char fd, unsigned char targetAddr, MeterIcCorrection *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[8] = {0xaa, 0x00, targetAddr, CMD_QUERY_METER_IC_CORRECTION_PARA, 0x01, 0x00, 0xb0, 0xb0}; unsigned char rx[512]; unsigned char chksum = 0x00; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[7] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 0) { if(len < (6+(rx[4] | rx[5]<<8))) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6]) == 0xb0) { uint32_t cali_flag = (rx[7] | (rx[8]<<8) | (rx[9]<<16) | (rx[10]<<24)); if(!(cali_flag & 0x80000000)) { Ret_Buf->bits.isCalibratedVaGain = cali_flag & (1 << 0) ? 1 : 0; Ret_Buf->bits.isCalibratedVbGain = cali_flag & (1 << 1) ? 1 : 0; Ret_Buf->bits.isCalibratedVcGain = cali_flag & (1 << 2) ? 1 : 0; Ret_Buf->bits.isCalibratedVaOffset = cali_flag & (1 << 3) ? 1 : 0; Ret_Buf->bits.isCalibratedVbOffset = cali_flag & (1 << 4) ? 1 : 0; Ret_Buf->bits.isCalibratedVcOffset = cali_flag & (1 << 5) ? 1 : 0; Ret_Buf->bits.isCalibratedCaGain = cali_flag & (1 << 6) ? 1 : 0; Ret_Buf->bits.isCalibratedCbGain = cali_flag & (1 << 7) ? 1 : 0; Ret_Buf->bits.isCalibratedCcGain = cali_flag & (1 << 8) ? 1 : 0; Ret_Buf->bits.isCalibratedCaOffset = cali_flag & (1 << 9) ? 1 : 0; Ret_Buf->bits.isCalibratedCbOffset = cali_flag & (1 << 10) ? 1 : 0; Ret_Buf->bits.isCalibratedCcOffset = cali_flag & (1 << 11) ? 1 : 0; Ret_Buf->bits.isCalibratedPa = cali_flag & (1 << 12) ? 1 : 0; Ret_Buf->bits.isCalibratedPb = cali_flag & (1 << 13) ? 1 : 0; Ret_Buf->bits.isCalibratedPc = cali_flag & (1 << 14) ? 1 : 0; } else { Ret_Buf->value = 0; } result = PASS; } } return result; } unsigned char Query_AC_GUN_PLUGIN_TIMES(unsigned char fd, unsigned char targetAddr, Gun_Plugin_Times *Ret_Buf) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GUN_PLUGIN_TIMES, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { Ret_Buf-> GunPluginTimes = ((uint32_t)rx[6] | (((uint32_t)rx[7])<<8) | (((uint32_t)rx[8])<<16) | (((uint32_t)rx[9])<<24)); result = PASS; } } return result; } unsigned char Query_PTB_METER_MESSAGE(unsigned char fd, unsigned char targetAddr, Ptb_Meter *Ret_Buf, uint8_t CMD) { unsigned char result = FAIL; unsigned char tx[8] = {0}; unsigned char rx[2048] = {0}; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_QUERY_PTB_METER_MESSAGE; tx[4] = 0x01; tx[5] = 0x00; tx[6] = CMD; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[7] = chksum; int len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3])) { if(CMD == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID) { memset(Ret_Buf->ReadOutputMessageFormatId, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputMessageFormatId)); if(rx[6] == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID) { memcpy(&Ret_Buf->ReadOutputMessageFormatId[0], &rx[8], ((rx[4] | (rx[5]<<8))-2)); } } else if(CMD == CMD_READ_OUTPUT_MESSAGE_LENGTH) { Ret_Buf->ReadOutputMessageLength = 0; if(rx[6] == CMD_READ_OUTPUT_MESSAGE_LENGTH) Ret_Buf->ReadOutputMessageLength = (rx[7] | (rx[8]<<8)); } else if(CMD == CMD_READ_OUTPUT_MESSAGE) { memset(Ret_Buf->ReadOutputMessage, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputMessage)); if((Ret_Buf->ReadOutputMessageLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_OUTPUT_MESSAGE)) { memcpy(&Ret_Buf->ReadOutputMessage[0], &rx[7], ((rx[4] | (rx[5]<<8))-1)); } } else if(CMD == CMD_READ_OUTPUT_SIGNATURE_LENGTH) { Ret_Buf->ReadOuputSignatureLength = 0; if(rx[6] == CMD_READ_OUTPUT_SIGNATURE_LENGTH) Ret_Buf->ReadOuputSignatureLength = (rx[7] | (rx[8]<<8)); } else if(CMD == CMD_READ_OUTPUT_SIGNATURE) { memset(Ret_Buf->ReadOutputSignature, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputSignature)); if((Ret_Buf->ReadOuputSignatureLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_OUTPUT_SIGNATURE)) { memcpy(&Ret_Buf->ReadOutputSignature[0], &rx[7], ((rx[4] | (rx[5]<<8))-1)); } } else if(CMD == CMD_READ_PUBLIC_KEY_HEADER_LENGTH) { Ret_Buf->ReadPublicKeyHeaderLength = 0; if(rx[6] == CMD_READ_PUBLIC_KEY_HEADER_LENGTH) Ret_Buf->ReadPublicKeyHeaderLength = (rx[7] | (rx[8]<<8)); } else if(CMD == CMD_READ_PUBLIC_KEY_HEADER) { memset(Ret_Buf->ReadPublicKeyHeader, 0x00, ARRAY_SIZE(Ret_Buf->ReadPublicKeyHeader)); if((Ret_Buf->ReadPublicKeyHeaderLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_PUBLIC_KEY_HEADER)) { memcpy(&Ret_Buf->ReadPublicKeyHeader[0], &rx[7], ((rx[4] | (rx[5]<<8))-1)); } } else if(CMD == CMD_READ_PUBLIC_KEY_LENGTH) { Ret_Buf->ReadPublicKeyLength = 0; if(rx[6] == CMD_READ_PUBLIC_KEY_LENGTH) Ret_Buf->ReadPublicKeyLength = (rx[7] | (rx[8]<<8)); } else if(CMD == CMD_READ_PUBLIC_KEY) { memset(Ret_Buf->ReadPublicKey, 0x00, ARRAY_SIZE(Ret_Buf->ReadPublicKey)); if((Ret_Buf->ReadPublicKeyLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_PUBLIC_KEY)) { memcpy(&Ret_Buf->ReadPublicKey[0], &rx[7], ((rx[4] | (rx[5]<<8))-1)); } } else {} result = PASS; } } return result; } unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf) { unsigned char result = FAIL; unsigned char tx[15] = {0xaa, 0x00, targetAddr, CMD_CONFIG_FAN_SPEED, 0x08, 0x00, Set_Buf->speed[0]&0xff, (Set_Buf->speed[0]>>8)&0xff, Set_Buf->speed[1]&0xff, (Set_Buf->speed[1]>>8)&0xff, Set_Buf->speed[2]&0xff, (Set_Buf->speed[2]>>8)&0xff, Set_Buf->speed[3]&0xff, (Set_Buf->speed[3]>>8)&0xff, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[14] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Serial_Number(unsigned char fd, unsigned char targetAddr, Evse_Id *Set_Buf) { unsigned char result = FAIL; unsigned char tx[27] = {0xaa, 0x00, targetAddr, CMD_CONFIG_SERIAL_NUMBER, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; memcpy(&tx[14], &Set_Buf->serial_number[0], ARRAY_SIZE(Set_Buf->serial_number)); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[26] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, Evse_Id *Set_Buf) { unsigned char result = FAIL; unsigned char tx[21] = {0xaa, 0x00, targetAddr, CMD_CONFIG_MODEL_NAME, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; memcpy(&tx[6], &Set_Buf->model_name[0], ARRAY_SIZE(Set_Buf->model_name)); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[20] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf) { unsigned char result = FAIL; unsigned char tx[15] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_RELAY_OUTPUT; tx[4] = 0x08; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; tx[8] = 0x00; for(int idx_connector=0;idx_connector<2;idx_connector++) for(int idx = 0;idx<8;idx++) tx[9+idx_connector] |= ((Set_Buf->relay_status[idx_connector][idx]?0x01:0x00)< 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf) { unsigned char result = FAIL; unsigned char tx[9] = {0xaa, 0x00, targetAddr, CMD_CONFIG_GPIO_OUTPUT, 0x01, 0x00, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[6] |= (Set_Buf->AC_Connector?0x01:0x00); for(int idx=0;idx<2;idx++) tx[6] |= (Set_Buf->Button_LED[idx]?0x01:0x00)<<(1+idx); for(int idx=0;idx<4;idx++) tx[6] |= (Set_Buf->System_LED[idx]?0x01:0x00)<<(3+idx); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[8] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == tx[6])) { result = PASS; } } return result; } unsigned char Config_RTC(unsigned char fd, unsigned char targetAddr, Rtc *Set_Buf) { unsigned char result = FAIL; unsigned char tx[21] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_RTC; tx[4] = 0x0e; tx[5] = 0x00; tx[6] = ((Set_Buf->year)/1000)+'0'; tx[7] = ((Set_Buf->year)/100%10)+'0'; tx[8] = ((Set_Buf->year)/10%10)+'0'; tx[9] = ((Set_Buf->year)%10)+'0'; tx[10] = ((Set_Buf->month)/10)+'0'; tx[11] = ((Set_Buf->month)%10)+'0'; tx[12] = ((Set_Buf->day)/10)+'0'; tx[13] = ((Set_Buf->day)%10)+'0'; tx[14] = ((Set_Buf->hour)/10)+'0'; tx[15] = ((Set_Buf->hour)%10)+'0'; tx[16] = ((Set_Buf->min)/10)+'0'; tx[17] = ((Set_Buf->min)%10)+'0'; tx[18] = ((Set_Buf->sec)/10)+'0'; tx[19] = ((Set_Buf->sec)%10)+'0'; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[20] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_AC_MCU_LED(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Led *Set_Buf) { unsigned char result = FAIL; unsigned char tx[12] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_AC_LED; tx[4] = 0x05; tx[5] = 0x00; tx[6] = Set_Buf->mode; tx[7] = ((Set_Buf->alarm_code>>0)&0xff); tx[8] = ((Set_Buf->alarm_code>>8)&0xff); tx[9] = ((Set_Buf->alarm_code>>16)&0xff); tx[10] = ((Set_Buf->alarm_code>>24)&0xff); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[11] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_AC_MCU_LEGACY_REQUEST(unsigned char fd, unsigned char targetAddr, Legacy_Request *Set_Buf) { unsigned char result = FAIL; unsigned char tx[9] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_LEGACY_REQUEST; tx[4] = 0x02; tx[5] = 0x00; tx[6] = Set_Buf->isLegacyRequest; tx[7] = 0x00; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[8] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_AC_MCU_RESET_REQUEST(unsigned char fd, unsigned char targetAddr, Mcu_Reset_Request *Set_Buf) { unsigned char result = FAIL; unsigned char tx[9] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_MCU_RESET_REQUEST; tx[4] = 0x02; tx[5] = 0x00; tx[6] = Set_Buf->isMcuResetRequest; tx[7] = 0x00; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[8] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_AC_MaxCurrent_And_CpPwmDuty(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Cp_Pwm_Duty *Set_Buf) { unsigned char result = FAIL; unsigned char tx[8] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_CURRENT_LINIT; tx[4] = 0x01; tx[5] = 0x00; tx[6] = Set_Buf->max_current; //DEBUG_WARN("Config_AC_MaxCurrent_And_CpPwmDuty...%d\n", Set_Buf->max_current); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[7] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && ((rx[6] == 0x00) || (rx[6] == 0x01))) { result = PASS; } } return result; } unsigned char Config_AC_Set_Breathe_Led_Timing(unsigned char fd, unsigned char targetAddr,Set_Breathe_Led_Timing *Set_Buf) { unsigned char result = FAIL; unsigned char tx[19] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_MCU_SET_BREATHE_LED_TIMING; tx[4] = 0x0C; tx[5] = 0x00; // Increase LED_ACTION_CONNECTED tx[6] = (Set_Buf->set_Led_Action_Connected_Fade_In & 0xff); tx[7] = (Set_Buf->set_Led_Action_Connected_Fade_In >> 8); // Decrease LED_ACTION_CONNECTED tx[8] = (Set_Buf->set_Led_Action_Connected_Fade_Out & 0xff); tx[9] = (Set_Buf->set_Led_Action_Connected_Fade_Out >> 8); // Increase LED_ACTION_AUTHED tx[10] = (Set_Buf->set_Led_Action_Authed_Fade_In & 0xff); tx[11] = (Set_Buf->set_Led_Action_Authed_Fade_In >> 8); // Decrease LED_ACTION_AUTHED tx[12] = (Set_Buf->set_Led_Action_Authed_Fade_Out & 0xff); tx[13] = (Set_Buf->set_Led_Action_Authed_Fade_Out >> 8); // Increase_LED_ACTION_CHARGING tx[14] = (Set_Buf->Set_Led_Action_Chaging_Fade_In & 0xff); tx[15] = (Set_Buf->Set_Led_Action_Chaging_Fade_In >> 8); // Decrease_LED_ACTION_CHARGING tx[16] = (Set_Buf->set_Led_Action_Chaging_Fade_Out & 0xff); tx[17] = (Set_Buf->set_Led_Action_Chaging_Fade_Out >> 8); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[18] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_AC_Set_Led_Brightness(unsigned char fd, unsigned char targetAddr,Set_Led_Brightness *Set_Buf) { unsigned char result = FAIL; unsigned char tx[19] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_MCU_SET_LED_BRIGHTNESS; tx[4] = 0x0C; tx[5] = 0x00; tx[6] = Set_Buf-> sector_1; // 0~1 AM and 1~2 AM tx[7] = Set_Buf-> sector_2; // 2~3 AM and 3~4 AM tx[8] = Set_Buf-> sector_3; // 4~5 AM and 5~6 AM tx[9] = Set_Buf-> sector_4; // 6~7 AM and 7~8 AM tx[10] = Set_Buf-> sector_5; // 8~9 AM and 9~10 AM tx[11] = Set_Buf-> sector_6; // 10~11 AM and 11~12 AM tx[12] = Set_Buf-> sector_7; // 12~13 PM and 13~14 PM tx[13] = Set_Buf-> sector_8; // 14~15 PM and 15~16 PM tx[14] = Set_Buf-> sector_9; // 16~17 PM and 17~18 PM tx[15] = Set_Buf-> sector_10; // 18~19 PM and 19~20 PM tx[16] = Set_Buf-> sector_11; // 20~21 PM and 21~22 PM tx[17] = Set_Buf-> sector_12; // 22~23 PM and 23~24 PM for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[18] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Aux_Power_Switch(unsigned char fd, unsigned char targetAddr, Set_Aux_Power_Switch *Set_Buf) { unsigned char result = FAIL; unsigned char tx[9]; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_AUX_POWER_SWITCH; tx[4] = 0x02; tx[5] = 0x00; tx[6] = Set_Buf->power_type; // 0~1 AM and 1~2 AM tx[7] = Set_Buf->power_switch; // 2~3 AM and 3~4 AM for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[8] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } unsigned char Config_Ptb_Meter_Permission_Status(unsigned char fd, unsigned char targetAddr, Ptb_Meter *Set_Buf) { unsigned char result = FAIL; unsigned char tx[8] = {0}; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_CONFIG_PTB_METER_PERMISSION; tx[4] = 0x01; tx[5] = 0x00; tx[6] = Set_Buf->PtbMeterPermissionStatus; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[7] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && ((rx[6] == 0x00) || (rx[6] == 0x01))) { result = PASS; } } return result; } unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32) { unsigned char result = FAIL; unsigned char tx[11] = {0xaa, 0x00, targetAddr, CMD_UPDATE_START, 0x04, 0x00, (crc32>>0)&0xff, (crc32>>8)&0xff, (crc32>>16)&0xff, (crc32>>24)&0xff, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[10] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; chksum = 0x00; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x00)) { result = PASS; } } return result; } unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_UPDATE_ABOARD, 0x04, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x00)) { result = PASS; } } return result; } unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length) { unsigned char result = FAIL; unsigned char tx[11 + length]; unsigned char rx[512]; unsigned char chksum = 0x00; tx[0] = 0xaa; tx[1] = 0x00; tx[2] = targetAddr; tx[3] = CMD_UPDATE_TRANSFER; tx[4] = (4 + length) & 0xff; tx[5] = ((4 + length)>>8) & 0xff; tx[6] = (startAddr>>0) & 0xff; tx[7] = (startAddr>>8) & 0xff; tx[8] = (startAddr>>16) & 0xff; tx[9] = (startAddr>>24) & 0xff; memcpy(tx+10, data, length); for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++) chksum ^= tx[6+idx]; tx[ARRAY_SIZE(tx)-1] = chksum; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x00)) { result = PASS; } } return result; } unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr) { unsigned char result = FAIL; unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_UPDATE_END, 0x04, 0x00, 0x00}; unsigned char rx[512]; unsigned char chksum = 0x00; unsigned char len = tranceive(fd, tx, sizeof(tx), rx); if(len > 6) { if(len < 6+(rx[4] | rx[5]<<8)) return result; for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++) { chksum ^= rx[6+idx]; } if((chksum == rx[6+(rx[4] | rx[5]<<8)]) && (rx[2] == tx[1]) && (rx[1] == tx[2]) && (rx[3] == tx[3]) && (rx[6] == 0x01)) { result = PASS; } } return result; } //================================================ // Main process //================================================ int main(void) { int Uart1Fd; unsigned short int failCount[2] = {0,0}; struct Charger previousCharger; if(InitShareMemory() == FAIL) { #ifdef SystemLogMessage DEBUG_ERROR("InitShareMemory NG\n"); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1; } sleep(5); return 0; } else { DEBUG_INFO("InitShareMemory OK.\n"); } Uart1Fd=InitComPort(); if(Uart1Fd<0) { DEBUG_ERROR("InitComPort NG\n"); if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); return 0; } else { DEBUG_INFO("ttyS1 port open success.\n"); } if(fork() == 0) { for(;;) { for(int gun_index=0;gun_indexgun_info[gun_index].primaryMcuLed.mode) || (previousCharger.gun_info[gun_index].primaryMcuLed.alarm_code != ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 1 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d set Led mode : %d\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuLed.mode); DEBUG_INFO("MCU-%d set Alarm code : %x\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code); previousCharger.gun_info[gun_index].primaryMcuLed.mode = ShmCharger->gun_info[gun_index].primaryMcuLed.mode; previousCharger.gun_info[gun_index].primaryMcuLed.alarm_code = ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code; } //================================================== // Case 2: Configuration primary Legacy request //================================================== if(previousCharger.gun_info[gun_index].legacyRequest.isLegacyRequest != ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 2 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d set PWN request : %d\n", gun_index, ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest); previousCharger.gun_info[gun_index].legacyRequest.isLegacyRequest = ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest; } //================================================== // Case 2: Configuration primary Relay //================================================== if((previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0]) || (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1]) || (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2]) || (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3])) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("**** High priority polling : Case 2-X *****\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d set relay status [0][0] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0]); DEBUG_INFO("MCU-%d set relay status [0][1] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1]); DEBUG_INFO("MCU-%d set relay status [0][2] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2]); DEBUG_INFO("MCU-%d set relay status [0][3] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3]); previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0]; previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1]; previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2]; previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3]; } //================================================== // Case 3: Query primary MCU status //================================================== if((previousCharger.gun_info[gun_index].primaryMcuState.cp_state != ShmCharger->gun_info[gun_index].primaryMcuState.cp_state) || (previousCharger.gun_info[gun_index].primaryMcuState.current_limit != ShmCharger->gun_info[gun_index].primaryMcuState.current_limit) || (previousCharger.gun_info[gun_index].primaryMcuState.relay_state != ShmCharger->gun_info[gun_index].primaryMcuState.relay_state) || (previousCharger.gun_info[gun_index].primaryMcuState.rotatory_switch != ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch) || (previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode != ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode) || (previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn != ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 3 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get Pilot State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_state); DEBUG_INFO("MCU-%d get Pilot Duty : %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].primaryMcuState.current_limit); DEBUG_INFO("MCU-%d get Pilot Voltage Positive : %.2f\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive); DEBUG_INFO("MCU-%d get Pilot Voltage Negative : %.2f\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_negtive); if(ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON) { if(ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn == ON) DEBUG_INFO("Relay mode : CHARGING_MODE_SOCKETE. \n"); else DEBUG_INFO("Relay mode : CHARGING_MODE_BS / CHARGING_MODE_HLC. \n"); } DEBUG_INFO("MCU-%d get Relay State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relay_state); DEBUG_INFO("MCU-%d get Rating Current : %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].primaryMcuState.rating_current); DEBUG_INFO("MCU-%d get Rotary switch : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch); DEBUG_INFO("MCU-%d get is on Socket-E mode : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode); DEBUG_INFO("MCU-%d get Socket-E detect pin : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn); DEBUG_INFO("MCU-%d get Locker State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.locker_state); DEBUG_INFO("MCU-%d get Shutter State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.shutter_state); DEBUG_INFO("MCU-%d get Meter State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.meter_state); DEBUG_INFO("MCU-%d get PP State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.pp_state); previousCharger.gun_info[gun_index].primaryMcuState.cp_state = ShmCharger->gun_info[gun_index].primaryMcuState.cp_state; previousCharger.gun_info[gun_index].primaryMcuState.current_limit = ShmCharger->gun_info[gun_index].primaryMcuState.current_limit; previousCharger.gun_info[gun_index].primaryMcuState.rotatory_switch = ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch; previousCharger.gun_info[gun_index].primaryMcuState.relay_state = ShmCharger->gun_info[gun_index].primaryMcuState.relay_state; previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode = ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode; previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn = ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn; } //================================================== // Case 4: Query primary MCU Alarm code //================================================== if((previousCharger.gun_info[gun_index].primaryMcuAlarm.InputAlarmCode != ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode)) { if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode>0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 4 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get OVP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L1); DEBUG_INFO("MCU-%d get UVP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L1); DEBUG_INFO("MCU-%d get OCP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L1); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { DEBUG_INFO("MCU-%d get OVP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L2); DEBUG_INFO("MCU-%d get UVP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L2); DEBUG_INFO("MCU-%d get OCP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L2); DEBUG_INFO("MCU-%d get OVP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L3); DEBUG_INFO("MCU-%d get UVP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L3); DEBUG_INFO("MCU-%d get OCP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L3); } DEBUG_INFO("MCU-%d get OTP : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OTP); DEBUG_INFO("MCU-%d get gmi_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.gmi_fault); DEBUG_INFO("MCU-%d get cp_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.cp_fault); DEBUG_INFO("MCU-%d get ac_leak : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.ac_leak); DEBUG_INFO("MCU-%d get dc_leak : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.dc_leak); DEBUG_INFO("MCU-%d get mcu_selftest_fail : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.mcu_selftest_fail); DEBUG_INFO("MCU-%d get handshaking_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.handshaking_timeout); DEBUG_INFO("MCU-%d get emergency_stop : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.emergency_stop); DEBUG_INFO("MCU-%d get relay_welding : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.relay_welding); DEBUG_INFO("MCU-%d get leak_module_fail : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.leak_module_fail); DEBUG_INFO("MCU-%d get shutter_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.shutter_fault); DEBUG_INFO("MCU-%d get locker_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.locker_fault); DEBUG_INFO("MCU-%d get power_drop : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.power_drop); DEBUG_INFO("MCU-%d get rotate_switch_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.rotate_switch_fault); DEBUG_INFO("MCU-%d get short_circuit_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L1); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { DEBUG_INFO("MCU-%d get short_circuit_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L2); DEBUG_INFO("MCU-%d get short_circuit_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L3); } DEBUG_INFO("MCU-%d get relay_drive_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.relay_drive_fault); DEBUG_INFO("MCU-%d get meter_comm_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.meter_comm_timeout); DEBUG_INFO("MCU-%d get meter_ic_comm_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.meter_ic_comm_timeout); DEBUG_INFO("MCU-%d get pilot_negative_error : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.pilot_negative_error); DEBUG_INFO("MCU-%d get InputAlarmCode : %x\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode); } previousCharger.gun_info[gun_index].primaryMcuAlarm.InputAlarmCode = ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode; } //================================================== // Case 5: Query primary MCU BLE config //================================================== /* if((previousCharger.gun_info[gun_index].bleConfigData.isLogin != ShmCharger->gun_info[gun_index].bleConfigData.isLogin) || (previousCharger.gun_info[gun_index].bleConfigData.isRequestStart != ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart) || (previousCharger.gun_info[gun_index].bleConfigData.isRequestStop != ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop)) { if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin == ON) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 5 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get isUserLogin : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isLogin); DEBUG_INFO("MCU-%d get isRequestStartCharger : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart); DEBUG_INFO("MCU-%d get isRequestStopCharger : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop); } previousCharger.gun_info[gun_index].bleConfigData.isLogin = ShmCharger->gun_info[gun_index].bleConfigData.isLogin; previousCharger.gun_info[gun_index].bleConfigData.isRequestStart = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart; previousCharger.gun_info[gun_index].bleConfigData.isRequestStop = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop; } */ //================================================== // Case 6: Query primary MCU ble login id //================================================== /* if((strcmp((char *)&previousCharger.gun_info[gun_index].bleLoginCentralId.id,(char *)&ShmCharger->gun_info[gun_index].bleLoginCentralId.id) != 0)) { if(strcmp((char *)&ShmCharger->gun_info[gun_index].bleLoginCentralId.id,"") != 0) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 6 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get ble central id : %s\n", gun_index, ShmCharger->gun_info[gun_index].bleLoginCentralId.id); } memcpy(&previousCharger.gun_info[gun_index].bleLoginCentralId.id, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, ARRAY_SIZE(ShmCharger->gun_info[gun_index].bleLoginCentralId.id)); } */ //================================================== // Case 8: Config primary MCU duty //================================================== if(previousCharger.gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 8 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d set cp pwn duty : %d\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current); previousCharger.gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current; } //================================================== // Case 10: Query primary MCU power consumption //================================================== if((abs(ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption - previousCharger.gun_info[gun_index].powerConsumptionTotal.power_consumption) > 200) || (abs(ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[0].power_consumption) > 200) || (abs(ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[1].power_consumption) > 200) || (abs(ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[2].power_consumption) > 200)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 10 *****\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get total power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption/10000.0)); DEBUG_INFO("MCU-%d get L1N_L12 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption/10000.0)); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { DEBUG_INFO("MCU-%d get L2N_L23 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption/10000.0)); DEBUG_INFO("MCU-%d get L3N_L31 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption/10000.0)); } previousCharger.gun_info[gun_index].powerConsumptionTotal.power_consumption = ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption; previousCharger.gun_info[gun_index].powerConsumption[0].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption; previousCharger.gun_info[gun_index].powerConsumption[1].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption; previousCharger.gun_info[gun_index].powerConsumption[2].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption; } //================================================== // Case 11: Query primary Out put current config //================================================== if((abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L1N_L12[0]) >= 2) || (abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L2N_L23[0]) >= 2) || (abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L3N_L31[0]) >= 2)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 11 *****\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get output current L1: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { DEBUG_INFO("MCU-%d get output current L2: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0]); DEBUG_INFO("MCU-%d get output current L3: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0]); } previousCharger.gun_info[gun_index].outputCurrent.L1N_L12[0] = ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; previousCharger.gun_info[gun_index].outputCurrent.L2N_L23[0] = ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0]; previousCharger.gun_info[gun_index].outputCurrent.L3N_L31[0] = ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0]; } //================================================== // Case 12: Configuration PTB permission status //================================================== if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P') { if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 12 *****\n"); DEBUG_INFO("*******************************************\n"); if(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus == PERMISSION_START_CHARGING) { DEBUG_INFO("MCU-%d set permission to PTB meter: %d [Start Charging] \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus); } else if(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus == PERMISSION_END_CHARGING) { DEBUG_INFO("MCU-%d set permission to PTB meter: %d [End Charging] \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus); } else {} previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus; } } //================================================== // Case 13: Case 13; Query PTB meter messages //================================================== if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P') { if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId) != 0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x10 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter output message format id: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId); memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId)); } if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x11 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter output message length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength); previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength; } if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage) != 0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x12 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter output message: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage); memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage)); } if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x13 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter output signature length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength); previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength; } if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature) != 0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x14 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter output signature: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature); memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature)); } if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x15 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter public key header length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength); previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength; } if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader) != 0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x16 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter public key header: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader); memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader)); } if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x17 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter public key length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength); previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength; } if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey) != 0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("** High priority polling : Case 13-0x18 ***\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d get PTB meter public key: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey); memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey)); } } //========================================================== // Low priority polling log print out //========================================================== //================================================== // Case 1: Query primary In put voltage //================================================== if((abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12 - (int)previousCharger.gun_info[gun_index].inputVoltage.L1N_L12) >= 2) || (abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23 - (int)previousCharger.gun_info[gun_index].inputVoltage.L2N_L23) >= 2) || (abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31 - (int)previousCharger.gun_info[gun_index].inputVoltage.L3N_L31) >= 2)) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 1 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU-%d get Input voltage L1: %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12); DEBUG_INFO("MCU-%d get PresentChargingVoltage L1: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltage); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { DEBUG_INFO("MCU-%d get Input voltage L2: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23); DEBUG_INFO("MCU-%d get PresentChargingVoltage L2: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL2); DEBUG_INFO("MCU-%d get Input voltage L3: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31); DEBUG_INFO("MCU-%d get PresentChargingVoltage L3: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL3); } previousCharger.gun_info[gun_index].inputVoltage.L1N_L12 = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12; previousCharger.gun_info[gun_index].inputVoltage.L2N_L23 = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23; previousCharger.gun_info[gun_index].inputVoltage.L3N_L31 = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31; } //================================================== // Case 5: Query primary plug in times //================================================== if(previousCharger.gun_info[gun_index].gunPluginTimes.GunPluginTimes != ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 5 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU-%d get gun plugin times : %ld\n", gun_index, (long)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes); previousCharger.gun_info[gun_index].gunPluginTimes.GunPluginTimes = ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes; } //================================================== // Case 7: Query primary temperature //================================================== if(previousCharger.gun_info[gun_index].temperature.point[0] != ShmCharger->gun_info[gun_index].temperature.point[0]) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 7 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU-%d get temperature : %d\n", gun_index, ShmCharger->gun_info[gun_index].temperature.point[0]); previousCharger.gun_info[gun_index].temperature.point[0] = ShmCharger->gun_info[gun_index].temperature.point[0]; } //================================================== // Case 11: Configuration primary RTC time //================================================== if(previousCharger.gun_info[gun_index].rtc.min != ShmCharger->gun_info[gun_index].rtc.min) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 11 ====\n"); DEBUG_INFO("===========================================\n"); if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin && !ShmOCPP16Data->OcppConnStatus) { DEBUG_INFO("Sync from MCU-%d rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", gun_index, ShmCharger->gun_info[gun_index].rtc.year, ShmCharger->gun_info[gun_index].rtc.month, ShmCharger->gun_info[gun_index].rtc.day, ShmCharger->gun_info[gun_index].rtc.hour, ShmCharger->gun_info[gun_index].rtc.min, ShmCharger->gun_info[gun_index].rtc.sec); } else { DEBUG_INFO("MCU-%d set rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", gun_index, ShmCharger->gun_info[gun_index].rtc.year, ShmCharger->gun_info[gun_index].rtc.month, ShmCharger->gun_info[gun_index].rtc.day, ShmCharger->gun_info[gun_index].rtc.hour, ShmCharger->gun_info[gun_index].rtc.min, ShmCharger->gun_info[gun_index].rtc.sec); } previousCharger.gun_info[gun_index].rtc.min = ShmCharger->gun_info[gun_index].rtc.min; } //================================================== // Case 15: Configuration led breathe timing //================================================== if((previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In) || (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out) || (previousCharger.gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In) || (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out) || (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In) || (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out)) { if(ShmCharger->gun_info[gun_index].isSetBreatheLedTiming == ON) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 15 ====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU-%d set breathe led timing : Authed Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In); DEBUG_INFO("MCU-%d set breathe led timing : Authed Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out); DEBUG_INFO("MCU-%d set breathe led timing : Charging Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In); DEBUG_INFO("MCU-%d set breathe led timing : Charging Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out); DEBUG_INFO("MCU-%d set breathe led timing : Connected Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In); DEBUG_INFO("MCU-%d set breathe led timing : Connected Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out); } previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In; previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out; previousCharger.gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In; previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out; previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In; previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out; } //================================================== // Case 17: Configuration led brightness //================================================== if((previousCharger.gun_info[gun_index].setLedBrightness.sector_1 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_1) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_2 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_2) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_3 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_3) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_4 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_4) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_5 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_5) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_6 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_6) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_7 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_7) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_8 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_8) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_9 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_9) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_10 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_10) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_11 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_11) || (previousCharger.gun_info[gun_index].setLedBrightness.sector_12 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_12)) { if(ShmCharger->gun_info[gun_index].isSetLedBrightness == ON) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 17 ====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU-%d set led brightness Sector 01 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_1); DEBUG_INFO("MCU-%d set led brightness Sector 02 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_2); DEBUG_INFO("MCU-%d set led brightness Sector 03 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_3); DEBUG_INFO("MCU-%d set led brightness Sector 04 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_4); DEBUG_INFO("MCU-%d set led brightness Sector 05 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_5); DEBUG_INFO("MCU-%d set led brightness Sector 06 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_6); DEBUG_INFO("MCU-%d set led brightness Sector 07 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_7); DEBUG_INFO("MCU-%d set led brightness Sector 08 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_8); DEBUG_INFO("MCU-%d set led brightness Sector 09 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_9); DEBUG_INFO("MCU-%d set led brightness Sector 10 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_10); DEBUG_INFO("MCU-%d set led brightness Sector 11 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_11); DEBUG_INFO("MCU-%d set led brightness Sector 12 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_12); } previousCharger.gun_info[gun_index].setLedBrightness.sector_1 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_1; previousCharger.gun_info[gun_index].setLedBrightness.sector_2 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_2; previousCharger.gun_info[gun_index].setLedBrightness.sector_3 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_3; previousCharger.gun_info[gun_index].setLedBrightness.sector_4 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_4; previousCharger.gun_info[gun_index].setLedBrightness.sector_5 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_5; previousCharger.gun_info[gun_index].setLedBrightness.sector_6 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_6; previousCharger.gun_info[gun_index].setLedBrightness.sector_7 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_7; previousCharger.gun_info[gun_index].setLedBrightness.sector_8 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_8; previousCharger.gun_info[gun_index].setLedBrightness.sector_9 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_9; previousCharger.gun_info[gun_index].setLedBrightness.sector_10 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_10; previousCharger.gun_info[gun_index].setLedBrightness.sector_11 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_11; previousCharger.gun_info[gun_index].setLedBrightness.sector_12 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_12; } } usleep(100000); } exit(0); } for(;;) { for(int gun_index=0;gun_indexgun_info[gun_index].primaryMcuLed.alarm_code = ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode; if(Config_AC_MCU_LED(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuLed)) { failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set led fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1),&ShmCharger->gun_info[gun_index].legacyRequest)) { failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set PWN request fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1),&ShmCharger->gun_info[gun_index].primaryMcuState.relayState)) { failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set relay fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuState)) { ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState = ShmCharger->gun_info[gun_index].primaryMcuState.cp_state; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotDuty = (ShmCharger->gun_info[gun_index].primaryMcuState.current_limit>51?(unsigned char)((ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/2.5)+64):(unsigned char)(ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/0.6)); ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotVoltage = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive; ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltagePositive = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive; ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_negtive; //pass info 2 CCS task if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_UNKNOWN) { if(ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative >= -12) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_G; } else { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_H; } } else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_A; } else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B) { if(ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative == 0.0) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_B1; } else { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_B2; } } else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_C; } else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_D) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_D; } else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_E) { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_E; } else //CP_STATE_F { ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_F; } ShmCharger->gun_info[gun_index].acCcsInfo.CpPositiveVoltage = ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltagePositive; ShmCharger->gun_info[gun_index].acCcsInfo.CpNegativeVoltage = ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative; ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentPWMDuty = ShmCharger->gun_info[gun_index].primaryMcuState.current_limit; if(ShmCharger->gun_info[gun_index].primaryMcuState.relay_state) { ShmCharger->gun_info[gun_index].acCcsInfo.OutputRelayStatus = ON; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].RelayK1K2Status = ON; } else { ShmCharger->gun_info[gun_index].acCcsInfo.OutputRelayStatus = OFF; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].RelayK1K2Status = OFF; } failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get status fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuAlarm)) { //DEBUG_INFO("MCU-%d get alarm code success.\n",gun_index); failCount[gun_index] = 0; ShmCharger->gun_info[gun_index].acCcsInfo.CSUAlarmStatusCode = ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode; } else { DEBUG_WARN("MCU-%d get alarm fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].bleConfigData)) { ShmSysConfigAndInfo->SysConfig.Bluetooth.isLogin = ShmCharger->gun_info[gun_index].bleConfigData.isLogin; ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart; ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get ble config fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].bleLoginCentralId)) { memcpy(ShmSysConfigAndInfo->SysConfig.Bluetooth.LoginCentralID, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, sizeof ShmSysConfigAndInfo->SysConfig.Bluetooth.LoginCentralID); failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get ble login central id fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuResetRequest.isMcuResetRequest == ON) { if(Config_AC_MCU_RESET_REQUEST(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].mcuResetRequest) == PASS) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("**** High priority polling : Case 7 *******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU-%d set MCU reset Request : %d\n", gun_index, ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest); ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest = OFF; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get MCU reset fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isSetCpPwmDuty == ON) { //DEBUG_WARN("Case 8 : Config primary set CP PWN duty...%d\n", ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty); if(Config_AC_MaxCurrent_And_CpPwmDuty(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty)) { failCount[gun_index] = 0; ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = OFF; } else { DEBUG_WARN("MCU-%d set cp pwn duty fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].GPIO_Input)) { failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get GPIO input fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].powerConsumptionTotal, &ShmCharger->gun_info[gun_index].powerConsumption[0], &ShmCharger->gun_info[gun_index].powerConsumption[1], &ShmCharger->gun_info[gun_index].powerConsumption[2])) { ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PowerConsumption = (ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption/10000.0); failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get power consumption fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].outputCurrent) == PASS) { #ifndef SIMULATION ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0]; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[0] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[1] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[2] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; #else //SIMULATION ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); } #endif //SIMULATION failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get output current fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]SysConfig.ModelName[3] == 'P') { if(ShmCharger->gun_info[gun_index].isSetPtbMeterPermisson == ON) { if(Config_Ptb_Meter_Permission_Status(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters) == PASS) { failCount[gun_index] = 0; ShmCharger->gun_info[gun_index].isSetPtbMeterPermisson = OFF; } else { DEBUG_WARN("MCU-%d set permission to PTB meter fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]SysConfig.ModelName[3] == 'P') { if((ShmCharger->gun_info[gun_index].isGetPtbMeterMessage == ON)) { for(uint8_t idx = CMD_READ_OUTPUT_MESSAGE_FORMAT_ID; idx <= (CMD_READ_PUBLIC_KEY+1); idx++) { if(Query_PTB_METER_MESSAGE(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters, idx) == PASS) { failCount[gun_index] = 0; } else { if(idx == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID) { DEBUG_WARN("MCU-%d get PTB meter output message format id fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_OUTPUT_MESSAGE_LENGTH) { DEBUG_WARN("MCU-%d get PTB meter output message length fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_OUTPUT_MESSAGE) { DEBUG_WARN("MCU-%d get PTB meter output message fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_OUTPUT_SIGNATURE_LENGTH) { DEBUG_WARN("MCU-%d get PTB meter output signature length fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_OUTPUT_SIGNATURE) { DEBUG_WARN("MCU-%d get PTB meter output signature fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_PUBLIC_KEY_HEADER_LENGTH) { DEBUG_WARN("MCU-%d get PTB meter public key header length fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_PUBLIC_KEY_HEADER) { DEBUG_WARN("MCU-%d get PTB meter public key header fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_PUBLIC_KEY_LENGTH) { DEBUG_WARN("MCU-%d get PTB meter public key length fail...%d\n", gun_index, failCount[gun_index]); } else if(idx == CMD_READ_PUBLIC_KEY) { DEBUG_WARN("MCU-%d get PTB meter public key fail...%d\n", gun_index, failCount[gun_index]); } else {} if(failCount[gun_index]gun_info[gun_index].isGetPtbMeterMessage = OFF; DEBUG_INFO("========================================\n"); DEBUG_INFO("Stop query PTB meter messages.\n"); DEBUG_INFO("========================================\n"); } } } } } else { /* * Normal priority communication */ switch(stepIndex) { case 1: //=============================== // Query present input voltage //=============================== if(Query_Present_InputVoltage(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].inputVoltage) == PASS) { ShmSysConfigAndInfo->SysInfo.InputVoltageR = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12; ShmSysConfigAndInfo->SysInfo.InputVoltageS = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23; ShmSysConfigAndInfo->SysInfo.InputVoltageT = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltage = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL2 = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL3 = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31; ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[0] = ShmSysConfigAndInfo->SysInfo.InputVoltageR; ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[1] = ShmSysConfigAndInfo->SysInfo.InputVoltageS; ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[2] = ShmSysConfigAndInfo->SysInfo.InputVoltageT; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get input voltage fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].outputCurrent) == PASS) { #ifndef SIMULATION ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0]; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[0] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[1] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[2] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]; #else //SIMULATION ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3) { ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0); } #endif //SIMULATION failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get output current fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].gunPluginTimes) == PASS) { ShmSysConfigAndInfo->SysConfig.AcPlugInTimes = ((long)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes & 0xFFFF); failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get gun plugin times fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].temperature) == PASS) { ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp = ShmCharger->gun_info[gun_index].temperature.point[0]; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ConnectorTemp = ShmCharger->gun_info[gun_index].temperature.point[0]; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get temperature fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].rtc)) { struct timeb csuTime, mcuTime; struct tm *tmCSU; struct tm tmMcu; ftime(&csuTime); tmCSU = localtime(&csuTime.time); tmMcu.tm_year = ShmCharger->gun_info[gun_index].rtc.year-1900; tmMcu.tm_mon = ShmCharger->gun_info[gun_index].rtc.month-1; tmMcu.tm_mday = ShmCharger->gun_info[gun_index].rtc.day; tmMcu.tm_hour = ShmCharger->gun_info[gun_index].rtc.hour; tmMcu.tm_min = ShmCharger->gun_info[gun_index].rtc.min; tmMcu.tm_sec = ShmCharger->gun_info[gun_index].rtc.sec; mcuTime.time = mktime(&tmMcu); if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin && !ShmOCPP16Data->OcppConnStatus) { if(abs(DiffTimeb(csuTime, mcuTime)) > 10000) { char cmdBuf[128]; sprintf(cmdBuf, "date -u -s \"%04d-%02d-%02d %02d:%02d:%02d\"", ShmCharger->gun_info[gun_index].rtc.year, ShmCharger->gun_info[gun_index].rtc.month, ShmCharger->gun_info[gun_index].rtc.day, ShmCharger->gun_info[gun_index].rtc.hour, ShmCharger->gun_info[gun_index].rtc.min, ShmCharger->gun_info[gun_index].rtc.sec); system(cmdBuf); system("hwclock -w -u"); system("hwclock -s"); } } else { if(abs(DiffTimeb(csuTime, mcuTime)) > 10000) { ShmCharger->gun_info[gun_index].rtc.year = tmCSU->tm_year+1900; ShmCharger->gun_info[gun_index].rtc.month = tmCSU->tm_mon+1; ShmCharger->gun_info[gun_index].rtc.day = tmCSU->tm_mday; ShmCharger->gun_info[gun_index].rtc.hour = tmCSU->tm_hour; ShmCharger->gun_info[gun_index].rtc.min = tmCSU->tm_min; ShmCharger->gun_info[gun_index].rtc.sec = tmCSU->tm_sec; Config_RTC(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].rtc); } } failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get rtc fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isMcuUpgradeReq) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 13 ====\n"); DEBUG_INFO("===========================================\n"); unsigned char cmd[512]; if(Upgrade_UART(Uart1Fd, AC_WALLMOUNT_CONTROLLER, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), ShmCharger->fwUpgradeInfo.location, ShmCharger->fwUpgradeInfo.modelName)) { DEBUG_INFO("MCU-%d upgrade firmware OK...%s\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW); sleep(20); ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq = OFF; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d upgrade firmware fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]fwUpgradeInfo.location); system((char*)cmd); } break; case 15: //=============================== // Config set breathe led timing //=============================== if(ShmCharger->gun_info[gun_index].isSetBreatheLedTiming == ON) { if(Config_AC_Set_Breathe_Led_Timing(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setBreatheLedTiming)) { failCount[gun_index] = 0; ShmCharger->gun_info[gun_index].isSetBreatheLedTiming = OFF; } else { DEBUG_WARN("MCU-%d set breathe led timing fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].isSetLedBrightness == ON) { if(Config_AC_Set_Led_Brightness(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setLedBrightness)) { failCount[gun_index] = 0; ShmCharger->gun_info[gun_index].isSetLedBrightness = OFF; } else { DEBUG_WARN("MCU-%d set led brightness fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isReadFwVerPass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-1===\n"); DEBUG_INFO("===========================================\n"); if(Query_FW_Ver(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].ver) == PASS) { DEBUG_INFO("MCU-%d get firmware version : %s\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW); memcpy(ShmPrimaryMcuData->version, ShmCharger->gun_info[gun_index].ver.Version_FW, sizeof(ShmPrimaryMcuData->version)); ShmCharger->gun_info[gun_index].mcuFlag.isReadFwVerPass = PASS; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get firmware version fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isReadMeterIcCorrectionStatus != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-2===\n"); DEBUG_INFO("===========================================\n"); if(Query_MeterIc_CorrectionPara(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].meterIcCorrectionStatus) == PASS) { DEBUG_INFO("MCU-%d get meter ic correction status: 0x%08X\n", gun_index, ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.value); ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVaGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVaGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVbGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVbGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVcGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVcGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVaOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVaOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVbOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVbOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVcOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVcOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCaGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCaGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCbGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCbGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCcGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCcGain; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCaOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCaOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCbOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCbOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCcOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCcOffset; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPa = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPa; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPb = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPb; ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPc = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPc; ShmCharger->gun_info[gun_index].mcuFlag.isReadMeterIcCorrectionStatus = PASS; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d get meter ic correction status fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isSetSerialNumberPass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-3===\n"); DEBUG_INFO("===========================================\n"); memcpy(ShmCharger->evseId.serial_number, ShmSysConfigAndInfo->SysConfig.SerialNumber, ARRAY_SIZE(ShmCharger->evseId.serial_number)); if(Config_Serial_Number(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId)) { DEBUG_INFO("MCU-%d set serial number : %.12s\n",gun_index,ShmCharger->evseId.serial_number); ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass = PASS; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set serial number fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].mcuFlag.isSetModelNamePass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-4===\n"); DEBUG_INFO("===========================================\n"); memcpy(ShmCharger->evseId.model_name, ShmSysConfigAndInfo->SysConfig.ModelName, ARRAY_SIZE(ShmCharger->evseId.model_name)); if(Config_Model_Name(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId)) { DEBUG_INFO("MCU-%d set model name : %.14s\n",gun_index,ShmCharger->evseId.model_name); ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass = PASS; failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set model name fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]gun_info[gun_index].setAuxPowerSwitch.power_switch = 0x01; ShmCharger->gun_info[gun_index].setAuxPowerSwitch.power_switch = ShmCharger->gun_info[gun_index].isMeterOn; if(Config_Aux_Power_Switch(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setAuxPowerSwitch)) { failCount[gun_index] = 0; } else { DEBUG_WARN("MCU-%d set aux power switch fail...%d\n", gun_index, failCount[gun_index]); if(failCount[gun_index]= 13) ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = ON; if(failCount[gun_index] >= FAIL_SPEC_COMM) { if((0 <= failCount[gun_index]%FAIL_SPEC_COMM) && (failCount[gun_index]%FAIL_SPEC_COMM < 10)) sleep(10); if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout == OFF) { DEBUG_ERROR("Primary MCU-%d communication fault. \n", gun_index); ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout = ON; } } else { if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout == ON) { DEBUG_ERROR("Primary MCU-%d communication recover. \n", gun_index); ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout = OFF; } } usleep(100000); } } return FAIL; }