Эх сурвалжийг харах

2021-04-07 / Alston Lin

Actions
1. fix the problem that the default getway disappears when the Ethernet is deleted.
2. Support detecting connector temperature (OTP)
3. Modify OCPP structure and support OCPP2.0
4. Soft reset if the self-test failure
5. Add to check the AC contact status with psu communication function
6. Integrated the check function of gun's judgment
7. Add  to check the status of the ocpp task, if the task has been stopped then run again
8. Update the file system from jffs2 to ubifs
9. Lcm support to get the fw version

Files
1. As follow commit history.
Alston 4 жил өмнө
parent
commit
380554f119

+ 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_ */

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно