#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 DISPENSER *ShmDispenser; uint16_t stepIndex=21, logIndex; long long tsLast, tsNow, tsPrintLog[2]; uint64_t tmpPowerConsumption; 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); } } int isGpioInitialized(unsigned int gpio) { int result = FAIL; char gpioPath[64]; sprintf(gpioPath, "/sys/class/gpio/gpio%d/value", gpio); if((access(gpioPath, F_OK)) != -1) { result = PASS; } return result; } //========================================== // Init all share memory //========================================== int InitShareMemory() { int result = PASS; int MeterSMId; //Initial ShmDispenser if ((MeterSMId = shmget(ShmDispenserKey, sizeof(struct DISPENSER), 0777)) < 0) { DEBUG_ERROR("shmget ShmDispenser NG\n"); result = FAIL; } else if ((ShmDispenser = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage DEBUG_ERROR("shmat ShmDispenser 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; 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, 512); } 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(ShmDispenser->ConfigData.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(ShmDispenser->ConfigData.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(ShmDispenser->ConfigData.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(ShmDispenser->ConfigData.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(ShmDispenser->ConfigData.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(ShmDispenser->ConfigData.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(); tmpPowerConsumption += (uint64_t)((ShmDispenser->gun_info.inputVoltage.L1N_L12*ShmDispenser->gun_info.outputCurrent.L1N_L12[0])*((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 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 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 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; 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 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=0; struct DISPENSER previousCharger; if(InitShareMemory() == FAIL) { DEBUG_ERROR("InitShareMemory NG\n"); ShmDispenser->isInitialFail=1; sleep(5); return 0; } else { DEBUG_INFO("InitShareMemory OK.\n"); } Uart1Fd=InitComPort(); if(Uart1Fd<0) { DEBUG_ERROR("InitComPort NG\n"); ShmDispenser->isInitialFail=1; sleep(5); return 0; } else { DEBUG_INFO("ttyS1 port open success.\n"); } // Log output thread if(fork() == 0) { for(;;) { //========================================================== // High priority polling log print out //========================================================== if((current_timestamp() - tsPrintLog[PRIORITY_HIGH]) > (ShmDispenser->gun_info.legacyRequest.isLegacyRequest?3000:6000)) { tsPrintLog[PRIORITY_HIGH] = current_timestamp(); //=============================== // Config primary MCU LED //=============================== if((previousCharger.gun_info.primaryMcuLed.mode != ShmDispenser->gun_info.primaryMcuLed.mode) || (previousCharger.gun_info.primaryMcuLed.alarm_code != ShmDispenser->gun_info.primaryMcuLed.alarm_code)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 1 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU set Led mode : %d\n", ShmDispenser->gun_info.primaryMcuLed.mode); DEBUG_INFO("MCU set Alarm code : %x\n", ShmDispenser->gun_info.primaryMcuLed.alarm_code); previousCharger.gun_info.primaryMcuLed.mode = ShmDispenser->gun_info.primaryMcuLed.mode; previousCharger.gun_info.primaryMcuLed.alarm_code = ShmDispenser->gun_info.primaryMcuLed.alarm_code; } //=============================== // Config primary Legacy request //=============================== if(previousCharger.gun_info.legacyRequest.isLegacyRequest != ShmDispenser->gun_info.legacyRequest.isLegacyRequest) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 2 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU set relay request : %d\n", ShmDispenser->gun_info.legacyRequest.isLegacyRequest); previousCharger.gun_info.legacyRequest.isLegacyRequest = ShmDispenser->gun_info.legacyRequest.isLegacyRequest; } //=============================== // Query primary MCU status //=============================== if((previousCharger.gun_info.primaryMcuState.cp_state != ShmDispenser->gun_info.primaryMcuState.cp_state) || (previousCharger.gun_info.primaryMcuState.current_limit != ShmDispenser->gun_info.primaryMcuState.current_limit) || (previousCharger.gun_info.primaryMcuState.relay_state != ShmDispenser->gun_info.primaryMcuState.relay_state) || (previousCharger.gun_info.primaryMcuState.socket_e.isSocketEMode != ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEMode) || (previousCharger.gun_info.primaryMcuState.socket_e.isSocketEPinOn != ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEPinOn)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 3 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU get Pilot State : %d\n", ShmDispenser->gun_info.primaryMcuState.cp_state); DEBUG_INFO("MCU get Pilot Duty : %.2f\n", (float)ShmDispenser->gun_info.primaryMcuState.current_limit); DEBUG_INFO("MCU get Pilot Voltage Positive : %.2f\n", ShmDispenser->gun_info.primaryMcuState.cp_voltage_positive); DEBUG_INFO("MCU get Pilot Voltage Negative : %.2f\n", ShmDispenser->gun_info.primaryMcuState.cp_voltage_negtive); if(ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEPinOn == ON) DEBUG_INFO("Relay on mode : CHARGING_MODE_SOCKETE. \n"); else DEBUG_INFO("Relay on mode : CHARGING_MODE_BS / CHARGING_MODE_HLC. \n"); DEBUG_INFO("MCU get Relay State : %d\n", ShmDispenser->gun_info.primaryMcuState.relay_state); DEBUG_INFO("MCU get Rating Current : %.2f\n", (float)ShmDispenser->gun_info.primaryMcuState.rating_current); DEBUG_INFO("MCU get Rotary switch : %d\n", ShmDispenser->gun_info.primaryMcuState.rotatory_switch); DEBUG_INFO("MCU get is on Socket-E mode : %d\n", ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEMode); DEBUG_INFO("MCU get Socket-E detect pin : %d\n", ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEPinOn); //=============================== // Query primary MCU power consumption //=============================== DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 10 *****\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU get total power consumption : %f kWh\n",((float)ShmDispenser->gun_info.powerConsumptionTotal.power_consumption/10000.0)); DEBUG_INFO("MCU get L1N_L12 power consumption : %f kWh\n",((float)ShmDispenser->gun_info.powerConsumption[0].power_consumption/10000.0)); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { DEBUG_INFO("MCU get L2N_L23 power consumption : %f kWh\n",((float)ShmDispenser->gun_info.powerConsumption[1].power_consumption/10000.0)); DEBUG_INFO("MCU get L3N_L31 power consumption : %f kWh\n",((float)ShmDispenser->gun_info.powerConsumption[2].power_consumption/10000.0)); } /* DEBUG_INFO("MCU get Locker State : %d\n", ShmDispenser->gun_info.primaryMcuState.locker_state); DEBUG_INFO("MCU get Shutter State : %d\n", ShmDispenser->gun_info.primaryMcuState.shutter_state); DEBUG_INFO("MCU get Meter State : %d\n", ShmDispenser->gun_info.primaryMcuState.meter_state); DEBUG_INFO("MCU get PP State : %d\n", ShmDispenser->gun_info.primaryMcuState.pp_state); */ previousCharger.gun_info.primaryMcuState.cp_state = ShmDispenser->gun_info.primaryMcuState.cp_state; previousCharger.gun_info.primaryMcuState.current_limit = ShmDispenser->gun_info.primaryMcuState.current_limit; previousCharger.gun_info.primaryMcuState.relay_state = ShmDispenser->gun_info.primaryMcuState.relay_state; previousCharger.gun_info.primaryMcuState.socket_e.isSocketEMode = ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEMode; previousCharger.gun_info.primaryMcuState.socket_e.isSocketEPinOn = ShmDispenser->gun_info.primaryMcuState.socket_e.isSocketEPinOn; } //=============================== // Query primary MCU Alarm code //=============================== if((previousCharger.gun_info.primaryMcuAlarm.InputAlarmCode != ShmDispenser->gun_info.primaryMcuAlarm.InputAlarmCode)) { if((ShmDispenser->gun_info.primaryMcuAlarm.InputAlarmCode>0)) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 4 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU get OVP_L1 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OVP_L1); DEBUG_INFO("MCU get UVP_L1 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.UVP_L1); DEBUG_INFO("MCU get OCP_L1 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OCP_L1); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { DEBUG_INFO("MCU get OVP_L2 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OVP_L2); DEBUG_INFO("MCU get UVP_L2 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.UVP_L2); DEBUG_INFO("MCU get OCP_L2 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OCP_L2); DEBUG_INFO("MCU get OVP_L3 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OVP_L3); DEBUG_INFO("MCU get UVP_L3 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.UVP_L3); DEBUG_INFO("MCU get OCP_L3 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OCP_L3); } DEBUG_INFO("MCU get OTP : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.OTP); DEBUG_INFO("MCU get gmi_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.gmi_fault); DEBUG_INFO("MCU get cp_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.cp_fault); DEBUG_INFO("MCU get ac_leak : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.ac_leak); DEBUG_INFO("MCU get dc_leak : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.dc_leak); DEBUG_INFO("MCU get mcu_selftest_fail : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.mcu_selftest_fail); DEBUG_INFO("MCU get handshaking_timeout : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.handshaking_timeout); DEBUG_INFO("MCU get emergency_stop : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.emergency_stop); DEBUG_INFO("MCU get relay_welding : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.relay_welding); DEBUG_INFO("MCU get leak_module_fail : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.leak_module_fail); DEBUG_INFO("MCU get shutter_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.shutter_fault); DEBUG_INFO("MCU get locker_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.locker_fault); DEBUG_INFO("MCU get power_drop : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.power_drop); DEBUG_INFO("MCU get rotate_switch_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.rotate_switch_fault); DEBUG_INFO("MCU get short_circuit_L1 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.short_circuit_L1); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { DEBUG_INFO("MCU get short_circuit_L2 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.short_circuit_L2); DEBUG_INFO("MCU get short_circuit_L3 : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.short_circuit_L3); } DEBUG_INFO("MCU get relay_drive_fault : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.relay_drive_fault); DEBUG_INFO("MCU get meter_comm_timeout : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.meter_comm_timeout); DEBUG_INFO("MCU get meter_ic_comm_timeout : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.meter_ic_comm_timeout); DEBUG_INFO("MCU get pilot_negative_error : %d\n", ShmDispenser->gun_info.primaryMcuAlarm.bits.pilot_negative_error); DEBUG_INFO("MCU get InputAlarmCode : %x\n", ShmDispenser->gun_info.primaryMcuAlarm.InputAlarmCode); } DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 1 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU get Input voltage L1: %.2f\n", (float)ShmDispenser->gun_info.inputVoltage.L1N_L12); DEBUG_INFO("MCU get PresentChargingVoltage L1: %.2f\n", (float)ShmDispenser->gun_info.inputVoltage.L1N_L12); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { DEBUG_INFO("MCU get Input voltage L2: %f\n", (float)ShmDispenser->gun_info.inputVoltage.L2N_L23); DEBUG_INFO("MCU get PresentChargingVoltage L2: %.2f\n", (float)ShmDispenser->gun_info.inputVoltage.L2N_L23); DEBUG_INFO("MCU get Input voltage L3: %f\n", (float)ShmDispenser->gun_info.inputVoltage.L3N_L31); DEBUG_INFO("MCU get PresentChargingVoltage L3: %.2f\n", (float)ShmDispenser->gun_info.inputVoltage.L3N_L31); } previousCharger.gun_info.primaryMcuAlarm.InputAlarmCode = ShmDispenser->gun_info.primaryMcuAlarm.InputAlarmCode; } //=============================== // Query primary MCU BLE config //=============================== if((previousCharger.gun_info.bleConfigData.isLogin != ShmDispenser->gun_info.bleConfigData.isLogin) || (previousCharger.gun_info.bleConfigData.isRequestStart != ShmDispenser->gun_info.bleConfigData.isRequestStart) || (previousCharger.gun_info.bleConfigData.isRequestStop != ShmDispenser->gun_info.bleConfigData.isRequestStop)) { if(ShmDispenser->gun_info.bleConfigData.isLogin == ON) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 5 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU get isUserLogin : %d\n", ShmDispenser->gun_info.bleConfigData.isLogin); DEBUG_INFO("MCU get isRequestStartCharger : %d\n", ShmDispenser->gun_info.bleConfigData.isRequestStart); DEBUG_INFO("MCU get isRequestStopCharger : %d\n", ShmDispenser->gun_info.bleConfigData.isRequestStop); } previousCharger.gun_info.bleConfigData.isLogin = ShmDispenser->gun_info.bleConfigData.isLogin; previousCharger.gun_info.bleConfigData.isRequestStart = ShmDispenser->gun_info.bleConfigData.isRequestStart; previousCharger.gun_info.bleConfigData.isRequestStop = ShmDispenser->gun_info.bleConfigData.isRequestStop; } //=============================== // Query primary MCU ble login id //=============================== if((strcmp((char *)&previousCharger.gun_info.bleLoginCentralId.id,(char *)&ShmDispenser->gun_info.bleLoginCentralId.id) != 0)) { if(strcmp((char *)&ShmDispenser->gun_info.bleLoginCentralId.id,"") != 0) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("***** High priority polling : Case 6 ******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU get ble central id : %s\n", ShmDispenser->gun_info.bleLoginCentralId.id); } memcpy(&previousCharger.gun_info.bleLoginCentralId.id, ShmDispenser->gun_info.bleLoginCentralId.id, ARRAY_SIZE(ShmDispenser->gun_info.bleLoginCentralId.id)); } //========================================================== // Low priority polling log print out //========================================================== if((current_timestamp() - tsPrintLog[PRIORITY_LOW]) > (ShmDispenser->gun_info.legacyRequest.isLegacyRequest?3000:6000)) { tsPrintLog[PRIORITY_LOW] = current_timestamp(); switch(logIndex) { case 1: if((previousCharger.gun_info.outputCurrent.L1N_L12[0] != ShmDispenser->gun_info.outputCurrent.L1N_L12[0]) || (previousCharger.gun_info.outputCurrent.L2N_L23[0] != ShmDispenser->gun_info.outputCurrent.L2N_L23[0]) || (previousCharger.gun_info.outputCurrent.L3N_L31[0] != ShmDispenser->gun_info.outputCurrent.L3N_L31[0])) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 3 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU get output current L1: %f\n", (float)ShmDispenser->gun_info.outputCurrent.L1N_L12[0]); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { DEBUG_INFO("MCU get output current L2: %f\n", (float)ShmDispenser->gun_info.outputCurrent.L2N_L23[0]); DEBUG_INFO("MCU get output current L3: %f\n", (float)ShmDispenser->gun_info.outputCurrent.L3N_L31[0]); } previousCharger.gun_info.outputCurrent.L1N_L12[0] = ShmDispenser->gun_info.outputCurrent.L1N_L12[0]; previousCharger.gun_info.outputCurrent.L2N_L23[0] = ShmDispenser->gun_info.outputCurrent.L2N_L23[0]; previousCharger.gun_info.outputCurrent.L3N_L31[0] = ShmDispenser->gun_info.outputCurrent.L3N_L31[0]; } break; case 2: if(previousCharger.gun_info.gunPluginTimes.GunPluginTimes != ShmDispenser->gun_info.gunPluginTimes.GunPluginTimes) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 5 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU get gun plugin times : %ld\n", (long)ShmDispenser->gun_info.gunPluginTimes.GunPluginTimes); previousCharger.gun_info.gunPluginTimes.GunPluginTimes = ShmDispenser->gun_info.gunPluginTimes.GunPluginTimes; } break; case 3: if(previousCharger.gun_info.temperature.point[0] != ShmDispenser->gun_info.temperature.point[0]) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 7 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU get temperature : %d\n", ShmDispenser->gun_info.temperature.point[0]); previousCharger.gun_info.temperature.point[0] = ShmDispenser->gun_info.temperature.point[0]; } break; case 4: if(previousCharger.gun_info.primaryMcuCp_Pwn_Duty.max_current != ShmDispenser->gun_info.primaryMcuCp_Pwn_Duty.max_current) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 9 =====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU set cp pwn duty : %d\n", ShmDispenser->gun_info.primaryMcuCp_Pwn_Duty.max_current); previousCharger.gun_info.primaryMcuCp_Pwn_Duty.max_current = ShmDispenser->gun_info.primaryMcuCp_Pwn_Duty.max_current; } break; case 5: DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 11 ====\n"); DEBUG_INFO("===========================================\n"); if(ShmDispenser->gun_info.bleConfigData.isLogin && !ShmDispenser->isConnectedBackend) { DEBUG_INFO("Sync from MCU rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", ShmDispenser->gun_info.rtc.year, ShmDispenser->gun_info.rtc.month, ShmDispenser->gun_info.rtc.day, ShmDispenser->gun_info.rtc.hour, ShmDispenser->gun_info.rtc.min, ShmDispenser->gun_info.rtc.sec); } else { DEBUG_INFO("MCU set rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", ShmDispenser->gun_info.rtc.year, ShmDispenser->gun_info.rtc.month, ShmDispenser->gun_info.rtc.day, ShmDispenser->gun_info.rtc.hour, ShmDispenser->gun_info.rtc.min, ShmDispenser->gun_info.rtc.sec); } break; case 6: break; case 7: if(ShmDispenser->gun_info.isSetBreatheLedTiming == ON) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 17 ====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU set breathe led timing : Authed Fade in [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.set_Led_Action_Authed_Fade_In); DEBUG_INFO("MCU set breathe led timing : Authed Fade out [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.set_Led_Action_Authed_Fade_Out); DEBUG_INFO("MCU set breathe led timing : Charging Fade in [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In); DEBUG_INFO("MCU set breathe led timing : Charging Fade out [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out); DEBUG_INFO("MCU set breathe led timing : Connected Fade in [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.set_Led_Action_Connected_Fade_In); DEBUG_INFO("MCU set breathe led timing : Connected Fade out [%ld].\n", (long)ShmDispenser->gun_info.setBreatheLedTiming.set_Led_Action_Connected_Fade_Out); } break; case 8: if(ShmDispenser->gun_info.isSetLedBrightness == ON) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19 ====\n"); DEBUG_INFO("===========================================\n"); DEBUG_INFO("MCU set led brightness Sector 01 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_1); DEBUG_INFO("MCU set led brightness Sector 02 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_2); DEBUG_INFO("MCU set led brightness Sector 03 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_3); DEBUG_INFO("MCU set led brightness Sector 04 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_4); DEBUG_INFO("MCU set led brightness Sector 05 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_5); DEBUG_INFO("MCU set led brightness Sector 06 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_6); DEBUG_INFO("MCU set led brightness Sector 07 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_7); DEBUG_INFO("MCU set led brightness Sector 08 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_8); DEBUG_INFO("MCU set led brightness Sector 09 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_9); DEBUG_INFO("MCU set led brightness Sector 10 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_10); DEBUG_INFO("MCU set led brightness Sector 11 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_11); DEBUG_INFO("MCU set led brightness Sector 12 : [%x].\n", ShmDispenser->gun_info.setLedBrightness.sector_12); } break; default: logIndex = 0; break; } logIndex++; } } usleep(100000); } exit(0); } for(;;) { /* * Polling loop */ if((stepIndex%2)==0) { /* * High priority communication */ //=============================== // Case 1 : Config primary MCU LED //=============================== ShmDispenser->gun_info.primaryMcuLed.alarm_code = ShmDispenser->gun_info.systemAlarmCode.SystemAlarmCode; if(Config_AC_MCU_LED(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.primaryMcuLed)) { failCount = 0; } else { DEBUG_WARN("MCU set led fail...%d\n", failCount); if(failCountgun_info.legacyRequest)) { failCount = 0; } else { DEBUG_WARN("MCU set request fail...%d\n", failCount); if(failCountgun_info.primaryMcuState.relayState)) { failCount = 0; } else { DEBUG_WARN("MCU set relay fail...%d\n", failCount); if(failCountgun_info.primaryMcuState)) { ShmDispenser->gun_info.PilotVoltage.PilotVoltagePositive = ShmDispenser->gun_info.primaryMcuState.cp_voltage_positive; ShmDispenser->gun_info.PilotVoltage.PilotVoltageNegative = ShmDispenser->gun_info.primaryMcuState.cp_voltage_negtive; //pass info 2 CCS task if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_UNKNOWN) { if(ShmDispenser->gun_info.PilotVoltage.PilotVoltageNegative >= -12) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_G; } else { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_H; } } else if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_A) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_A; } else if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_B) { if(ShmDispenser->gun_info.PilotVoltage.PilotVoltageNegative == 0.0) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_B1; } else { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_B2; } } else if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_C) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_C; } else if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_D) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_D; } else if(ShmDispenser->gun_info.primaryMcuState.cp_state == CP_STATE_E) { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_E; } else //CP_STATE_F { ShmDispenser->gun_info.acCcsInfo.CpPresentState = CCS_CP_STATE_F; } ShmDispenser->gun_info.acCcsInfo.CpPositiveVoltage = ShmDispenser->gun_info.PilotVoltage.PilotVoltagePositive; ShmDispenser->gun_info.acCcsInfo.CpNegativeVoltage = ShmDispenser->gun_info.PilotVoltage.PilotVoltageNegative; ShmDispenser->gun_info.acCcsInfo.CpPresentPWMDuty = ShmDispenser->gun_info.primaryMcuState.current_limit; if(ShmDispenser->gun_info.primaryMcuState.relay_state) { ShmDispenser->gun_info.acCcsInfo.OutputRelayStatus = ON; } else { ShmDispenser->gun_info.acCcsInfo.OutputRelayStatus = OFF; } failCount = 0; } else { DEBUG_WARN("MCU get status fail...%d\n", failCount); if(failCountgun_info.primaryMcuAlarm)) { //DEBUG_INFO("MCU-%d get alarm code success.\n",gun_index); failCount = 0; ShmDispenser->gun_info.acCcsInfo.CSUAlarmStatusCode = ShmDispenser->gun_info.primaryMcuAlarm.InputAlarmCode; } else { DEBUG_WARN("MCU get alarm fail...%d\n", failCount); if(failCount0?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.mcuResetRequest.isMcuResetRequest == ON) { if(Config_AC_MCU_RESET_REQUEST(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.mcuResetRequest) == PASS) { DEBUG_INFO("*******************************************\n"); DEBUG_INFO("**** High priority polling : Case 7 *******\n"); DEBUG_INFO("*******************************************\n"); DEBUG_INFO("MCU set MCU reset Request : %d\n", ShmDispenser->gun_info.mcuResetRequest.isMcuResetRequest); ShmDispenser->gun_info.mcuResetRequest.isMcuResetRequest = OFF; failCount = 0; } else { DEBUG_WARN("MCU get MCU reset fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isSetCpPwmDuty == ON) { if(Config_AC_MaxCurrent_And_CpPwmDuty(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.primaryMcuCp_Pwn_Duty)) { failCount = 0; ShmDispenser->gun_info.mcuFlag.isSetCpPwmDuty = OFF; } else { DEBUG_WARN("MCU set cp pwn duty fail...%d\n", failCount); if(failCountgun_info.GPIO_Input)) { failCount = 0; } else { DEBUG_WARN("MCU get GPIO input fail...%d\n", failCount); if(failCountgun_info.powerConsumptionTotal, &ShmDispenser->gun_info.powerConsumption[0], &ShmDispenser->gun_info.powerConsumption[1], &ShmDispenser->gun_info.powerConsumption[2])) { failCount = 0; } else { DEBUG_WARN("MCU get power consumption fail...%d\n", failCount); if(failCountgun_info.inputVoltage) == PASS) { ShmDispenser->gun_info.acCcsInfo.GridVoltage[0] = ShmDispenser->gun_info.inputVoltage.L1N_L12; ShmDispenser->gun_info.acCcsInfo.GridVoltage[1] = ShmDispenser->gun_info.inputVoltage.L2N_L23; ShmDispenser->gun_info.acCcsInfo.GridVoltage[2] = ShmDispenser->gun_info.inputVoltage.L3N_L31; failCount = 0; } else { DEBUG_WARN("MCU get input voltage fail...%d\n", failCount); if(failCountgun_info.outputCurrent) == PASS) { #ifndef SIMULATION ShmDispenser->gun_info.acCcsInfo.EVSEPresentCurrent[0] = (float)ShmDispenser->gun_info.outputCurrent.L1N_L12[0]; ShmDispenser->gun_info.acCcsInfo.EVSEPresentCurrent[1] = (float)ShmDispenser->gun_info.outputCurrent.L1N_L12[0]; ShmDispenser->gun_info.acCcsInfo.EVSEPresentCurrent[2] = (float)ShmDispenser->gun_info.outputCurrent.L1N_L12[0]; #else //SIMULATION ShmDispenser->gun_info.outputCurrent.L1N_L12[0] = (float)(ShmDispenser->gun_info.SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmDispenser->gun_info.targetCurrent*10)-5))/10.0):0); if(ShmDispenser->ConfigData.AcPhaseCount == 3) { ShmDispenser->gun_info.outputCurrent.L2N_L23[0] = (float)(ShmDispenser->gun_info.SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmDispenser->gun_info.targetCurrent*10)-5))/10.0):0); ShmDispenser->gun_info.outputCurrent.L3N_L31[0] = (float)(ShmDispenser->gun_info.SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmDispenser->gun_info.targetCurrent*10)-5))/10.0):0); } #endif //SIMULATION failCount = 0; } else { DEBUG_WARN("MCU get output current fail...%d\n", failCount); if(failCountgun_info.gunPluginTimes) == PASS) { ShmDispenser->AcPlugInTimes = ((long)ShmDispenser->gun_info.gunPluginTimes.GunPluginTimes & 0xFFFF); failCount = 0; } else { DEBUG_WARN("MCU get gun plugin times fail...%d\n", failCount); if(failCountgun_info.temperature) == PASS) { failCount = 0; } else { DEBUG_WARN("MCU get temperature fail...%d\n", failCount); if(failCountgun_info.rtc)) { struct timeb csuTime, mcuTime; struct tm *tmCSU; struct tm tmMcu; ftime(&csuTime); tmCSU = localtime(&csuTime.time); tmMcu.tm_year = ShmDispenser->gun_info.rtc.year-1900; tmMcu.tm_mon = ShmDispenser->gun_info.rtc.month-1; tmMcu.tm_mday = ShmDispenser->gun_info.rtc.day; tmMcu.tm_hour = ShmDispenser->gun_info.rtc.hour; tmMcu.tm_min = ShmDispenser->gun_info.rtc.min; tmMcu.tm_sec = ShmDispenser->gun_info.rtc.sec; mcuTime.time = mktime(&tmMcu); if(ShmDispenser->gun_info.bleConfigData.isLogin && !ShmDispenser->isConnectedBackend) { if(abs(DiffTimeb(csuTime, mcuTime)) > 10000) { char cmdBuf[128]; sprintf(cmdBuf, "date -u -s \"%04d-%02d-%02d %02d:%02d:%02d\"", ShmDispenser->gun_info.rtc.year, ShmDispenser->gun_info.rtc.month, ShmDispenser->gun_info.rtc.day, ShmDispenser->gun_info.rtc.hour, ShmDispenser->gun_info.rtc.min, ShmDispenser->gun_info.rtc.sec); system(cmdBuf); system("hwclock -w -u"); system("hwclock -s"); } } else { if(abs(DiffTimeb(csuTime, mcuTime)) > 10000) { ShmDispenser->gun_info.rtc.year = tmCSU->tm_year+1900; ShmDispenser->gun_info.rtc.month = tmCSU->tm_mon+1; ShmDispenser->gun_info.rtc.day = tmCSU->tm_mday; ShmDispenser->gun_info.rtc.hour = tmCSU->tm_hour; ShmDispenser->gun_info.rtc.min = tmCSU->tm_min; ShmDispenser->gun_info.rtc.sec = tmCSU->tm_sec; Config_RTC(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.rtc); } } failCount = 0; } else { DEBUG_WARN("MCU get rtc fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isMcuUpgradeReq) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 15 ====\n"); DEBUG_INFO("===========================================\n"); unsigned char cmd[512]; if(Upgrade_UART(Uart1Fd, AC_WALLMOUNT_CONTROLLER, ADDR_AC_PRIMARY_1, ShmDispenser->fwUpgradeInfo.location, ShmDispenser->fwUpgradeInfo.modelName)) { DEBUG_INFO("MCU upgrade firmware OK...%s\n", ShmDispenser->gun_info.ver.Version_FW); sleep(20); ShmDispenser->gun_info.mcuFlag.isMcuUpgradeReq = OFF; failCount = 0; } else { DEBUG_WARN("MCU upgrade firmware fail...%d\n", failCount); if(failCountfwUpgradeInfo.location); system((char*)cmd); } break; case 15: //=============================== // Config set breathe led timing //=============================== if(ShmDispenser->gun_info.isSetBreatheLedTiming == ON) { if(Config_AC_Set_Breathe_Led_Timing(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.setBreatheLedTiming)) { failCount = 0; ShmDispenser->gun_info.isSetBreatheLedTiming = OFF; } else { DEBUG_WARN("MCU set breathe led timing fail...%d\n", failCount); if(failCountgun_info.isSetLedBrightness == ON) { if(Config_AC_Set_Led_Brightness(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.setLedBrightness)) { failCount = 0; ShmDispenser->gun_info.isSetLedBrightness = OFF; } else { DEBUG_WARN("MCU set led brightness fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isReadFwVerPass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-1===\n"); DEBUG_INFO("===========================================\n"); if(Query_FW_Ver(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.ver) == PASS) { DEBUG_INFO("MCU get firmware version : %s\n", ShmDispenser->gun_info.ver.Version_FW); ShmDispenser->gun_info.mcuFlag.isReadFwVerPass = PASS; failCount = 0; } else { DEBUG_WARN("MCU get firmware version fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isReadMeterIcCorrectionStatus != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-2===\n"); DEBUG_INFO("===========================================\n"); if(Query_MeterIc_CorrectionPara(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.meterIcCorrectionStatus) == PASS) { DEBUG_INFO("MCU get meter ic correction status: 0x%08X\n", ShmDispenser->gun_info.meterIcCorrectionStatus.value); ShmDispenser->gun_info.mcuFlag.isReadMeterIcCorrectionStatus = PASS; failCount = 0; } else { DEBUG_WARN("MCU get meter ic correction status fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isSetSerialNumberPass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-3===\n"); DEBUG_INFO("===========================================\n"); memcpy(&ShmDispenser->evseId.serial_number, &ShmDispenser->ConfigData.SerialNumber, ARRAY_SIZE(ShmDispenser->evseId.serial_number)); if(Config_Serial_Number(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->evseId)) { DEBUG_INFO("MCU set serial number : %.12s\n", ShmDispenser->evseId.serial_number); ShmDispenser->gun_info.mcuFlag.isSetSerialNumberPass = PASS; failCount = 0; } else { DEBUG_WARN("MCU set serial number fail...%d\n", failCount); if(failCountgun_info.mcuFlag.isSetModelNamePass != PASS) { DEBUG_INFO("===========================================\n"); DEBUG_INFO("==== Normal priority polling : Case 19-4===\n"); DEBUG_INFO("===========================================\n"); memcpy(&ShmDispenser->evseId.model_name, &ShmDispenser->ConfigData.ModelName, ARRAY_SIZE(ShmDispenser->evseId.model_name)); if(Config_Model_Name(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->evseId)) { DEBUG_INFO("MCU set model name : %.14s\n", ShmDispenser->evseId.model_name); ShmDispenser->gun_info.mcuFlag.isSetModelNamePass = PASS; failCount = 0; } else { DEBUG_WARN("MCU set model name fail...%d\n", failCount); if(failCountgun_info.setAuxPowerSwitch.power_switch = 0x01; ShmDispenser->gun_info.setAuxPowerSwitch.power_switch = ShmDispenser->gun_info.isMeterOn; if(Config_Aux_Power_Switch(Uart1Fd, ADDR_AC_PRIMARY_1, &ShmDispenser->gun_info.setAuxPowerSwitch)) { failCount = 0; } else { DEBUG_WARN("MCU set aux power switch fail...%d\n", failCount); if(failCount= FAIL_SPEC_COMM) { if((0 <= failCount%FAIL_SPEC_COMM) && (failCount%FAIL_SPEC_COMM < 10)) sleep(10); if(ShmDispenser->gun_info.primaryMcuAlarm.bits.comm_timeout == OFF) { DEBUG_ERROR("Primary MCU communication fault"); ShmDispenser->gun_info.primaryMcuAlarm.bits.comm_timeout = ON; } } else { if(ShmDispenser->gun_info.primaryMcuAlarm.bits.comm_timeout == ON) { DEBUG_ERROR("Primary MCU communication recover"); ShmDispenser->gun_info.primaryMcuAlarm.bits.comm_timeout = OFF; } } usleep(100000); } return FAIL; }