Browse Source

2020-09-17 / Alston Lin

Alstons
1. Release Ver.18

Files
1. As follow commit history
Alston 4 năm trước cách đây
mục cha
commit
fb48bd81ba

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

@@ -206,4 +206,18 @@ enum _CCS_COMM_PROTOCOL
 	_CCS_COMM_V2GMessage_ISO15118_2018 	= 0x03
 };
 
+enum _ETHERNET_USAGE
+{
+	_ETHERNET_USAGE_NONE 	= 0,
+	_ETHERNET_USAGE_LAN,
+	_ETHERNET_USAGE_WIFI,
+	_ETHERNET_USAGE_3G_4g
+};
+
+enum _PRIMARY_CHECK_TAG
+{
+	_PRIMARY_CHECK_TAG_AC_CONTACT		= 0,
+	_PRIMARY_CHECK_TAG_MAIN_BREAKER		= 1,
+};
+
 #endif /* CONFIG_H_ */

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

@@ -105,14 +105,12 @@ int main(int argc,char *argv[])
 	*/
 	//********** System **********// udhcpc -i eth1 -s ./dhcp_script/eth1.script
 	//
-	strcpy((char *)SysConfig.ModelName, "DSYE601J0EW2PH");
-	strcpy((char *)SysConfig.SerialNumber, "SERIALFORRD");
+	strcpy((char *)SysConfig.ModelName, "DSYE601J0EE2PH");
+	strcpy((char *)SysConfig.SerialNumber, "NeedSetupSN");
 
 	memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
-	char Dash = '-';
 
 	strcat((char *)SysConfig.SystemId, (char *)SysConfig.ModelName);
-	strncat((char *)SysConfig.SystemId, &Dash, 1);
 	strcat((char *)SysConfig.SystemId, (char *)SysConfig.SerialNumber);
 
 	strcpy((char *)SysConfig.SystemDateTime, "");

+ 95 - 17
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -36,6 +36,7 @@
 #define FAIL				-1
 #define START				1
 #define STOP				0
+#define COMMUNICATION		2
 #define YES					1
 #define NO					0
 #define EQUAL				0
@@ -46,10 +47,10 @@ struct FanModuleData			*ShmFanModuleData;
 struct CHAdeMOData				*ShmCHAdeMOData;
 struct GBTData					*ShmGBTData;
 struct CcsData					*ShmCcsData;
+struct PsuData 					*ShmPsuData;
 
 byte gun_count;
 int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-struct timeval _chk_ratingPower_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 float _pow_1 = 0;
 float _cur_1 = 0;
@@ -72,6 +73,9 @@ float maxChargingPow = 0;							// 
 
 // ºj¸ê°T
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeval _chk_ratingPower_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeval _chk_chademo_permission_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+bool chkChademoPermission[2] = { false, false };
 
 struct Ev_Board_Cmd Ev_Cmd={
 		0,
@@ -254,6 +258,22 @@ int InitShareMemory()
     else
     {}
 
+ 	//creat ShmPsuData
+ 	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),  0777)) < 0)
+ 	{
+ 		#ifdef SystemLogMessage
+ 		DEBUG_ERROR("shmget ShmPsuData NG \n");
+ 		#endif
+ 		result = FAIL;
+ 	}
+ 	else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+ 	{
+ 		#ifdef SystemLogMessage
+ 		DEBUG_ERROR("shmat ShmPsuData NG \n");
+ 		#endif
+ 		result = FAIL;
+ 	}
+
    	if(CHAdeMO_QUANTITY > 0)
    	{
    		if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),	IPC_CREAT | 0777)) < 0)
@@ -2768,17 +2788,18 @@ void CANReceiver()
 						{
 							if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 							{
-								for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
-								{
-									if (_vCount % 2 == 0 && _vCount != 0)
-									{
-										ver[_vCount + _vPoint] = 0x2E;
-										_vPoint++;
-									}
-
-									ver[_vCount + _vPoint] = frame.data[_vCount];
-								}
-
+//								for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
+//								{
+//									if (_vCount % 2 == 0 && _vCount != 0)
+//									{
+//										ver[_vCount + _vPoint] = 0x2E;
+//										_vPoint++;
+//									}
+//
+//									ver[_vCount + _vPoint] = frame.data[_vCount];
+//								}
+
+								memcpy(ver, frame.data, frame.can_dlc);
 								memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
 								ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
 								PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
@@ -2804,6 +2825,8 @@ void CANReceiver()
 						break;
 					case ACK_GET_OUTPUT_REQ:
 					{
+						if (_chargingData[targetGun]->EvBatteryStartSoc <= 0)
+							_chargingData[targetGun]->EvBatteryStartSoc = frame.data[1];
 						_chargingData[targetGun]->EvBatterySoc = frame.data[1];
 						_chargingData[targetGun]->EvBatterytargetVoltage = (float)((frame.data[3] << 8) + frame.data[2]) / 10;
 						_chargingData[targetGun]->EvBatterytargetCurrent = (float)((frame.data[5] << 8) + frame.data[4]) / 10;
@@ -2854,6 +2877,7 @@ void CANReceiver()
 						_chargingData[targetGun]->EvBatteryMaxVoltage = (((short) frame.data[4] << 8) + (short) frame.data[3]) / 10;
 						//_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
 						//_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
+						PRINTF_FUNC("index = %d, Ev Maximum Voltage = %f \n", targetGun, _chargingData[targetGun]->EvBatteryMaxVoltage);
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
 							ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
@@ -2957,10 +2981,18 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 	float vol1 = 0, cur1 = 0;
 	float vol2 = 0, cur2 = 0;
 
-	vol1 = chargingData_1->FireChargingVoltage;
+//	if (ShmGBTData->ev[chargingData_1->type_index].PresentMsgFlowStatus == 10)
+//		vol1 = ShmPsuData->PsuGroup[0].GroupTargetOutputVoltage;
+//	else
+		vol1 = chargingData_1->FireChargingVoltage;
+
 	cur1 = (chargingData_1->PresentChargingCurrent * 10);
 
-	vol2 = chargingData_2->FireChargingVoltage;
+//	if (ShmGBTData->ev[chargingData_2->type_index].PresentMsgFlowStatus == 10)
+//		vol2 = ShmPsuData->PsuGroup[1].GroupTargetOutputVoltage;
+//	else
+		vol2 = chargingData_2->FireChargingVoltage;
+
 	cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
 	if (_outVol_1 != vol1 ||
@@ -3002,8 +3034,10 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 		_pow_2 != pow2 ||
 		_cur_2 != cur2)
 	{
-		PRINTF_FUNC("To EV (Real) Power_1 = %f, Cur_1 = %f, Power_2 = %f, Cur_2 = %f \n",
-				pow1, cur1, pow2, cur2);
+		PRINTF_FUNC("----------------------------------------------------- \n");
+		PRINTF_FUNC("To EV (Real) Power_1 = %f, Cur_1 = %f, Power_2 = %f, Cur_2 = %f \n", pow1, cur1, pow2, cur2);
+		PRINTF_FUNC("----------------------------------------------------- \n");
+
 		_pow_1 = pow1; _cur_1 = cur1; _pow_2 = pow2; _cur_2 = cur2;
 		chargingData_1->RealMaxCurrent = _cur_1;
 		chargingData_1->RealMaxPower = pow1;
@@ -3046,7 +3080,7 @@ void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 		*cur = maxChargingCur[index];
 
 	if (_chargingData[index]->SystemStatus == S_CHARGING &&
-			_chargingData[index]->ChargingProfileCurrent > 0 &&
+			_chargingData[index]->ChargingProfileCurrent >= 0 &&
 			_chargingData[index]->ChargingProfileCurrent <= *cur)
 	{
 		*cur = _chargingData[index]->ChargingProfileCurrent;
@@ -3205,6 +3239,24 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 	return result;
 }
 
+void SendCommunicationOnly(byte index)
+{
+	SetChargingPermission(index, COMMUNICATION,
+		_chargingData[index]->AvailableChargingPower,
+		0,
+		0,
+		_chargingData[index]->Evboard_id);
+}
+
+void SendStopOnly(byte index)
+{
+	SetChargingPermission(index, STOP,
+		_chargingData[index]->AvailableChargingPower,
+		0,
+		0,
+		_chargingData[index]->Evboard_id);
+}
+
 int main(int argc, char *argv[])
 {
 	if(InitShareMemory() == FAIL)
@@ -3272,6 +3324,28 @@ int main(int argc, char *argv[])
 					if (_chargingData[_index]->Type == _Type_Chademo)
 					{
 						ClearAbnormalStatus_Chademo(_index);
+						if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_WAIT_FOR_PLUG)
+						{
+							if (!chkChademoPermission[_index])
+							{
+								chkChademoPermission[_index] = true;
+								gettimeofday(&_chk_chademo_permission_timeout[_index], NULL);
+								SendCommunicationOnly(_index);
+							}
+							else
+							{
+								if (GetTimeoutValue(_chk_chademo_permission_timeout[_index]) / 1000 > 10000)
+								{
+									SendCommunicationOnly(_index);
+									gettimeofday(&_chk_chademo_permission_timeout[_index], NULL);
+								}
+							}
+						}
+						else if (chkChademoPermission[_index])
+						{
+							chkChademoPermission[_index] = false;
+							SendStopOnly(_index);
+						}
 					}
 					else if (_chargingData[_index]->Type == _Type_GB)
 					{
@@ -3291,9 +3365,12 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->StopChargeFlag = NO;
 						_chargingData[_index]->ChargingFee = 0.0;
 						_chargingData[_index]->EvBatterySoc = 0;
+						_chargingData[_index]->EvBatteryStartSoc = 0;
 						_chargingData[_index]->PresentChargingVoltage = 0;
 						_chargingData[_index]->PresentChargingCurrent = 0;
 						_chargingData[_index]->EvBatteryMaxVoltage = 0;
+						_chargingData[_index]->ChargingProfilePower = -1;
+						_chargingData[_index]->ChargingProfileCurrent = -1;
 
 						chargingTime[_index] = 0;
 
@@ -3303,6 +3380,7 @@ int main(int argc, char *argv[])
 					break;
 				case S_PREPARNING:
 				{
+					chkChademoPermission[_index] = false;
 					// ³]©w·í«e¿é¥X
 					if (gun_count == 1)
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);

+ 89 - 0
EVSE/Projects/DS60-120/Apps/Module_EventLogging.c

@@ -37,6 +37,9 @@
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 
+sqlite3 *localDb;
+#define DB_FILE				"/Storage/ChargeLog/localCgargingRecord.db"
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -208,6 +211,89 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
 	}
 }
 
+//==========================================
+// SQLite routne
+//==========================================
+int DB_Open(sqlite3 *db)
+{
+	int result = PASS;
+	char* errMsg = NULL;
+	char* createRecordSql="CREATE TABLE IF NOT EXISTS event_record("
+					      "idx integer primary key AUTOINCREMENT, "
+						  "occurDatetime text NOT NULL, "
+						  "statusCode text NOT NULL"
+						  ");";
+
+	if(sqlite3_open(DB_FILE, &db))
+	{
+		result = FAIL;
+		DEBUG_ERROR( "Can't open database: %s\n", sqlite3_errmsg(db));
+		sqlite3_close(db);
+	}
+	else
+	{
+		DEBUG_INFO( "Local event record database open successfully.\n");
+
+		if (sqlite3_exec(db, createRecordSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			DEBUG_ERROR( "Create local event record table error message: %s\n", errMsg);
+		}
+		else
+		{
+			DEBUG_INFO( "Opened local event record table successfully\n");
+		}
+
+		sqlite3_close(db);
+	}
+
+	return result;
+}
+
+int DB_Insert_Record(sqlite3 *db, uint8_t *statusCode)
+{
+	int result = PASS;
+	char* errMsg = NULL;
+	char sqlStr[1024];
+
+	sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
+
+	if(sqlite3_open(DB_FILE, &db))
+	{
+		result = FAIL;
+		DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db));
+		sqlite3_close(db);
+	}
+	else
+	{
+		DEBUG_INFO( "Local event record database open successfully.\n");
+		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			DEBUG_INFO( "Insert local event record error message: %s\n", errMsg);
+		}
+		else
+		{
+			DEBUG_INFO( "Insert local event record successfully\n");
+		}
+
+		sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
+		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			DEBUG_INFO( "delete local event_record error message: %s\n", errMsg);
+		}
+		else
+		{
+			DEBUG_INFO( "delete local event record successfully\n");
+		}
+
+		sqlite3_close(db);
+	}
+
+	return result;
+}
+
 int main(void)
 {
 	int ByteCount,BitCount;
@@ -252,6 +338,7 @@ int main(void)
 							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							DB_Insert_Record(localDb, EventCodeTmp);
 						}
 					}
 				}
@@ -282,6 +369,7 @@ int main(void)
 							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							DB_Insert_Record(localDb, EventCodeTmp);
 						}
 					}
 				}
@@ -312,6 +400,7 @@ int main(void)
 							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
+							DB_Insert_Record(localDb, EventCodeTmp);
 						}
 					}
 				}

+ 190 - 52
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -94,7 +94,7 @@ struct OCPP16Data				*ShmOCPP16Data;
 #define CHECK_RELAY_STATUS					300
 #define CHECK_RELAY_STATUS_GAP				100
 // 安全在停止充電程序中斷開 Relay 的電流
-#define SEFETY_SWITCH_RELAY_CUR				20
+#define SEFETY_SWITCH_RELAY_CUR				50
 // 確認 Relay Welding 電壓
 #define RELAY_WELDING_DET					300
 
@@ -110,6 +110,9 @@ struct timeval _checkOutputNoneMatchTimer[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_Q
 bool _isRelayWelding[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct timeval _checkRelayWeldingTimer[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
+byte _threePhaseOvp[3] = {0, 0, 0};
+byte _threePhaseUvp[3] = {0, 0, 0};
+
 bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData);
 
 int Uart5Fd;
@@ -377,6 +380,14 @@ void SetRtcData_Relay()
 	}
 }
 
+void SetModelName_Relay()
+{
+	if (Config_Model_Name(Uart5Fd, Addr.Relay, ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
+	{
+		PRINTF_FUNC("Set Model name (RB) PASS = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
+	}
+}
+
 void SetRtcData_Fan()
 {
 	struct timeb csuTime;
@@ -418,7 +429,7 @@ void SetModelName_Fan()
 {
 	if (Config_Model_Name(Uart5Fd, Addr.Fan, ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
 	{
-		PRINTF_FUNC("Set Model name PASS = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
+		PRINTF_FUNC("Set Model name (FAN) PASS = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
 	}
 }
 
@@ -439,52 +450,88 @@ void GetPresentInputVol()
 			if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Uvp L1N_L12 = %f \n", inputVoltage.L1N_L12);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+				if (_threePhaseUvp[0] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+				else
+					_threePhaseUvp[0] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
+				_threePhaseUvp[0] = 0;
+			}
 
 			if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Uvp L2N_L23 = %f \n", inputVoltage.L2N_L23);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+				if (_threePhaseUvp[1] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+				else
+					_threePhaseUvp[1] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
+				_threePhaseUvp[1] = 0;
+			}
 
 			if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Uvp L3N_L31 = %f \n", inputVoltage.L3N_L31);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+				if (_threePhaseUvp[2] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+				else
+					_threePhaseUvp[2] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
+				_threePhaseUvp[2] = 0;
+			}
 		}
 		else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
 		{
 			if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Uvp L1N_L12 = %f \n", inputVoltage.L1N_L12);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+				if (_threePhaseUvp[0] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+				else
+					_threePhaseUvp[0] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
+				_threePhaseUvp[0] = 0;
+			}
 
 			if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Uvp L2N_L23 = %f \n", inputVoltage.L2N_L23);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+				if (_threePhaseUvp[1] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+				else
+					_threePhaseUvp[1] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
+				_threePhaseUvp[1] = 0;
+			}
 
 			if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Uvp L3N_L31 = %f \n", inputVoltage.L3N_L31);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+				if (_threePhaseUvp[2] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+				else
+					_threePhaseUvp[2] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
+				_threePhaseUvp[2] = 0;
+			}
 		}
 		//********************************************************************************************************//
 		// Vin (OVP)
@@ -493,52 +540,88 @@ void GetPresentInputVol()
 			if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Ovp L1N_L12 = %f \n", inputVoltage.L1N_L12);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+				if (_threePhaseOvp[0] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+				else
+					_threePhaseOvp[0] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
+				_threePhaseOvp[0] = 0;
+			}
 
 			if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Ovp L2N_L23 = %f \n", inputVoltage.L2N_L23);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+				if (_threePhaseOvp[1] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+				else
+					_threePhaseOvp[1] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
+				_threePhaseOvp[1] = 0;
+			}
 
 			if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_IEC)
 			{
 				PRINTF_FUNC("In Ovp L3N_L31 = %f \n", inputVoltage.L3N_L31);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+				if (_threePhaseOvp[2] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+				else
+					_threePhaseOvp[2] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
+				_threePhaseOvp[2] = 0;
+			}
 		}
 		else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
 		{
 			if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Ovp L1N_L12 = %f \n", inputVoltage.L1N_L12);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+				if (_threePhaseOvp[0] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+				else
+					_threePhaseOvp[0] += 0;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
+				_threePhaseOvp[0] = 0;
+			}
 
 			if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Ovp L2N_L23 = %f \n", inputVoltage.L2N_L23);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+				if (_threePhaseOvp[1] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+				else
+					_threePhaseOvp[1] += 0;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
+				_threePhaseOvp[1] = 0;
+			}
 
 			if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_UL)
 			{
 				PRINTF_FUNC("In Ovp L3N_L31 = %f \n", inputVoltage.L3N_L31);
-				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+				if (_threePhaseOvp[2] >= 3)
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+				else
+					_threePhaseOvp[2] += 1;
 			}
 			else
+			{
 				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
+				_threePhaseOvp[2] = 0;
+			}
 		}
 	}
 }
@@ -1069,10 +1152,11 @@ void CheckPhaseLossStatus(byte index)
 void SetParalleRelayStatus()
 {
 	// 之後雙槍單模機種,橋接都會上
-	if (gunCount >= 2)
+	if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 	{
 		if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
-				(_chargingData[0]->SystemStatus == S_IDLE && _chargingData[1]->SystemStatus == S_IDLE))
+				((_chargingData[0]->SystemStatus == S_IDLE || _chargingData[0]->SystemStatus == S_MAINTAIN) &&
+				(_chargingData[1]->SystemStatus == S_IDLE || _chargingData[1]->SystemStatus == S_MAINTAIN)))
 		{
 			// 初始化~ 不搭橋接
 			if (regRelay.relay_event.bits.Gun1_Parallel_P == YES)
@@ -1792,50 +1876,99 @@ void GetPsuTempForFanSpeed()
 void GetFanSpeedByFunction()
 {
 	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-		return;
+			return;
 
-	// 風控修改 :
-	// ******************************************************* //
-	//
-	//       當前PSU輸出總 KW       PSU Temp
-	// 30 x -------------------- x ---------- + 14 x (PSU Temp - 45)
-	//       當前樁最大功率 KW         45
-	//
-	// ******************************************************* //
+		// 風控修改 :
+		// ******************************************************* //
+		//
+		//       當前PSU輸出總 KW       PSU Temp
+		// 30 x -------------------- x ---------- + 14 x (PSU Temp - 45)
+		//       當前樁最大功率 KW         45
+		//
+		// ******************************************************* //
 
-	// 當前樁最大功率 KW : ShmPsuData->SystemAvailablePower
-	unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
-	// 當前PSU輸出總 KW & PSU Temp :
-	unsigned char temp = 0;
-	float power = 0;
+		// 當前樁最大功率 KW : ShmPsuData->SystemAvailablePower
+		unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
+		// 當前PSU輸出總 KW & PSU Temp :
+		unsigned char temp = 0;
+		float power = 0;
 
-	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
-	{
-		for (byte count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++)
+		for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 		{
-			if (temp < ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp)
-				temp = ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp;
+			for (byte count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++)
+			{
+				if (temp < ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp)
+					temp = ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp;
+			}
+			power += (_chargingData[index]->PresentChargingPower * 10);
 		}
-		power += (_chargingData[index]->PresentChargingPower * 10);
-	}
 
-	double _pw_rate = 0;
-	if (_maxPower > 0)
-		_pw_rate = power / (double)_maxPower;
-	double _temp_rate = 0;
-	if (temp > 0)
-		_temp_rate = (double)temp / 45;
-	unsigned char _temp_diff = 0;
-	if (temp > 45)
-		_temp_diff = temp - 45;
+		double _pw_rate = 0;
+		if (_maxPower > 0)
+			_pw_rate = power / (double)_maxPower;
+		double _temp_rate = 0;
+		if (temp > 0)
+			_temp_rate = (double)temp / 45;
+		unsigned char _temp_diff = 0;
+		if (temp > 45)
+			_temp_diff = temp - 45;
+
+		ShmFanModuleData->TestFanSpeed = ((30 * _pw_rate * _temp_rate + 14 * _temp_diff) / 100) * MAX_FAN_SPEED;
+
+		if (ShmFanModuleData->TestFanSpeed > MAX_FAN_SPEED)
+			ShmFanModuleData->TestFanSpeed = MAX_FAN_SPEED;
+
+		if (ShmFanModuleData->TestFanSpeed < 0)
+				ShmFanModuleData->TestFanSpeed = 0;
+
 
-	ShmFanModuleData->TestFanSpeed = ((30 * _pw_rate * _temp_rate + 14 * _temp_diff) / 100) * MAX_FAN_SPEED;
 
-	if (ShmFanModuleData->TestFanSpeed > MAX_FAN_SPEED)
-		ShmFanModuleData->TestFanSpeed = MAX_FAN_SPEED;
 
-	if (ShmFanModuleData->TestFanSpeed < 0)
-			ShmFanModuleData->TestFanSpeed = 0;
+//	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+//		return;
+//
+//	// 風控修改 :
+//	// ******************************************************* //
+//	//
+//	//       當前PSU輸出總 KW       PSU Temp
+//	// 50 x -------------------- x ---------- + 0.5 x (PSU Temp - 70)
+//	//       當前樁最大功率 KW         50
+//	//
+//	// ******************************************************* //
+//
+//	// 當前樁最大功率 KW : ShmPsuData->SystemAvailablePower
+//	unsigned int _maxPower = ShmPsuData->SystemAvailablePower;
+//	// 當前PSU輸出總 KW & PSU Temp :
+//	unsigned char temp = 0;
+//	float power = 0;
+//
+//	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
+//	{
+//		for (byte count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++)
+//		{
+//			if (temp < ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp)
+//				temp = ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp;
+//		}
+//		power += (_chargingData[index]->PresentChargingPower * 10);
+//	}
+//
+//	double _pw_rate = 0;
+//	if (_maxPower > 0)
+//		_pw_rate = power / (double)_maxPower;
+//	double _temp_rate = 0;
+//	if (temp > 0)
+//		_temp_rate = (double)temp / 50;
+//	unsigned char _temp_diff = 0;
+//	if (temp > 70)
+//		_temp_diff = temp - 70;
+//
+//	ShmFanModuleData->TestFanSpeed = (((50 * _pw_rate * _temp_rate) + (0.5 * _temp_diff)) / 100) * MAX_FAN_SPEED;
+//
+//	if (ShmFanModuleData->TestFanSpeed > MAX_FAN_SPEED)
+//		ShmFanModuleData->TestFanSpeed = MAX_FAN_SPEED;
+//
+//	if (ShmFanModuleData->TestFanSpeed < 0)
+//			ShmFanModuleData->TestFanSpeed = 0;
 //
 //	printf("power = %f \n", power);
 //	printf("_maxPower = %d \n", _maxPower);
@@ -2247,6 +2380,7 @@ int main(void)
 		if (ShmRelayModuleData->SelfTest_Comp == NO)
 		{
 			GetFwAndHwVersion_Relay();
+			SetModelName_Relay();
 			SetRtcData_Relay();
 			sleep(1);
 		}
@@ -2453,8 +2587,12 @@ int main(void)
 //			}
 		}
 
-		if (ShmFanModuleData->SelfTest_Comp == YES)
+		if (ShmFanModuleData->SelfTest_Comp == YES ||
+				strlen((char *)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev) != 0 ||
+				ShmSysConfigAndInfo->SysInfo.FanModuleFwRev[0] != '\0')
 		{
+			ShmFanModuleData->SelfTest_Comp = YES;
+
 			if (GetTimeoutValue(_priority_time) / 1000 >= 1000)
 			{
 				//GetPsuTempForFanSpeed();

+ 9 - 2
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -584,14 +584,14 @@ void ChangeBattMapAndValue(short page, int soc)
 			else
 				ChangeDisplay2Value(__batt_map, _battery_cap_60);
 		}
-		else if (soc >= 60 && soc < 80)
+		else if (soc >= 60 && soc < 100)
 		{
 			if (_battery_display_ani)
 				ChangeDisplay2Value(__batt_map, _battery_cap_60);
 			else
 				ChangeDisplay2Value(__batt_map, _battery_cap_80);
 		}
-		else if (soc >= 80 && soc <= 100)
+		else if (soc == 100)
 			ChangeDisplay2Value(__batt_map, _battery_cap_100);
 	}
 	else if (page == _LCM_COMPLETE)
@@ -865,6 +865,10 @@ void ProcessPageInfo()
 		case _LCM_AUTHORIZING:
 		case _LCM_AUTHORIZ_COMP:
 		case _LCM_AUTHORIZ_FAIL:
+		{
+			FirstPageChanged();
+		}
+			break;
 		case _LCM_WAIT_FOR_PLUG:
 		{
 			FirstPageChanged();
@@ -894,12 +898,15 @@ void ProcessPageInfo()
 					ChangeDisplay2Value(__side_down, _side_app);
 				else
 					ChangeDisplay2Value(__side_down, _side_none_app);
+
+				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 			}
 			else
 			{
 				ChangeDisplay2Value(__side_top, _disappear);
 				ChangeDisplay2Value(__side_mid, _disappear);
 				ChangeDisplay2Value(__side_down, _disappear);
+				ChangeDisplay2Value(__sel_gun_btn, _disappear);
 			}
 
 			bool isShowAc = false;

+ 30 - 2
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm.c

@@ -57,6 +57,9 @@ Rtc rtc;
 struct timeval _flash_time;
 byte flash = NO;
 
+byte _curDeviceStatus[3] = {0, 0, 0};
+byte _reCheckCount[3] = {0, 0, 0};
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -266,8 +269,33 @@ void GetInputGpioStatus()
 	//PRINTF_FUNC("GetInputGpioStatus \n");
 	if (Query_Gpio_Input(Uart1Fd, Addr.IoExtend, &gpio_in) == PASS)
 	{
-		ShmSysConfigAndInfo->SysInfo.AcContactorStatus = ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = gpio_in.AC_Connector;
-		ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec = gpio_in.AC_MainBreaker;
+		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector)
+		{
+			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;
+			}
+			else
+				_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT]++;
+		}
+		else
+			_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] = 0;
+
+
+		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] != gpio_in.AC_MainBreaker)
+		{
+			if (_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] >= 3)
+			{
+				_curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] = gpio_in.AC_MainBreaker;
+				ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec = gpio_in.AC_MainBreaker;
+			}
+			else
+				_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER]++;
+		}
+		else
+			_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] = 0;
+
 		ShmPrimaryMcuData->InputDet.bits.SpdDetec = gpio_in.SPD;
 		ShmPrimaryMcuData->InputDet.bits.DoorOpen = gpio_in.Door_Open;
 

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 356 - 327
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c


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

@@ -60,3 +60,14 @@ int connector_1[12];
 int connector_2[12];
 byte conn_1_count = 0;
 byte conn_2_count = 0;
+
+enum _PSU_CMD_SEQ
+{
+	_PSU_CMD_STATUS		= 1,
+	_PSU_CMD_VERSION	= 2,
+
+	_PSU_CMD_CAP		= 10,
+	_PSU_CMD_OUTPUT		= 11,
+	_PSU_CMD_IVAILIABLE	= 12,
+	_PSU_CMD_TEMP		= 13
+};

+ 22 - 20
EVSE/Projects/DS60-120/Apps/OutputTask.c

@@ -96,7 +96,7 @@ void ChkButtonStatus()
 
 void GetModuleCountCallback(byte group, byte count)
 {
-	printf("group = %d, count = %d \n", group, count);
+	//printf("group = %d, count = %d \n", group, count);
 	if (group == SYSTEM_CMD)
 		UnSafeDataInfo->PSU_COUNT = count;
 }
@@ -122,12 +122,12 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 
 void GetStatusCallback(byte group, byte address, byte temp, int alarm)
 {
-	printf("alarm = %d \n", alarm);
+	//printf("alarm = %d \n", alarm);
 }
 
 void GetInputVoltageCallback(byte address, unsigned short vol1, unsigned short vol2, unsigned short vol3)
 {
-	printf("vol1 = %d, vol2 = %d, vol3 = %d \n", vol1, vol2, vol3);
+	//printf("vol1 = %d, vol2 = %d, vol3 = %d \n", vol1, vol2, vol3);
 }
 
 int CreateShareMemory()
@@ -308,30 +308,32 @@ int main(void)
 			{
 				case CHARGING_MODE_START:
 				{
-					//if (!isOpen)
+					if (!isOpen)
 					{
-						//SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
-						//FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
-						SetDirModulePresentOutput(0,
-												VOLTAGE * 10,
-												CURRENT * 10,
-												0x01,
-												0x01);
+						SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
+						FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
+						isOpen = true;
+//						SetDirModulePresentOutput(0,
+//												VOLTAGE * 10,
+//												CURRENT * 10,
+//												0x01,
+//												0x01);
 					}
-					//PresentOutputVol(SYSTEM_CMD, VOLTAGE * 10, CURRENT * 10);
+					PresentOutputVol(SYSTEM_CMD, VOLTAGE * 10, CURRENT * 10);
 				}
 					break;
 				case CHARGING_MODE_TERMINATING:
 				{
-					//if (isOpen)
+					if (isOpen)
 					{
-						SetDirModulePresentOutput(0,
-							VOLTAGE * 10,
-							CURRENT * 10,
-							0x00,
-							0x01);
-						//SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
-						//FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+//						SetDirModulePresentOutput(0,
+//							VOLTAGE * 10,
+//							CURRENT * 10,
+//							0x00,
+//							0x01);
+						SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+						FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+						isOpen = false;
 					}
 				}
 					break;

+ 29 - 19
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -498,21 +498,18 @@ void SetChargingInfoCCID(char *v1, char* v2)
 	_chargingData[_index]->EVCCID[8] = '\0';
 }
 
-void SetPowerValue(char *v1, char *v2)
+void GetPowerValue()
 {
-	int _index = atoi(v1);
-	float _Current = atof(v2);
-	// 盲沖的時候才允許使用~
-	if (_chargingData[_index]->Type != 9)
-		return;
-
-	if (!FindChargingInfoData(_index, &_chargingData[0]))
+	for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
 	{
-		printf ("FindChargingInfoData error\n");
-		return;
-	}
+		if (!FindChargingInfoData(index, &_chargingData[0]))
+		{
+			printf ("FindChargingInfoData error\n");
+			return;
+		}
 
-	_chargingData[_index]->EvBatterytargetCurrent = _Current;
+		printf ("index = %d, PresentChargingPower = %f \n", index, _chargingData[index]->PresentChargingPower);
+	}
 }
 
 void GetSystemInfo()
@@ -685,7 +682,7 @@ void GetPsuInformation(char *v1, char *v2, char *v3)
 				continue;
 			}
 
-			printf("Form RB : Group Index = %d, OutputV = %f \n",
+			printf("From RB : Group Index = %d, OutputV = %f \n",
 				i, _chargingData[i]->FireChargingVoltage);
 		}
 	}
@@ -764,7 +761,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 	if (strcmp(v1, "auto") == EQUAL)
 	{
 		_usingAutoRun = 0x01;
-		_GunIndex = 0;
+		_GunIndex = atoi(v2);
 		_Voltage = 500;
 		_Current = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 1000) / _Voltage;
 	}
@@ -1195,10 +1192,8 @@ int main(void)
 		}
 		else if (strcmp(newString[0], "pow") == 0)
 		{
-			if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-				continue;
-			// cable check pass
-			SetPowerValue(newString[1], newString[2]);
+			// get output power
+			GetPowerValue();
 		}
 		else if (strcmp(newString[0], "model") == 0)
 		{
@@ -1282,12 +1277,27 @@ int main(void)
 			}
 			SetChargingInfoCCID(newString[1], newString[2]);
 		}
+		else if (strcmp(newString[0], "test") == 0)
+		{
+			printf("v = %d \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit);
+
+//			for(int i = 0; i < 2; i++)
+//			{
+//				if (!FindChargingInfoData(i, &_chargingData[0]))
+//				{
+//					printf("FindChargingInfoData error\n");
+//				}
+//				else
+//				{
+//					printf("v = %d, vv = %d \n", _chargingData[i]->SystemStatus, _chargingData[i]->IsAvailable);
+//				}
+//			}
+		}
 		else if(strcmp(newString[0], "strchg") == 0)
 		{
 			//如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
 			if (strcmp(newString[1], "auto") == 0)
 			{
-				newString[2][0] = 0;
 				newString[3][0] = 0;
 			}
 			else if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||

+ 233 - 63
EVSE/Projects/DS60-120/Apps/main.c

@@ -64,7 +64,7 @@
 
 #define 	uSEC_VAL				1000000
 #define		SELFTEST_TIMEOUT		45
-#define		AUTHORIZE_TIMEOUT		30
+#define		AUTHORIZE_TIMEOUT		15
 #define 	AUTHORIZE_COMP_TIMEOUT	3
 #define 	AUTHORIZE_FAIL_TIMEOUT	3
 #define 	AUTHORIZE_STOP_TIMEOUT	30
@@ -112,6 +112,8 @@ int DB_Open(sqlite3 *db);
 int DB_Insert_Record(sqlite3 *db, int gun_index);
 int DB_Update_Operactive(sqlite3 *db, uint8_t gun_index, uint8_t IsAvailable);
 int DB_Get_Operactive(sqlite3 *db, uint8_t gun_index);
+void InitialDHCP();
+int GetStartScheduleTime(unsigned char *time);
 
 #define DEBUG_INFO_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -151,7 +153,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "V0.16.00.0000.00";
+char* fwVersion = "V0.18.00.0000.00";
 
 sqlite3 *localDb;
 bool isDb_ready;
@@ -365,12 +367,12 @@ long long DiffTimebWithNow(struct timeb ST)
 {
 	//return milli-second
 	struct timeb ET;
-	long long StartTime,StopTime;
+	long long StartTime, StopTime;
 
 	ftime(&ET);
-	StartTime=(long long)ST.time;
-	StopTime=(long long)ET.time;
-	return ((StopTime-StartTime)*1000) + (ET.millitm-ST.millitm);
+	StartTime = (long long)ST.time;
+	StopTime = (long long)ET.time;
+	return ((StopTime - StartTime)*1000) + (ET.millitm - ST.millitm);
 }
 
 //==========================================
@@ -707,6 +709,14 @@ void InitGPIO()
 	system("echo 116 > /sys/class/gpio/export");
 	system("echo \"out\" > /sys/class/gpio/gpio116/direction");
 	system("echo 0 > /sys/class/gpio/gpio116/value");
+	/* (C14) EMU0.gpio3[7] */  /*CP open/short feature enable/disable, pull low for default enable*/
+	system("echo 103 > /sys/class/gpio/export");
+	system("echo \"out\" > /sys/class/gpio/gpio103/direction");
+	system("echo 0 > /sys/class/gpio/gpio103/value");
+	/* (B14) EMU1.gpio3[8] */  /*4G module reset, pull high to reset when entry kernel, after Application start, it should be pull low.*/
+	system("echo 104 > /sys/class/gpio/export");
+	system("echo \"out\" > /sys/class/gpio/gpio104/direction");
+	system("echo 0 > /sys/class/gpio/gpio104/value");
 #ifdef SystemLogMessage
 	DEBUG_INFO_MSG("[main]InitGPIO: Initial GPIO OK");
 #endif
@@ -881,6 +891,26 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 	return PASS;
 }
 
+int isRouteFail()
+{
+	int result = YES;
+	FILE *fp;
+	char buf[512];
+
+	fp = popen("route -n", "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if(strstr(buf, "eth0") != NULL)
+				result = NO;
+		}
+	}
+	pclose(fp);
+
+	return result;
+}
+
 int isReachableInternet()
 {
 	int result = FAIL;
@@ -889,11 +919,11 @@ int isReachableInternet()
 	char buf[512];
 	char tmp[512];
 
-	if (ShmOCPP16Data->OcppConnStatus == PASS)
-	{
-		result = PASS;
-	}
-	else
+//	if (ShmOCPP16Data->OcppConnStatus == PASS)
+//	{
+//		result = PASS;
+//	}
+//	else
 	{
 		strcpy(cmd, "ifconfig eth0");
 		fp = popen(cmd, "r");
@@ -979,6 +1009,7 @@ void InitEthernet()
 	system("rm -rf /etc/resolv.conf");
 	system("echo nameserver 8.8.8.8 > /etc/resolv.conf");		//Google DNS server
 	system("echo nameserver 180.76.76.76 > /etc/resolv.conf");	//Baidu DNS server
+	system("/sbin/ifconfig eth0 down;/sbin/ifconfig eth0 up");
 
 	if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0)
 	{
@@ -997,6 +1028,17 @@ void InitEthernet()
 	{
 		for(;;)
 		{
+			if (isRouteFail())
+			{
+				PRINTF_FUNC("eth0 not in route, restart eht0. \n");
+				system("/sbin/ifconfig eth0 down;/sbin/ifconfig eth0 up");
+
+				if (ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0)
+				{
+					InitialDHCP();
+				}
+			}
+
 			if(isReachableInternet() == PASS)
 			{
 				ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet= NO;
@@ -1013,18 +1055,54 @@ void InitEthernet()
 			bool ethResult = YES;
 
 			if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet)
-			{
 				ethResult = NO;
+			else
+			{
+				system("/sbin/ifmetric eth0 0");
+
+				if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') ||
+						(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+					system("/sbin/ifmetric mlan0 1");
+
+				if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') ||
+						(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+					system("/sbin/ifmetric ppp0 2");
 			}
 
-			if (!ethResult && ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
+			if (!ethResult &&
+					(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W' || ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
 			{
 				ethResult = !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi;
+
+				if (ethResult)
+				{
+					if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+					{
+						system("/sbin/ifmetric eth0 1");
+						system("/sbin/ifmetric mlan0 0");
+					}
+
+					if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+						system("/sbin/ifmetric ppp0 2");
+				}
 			}
 
-			if (!ethResult && ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
+			if (!ethResult &&
+					(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T' || ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
 			{
 				ethResult = !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi;
+
+				if (ethResult)
+				{
+					if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+						system("/sbin/ifmetric mlan0 2");
+
+					if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D'))
+					{
+						system("/sbin/ifmetric eth0 1");
+						system("/sbin/ifmetric ppp0 0");
+					}
+				}
 			}
 
 			ShmSysConfigAndInfo->SysInfo.InternetConn = ethResult;
@@ -1034,7 +1112,7 @@ void InitEthernet()
 	}
 
 	#ifdef SystemLogMessage
-	DEBUG_INFO_MSG("[main]InitEthernet: Initial Ethernet OK");
+	DEBUG_INFO_MSG("[main]InitEthernet: Initial Ethernet OK. \n");
 	#endif
 }
 
@@ -1366,35 +1444,38 @@ bool InitialSystemDefaultConfig()
 	return result;
 }
 
-void DisplaySelfTestFailReason()
+bool DisplaySelfTestFailReason()
 {
+	bool result = false;
 	// RB、FB、407、EV 小板中有些板子無回應
 	if (ShmRelayModuleData->SelfTest_Comp == NO)
-	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail = YES; }
+	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail = YES; result = true; }
 	if (ShmFanModuleData->SelfTest_Comp == NO)
-	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail = YES; }
+	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail = YES; result = true; }
 	if (ShmPrimaryMcuData->SelfTest_Comp == NO)
-	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = YES; }
+	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = YES; result = true; }
 //	if (ShmLedModuleData->SelfTest_Comp == NO)
 //	{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES; }
+	if (ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm == YES)
+	{ result = true; }
 	for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
 	{
 		if (chargingInfo[index]->Type == _Type_Chademo)
 		{
 			if (ShmCHAdeMOData->evse[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-			{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoboardStestFail = YES; }
+			{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoboardStestFail = YES; result = true; }
 		}
 		else if (chargingInfo[index]->Type == _Type_GB)
 		{
 			if (ShmGBTData->evse[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-			{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtboardStestFail = YES; }
+			{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtboardStestFail = YES; result = true; }
 		}
 		else if (chargingInfo[index]->Type == _Type_CCS_2)
 		{
 			if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 			{
 				if (ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-				{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CCSboardStestFail = YES; }
+				{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CCSboardStestFail = YES; result = true; }
 			}
 		}
 	}
@@ -1402,19 +1483,23 @@ void DisplaySelfTestFailReason()
 	{
 		// 先借 GBT 顯示
 		if (ac_chargingInfo[index]->SelfTest_Comp == NO)
-		{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcConnectorStestFail = YES; }
+		{ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcConnectorStestFail = YES; result = true; }
 	}
 
 	if (ShmSysConfigAndInfo->SysInfo.AcContactorStatus == NO)
 	{
 		// AC Contact 未搭上
 		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = YES;
+		result = true;
 	}
 	else if (ShmPsuData->SystemAvailablePower <= 0 && ShmPsuData->SystemAvailableCurrent <= 0)
 	{
 		// PSU 通訊問題
 		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail = YES;
+		result = true;
 	}
+
+	return result;
 }
 
 void SelfTestRun()
@@ -1423,7 +1508,8 @@ void SelfTestRun()
 
 	StartSystemTimeoutDet(Timeout_SelftestChk);
 	ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_VERSION;
-	while (ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE)
+	while (ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE ||
+			GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) / uSEC_VAL <= 20)
 	{
 		ChkPrimaryStatus();
 		if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
@@ -1700,6 +1786,14 @@ bool isEvBoardStopChargeFlag(byte gunIndex)
 void ClearDetectPluginFlag()
 {
 	ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+	for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
+	{
+		if (chargingInfo[gun_index]->RemoteStartFlag == YES)
+			chargingInfo[gun_index]->RemoteStartFlag = NO;
+	}
+
+	if (ShmSysConfigAndInfo->SysInfo.OrderCharging != NO_DEFINE)
+		ShmSysConfigAndInfo->SysInfo.OrderCharging = NO_DEFINE;
 }
 
 void DetectPluginStart()
@@ -1956,9 +2050,12 @@ bool canStartCharging()
 		sprintf(buf2 + (index - 1) * 2, "%02X",	ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status[index]);
 	}
 	sprintf(buf2, "%s",	ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
+	//printf("ExpiryDate = %s \n", ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
+	//printf("ParentIdTag = %s \n", ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
+	int _time = GetStartScheduleTime(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
 
 	// 因為無法得知實際的長度,所以只能用搜尋的方式
-	if(strcmp(buf2, "Accepted") == EQUAL)
+	if(strcmp(buf2, "Accepted") == EQUAL && _time < -5)
 		return true;
 	else
 	{
@@ -2380,7 +2477,8 @@ void ChkPrimaryStatus()
 					break;
 				case S_CHARGING:
 				{
-					if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
+					if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE &&
+							chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->isRemoteStart == NO)
 					{
 						// 停止充電
 						ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
@@ -2727,6 +2825,7 @@ void SetBitValue(unsigned char *_byte, unsigned char _bit, unsigned char value)
 void UserScanFunction()
 {
 	bool idleReq = false;
+	unsigned char idleIndex = 255;
 	unsigned char stopReq = 255;
 
 	// 當前非驗證的狀態
@@ -2747,10 +2846,11 @@ void UserScanFunction()
 			{
 				stopReq = i;
 			}
-			if ((chargingInfo[i]->SystemStatus == S_IDLE && chargingInfo[i]->IsAvailable) == YES ||
-					(_acgunIndex > 0 && ac_chargingInfo[0]->SystemStatus == S_IDLE && ac_chargingInfo[0]->IsAvailable))
+			if ((chargingInfo[i]->SystemStatus == S_IDLE && chargingInfo[i]->IsAvailable == YES) ||
+					(_acgunIndex > 0 && ac_chargingInfo[0]->SystemStatus == S_IDLE && ac_chargingInfo[0]->IsAvailable == YES))
 			{
 				idleReq = true;
+				idleIndex = i;
 			}
 		}
 
@@ -2797,18 +2897,19 @@ void UserScanFunction()
 				}
 				else
 				{
-					// 進驗證
-					if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX)
-					{
-						_authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
-					}
-					else
-					{
-						_authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
-					}
-
-					StartSystemTimeoutDet(Timeout_AuthorizingForStop);
-					AuthorizingStart();
+					strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+//					// 進驗證
+//					if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX)
+//					{
+//						_authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
+//					}
+//					else
+//					{
+//						_authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
+//					}
+//
+//					StartSystemTimeoutDet(Timeout_AuthorizingForStop);
+//					AuthorizingStart();
 				}
 			}
 			else if (idleReq)
@@ -2821,7 +2922,7 @@ void UserScanFunction()
 					strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
 				}
 				else if ((_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
-						chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE)
+						(idleIndex != 255 && chargingInfo[idleIndex]->SystemStatus == S_IDLE))
 				{
 					PRINTF_FUNC("// LCM => Authorizing \n");
 					// LCM => Authorizing
@@ -4041,7 +4142,7 @@ void ChkOcppStatus(byte gunIndex)
 	if (ShmOCPP16Data->CsMsg.bits[gunIndex].UnlockConnectorReq == YES)
 	{
 		ShmOCPP16Data->CsMsg.bits[gunIndex].UnlockConnectorReq = NO;
-		if (chargingInfo[gunIndex]->SystemStatus >= S_REASSIGN_CHECK ||
+		if (chargingInfo[gunIndex]->SystemStatus >= S_REASSIGN_CHECK &&
 				chargingInfo[gunIndex]->SystemStatus <= S_CHARGING)
 		{
 			// 充電中,需停止充電
@@ -4149,6 +4250,11 @@ int DB_Open(sqlite3 *db)
 				       "`connector` INTEGER NOT NULL, "
 					   "`val` TEXT NOT NULL, unique(IsAvailable,connector) on conflict replace);";
 
+	char* createrecordSql="CREATE TABLE IF NOT EXISTS `event_record` ( "
+						   "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
+						   "`occurDatetime` TEXT NOT NULL, "
+					       "`statusCode` INTEGER NOT NULL, unique(occurDatetime,statusCode) on conflict replace);";
+
 	if(sqlite3_open(DB_FILE, &db))
 	{
 		result = FAIL;
@@ -4179,6 +4285,16 @@ int DB_Open(sqlite3 *db)
 			PRINTF_FUNC( "Opened local config table successfully\n");
 		}
 
+		if (sqlite3_exec(db, createrecordSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			PRINTF_FUNC( "Create local record table error message: %s\n", errMsg);
+		}
+		else
+		{
+			PRINTF_FUNC( "Opened local record table successfully\n");
+		}
+
 		sqlite3_close(db);
 	}
 
@@ -4193,26 +4309,26 @@ int DB_Insert_Record(sqlite3 *db, int gun_index)
 
 	sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
 					   "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId,
+					   chargingInfo[gun_index]->ReservationId,
 					   ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartDateTime,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StopDateTime,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
-					   ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy,
+					   chargingInfo[gun_index]->StartMethod,
+					   chargingInfo[gun_index]->StartUserId,
+					   chargingInfo[gun_index]->StartDateTime,
+					   chargingInfo[gun_index]->StopDateTime,
+					   chargingInfo[gun_index]->EvBatteryStartSoc,
+					   chargingInfo[gun_index]->EvBatterySoc,
+					   chargingInfo[gun_index]->PresentChargedEnergy,
 					   ShmOCPP16Data->StopTransaction[gun_index].StopReason);
 
-	if(sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db))
+	if(sqlite3_open(DB_FILE, &db))
 	{
 		result = FAIL;
-		PRINTF_FUNC( "Can't open database: %s\r\n", sqlite3_errmsg(db));
+		PRINTF_FUNC( "Can't open database: %s\n", sqlite3_errmsg(db));
 		sqlite3_close(db);
 	}
 	else
 	{
-		PRINTF_FUNC( "Local charging record database open successfully.\r\n");
+		PRINTF_FUNC( "Local charging record database open successfully.\n");
 		if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
 		{
 			result = FAIL;
@@ -4222,6 +4338,18 @@ int DB_Insert_Record(sqlite3 *db, int gun_index)
 		{
 			PRINTF_FUNC( "Insert local charging record successfully\n");
 		}
+
+		sprintf(insertSql, "delete from charging_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
+		if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			PRINTF_FUNC( "delete local charging error message: %s\n", errMsg);
+		}
+		else
+		{
+			PRINTF_FUNC( "delete local charging record successfully\n");
+		}
+
 		sqlite3_close(db);
 	}
 
@@ -4417,7 +4545,9 @@ void CheckIsAlternatvieByModelName()
 	if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWWU301J0UT1PH") == EQUAL ||
 		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYE301J0ET1PH") == EQUAL ||
 		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DSYE301J3EW2PH") == EQUAL ||
-		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UW1PH") == EQUAL)
+		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UW1PH") == EQUAL ||
+		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UD1PH") == EQUAL ||
+		strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYE301J0ED1PH") == EQUAL)
 		ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf = YES;
 	else
 		ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf = NO;
@@ -4518,6 +4648,15 @@ void CheckTask()
 	}
 }
 
+void InitialDHCP()
+{
+	char tmpbuf[256];
+	memset(tmpbuf,0,256);
+	system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
+	sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
+	system(tmpbuf);
+}
+
 //==========================================
 // Check Smart Charging Profile
 //==========================================
@@ -4531,6 +4670,7 @@ int GetStartScheduleTime(unsigned char *time)
 	{
 		tmScheduleStart.tm_year -= 1900;
 		tmScheduleStart.tm_mon -= 1;
+
 		tbScheduleStart.time = mktime(&tmScheduleStart);
 		tbScheduleStart.millitm = 0;
 
@@ -4560,10 +4700,13 @@ void CheckSmartChargeProfile(byte _index)
 			for (byte _count = 0; _count < _maxCount; _count++)
 			{
 				// 預設最小輸出電流 (MIN_OUTPUT_CUR) A
-				if (_time >= ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].StartPeriod &&
-						ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].Limit > MIN_OUTPUT_CUR)
+				if (_time >= ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].StartPeriod)
 				{
-					_startCount = _count;
+					if ((_count == 0 && ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].Limit >= MIN_OUTPUT_CUR) ||
+							ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].Limit > MIN_OUTPUT_CUR)
+					{
+						_startCount = _count;
+					}
 				}
 			}
 
@@ -4718,6 +4861,7 @@ int main(void)
 		StopProcessingLoop();
 	}
 
+	PRINTF_FUNC("SW Version = %s \n", fwVersion);
 	PRINTF_FUNC("Chademo = %d, CCS = %d, GB = %d, AC = %d \n",
 			CHAdeMO_QUANTITY, CCS_QUANTITY, GB_QUANTITY, AC_QUANTITY);
 	PRINTF_FUNC("CheckConnectorTypeStatus. \n");
@@ -4752,10 +4896,21 @@ int main(void)
 	StopSystemTimeoutDet();
 	PRINTF_FUNC("SelfTestSeq = %d, Work_Step = %d \n", ShmSysConfigAndInfo->SysInfo.SelfTestSeq, ShmPsuData->Work_Step);
 	if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq == _STEST_FAIL ||
-			ShmPsuData->Work_Step == _NO_WORKING)
+			ShmPsuData->Work_Step == _NO_WORKING ||
+			ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm == YES)
 	{
 		if (ShmSysConfigAndInfo->SysWarningInfo.Level != 2)
-			DisplaySelfTestFailReason();
+		{
+			if (!DisplaySelfTestFailReason())
+			{
+				PRINTF_FUNC("Soft reboot for retry self-tets. \n");
+				sleep(3);
+				system("killall OcppBackend &");
+				KillTask();
+				system("/usr/bin/run_evse_restart.sh");
+				StopProcessingLoop();
+			}
+		}
 
 		for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
 		{
@@ -4885,7 +5040,10 @@ int main(void)
 						setChargerMode(gun_index, MODE_ALARM);
 					}
 					else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING)
-					{/* 							不給充電							*/}
+					{/* 							不給充電							*/
+						if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+								ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_IDLE;
+					}
 					else
 					{
 						if (ShmSysConfigAndInfo->SysInfo.SystemPage == _LCM_FIX)
@@ -4941,6 +5099,7 @@ int main(void)
 									{
 										PRINTF_FUNC("-----------------1----------------- %d \n", gun_index);
 										chargingInfo[gun_index]->RemoteStartFlag = NO;
+										chargingInfo[gun_index]->isRemoteStart = YES;
 										ChangeGunSelectByIndex(gun_index);
 										AddPlugInTimes(gun_index);
 										setChargerMode(gun_index, MODE_REASSIGN_CHECK);
@@ -5206,7 +5365,7 @@ int main(void)
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					{
 						// 檢查樁端的 GFD 結果
-						if (isPrechargeStatus_gb(gun_index) > 5 && isPrechargeStatus_gb(gun_index) < 9)
+						if (isPrechargeStatus_gb(gun_index) > 9)
 						{
 							setChargerMode(gun_index, MODE_CHARGING);
 						}
@@ -5364,7 +5523,9 @@ int main(void)
 						if (isEvStopCharging_chademo(gun_index) == YES)
 						{
 							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+							{
 								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+							}
 						}
 
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
@@ -5391,7 +5552,9 @@ int main(void)
 						if (isEvStopCharging_chademo(gun_index) == YES)
 						{
 							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-									strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+							{
+								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+							}
 						}
 
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
@@ -5417,7 +5580,9 @@ int main(void)
 						if (isEvStopCharging_chademo(gun_index) == YES)
 						{
 							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-									strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+							{
+								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+							}
 						}
 
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
@@ -5441,7 +5606,9 @@ int main(void)
 
 					// 車端的停止
 					if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+					{
 						strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+					}
 
 					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
 						ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_COMPLETE;
@@ -5460,9 +5627,12 @@ int main(void)
 						if (chargingInfo[gun_index]->PresentChargedDuration != 0)
 							chargingInfo[gun_index]->PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index]);
 
+						chargingInfo[gun_index]->isRemoteStart = NO;
+
 						StopGunInfoTimeoutDet(gun_index);
 						StartGunInfoTimeoutDet(gun_index, Timeout_EvseCompleteDet);
 						ChangeStartOrStopDateTime(NO, gun_index);
+						DB_Insert_Record(localDb, gun_index);
 					}
 
 					if(chargingInfo[gun_index]->ConnectorPlugIn == NO &&

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác