/* * Module_LedIndication.c * * Created on: 2021年11月2日 * Author: 7978 */ #include #include #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 "Module_LedIndication.h" #include "Config.h" #include "Common.h" struct SysConfigAndInfo *ShmSysConfigAndInfo; ChargerInfoData *ShmChargerInfo; struct ChargingInfoData *chargingInfo[CONNECTOR_QUANTITY]; struct PrimaryMcuData *ShmPrimaryMcuData; struct timespec _DO_LED_time; struct timespec _DKLed_time[2]; unsigned char _DOLedStatus, _preDOLedStatus; unsigned char _DKLedStatus[2], _preDKLedStatus[2]; //========================================== // Init all share memory //========================================== int InitShareMemory(void) { int result = PASS; int MeterSMId; //creat ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0) { #ifdef SystemLogMessage LOG_ERROR("shmget ShmSysConfigAndInfo NG"); #endif result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage LOG_ERROR("shmat ShmSysConfigAndInfo NG"); #endif result = FAIL; } else { } // initial primary share memory if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0) { #ifdef SystemLogMessage LOG_ERROR("shmget ShmPrimaryMcuData NG"); #endif result = FAIL; } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage LOG_ERROR("shmat ShmPrimaryMcuData NG"); #endif result = FAIL; } if ((MeterSMId = shmget(SM_ChargerInfoKey, sizeof(ChargerInfoData), 0777)) < 0) { #ifdef SystemLogMessage LOG_ERROR("shmat ChargerInfoData NG"); #endif result = FAIL; } else if ((ShmChargerInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage LOG_ERROR("shmat ChargerInfoData NG"); #endif result = FAIL; } return result; } void InitialConnector(void) { for(int i = 0; i < CONNECTOR_QUANTITY; i++) { chargingInfo[i] = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData; } } // connector: connector infex, 0 ~ 3 void SetLedStatus(unsigned char connector, unsigned char indication) { int greenOffset = 0, redOffset = 0; if(ShmChargerInfo->Control.SysCtrl.bits.DOLedIndication) { greenOffset = 2; redOffset = 3; } if(ShmChargerInfo->Control.SysCtrl.bits.DKLedIndication) { if(connector == 0) { greenOffset = 4; redOffset = 5; } else if(connector == 1) { greenOffset = 2; redOffset = 3; } else { return; } } switch(indication) { case _LED_INDICATION_OFF: ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << greenOffset); // green off ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << redOffset); // red off break; case _LED_INDICATION_RUN: ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << greenOffset); // green on ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << redOffset); // red off break; case _LED_INDICATION_FAULT: ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << greenOffset); // green off ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << redOffset); // red on break; case _LED_INDICATION_ON: ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << greenOffset); // green on ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << redOffset); // red on break; case _LED_INDICATION_GREEN_TOGGLE: if(ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] & (0x01 << greenOffset)) { ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << greenOffset); // green off } else { ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << greenOffset); // green on } break; case _LED_INDICATION_RED_TOGGLE: if(ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] & (0x01 << redOffset)) { ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] &= ~(0x01 << redOffset); // red off } else { ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0] |= (0x01 << redOffset); // red on } break; } } void MCabinetDOIndication(void) { if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate || ShmSysConfigAndInfo->SysWarningInfo.Level == 2) { _DOLedStatus = _STANDARD_LED_Alarm; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; } SetLedStatus(0, _LED_INDICATION_FAULT); } else { if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.PresentDispenserQuantity == 0) { _DOLedStatus = _STANDARD_LED_Disconnection; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; // reset led status & indication time GetClockTime(&_DO_LED_time); SetLedStatus(0, _LED_INDICATION_OFF); } if((GetTimeoutValue(_DO_LED_time) / mSEC_VAL) >= DO_LED_BLINK_TIME) { SetLedStatus(0, _LED_INDICATION_GREEN_TOGGLE); SetLedStatus(0, _LED_INDICATION_RED_TOGGLE); GetClockTime(&_DO_LED_time); } } else { _DOLedStatus = _STANDARD_LED_Running; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; } SetLedStatus(0, _LED_INDICATION_RUN); } } } void MCabinetDKIndication(void) { for(int i = 0; i < 2; i++) { if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate) { _DKLedStatus[i] = _E4YOU_LED_Alarm; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; } SetLedStatus(i, _LED_INDICATION_FAULT); } else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus == S_FAULT || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus == S_ALARM) && ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable) { _DKLedStatus[i] = _E4YOU_LED_Alarm; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; } SetLedStatus(i, _LED_INDICATION_FAULT); } else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable == false) { _DKLedStatus[i] = _E4YOU_LED_Disconnection; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; // reset led status & indication time GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_OFF); } if((GetTimeoutValue(_DKLed_time[i]) / mSEC_VAL) >= DK_LED_BLINK_TIME) { GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_GREEN_TOGGLE); SetLedStatus(i, _LED_INDICATION_RED_TOGGLE); } } else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus == S_IDLE || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus == S_MAINTAIN || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus == S_RESERVATION) { _DKLedStatus[i] = _E4YOU_LED_Idle; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; } SetLedStatus(i, _LED_INDICATION_RUN); } else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus >= S_REASSIGN_CHECK && ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus <= S_COMPLETE) { _DKLedStatus[i] = _E4YOU_LED_Charging; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; // reset led status & indication time GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_OFF); } if((GetTimeoutValue(_DKLed_time[i]) / mSEC_VAL) >= DK_INCHARGING_BLINK_TIME) { GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_GREEN_TOGGLE); } } } } void SCabinetDOIndication(void) { if(ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Idle || ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Alarm || ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Charging) { if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate) { _DOLedStatus = _STANDARD_LED_Alarm; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; } SetLedStatus(0, _LED_INDICATION_FAULT); } else { _DOLedStatus = _STANDARD_LED_Running; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; } SetLedStatus(0, _LED_INDICATION_RUN); } } else { _DOLedStatus = _STANDARD_LED_Disconnection; if(_preDOLedStatus != _DOLedStatus) { _preDOLedStatus = _DOLedStatus; // reset led status & indication time GetClockTime(&_DO_LED_time); SetLedStatus(0, _LED_INDICATION_OFF); } if((GetTimeoutValue(_DO_LED_time) / mSEC_VAL) >= DO_LED_BLINK_TIME) { SetLedStatus(0, _LED_INDICATION_GREEN_TOGGLE); SetLedStatus(0, _LED_INDICATION_RED_TOGGLE); GetClockTime(&_DO_LED_time); } } } void SCabinetDKIndication(void) { if(ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Idle || ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Alarm || ShmChargerInfo->SCabinetControl.SCabinetStatus == _DeviceStatus_Charging) { for(int i = 0; i < 2; i++) { if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate) { _DKLedStatus[i] = _E4YOU_LED_Alarm; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; } SetLedStatus(i, _LED_INDICATION_FAULT); } else { _DKLedStatus[i] = _E4YOU_LED_Idle; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; } SetLedStatus(i, _LED_INDICATION_RUN); } } } else { for(int i = 0; i < 2; i++) { _DKLedStatus[i] = _E4YOU_LED_Disconnection; if(_preDKLedStatus[i] != _DKLedStatus[i]) { _preDKLedStatus[i] = _DKLedStatus[i]; // reset led status & indication time GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_OFF); } if((GetTimeoutValue(_DKLed_time[i]) / mSEC_VAL) >= DK_LED_BLINK_TIME) { GetClockTime(&_DKLed_time[i]); SetLedStatus(i, _LED_INDICATION_GREEN_TOGGLE); SetLedStatus(i, _LED_INDICATION_RED_TOGGLE); } } } } void LedIndicationProcess(void) { if(ShmChargerInfo->Control.SysCtrl.bits.DOLedIndication) { if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE || ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE) { SetLedStatus(0, _LED_INDICATION_ON); return; } if(ShmChargerInfo->Control.CabinetRole != _CROLE_SLAVE) { MCabinetDOIndication(); } else { SCabinetDOIndication(); } } if(ShmChargerInfo->Control.SysCtrl.bits.DKLedIndication) { if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE || ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE) { for(int i = 0; i < 2; i++) { SetLedStatus(i, _LED_INDICATION_ON); } return; } if(ShmChargerInfo->Control.CabinetRole != _CROLE_SLAVE) { MCabinetDKIndication(); } else { SCabinetDKIndication(); } } } int main(void) { if(InitShareMemory() == FAIL) { #ifdef SystemLogMessage LOG_ERROR("InitShareMemory NG"); #endif sleep(5); return 0; } InitialConnector(); if(ShmChargerInfo->Control.SysCtrl.bits.DOLedIndication) { _DOLedStatus = _STANDARD_LED_None; _preDOLedStatus = _STANDARD_LED_None; SetLedStatus(0, _LED_INDICATION_ON); } if(ShmChargerInfo->Control.SysCtrl.bits.DKLedIndication) { _DKLedStatus[0] = _E4YOU_LED_None; _DKLedStatus[1] = _E4YOU_LED_None; _preDKLedStatus[0] = _E4YOU_LED_None; _preDKLedStatus[1] = _E4YOU_LED_None; SetLedStatus(0, _LED_INDICATION_ON); SetLedStatus(1, _LED_INDICATION_ON); } while(1) { LedIndicationProcess(); usleep(100000); } return 0; }