Browse Source

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 years ago
parent
commit
380554f119

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

@@ -103,6 +103,7 @@ enum _LCM_INDEX
 	_LCM_CHARGING = 		0x07,
 	_LCM_CHARGING = 		0x07,
 	_LCM_COMPLETE = 		0x08,
 	_LCM_COMPLETE = 		0x08,
 	_LCM_FIX = 				0x09,
 	_LCM_FIX = 				0x09,
+	_LCM_EMC = 				0x0A,
 	_LCM_NONE = 			0xFF,
 	_LCM_NONE = 			0xFF,
 };
 };
 
 
@@ -245,8 +246,53 @@ enum RELAY_STATUS_ERROR_TYPE
 	RELAY_STATUS_ERROR_DRIVING = 11
 	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
 struct DcCommonInformation
 {
 {
+	unsigned char rebootCount;
 	// check if the guns are of the same type
 	// check if the guns are of the same type
 	byte SysGunAreSameType;
 	byte SysGunAreSameType;
 	// to check the ccs version
 	// to check the ccs version
@@ -255,6 +301,18 @@ struct DcCommonInformation
 	char RelayCheckStatus[6];
 	char RelayCheckStatus[6];
 	char GunRelayWeldingOccur[2];
 	char GunRelayWeldingOccur[2];
 	char GunRelayDrivingOccur[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_ */
 #endif /* CONFIG_H_ */

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

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

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

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/can.h>
 #include 	<linux/can.h>
 #include 	<linux/can/raw.h>
 #include 	<linux/can/raw.h>
@@ -23,7 +22,6 @@
 #include    <fcntl.h>      /*檔控制定義*/
 #include    <fcntl.h>      /*檔控制定義*/
 #include    <termios.h>    /*PPSIX 終端控制定義*/
 #include    <termios.h>    /*PPSIX 終端控制定義*/
 #include    <errno.h>      /*錯誤號定義*/
 #include    <errno.h>      /*錯誤號定義*/
-#include 	<errno.h>
 #include 	<string.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<time.h>
 #include	<ctype.h>
 #include	<ctype.h>
@@ -44,6 +42,8 @@
 #define CHK_CUR_RANGE		20
 #define CHK_CUR_RANGE		20
 #define PLUG				1
 #define PLUG				1
 #define UNPLUG				0
 #define UNPLUG				0
+#define UNDEFINED_TEMP		255
+#define ALLOW_COUNT_MAX		10
 
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -72,6 +72,12 @@ float maxChargingVol[2] = { 0, 0 };			// 
 float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
 float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
 float maxChargingPow = 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 ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct timeval _chk_ratingPower_timeout[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);
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(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);
 			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
 			isCleanCheck = true;
 			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)
 	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, "023734", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = NO;
 					if (strncmp(code, "023735", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = 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, "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);
 			memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
 			isCleanCheck = true;
 			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)
 	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, "023891", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO;
 					//if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = 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, "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, "023734") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = YES;
 	if (strcmp(string, "023735") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = 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, "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, "012288") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
 	if (strcmp(string, "023701") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = 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, "023891") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = YES;
 	if (strcmp(string, "023892") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = 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, "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, "023702") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = YES;
 	if (strcmp(string, "023900") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = 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;
 	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()
 void CANReceiver()
 {
 {
 	pid_t canRecPid;
 	pid_t canRecPid;
@@ -2972,6 +3045,10 @@ void CANReceiver()
 						_chargingData[targetGun]->GunLocked = frame.data[0];
 						_chargingData[targetGun]->GunLocked = frame.data[0];
 						_chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
 						_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)
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
 						{
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
@@ -3016,9 +3093,9 @@ void CANReceiver()
 								_chargingData[targetGun]->SystemStatus <= S_CCS_PRECHARGE_ST1))
 								_chargingData[targetGun]->SystemStatus <= S_CCS_PRECHARGE_ST1))
 						{
 						{
 							// frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
 							// 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))
 								if (AbnormalStopAnalysis(targetGun, frame.data + 1))
 								{
 								{
 									_chargingData[targetGun]->StopChargeFlag = YES;
 									_chargingData[targetGun]->StopChargeFlag = YES;
@@ -3026,9 +3103,16 @@ void CANReceiver()
 								else
 								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;
 						break;
@@ -3074,6 +3158,15 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 
 
 	cur1 = (chargingData_1->PresentChargingCurrent * 10);
 	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)
 //	if (ShmGBTData->ev[chargingData_2->type_index].PresentMsgFlowStatus == 10)
 //		vol2 = ShmPsuData->PsuGroup[1].GroupTargetOutputVoltage;
 //		vol2 = ShmPsuData->PsuGroup[1].GroupTargetOutputVoltage;
 //	else
 //	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",
 		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_VOL] = vol1;
 		LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] = cur1;
 		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;
 		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);
 	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) ||
 	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]->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);
 		//printf("(%d), totalChargingValue = %f \n", _index, ShmCsuMeterData->_meter[_index]._curTotalCharging / 100);
 		float totalChargingValue = 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]->PresentChargedEnergy = totalChargingValue;
-		_chargingData[_index]->PowerConsumption = totalChargingValue;
 
 
 		if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 		if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 		{
 		{
@@ -3529,8 +3635,8 @@ void CalOutputPowerAndEnergy(int _index)
 					_chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 					_chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 				}
 				}
 
 
-				_chargingData[_index]->PresentChargedEnergy += changingPow;
 				_chargingData[_index]->PowerConsumption += changingPow;
 				_chargingData[_index]->PowerConsumption += changingPow;
+				_chargingData[_index]->PresentChargedEnergy += changingPow;
 				chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
 				chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
 			}
 			}
 		}
 		}
@@ -3627,6 +3733,40 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->PresentChargedEnergy,
 						_chargingData[_index]->PresentChargedEnergy,
 						(_chargingData[_index]->PresentChargingVoltage * 10),
 						(_chargingData[_index]->PresentChargingVoltage * 10),
 						targetID);
 						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)
 			switch (_chargingData[_index]->SystemStatus)
@@ -3658,14 +3798,24 @@ int main(int argc, char *argv[])
 							chkChademoPermission[_index] = false;
 							chkChademoPermission[_index] = false;
 							SendStopOnly(_index);
 							SendStopOnly(_index);
 						}
 						}
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.ChaConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
+
 					}
 					}
 					else if (_chargingData[_index]->Type == _Type_GB)
 					else if (_chargingData[_index]->Type == _Type_GB)
 					{
 					{
 						ClearAbnormalStatus_GB(_index);
 						ClearAbnormalStatus_GB(_index);
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.GBTConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
 					}
 					}
 					else if (_chargingData[_index]->Type == _Type_CCS_2)
 					else if (_chargingData[_index]->Type == _Type_CCS_2)
 					{
 					{
 						ClearAbnormalStatus_CCS(_index);
 						ClearAbnormalStatus_CCS(_index);
+
+						if (ShmDcCommonData->ConnectErrList[_index].GunBits.CCSConnectOTP == NO)
+							_chargingData[_index]->StopChargeFlag = NO;
 					}
 					}
 
 
 					if (priorityLow == 1)
 					if (priorityLow == 1)
@@ -3674,14 +3824,14 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->PresentChargingPower = 0;
 						_chargingData[_index]->PresentChargingPower = 0;
 						_chargingData[_index]->GroundFaultStatus = GFD_WAIT;
 						_chargingData[_index]->GroundFaultStatus = GFD_WAIT;
 						_chargingData[_index]->RealRatingPower = 0;
 						_chargingData[_index]->RealRatingPower = 0;
-						_chargingData[_index]->StopChargeFlag = NO;
-						_chargingData[_index]->UnKnowStopChargeFlag = NO;
+						_chargingData[_index]->NormalStopChargeFlag = NO;
 						_chargingData[_index]->ChargingFee = 0.0;
 						_chargingData[_index]->ChargingFee = 0.0;
 						_chargingData[_index]->EvBatterySoc = 0;
 						_chargingData[_index]->EvBatterySoc = 0;
 						_chargingData[_index]->EvBatteryStartSoc = 0;
 						_chargingData[_index]->EvBatteryStartSoc = 0;
 						_chargingData[_index]->EvBatteryMaxVoltage = 0;
 						_chargingData[_index]->EvBatteryMaxVoltage = 0;
 						_chargingData[_index]->ChargingProfilePower = -1;
 						_chargingData[_index]->ChargingProfilePower = -1;
 						_chargingData[_index]->ChargingProfileCurrent = -1;
 						_chargingData[_index]->ChargingProfileCurrent = -1;
+						curAllowCount[_index] = 0;
 
 
 						if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 						if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 						{
 						{
@@ -3736,12 +3886,13 @@ int main(int argc, char *argv[])
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
 					else if (gun_count == 2)
 					else if (gun_count == 2)
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-					_chargingData[_index]->PowerConsumption = 0;
 				}
 				}
 					break;
 					break;
 				case S_PREPARING_FOR_EV:
 				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
 					// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
 					GetOutputReq(_index, targetID);
 					GetOutputReq(_index, targetID);
 
 
@@ -4019,17 +4170,6 @@ int main(int argc, char *argv[])
 								maxCur,
 								maxCur,
 								maxVol,
 								maxVol,
 								targetID);
 								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;
 					break;

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

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<time.h>
 #include	<ctype.h>
 #include	<ctype.h>
@@ -33,6 +31,8 @@
 #define FAIL				-1
 #define FAIL				-1
 #define YES					1
 #define YES					1
 #define NO					0
 #define NO					0
+#define CHANGED				1
+#define UNCHANGED			0
 
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -148,7 +148,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 	va_end(args);
 
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 }
 
 
 //=================================
 //=================================
@@ -360,16 +360,26 @@ int main(void)
 		return 0;
 		return 0;
 	}
 	}
 
 
+	byte isChanged;
+
 	for(;;)
 	for(;;)
 	{
 	{
+		isChanged = UNCHANGED;
+
 		//check Fault Status
 		//check Fault Status
 		for(ByteCount=0;ByteCount<4;ByteCount++)
 		for(ByteCount=0;ByteCount<4;ByteCount++)
 		{
 		{
+			if (isChanged == CHANGED)
+				break;
+
 			if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
 			if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
 			{
 			{
 				tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
 				tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
 					{
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -381,12 +391,14 @@ int main(void)
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						}
 						else
 						else
 						{
 						{
 							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
 							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 						}
 
 
 						EVENT_INFO("%s\n", EventCodeTmp);
 						EVENT_INFO("%s\n", EventCodeTmp);
@@ -399,11 +411,17 @@ int main(void)
 		//check Alarm Status
 		//check Alarm Status
 		for(ByteCount=0;ByteCount<14;ByteCount++)
 		for(ByteCount=0;ByteCount<14;ByteCount++)
 		{
 		{
+			if (isChanged == CHANGED)
+				break;
+
 			if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
 			if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
 			{
 			{
 				tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
 				tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
 					{
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -415,12 +433,14 @@ int main(void)
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						}
 						else
 						else
 						{
 						{
 							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
 							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 						}
 
 
 						EVENT_INFO("%s\n", EventCodeTmp);
 						EVENT_INFO("%s\n", EventCodeTmp);
@@ -431,13 +451,19 @@ int main(void)
 		}
 		}
 
 
 		//check Info Status
 		//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])
 			if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
 			{
 			{
 				tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
 				tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
 				for(BitCount=0;BitCount<8;BitCount++)
 				for(BitCount=0;BitCount<8;BitCount++)
 				{
 				{
+					if (isChanged == CHANGED)
+						break;
+
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
 					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
 					{
 					{
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
 						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
@@ -449,12 +475,14 @@ int main(void)
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							RemoveFaultCodeToBuf(EventCodeTmp);
 							EventCodeTmp[0] = '1';
 							EventCodeTmp[0] = '1';
+							isChanged = CHANGED;
 						}
 						}
 						else
 						else
 						{
 						{
 							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
 							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
 							AddFaultCodeToBuf(EventCodeTmp);
+							isChanged = CHANGED;
 						}
 						}
 
 
 						EVENT_INFO("%s\n", EventCodeTmp);
 						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/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
 #include 	<arpa/inet.h>
@@ -15,13 +14,12 @@
 
 
 #include 	<unistd.h>
 #include 	<unistd.h>
 #include 	<stdarg.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 	<string.h>
 #include	<time.h>
 #include	<time.h>
 #include	<ctype.h>
 #include	<ctype.h>
@@ -38,6 +36,7 @@
 #define NO					0
 #define NO					0
 #define STOP				0
 #define STOP				0
 #define START				1
 #define START				1
+#define	ABNORMAL			1
 #define RELAY_CHECK_TIME	5		// s
 #define RELAY_CHECK_TIME	5		// s
 #define OUTPUT_VOL_CHK_TIME	200 	// ms
 #define OUTPUT_VOL_CHK_TIME	200 	// ms
 #define TEN_MINUTES			600		// s
 #define TEN_MINUTES			600		// s
@@ -63,19 +62,21 @@ struct RelayModuleData			*ShmRelayModuleData;
 struct LedModuleData			*ShmLedModuleData;
 struct LedModuleData			*ShmLedModuleData;
 struct PsuData 					*ShmPsuData;
 struct PsuData 					*ShmPsuData;
 struct OCPP16Data				*ShmOCPP16Data;
 struct OCPP16Data				*ShmOCPP16Data;
+struct OCPP20Data				*ShmOCPP20Data;
+struct PrimaryMcuData			*ShmPrimaryMcuData;
 struct DcCommonInformation		*ShmDcCommonData;
 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_MAX_VOLTAGE	995
 #define VOUT_MIN_VOLTAGE	150
 #define VOUT_MIN_VOLTAGE	150
@@ -101,19 +102,19 @@ struct DcCommonInformation		*ShmDcCommonData;
 #define LED_BRIGHTNESS_LV_MID		0.5
 #define LED_BRIGHTNESS_LV_MID		0.5
 #define LED_BRIGHTNESS_LV_LOW		0.2
 #define LED_BRIGHTNESS_LV_LOW		0.2
 
 
-// ��撠誩��� Relay �餃�
+// 最小切換 Relay 電壓
 #define SELF_TO_CHANGE_RELAY_STATUS			600
 #define SELF_TO_CHANGE_RELAY_STATUS			600
-// �誯��餃�蝣箄� Relay �臬炏�凋�����𡁻𤓖憯�
+// 透過電壓確認 Relay 是否搭上的依據電壓
 #define CHECK_RELAY_STATUS					300
 #define CHECK_RELAY_STATUS					300
 #define CHECK_RELAY_STATUS_GAP				100
 #define CHECK_RELAY_STATUS_GAP				100
-// 摰匧��典�甇W��餌�摨譍葉�琿� Relay ��𤓖瘚�
+// 安全在停止充電程序中斷開 Relay 的電流
 #define SEFETY_SWITCH_RELAY_CUR				50
 #define SEFETY_SWITCH_RELAY_CUR				50
-// 蝣箄� Relay Welding �餃�
+// 確認 Relay Welding 電壓
 #define RELAY_WELDING_DET					300
 #define RELAY_WELDING_DET					300
 
 
 byte gunCount;
 byte gunCount;
 byte acgunCount;
 byte acgunCount;
-// 瑽滩�閮�
+// 槍資訊
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
 struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
 
 
@@ -277,7 +278,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 	va_end(args);
 
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 }
 
 
 //==========================================
 //==========================================
@@ -452,7 +453,7 @@ void SetModelName_Fan()
 	}
 	}
 }
 }
 
 
-// AC 銝厩㮾頛詨��餃�
+// AC 三相輸入電壓
 void GetPresentInputVol()
 void GetPresentInputVol()
 {
 {
 	if (Query_Present_InputVoltage(Uart5Fd, Addr.Relay, &inputVoltage) == PASS)
 	if (Query_Present_InputVoltage(Uart5Fd, Addr.Relay, &inputVoltage) == PASS)
@@ -717,7 +718,7 @@ void GetPresentInputVol()
 	}
 	}
 }
 }
 
 
-// 撌血𢰧瑽滨� Relay �滚���撓�粹𤓖憯�
+// 左右槍的 Relay 前後的輸出電壓
 void GetPersentOutputVol()
 void GetPersentOutputVol()
 {
 {
 	if (Query_Present_OutputVoltage(Uart5Fd, Addr.Relay, &outputVoltage) == PASS)
 	if (Query_Present_OutputVoltage(Uart5Fd, Addr.Relay, &outputVoltage) == PASS)
@@ -758,8 +759,8 @@ void GetPersentOutputVol()
 
 
 			//unsigned short Ovp = 0;
 			//unsigned short Ovp = 0;
 			//unsigned short Ocp = 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)
 			if (_chargingData[index]->Type == _Type_Chademo)
 			{
 			{
 				//Ovp = MaxValue(_chargingData[index]->MaximumChargingVoltage, _chargingData[index]->EvBatteryMaxVoltage);
 				//Ovp = MaxValue(_chargingData[index]->MaximumChargingVoltage, _chargingData[index]->EvBatteryMaxVoltage);
@@ -773,7 +774,7 @@ void GetPersentOutputVol()
 	}
 	}
 }
 }
 
 
-// 憸冽��笔漲
+// 風扇速度
 void GetFanSpeed()
 void GetFanSpeed()
 {
 {
 	//PRINTF_FUNC("Get fan board speed \n");
 	//PRINTF_FUNC("Get fan board speed \n");
@@ -792,7 +793,7 @@ void GetFanSpeed()
 	}
 	}
 }
 }
 
 
-// 霈��� Relay ����
+// 讀取 Relay 狀態
 void GetRelayOutputStatus()
 void GetRelayOutputStatus()
 {
 {
 	if (Query_Relay_Output(Uart5Fd, Addr.Relay, &regRelay) == PASS)
 	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)
 void CheckK1K2RelayOutput(byte index)
 {
 {
 	if (index == 0)
 	if (index == 0)
@@ -815,14 +816,14 @@ void CheckK1K2RelayOutput(byte index)
 
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			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)
 					if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 						_chargingData[index]->RelayKPK2Status = YES;
 						_chargingData[index]->RelayKPK2Status = YES;
@@ -840,7 +841,12 @@ void CheckK1K2RelayOutput(byte index)
 
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			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;
 					_chargingData[index]->RelayKPK2Status = YES;
 				else
 				else
 					_chargingData[index]->RelayKPK2Status = NO;
 					_chargingData[index]->RelayKPK2Status = NO;
@@ -856,7 +862,12 @@ void CheckK1K2RelayOutput(byte index)
 
 
 		if(_chargingData[index]->Type == _Type_CCS_2)
 		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;
 				_chargingData[index]->RelayKPK2Status = YES;
 			else
 			else
 				_chargingData[index]->RelayKPK2Status = NO;
 				_chargingData[index]->RelayKPK2Status = NO;
@@ -882,9 +893,9 @@ void CheckK1K2RelayOutput(byte index)
 
 
 void GetGfdAdc()
 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)
 	if (Query_Gfd_Adc(Uart5Fd, Addr.Relay, &gfd_adc) == PASS)
 	{
 	{
 		for (int i = 0; i < gunCount; i++)
 		for (int i = 0; i < gunCount; i++)
@@ -951,7 +962,7 @@ void GetGpioInput()
 
 
 		if (gpio_in.SPD == 1)
 		if (gpio_in.SPD == 1)
 		{
 		{
-			// SPD (�瑟�靽肽風) ON
+			// SPD (雷擊保護) ON
 			PRINTF_FUNC("RB SPD. \n");
 			PRINTF_FUNC("RB SPD. \n");
 		}
 		}
 
 
@@ -1149,68 +1160,68 @@ void SetK1K2RelayStatus(byte index)
 	}
 	}
 	else if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
 	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)
 	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()
 void SetParalleRelayStatus()
 {
 {
-	// 銋见��蹱��格芋璈毺車嚗峕��仿����
+	// 之後雙槍單模機種,橋接都會上
 	if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 	if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 	{
 	{
 		if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
 		if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
 				((_chargingData[0]->SystemStatus == S_IDLE || _chargingData[0]->SystemStatus == S_MAINTAIN) &&
 				((_chargingData[0]->SystemStatus == S_IDLE || _chargingData[0]->SystemStatus == S_MAINTAIN) &&
 				(_chargingData[1]->SystemStatus == S_IDLE || _chargingData[1]->SystemStatus == S_MAINTAIN)))
 				(_chargingData[1]->SystemStatus == S_IDLE || _chargingData[1]->SystemStatus == S_MAINTAIN)))
 		{
 		{
-			// �嘥��𤦸 銝齿𨰹璈𧢲𦻖
+			// 初始化~ 不搭橋接
 			if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 			if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 				outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 				outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 			else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
 			else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
@@ -1221,12 +1232,12 @@ void SetParalleRelayStatus()
 			if (_chargingData[0]->IsReadyToCharging == YES ||
 			if (_chargingData[0]->IsReadyToCharging == YES ||
 					_chargingData[1]->IsReadyToCharging == YES)
 					_chargingData[1]->IsReadyToCharging == YES)
 			{
 			{
-				// ************������典��𥕢葉 - ��� relay ��𨰹�� relay ���璈罸�************
+				// ************需考慮在切換中 - 切開 relay 與搭回 relay 的時機點************
 				if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 				if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 				{
 				{
 					if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_M_TO_A)
 					if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_M_TO_A)
 					{
 					{
-						// ��憭批� - �凋�璈𧢲𦻖
+						// 最大充 - 搭上橋接
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_P == NO)
 						else if (regRelay.relay_event.bits.Gun1_Parallel_P == NO)
@@ -1234,7 +1245,7 @@ void SetParalleRelayStatus()
 					}
 					}
 					else
 					else
 					{
 					{
-						// 撟喳��� - 銝齿𨰹
+						// 平均充 - 不搭
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
 						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 (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_A_TO_M)
 					{
 					{
-						// 撟喳��� - 銝齿𨰹
+						// 平均充 - 不搭
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 						if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 							outputRelay.relay_event.bits.Gun1_Parallel_P = NO;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
 						else if (regRelay.relay_event.bits.Gun1_Parallel_N == YES)
@@ -1253,7 +1264,7 @@ void SetParalleRelayStatus()
 					}
 					}
 					else
 					else
 					{
 					{
-						// ��憭批� - �凋�璈𧢲𦻖
+						// 最大充 - 搭上橋接
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 						if (regRelay.relay_event.bits.Gun1_Parallel_N == NO)
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 							outputRelay.relay_event.bits.Gun1_Parallel_N = YES;
 						else if (regRelay.relay_event.bits.Gun1_Parallel_P == NO)
 						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 (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_Green = _colorBuf;
 				led_color.Connect_1_Blue = COLOR_MIN_LV;
 				led_color.Connect_1_Blue = COLOR_MIN_LV;
@@ -1390,7 +1401,10 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
 		}
 		}
 		else
 		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_Green = _colorBuf;
 				led_color.Connect_1_Blue = COLOR_MIN_LV;
 				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_Green = _colorBuf;
 				led_color.Connect_2_Blue = COLOR_MIN_LV;
 				led_color.Connect_2_Blue = COLOR_MIN_LV;
@@ -1554,6 +1571,36 @@ int InitShareMemory()
 		result = FAIL;
 		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)
 	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
    	{
    	{
    		#ifdef SystemLogMessage
    		#ifdef SystemLogMessage
@@ -1604,6 +1651,85 @@ int InitComPort()
 	return fd;
 	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
 // Main process
 //================================================
 //================================================
@@ -1817,7 +1943,7 @@ bool IsNoneMatchRelayStatus()
 
 
 void MatchRelayStatus()
 void MatchRelayStatus()
 {
 {
-	// �删� AC Contactor 瘝埝� Feedback嚗峕�隞交麱����蹱見�閧�
+	// 因為 AC Contactor 沒有 Feedback,所以暫時先這樣處理
 	//regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
 	//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;
 	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;
 	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 &&
 	if (ShmRelayModuleData->Gun1FuseOutputVolt > 0 && ShmRelayModuleData->Gun1RelayOutputVolt > 0 &&
 			(ShmRelayModuleData->Gun1FuseOutputVolt == ShmRelayModuleData->Gun1RelayOutputVolt))
 			(ShmRelayModuleData->Gun1FuseOutputVolt == ShmRelayModuleData->Gun1RelayOutputVolt))
 	{
 	{
-		// Relay �滚��餃�銝���
+		// Relay 前後電壓一致
 		_chargingData[0]->RelayK1K2Status = 0x01;
 		_chargingData[0]->RelayK1K2Status = 0x01;
 	}
 	}
 	else
 	else
@@ -1843,7 +1969,7 @@ void CheckRelayStatusByADC()
 	if (ShmRelayModuleData->Gun2FuseOutputVolt > 0 && ShmRelayModuleData->Gun2RelayOutputVolt > 0 &&
 	if (ShmRelayModuleData->Gun2FuseOutputVolt > 0 && ShmRelayModuleData->Gun2RelayOutputVolt > 0 &&
 				(ShmRelayModuleData->Gun2FuseOutputVolt == ShmRelayModuleData->Gun2RelayOutputVolt))
 				(ShmRelayModuleData->Gun2FuseOutputVolt == ShmRelayModuleData->Gun2RelayOutputVolt))
 	{
 	{
-		// Relay �滚��餃�銝���
+		// Relay 前後電壓一致
 		_chargingData[1]->RelayK1K2Status = 0x01;
 		_chargingData[1]->RelayK1K2Status = 0x01;
 	}
 	}
 	else
 	else
@@ -1867,12 +1993,12 @@ void SetGfdConfig(byte index, byte resister)
 void CableCheckDetected(byte index)
 void CableCheckDetected(byte index)
 {
 {
 	// Cable Check
 	// Cable Check
-	// �嗥�蝺帋���𤓖憯� = 頠羓垢閬����𤓖憯㯄𤓖瘚�
+	// 當火線上的電壓 = 車端要求的電壓電流
 	// _chargingData[targetGun]->EvBatterytargetVoltage
 	// _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) ||
 	if ((_chargingData[index]->Type >= _Type_Chademo && _chargingData[index]->Type <= _Type_GB) ||
 			(_chargingData[index]->Type == 0x09 && ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag))
 			(_chargingData[index]->Type == 0x09 && ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag))
 	{
 	{
@@ -1936,11 +2062,23 @@ void CheckOutputPowerOverCarReq(byte index)
 							_chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10), carV);
 							_chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10), carV);
 
 
 					if (_chargingData[index]->Type == _Type_Chademo)
 					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)
 					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)
 					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;
 					_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)
 void CheckRelayWeldingStatus(byte index)
 {
 {
@@ -2058,18 +2196,18 @@ void GetPsuTempForFanSpeed()
 
 
 void GetFanSpeedByFunction()
 void GetFanSpeedByFunction()
 {
 {
-	// 憸冽綉靽格㺿 :
+	// 風控修改 :
 	// ******************************************************* //
 	// ******************************************************* //
 	//
 	//
-	//       �嗅�PSU頛詨枂蝮� KW       PSU Temp
+	//       當前PSU輸出總 KW       PSU Temp
 	// 50 x -------------------- x ---------- + 0.5 x (PSU Temp - 70)
 	// 50 x -------------------- x ---------- + 0.5 x (PSU Temp - 70)
-	//       �嗅�璅��憭批��� KW         50
+	//       當前樁最大功率 KW         50
 	//
 	//
 	// ******************************************************* //
 	// ******************************************************* //
 
 
-	// �嗅�璅��憭批��� KW : ShmPsuData->SystemAvailablePower
+	// 當前樁最大功率 KW : ShmPsuData->SystemAvailablePower
 	unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
 	unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
-	// �嗅�PSU頛詨枂蝮� KW & PSU Temp :
+	// 當前PSU輸出總 KW & PSU Temp :
 	unsigned char temp = 0;
 	unsigned char temp = 0;
 	float power = 0;
 	float power = 0;
 
 
@@ -2097,7 +2235,7 @@ void GetFanSpeedByFunction()
 	if (temp > 70)
 	if (temp > 70)
 		_temp_diff = temp - 70;
 		_temp_diff = temp - 70;
 
 
-	// debug mode �湔𦻖�啣枂鞈��敺屸𣪧��
+	// debug mode 直接印出資訊後離開
 	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
 	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",
 //		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)
 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)
 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 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()
 unsigned char isModeChange()
@@ -2356,7 +2474,7 @@ void AcChargeTypeProcess()
 				ac_chargingInfo[0]->SystemStatus = _status;
 				ac_chargingInfo[0]->SystemStatus = _status;
 			}
 			}
 
 
-			// 閮剖��𣂼���憭批��駁𤓖瘚� >= 6 ~ <= 32
+			// 設定限制最大充電電流 >= 6 ~ <= 32
 			switch(ac_chargingInfo[0]->SystemStatus)
 			switch(ac_chargingInfo[0]->SystemStatus)
 			{
 			{
 				case S_IDLE:
 				case S_IDLE:
@@ -2428,7 +2546,7 @@ void AcChargeTypeProcess()
 					ac_chargingInfo[0]->PresentChargingVoltage = AC_DEFAULT_VOL;
 					ac_chargingInfo[0]->PresentChargingVoltage = AC_DEFAULT_VOL;
 					ac_chargingInfo[0]->PresentChargingCurrent = ((float)acChargingCurrent.OuputCurrentL1 / 10);
 					ac_chargingInfo[0]->PresentChargingCurrent = ((float)acChargingCurrent.OuputCurrentL1 / 10);
 
 
-					// �其誑�斗𪃾�臬炏�匧銁頛詨枂
+					// 用以判斷是否有在輸出
 					ac_chargingInfo[0]->IsCharging = acStatus.RelayStatus;
 					ac_chargingInfo[0]->IsCharging = acStatus.RelayStatus;
 
 
 					SetCpDuty(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent);
 					SetCpDuty(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent);
@@ -2456,7 +2574,7 @@ void AcChargeTypeProcess()
 						ftime(&_ac_endChargingTime);
 						ftime(&_ac_endChargingTime);
 						if (strcmp((char *)ac_chargingInfo[0]->StartDateTime, "") != EQUAL)
 						if (strcmp((char *)ac_chargingInfo[0]->StartDateTime, "") != EQUAL)
 						{
 						{
-							// AC �箏��箇洵2�𦠜�
+							// AC 固定為第2把槍
 							OcppStopTransation(1);
 							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)
 int main(void)
 {
 {
 	if(InitShareMemory() == FAIL)
 	if(InitShareMemory() == FAIL)
@@ -2539,7 +2638,7 @@ int main(void)
 	for(;;)
 	for(;;)
 	{
 	{
 		bool isCharging = false;
 		bool isCharging = false;
-		// 蝔见��见�銋见�~ 敹����Ⅱ摰� FW ��𧋦��′擃𠉛��穿�蝣箄�敺�!!~ 閰脫芋蝯��蝞埈糓��迤�� Initial Comp.
+		// 程序開始之前~ 必須先確定 FW 版本與硬體版本,確認後!!~ 該模組才算是真正的 Initial Comp.
 		if (ShmRelayModuleData->SelfTest_Comp == NO)
 		if (ShmRelayModuleData->SelfTest_Comp == NO)
 		{
 		{
 			GetFwAndHwVersion_Relay();
 			GetFwAndHwVersion_Relay();
@@ -2557,10 +2656,10 @@ int main(void)
 			gettimeofday(&_priority_time, NULL);
 			gettimeofday(&_priority_time, NULL);
 		}
 		}
 
 
-		// �芣炎�擧挾�閧�嚗諹䌊瑼a�畾萄��𡏭�銝滚������誨銵刻府蝟餌絞瘝埝��𤤿���
+		// 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
 		if (ShmLedModuleData->SelfTest_Comp == NO)
 		if (ShmLedModuleData->SelfTest_Comp == NO)
 		{
 		{
-			// �芣炎�擧挾
+			// 自檢階段
 			if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq <= _STEST_PSU_CAP)
 			if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq <= _STEST_PSU_CAP)
 			{
 			{
 				GetFwAndHwVersion_Led();
 				GetFwAndHwVersion_Led();
@@ -2569,7 +2668,7 @@ int main(void)
 			}
 			}
 			else
 			else
 			{
 			{
-				// �芣炎�擧挾瘝埝��誩����
+				// 自檢階段沒有問到版號
 				if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail == NO)
 				if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail == NO)
 					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
 					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
 			}
 			}
@@ -2579,14 +2678,14 @@ int main(void)
 
 
 		if (ShmRelayModuleData->SelfTest_Comp == YES)
 		if (ShmRelayModuleData->SelfTest_Comp == YES)
 		{
 		{
-			// ==============�芸�甈𦠜�擃� 10 ms ==============
-			// 頛詨枂�餃�
+			// ==============優先權最高 10 ms ==============
+			// 輸出電壓
 			GetPersentOutputVol();
 			GetPersentOutputVol();
 
 
-			// 銝厩㮾頛詨��餃�
+			// 三相輸入電壓
 			GetPresentInputVol();
 			GetPresentInputVol();
 
 
-			// 霈��𣇉訜�� AC relay ����
+			// 讀取當前 AC relay 狀態
 			regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 			regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 			GetRelayOutputStatus();
 			GetRelayOutputStatus();
 
 
@@ -2595,17 +2694,18 @@ int main(void)
 				// Cable check (Set)
 				// Cable check (Set)
 				CableCheckDetected(i);
 				CableCheckDetected(i);
 
 
-				// check k1 k2 relay ����
+				// check k1 k2 relay 狀態
 				CheckK1K2RelayOutput(i);
 				CheckK1K2RelayOutput(i);
 
 
-				// 靘脲��嗅��������钅��� �凋�/�暸� Relay
+				// 依據當前各槍的狀態選擇 搭上/放開 Relay
 				SetK1K2RelayStatus(i);
 				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;
 					//_chargingData[i]->RelayWeldingCheck = NO;
 					_isOvpChkTimeFlag[i] = NO;
 					_isOvpChkTimeFlag[i] = NO;
-					ResetDetAlarmStatus(i);
 				}
 				}
 
 
 				if (_chargingData[i]->SystemStatus == S_BOOTING	||
 				if (_chargingData[i]->SystemStatus == S_BOOTING	||
@@ -2631,17 +2731,16 @@ int main(void)
 			// Cable check (Get)
 			// Cable check (Get)
 			GetGfdAdc();
 			GetGfdAdc();
 
 
-			// 璈𧢲𦻖 relay
+			// 橋接 relay
 			SetParalleRelayStatus();
 			SetParalleRelayStatus();
 
 
-			// �凋� AC Contactor
+			// 搭上 AC Contactor
 //			if (isCharging)
 //			if (isCharging)
 //				outputRelay.relay_event.bits.AC_Contactor = YES;
 //				outputRelay.relay_event.bits.AC_Contactor = YES;
 //			else
 //			else
 //				outputRelay.relay_event.bits.AC_Contactor = NO;
 //				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;
 				isStopChargingCount = false;
 				outputRelay.relay_event.bits.AC_Contactor = YES;
 				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)
 			if (ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE)
 				outputRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_P = YES;
 				outputRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_P = YES;
 
 
-			// �凋�/擛�� Relay
+			// 搭上/鬆開 Relay
 			if(IsNoneMatchRelayStatus())
 			if(IsNoneMatchRelayStatus())
 			{
 			{
 				relayMatchFlag = NO;
 				relayMatchFlag = NO;

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

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<time.h>
 #include	<ctype.h>
 #include	<ctype.h>
@@ -41,6 +39,7 @@ typedef unsigned char 			byte;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct FanModuleData			*ShmFanModuleData;
 struct FanModuleData			*ShmFanModuleData;
+struct DcCommonInformation		*ShmDcCommonData;
 
 
 #define NO_DEFINE			255
 #define NO_DEFINE			255
 #define DEFAULT_AC_INDEX	2
 #define DEFAULT_AC_INDEX	2
@@ -88,6 +87,7 @@ byte _gunIndex = 0;
 bool _battery_display_ani = false;
 bool _battery_display_ani = false;
 byte _curPage_index = 0;
 byte _curPage_index = 0;
 bool _page_reload = false;
 bool _page_reload = false;
+byte QRCodeBuf[128];
 
 
 // LCM - HW
 // LCM - HW
 byte _everyPageRollChange = 0;
 byte _everyPageRollChange = 0;
@@ -101,6 +101,8 @@ short __sel_gun_btn = 0x0040;
 short __ret_home_btn = 0x0042;
 short __ret_home_btn = 0x0042;
 short __stop_method_btn = 0x0044;
 short __stop_method_btn = 0x0044;
 
 
+short __lcm_version = 0x004A;
+
 short __qr_code = 0x0250;
 short __qr_code = 0x0250;
 short __main_rfid = 0x0052;
 short __main_rfid = 0x0052;
 short __main_qr = 0x0054;
 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);
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(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");
     	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
 		#endif
 		#endif
     	result = FAIL;
     	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
 		#ifdef SystemLogMessage
    		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
    		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
@@ -118,8 +116,21 @@ int InitShareMemory()
 		#endif
 		#endif
     	result = FAIL;
     	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;
     return result;
 }
 }
@@ -180,6 +191,24 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 //	0  : High byte
 //	0  : High byte
 //	1  : Low 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 == CMD_TITLE_1 && *(msg + 1) == CMD_TITLE_2)
 	{
 	{
 		if(*(msg + 3) == CMD_WRITE)
 		if(*(msg + 3) == CMD_WRITE)
@@ -199,6 +228,15 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 		}
 		}
 		else if (*(msg + 3) == CMD_MULTI_READ)
 		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))
 //			switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
 //			{
 //			{
 //				case BUTTON_GUN_INDEX:
 //				case BUTTON_GUN_INDEX:
@@ -236,6 +274,7 @@ void ChangeBackLight(bool islight)
 {
 {
 	byte value = 0x01;
 	byte value = 0x01;
 
 
+	// 0x00 ~ 0x40
 	if (islight)
 	if (islight)
 	{
 	{
 		value = 0x20;
 		value = 0x20;
@@ -302,24 +341,24 @@ void ChangeDisplay2Value(short address, short value)
 	DisplayValueToLcm(address, data, sizeof(data));
 	DisplayValueToLcm(address, data, sizeof(data));
 }
 }
 
 
-void GetBtnStatus(short address, byte len)
+void GetDeviceInfoStatus(short address, byte len)
 {
 {
 	byte cmd[8];
 	byte cmd[8];
 	memset(cmd, 0x00, sizeof(cmd));
 	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[8];
+	byte msg[40];
 	memset(msg, 0x00, sizeof(msg));
 	memset(msg, 0x00, sizeof(msg));
 
 
 	cmd[0] = CMD_TITLE_1;
 	cmd[0] = CMD_TITLE_1;
 	cmd[1] = CMD_TITLE_2;
 	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x03 + len;
+	cmd[2] = 0x04;
 	cmd[3] = CMD_MULTI_READ;
 	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);
 			ChangeDisplay2Value(__3G4G_status, _disappear);
 			// 3G/4G
 			// 3G/4G
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
+			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_connect); }
 			else
 			else
 			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
 			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
 		}
 		}
@@ -819,7 +858,7 @@ void RefreshConnStatus()
 			ChangeDisplay2Value(__3G4G_move_status, _disappear);
 			ChangeDisplay2Value(__3G4G_move_status, _disappear);
 			// 3G/4G
 			// 3G/4G
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
 			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
+			{ ChangeDisplay2Value(__3G4G_status, _3G4G_connect); }
 			else
 			else
 			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
 			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
 		}
 		}
@@ -874,6 +913,29 @@ bool IsPageReloadChk()
 	return result;
 	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()
 void ClearDisplayInfo()
 {
 {
 	ChangeDisplay2Value(__csu_ver_string, _disappear);
 	ChangeDisplay2Value(__csu_ver_string, _disappear);
@@ -969,15 +1031,15 @@ void Show4GRssi(bool isShow, int dbValue)
 
 
 		memset(value, 0x00, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, "RSSI >");
 		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
+		DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		sprintf((char *)value, "%d dBm", dbValue);
 		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
+		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
 	}
 	}
 	else
 	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));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, "RSSI >");
 		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__sn_string, value, sizeof(value));
+		DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		memset(value, 0x00, sizeof(value));
 		sprintf((char *)value, "%d dBm", dbValue);
 		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__sn_value, value, sizeof(value));
+		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
 	}
 	}
 	else
 	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];
 		byte value[20];
 
 
 		memset(value, 0x00, sizeof(value));
 		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));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, (char *) ip);
 		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
+		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
 	}
 	}
 	else
 	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];
 		byte value[20];
 
 
 		memset(value, 0x00, sizeof(value));
 		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));
 		memset(value, 0x00, sizeof(value));
 		strcpy((char *) value, (char *) ip);
 		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
+		DisplayValueToLcm(__sn_value, value, sizeof(value));
 	}
 	}
 	else
 	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)
 		else if (_showInformIndex == 1)
 		{
 		{
 			ShowWifiMode(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
 			ShowWifiMode(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
-			ShowWifiIP(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiIpAddress);
 			ShowWifiRssi(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi);
 			ShowWifiRssi(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi);
+			ShowWifiIP(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiIpAddress);
 
 
 			Show4GMode(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled);
 			Show4GMode(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled);
-			Show4GIP(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress);
 			Show4GRssi(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
 			Show4GRssi(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
+			Show4GIP(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress);
 		}
 		}
 	}
 	}
 	else
 	else
@@ -1194,15 +1256,18 @@ void ProcessPageInfo()
 {
 {
 	_page_reload = IsPageReloadChk();
 	_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)
 	switch(_currentPage)
 	{
 	{
 		case _LCM_IDLE:
 		case _LCM_IDLE:
@@ -1234,11 +1299,13 @@ void ProcessPageInfo()
 					if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
 					if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
 					{
 					{
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
+						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.SystemId);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
 					}
 					}
 					else
 					else
 					{
 					{
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
 						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
+						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.QRCodeContent);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, len);
 						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, len);
 					}
 					}
 				}
 				}
@@ -1253,6 +1320,7 @@ void ProcessPageInfo()
 				isCharging = true;
 				isCharging = true;
 				break;
 				break;
 			}
 			}
+
 			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 			{
 			{
 				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
@@ -1273,31 +1341,30 @@ void ProcessPageInfo()
 		case _LCM_WAIT_FOR_PLUG:
 		case _LCM_WAIT_FOR_PLUG:
 		{
 		{
 			FirstPageChanged();
 			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)
 			if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
 			{
 			{
 				// 新增隨插即充功能預設在等待插槍頁面在開啟
 				// 新增隨插即充功能預設在等待插槍頁面在開啟
 				ChangeDisplay2Value(__ret_home_btn, _disappear);
 				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
 			else
+			{
 				ChangeDisplay2Value(__sel_gun_btn, _disappear);
 				ChangeDisplay2Value(__sel_gun_btn, _disappear);
+			}
 		}
 		}
 			break;
 			break;
 		case _LCM_PRE_CHARGE:
 		case _LCM_PRE_CHARGE:
@@ -1306,6 +1373,7 @@ void ProcessPageInfo()
 		{
 		{
 			bool isShowAc = false;
 			bool isShowAc = false;
 			byte gunTargetIndex = 0;
 			byte gunTargetIndex = 0;
+			bool idleGun = false;
 
 
 			if (acgunCount > 0)
 			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
 			// gun btn and QR code
@@ -1705,7 +1785,7 @@ int main(void)
 	acgunCount = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
 	acgunCount = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
 	Initialization();
 	Initialization();
 
 
-	//ChangeToOtherPage(_LCM_AUTHORIZING);
+	//ChangeToOtherPage(_LCM_EMC);
 	//return -1;
 	//return -1;
 
 
 	DefaultIconStatus();
 	DefaultIconStatus();
@@ -1714,8 +1794,10 @@ int main(void)
 	{
 	{
 		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName) != 0x00)
 		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName) != 0x00)
 		{
 		{
+			GetDeviceInfoStatus(__lcm_version, 3);
 			GetCurrentPage();
 			GetCurrentPage();
 			sleep(1);
 			sleep(1);
+			PRINTF_FUNC("LCM Version = V.%03d \n", ShmDcCommonData->LcmFwVersion);
 		}
 		}
 		else
 		else
 		{
 		{

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

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

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

@@ -28,6 +28,7 @@
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct StatusCodeData 			*ShmStatusCodeData;
 struct PsuData 					*ShmPsuData;
 struct PsuData 					*ShmPsuData;
+struct DcCommonInformation		*ShmDcCommonData;
 
 
 bool libInitialize = false;
 bool libInitialize = false;
 byte getAvailableCapOffset = 5;
 byte getAvailableCapOffset = 5;
@@ -99,7 +100,7 @@ void PRINTF_FUNC(char *string, ...)
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	vsnprintf(buffer, sizeof(buffer), string, args);
 	va_end(args);
 	va_end(args);
 
 
-	DEBUG_INFO("%s \n", buffer);
+	DEBUG_INFO("%s ", buffer);
 }
 }
 //=================================
 //=================================
 // Common routine
 // Common routine
@@ -187,7 +188,7 @@ unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit)
 
 
 void AbnormalStopAnalysis(byte gun_index, int errCode)
 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;
 		unsigned char byteIndex = (errCode >> (8 * i)) & 0xff;
 
 
@@ -199,44 +200,74 @@ void AbnormalStopAnalysis(byte gun_index, int errCode)
 				{
 				{
 					case 0:
 					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)
 						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)
 						if (bitIndex == 0)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
 						else if (bitIndex == 1)
 						else if (bitIndex == 1)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
 						else if (bitIndex == 2)
 						else if (bitIndex == 2)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseOnputImbalance = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
 						else if (bitIndex == 3)
 						else if (bitIndex == 3)
-							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuThreePhaseInputInadequate = YES;
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
 						else if (bitIndex == 4)
 						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)
 						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
 //			else
@@ -384,6 +415,9 @@ void GetModuleCountCallback(byte group, byte count)
 		ShmPsuData->SystemPresentPsuQuantity = count;
 		ShmPsuData->SystemPresentPsuQuantity = count;
 	else
 	else
 	{
 	{
+		if (group >= ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
+			return;
+
 		ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity = count;
 		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].GroupAvailableCurrent = _groupCurrent;
 	ShmPsuData->PsuGroup[group].GroupAvailablePower = _groupPower;
 	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;
 	int _power = 0, _current = 0, _ratingcurrent = 0, _sysRealPower = 0;
 	bool isGetAllDeratingCurrent = true;
 	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,
 void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char status,
 		unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
 		unsigned char err1, unsigned char err2, unsigned char err3, unsigned char err4)
 {
 {
+	ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
+
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 		return;
 
 
@@ -1090,7 +1130,7 @@ void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char st
 	if (group1 == 1)
 	if (group1 == 1)
 		address -= ShmPsuData->PsuGroup[group1 - 1].GroupPresentPsuQuantity;
 		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;
 	ShmPsuData->PsuGroup[group1].PsuModule[address].AlarmCode = alarm;
 	//AbnormalStopAnalysis(group1, alarm);
 	//AbnormalStopAnalysis(group1, alarm);
@@ -1176,7 +1216,22 @@ int InitShareMemory()
 		DEBUG_ERROR("shmat ShmPsuData NG \n");
 		DEBUG_ERROR("shmat ShmPsuData NG \n");
 		#endif
 		#endif
 		result = FAIL;
 		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;
     return result;
 }
 }
@@ -1448,6 +1503,8 @@ int main(void)
 				InitialPsuData();
 				InitialPsuData();
 				isInitialComp = YES;
 				isInitialComp = YES;
 			}
 			}
+
+			ShmDcCommonData->psuKeepCommunication = ShmDcCommonData->acContactSwitch;
 			sleep(1);
 			sleep(1);
 			continue;
 			continue;
 		}
 		}

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

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

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

@@ -7,7 +7,6 @@
 #include 	<sys/socket.h>
 #include 	<sys/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
 #include 	<arpa/inet.h>
@@ -21,7 +20,6 @@
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <fcntl.h>      /*Àɱ±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <termios.h>    /*PPSIX ²×ºÝ±±¨î©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
 #include    <errno.h>      /*¿ù»~¸¹©w¸q*/
-#include 	<errno.h>
 #include 	<string.h>
 #include 	<string.h>
 #include	<time.h>
 #include	<time.h>
 #include	<ctype.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 ("SOC = %d \n", _chargingData[_index]->EvBatterySoc);
 			printf ("Maximum battery Voltage = %f \n", _chargingData[_index]->EvBatteryMaxVoltage);
 			printf ("Maximum battery Voltage = %f \n", _chargingData[_index]->EvBatteryMaxVoltage);
 			printf("Charging mode = %d \n", ShmSysConfigAndInfo->SysInfo.MainChargingMode);
 			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
 		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)
 void GetAuthorizeFlag(char *v1)
@@ -524,6 +527,22 @@ void SetChargingInfoCCID(char *v1, char* v2)
 	_chargingData[_index]->EVCCID[8] = '\0';
 	_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()
 void GetPowerValue()
 {
 {
 	for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
 	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;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARNING;
     		}
     		}
     		break;
     		break;
@@ -1123,7 +1142,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     	else if (strcmp(newString[0], "c") == 0)
     	else if (strcmp(newString[0], "c") == 0)
     	{
     	{
     		printf("stop \n\r");
     		printf("stop \n\r");
-    		ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x00;
+    		ShmDcCommonData->StartToChargingFlag[ShmSysConfigAndInfo->SysInfo.CurGunSelected] = 0x00;
     		_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
     		_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
     	}
     	}
 
 
@@ -1306,7 +1325,7 @@ int main(void)
 		}
 		}
 		else if(strcmp(newString[0], "error") == 0)
 		else if(strcmp(newString[0], "error") == 0)
 		{
 		{
-			CreateOneError(newString[1]);
+			CreateOneError();
 		}
 		}
 		else if (strcmp(newString[0], "auth") == 0)
 		else if (strcmp(newString[0], "auth") == 0)
 		{
 		{
@@ -1326,6 +1345,15 @@ int main(void)
 			}
 			}
 			SetChargingInfoCCID(newString[1], newString[2]);
 			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)
 		else if (strcmp(newString[0], "soc") == 0)
 		{
 		{
 			GetSOC(newString[1]);
 			GetSOC(newString[1]);
@@ -1337,10 +1365,8 @@ int main(void)
 				printf ("FindChargingInfoData error\n");
 				printf ("FindChargingInfoData error\n");
 				continue;
 				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)
 		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/socket.h>
 #include 	<sys/ipc.h>
 #include 	<sys/ipc.h>
 #include 	<sys/shm.h>
 #include 	<sys/shm.h>
-#include 	<sys/shm.h>
 #include 	<sys/mman.h>
 #include 	<sys/mman.h>
 #include 	<linux/wireless.h>
 #include 	<linux/wireless.h>
 #include 	<arpa/inet.h>
 #include 	<arpa/inet.h>

File diff suppressed because it is too large
+ 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;
 struct timeval _cmdSubPriority_time;
 unsigned short _connectionTimeout;
 unsigned short _connectionTimeout;
 
 
+bool _isAllowChargingOnDisconnect;
 // for main
 // for main
 struct timeval _cmdMainPriority_time;
 struct timeval _cmdMainPriority_time;
 struct timeval _toAverage_time;
 struct timeval _toAverage_time;
 unsigned char _ocppProfileChkFlag;
 unsigned char _ocppProfileChkFlag;
+bool stopChargingChkByCard;
 #endif /* TIMEOUT_H_ */
 #endif /* TIMEOUT_H_ */

Some files were not shown because too many files changed in this diff