/* * Main.c * * Created on: 2019年8月6日 * Author: 7564 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*標準輸入輸出定義*/ #include /*標準函數庫定義*/ #include /*Unix 標準函數定義*/ #include /*檔控制定義*/ #include /*PPSIX 終端控制定義*/ #include /*錯誤號定義*/ #include #include #include #include #include #include #include #include "../../define.h" #include "Config.h" #include "Module_EvComm.h" #include "Common.h" typedef unsigned char byte; #define PASS 1 #define FAIL -1 #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0])) #define NO_DEFINE 255 #define DEFAULT_AC_INDEX 2 #define TTY_PATH "/dev/tty" #define STTY_US "stty raw -echo -F " #define STTY_DEF "stty -raw echo -F " struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; struct PrimaryMcuData *ShmPrimaryMcuData; struct CHAdeMOData *ShmCHAdeMOData; struct CcsData *ShmCcsData; struct GBTData *ShmGBTData; struct FanModuleData *ShmFanModuleData; struct RelayModuleData *ShmRelayModuleData; struct LedModuleData *ShmLedModuleData; struct PsuData *ShmPsuData; ChargerInfoData *ShmChargerInfo; PsuPositionInfoData *ShmPsuPosition; PsuGroupingInfoData *ShmPsuGrouping; PsuGroupCollectionData *ShmGroupCollection; struct ChargingInfoData *_chargingData[CONNECTOR_QUANTITY]; struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY]; char *msg = "state : get gun state (index) \n" "card : scanning card (x) : \n" "gun : get gun plugit state (index) \n" "lock : get gun locked state (index) \n" "self : self test state (x) \n" "ver : ver of board (407 or index or rb or fan) \n" "ac : get ac relay state (x) \n" "gunchg: set gun start charging \n" "gunstp: set gun stop charging \n" "gunext: extend gun capability \n"; bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData) { for (byte index = 0; index < CHAdeMO_QUANTITY; index++) { if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target) { chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index]; return true; } } for (byte index = 0; index < CCS_QUANTITY; index++) { if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target) { chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index]; return true; } } for (byte index = 0; index < GB_QUANTITY; index++) { if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target) { chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index]; return true; } } if(GENERAL_GUN_QUANTITY > 0 && target < GENERAL_GUN_QUANTITY) { chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[target].GeneralChargingData; return true; } return false; } bool FindAcChargingInfoData(byte target, struct ChargingInfoData **acChargingData) { if (target < AC_QUANTITY) { acChargingData[target] = &ShmSysConfigAndInfo->SysInfo.AcChargingData[target]; return true; } return false; } int InitShareMemory() { int result = PASS; int MeterSMId; //initial ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0) { result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } else {} //initial ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0) { result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } else {} if (CHAdeMO_QUANTITY > 0) { if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } else { } } if (CCS_QUANTITY > 0) { if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } else { } } if (GB_QUANTITY > 0) { if ((MeterSMId = shmget(ShmGBTCommKey, sizeof(struct GBTData), IPC_CREAT | 0777)) < 0) { return 0; } else if ((ShmGBTData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { return 0; } memset(ShmGBTData, 0, sizeof(struct GBTData)); } if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData), 0777)) < 0) { result = FAIL; } else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if ((MeterSMId = shmget(SM_ChargerInfoKey, sizeof(ChargerInfoData), IPC_CREAT | 0777)) < 0) { result = FAIL; } else if ((ShmChargerInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { result = FAIL; } if(result == PASS) { ShmPsuPosition = &ShmChargerInfo->PsuPosition; ShmPsuGrouping = &ShmChargerInfo->PsuGrouping; ShmGroupCollection = &ShmChargerInfo->PsuGrouping.GroupCollection[0]; } return result; } void RunStatusProc(char *v1, char *v2) { printf("OrderCharging = %d \n", ShmSysConfigAndInfo->SysInfo.OrderCharging); printf("WaitForPlugit = %d \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit); if (strcmp(v1, "ac") == 0) { if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) { printf("FindChargingInfoData (AC) false \n"); } printf("AC Status = %d \n", ac_chargingInfo[0]->ConnectorPlugIn); return; } int _index = atoi(v1); if (_index <= 1) { if (!FindChargingInfoData(_index, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) { // get printf ("index = %x, status = %x (%d)\n", _index, _chargingData[_index]->SystemStatus, _chargingData[_index]->IsAvailable); printf ("SystemTimeoutFlag = %d, PageIndex = %d\n", ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag, ShmSysConfigAndInfo->SysInfo.PageIndex); printf("ConnectorAlarmCode = %s \n", _chargingData[_index]->ConnectorAlarmCode); printf("EvConnAlarmCode = %s \n", _chargingData[_index]->EvConnAlarmCode); printf("RemotenAlarmCode = %s \n", ShmSysConfigAndInfo->SysInfo.ConnectorInfo[_index].RemotenAlarmCode); } else { // set _chargingData[_index]->SystemStatus = atoi(v2); } } else { if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) { printf("FindChargingInfoData (AC) false \n"); } if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) { // get printf ("AC Type, status = %x (%d)\n", ac_chargingInfo[0]->SystemStatus, ac_chargingInfo[0]->IsAvailable); } else { // set ac_chargingInfo[0]->SystemStatus = atoi(v2); } } } void RunCardProc(char *v1, char *v2) { if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) { if (ShmSysConfigAndInfo->SysInfo.WaitForPlugit) { ShmSysConfigAndInfo->SysInfo.WaitForPlugit = 0x00; printf ("SysInfo.WaitForPlugit = %x \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit); } else { ShmSysConfigAndInfo->SysInfo.WaitForPlugit = 0x01; printf ("SysInfo.WaitForPlugit = %x \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit); } } else { strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, strlen(v1)); ShmSysConfigAndInfo->SysConfig.UserId[strlen(v1)] = '\0'; printf("StartUserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId); } } void RunGunPlugitProc(char *v1, char *v2) { if (strcmp(v1, "ac") == 0) { if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) { printf("FindChargingInfoData (AC) false \n"); } if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) { // get printf("ConnectorPlugIn = %d \n", ac_chargingInfo[0]->ConnectorPlugIn); } else { // set ac_chargingInfo[0]->ConnectorPlugIn = atoi(v2); } return; } int _index = atoi(v1); if (!FindChargingInfoData(_index, &_chargingData[0])) { printf("FindChargingInfoData error\n"); return; } if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) { // get printf("index = %x, plug it = %x\n", _index, _chargingData[_index]->ConnectorPlugIn); } else { // set _chargingData[_index]->ConnectorPlugIn = atoi(v2); } } void GetGunLockStatusProc(char *v1, char *v2) { int _index = atoi(v1); if (!FindChargingInfoData(_index, &_chargingData[0])) { printf("FindChargingInfoData error\n"); return; } if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0) { _chargingData[_index]->GunLocked = atoi(v2); } printf("Gun Locked Status = %d \n", _chargingData[_index]->GunLocked); } void SetSystemIDProc() { char *systemId = "Alston_Test"; memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId, systemId, strlen(systemId)); } void RunSelfProc() { printf("self test status = %x\n", ShmSysConfigAndInfo->SysInfo.SelfTestSeq); } void ShowFwVer(void) { printf("\r\nPower Cabinet, Model Name: %s, SN: %s", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber); printf("\r\n Csu Bootload: %s", ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev); //printf("\r\n Csu Kernel: %s", ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev); printf("\r\n Csu Kernel: "); for(int i = 0; i < strlen((char *)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev); i++) { if(ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev[i] != '\r' && ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev[i] != '\n') { printf("%c", ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev[i]); } } printf("\r\n Csu Root Fs: %s", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev); printf("\r\n Csu Primary: %s", ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev); printf("\r\n Fan Module: %s", ShmSysConfigAndInfo->SysInfo.FanModuleFwRev); printf("\r\n Relay1 Module: %s", ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev); printf("\r\n Relay2 Module: %s", ShmSysConfigAndInfo->SysInfo.Relay2ModuleFwRev); for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity; i++) { printf("\r\n\r\nDispenser[%d] Status: %d", i, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus); if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus != _DS_None && ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus != _DS_Timeout) { printf(", Model Name: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ModelName); printf("\r\n Csu Bootload: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuBootLoadFwRev); //printf("\r\n Csu Kernel: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuKernelFwRev); printf("\r\n Csu Kernel: "); for(int j = 0; j < strlen((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuKernelFwRev); j++) { if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuKernelFwRev[j] != '\r' && ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuKernelFwRev[j] != '\n') { printf("%c", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuKernelFwRev[j]); } } printf("\r\n Csu Root Fs: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuRootFsFwRev); printf("\r\n Csu Primary: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].CsuPrimFwRev); printf("\r\n Fan Module: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].FanModuleFwRev); printf("\r\n Relay Module: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].RelayModuleFwRev); printf("\r\n Connector 1: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Connector1FwRev); printf("\r\n Connector 2: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Connector2FwRev); printf("\r\n Led Module: %s", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LedModuleFwRev); } } printf("\r\n\r\n"); } void GetFwVerProc(char *v1) { if (strcmp(v1, "407") == 0) { printf("407 FW Version = %s \n", ShmPrimaryMcuData->version); } else if (strcmp(v1, "0") == 0 || strcmp(v1, "1") == 0 || strcmp(v1, "2") == 0 || strcmp(v1, "3") == 0) { int _index = atoi(v1); if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[_index].Enable) { int dispenser = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[_index].ParentDispensetIndex; int ParentIndex = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[_index].GeneralChargingData.Index; if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenser].LocalStatus != _DS_None && ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenser].LocalStatus != _DS_Timeout) { if(ParentIndex == 0) { printf("Gun %d FW Version = %s \n", _index, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenser].Connector1FwRev); } else { printf("Gun %d FW Version = %s \n", _index, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenser].Connector1FwRev); } } } else { printf("Gun %d is disable\r\n", _index); } } else if (strcmp(v1, "rb") == 0) { printf("RB1 Version = %s \n", ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev); printf("RB2 Version = %s \n", ShmSysConfigAndInfo->SysInfo.Relay2ModuleFwRev); } else if (strcmp(v1, "fan") == 0) { printf("FAN Version = %s \n", ShmSysConfigAndInfo->SysInfo.FanModuleFwRev); } else if (strcmp(v1, "dc") == 0) { printf("DC Main Version = %s \n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev); } else if (strcmp(v1, "led") == 0) { printf("LED Version = %s \n", ShmSysConfigAndInfo->SysInfo.LedModuleFwRev); } } void CreateOneError(char *v1) { int value = atoi(v1); ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = value; ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value; } void GetAuthorizeFlag(char *v1) { if (strcmp(v1, "-1") == 0|| strcmp(v1, "") == 0) printf("AuthorizeFlag = %d \n", ShmSysConfigAndInfo->SysInfo.AuthorizeFlag); else ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = atoi(v1); } void GetOrClearId(char *v1) { int _index = atoi(v1); if (!FindChargingInfoData(_index, &_chargingData[0])) { printf("FindChargingInfoData error\n"); return; } printf("Card Number = %s \n", _chargingData[_index]->StartUserId); } void FwUpdateFlagProc() { ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = 0x01; } void CheckAcStatus(char *v1) { if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) { printf(" AC Contactor Ctrl: %d\r\n", ShmChargerInfo->Control.RelayCtrl.bits.AcContactor); printf(" AC Off By Psu : %d\r\n", ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByPsu); printf(" AC Off ByEmergency: %d\r\n", ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByEmergency); printf("AC Contactor Status: %d\r\n", ShmSysConfigAndInfo->SysInfo.AcContactorStatus); } else { if(system("pidof -s main > /dev/null") != 0) { if(strcmp(v1, "0") == 0) { ShmChargerInfo->Control.RelayCtrl.bits.AcContactor = false; ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByPsu = false; ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByEmergency = false; printf("Set AC Contactor Off\r\n"); } else { ShmChargerInfo->Control.RelayCtrl.bits.AcContactor = true; ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByPsu = false; ShmChargerInfo->Control.RelayCtrl.bits.AcContactorOffByEmergency = false; printf("Set AC Contactor On\r\n"); } } else { printf("main task is running\r\n"); } } } void SetCableChkStatus(char *v1, char *v2) { int _index = atoi(v1); if (!FindChargingInfoData(_index, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } _chargingData[_index]->GroundFaultStatus = atoi(v2); } void SetPowerValue(char *v1, char *v2) { int _index = atoi(v1); float _Current = atof(v2); // 盲沖的時候才允許使用~ if (_chargingData[_index]->Type != 9) return; if (!FindChargingInfoData(_index, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } _chargingData[_index]->EvBatterytargetCurrent = _Current; } void GetSystemInfo() { printf ("\r\n ModelName = %s", ShmSysConfigAndInfo->SysConfig.ModelName); printf ("\r\nSerialNumber = %s", ShmSysConfigAndInfo->SysConfig.SerialNumber); printf ("\r\nInternetConn = %d", ShmSysConfigAndInfo->SysInfo.InternetConn); printf ("\r\nMaxChargingPower = %d kW, MaxChargingCurrent = %d A", ShmSysConfigAndInfo->SysConfig.MaxChargingPower, ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent); printf("\r\n\r\n"); } void ChangeGunNum() { if (ShmSysConfigAndInfo->SysInfo.CurGunSelected + 1 < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount) { ShmSysConfigAndInfo->SysInfo.CurGunSelected += 1; ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE; } else if (ShmSysConfigAndInfo->SysConfig.AcConnectorCount > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE) ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX; else { ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0; ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE; } } void GetGunSelectedNum(char *v1) { if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) { if (AC_QUANTITY > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE) { printf("connector select changed = AC \n"); } else printf("connector selected = %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected); } else { int _index = atoi(v1); if (_index <= 1) { ShmSysConfigAndInfo->SysInfo.CurGunSelected = _index; ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE; printf("connector select changed = %d \n", _index); } else if (AC_QUANTITY > 0) { ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX; printf("connector select changed = AC \n"); } } } void SetFanSpeed(char *v1) { int speed = atoi(v1); ShmFanModuleData->TestFanSpeed = speed; } void GetFanSpeed() { printf("Target Speed = %d \n", ShmFanModuleData->TestFanSpeed); printf("ShmFanModuleData->PresentFan1Speed = %d \n", ShmFanModuleData->PresentFan1Speed); printf("ShmFanModuleData->PresentFan2Speed = %d \n", ShmFanModuleData->PresentFan2Speed); printf("ShmFanModuleData->PresentFan3Speed = %d \n", ShmFanModuleData->PresentFan3Speed); printf("ShmFanModuleData->PresentFan4Speed = %d \n", ShmFanModuleData->PresentFan4Speed); } void SetDebugMode(char *v1) { int mode = atoi(v1); ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag = mode; } void SetGFDMode(char *v1) { int mode = atoi(v1); ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag = mode; } // Gun Temp Chiller PSU 0 PSU 1 PSU 2 ... // 1 XXX XXX XXX XXX XXX XXX void GetTemperature(char *v1) { bool show = false; char strGunTemp[16], strChillerTemp[16]; if(strcmp(v1, "c") == 0) { printf("\r\n Get c Parameter"); show = true; } do { printf("\r\n Gun Temp Chiller PSU 0 PSU 1 PSU 2 ..."); for(int i = 0; i < CONNECTOR_QUANTITY; i++) { sprintf(strGunTemp, "N/A"); sprintf(strChillerTemp, "N/A"); if(_chargingData[i]->ConnectorTemp != 0 && _chargingData[i]->ConnectorTemp != 0xFF) { sprintf(strGunTemp, "%3d", _chargingData[i]->ConnectorTemp - 60); } if(_chargingData[i]->ChillerTemp != 0 && _chargingData[i]->ChillerTemp != 0xFF) { sprintf(strChillerTemp, "%3d", _chargingData[i]->ChillerTemp - 60); } printf("\r\n %d %s %s ", i + 1, strGunTemp, strChillerTemp); for(int j = 0; j < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; j++) { printf(" %3d ", ShmPsuData->PsuGroup[i].PsuModule[j].ExletTemp); } } printf("\r\n"); if(show) { sleep(1); } }while(show); } void GetAcInputVol() { printf("L1N_L12 = %f, L2N_L23 = %f, L3N_L31 = %f \n", ShmSysConfigAndInfo->SysInfo.InputVoltageR, ShmSysConfigAndInfo->SysInfo.InputVoltageS, ShmSysConfigAndInfo->SysInfo.InputVoltageT); } void GetPsuInformation(char *v1, char *v2, char *v3) { printf("**********************AC Contact needed*************************\n"); if(strcmp(v1, "count") == 0) { for (int i = 0; i < 4; i++) { printf("Group Index = %d, Module Count = %d \n", i, ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity); } } else if(strcmp(v1, "ver") == 0) { for (int i = 0; i < ShmPsuData->SystemPresentPsuQuantity; i++) { printf("Psu Index = %d, PriVersion = %s, SecVersion = %s \n", i, ShmPsuData->PsuVersion[i].FwPrimaryVersion, ShmPsuData->PsuVersion[i].FwSecondVersion); } for (int i = 0; i < ShmPsuData->GroupCount; i++) { for (int j = 0; j < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; j++) { printf("Group Index = %d, Psu Index = %d, Version = %s \n", i, j, ShmPsuData->PsuGroup[i].PsuModule[j].FwVersion); } } } else if(strcmp(v1, "cap") == 0) { for (int i = 0; i < ShmPsuData->GroupCount; i++) { printf("Group Index = %d, MaxCur = %d, Power = %d \n", i, ShmPsuData->PsuGroup[i].GroupAvailableCurrent, ShmPsuData->PsuGroup[i].GroupAvailablePower); } } else if(strcmp(v1, "input") == 0) { for (int i = 0; i < ShmPsuData->GroupCount; i++) { for (byte count = 0; count < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; count++) { printf("gp = %d, Index = %d, volR = %d, volS = %d, volT = %d \n", i, count, ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL1, ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL2, ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL3); } } } else if (strcmp(v1, "output") == 0) { for (int i = 0; i < ShmPsuData->GroupCount; i++) { printf("Group Index = %d, OutputV = %d, OutputC = %d \n", i, ShmPsuData->PsuGroup[i].GroupPresentOutputVoltage, ShmPsuData->PsuGroup[i].GroupPresentOutputCurrent); } } else if (strcmp(v1, "test") == 0) { int mode = atoi(v2); if (mode >= _TEST_MODE && mode <= _TEST_MODE) { ShmPsuData->Work_Step = mode; } } else if (strcmp(v1, "out") == 0) { float vol = atof(v2); float cur = atof(v3); if (ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE) { if (!FindChargingInfoData(0, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } _chargingData[0]->EvBatterytargetVoltage = vol; _chargingData[0]->EvBatterytargetCurrent = cur; } } printf("*************************************************\n"); } void GetConnectorCapInfo(char *v1) { int _GunIndex = atoi(v1); if (!FindChargingInfoData(_GunIndex, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } printf ("Charger Max Current = %d, Max Power = %d \n", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent * 10, ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10); printf ("Index = %d, MaxPow = %f, MaxVol = %f, MaxCur = %f\n", _GunIndex, _chargingData[_GunIndex]->RealMaxPower, _chargingData[_GunIndex]->RealMaxVoltage, _chargingData[_GunIndex]->RealMaxCurrent); } static void get_char(char *word) { fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_sec = 0; tv.tv_usec = 10; //wait input timout time //if input if (select(1, &rfds, NULL, NULL, &tv) > 0) { fgets(word, 128, stdin); } } void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3) { int _GunIndex = atoi(v1); float _Voltage = atof(v2); float _Current = atof(v3); unsigned char PreviousSystemStatus = 0xff; if (!FindChargingInfoData(_GunIndex, &_chargingData[0])) { printf ("FindChargingInfoData error\n"); return; } printf ("ReqVoltage = %f, ReqCurrent = %f\n", _Voltage, _Current); if(_Voltage > 1000 || _Voltage < 50) { printf ("Input Voltage over range\n"); return; } // if(_Current > 100 || _Current < 2){ // // printf ("Input Current over range\n"); // return; // } //測試期間先跳過自我測試 _STEST_COMPLETE = 0xfe //ShmSysConfigAndInfo->SysInfo.SelfTestSeq = 0xfe; //kill ev task system("killall Module_EvComm"); //_Voltage = (_Voltage * 10); //_Current = (_Current * 10); //system(STTY_US TTY_PATH); while(true) { //fix gun 1 ShmSysConfigAndInfo->SysInfo.CurGunSelected = _GunIndex; switch(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { case S_IDLE: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; printf ("[UnconditionalCharge - S_IDLE]\n"); } ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x01; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARNING; } break; case S_PREPARNING: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; printf ("[UnconditionalCharge - S_PREPARNIN]\n"); //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完) printf ("wait find module\n"); } //main 會在此階段判斷以下資料跳到下一個 state //用來得知 AC 是否有搭上 (搭上模組的資訊才會出來) 因為每次 AC_Contactor //ShmPsuData->SystemPresentPsuQuantity; //ShmPsuData->PsuGroup[gun_index].GroupPresentPsuQuantity; //ShmPsuData->PsuGroup[gun_index].GroupAvailablePower; //_chargingData[gun_index]->AvailableChargingPower; //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完) //sleep(10); //清除 main timeout 機制 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9; } break; case S_PREPARING_FOR_EV: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n"); printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10,_Current * 10); } //清除 main timeout 機制 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9; //充電電壓電流 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000; //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 ) //確定模組己升壓完成 //if(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage <= (3000+500) && // _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage >= (3000-500) ) { printf ("Precharge Done = %f \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage); //EV done _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARING_FOR_EVSE; } } break; case S_PREPARING_FOR_EVSE: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; printf ("[UnconditionalCharge - S_PREPARING_FOR_EVSE]\n"); } //printf ("tar vol = %d \n", _Voltage); //printf ("tar cur = %d \n", _Current); //清除 main timeout 機制 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9; //充電電壓電流 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000; //printf ("tar vol_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage); // printf ("tar cur_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent); //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 ) //確定模組己升壓完成 //if(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x01 || // _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x03) //{ //printf ("First Ground Fault State (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus); printf ("Wait K1K2 = %f \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage); sleep(5); //EV done _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_CHARGING; //} //else if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus > 0x02) //{ // printf ("First Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus); // _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING; //} } break; case S_CHARGING: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; //充電電壓電流 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _Voltage; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _Current; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000; printf ("[UnconditionalCharge - S_CHARGING]\n"); } //ev task do this _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower = ((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000); if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x02){ printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus); _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING; } } break; case S_TERMINATING: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; system("/root/Module_EvComm &"); printf ("[UnconditionalCharge - S_TERMINATING]\n"); //無阻塞偵測 keybaord 結束 system(STTY_DEF TTY_PATH); } sleep(3); _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_COMPLETE; return; } break; case S_COMPLETE: { if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus) { PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus; printf ("[UnconditionalCharge - S_COMPLETE]\n"); } sleep(3); return; } break; } char word[128]; char newString[7][10]; int i,j,ctr; memset(word, 0x00, sizeof(word)); get_char(word); if (strlen(word) == 0) { continue; } j=0; ctr=0; strcpy(newString[1], "-1"); strcpy(newString[2], "-1"); for (i = 0; i <= (strlen(word)); i++) { if (word[i] == ' ' || word[i] == '\0' || word[i] == 10) { newString[ctr][j] = '\0'; ctr++; j = 0; } else { newString[ctr][j] = word[i]; j++; } } if(strcmp(newString[0], "chg") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; if (strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) continue; float _vol = atof(newString[1]); float _cur = atof(newString[2]); if (_cur <= 0 || _cur <= 0) continue; printf("vol = %f, cur = %f \n", _vol, _cur); _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur; } else if (strcmp(newString[0], "c") == 0) { printf("stop \n\r"); ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x00; _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING; } usleep(100000); } } void RunUnconditionalCharge(char *v1, char *v2, char *v3, char *v4) { float _Voltage[2], _Current[2]; _Voltage[0] = atof(v1); _Current[0] = atof(v2); _Voltage[1] = atof(v3); _Current[1] = atof(v4); unsigned char PreviousSystemStatus[2] = {0xff, 0xff}; if(!FindChargingInfoData(0, &_chargingData[0])) { printf ("FindChargingInfoData 0 error\n"); return; } if(!FindChargingInfoData(1, &_chargingData[0])) { printf ("FindChargingInfoData 1 error\n"); return; } printf ("Gun 1: ReqVoltage = %f, ReqCurrent = %f\n", _Voltage[0], _Current[0]); printf ("Gun 2: ReqVoltage = %f, ReqCurrent = %f\n", _Voltage[1], _Current[1]); if(_Voltage[0] > 1000 || _Voltage[0] < 50 || _Voltage[1] > 1000 || _Voltage[1] < 50) { printf ("Input Voltage over range\n"); return; } //kill ev task system("killall Module_EvComm"); while(true) { if(_chargingData[0]->SystemStatus == S_IDLE && _chargingData[1]->SystemStatus == S_IDLE) { _chargingData[0]->SystemStatus = S_REASSIGN_CHECK; _chargingData[1]->SystemStatus = S_REASSIGN_CHECK; ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_AVER; ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE; } if(_chargingData[0]->SystemStatus == S_COMPLETE && _chargingData[1]->SystemStatus == S_COMPLETE) { system(STTY_DEF TTY_PATH); sleep(5); return; } for(int i = 0; i < 2; i++) { switch(_chargingData[i]->SystemStatus) { case S_IDLE: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; printf ("[UnconditionalCharge (%d) - S_IDLE]\n", i); } } break; case S_PREPARNING: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; printf ("[UnconditionalCharge (%d) - S_PREPARNIN]\n", i); printf ("wait find module\n"); } //清除 main timeout 機制 _chargingData[i]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[i]->Type = 9; } break; case S_PREPARING_FOR_EV: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; printf ("[UnconditionalCharge (%d) - S_PREPARING_FOR_EV]\n", i); printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage[i] * 10,_Current[i] * 10); } //清除 main timeout 機制 _chargingData[i]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[i]->Type = 9; //充電電壓電流 _chargingData[i]->EvBatterySoc = 50; _chargingData[i]->EvBatterytargetVoltage = 500; _chargingData[i]->EvBatterytargetCurrent = 2; _chargingData[i]->AvailableChargingCurrent = 1000; printf ("Precharge Done = %f \n", _chargingData[i]->PresentChargingVoltage); _chargingData[i]->SystemStatus = S_PREPARING_FOR_EVSE; } break; case S_PREPARING_FOR_EVSE: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; printf ("[UnconditionalCharge (%d) - S_PREPARING_FOR_EVSE]\n", i); } //清除 main timeout 機制 _chargingData[i]->TimeoutFlag = 0; //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step _chargingData[i]->Type = 9; //充電電壓電流 _chargingData[i]->EvBatterySoc = 50; _chargingData[i]->EvBatterytargetVoltage = 500; _chargingData[i]->EvBatterytargetCurrent = 2; _chargingData[i]->AvailableChargingCurrent = 1000; printf ("Wait K1K2 = %f \n", _chargingData[i]->PresentChargingVoltage); sleep(5); //EV done _chargingData[i]->SystemStatus = S_CHARGING; } break; case S_CHARGING: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; //充電電壓電流 _chargingData[i]->EvBatterySoc = 50; _chargingData[i]->EvBatterytargetVoltage = _Voltage[i]; _chargingData[i]->EvBatterytargetCurrent = _Current[i]; _chargingData[i]->AvailableChargingCurrent = 1000; printf ("[UnconditionalCharge (%d) - S_CHARGING]\n", i); } } break; case S_TERMINATING: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; system("/root/Module_EvComm &"); printf ("[UnconditionalCharge (%d) - S_TERMINATING]\n", i); } sleep(3); _chargingData[i]->SystemStatus = S_COMPLETE; } break; case S_COMPLETE: { if(PreviousSystemStatus[i] != _chargingData[i]->SystemStatus) { PreviousSystemStatus[i] = _chargingData[i]->SystemStatus; printf ("[UnconditionalCharge (%d) - S_COMPLETE]\n", i); } } break; } } char word[128]; char newString[7][10]; int i,j,ctr; memset(word, 0x00, sizeof(word)); get_char(word); if (strlen(word) == 0) { continue; } j=0; ctr=0; strcpy(newString[1], "-1"); strcpy(newString[2], "-1"); for (i = 0; i <= (strlen(word)); i++) { if (word[i] == ' ' || word[i] == '\0' || word[i] == 10) { newString[ctr][j] = '\0'; ctr++; j = 0; } else { newString[ctr][j] = word[i]; j++; } } if(strcmp(newString[0], "chg") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; if (strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) continue; if (strcmp(newString[3], "-1") == 0 || strcmp(newString[3], "") == 0) continue; int _gun = atoi(newString[1]); float _vol = atof(newString[2]); float _cur = atof(newString[3]); if(_gun >= 2 || _gun < 0) continue; if (_cur <= 0 || _cur <= 0) continue; printf("gun %d: vol = %f, cur = %f \n", _gun + 1, _vol, _cur); _chargingData[_gun]->EvBatterytargetVoltage = _vol; _chargingData[_gun]->EvBatterytargetCurrent = _cur; } else if (strcmp(newString[0], "c") == 0) { printf("stop \n\r"); _chargingData[0]->SystemStatus = S_TERMINATING; _chargingData[1]->SystemStatus = S_TERMINATING; } usleep(100000); } } void SetWiringInfo(char *v1, char *v2) { int dispenser = atoi(v1); int connector = atoi(v2); if(dispenser > 0 && dispenser <= GENERAL_GUN_QUANTITY && connector >= 0 && connector <= GENERAL_GUN_QUANTITY) { if(ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence == (dispenser - 1)) { printf("\r\n"); printf("Set Dispenser %d, Connector Quantity = %d\r\n", dispenser, connector); ShmSysConfigAndInfo->SysConfig.WiringInfo.WiringSetting[dispenser - 1] = connector; ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence = dispenser; ShmSysConfigAndInfo->SysConfig.WiringInfo.MaxConnectorQuantity += connector; ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.FlashConfigChanged = true; ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity = ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence; ShmSysConfigAndInfo->SysInfo.DispenserInfo.TotalConnectorQuantity = ShmSysConfigAndInfo->SysConfig.WiringInfo.MaxConnectorQuantity; } else if(ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence > (dispenser - 1)) { printf("\r\n"); printf("Set Dispenser %d, Connector Quantity = %d\r\n", dispenser, connector); ShmSysConfigAndInfo->SysConfig.WiringInfo.WiringSetting[dispenser - 1] = connector; int quantity = 0; for(int i = 0; i < ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence; i++) { quantity += ShmSysConfigAndInfo->SysConfig.WiringInfo.WiringSetting[i]; } ShmSysConfigAndInfo->SysConfig.WiringInfo.MaxConnectorQuantity = quantity; ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.FlashConfigChanged = true; ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity = ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence; ShmSysConfigAndInfo->SysInfo.DispenserInfo.TotalConnectorQuantity = ShmSysConfigAndInfo->SysConfig.WiringInfo.MaxConnectorQuantity; } } } void ShowWiringInfo(void) { printf("\r\n"); printf("********** Wiring Info **********\r\n"); printf("Dispenser = %d, Connector = %d\r\n", ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence, ShmSysConfigAndInfo->SysConfig.WiringInfo.MaxConnectorQuantity); if(ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence > 0) { for(int i = 0; i < ShmSysConfigAndInfo->SysConfig.WiringInfo.DispenserSequence; i++) { printf("Dispenser[%d] <=> %d\r\n", i, ShmSysConfigAndInfo->SysConfig.WiringInfo.WiringSetting[i]); } } printf("\r\n"); } void CleanWiringInfo(void) { printf("\r\n"); printf("******* Clean Wiring Info *******\r\n"); memset((char *)&ShmSysConfigAndInfo->SysConfig.WiringInfo, 0x00, sizeof(WiringInfoData)); ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.FlashConfigChanged = true; ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.CleanWiringInfo = true; printf("\r\n"); } void SetSystemSoftRest(void) { printf("********* Set Soft Reset ********\r\n"); ShmChargerInfo->Control.SysCtrl.bits.NeedSoftReset = true; } void SetSystemHardReboot(void) { printf("******** Set Hard Reboot ********\r\n"); ShmChargerInfo->Control.SysCtrl.bits.NeedHardReset = true; } void SetGroupRole(byte group, byte role) { if(group < GENERAL_GUN_QUANTITY) { if(ShmGroupCollection[group].Role != role) { //printf("\r\nSet Group %d Role = %d", group, role); } ShmGroupCollection[group].Role = role; } } void SetGroupToIdle(byte group) { if(group < GENERAL_GUN_QUANTITY) { SetGroupRole(group, _GROLE_IDLE); ShmGroupCollection[group].Partner.Quantity = 0; memset(ShmGroupCollection[group].Partner.Member, 0x00, ARRAY_SIZE(ShmGroupCollection[group].Partner.Member)); ShmGroupCollection[group].TargetGroup = 0; //printf("\r\n Reset Group %02X To Idle", group); } } void SetGroupToMaster(byte group) { if(group < GENERAL_GUN_QUANTITY) { SetGroupRole(group, _GROLE_MASTER); ShmGroupCollection[group].TargetGroup = group + 1; //printf("\r\n Set Group %02X As Master", group); } } void SetGroupToSlave(byte group, byte target) { if(group < GENERAL_GUN_QUANTITY && target < GENERAL_GUN_QUANTITY) { SetGroupRole(group, _GROLE_SLAVE); ShmGroupCollection[group].TargetGroup = target + 1; //printf("\r\n Set Group %02X As Slave", group); } } // group: group index, target: target index // add group to target's member void AddGroupCollection(byte group, byte target) { int ParallelConfig = 0; if(group < GENERAL_GUN_QUANTITY && target < GENERAL_GUN_QUANTITY) { if(ShmGroupCollection[target].Role != _GROLE_MASTER) { return; } if(ShmGroupCollection[group].Role != _GROLE_IDLE && ShmGroupCollection[group].Role != _GROLE_WAIT_IDLE && ShmGroupCollection[group].Role != _GROLE_PRECHARGE_READY) { return; } SetGroupToSlave(group, target); ShmGroupCollection[target].Partner.Member[ShmGroupCollection[target].Partner.Quantity++] = group; ParallelConfig = ShmGroupCollection[target].ParallelConfig[group]; if(ParallelConfig != 0) { ShmPsuGrouping->ParallelRelayConfig.CtrlValue |= (1 << (ParallelConfig - 1)); } //printf("\r\n Add Group %02X To Gun %d (Quantity %d), Set Parallel Relay %d On", group, target + 1, ShmGroupCollection[target].Partner.Quantity, ParallelConfig); } } // group: group index, target: target index // remove group out of target's member void RemoveGroupCollection(byte group, byte target) { int location = 0, slave = 0; bool find = false; int ParallelConfig = 0; if(group < GENERAL_GUN_QUANTITY && target < GENERAL_GUN_QUANTITY) { for(int i = 0; i < ShmGroupCollection[target].Partner.Quantity; i++) { if(group == ShmGroupCollection[target].Partner.Member[i]) { ShmGroupCollection[target].Partner.Member[i] = 0; location = i; find = true; break; } } if(find) { for(int i = location + 1; i < ShmGroupCollection[target].Partner.Quantity; i++) { slave = ShmGroupCollection[target].Partner.Member[i]; ShmGroupCollection[target].Partner.Member[i] = 0; ShmGroupCollection[target].Partner.Member[i - 1] = slave; } ShmGroupCollection[target].Partner.Quantity--; SetGroupToIdle(group); ParallelConfig = ShmGroupCollection[target].ParallelConfig[group]; if(ParallelConfig != 0) { ShmPsuGrouping->ParallelRelayConfig.CtrlValue &= ~(1 << (ParallelConfig - 1)); } //printf("\r\n Remove Group %02X From Gun %d (Quantity %d), Clean Parallel Relay %d Off", group, target + 1, ShmGroupCollection[target].Partner.Quantity, ParallelConfig); } } } // Gun(Status)(Ro)(Q) Master Member OutputVol OutputCur AvaiPower AvaiCur StabCur K1K2 ParaRelay // 1 (00) 00 3 00 [00] [00] [00] 0000 V 0000 A 0000 kW 0000 A 0000 A 00 XX void ShowGroupingInfo(void) { byte target = 0; printf("\r\n Gun(Status)(Ro)(Q) Master Member OutputVol OutputCur AvaiPower AvaiCur StabCur K1K2 ParaRelay"); for(int i = 0; i < 4; i++) { target = ShmPsuGrouping->Layout[i]; printf("\r\n %d (%2d) %2d %d %02X ", target + 1, _chargingData[target]->SystemStatus, ShmGroupCollection[target].Role, ShmGroupCollection[target].Partner.Quantity, ShmGroupCollection[target].TargetGroup); for(int j = 0; j < 3; j++) { if(ShmGroupCollection[target].Role == 1 && j < ShmGroupCollection[target].Partner.Quantity) { printf("[%02X] ", ShmGroupCollection[target].Partner.Member[j]); } else { printf(" "); } } printf(" %4d V %4d A %4d kW %4d A %4d A ", (int)_chargingData[target]->PresentChargingVoltage, (int)_chargingData[target]->PresentChargingCurrent, (int)(_chargingData[target]->AvailableChargingPower / 10), (int)(_chargingData[target]->AvailableChargingCurrent / 10), (int)(_chargingData[target]->DeratingChargingCurrent / 10)); printf("%02X %02X",ShmPsuGrouping->OutputRelayConfig[target].CtrlValue, ShmPsuGrouping->ParallelRelayConfig.CtrlValue); } printf("\r\n\r\nSystem Capability Current = %4d.%01d A, Power = %3d.%01d kW", (ShmPsuData->SystemAvailableCurrent / 10), (ShmPsuData->SystemAvailableCurrent % 10), (ShmPsuData->SystemAvailablePower / 10), (ShmPsuData->SystemAvailablePower % 10)); printf("\r\n\r\n"); } void PsuGroupSwitchToIdle(byte group) { int master = 0, quantity = 0, location = 0, total = 0; if(ShmGroupCollection[group].Role != _GROLE_SLAVE) { return; } master = ShmGroupCollection[group].TargetGroup - 1; quantity = ShmGroupCollection[master].Partner.Quantity; //printf("\r\n Search Group %02X From Gun %d", group, master + 1); for(int i = 0; i < quantity; i++) { if(total == 0) { if(group == ShmGroupCollection[master].Partner.Member[i]) { location = i; total++; //printf("\r\n Find Group %02X At Member Index = %d", group, location); } } else { // find other group in the same direction if(ShmPsuGrouping->Location[ShmGroupCollection[master].Partner.Member[location]] < ShmPsuGrouping->Location[master]) { if(ShmPsuGrouping->Location[ShmGroupCollection[master].Partner.Member[i]] < ShmPsuGrouping->Location[master]) { total++; //printf("\r\n Find Other Group %02X In The Same Direction", ShmGroupCollection[master].Partner.Member[i]); } } if(ShmPsuGrouping->Location[ShmGroupCollection[master].Partner.Member[location]] > ShmPsuGrouping->Location[master]) { if(ShmPsuGrouping->Location[ShmGroupCollection[master].Partner.Member[i]] > ShmPsuGrouping->Location[master]) { total++; //printf("\r\n Find Other Group %02X In The Same Direction", ShmGroupCollection[master].Partner.Member[i]); } } } } if(total > 0) { unsigned char collection[GENERAL_GUN_QUANTITY]; //printf("\r\n There are %d Group Need To Switch Idle:", total); memcpy(collection, ShmGroupCollection[master].Partner.Member, ARRAY_SIZE(ShmGroupCollection[master].Partner.Member)); for(int i = 0; i < total; i++) { //printf(" %02X", collection[i + location]); } for(int i = 0; i < total; i++) { RemoveGroupCollection(collection[i + location], master); } } } void FindPsuGroupPartner(byte master, byte quantity, PsuGroupPartner *tPartner) { int slave = 0, location = 0; PsuGroupPartner partner; memset(&partner, 0x00, sizeof(PsuGroupPartner)); // search from left location = ShmGroupCollection[master].Location - 1; for(int i = location; i >= 0; i--) { if(partner.Quantity >= quantity) { break; } slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { //printf("\r\n Find Group %02X From Left", slave); partner.Member[partner.Quantity++] = slave; } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && master == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } // search from right location = ShmGroupCollection[master].Location + 1; for(int i = location; i < 4; i++) { if(partner.Quantity >= quantity) { break; } slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { //printf("\r\n Find Group %02X From Right", slave); partner.Member[partner.Quantity++] = slave; } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && master == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } memcpy(tPartner, &partner, sizeof(PsuGroupPartner)); } int GetPsuGroupAvailable(byte group) { //int slave = 0, location = 0, available = 0; PsuGroupPartner partner; FindPsuGroupPartner(group, MAX_GROUP_QUANTITY, &partner); //printf("\r\n Gun %d Available Quantity = %d", group + 1, partner.Quantity); return partner.Quantity; #if 0 // search from left location = ShmGroupCollection[group].Location - 1; for(int i = location; i >= 0; i--) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { available++; } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && group == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } // search from right location = ShmGroupCollection[group].Location + 1; for(int i = location; i < 4; i++) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { available++; } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && group == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } return available; #endif } void PsuGroupShareCheck(byte group) { int slave = 0, target = 0, location = 0, share = 0, total = 0; total = GetPsuGroupAvailable(group) + 1; //printf("\r\n Gun %d Total Group = %d", group + 1, total); // search from left location = ShmGroupCollection[group].Location - 1; for(int i = location; i >= 0; i--) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_SLAVE) { target = ShmGroupCollection[slave].TargetGroup - 1; if((ShmGroupCollection[target].Partner.Quantity + 1) > total) { share = (ShmGroupCollection[target].Partner.Quantity + 1 - total) / 2; } //printf("\r\n Find Group %02X Have %d Resource Can Shared %d From Left", target, ShmGroupCollection[target].Partner.Quantity, share); break; } else { break; } } if(share == 0) { // search from right location = ShmGroupCollection[group].Location + 1; for(int i = location; i < 4; i++) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_SLAVE) { target = ShmGroupCollection[slave].TargetGroup - 1; if((ShmGroupCollection[target].Partner.Quantity + 1) > total) { share = (ShmGroupCollection[target].Partner.Quantity + 1 - total) / 2; } //printf("\r\n Find Group %02X Have %d Resource Can Shared %d From Left", target, ShmGroupCollection[target].Partner.Quantity, share); break; } else { break; } } } if(share > 0) { //printf("\r\n Grab %02X", slave); PsuGroupSwitchToIdle(slave); } else { //printf("\r\n No Need To Grab"); } } void SimplePsuGroupStartCharging(byte group) { //int slave = 0, location = 0; int available = 0; PsuGroupPartner partner; if(ShmGroupCollection[group].Role == _GROLE_SLAVE) { return; } if(ShmGroupCollection[group].Role != _GROLE_IDLE && ShmGroupCollection[group].Role != _GROLE_MASTER) { return; } if(ShmGroupCollection[group].Role == _GROLE_IDLE) { SetGroupToMaster(group); PsuGroupShareCheck(group); } else { available = GetPsuGroupAvailable(group); //printf("\r\nGun %d is already master, there are %d available group", group + 1, available); if(available == 0) { return; } } FindPsuGroupPartner(group, MAX_GROUP_QUANTITY, &partner); for(int i = 0; i < partner.Quantity; i++) { AddGroupCollection(partner.Member[i], group); } ShmPsuGrouping->OutputRelayConfig[group].bits.Output_N = true; ShmPsuGrouping->OutputRelayConfig[group].bits.Output_P = true; #if 0 // search from left location = ShmGroupCollection[group].Location - 1; for(int i = location; i >= 0; i--) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { //printf("\r\n Find %02X From Left", slave); AddGroupCollection(slave, group); } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && group == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } // search from right location = ShmGroupCollection[group].Location + 1; for(int i = location; i < 4; i++) { slave = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[slave].Role == _GROLE_IDLE) { //printf("\r\n Find %02X From Right", slave); AddGroupCollection(slave, group); } else { if(ShmGroupCollection[slave].Role == _GROLE_SLAVE && group == (ShmGroupCollection[slave].TargetGroup - 1)) { continue; } break; } } #endif } void PsuGroupStopCharging(byte group) { int total = 0; if(ShmGroupCollection[group].Role != _GROLE_MASTER) { return; } total = ShmGroupCollection[group].Partner.Quantity; if(total > 0) { unsigned char collection[GENERAL_GUN_QUANTITY]; //printf("\r\n There are %d Group Need To Stop:", ShmGroupCollection[group].Partner.Quantity); memcpy(collection, ShmGroupCollection[group].Partner.Member, ARRAY_SIZE(ShmGroupCollection[group].Partner.Member)); for(int i = 0; i < total; i++) { //printf(" %02X", collection[i]); } for(int i = 0; i < total; i++) { RemoveGroupCollection(collection[i], group); } } SetGroupToIdle(group); ShmPsuGrouping->OutputRelayConfig[group].bits.Output_N = false; ShmPsuGrouping->OutputRelayConfig[group].bits.Output_P = false; } void RunSimplePsuGrouping(char *v1, char *v2) { int group = 0, charging = 0; group = atoi(v1); charging = atoi(v2); group -= 1; if(group >= 0 && group < 4) { if(charging > 0) { if(ShmGroupCollection[group].Role == _GROLE_SLAVE) { //printf("\r\nGroup %02X Is In Use, Need To Stop Charging", group); PsuGroupSwitchToIdle(group); } SimplePsuGroupStartCharging(group); } if(charging == 0) { if(ShmGroupCollection[group].Role == _GROLE_MASTER) { PsuGroupStopCharging(group); } if(ShmGroupCollection[group].Role == _GROLE_SLAVE) { PsuGroupSwitchToIdle(group); } } ShowGroupingInfo(); } } void ShowCabinetInfo(void) { int ipAddress = 0; printf("\r\nPower Cabinet Charging Mode = %d, ReAssignedFlag = %d, Psu Work Step = %d", ShmSysConfigAndInfo->SysInfo.MainChargingMode, ShmSysConfigAndInfo->SysInfo.ReAssignedFlag, ShmPsuData->Work_Step); printf("\r\n Dispenser: %d / %d, Connector: %d / %d", ShmSysConfigAndInfo->SysInfo.DispenserInfo.PresentDispenserQuantity, ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity, ShmSysConfigAndInfo->SysInfo.DispenserInfo.PresentConnectorQuantity, ShmSysConfigAndInfo->SysInfo.DispenserInfo.TotalConnectorQuantity); for(int i = 0; i < GENERAL_GUN_QUANTITY; i++) { printf("\r\n Connector[%d] Index: %2X, Status = %2d , %s", i, _chargingData[i]->Index, _chargingData[i]->SystemStatus, ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable ? "Enable" : "Disable"); } for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity; i++) { printf("\r\n Dispenser[%d] Status: %d", i, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus); if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus != _DS_None && ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].LocalStatus != _DS_Timeout) { ipAddress = 0; for(int j = 0; j < GENERAL_GUN_QUANTITY; j++) { if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[j].Status == _CNS_DispenserMatched && i == ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[j].DispenserIndex) { ipAddress = ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[j].IpAddress; } } printf(", ModelName: %s, IP: %d.%d.%d.%d", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ModelName, ((ipAddress >> 0) & 0xFF), ((ipAddress >> 8) & 0xFF), ((ipAddress >> 16) & 0xFF), ((ipAddress >> 24) & 0xFF)); for(int j = 0; j < ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity; j++) { unsigned char gun = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorID[j]; printf("\r\n - Connector[%d] Gun %d, %s", j, gun, _chargingData[gun - 1]->ConnectorPlugIn ? "Plugged" : "Unplugged"); } } else { printf(", No Information"); } } printf("\r\n\r\n"); } void SetTestControl(char *v1, char *v2) { int testItem = 0; int testItemLen = 3; int enable = 0; char strTest[32][32] = {"tbl", "tfsb", "chgsm"}; char strItem[32][32] = {"Balance", "Fast Standby Time", "Charging Simulation"}; enable = atoi(v2); if(enable < 0) { return; } for(int i = 0; i < testItemLen; i++) { if(strcmp((char *)&strTest[i][0], v1) == 0) { testItem = i + 1; break; } } if(testItem != 0) { if(enable) { ShmChargerInfo->Control.TestCtrl.CtrlValue |= (1 << (testItem - 1)); } else { ShmChargerInfo->Control.TestCtrl.CtrlValue &= ~(1 << (testItem - 1)); } printf("%s %s Test Item, Test Control Value = %08X\n", enable ? "Enable" : "Disable", strItem[testItem - 1], ShmChargerInfo->Control.TestCtrl.CtrlValue); } else { printf("Test Item %s Not Found\n", v1); for(int i = 0; i < testItemLen; i++) { printf(" [%s] -> %s Test\n", strTest[i], strItem[i]); } } printf("\r\n"); } // Gun Role Master K1K2 GTVoltage GTCurrent StableCurrent OutputLoading GunLoading // 1 00 00 0 0000 V 000.0 A 0000 A XXX.XX XXX.XX void ShowGroupingDemand(void) { byte target = 0; unsigned char k1k2 = 0; printf("\r\n Gun Role Master K1K2 GTVoltage GTCurrent StableCurrent OutputLoading GunLoading"); for(int i = 0; i < 4; i++) { target = ShmPsuGrouping->Layout[i]; if(ShmGroupCollection[target].TargetGroup != 0) { k1k2 = _chargingData[ShmGroupCollection[target].TargetGroup - 1]->RelayK1K2Status; } else { k1k2 = _chargingData[target]->RelayK1K2Status; } printf("\r\n %d %2d %02X %d %4d V %3d.%d A %4d A %3d.%02d", target + 1, ShmGroupCollection[target].Role, ShmGroupCollection[target].TargetGroup, k1k2, (ShmPsuGrouping->GroupOutput[target].GTargetVoltage / 10), (ShmPsuGrouping->GroupOutput[target].GTargetCurrent / 10), (ShmPsuGrouping->GroupOutput[target].GTargetCurrent % 10), (int)(_chargingData[target]->AvailableChargingCurrent / 10), (ShmPsuGrouping->GroupOutput[target].OutputLoading / 100), (ShmPsuGrouping->GroupOutput[target].OutputLoading % 100)); if(ShmGroupCollection[target].TargetGroup == target + 1) { printf(" %3d.%02d", (ShmGroupCollection[target].GunLoading / 100), (ShmGroupCollection[target].GunLoading % 100)); } } printf("\r\n\r\n"); } // v1: gun // v2: voltage // v3: current void SetGunStartCharging(char *v1, char *v2, char *v3) { int gun = 0; float _voltage = 0, _current = 0; gun = atoi(v1); _voltage = atof(v2); _current = atof(v3); if(gun <= 0 || gun > GENERAL_GUN_QUANTITY || _voltage < 0 || _voltage > 1000 || _current < 0 || _current > 1200) { printf("\r\nGun Start Charging Input parameter %s, %s, %s over range", v1, v2, v3); printf("\r\n\r\n"); return; } /* if(_chargingData[gun - 1]->SystemStatus == S_IDLE) { printf("\r\nSet Gun %d Start Charging > Voltage: %4d, Current: %d", gun, (int)_voltage, (int)_current); ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.EnableForceCharging = true; ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.StartForceCharging = true; ShmChargerInfo->Control.FCharging[gun - 1].FTargetVoltage = _voltage * 10; ShmChargerInfo->Control.FCharging[gun - 1].FTargetCurrent = _current * 10; } else if(ShmGroupCollection[gun - 1].Role == _GROLE_MASTER) { if(ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.EnableForceCharging) { printf("\r\nSet Gun %d > Voltage: %4d, Current: %d", gun, (int)_voltage, (int)_current); ShmChargerInfo->Control.FCharging[gun - 1].FTargetVoltage = _voltage * 10; ShmChargerInfo->Control.FCharging[gun - 1].FTargetCurrent = _current * 10; } else { printf("\r\nGun %d Force Charging Is Disable", gun); } } else { printf("\r\nGun %d SystemStatus(%d) Is Not Available", gun, _chargingData[gun - 1]->SystemStatus); } printf("\r\n\r\n"); */ bool wait = true; int time = 0; struct timespec _Wait_time; unsigned char PreviousSystemStatus = 0xFF; unsigned short _targetVoltage = 0, _targetCurrent = 0; while(wait) { switch(_chargingData[gun - 1]->SystemStatus) { case S_IDLE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_IDLE", gun); printf("\r\nSet Gun %d Start Charging > Voltage: %4d, Current: %d", gun, (int)_voltage, (int)_current); ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.EnableForceCharging = true; ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.StartForceCharging = true; ShmChargerInfo->Control.FCharging[gun - 1].FTargetVoltage = _voltage * 10; ShmChargerInfo->Control.FCharging[gun - 1].FTargetCurrent = _current * 10; PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_REASSIGN_CHECK: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_REASSIGN_CHECK, Wait For Request Charging", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_REASSIGN: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_REASSIGN, Wait For Grouping", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_PREPARNING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARNING", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_PREPARING_FOR_EV: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARING_FOR_EV", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_PREPARING_FOR_EVSE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARING_FOR_EVSE, Wait For EVSE", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } if(_targetVoltage != (int)_chargingData[gun - 1]->EvBatterytargetVoltage || _targetCurrent != (int)_chargingData[gun - 1]->EvBatterytargetCurrent) { _targetVoltage = (int)_chargingData[gun - 1]->EvBatterytargetVoltage; _targetCurrent = (int)_chargingData[gun - 1]->EvBatterytargetCurrent; printf("\r\nGun %d Set Voltage: %4d, Current: %d", gun, _targetVoltage, _targetCurrent); } break; case S_CHARGING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_CHARGING", gun); if(PreviousSystemStatus == 0xFF) { _targetVoltage = (int)_chargingData[gun - 1]->EvBatterytargetVoltage; _targetCurrent = (int)_chargingData[gun - 1]->EvBatterytargetCurrent; printf("\r\nGun %d Voltage: %4d, Current: %d", gun, _targetVoltage, _targetCurrent); if(ShmChargerInfo->Control.FCharging[gun - 1].FCtrl.bits.EnableForceCharging) { printf("\r\nSet Gun %d Force Charging > Voltage: %4d, Current: %d", gun, (int)_voltage, (int)_current); ShmChargerInfo->Control.FCharging[gun - 1].FTargetVoltage = _voltage * 10; ShmChargerInfo->Control.FCharging[gun - 1].FTargetCurrent = _current * 10; } } PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; GetClockTime(&_Wait_time); } if(_targetVoltage != (int)_chargingData[gun - 1]->EvBatterytargetVoltage || _targetCurrent != (int)_chargingData[gun - 1]->EvBatterytargetCurrent) { _targetVoltage = (int)_chargingData[gun - 1]->EvBatterytargetVoltage; _targetCurrent = (int)_chargingData[gun - 1]->EvBatterytargetCurrent; printf("\r\nGun %d Set Voltage: %4d, Current: %d", gun, _targetVoltage, _targetCurrent); } time = GetTimeoutValue(_Wait_time) / uSEC_VAL; if(time >= 3) { wait = false; printf("\r\nDone"); } break; case S_TERMINATING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_TERMINATING", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } wait = false; break; case S_COMPLETE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_COMPLETE", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } wait = false; break; case S_ALARM: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_ALARM", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } wait = false; break; default: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun SystemStatus %d Unknown(%d)", gun, _chargingData[gun - 1]->SystemStatus); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } printf("\r\nGun %d SystemStatus(%d) Is Not Available", gun, _chargingData[gun - 1]->SystemStatus); wait = false; break; } char word[128]; char newString[7][10]; int i,j,ctr; memset(word, 0x00, sizeof(word)); get_char(word); if (strlen(word) == 0) { continue; } j=0; ctr=0; strcpy(newString[1], "-1"); strcpy(newString[2], "-1"); for (i = 0; i <= (strlen(word)); i++) { if (word[i] == ' ' || word[i] == '\0' || word[i] == 10) { newString[ctr][j] = '\0'; ctr++; j = 0; } else { newString[ctr][j] = word[i]; j++; } } if(strcmp(newString[0], "c") == 0) { printf("\r\nStop"); wait = false; } usleep(100000); } printf("\r\n\r\n"); } // v1: gun void SetGunStopCharging(char *v1) { int gun = 0; gun = atoi(v1); if(gun <= 0 || gun > GENERAL_GUN_QUANTITY) { printf("\r\nGun Stop Charging Input parameter %s over range", v1); printf("\r\n\r\n"); return; } /* if(_chargingData[gun - 1]->SystemStatus >= S_REASSIGN_CHECK && _chargingData[gun - 1]->SystemStatus <= S_CHARGING) { printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; } else if(ShmGroupCollection[gun - 1].Role == _GROLE_SLAVE) { printf("\r\nSet Group [%02X] Stop", gun - 1); ShmGroupCollection[gun - 1].GroupCtrl.bits.SlavePowerOffRequest = true; } else { printf("\r\nGun %d SystemStatus(%d) Is Not Available", gun, _chargingData[gun - 1]->SystemStatus); } printf("\r\n\r\n"); */ bool wait = true; int time = 0; struct timespec _Wait_time; unsigned char PreviousSystemStatus = 0xFF; while(wait) { switch(_chargingData[gun - 1]->SystemStatus) { case S_IDLE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_IDLE", gun); if(PreviousSystemStatus == 0xFF) { if(ShmGroupCollection[gun - 1].Role == _GROLE_SLAVE) { printf("\r\nSet Group [%02X] Stop", gun - 1); ShmGroupCollection[gun - 1].GroupCtrl.bits.SlavePowerOffRequest = true; } } PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; GetClockTime(&_Wait_time); } time = GetTimeoutValue(_Wait_time) / uSEC_VAL; if(time >= 3) { wait = false; printf("\r\nDone"); } break; case S_REASSIGN_CHECK: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_REASSIGN_CHECK, Wait For Request Charging", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_REASSIGN: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_REASSIGN, Wait For Grouping", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_PREPARNING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARNING", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_PREPARING_FOR_EV: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARING_FOR_EV", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_PREPARING_FOR_EVSE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_PREPARING_FOR_EVSE, Wait For EVSE", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_CHARGING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_CHARGING", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; if(!_chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop) { _chargingData[gun - 1]->ChargingStopFlag.bits.ManualStop = true; printf("\r\nSet Gun %d Stop Charging(ManualStop)", gun); } } break; case S_TERMINATING: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_TERMINATING", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_COMPLETE: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_COMPLETE", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; case S_ALARM: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun %d S_ALARM", gun); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } break; default: if(PreviousSystemStatus != _chargingData[gun - 1]->SystemStatus) { printf("\r\nGun SystemStatus %d Unknown(%d)", gun, _chargingData[gun - 1]->SystemStatus); PreviousSystemStatus = _chargingData[gun - 1]->SystemStatus; } printf("\r\nGun %d SystemStatus(%d) Is Not Available", gun, _chargingData[gun - 1]->SystemStatus); wait = false; break; } char word[128]; char newString[7][10]; int i,j,ctr; memset(word, 0x00, sizeof(word)); get_char(word); if (strlen(word) == 0) { continue; } j=0; ctr=0; strcpy(newString[1], "-1"); strcpy(newString[2], "-1"); for (i = 0; i <= (strlen(word)); i++) { if (word[i] == ' ' || word[i] == '\0' || word[i] == 10) { newString[ctr][j] = '\0'; ctr++; j = 0; } else { newString[ctr][j] = word[i]; j++; } } if(strcmp(newString[0], "c") == 0) { printf("\r\nStop"); wait = false; } usleep(100000); } printf("\r\n\r\n"); } void SetGunExtend(char *v1) { int gun = 0; gun = atoi(v1); if(_chargingData[gun - 1]->SystemStatus == S_CHARGING && ShmGroupCollection[gun - 1].Role == _GROLE_MASTER) { printf("\r\nSet Group [%02X] Extend Capability", gun - 1); ShmGroupCollection[gun - 1].GroupCtrl.bits.MorePowerRequest = true; } else { printf("\r\nGun %d Extend Capability Is Not Available, SystemStatus(%d)", gun, _chargingData[gun - 1]->SystemStatus); } printf("\r\n\r\n"); } // Gun TargetV TargetC GTargetV GTargetC OutputV OutputC G_Psu_V G_Psu_C Psu 0_V Psu 0_C Psu 1_V Psu 1_C Psu 2_V Psu 2_C ... // X XXXX.X V XXX.X A XXXX.X V XXX.X A XXXX.X V XXX.X A XXXX.X V XXX.X A XXXX.X V XXX.X A XXXX.X V XXX.X A XXXX.X V XXX.X A void ShowGunOutput(void) { byte target = 0; unsigned short voltage = 0, current = 0; printf("\r\n Gun TargetV TargetC GTargetV GTargetC OutputV OutputC G_Psu_V G_Psu_C Psu 0_V Psu 0_C Psu 1_V Psu 1_C Psu 2_V Psu 2_C ..."); for(int i = 0; i < CONNECTOR_QUANTITY; i++) { target = ShmPsuGrouping->Layout[i]; // "\r\n %d %4d.%d V %3d.%d A %4d.%d V %3d.%d A %4d.%d V %3d.%d A %4d.%d V %3d.%d A %4d.%d V %3d.%d A %4d.%d V %3d.%d A" voltage = (unsigned short)(_chargingData[target]->EvBatterytargetVoltage * 10); current = (unsigned short)(_chargingData[target]->EvBatterytargetCurrent * 10); printf("\r\n %d %4d.%d V %3d.%d A", target + 1, (voltage / 10), (voltage % 10), (current / 10), (current % 10)); voltage = ShmPsuGrouping->GroupOutput[target].GTargetVoltage; current = ShmPsuGrouping->GroupOutput[target].GTargetCurrent; printf(" %4d.%d V %3d.%d A", (voltage / 10), (voltage % 10), (current / 10), (current % 10)); voltage = (unsigned short)(_chargingData[target]->PresentChargingVoltage * 10); current = (unsigned short)(_chargingData[target]->PresentChargingCurrent * 10); printf(" %4d.%d V %3d.%d A", (voltage / 10), (voltage % 10), (current / 10), (current % 10)); voltage = ShmPsuData->PsuGroup[target].GroupPresentOutputVoltage; current = ShmPsuData->PsuGroup[target].GroupPresentOutputCurrent; printf(" %4d.%d V %3d.%d A", (voltage / 10), (voltage % 10), (current / 10), (current % 10)); /* for(int j = 0; j < ShmPsuData->PsuGroup[target].GroupPresentPsuQuantity; j++) { printf(" %4d.%d V %3d.%d A", (voltage / 10), (voltage % 10), (current / 10), (current % 10)); } */ } printf("\r\n\r\n"); } void SetGpio(char *v1, char *v2) { int testItem = 0; int testItemLen = 1; int ioOutput = 0; char strTest[32][32] = {"4g"}; char strItem[32][32] = {"4G Reset"}; ioOutput = atoi(v2); if(ioOutput < 0) { return; } for(int i = 0; i < testItemLen; i++) { if(strcmp((char *)&strTest[i][0], v1) == 0) { testItem = i + 1; break; } } if(testItem != 0) { if(ioOutput) { system("echo 1 > /sys/class/gpio/gpio104/value"); } else { system("echo 0 > /sys/class/gpio/gpio104/value"); } printf("Set %s %s\n", strItem[testItem - 1], ioOutput > 0 ? "High" : "Low"); } else { printf("Gpio Item %s Not Found\n", v1); } printf("\r\n"); } void ShowStatus(void) { for(int i = 0; i < ShmChargerInfo->Control.MaxConnector; i++) { printf("\r\nGun %d Status = %d, Available = %d", i + 1, _chargingData[i]->SystemStatus, _chargingData[i]->IsAvailable); printf("\r\nAlarmCode"); printf("\r\n Connector = %6s, EvConn = %6s, Remote = %6s", strncmp((char *)_chargingData[i]->ConnectorAlarmCode, "", 6) != 0 ? (char *)_chargingData[i]->ConnectorAlarmCode : "No Err", strncmp((char *)_chargingData[i]->EvConnAlarmCode, "", 6) != 0 ? (char *)_chargingData[i]->ConnectorAlarmCode : "No Err", strncmp((char *)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].RemotenAlarmCode, "", 6) != 0 ? (char *)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].RemotenAlarmCode : "No Err"); } printf("\r\n"); printf("\r\nStatus Code Len = %d", ShmSysConfigAndInfo->SysWarningInfo.WarningCount); if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount > 0) { printf("\r\n WarningCode:"); for(int i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) { printf(" %s", (char *)&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0]); } } printf("\r\n\r\n"); } void ShowWhiteCardList(void) { printf("\r\nWhite Card List"); for(int i = 0; i < 10; i++) { printf("\r\n White Card [%2d]: %s", i + 1, (char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i]); } printf("\r\n\r\n"); } void WriteWhiteCard(char *v1, char *v2) { int cardIndex = 0; cardIndex = atoi(v1); if(cardIndex < 1 || cardIndex > 10) { printf("\r\n White Card Index Fail\r\n\r\n"); return; } if(strlen(v2) == 0 || strlen(v2) > 31) { printf("\r\n White Card Fail\r\n\r\n"); return; } printf("\r\n Str Len = %d = %s", strlen(v2), v2); printf("\r\n Set White Card Index %d = %s", cardIndex, v2); memcpy((char *)&ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[cardIndex - 1][0], v2, strlen(v2)); ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.FlashConfigChanged = true; printf("\r\n\r\n"); } void EraseWhiteCard(char *v1) { int cardIndex = 0; cardIndex = atoi(v1); if(cardIndex < 1 || cardIndex > 10) { printf("\r\n White Card Index Fail\r\n\r\n"); return; } printf("\r\n Erase White Card Index = %d", cardIndex); memset((char *)&ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[cardIndex - 1][0], 0x00, 32); ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.FlashConfigChanged = true; printf("\r\n\r\n"); } void ShowChargerLimit(void) { int limitPower = -1; char *str_gun_type[] = {STR_GUN_TYPE_CHADEMO, STR_GUN_TYPE_CCS, STR_GUN_TYPE_GBT}; unsigned char inUsingCnt = 0; printf("\r\nCharger Limit"); printf("\r\n System Psu Cnt: %2d", ShmPsuData->SystemPresentPsuQuantity); printf("\r\n Charger Max ChargingProfile Power: %d kW", ShmSysConfigAndInfo->SysInfo.MaxChargingProfilePower == -1 ? (int)ShmSysConfigAndInfo->SysInfo.MaxChargingProfilePower : (int)ShmSysConfigAndInfo->SysInfo.MaxChargingProfilePower / 1000); printf("\r\n Max Total Current: %d A, Max Total Power: %d kW, Total Energy: %d kW, Total Duration %d", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent, ShmSysConfigAndInfo->SysConfig.MaxChargingPower, ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy, ShmSysConfigAndInfo->SysConfig.MaxChargingDuration); printf("\r\n\r\n Gun Enable Type Psu Phy_Vol Phy_Cur Config_Ocpp_MaxOcpp_Pow Config_Ocpp_MaxOcpp_Cur"); for(int i = 0; i < GENERAL_GUN_QUANTITY; i++) { inUsingCnt = 0; for(int j = 0; j < GENERAL_GUN_QUANTITY; j++) { if(ShmChargerInfo->PsuGrouping.GroupCollection[j].Role == _GROLE_MASTER) { inUsingCnt += ShmChargerInfo->PsuGrouping.GroupCollection[i].GunPsuQuantity; } } // Gun Enable Type Psu Phy_Vol Phy_Cur Config_Ocpp_MaxOcpp_Pow Config_Ocpp_MaxOcpp_Cur // 1 0 CHAdeMO 00 0000 V 0000 A 0000 / 0000 / 0000 kW 0000 / 0000 A // Gun 1 Enable, Type: CCS, Psu Cnt: 00, Max Physical Vol: 0000 V, Cur: 0000 A, Max Config Pow: 0000 kW, Cur: 0000 A printf("\r\n %d %d ", i + 1, ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable); if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable) { printf(" %7s %2d", _chargingData[i]->Type <= _Type_GB ? str_gun_type[_chargingData[i]->Type] : "???", ShmGroupCollection[i].GunPsuQuantity); printf(" %4d V %4d A", (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].RemoteMaxPhysicalVoltage / 10), (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].RemoteMaxPhysicalCurrent / 10)); if(ShmSysConfigAndInfo->SysInfo.MaxChargingProfilePower != -1) { limitPower = (int)ShmSysConfigAndInfo->SysInfo.MaxChargingProfilePower; if(inUsingCnt > 0) { limitPower = (limitPower * ShmGroupCollection[i].GunPsuQuantity) / inUsingCnt; } } else { limitPower = -1; } printf(" %4d / %4d / %4d kW", (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].MaxTotalChargingPower / 10), _chargingData[i]->ChargingProfilePower == -1 ? (int)_chargingData[i]->ChargingProfilePower : ((int)_chargingData[i]->ChargingProfilePower / 1000), limitPower == -1 ? limitPower : (limitPower / 1000)); printf(" %4d / %4d A", ((int)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].MaxTotalChargingCurrent / 10), _chargingData[i]->ChargingProfileCurrent == -1 ? (int)_chargingData[i]->ChargingProfileCurrent : ((int)_chargingData[i]->ChargingProfileCurrent / 10)); } } printf("\r\n\r\n"); } int main(void) { if(InitShareMemory() == FAIL) { printf ("InitShareMemory = FAIL \n"); if(ShmStatusCodeData != NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1; } sleep(5); return 0; } for(int i = 0; i < CONNECTOR_QUANTITY; i++) { if (!FindChargingInfoData(i, &_chargingData[0])) { return 0; } } /* memset(&ShmGroupCollection[0], 0x00, sizeof(PsuGroupCollectionData)); memset(&ShmGroupCollection[1], 0x00, sizeof(PsuGroupCollectionData)); memset(&ShmGroupCollection[2], 0x00, sizeof(PsuGroupCollectionData)); memset(&ShmGroupCollection[3], 0x00, sizeof(PsuGroupCollectionData)); ShmGroupCollection[0].Index = 0; ShmGroupCollection[1].Index = 1; ShmGroupCollection[2].Index = 2; ShmGroupCollection[3].Index = 3; ShmGroupCollection[0].Location = 0; ShmGroupCollection[1].Location = 3; ShmGroupCollection[2].Location = 1; ShmGroupCollection[3].Location = 2; */ for(;;) { char word[128]; char newString[7][32]; int i,j,ctr; fgets(word, sizeof(word), stdin); j=0; ctr=0; strcpy(newString[1], "-1"); strcpy(newString[2], "-1"); for (i = 0; i <= (strlen(word)); i++) { if (word[i] == ' ' || word[i] == '\0' || word[i] == 10) { newString[ctr][j] = '\0'; ctr++; j = 0; } else { newString[ctr][j] = word[i]; j++; } } if(strcmp(newString[0], "state") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; // 槍狀態 RunStatusProc(newString[1], newString[2]); } else if(strcmp(newString[0], "card") == 0) { // 刷卡狀態 RunCardProc(newString[1], newString[2]); } else if(strcmp(newString[0], "gun") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; // 插槍狀態 RunGunPlugitProc(newString[1], newString[2]); } else if(strcmp(newString[0], "lock") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; // 插槍狀態 GetGunLockStatusProc(newString[1], newString[2]); } else if(strcmp(newString[0], "sysid") == 0) { // 測試 sys id SetSystemIDProc(); } else if(strcmp(newString[0], "self") == 0) { // CSU 自我檢測狀態 RunSelfProc(newString[1]); } else if(strcmp(newString[0], "ver") == 0) { //if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) // continue; // 取 FW 版號 //GetFwVerProc(newString[1]); ShowFwVer(); } else if (strcmp(newString[0], "update") == 0) { // 更新 FwUpdateFlagProc(newString[1]); } else if (strcmp(newString[0], "ac") == 0) { // AC contactor 狀態 CheckAcStatus(newString[1]); } else if (strcmp(newString[0], "cable") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; // cable check pass SetCableChkStatus(newString[1], newString[2]); } else if (strcmp(newString[0], "pow") == 0) { if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) continue; // cable check pass SetPowerValue(newString[1], newString[2]); } else if (strcmp(newString[0], "model") == 0) { GetSystemInfo(); } else if(strcmp(newString[0], "select") == 0) { // 取得 / 設定 當前選的槍號 GetGunSelectedNum(newString[1]); } else if(strcmp(newString[0], "change") == 0) { // 模擬按鈕改變選槍 ChangeGunNum(); } else if(strcmp(newString[0], "fan") == 0) { // 設定風扇速度 SetFanSpeed(newString[1]); } else if(strcmp(newString[0], "speed") == 0) { // 取得風扇速度 GetFanSpeed(); } else if(strcmp(newString[0], "debug") == 0) { // 設定 debug mode SetDebugMode(newString[1]); } else if (strcmp(newString[0], "gfd") == 0) { // 設定盲沖使用 GFD 功能 SetGFDMode(newString[1]); } else if(strcmp(newString[0], "temp") == 0) { // 取得溫度 GetTemperature(newString[1]); } else if(strcmp(newString[0], "acin") == 0) { // 取得三向輸入電壓 GetAcInputVol(); } else if(strcmp(newString[0], "psu") == 0) { //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數 if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { printf ("PSU : Param fail..Please retry again......\n"); continue; } // 取得 PSU 資訊 GetPsuInformation(newString[1], newString[2], newString[3]); } else if (strcmp(newString[0], "cap") == 0) { GetConnectorCapInfo(newString[1]); } else if(strcmp(newString[0], "error") == 0) { CreateOneError(newString[1]); } else if (strcmp(newString[0], "auth") == 0) { GetAuthorizeFlag(newString[1]); } else if (strcmp(newString[0], "id") == 0) { GetOrClearId(newString[1]); } #if 0 else if(strcmp(newString[0], "strchg") == 0) { //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數 if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) { printf ("Input cmd fail ------ strchg [vol 150-1000] [cru 2-100]\n"); continue; } // 槍狀態 RunUnconditionalChargeIndex1(newString[1], newString[2], newString[3]); } else if(strcmp(newString[0], "str2chg") == 0) { //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數 if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0 || strcmp(newString[3], "-1") == 0 || strcmp(newString[3], "") == 0 || strcmp(newString[4], "-1") == 0 || strcmp(newString[4], "") == 0) { printf ("Input cmd fail ------ strchg [vol 150-1000] [cru 2-100]\n"); continue; } // 槍狀態 RunUnconditionalCharge(newString[1], newString[2], newString[3], newString[4]); } #endif else if(strcmp(newString[0], "wiring") == 0) { if(strcmp(newString[1], "-1") != 0 && strcmp(newString[1], "") != 0 && strcmp(newString[2], "-1") != 0 && strcmp(newString[2], "") != 0) { SetWiringInfo(newString[1], newString[2]); } ShowWiringInfo(); } else if(strcmp(newString[0], "cwiring") == 0) { CleanWiringInfo(); } else if(strcmp(newString[0], "reset") == 0) { SetSystemSoftRest(); } else if(strcmp(newString[0], "reboot") == 0) { SetSystemHardReboot(); } else if(strcmp(newString[0], "sgroup") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { ShowGroupingInfo(); continue; } RunSimplePsuGrouping(newString[1], newString[2]); } else if(strcmp(newString[0], "cabinet") == 0) { ShowCabinetInfo(); } else if(strcmp(newString[0], "tctl") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) { printf("Test Control Value = %08X\n",ShmChargerInfo->Control.TestCtrl.CtrlValue); printf ("Input cmd fail ------ tctl [tcmd] [value]\n\n"); continue; } SetTestControl(newString[1], newString[2]); } else if(strcmp(newString[0], "group") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { ShowGroupingInfo(); continue; } } else if(strcmp(newString[0], "gdmd") == 0) { ShowGroupingDemand(); } else if(strcmp(newString[0], "gunchg") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0 || strcmp(newString[3], "-1") == 0 || strcmp(newString[3], "") == 0) { printf ("Input cmd fail ------ gunchg [gun 1-4] [voltage 0-1000] [current 0-100]\n\n"); continue; } SetGunStartCharging(newString[1], newString[2], newString[3]); } else if(strcmp(newString[0], "gunstp") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { printf ("Input cmd fail ------ gunstp [gun 1-4]\n\n"); continue; } SetGunStopCharging(newString[1]); } else if(strcmp(newString[0], "gunext") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { printf ("Input cmd fail ------ gunext [gun 1-4]\n\n"); continue; } SetGunExtend(newString[1]); } else if(strcmp(newString[0], "output") == 0) { ShowGunOutput(); } else if(strcmp(newString[0], "gio") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) { printf ("Input cmd fail ------ gio [io] [on-off 0-1]\n\n"); continue; } SetGpio(newString[1], newString[2]); } else if(strcmp(newString[0], "status") == 0) { ShowStatus(); } else if(strcmp(newString[0], "whiteR") == 0) { ShowWhiteCardList(); } else if(strcmp(newString[0], "whiteW") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 || strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) { printf ("Input cmd fail ------ whiteW [index 1-10] [card id]\n\n"); continue; } WriteWhiteCard(newString[1], newString[2]); } else if(strcmp(newString[0], "whiteE") == 0) { if(strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) { printf ("Input cmd fail ------ whiteE [index 1-10]\n\n"); continue; } EraseWhiteCard(newString[1]); } else if(strcmp(newString[0], "limit") == 0) { ShowChargerLimit(); } else printf ("%s\n", msg); usleep(100000); } return 0; }