浏览代码

Merge branch 'DS60-120'

FolusWen 4 年之前
父节点
当前提交
0a0a90ef43

+ 58 - 0
EVSE/Projects/DS60-120/Apps/Config.h

@@ -103,6 +103,7 @@ enum _LCM_INDEX
 	_LCM_CHARGING = 		0x07,
 	_LCM_COMPLETE = 		0x08,
 	_LCM_FIX = 				0x09,
+	_LCM_EMC = 				0x0A,
 	_LCM_NONE = 			0xFF,
 };
 
@@ -245,8 +246,53 @@ enum RELAY_STATUS_ERROR_TYPE
 	RELAY_STATUS_ERROR_DRIVING = 11
 };
 
+enum START_TRANSATION_STATUS
+{
+	START_TRANSATION_STATUS_WAIT = 0x00,
+	START_TRANSATION_STATUS_PASS = 0x01,
+	START_TRANSATION_STATUS_FAIL = 0x02,
+};
+
+typedef union
+{
+    unsigned int GunErrMessage;
+    struct
+    {
+    	// Chademo
+        unsigned char ChaGfdTrip:1;
+        unsigned char ChaUvpFail:1;
+        unsigned char ChaConnectOTP:1;
+        unsigned char ChaConnectOVP:1;
+        unsigned char ChaGfdWarning:1;
+        unsigned char ChaRelayWeldingFault:1;
+        unsigned char ChaRelayDrivingFault:1;
+        unsigned char ChaConnectTempSensorFail:1;
+
+        // CCS
+        unsigned char CCSGfdTrip :1;
+		unsigned char CCSUvpFail :1;
+		unsigned char CCSConnectOTP :1;
+		unsigned char CCSConnectOVP :1;
+		unsigned char CCSGfdWarning :1;
+		unsigned char CCSRelayWeldingFault :1;
+		unsigned char CCSRelayDrivingFault :1;
+		unsigned char CCSConnectTempSensorFail :1;
+
+		// GBT
+		unsigned char GBTGfdTrip :1;
+		unsigned char GBTUvpFail :1;
+		unsigned char GBTConnectOTP :1;
+		unsigned char GBTConnectOVP :1;
+		unsigned char GBTGfdWarning :1;
+		unsigned char GBTRelayWeldingFault :1;
+		unsigned char GBTRelayDrivingFault :1;
+		unsigned char GBTConnectTempSensorFail :1;
+    }GunBits;
+}GunErr;
+
 struct DcCommonInformation
 {
+	unsigned char rebootCount;
 	// check if the guns are of the same type
 	byte SysGunAreSameType;
 	// to check the ccs version
@@ -255,6 +301,18 @@ struct DcCommonInformation
 	char RelayCheckStatus[6];
 	char GunRelayWeldingOccur[2];
 	char GunRelayDrivingOccur[2];
+	unsigned char ConnectorTemp1[2]; //0x00: -60¢XC  ~  0xFE: 194
+	unsigned char ConnectorTemp2[2]; //0x00: -60¢XC  ~  0xFE: 194
+	// to check the ac contact status with psu communication
+	unsigned char acContactSwitch;
+	unsigned char psuKeepCommunication;
+	unsigned char startTransationFlag[2];
+
+	GunErr ConnectErrList[2];
+
+	// Plugit Rack180 : for checking start/stop charging flag
+	unsigned char StartToChargingFlag[2]; // 0 : Stop, 1 : Start by modbus
+	unsigned short LcmFwVersion;
 };
 
 #endif /* CONFIG_H_ */

+ 0 - 2
EVSE/Projects/DS60-120/Apps/FactoryConfig.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/can.h>
 #include 	<linux/can/raw.h>
@@ -23,7 +22,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>

+ 167 - 27
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/can.h>
 #include 	<linux/can/raw.h>
@@ -23,7 +22,6 @@
 #include    <fcntl.h>      /*檔控制定義*/
 #include    <termios.h>    /*PPSIX 終端控制定義*/
 #include    <errno.h>      /*錯誤號定義*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>
@@ -44,6 +42,8 @@
 #define CHK_CUR_RANGE		20
 #define PLUG				1
 #define UNPLUG				0
+#define UNDEFINED_TEMP		255
+#define ALLOW_COUNT_MAX		10
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -72,6 +72,12 @@ float maxChargingVol[2] = { 0, 0 };			// 
 float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
 float maxChargingPow = 0;					// 限制最大充電能量,如依照模塊則填上 0
 
+// 允許當前輸出與需求落差超過 10A 的累積次數 (超過 ALLOW_COUNT_MAX 即給予當前值)
+byte curAllowCount[2] = { 0, 0 };
+
+// 避免槍溫偵測誤判
+byte gunTempAllowCount[2] = {0, 0};
+
 // 槍資訊
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct timeval _chk_ratingPower_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -176,7 +182,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 
 //=================================
@@ -713,6 +719,28 @@ void ClearAbnormalStatus_Chademo(byte gun_index)
 			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
 			isCleanCheck = true;
 		}
+		else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023980", 6) == EQUAL &&
+				ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_BMS_CHARGE_ALLOW_ERROR == YES)
+		{
+			memcpy(code, "023980", 6);
+			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023981", 6) == EQUAL &&
+				ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_OUTPUT_VOLTAGE_MORE_THEN_10_PERCENT == YES)
+		{
+			memcpy(code, "023981", 6);
+			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+
+		else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023982", 6) == EQUAL &&
+				ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_ADC_LESS_THAN_10V == YES)
+		{
+			memcpy(code, "023982", 6);
+			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
 	}
 
 	if (isCleanCheck)
@@ -758,6 +786,9 @@ void ClearAbnormalStatus_Chademo(byte gun_index)
 					if (strncmp(code, "023734", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = NO;
 					if (strncmp(code, "023735", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = NO;
 					if (strncmp(code, "023736", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = NO;
+					if (strncmp(code, "023980", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_BMS_CHARGE_ALLOW_ERROR = NO;
+					if (strncmp(code, "023981", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_OUTPUT_VOLTAGE_MORE_THEN_10_PERCENT = NO;
+					if (strncmp(code, "023982", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_ADC_LESS_THAN_10V = NO;
 				}
 			}
 		}
@@ -2284,6 +2315,20 @@ void ClearAbnormalStatus_CCS(byte gun_index)
 			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
 			isCleanCheck = true;
 		}
+		else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023979", 6) == EQUAL &&
+				ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging == YES)
+		{
+			memcpy(code, "023979", 6);
+			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023983", 6) == EQUAL &&
+				ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason == YES)
+		{
+			memcpy(code, "023983", 6);
+			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
 	}
 
 	if (isCleanCheck)
@@ -2436,6 +2481,8 @@ void ClearAbnormalStatus_CCS(byte gun_index)
 					if (strncmp(code, "023891", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO;
 					//if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
 					if (strncmp(code, "023893", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccFailForQCA7000SetKey = NO;
+					if (strncmp(code, "023979", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = NO;
+					if (strncmp(code, "023983", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = NO;
 				}
 			}
 		}
@@ -2491,6 +2538,9 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
 	if (strcmp(string, "023734") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = YES;
 	if (strcmp(string, "023735") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = YES;
 	if (strcmp(string, "023736") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = YES;
+	if (strcmp(string, "023980") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_BMS_CHARGE_ALLOW_ERROR = YES;
+	if (strcmp(string, "023981") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_OUTPUT_VOLTAGE_MORE_THEN_10_PERCENT = YES;
+	if (strcmp(string, "023982") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CHADEMO_ADC_LESS_THAN_10V = YES;
 
 	if (strcmp(string, "012288") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
 	if (strcmp(string, "023701") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = YES;
@@ -2634,6 +2684,8 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
 	if (strcmp(string, "023891") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = YES;
 	if (strcmp(string, "023892") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = YES;
 	if (strcmp(string, "023893") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccFailForQCA7000SetKey = YES;
+	if (strcmp(string, "023979") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = YES;
+	if (strcmp(string, "023983") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = YES;
 
 	if (strcmp(string, "023702") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = YES;
 	if (strcmp(string, "023900") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = YES;
@@ -2701,6 +2753,27 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
 	return true;
 }
 
+byte ReturnConnectTemp(byte temp1, byte temp2)
+{
+	byte result = 0;
+
+	if (temp1 == UNDEFINED_TEMP && temp2 == UNDEFINED_TEMP)
+		return UNDEFINED_TEMP;
+
+	if (temp1 != UNDEFINED_TEMP)
+		result = temp1;
+	else
+		temp1 = 0;
+
+	if (temp2 != UNDEFINED_TEMP)
+	{
+		if (temp2 > temp1)
+			result = temp2;
+	}
+
+	return result;
+}
+
 void CANReceiver()
 {
 	pid_t canRecPid;
@@ -2972,6 +3045,10 @@ void CANReceiver()
 						_chargingData[targetGun]->GunLocked = frame.data[0];
 						_chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
 
+						ShmDcCommonData->ConnectorTemp1[targetGun] = frame.data[1];
+						ShmDcCommonData->ConnectorTemp2[targetGun] = frame.data[2];
+
+						_chargingData[targetGun]->ConnectorTemp = ReturnConnectTemp(frame.data[1], frame.data[2]);
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
@@ -3016,9 +3093,9 @@ void CANReceiver()
 								_chargingData[targetGun]->SystemStatus <= S_CCS_PRECHARGE_ST1))
 						{
 							// frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
-							PRINTF_FUNC("Gun_%d, Stop charging by EV. \n", targetGun);
-							//if (frame.data[0] == 0x02)
+							if (frame.data[0] == 0x02)
 							{
+								PRINTF_FUNC("Gun_%d, ** Emc Level **, Stop charging by EV. \n", targetGun);
 								if (AbnormalStopAnalysis(targetGun, frame.data + 1))
 								{
 									_chargingData[targetGun]->StopChargeFlag = YES;
@@ -3026,9 +3103,16 @@ void CANReceiver()
 								else
 								{
 									// 六個蛋
-									_chargingData[targetGun]->UnKnowStopChargeFlag = YES;
+									_chargingData[targetGun]->NormalStopChargeFlag = YES;
 								}
 							}
+							else
+							{
+								AbnormalStopAnalysis(targetGun, frame.data + 1);
+
+								PRINTF_FUNC("Gun_%d, ** Normal Level **, Stop charging by EV. \n", targetGun);
+								_chargingData[targetGun]->NormalStopChargeFlag = YES;
+							}
 						}
 					}
 						break;
@@ -3074,6 +3158,15 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 
 	cur1 = (chargingData_1->PresentChargingCurrent * 10);
 
+	float targetCur = chargingData_1->EvBatterytargetCurrent * 10;
+	if (curAllowCount[0] < ALLOW_COUNT_MAX)
+	{
+		if (cur1 > targetCur + 100 || cur1 < targetCur - 100)
+			cur1 = targetCur;
+		else
+			curAllowCount[0] = 0;
+	}
+
 //	if (ShmGBTData->ev[chargingData_2->type_index].PresentMsgFlowStatus == 10)
 //		vol2 = ShmPsuData->PsuGroup[1].GroupTargetOutputVoltage;
 //	else
@@ -3089,7 +3182,7 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 		)
 	{
 		PRINTF_FUNC("G1 -> Output Vol = %.1f, Output Cur = %.1f -- G2 -> Output Vol = %.1f, Output Cur = %.1f \n",
-			vol1 / 10, cur1 / 10, vol2 / 10, cur2 / 10);
+				vol1 / 10, cur1 / 10, vol2 / 10, cur2 / 10);
 
 		LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] = vol1;
 		LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] = cur1;
@@ -3097,6 +3190,15 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 		LogInfo[1][EV_LOG_NOW_OUTPUT_CUR] = cur2;
 	}
 
+	targetCur = chargingData_2->EvBatterytargetCurrent * 10;
+	if (curAllowCount[1] < ALLOW_COUNT_MAX)
+	{
+		if (cur2 > targetCur + 100 || cur2 < targetCur - 100)
+			cur2 = targetCur;
+		else
+			curAllowCount[1] = 0;
+	}
+
 	SetPresentOutputPower(vol1, cur1, vol2, cur2);
 }
 
@@ -3224,10 +3326,10 @@ void GetMaxPowerMethod(byte index, float *pow)
 
 	if (((_chargingData[index]->SystemStatus >= S_PREPARING_FOR_EVSE && _chargingData[index]->SystemStatus <= S_CHARGING) ||
 			(_chargingData[index]->SystemStatus >= S_CCS_PRECHARGE_ST0 && _chargingData[index]->SystemStatus <= S_CCS_PRECHARGE_ST1)) &&
-			_chargingData[index]->ChargingProfilePower >= 0 &&
-			_chargingData[index]->ChargingProfilePower <= *pow)
+			(_chargingData[index]->ChargingProfilePower / 1000) >= 0 &&
+			(_chargingData[index]->ChargingProfilePower / 1000) <= *pow)
 	{
-		*pow = _chargingData[index]->ChargingProfilePower;
+		*pow = (float)(_chargingData[index]->ChargingProfilePower / 1000) * 10;
 	}
 }
 
@@ -3502,8 +3604,12 @@ void CalOutputPowerAndEnergy(int _index)
 		//printf("(%d), totalChargingValue = %f \n", _index, ShmCsuMeterData->_meter[_index]._curTotalCharging / 100);
 		float totalChargingValue = ShmCsuMeterData->_meter[_index]._curTotalCharging / 100;
 
+		if (totalChargingValue > _chargingData[_index]->PresentChargedEnergy)
+		{
+			_chargingData[_index]->PowerConsumption += totalChargingValue - _chargingData[_index]->PresentChargedEnergy;
+		}
+
 		_chargingData[_index]->PresentChargedEnergy = totalChargingValue;
-		_chargingData[_index]->PowerConsumption = totalChargingValue;
 
 		if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 		{
@@ -3529,8 +3635,8 @@ void CalOutputPowerAndEnergy(int _index)
 					_chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 				}
 
-				_chargingData[_index]->PresentChargedEnergy += changingPow;
 				_chargingData[_index]->PowerConsumption += changingPow;
+				_chargingData[_index]->PresentChargedEnergy += changingPow;
 				chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
 			}
 		}
@@ -3627,6 +3733,40 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->PresentChargedEnergy,
 						(_chargingData[_index]->PresentChargingVoltage * 10),
 						targetID);
+
+				bool isOTP = false;
+
+				if (_chargingData[_index]->Type == _Type_Chademo)
+				{
+					if (ShmDcCommonData->ConnectErrList[_index].GunBits.ChaConnectOTP)
+						isOTP = true;
+					else
+						isOTP = false;
+				}
+				else if (_chargingData[_index]->Type == _Type_CCS_2)
+				{
+					if (ShmDcCommonData->ConnectErrList[_index].GunBits.CCSConnectOTP)
+						isOTP = true;
+					else
+						isOTP = false;
+				}
+				else if (_chargingData[_index]->Type == _Type_GB)
+				{
+					if (ShmDcCommonData->ConnectErrList[_index].GunBits.GBTConnectOTP)
+						isOTP = true;
+					else
+						isOTP = false;
+				}
+
+				if (isOTP)
+				{
+					if (gunTempAllowCount[_index] >= 2)
+						_chargingData[_index]->StopChargeFlag = YES;
+					else
+						gunTempAllowCount[_index] += 1;
+				}
+				else
+					gunTempAllowCount[_index] = 0;
 			}
 
 			switch (_chargingData[_index]->SystemStatus)
@@ -3658,14 +3798,24 @@ int main(int argc, char *argv[])
 							chkChademoPermission[_index] = false;
 							SendStopOnly(_index);
 						}
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.ChaConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
+
 					}
 					else if (_chargingData[_index]->Type == _Type_GB)
 					{
 						ClearAbnormalStatus_GB(_index);
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.GBTConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
 					}
 					else if (_chargingData[_index]->Type == _Type_CCS_2)
 					{
 						ClearAbnormalStatus_CCS(_index);
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.CCSConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
 					}
 
 					if (priorityLow == 1)
@@ -3674,14 +3824,14 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->PresentChargingPower = 0;
 						_chargingData[_index]->GroundFaultStatus = GFD_WAIT;
 						_chargingData[_index]->RealRatingPower = 0;
-						_chargingData[_index]->StopChargeFlag = NO;
-						_chargingData[_index]->UnKnowStopChargeFlag = NO;
+						_chargingData[_index]->NormalStopChargeFlag = NO;
 						_chargingData[_index]->ChargingFee = 0.0;
 						_chargingData[_index]->EvBatterySoc = 0;
 						_chargingData[_index]->EvBatteryStartSoc = 0;
 						_chargingData[_index]->EvBatteryMaxVoltage = 0;
 						_chargingData[_index]->ChargingProfilePower = -1;
 						_chargingData[_index]->ChargingProfileCurrent = -1;
+						curAllowCount[_index] = 0;
 
 						if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 						{
@@ -3736,12 +3886,13 @@ int main(int argc, char *argv[])
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
 					else if (gun_count == 2)
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-					_chargingData[_index]->PowerConsumption = 0;
 				}
 					break;
 				case S_PREPARING_FOR_EV:
 				{
+					if (ShmDcCommonData->startTransationFlag[_index] == START_TRANSATION_STATUS_WAIT)
+						continue;
+
 					// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
 					GetOutputReq(_index, targetID);
 
@@ -4019,17 +4170,6 @@ int main(int argc, char *argv[])
 								maxCur,
 								maxVol,
 								targetID);
-
-						if (_chargingData[_index]->EvBatterySoc >= 100)
-						{
-							//滿電,則直接清掉錯誤
-							if (_chargingData[_index]->Type == _Type_Chademo)
-								ClearAbnormalStatus_Chademo(_index);
-							else if (_chargingData[_index]->Type == _Type_GB)
-								ClearAbnormalStatus_GB(_index);
-							else if (_chargingData[_index]->Type == _Type_CCS_2)
-								ClearAbnormalStatus_CCS(_index);
-						}
 					}
 				}
 					break;

+ 32 - 4
EVSE/Projects/DS60-120/Apps/Module_EventLogging.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>
@@ -33,6 +31,8 @@
 #define FAIL				-1
 #define YES					1
 #define NO					0
+#define CHANGED				1
+#define UNCHANGED			0
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -148,7 +148,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 
 //=================================
@@ -360,16 +360,26 @@ int main(void)
 		return 0;
 	}
 
+	byte isChanged;
+
 	for(;;)
 	{
+		isChanged = UNCHANGED;
+
 		//check Fault Status
 		for(ByteCount=0;ByteCount<4;ByteCount++)
 		{
+			if (isChanged == CHANGED)
+				break;
+
 			if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
 			{
 				tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -381,12 +391,14 @@ int main(void)
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						else
 						{
 							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 
 						EVENT_INFO("%s\n", EventCodeTmp);
@@ -399,11 +411,17 @@ int main(void)
 		//check Alarm Status
 		for(ByteCount=0;ByteCount<14;ByteCount++)
 		{
+			if (isChanged == CHANGED)
+				break;
+
 			if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
 			{
 				tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -415,12 +433,14 @@ int main(void)
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						else
 						{
 							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 
 						EVENT_INFO("%s\n", EventCodeTmp);
@@ -431,13 +451,19 @@ int main(void)
 		}
 
 		//check Info Status
-		for(ByteCount=0;ByteCount<40;ByteCount++)
+		for(ByteCount=0;ByteCount<41;ByteCount++)
 		{
+			if (isChanged == CHANGED)
+				break;
+
 			if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
 			{
 				tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -449,12 +475,14 @@ int main(void)
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						else
 						{
 							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 
 						EVENT_INFO("%s\n", EventCodeTmp);

+ 323 - 219
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
@@ -15,13 +14,12 @@
 
 #include 	<unistd.h>
 #include 	<stdarg.h>
-#include    <stdio.h>      /*璅蹱�頛詨�頛詨枂摰𡁶儔*/
-#include    <stdlib.h>     /*璅蹱��賣彍摨怠�蝢�*/
-#include    <unistd.h>     /*Unix 璅蹱��賣彍摰𡁶儔*/
-#include    <fcntl.h>      /*瑼娍綉�嗅�蝢�*/
-#include    <termios.h>    /*PPSIX 蝯�垢�批�摰𡁶儔*/
-#include    <errno.h>      /*�航炊�笔�蝢�*/
-#include 	<errno.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>
@@ -38,6 +36,7 @@
 #define NO					0
 #define STOP				0
 #define START				1
+#define	ABNORMAL			1
 #define RELAY_CHECK_TIME	5		// s
 #define OUTPUT_VOL_CHK_TIME	200 	// ms
 #define TEN_MINUTES			600		// s
@@ -63,19 +62,21 @@ struct RelayModuleData			*ShmRelayModuleData;
 struct LedModuleData			*ShmLedModuleData;
 struct PsuData 					*ShmPsuData;
 struct OCPP16Data				*ShmOCPP16Data;
+struct OCPP20Data				*ShmOCPP20Data;
+struct PrimaryMcuData			*ShmPrimaryMcuData;
 struct DcCommonInformation		*ShmDcCommonData;
 
-#define VIN_MAX_VOLTAGE_IEC			285	// 憭扳䲰閰脣�� : OVP
-#define VIN_MAX_REV_VOLTAGE_IEC		275	// 撠𤩺䲰鞈行飛 OVP
-#define VIN_MIN_VOLTAGE_IEC			160	// 撠𤩺䲰閰脣�� : UVP
-#define VIN_MIN_REV_VOLTAGE_IEC		170	// 憭扳䲰鞈行飛 UVP
+#define VIN_MAX_VOLTAGE_IEC			285	// 大於該值 : OVP
+#define VIN_MAX_REV_VOLTAGE_IEC		275	// 小於賦歸 OVP
+#define VIN_MIN_VOLTAGE_IEC			160	// 小於該值 : UVP
+#define VIN_MIN_REV_VOLTAGE_IEC		170	// 大於賦歸 UVP
 
-#define VIN_MAX_VOLTAGE_UL			315	// 憭扳䲰閰脣�� : OVP // 蝢舘� (W)
-#define VIN_MAX_REV_VOLTAGE_UL		305	// 撠𤩺䲰鞈行飛 OVP
-#define VIN_MIN_VOLTAGE_UL			210	// 撠𤩺䲰閰脣�� : UVP
-#define VIN_MIN_REV_VOLTAGE_UL 		220	// 憭扳䲰鞈行飛 UVP
+#define VIN_MAX_VOLTAGE_UL			315	// 大於該值 : OVP // 美規 (W)
+#define VIN_MAX_REV_VOLTAGE_UL		305	// 小於賦歸 OVP
+#define VIN_MIN_VOLTAGE_UL			210	// 小於該值 : UVP
+#define VIN_MIN_REV_VOLTAGE_UL 		220	// 大於賦歸 UVP
 
-#define VIN_DROP_VOLTAGE	150	// 撠𤩺䲰閰脣�� : ac drop
+#define VIN_DROP_VOLTAGE	150	// 小於該值 : ac drop
 
 #define VOUT_MAX_VOLTAGE	995
 #define VOUT_MIN_VOLTAGE	150
@@ -101,19 +102,19 @@ struct DcCommonInformation		*ShmDcCommonData;
 #define LED_BRIGHTNESS_LV_MID		0.5
 #define LED_BRIGHTNESS_LV_LOW		0.2
 
-// ��撠誩��� Relay �餃�
+// 最小切換 Relay 電壓
 #define SELF_TO_CHANGE_RELAY_STATUS			600
-// �誯��餃�蝣箄� Relay �臬炏�凋�����𡁻𤓖憯�
+// 透過電壓確認 Relay 是否搭上的依據電壓
 #define CHECK_RELAY_STATUS					300
 #define CHECK_RELAY_STATUS_GAP				100
-// 摰匧��典�甇W��餌�摨譍葉�琿� Relay ��𤓖瘚�
+// 安全在停止充電程序中斷開 Relay 的電流
 #define SEFETY_SWITCH_RELAY_CUR				50
-// 蝣箄� Relay Welding �餃�
+// 確認 Relay Welding 電壓
 #define RELAY_WELDING_DET					300
 
 byte gunCount;
 byte acgunCount;
-// 瑽滩�閮�
+// 槍資訊
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
 
@@ -277,7 +278,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 
 //==========================================
@@ -452,7 +453,7 @@ void SetModelName_Fan()
 	}
 }
 
-// AC 銝厩㮾頛詨��餃�
+// AC 三相輸入電壓
 void GetPresentInputVol()
 {
 	if (Query_Present_InputVoltage(Uart5Fd, Addr.Relay, &inputVoltage) == PASS)
@@ -717,7 +718,7 @@ void GetPresentInputVol()
 	}
 }
 
-// 撌血𢰧瑽滨� Relay �滚���撓�粹𤓖憯�
+// 左右槍的 Relay 前後的輸出電壓
 void GetPersentOutputVol()
 {
 	if (Query_Present_OutputVoltage(Uart5Fd, Addr.Relay, &outputVoltage) == PASS)
@@ -758,8 +759,8 @@ void GetPersentOutputVol()
 
 			//unsigned short Ovp = 0;
 			//unsigned short Ocp = 0;
-			//Ovp = MIN [VOUT_MAX_VOLTAGE, EV_BATTERY_VOLTAGE] 	// ��憭扯撓�粹𤓖憯栞��餅��餃���憭批��
-			//Ocp = MIN [IOUT_MAX_CURRENT, EV_CURRENT_REQ]		// ��憭扯撓�粹𤓖瘚����瘙�𤓖瘚��撠誩��
+			//Ovp = MIN [VOUT_MAX_VOLTAGE, EV_BATTERY_VOLTAGE] 	// 最大輸出電壓與電池電壓最大值
+			//Ocp = MIN [IOUT_MAX_CURRENT, EV_CURRENT_REQ]		// 最大輸出電流與需求電流最小值
 			if (_chargingData[index]->Type == _Type_Chademo)
 			{
 				//Ovp = MaxValue(_chargingData[index]->MaximumChargingVoltage, _chargingData[index]->EvBatteryMaxVoltage);
@@ -773,7 +774,7 @@ void GetPersentOutputVol()
 	}
 }
 
-// 憸冽��笔漲
+// 風扇速度
 void GetFanSpeed()
 {
 	//PRINTF_FUNC("Get fan board speed \n");
@@ -792,7 +793,7 @@ void GetFanSpeed()
 	}
 }
 
-// 霈��� Relay ����
+// 讀取 Relay 狀態
 void GetRelayOutputStatus()
 {
 	if (Query_Relay_Output(Uart5Fd, Addr.Relay, &regRelay) == PASS)
@@ -801,7 +802,7 @@ void GetRelayOutputStatus()
 	}
 }
 
-// 蝣箄� K1 K2 relay �����
+// 確認 K1 K2 relay 的狀態
 void CheckK1K2RelayOutput(byte index)
 {
 	if (index == 0)
@@ -815,14 +816,14 @@ void CheckK1K2RelayOutput(byte index)
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			{
-				if (gunCount == 1)
-				{
-					if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
-						_chargingData[index]->RelayKPK2Status = YES;
-					else
-						_chargingData[index]->RelayKPK2Status = NO;
-				}
-				else
+//				if (gunCount == 1)
+//				{
+//					if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
+//						_chargingData[index]->RelayKPK2Status = YES;
+//					else
+//						_chargingData[index]->RelayKPK2Status = NO;
+//				}
+//				else
 				{
 					if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 						_chargingData[index]->RelayKPK2Status = YES;
@@ -840,7 +841,12 @@ void CheckK1K2RelayOutput(byte index)
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			{
-				if (regRelay.relay_event.bits.Gun2_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
+//				if (regRelay.relay_event.bits.Gun2_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
+//					_chargingData[index]->RelayKPK2Status = YES;
+//				else
+//					_chargingData[index]->RelayKPK2Status = NO;
+
+				if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 					_chargingData[index]->RelayKPK2Status = YES;
 				else
 					_chargingData[index]->RelayKPK2Status = NO;
@@ -856,7 +862,12 @@ void CheckK1K2RelayOutput(byte index)
 
 		if(_chargingData[index]->Type == _Type_CCS_2)
 		{
-			if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
+//			if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
+//				_chargingData[index]->RelayKPK2Status = YES;
+//			else
+//				_chargingData[index]->RelayKPK2Status = NO;
+
+			if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 				_chargingData[index]->RelayKPK2Status = YES;
 			else
 				_chargingData[index]->RelayKPK2Status = NO;
@@ -882,9 +893,9 @@ void CheckK1K2RelayOutput(byte index)
 
 void GetGfdAdc()
 {
-	// define : 瘥� 0.2 ~ 1 蝘雴�甈�
-	// occur : <= 75k 甇𣂼� @ 150 - 750 Vdc
-	// warning : >= 100 甇𣂼� && <= 500 甇𣂼� @ 150-750 Vdc
+	// define : 每 0.2 ~ 1 秒一次
+	// occur : <= 75k 歐姆 @ 150 - 750 Vdc
+	// warning : >= 100 歐姆 && <= 500 歐姆 @ 150-750 Vdc
 	if (Query_Gfd_Adc(Uart5Fd, Addr.Relay, &gfd_adc) == PASS)
 	{
 		for (int i = 0; i < gunCount; i++)
@@ -951,7 +962,7 @@ void GetGpioInput()
 
 		if (gpio_in.SPD == 1)
 		{
-			// SPD (�瑟�靽肽風) ON
+			// SPD (雷擊保護) ON
 			PRINTF_FUNC("RB SPD. \n");
 		}
 
@@ -1149,68 +1160,68 @@ void SetK1K2RelayStatus(byte index)
 	}
 	else if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 	{
-		if (_chargingData[index]->Evboard_id == 0x01)
-		{
-			if (_chargingData[index]->Type == _Type_CCS_2)
-			{
-				if (gunCount == 1)
-				{
-					if (regRelay.relay_event.bits.CCS_Precharge == NO)
-						outputRelay.relay_event.bits.CCS_Precharge = YES;
-					else if (regRelay.relay_event.bits.CCS_Precharge == YES)
-						outputRelay.relay_event.bits.Gun1_P = NO;
-				}
-			}
-		}
-		else if (_chargingData[index]->Evboard_id == 0x02)
-		{
-			if (_chargingData[index]->Type == _Type_CCS_2)
-			{
-				if (regRelay.relay_event.bits.CCS_Precharge == NO)
-					outputRelay.relay_event.bits.CCS_Precharge = YES;
-				else if (regRelay.relay_event.bits.CCS_Precharge == YES)
-					outputRelay.relay_event.bits.Gun2_P = NO;
-			}
-		}
+//		if (_chargingData[index]->Evboard_id == 0x01)
+//		{
+//			if (_chargingData[index]->Type == _Type_CCS_2)
+//			{
+//				if (gunCount == 1)
+//				{
+//					if (regRelay.relay_event.bits.CCS_Precharge == NO)
+//						outputRelay.relay_event.bits.CCS_Precharge = YES;
+//					else if (regRelay.relay_event.bits.CCS_Precharge == YES)
+//						outputRelay.relay_event.bits.Gun1_P = NO;
+//				}
+//			}
+//		}
+//		else if (_chargingData[index]->Evboard_id == 0x02)
+//		{
+//			if (_chargingData[index]->Type == _Type_CCS_2)
+//			{
+//				if (regRelay.relay_event.bits.CCS_Precharge == NO)
+//					outputRelay.relay_event.bits.CCS_Precharge = YES;
+//				else if (regRelay.relay_event.bits.CCS_Precharge == YES)
+//					outputRelay.relay_event.bits.Gun2_P = NO;
+//			}
+//		}
 	}
 	else if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST1)
 	{
-		if (_chargingData[index]->Evboard_id == 0x01)
-		{
-			if (_chargingData[index]->Type == _Type_CCS_2)
-			{
-				if (gunCount == 1)
-				{
-					if (regRelay.relay_event.bits.Gun1_P == NO)
-						outputRelay.relay_event.bits.Gun1_P = YES;
-					else if(regRelay.relay_event.bits.Gun1_P == YES)
-						outputRelay.relay_event.bits.CCS_Precharge = NO;
-				}
-			}
-		}
-		else if (_chargingData[index]->Evboard_id == 0x02)
-		{
-			if (_chargingData[index]->Type == _Type_CCS_2)
-			{
-				if (regRelay.relay_event.bits.Gun2_P == NO)
-					outputRelay.relay_event.bits.Gun2_P = YES;
-				else if(regRelay.relay_event.bits.Gun2_P == YES)
-					outputRelay.relay_event.bits.CCS_Precharge = NO;
-			}
-		}
+//		if (_chargingData[index]->Evboard_id == 0x01)
+//		{
+//			if (_chargingData[index]->Type == _Type_CCS_2)
+//			{
+//				if (gunCount == 1)
+//				{
+//					if (regRelay.relay_event.bits.Gun1_P == NO)
+//						outputRelay.relay_event.bits.Gun1_P = YES;
+//					else if(regRelay.relay_event.bits.Gun1_P == YES)
+//						outputRelay.relay_event.bits.CCS_Precharge = NO;
+//				}
+//			}
+//		}
+//		else if (_chargingData[index]->Evboard_id == 0x02)
+//		{
+//			if (_chargingData[index]->Type == _Type_CCS_2)
+//			{
+//				if (regRelay.relay_event.bits.Gun2_P == NO)
+//					outputRelay.relay_event.bits.Gun2_P = YES;
+//				else if(regRelay.relay_event.bits.Gun2_P == YES)
+//					outputRelay.relay_event.bits.CCS_Precharge = NO;
+//			}
+//		}
 	}
 }
 
 void SetParalleRelayStatus()
 {
-	// 銋见��蹱��格芋璈毺車嚗峕��仿����
+	// 之後雙槍單模機種,橋接都會上
 	if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 	{
 		if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
 				((_chargingData[0]->SystemStatus == S_IDLE || _chargingData[0]->SystemStatus == S_MAINTAIN) &&
 				(_chargingData[1]->SystemStatus == S_IDLE || _chargingData[1]->SystemStatus == S_MAINTAIN)))
 		{
-			// �嘥��𤦸 銝齿𨰹璈𧢲𦻖
+			// 初始化~ 不搭橋接
 			if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 				outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 			else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
@@ -1221,12 +1232,12 @@ void SetParalleRelayStatus()
 			if (_chargingData[0]->IsReadyToCharging == YES ||
 					_chargingData[1]->IsReadyToCharging == YES)
 			{
-				// ************������典��𥕢葉 - ��� relay ��𨰹�� relay ���璈罸�************
+				// ************需考慮在切換中 - 切開 relay 與搭回 relay 的時機點************
 				if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 				{
 					if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_M_TO_A)
 					{
-						// ��憭批� - �凋�璈𧢲𦻖
+						// 最大充 - 搭上橋接
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_P == NO)
@@ -1234,7 +1245,7 @@ void SetParalleRelayStatus()
 					}
 					else
 					{
-						// 撟喳��� - 銝齿𨰹
+						// 平均充 - 不搭
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
@@ -1245,7 +1256,7 @@ void SetParalleRelayStatus()
 				{
 					if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_A_TO_M)
 					{
-						// 撟喳��� - 銝齿𨰹
+						// 平均充 - 不搭
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
@@ -1253,7 +1264,7 @@ void SetParalleRelayStatus()
 					}
 					else
 					{
-						// ��憭批� - �凋�璈𧢲𦻖
+						// 最大充 - 搭上橋接
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_P == NO)
@@ -1365,8 +1376,8 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
 	{
 		if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf)
 		{
-			if ((chargingData_1->SystemStatus == S_BOOTING || chargingData_1->SystemStatus == S_IDLE || chargingData_1->SystemStatus == S_RESERVATION) &&
-					(chargingData_2->SystemStatus == S_BOOTING || chargingData_2->SystemStatus == S_IDLE || chargingData_2->SystemStatus == S_RESERVATION))
+			if ((chargingData_1->SystemStatus == S_BOOTING || chargingData_1->SystemStatus == S_IDLE || chargingData_1->SystemStatus == S_RESERVATION || chargingData_1->SystemStatus == S_MAINTAIN) &&
+					(chargingData_2->SystemStatus == S_BOOTING || chargingData_2->SystemStatus == S_IDLE || chargingData_2->SystemStatus == S_RESERVATION || chargingData_2->SystemStatus == S_MAINTAIN))
 			{
 				led_color.Connect_1_Green = _colorBuf;
 				led_color.Connect_1_Blue = COLOR_MIN_LV;
@@ -1390,7 +1401,10 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
 		}
 		else
 		{
-			if (chargingData_1->SystemStatus == S_BOOTING || chargingData_1->SystemStatus == S_IDLE || chargingData_1->SystemStatus == S_RESERVATION)
+			if (chargingData_1->SystemStatus == S_BOOTING ||
+					chargingData_1->SystemStatus == S_IDLE ||
+					chargingData_1->SystemStatus == S_RESERVATION ||
+					chargingData_1->SystemStatus == S_MAINTAIN)
 			{
 				led_color.Connect_1_Green = _colorBuf;
 				led_color.Connect_1_Blue = COLOR_MIN_LV;
@@ -1405,7 +1419,10 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
 			}
 
 			// --------------------------------------------------------------------------
-			if (chargingData_2->SystemStatus == S_BOOTING || chargingData_2->SystemStatus == S_IDLE || chargingData_2->SystemStatus == S_RESERVATION)
+			if (chargingData_2->SystemStatus == S_BOOTING ||
+					chargingData_2->SystemStatus == S_IDLE ||
+					chargingData_2->SystemStatus == S_RESERVATION ||
+					chargingData_2->SystemStatus == S_MAINTAIN)
 			{
 				led_color.Connect_2_Green = _colorBuf;
 				led_color.Connect_2_Blue = COLOR_MIN_LV;
@@ -1554,6 +1571,36 @@ int InitShareMemory()
 		result = FAIL;
 	}
 
+	if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmOCPP20Data NG \n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmOCPP20Data NG \n");
+		#endif
+		result = FAIL;
+	}
+
+	if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmPrimaryMcuData NG\n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef ShmPrimaryMcuData
+		DEBUG_ERROR("shmat ShmPrimaryMcuData NG\n");
+		#endif
+		result = FAIL;
+	}
+
 	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
    	{
    		#ifdef SystemLogMessage
@@ -1604,6 +1651,85 @@ int InitComPort()
 	return fd;
 }
 
+//===============================================
+// OCPP routine
+//===============================================
+void ocpp_startTransation_cmd(byte gunIndex)
+{
+	if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
+	{
+		if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
+			strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
+		else
+			strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)ac_chargingInfo[0]->StartUserId);
+
+		PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
+		ShmOCPP16Data->CpMsg.bits[gunIndex].StartTransactionReq = YES;
+	}
+	else if (ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
+	{
+		if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
+			strcpy((char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken, (char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken);
+		else
+			strcpy((char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken, (char *)ac_chargingInfo[0]->StartUserId);
+
+		PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken);
+		ShmOCPP20Data->CpMsg.bits[gunIndex].TransactionEventReq = YES;
+	}
+}
+
+void ocpp_stopTransation_cmd(byte gunIndex)
+{
+	if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
+	{
+		if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
+			strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
+		else
+			strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)ac_chargingInfo[0]->StartUserId);
+
+		PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
+		ShmOCPP16Data->CpMsg.bits[gunIndex].StopTransactionReq = YES;
+	}
+	else if (ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
+	{
+		if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
+			strcpy((char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken, (char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken);
+		else
+			strcpy((char *)ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken, (char *)ac_chargingInfo[0]->StartUserId);
+
+		PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP20Data->TransactionEvent[gunIndex].idToken.idToken);
+		ShmOCPP20Data->CpMsg.bits[gunIndex].TransactionEventReq = YES;
+	}
+}
+
+bool ocpp_remoteStopReq_cmd(byte gunIndex)
+{
+	bool result = false;
+
+	if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
+	{
+		result = ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq;
+
+		if (ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq == YES)
+		{
+			strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Remote");
+			ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq = NO;
+		}
+	}
+	else if (ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
+	{
+		result = ShmOCPP20Data->CsMsg.bits[gunIndex].RequestStopTransactionReq;
+
+		if (ShmOCPP20Data->CsMsg.bits[gunIndex].RequestStopTransactionReq == YES)
+		{
+			strcpy((char *)ShmOCPP20Data->TransactionEvent[gunIndex].transactionInfo.stoppedReason, "Remote");
+			ShmOCPP20Data->CsMsg.bits[gunIndex].RequestStopTransactionReq = NO;
+		}
+	}
+
+	return result;
+}
+
 //================================================
 // Main process
 //================================================
@@ -1817,7 +1943,7 @@ bool IsNoneMatchRelayStatus()
 
 void MatchRelayStatus()
 {
-	// �删� AC Contactor 瘝埝� Feedback嚗峕�隞交麱����蹱見�閧�
+	// 因為 AC Contactor 沒有 Feedback,所以暫時先這樣處理
 	//regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
 	ShmSysConfigAndInfo->SysInfo.AcContactorStatus  = regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
 	regRelay.relay_event.bits.CCS_Precharge = outputRelay.relay_event.bits.CCS_Precharge;
@@ -1834,7 +1960,7 @@ void CheckRelayStatusByADC()
 	if (ShmRelayModuleData->Gun1FuseOutputVolt > 0 && ShmRelayModuleData->Gun1RelayOutputVolt > 0 &&
 			(ShmRelayModuleData->Gun1FuseOutputVolt == ShmRelayModuleData->Gun1RelayOutputVolt))
 	{
-		// Relay �滚��餃�銝���
+		// Relay 前後電壓一致
 		_chargingData[0]->RelayK1K2Status = 0x01;
 	}
 	else
@@ -1843,7 +1969,7 @@ void CheckRelayStatusByADC()
 	if (ShmRelayModuleData->Gun2FuseOutputVolt > 0 && ShmRelayModuleData->Gun2RelayOutputVolt > 0 &&
 				(ShmRelayModuleData->Gun2FuseOutputVolt == ShmRelayModuleData->Gun2RelayOutputVolt))
 	{
-		// Relay �滚��餃�銝���
+		// Relay 前後電壓一致
 		_chargingData[1]->RelayK1K2Status = 0x01;
 	}
 	else
@@ -1867,12 +1993,12 @@ void SetGfdConfig(byte index, byte resister)
 void CableCheckDetected(byte index)
 {
 	// Cable Check
-	// �嗥�蝺帋���𤓖憯� = 頠羓垢閬����𤓖憯㯄𤓖瘚�
+	// 當火線上的電壓 = 車端要求的電壓電流
 	// _chargingData[targetGun]->EvBatterytargetVoltage
-	// �滚虾隞仿�憪见�皜� 1s
-	// Warning : Rgfd <= 150 甇�/V ��身�餃��� 500V �㻬 Rgfd <= 75000 甇�
-	// Pre-Warning : 150 甇�/V < Rgfd <= 500 甇�/V ��身�餃��� 500V �� 75000 甇� < Rgfd <= 250000
-	// SO Normal : Rgfd > 500 甇�/V ��身�餃��� 500 V �� Rgfd > 250000 甇�
+	// 才可以開始偵測 1s
+	// Warning : Rgfd <= 150 歐/V 假設電壓為 500V 則~ Rgfd <= 75000 歐
+	// Pre-Warning : 150 歐/V < Rgfd <= 500 歐/V 假設電壓為 500V 則 75000 歐 < Rgfd <= 250000
+	// SO Normal : Rgfd > 500 歐/V 假設電壓為 500 V 則 Rgfd > 250000 歐
 	if ((_chargingData[index]->Type >= _Type_Chademo && _chargingData[index]->Type <= _Type_GB) ||
 			(_chargingData[index]->Type == 0x09 && ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag))
 	{
@@ -1936,11 +2062,23 @@ void CheckOutputPowerOverCarReq(byte index)
 							_chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10), carV);
 
 					if (_chargingData[index]->Type == _Type_Chademo)
-						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = YES;
+					{
+						ShmDcCommonData->ConnectErrList[index].GunBits.ChaConnectOVP = YES;
+						if (strncmp((char *)_chargingData[index]->ConnectorAlarmCode, "", 6) == EQUAL)
+							memcpy(_chargingData[index]->ConnectorAlarmCode, "012217", 6);
+					}
 					else if (_chargingData[index]->Type == _Type_CCS_2)
-						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = YES;
+					{
+						ShmDcCommonData->ConnectErrList[index].GunBits.CCSConnectOVP = YES;
+						if (strncmp((char *)_chargingData[index]->ConnectorAlarmCode, "", 6) == EQUAL)
+							memcpy(_chargingData[index]->ConnectorAlarmCode, "012219", 6);
+					}
 					else if (_chargingData[index]->Type == _Type_GB)
-						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP = YES;
+					{
+						ShmDcCommonData->ConnectErrList[index].GunBits.GBTConnectOVP = YES;
+						if (strncmp((char *)_chargingData[index]->ConnectorAlarmCode, "", 6) == EQUAL)
+							memcpy(_chargingData[index]->ConnectorAlarmCode, "012221", 6);
+					}
 
 					_chargingData[index]->StopChargeFlag = YES;
 				}
@@ -1951,45 +2089,45 @@ void CheckOutputPowerOverCarReq(byte index)
 	}
 }
 
-void CheckOutputVolNoneMatchFire(byte index)
-{
-	if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
-			(_chargingData[index]->Type == _Type_Chademo ||
-					_chargingData[index]->Type == _Type_CCS_2 ||
-					_chargingData[index]->Type == _Type_GB))
-	{
-		if (((_chargingData[index]->PresentChargingVoltage * 10) < _chargingData[index]->FireChargingVoltage - 300) ||
-				((_chargingData[index]->PresentChargingVoltage * 10) > _chargingData[index]->FireChargingVoltage + 300))
-		{
-			if (!_isOutputNoneMatch[index])
-			{
-				_isOutputNoneMatch[index] = YES;
-				gettimeofday(&_checkOutputNoneMatchTimer[index], NULL);
-			}
-			else
-			{
-				if ((GetTimeoutValue(_checkOutputNoneMatchTimer[index]) / 1000) >= 5000)
-				{
-					PRINTF_FUNC("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d) : pre = %f, fire = %f \n",
-							index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
-					DEBUG_ERROR("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d): pre = %f, fire = %f \n",
-							index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
-
-					if (_chargingData[index]->Type == _Type_Chademo)
-						ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault = YES;
-					else if (_chargingData[index]->Type == _Type_GB)
-						ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayDrivingFault = YES;
-					else if (_chargingData[index]->Type == _Type_CCS_2)
-						ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault = YES;
-
-					_chargingData[index]->StopChargeFlag = YES;
-				}
-			}
-		}
-		else
-			_isOutputNoneMatch[index] = NO;
-	}
-}
+//void CheckOutputVolNoneMatchFire(byte index)
+//{
+//	if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
+//			(_chargingData[index]->Type == _Type_Chademo ||
+//					_chargingData[index]->Type == _Type_CCS_2 ||
+//					_chargingData[index]->Type == _Type_GB))
+//	{
+//		if (((_chargingData[index]->PresentChargingVoltage * 10) < _chargingData[index]->FireChargingVoltage - 300) ||
+//				((_chargingData[index]->PresentChargingVoltage * 10) > _chargingData[index]->FireChargingVoltage + 300))
+//		{
+//			if (!_isOutputNoneMatch[index])
+//			{
+//				_isOutputNoneMatch[index] = YES;
+//				gettimeofday(&_checkOutputNoneMatchTimer[index], NULL);
+//			}
+//			else
+//			{
+//				if ((GetTimeoutValue(_checkOutputNoneMatchTimer[index]) / 1000) >= 5000)
+//				{
+//					PRINTF_FUNC("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d) : pre = %f, fire = %f \n",
+//							index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
+//					DEBUG_ERROR("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d): pre = %f, fire = %f \n",
+//							index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
+//
+//					if (_chargingData[index]->Type == _Type_Chademo)
+//						ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault = YES;
+//					else if (_chargingData[index]->Type == _Type_GB)
+//						ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayDrivingFault = YES;
+//					else if (_chargingData[index]->Type == _Type_CCS_2)
+//						ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault = YES;
+//
+//					_chargingData[index]->StopChargeFlag = YES;
+//				}
+//			}
+//		}
+//		else
+//			_isOutputNoneMatch[index] = NO;
+//	}
+//}
 
 void CheckRelayWeldingStatus(byte index)
 {
@@ -2058,18 +2196,18 @@ void GetPsuTempForFanSpeed()
 
 void GetFanSpeedByFunction()
 {
-	// 憸冽綉靽格㺿 :
+	// 風控修改 :
 	// ******************************************************* //
 	//
-	//       �嗅�PSU頛詨枂蝮� KW       PSU Temp
+	//       當前PSU輸出總 KW       PSU Temp
 	// 50 x -------------------- x ---------- + 0.5 x (PSU Temp - 70)
-	//       �嗅�璅��憭批��� KW         50
+	//       當前樁最大功率 KW         50
 	//
 	// ******************************************************* //
 
-	// �嗅�璅��憭批��� KW : ShmPsuData->SystemAvailablePower
+	// 當前樁最大功率 KW : ShmPsuData->SystemAvailablePower
 	unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
-	// �嗅�PSU頛詨枂蝮� KW & PSU Temp :
+	// 當前PSU輸出總 KW & PSU Temp :
 	unsigned char temp = 0;
 	float power = 0;
 
@@ -2097,7 +2235,7 @@ void GetFanSpeedByFunction()
 	if (temp > 70)
 		_temp_diff = temp - 70;
 
-	// debug mode �湔𦻖�啣枂鞈��敺屸𣪧��
+	// debug mode 直接印出資訊後離開
 	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
 	{
 //		printf("Fan Speed Information: power = %f, _maxPower = %d, temp = %d -- _pw_rate = %f, _temp_rate = %f, _temp_diff = %d \n",
@@ -2224,37 +2362,17 @@ void ChangeStartOrStopDateTime(byte isStart)
 
 void OcppStartTransation(byte gunIndex)
 {
-	if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
-		strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
-	else
-		strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)ac_chargingInfo[0]->StartUserId);
-
-	PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
-	ShmOCPP16Data->CpMsg.bits[gunIndex].StartTransactionReq = YES;
+	ocpp_startTransation_cmd(gunIndex);
 }
 
 void OcppStopTransation(byte gunIndex)
 {
-	if(strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == EQUAL)
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
-	else
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)ac_chargingInfo[0]->StartUserId);
-
-	PRINTF_FUNC("AC IdTag = %s \n", ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
-	ShmOCPP16Data->CpMsg.bits[gunIndex].StopTransactionReq = YES;
+	ocpp_stopTransation_cmd(gunIndex);
 }
 
 bool OcppRemoteStop(byte gunIndex)
 {
-	bool result = ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq;
-
-	if (ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq == YES)
-	{
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Remote");
-		ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq = NO;
-	}
-
-	return result;
+	return ocpp_remoteStopReq_cmd(gunIndex);
 }
 
 unsigned char isModeChange()
@@ -2356,7 +2474,7 @@ void AcChargeTypeProcess()
 				ac_chargingInfo[0]->SystemStatus = _status;
 			}
 
-			// 閮剖��𣂼���憭批��駁𤓖瘚� >= 6 ~ <= 32
+			// 設定限制最大充電電流 >= 6 ~ <= 32
 			switch(ac_chargingInfo[0]->SystemStatus)
 			{
 				case S_IDLE:
@@ -2428,7 +2546,7 @@ void AcChargeTypeProcess()
 					ac_chargingInfo[0]->PresentChargingVoltage = AC_DEFAULT_VOL;
 					ac_chargingInfo[0]->PresentChargingCurrent = ((float)acChargingCurrent.OuputCurrentL1 / 10);
 
-					// �其誑�斗𪃾�臬炏�匧銁頛詨枂
+					// 用以判斷是否有在輸出
 					ac_chargingInfo[0]->IsCharging = acStatus.RelayStatus;
 
 					SetCpDuty(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent);
@@ -2456,7 +2574,7 @@ void AcChargeTypeProcess()
 						ftime(&_ac_endChargingTime);
 						if (strcmp((char *)ac_chargingInfo[0]->StartDateTime, "") != EQUAL)
 						{
-							// AC �箏��箇洵2�𦠜�
+							// AC 固定為第2把槍
 							OcppStopTransation(1);
 						}
 
@@ -2470,25 +2588,6 @@ void AcChargeTypeProcess()
 	}
 }
 
-void ResetDetAlarmStatus(byte gun)
-{
-	if (_chargingData[gun]->Type == _Type_Chademo)
-	{
-		if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP == YES)
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = NO;
-	}
-	else if (_chargingData[gun]->Type == _Type_GB)
-	{
-		if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP == YES)
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP = NO;
-	}
-	else if (_chargingData[gun]->Type == _Type_CCS_2)
-	{
-		if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP == YES)
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = NO;
-	}
-}
-
 int main(void)
 {
 	if(InitShareMemory() == FAIL)
@@ -2539,7 +2638,7 @@ int main(void)
 	for(;;)
 	{
 		bool isCharging = false;
-		// 蝔见��见�銋见�~ 敹����Ⅱ摰� FW ��𧋦��′擃𠉛��穿�蝣箄�敺�!!~ 閰脫芋蝯��蝞埈糓��迤�� Initial Comp.
+		// 程序開始之前~ 必須先確定 FW 版本與硬體版本,確認後!!~ 該模組才算是真正的 Initial Comp.
 		if (ShmRelayModuleData->SelfTest_Comp == NO)
 		{
 			GetFwAndHwVersion_Relay();
@@ -2557,10 +2656,10 @@ int main(void)
 			gettimeofday(&_priority_time, NULL);
 		}
 
-		// �芣炎�擧挾�閧�嚗諹䌊瑼a�畾萄��𡏭�銝滚������誨銵刻府蝟餌絞瘝埝��𤤿���
+		// 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
 		if (ShmLedModuleData->SelfTest_Comp == NO)
 		{
-			// �芣炎�擧挾
+			// 自檢階段
 			if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq <= _STEST_PSU_CAP)
 			{
 				GetFwAndHwVersion_Led();
@@ -2569,7 +2668,7 @@ int main(void)
 			}
 			else
 			{
-				// �芣炎�擧挾瘝埝��誩����
+				// 自檢階段沒有問到版號
 				if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail == NO)
 					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
 			}
@@ -2579,14 +2678,14 @@ int main(void)
 
 		if (ShmRelayModuleData->SelfTest_Comp == YES)
 		{
-			// ==============�芸�甈𦠜�擃� 10 ms ==============
-			// 頛詨枂�餃�
+			// ==============優先權最高 10 ms ==============
+			// 輸出電壓
 			GetPersentOutputVol();
 
-			// 銝厩㮾頛詨��餃�
+			// 三相輸入電壓
 			GetPresentInputVol();
 
-			// 霈��𣇉訜�� AC relay ����
+			// 讀取當前 AC relay 狀態
 			regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 			GetRelayOutputStatus();
 
@@ -2595,17 +2694,18 @@ int main(void)
 				// Cable check (Set)
 				CableCheckDetected(i);
 
-				// check k1 k2 relay ����
+				// check k1 k2 relay 狀態
 				CheckK1K2RelayOutput(i);
 
-				// 靘脲��嗅��������钅��� �凋�/�暸� Relay
+				// 依據當前各槍的狀態選擇 搭上/放開 Relay
 				SetK1K2RelayStatus(i);
 
-				if (_chargingData[i]->SystemStatus == S_IDLE)
+				if (_chargingData[i]->SystemStatus == S_IDLE ||
+						_chargingData[i]->SystemStatus == S_RESERVATION ||
+						_chargingData[i]->SystemStatus == S_MAINTAIN)
 				{
 					//_chargingData[i]->RelayWeldingCheck = NO;
 					_isOvpChkTimeFlag[i] = NO;
-					ResetDetAlarmStatus(i);
 				}
 
 				if (_chargingData[i]->SystemStatus == S_BOOTING	||
@@ -2631,17 +2731,16 @@ int main(void)
 			// Cable check (Get)
 			GetGfdAdc();
 
-			// 璈𧢲𦻖 relay
+			// 橋接 relay
 			SetParalleRelayStatus();
 
-			// �凋� AC Contactor
+			// 搭上 AC Contactor
 //			if (isCharging)
 //				outputRelay.relay_event.bits.AC_Contactor = YES;
 //			else
 //				outputRelay.relay_event.bits.AC_Contactor = NO;
 
-			if (isCharging ||
-				(ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE))
+			if (isCharging || (ShmPsuData->Work_Step == _TEST_MODE))
 			{
 				isStopChargingCount = false;
 				outputRelay.relay_event.bits.AC_Contactor = YES;
@@ -2660,10 +2759,15 @@ int main(void)
 				}
 			}
 
+			if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == ABNORMAL)
+				outputRelay.relay_event.bits.AC_Contactor = NO;
+
+			ShmDcCommonData->acContactSwitch = outputRelay.relay_event.bits.AC_Contactor;
+
 			if (ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE)
 				outputRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_P = YES;
 
-			// �凋�/擛�� Relay
+			// 搭上/鬆開 Relay
 			if(IsNoneMatchRelayStatus())
 			{
 				relayMatchFlag = NO;

+ 4 - 2
EVSE/Projects/DS60-120/Apps/Module_LcmContro.h

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>
@@ -41,6 +39,7 @@ typedef unsigned char 			byte;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct FanModuleData			*ShmFanModuleData;
+struct DcCommonInformation		*ShmDcCommonData;
 
 #define NO_DEFINE			255
 #define DEFAULT_AC_INDEX	2
@@ -88,6 +87,7 @@ byte _gunIndex = 0;
 bool _battery_display_ani = false;
 byte _curPage_index = 0;
 bool _page_reload = false;
+byte QRCodeBuf[128];
 
 // LCM - HW
 byte _everyPageRollChange = 0;
@@ -101,6 +101,8 @@ short __sel_gun_btn = 0x0040;
 short __ret_home_btn = 0x0042;
 short __stop_method_btn = 0x0044;
 
+short __lcm_version = 0x004A;
+
 short __qr_code = 0x0250;
 short __main_rfid = 0x0052;
 short __main_qr = 0x0054;

+ 147 - 65
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -74,7 +74,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 
 //==========================================
@@ -99,12 +99,10 @@ int InitShareMemory()
     	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
 		#endif
     	result = FAIL;
-   	 }
-    else
-    {}
+   	}
 
-   	 //creat ShmStatusCodeData
-   	 if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+   	//creat ShmStatusCodeData
+   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
     {
 		#ifdef SystemLogMessage
    		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
@@ -118,8 +116,21 @@ int InitShareMemory()
 		#endif
     	result = FAIL;
    	}
-    else
-    {}
+
+ 	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
+    {
+    	#ifdef SystemLogMessage
+    	DEBUG_ERROR("shmget ShmCommonKey NG \n");
+    	#endif
+    	return 0;
+    }
+    else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	#ifdef SystemLogMessage
+    	DEBUG_ERROR("shmat ShmCommonKey NG \n");
+    	#endif
+    	return 0;
+    }
 
     return result;
 }
@@ -180,6 +191,24 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 //	0  : High byte
 //	1  : Low byte
 
+//	printf("-------------------------------------------- \n");
+//	printf("msg = %x \n", *msg);			// A5
+//	printf("msg = %x \n", *(msg + 1));		// 5A
+//	printf("msg = %x \n", *(msg + 2));		// Len : [3] ~ [6] + Data Len
+//	printf("msg = %x \n", *(msg + 3));		// cmd : 0x83
+//	printf("msg = %x \n", *(msg + 4));		// addr : H
+//	printf("msg = %x \n", *(msg + 5));		// addr : L
+//	printf("msg = %x \n", *(msg + 6));		// Data Len
+//
+//	printf("msg = %x \n", *(msg + 7));
+//	printf("msg = %x \n", *(msg + 8));
+//	printf("msg = %x \n", *(msg + 9));
+//	printf("msg = %x \n", *(msg + 10));
+//	printf("msg = %x \n", *(msg + 11));
+//	printf("msg = %x \n", *(msg + 12));
+//	printf("msg = %x \n", *(msg + 13));
+//	printf("msg = %x \n", *(msg + 14));
+
 	if(*msg == CMD_TITLE_1 && *(msg + 1) == CMD_TITLE_2)
 	{
 		if(*(msg + 3) == CMD_WRITE)
@@ -199,6 +228,15 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 		}
 		else if (*(msg + 3) == CMD_MULTI_READ)
 		{
+			if ((*(msg + 4) >> 8) + *(msg + 5) == __lcm_version)
+			{
+				ShmDcCommonData->LcmFwVersion = atoi((char *)(msg + 7));
+				//printf("msg = %d \n", atoi((char *)(msg + 7)));
+//				printf("msg = %x \n", *(msg + 7));
+//				printf("msg = %x \n", *(msg + 8));
+//				printf("msg = %x \n", *(msg + 9));
+			}
+
 //			switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
 //			{
 //				case BUTTON_GUN_INDEX:
@@ -236,6 +274,7 @@ void ChangeBackLight(bool islight)
 {
 	byte value = 0x01;
 
+	// 0x00 ~ 0x40
 	if (islight)
 	{
 		value = 0x20;
@@ -302,24 +341,24 @@ void ChangeDisplay2Value(short address, short value)
 	DisplayValueToLcm(address, data, sizeof(data));
 }
 
-void GetBtnStatus(short address, byte len)
+void GetDeviceInfoStatus(short address, byte len)
 {
 	byte cmd[8];
 	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[8];
+	byte msg[40];
 	memset(msg, 0x00, sizeof(msg));
 
 	cmd[0] = CMD_TITLE_1;
 	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x03 + len;
+	cmd[2] = 0x04;
 	cmd[3] = CMD_MULTI_READ;
-	cmd[4] = address >> 8;
-	cmd[5] = address & 0x00FF;
-	cmd[6] = 0x00 + len;
+	cmd[4] = (address >> 8) & 0xff;
+	cmd[5] = (address >> 0) & 0xff;
+	cmd[6] = len;
 
-	WriteCmdToLcm(cmd, cmd[2] + 3);
-	usleep(100000);
-	ReadMsgFromLcm(msg, (len * 2) + sizeof(msg));
+	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
+	//usleep(100000);
+	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
 }
 
 //================================================
@@ -810,7 +849,7 @@ void RefreshConnStatus()
 			ChangeDisplay2Value(__3G4G_status, _disappear);
 			// 3G/4G
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
+			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_connect); }
 			else
 			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
 		}
@@ -819,7 +858,7 @@ void RefreshConnStatus()
 			ChangeDisplay2Value(__3G4G_move_status, _disappear);
 			// 3G/4G
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
+			{ ChangeDisplay2Value(__3G4G_status, _3G4G_connect); }
 			else
 			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
 		}
@@ -874,6 +913,29 @@ bool IsPageReloadChk()
 	return result;
 }
 
+bool IsConfigReloadChk()
+{
+	bool result = false;
+
+	if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
+	{
+		if (strcmp((char *)QRCodeBuf, (char *)ShmSysConfigAndInfo->SysConfig.SystemId) != EQUAL)
+			result = true;
+	}
+	else
+	{
+		if (strcmp((char *)QRCodeBuf, (char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent) != EQUAL)
+			result = true;
+	}
+
+	return result;
+}
+
+void SaveQrcodeToBuf(byte *qrcode)
+{
+	strncpy((char *)QRCodeBuf, (char *)qrcode, sizeof(QRCodeBuf));
+}
+
 void ClearDisplayInfo()
 {
 	ChangeDisplay2Value(__csu_ver_string, _disappear);
@@ -969,15 +1031,15 @@ void Show4GRssi(bool isShow, int dbValue)
 
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
+		DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
+		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
 	}
 	else
 	{
-		ChangeDisplay2Value(__eth0_ip_string, _disappear);
-		ChangeDisplay2Value(__eth0_ip_value, _disappear);
+		ChangeDisplay2Value(__dc2_ver_string, _disappear);
+		ChangeDisplay2Value(__dc2_ver_value, _disappear);
 	}
 }
 
@@ -1009,15 +1071,15 @@ void ShowWifiRssi(bool isShow, int dbValue)
 
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__sn_string, value, sizeof(value));
+		DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__sn_value, value, sizeof(value));
+		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
 	}
 	else
 	{
-		ChangeDisplay2Value(__sn_string, _disappear);
-		ChangeDisplay2Value(__sn_value, _disappear);
+		ChangeDisplay2Value(__fan_speed_string, _disappear);
+		ChangeDisplay2Value(__fan_speed_value, _disappear);
 	}
 }
 
@@ -1092,16 +1154,16 @@ void Show4GIP(bool isShow, unsigned char *ip)
 		byte value[20];
 
 		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "3/4G IP >");
-		DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
+		strcpy((char *) value, "3/4G IP ");
+		DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
+		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
 	}
 	else
 	{
-		ChangeDisplay2Value(__dc2_ver_string, _disappear);
-		ChangeDisplay2Value(__dc2_ver_value, _disappear);
+		ChangeDisplay2Value(__eth0_ip_string, _disappear);
+		ChangeDisplay2Value(__eth0_ip_value, _disappear);
 	}
 }
 
@@ -1132,16 +1194,16 @@ void ShowWifiIP(bool isShow, unsigned char *ip)
 		byte value[20];
 
 		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Wifi IP >");
-		DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
+		strcpy((char *) value, "Wifi IP ");
+		DisplayValueToLcm(__sn_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
+		DisplayValueToLcm(__sn_value, value, sizeof(value));
 	}
 	else
 	{
-		ChangeDisplay2Value(__fan_speed_string, _disappear);
-		ChangeDisplay2Value(__fan_speed_value, _disappear);
+		ChangeDisplay2Value(__sn_string, _disappear);
+		ChangeDisplay2Value(__sn_value, _disappear);
 	}
 }
 
@@ -1168,12 +1230,12 @@ void InformationShow()
 		else if (_showInformIndex == 1)
 		{
 			ShowWifiMode(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
-			ShowWifiIP(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiIpAddress);
 			ShowWifiRssi(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi);
+			ShowWifiIP(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiIpAddress);
 
 			Show4GMode(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled);
-			Show4GIP(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress);
 			Show4GRssi(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
+			Show4GIP(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress);
 		}
 	}
 	else
@@ -1194,15 +1256,18 @@ void ProcessPageInfo()
 {
 	_page_reload = IsPageReloadChk();
 
+	if (!_page_reload)
+		_page_reload = IsConfigReloadChk();
+
 	// 隨插即充 - 可省略該按鈕
-	if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
-	{
-		ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-		if (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-			ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-		else
-			ChangeDisplay2Value(__sel_gun_btn, _disappear);
-	}
+//	if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
+//	{
+//		ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
+//		if (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
+//			ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
+//		else
+//			ChangeDisplay2Value(__sel_gun_btn, _disappear);
+//	}
 	switch(_currentPage)
 	{
 		case _LCM_IDLE:
@@ -1234,11 +1299,13 @@ void ProcessPageInfo()
 					if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
 					{
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
+						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.SystemId);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
 					}
 					else
 					{
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
+						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.QRCodeContent);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, len);
 					}
 				}
@@ -1253,6 +1320,7 @@ void ProcessPageInfo()
 				isCharging = true;
 				break;
 			}
+
 			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 			{
 				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
@@ -1273,31 +1341,30 @@ void ProcessPageInfo()
 		case _LCM_WAIT_FOR_PLUG:
 		{
 			FirstPageChanged();
+			bool isCharging = false;
+			for(byte i = 0; i < _totalCount; i++)
+			{
+				if (_chargingInfoData[i]->SystemStatus == S_IDLE)
+					continue;
+
+				isCharging = true;
+				break;
+			}
+
 			if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
 			{
 				// 新增隨插即充功能預設在等待插槍頁面在開啟
 				ChangeDisplay2Value(__ret_home_btn, _disappear);
-				bool isCharging = false;
-				for(byte i = 0; i < _totalCount; i++)
-				{
-					if (_chargingInfoData[i]->SystemStatus == S_IDLE)
-						continue;
-
-					isCharging = true;
-					break;
-				}
+			}
 
-				if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-				{
-					ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-				}
-				else
-				{
-					ChangeDisplay2Value(__sel_gun_btn, _disappear);
-				}
+			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
+			{
+				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 			}
 			else
+			{
 				ChangeDisplay2Value(__sel_gun_btn, _disappear);
+			}
 		}
 			break;
 		case _LCM_PRE_CHARGE:
@@ -1306,6 +1373,7 @@ void ProcessPageInfo()
 		{
 			bool isShowAc = false;
 			byte gunTargetIndex = 0;
+			bool idleGun = false;
 
 			if (acgunCount > 0)
 			{
@@ -1554,6 +1622,18 @@ void ProcessPageInfo()
 						}
 					}
 				}
+
+				if (_chargingInfoData[i]->SystemStatus == S_IDLE)
+					idleGun = true;
+			}
+
+			if (idleGun && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
+			{
+				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
+			}
+			else
+			{
+				ChangeDisplay2Value(__sel_gun_btn, _disappear);
 			}
 
 			// gun btn and QR code
@@ -1705,7 +1785,7 @@ int main(void)
 	acgunCount = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
 	Initialization();
 
-	//ChangeToOtherPage(_LCM_AUTHORIZING);
+	//ChangeToOtherPage(_LCM_EMC);
 	//return -1;
 
 	DefaultIconStatus();
@@ -1714,8 +1794,10 @@ int main(void)
 	{
 		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName) != 0x00)
 		{
+			GetDeviceInfoStatus(__lcm_version, 3);
 			GetCurrentPage();
 			sleep(1);
+			PRINTF_FUNC("LCM Version = V.%03d \n", ShmDcCommonData->LcmFwVersion);
 		}
 		else
 		{

+ 45 - 10
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>
@@ -36,6 +34,7 @@
 #define FAIL				-1
 #define YES					1
 #define NO					0
+#define EQUAL				0
 
 typedef unsigned char 		byte;
 
@@ -43,6 +42,7 @@ struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct PrimaryMcuData			*ShmPrimaryMcuData;
 struct MeterInformation			*ShmCsuMeterData;
+struct DcCommonInformation		*ShmDcCommonData;
 
 void trim(char *s);
 int mystrcmp(char *p1,char *p2);
@@ -126,7 +126,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 //=================================
 // Common routine
@@ -256,16 +256,31 @@ int InitShareMemory()
    		#ifdef SystemLogMessage
    		DEBUG_ERROR("shmget ShmCsuMeterKey NG \n");
    		#endif
-   		return 0;
+   		result = FAIL;
    	}
    	else if ((ShmCsuMeterData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
    	{
    		#ifdef SystemLogMessage
    		DEBUG_ERROR("shmat ShmCsuMeterData NG \n");
    		#endif
-   		return 0;
+   		result = FAIL;
    	}
 
+	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmCommonKey NG \n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmCommonKey NG \n");
+		#endif
+		result = FAIL;
+	}
+
     return result;
 }
 
@@ -289,15 +304,28 @@ void GetFwAndHwVersion()
 
 void GetInputGpioStatus()
 {
-	//PRINTF_FUNC("GetInputGpioStatus \n");
 	if (Query_Gpio_Input(Uart1Fd, Addr.IoExtend, &gpio_in) == PASS)
 	{
-		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector)
+		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector ||
+				_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != ShmDcCommonData->psuKeepCommunication)
 		{
 			if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3)
 			{
-				_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = gpio_in.AC_Connector;
-				ShmSysConfigAndInfo->SysInfo.AcContactorStatus = ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = gpio_in.AC_Connector;
+				if (ShmDcCommonData->psuKeepCommunication == YES ||
+						gpio_in.AC_Connector == YES)
+				{
+					ShmSysConfigAndInfo->SysInfo.AcContactorStatus =
+						ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = YES;
+
+					_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = YES;
+				}
+				else
+				{
+					ShmSysConfigAndInfo->SysInfo.AcContactorStatus =
+						ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = NO;
+
+					_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = NO;
+				}
 			}
 			else
 				_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT]++;
@@ -305,7 +333,14 @@ void GetInputGpioStatus()
 		else
 			_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] = 0;
 
+		if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3 &&
+				ShmDcCommonData->psuKeepCommunication == YES &&
+				gpio_in.AC_Connector == NO)
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = YES;
+		else
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = NO;
 
+		// -------------------------------------------------------------------
 		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] != gpio_in.AC_MainBreaker)
 		{
 			if (_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] >= 3)
@@ -587,7 +622,7 @@ int main(void)
 
 	for(;;)
 	{
-		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, " ") == 0x00)
+		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, " ") == EQUAL)
 		{
 			if ((GetTimeoutValue(_flash_time) / 1000) > 1000)
 			{

+ 90 - 33
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -28,6 +28,7 @@
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct PsuData 					*ShmPsuData;
+struct DcCommonInformation		*ShmDcCommonData;
 
 bool libInitialize = false;
 byte getAvailableCapOffset = 5;
@@ -99,7 +100,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 //=================================
 // Common routine
@@ -187,7 +188,7 @@ unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit)
 
 void AbnormalStopAnalysis(byte gun_index, int errCode)
 {
-	for (char i = 0; i < 3; i++)
+	for (char i = 0; i < 4; i++)
 	{
 		unsigned char byteIndex = (errCode >> (8 * i)) & 0xff;
 
@@ -199,44 +200,74 @@ void AbnormalStopAnalysis(byte gun_index, int errCode)
 				{
 					case 0:
 					{
-						if (bitIndex == 0)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
-						else if (bitIndex == 5)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
-					}
-						break;
-				case 1:
-					{
-						if (bitIndex == 1)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm = YES;
-						else if (bitIndex == 2)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuProtectionAlarm = YES;
+						if (bitIndex == 2)
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
 						else if (bitIndex == 3)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
-						else if (bitIndex == 4)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
-						else if (bitIndex == 5)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
+						else if (bitIndex == 6)
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
+						else if (bitIndex == 7)
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
 					}
-					break;
-				case 2:
+						break;
+					case 1:
 					{
 						if (bitIndex == 0)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
 						else if (bitIndex == 1)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
 						else if (bitIndex == 2)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseOnputImbalance = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
 						else if (bitIndex == 3)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseInputInadequate = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
 						else if (bitIndex == 4)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseInputInadequate = YES;
-						else if (bitIndex == 5)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputUVP = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
 						else if (bitIndex == 6)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputUVP = NO;
 					}
-					break;
+						break;
+					case 2:
+						{
+							if (bitIndex == 0)
+								ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCommunicationFail = YES;
+							else if (bitIndex == 1)
+								ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
+							else if (bitIndex == 3)
+							{
+							    // PFC power off
+							    //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFfcSideShutDown = YES;
+							}
+							else if (bitIndex == 5)
+							    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
+							else if (bitIndex == 6)
+							{
+							    // DCDC power off
+							    //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
+							}
+							else if (bitIndex == 7)
+							    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
+						}
+						break;
+					case 3:
+						{
+							if (bitIndex == 0)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
+						    else if (bitIndex == 1)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
+						    else if (bitIndex == 2)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
+						    else if (bitIndex == 3)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
+						    else if (bitIndex == 4)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
+						    else if (bitIndex == 5)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
+						    else if (bitIndex == 6)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
+						    else if (bitIndex == 7)
+						        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDcdcOverVoltage = YES;
+					}
+						break;
 				}
 			}
 //			else
@@ -384,6 +415,9 @@ void GetModuleCountCallback(byte group, byte count)
 		ShmPsuData->SystemPresentPsuQuantity = count;
 	else
 	{
+		if (group >= ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
+			return;
+
 		ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity = count;
 	}
 }
@@ -494,7 +528,11 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 	ShmPsuData->PsuGroup[group].GroupAvailableCurrent = _groupCurrent;
 	ShmPsuData->PsuGroup[group].GroupAvailablePower = _groupPower;
 
-	chargingInfo[group]->MaximumChargingVoltage = maxVol;
+	if (chargingInfo[group]->MaximumChargingVoltage != maxVol)
+	{
+		PRINTF_FUNC("G_%d -> Max Vol = %.1f \n", group, maxVol / 10);
+		chargingInfo[group]->MaximumChargingVoltage = maxVol;
+	}
 
 	int _power = 0, _current = 0, _ratingcurrent = 0, _sysRealPower = 0;
 	bool isGetAllDeratingCurrent = true;
@@ -1079,6 +1117,8 @@ void GetOutputAndTempCallback(byte address, unsigned short outputVol_s,
 void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char status,
 		unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
 {
+	ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
+
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
@@ -1090,7 +1130,7 @@ void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char st
 	if (group1 == 1)
 		address -= ShmPsuData->PsuGroup[group1 - 1].GroupPresentPsuQuantity;
 
-	int alarm = (err2 << 24) | (err3 << 16) | (err4 << 8);
+	int alarm = (err2 << 24) | (err3 << 16) | (err4 << 8) | err1;
 
 	ShmPsuData->PsuGroup[group1].PsuModule[address].AlarmCode = alarm;
 	//AbnormalStopAnalysis(group1, alarm);
@@ -1176,7 +1216,22 @@ int InitShareMemory()
 		DEBUG_ERROR("shmat ShmPsuData NG \n");
 		#endif
 		result = FAIL;
-	 }
+	}
+
+	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+	   	DEBUG_ERROR("shmget ShmCommonKey NG \n");
+	   	#endif
+	   	result = FAIL;
+	}
+	else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+	   	DEBUG_ERROR("shmat ShmCommonKey NG \n");
+	   	#endif
+	   	result = FAIL;
+	}
 
     return result;
 }
@@ -1448,6 +1503,8 @@ int main(void)
 				InitialPsuData();
 				isInitialComp = YES;
 			}
+
+			ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
 			sleep(1);
 			continue;
 		}

+ 0 - 2
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/can.h>
@@ -23,7 +22,6 @@
 #include   <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include   <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include   <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>

+ 0 - 2
EVSE/Projects/DS60-120/Apps/PrimaryComm.c

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<ctype.h>

+ 39 - 13
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -284,6 +284,10 @@ void RunStatusProc(char *v1, char *v2)
 			printf ("SOC = %d \n", _chargingData[_index]->EvBatterySoc);
 			printf ("Maximum battery Voltage = %f \n", _chargingData[_index]->EvBatteryMaxVoltage);
 			printf("Charging mode = %d \n", ShmSysConfigAndInfo->SysInfo.MainChargingMode);
+			printf("maxTemp = %d, temp-I = %d, temp-II = %d \n",
+						_chargingData[_index]->ConnectorTemp - 60,
+						ShmDcCommonData->ConnectorTemp1[_index] - 60,
+						ShmDcCommonData->ConnectorTemp2[_index] - 60);
 		}
 		else
 		{
@@ -444,13 +448,12 @@ void GetFwVerProc(char *v1)
 	}
 }
 
-void CreateOneError(char *v1)
+void CreateOneError()
 {
-	int value = atoi(v1);
-
-	ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsConnectorOTP = value;
-	//ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = value;
-	//ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value;
+	for (byte i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
+	{
+		printf("(%d). %s \n", i, &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0]);
+	}
 }
 
 void GetAuthorizeFlag(char *v1)
@@ -524,6 +527,22 @@ void SetChargingInfoCCID(char *v1, char* v2)
 	_chargingData[_index]->EVCCID[8] = '\0';
 }
 
+void GetGunTemp(char *v1)
+{
+	int _index = atoi(v1);
+	if (!FindChargingInfoData(_index, &_chargingData[0]))
+	{
+		printf ("FindChargingInfoData error\n");
+		return;
+	}
+
+	printf("Gun_%d, maxTemp = %d, temp 1 = %d, temp 2 = %d \n",
+			_index,
+			_chargingData[_index]->ConnectorTemp - 60,
+			ShmDcCommonData->ConnectorTemp1[_index] - 60,
+			ShmDcCommonData->ConnectorTemp2[_index] - 60);
+}
+
 void GetPowerValue()
 {
 	for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
@@ -866,7 +885,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
         	    }
 
-        	    ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x01;
+        	    ShmDcCommonData->StartToChargingFlag[ShmSysConfigAndInfo->SysInfo.CurGunSelected] = 0x01;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARNING;
     		}
     		break;
@@ -1123,7 +1142,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     	else if (strcmp(newString[0], "c") == 0)
     	{
     		printf("stop \n\r");
-    		ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x00;
+    		ShmDcCommonData->StartToChargingFlag[ShmSysConfigAndInfo->SysInfo.CurGunSelected] = 0x00;
     		_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
     	}
 
@@ -1306,7 +1325,7 @@ int main(void)
 		}
 		else if(strcmp(newString[0], "error") == 0)
 		{
-			CreateOneError(newString[1]);
+			CreateOneError();
 		}
 		else if (strcmp(newString[0], "auth") == 0)
 		{
@@ -1326,6 +1345,15 @@ int main(void)
 			}
 			SetChargingInfoCCID(newString[1], newString[2]);
 		}
+		else if (strcmp(newString[0], "guntemp") == 0)
+		{
+			if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
+			{
+				printf ("Input guntemp fail.\n");
+				continue;
+			}
+			GetGunTemp(newString[1]);
+		}
 		else if (strcmp(newString[0], "soc") == 0)
 		{
 			GetSOC(newString[1]);
@@ -1337,10 +1365,8 @@ int main(void)
 				printf ("FindChargingInfoData error\n");
 				continue;
 			}
-			printf("FirmwareUpdate = %d \n", ShmSysConfigAndInfo->SysInfo.FirmwareUpdate);
-			printf("ShmSysConfigAndInfo->SysInfo.WaitForPlugit = %d \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit);
-			printf("ShmSysConfigAndInfo->SysConfig.UserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
-			printf("ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = %d \n", ShmSysConfigAndInfo->SysInfo.AuthorizeFlag);
+
+			_chargingData[1]->PowerConsumption += 4.2;
 		}
 		else if(strcmp(newString[0], "strchg") == 0)
 		{

+ 0 - 1
EVSE/Projects/DS60-120/Apps/internalComm.c

@@ -13,7 +13,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>

文件差异内容过多而无法显示
+ 322 - 262
EVSE/Projects/DS60-120/Apps/main.c


+ 2 - 0
EVSE/Projects/DS60-120/Apps/timeout.h

@@ -56,8 +56,10 @@ enum Timeout_flag
 struct timeval _cmdSubPriority_time;
 unsigned short _connectionTimeout;
 
+bool _isAllowChargingOnDisconnect;
 // for main
 struct timeval _cmdMainPriority_time;
 struct timeval _toAverage_time;
 unsigned char _ocppProfileChkFlag;
+bool stopChargingChkByCard;
 #endif /* TIMEOUT_H_ */

部分文件因为文件数量过多而无法显示