소스 검색

Merge remote-tracking branch 'origin/DS60-120'

Folus Wen 2 년 전
부모
커밋
704ec08e3d
31개의 변경된 파일2348개의 추가작업 그리고 783개의 파일을 삭제
  1. 98 9
      EVSE/Projects/DS60-120/Apps/Config.h
  2. BIN
      EVSE/Projects/DS60-120/Apps/FactoryConfig
  3. 42 96
      EVSE/Projects/DS60-120/Apps/FactoryConfig.c
  4. 8 5
      EVSE/Projects/DS60-120/Apps/Makefile
  5. BIN
      EVSE/Projects/DS60-120/Apps/Module_EvComm
  6. 226 134
      EVSE/Projects/DS60-120/Apps/Module_EvComm.c
  7. 2 0
      EVSE/Projects/DS60-120/Apps/Module_EvComm.h
  8. BIN
      EVSE/Projects/DS60-120/Apps/Module_EventLogging
  9. BIN
      EVSE/Projects/DS60-120/Apps/Module_InternalComm
  10. 34 14
      EVSE/Projects/DS60-120/Apps/Module_InternalComm.c
  11. 18 15
      EVSE/Projects/DS60-120/Apps/Module_LcmContro.h
  12. BIN
      EVSE/Projects/DS60-120/Apps/Module_LcmControl
  13. 642 84
      EVSE/Projects/DS60-120/Apps/Module_LcmControl.c
  14. BIN
      EVSE/Projects/DS60-120/Apps/Module_PrimaryComm
  15. 143 29
      EVSE/Projects/DS60-120/Apps/Module_PrimaryComm.c
  16. BIN
      EVSE/Projects/DS60-120/Apps/Module_PsuComm
  17. 133 74
      EVSE/Projects/DS60-120/Apps/Module_PsuComm.c
  18. 7 1
      EVSE/Projects/DS60-120/Apps/Module_PsuComm.h
  19. BIN
      EVSE/Projects/DS60-120/Apps/Module_SmartBox
  20. 94 49
      EVSE/Projects/DS60-120/Apps/Module_SmartBox.c
  21. 2 1
      EVSE/Projects/DS60-120/Apps/Module_SmartBox.h
  22. BIN
      EVSE/Projects/DS60-120/Apps/ReadCmdline
  23. 245 39
      EVSE/Projects/DS60-120/Apps/ReadCmdline.c
  24. BIN
      EVSE/Projects/DS60-120/Apps/UnsafetyOutputTask
  25. 1 1
      EVSE/Projects/DS60-120/Apps/internalComm.c
  26. 96 0
      EVSE/Projects/DS60-120/Apps/lcmComm_dgus.c
  27. 85 0
      EVSE/Projects/DS60-120/Apps/lcmComm_dgus.h
  28. BIN
      EVSE/Projects/DS60-120/Apps/main
  29. 472 232
      EVSE/Projects/DS60-120/Apps/main.c
  30. BIN
      EVSE/Projects/DS60-120/Images/FactoryDefaultConfig.bin
  31. BIN
      EVSE/Projects/DS60-120/Images/ramdisk.gz

+ 98 - 9
EVSE/Projects/DS60-120/Apps/Config.h

@@ -187,6 +187,8 @@ enum _UPDATE_TYPE
 
 	_UPDATE_TYPE_CHADEMO 		= 0x1000000B,
 	_UPDATE_TYPE_GBT			= 0x1000000C,
+
+	_UPDATE_TYPE_DWIN_LCM		= 0x1000000F,
 };
 
 enum _CCS_COMM_PROTOCOL
@@ -235,7 +237,6 @@ enum _PSU_PROTOCOL_TYPE
 	_PSU_PROTOCOL_UU					= 1
 };
 
-
 enum _PSU_USING_TARGET
 {
 	_PSU_USING_TARGET_CON1		= 0x00,
@@ -266,7 +267,7 @@ enum _PSU_DYNAMIC_RELEASE_STEP
 	_PSU_DYNAMIC_RELEASE_STEP_NONE			= 0x00,
 	_PSU_DYNAMIC_RELEASE_STEP_WAIT			= 0x01,
 	_PSU_DYNAMIC_RELEASE_STEP_LIMIT			= 0x02,
-	_PSU_DYNAMIC_RELEASE_STEP_PWROFF		= 0x03,
+	_PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE		= 0x03,
 	_PSU_DYNAMIC_RELEASE_STEP_RELAYOFF		= 0x04,
 	_PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH 	= 0x05,
 	_PSU_DYNAMIC_RELEASE_STEP_FINISH		= 0x06,
@@ -283,9 +284,9 @@ enum _PSU_GROUP_INDEX
 
 enum _RELAY_SWITCH_NAME
 {
-	_RELAY_SWITCH_NAME_R3			= 0x00,
-	_RELAY_SWITCH_NAME_R4			= 0x01,
-	_RELAY_SWITCH_NAME_R5			= 0x02,
+	_RELAY_SWITCH_NAME_R3		= 0x00,
+	_RELAY_SWITCH_NAME_R4		= 0x01,
+	_RELAY_SWITCH_NAME_R5		= 0x02,
 };
 
 struct StructMeter
@@ -325,7 +326,9 @@ struct ConnectorBalanceInfo
 
 struct BalanceInfo
 {
-	unsigned int defaultPrice;
+	//CTEP
+	char defaultPrice[250];
+	unsigned int defaultPrice_Noodoe;
 	struct ConnectorBalanceInfo connectorBalanceInfo[3]; // Max count : DC * 2 + AC * 1
 };
 
@@ -336,6 +339,30 @@ struct ChademoTryCommunicationKey
 	byte elapsedTime;
 };
 
+struct GbtVincodeInfo
+{
+	byte packageCount;
+	int dataLen;
+	byte data[18];
+	byte checksum;
+};
+
+struct CdfaInfor
+{
+	double _ctepEnergyCost;
+	double _ctepParkingFee;
+	double _ctepTotalCost;
+
+	// 2.0 Needed
+	byte _preTimestamp[36];
+	float _preOutputEnergy;
+	float _prekWhPrice;
+	float _prehourPrice;
+	double _preEnergyCost;
+	double _preParkingFee;
+	byte _preQrCodeText[1024];
+};
+
 enum _CCS_VERSION_CHECK_TAG
 {
 	_CCS_VERSION_CHECK_TAG_V015S0		= 0,
@@ -413,6 +440,51 @@ enum _TPC_PLUG_DETECT_STATUS
 	_TPC_PLUG_DETECT_STATUS_WAIT		= 0x01,
 };
 
+enum VERIFY_MECHANISM
+{
+	VERIFY_MECHANISM_RFID 		= 0,
+	VERIFY_MECHANISM_BAZEL8		= 1,
+	VERIFY_MECHANISM_ENEGATE	= 2
+};
+
+enum _LCM_UPGRADE_RESULT
+{
+	_LCM_UPGRADE_RESULT_WAIT	= 0,
+	_LCM_UPGRADE_RESULT_PASS,
+	_LCM_UPGRADE_RESULT_FAIL,
+};
+
+enum _DC_METER_TRANSACTION_ACTION
+{
+	_DC_METER_TRANSACTION_ACTION_NONE	= 0,
+	_DC_METER_TRANSACTION_ACTION_START,
+	_DC_METER_TRANSACTION_ACTION_STOP,
+};
+
+enum _OCMF_INFO_READY_FLAG
+{
+	_OCMF_INFO_READY_NO					= 0,
+	_OCMF_INFO_READY_YES,
+	_OCMF_INFO_READY_FAIL
+};
+
+enum _CDFA_VERSION
+{
+	_CDFA_VERSION_NONE = 	0,
+	_CDFA_VERSION_NOODOE = 	1,
+	_CDFA_VERSION_10 = 		2,
+	_CDFA_VERSION_20 = 		3
+};
+
+enum _TILT_SENSOR_STEP
+{
+	_TILT_SENSOR_STEP_NONE 			= 0x00,
+	_TILT_SENSOR_STEP_PIN_ON 		= 0x01,
+	_TILT_SENSOR_STEP_PIN_WAIT 		= 0x02,
+	_TILT_SENSOR_STEP_PIN_OFF 		= 0x03,
+	_TILT_SENSOR_STEP_PIN_FINISH	= 0x04,
+};
+
 typedef union
 {
     unsigned int GunErrMessage;
@@ -551,10 +623,27 @@ struct DcCommonInformation
 	// offline power - LW_OfflinePower
 	int _offlinePower;
 
+	// Verified by GBT Vincode
+	struct GbtVincodeInfo gbtVincodeInfo[DC_CONNECTOR_COUNT];
+
+	// LCM upgrade
+	byte _upgrade_lcm_flag;
+	byte _upgrade_lcm_result;
+
 	// CTEP : California Type Evaluation Program
-	double _ctepEnergyCost [DC_CONNECTOR_COUNT];
-	double _ctepParkingFee [DC_CONNECTOR_COUNT];
-	double _ctepTotalCost [DC_CONNECTOR_COUNT];
+	byte _useVersion;
+	struct CdfaInfor cdfaInfor[DC_CONNECTOR_COUNT + AC_CONNECTOR_COUNT];
+
+	// Tilt sensor step
+	byte _tiltSensorStep;
+
+	// Ocmf Record resend
+	int ocmfTridRecord[DC_CONNECTOR_COUNT];
+
+	// OCTT
+	char stopSessionIndex;
+
+	char remoteStartAuthFlag[DC_CONNECTOR_COUNT];
 
 	byte for_alston_test_1;
 	byte for_alston_test_2;

BIN
EVSE/Projects/DS60-120/Apps/FactoryConfig


+ 42 - 96
EVSE/Projects/DS60-120/Apps/FactoryConfig.c

@@ -111,7 +111,15 @@ void CustomChange(char *custom)
 	{
 		// Noodoe (Shell)
 		SysConfig.isAPP = 0;
+		strcpy((char *) SysConfig.OcppServerURL, "wss://ocpp.noodoe.com");
+		SysConfig.AthInterface.WifiMode = 1;
+		strcpy((char *) SysConfig.AthInterface.WifiSsid, "NoodoeEV-LTE");
+		strcpy((char *) SysConfig.AthInterface.WifiPassword, "LTE4NoodoeEV");
 	}
+	else if (strcmp(custom, "BE") == EQUAL)
+	{
+		SysConfig.AuthorisationMode = AUTH_MODE_DISABLE;
+		}
 	else if (strcmp(custom, "CL") == EQUAL)
 	{
 		// ChargeLab
@@ -248,7 +256,7 @@ int main(int argc,char *argv[])
 	SysConfig.OfflineMaxChargeDuration = 0;
 	strcpy((char *) SysConfig.OcppServerURL, "");
 	strcpy((char *) SysConfig.ChargeBoxId, "");
-	strcpy((char *) SysConfig.MaintainServerURL, "wss://ocpp.phihong.com.tw:2013/");
+	//strcpy((char *) SysConfig.MaintainServerURL, "wss://ocpp.phihong.com.tw:2013/");
 	SysConfig.LedInfo.Intensity = 2;
 
 	// ********** «È»s¤Æ ********** //
@@ -311,111 +319,49 @@ int main(int argc,char *argv[])
 	/*
 	 * Configuration bin file generate
 	*/
-	if((outType&OUTPUT_FILE) > 0)
-	{
-		//fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT);
-		fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT | O_TRUNC);
-		if (fd < 0)
-		{
-			StoreLogMsg("[FactoryConfig]main: open /mnt/FactoryDefaultConfig.bin NG");
-			free(ptr);
-			return 0;
-		}
-		wrd=write(fd, ptr, MtdBlockSize);
-		close(fd);
-		if(wrd<MtdBlockSize)
-		{
-			StoreLogMsg("write /mnt/FactoryDefaultConfig.bin NG\r\n");
-			free(ptr);
-			return 0;
-		}
-		StoreLogMsg("FactoryConfig write to file in /mnt OK.\r\n");
 
-		/* * Flash memory write */
-		if((outType&OUTPUT_FLASH)>0)
-		{
-			StoreLogMsg("Erase /dev/mtd10.\n");
-			runShellCmd("flash_erase /dev/mtd10 0 0");
-			StoreLogMsg("Write /dev/mtd10.\n");
-			runShellCmd("nandwrite -p /dev/mtd10 /mnt/FactoryDefaultConfig.bin");
-
-			StoreLogMsg("Erase /dev/mtd11.\n");
-			runShellCmd("flash_erase /dev/mtd11 0 0");
-			StoreLogMsg("Write /dev/mtd11.\n");
-			runShellCmd("nandwrite -p /dev/mtd11 /mnt/FactoryDefaultConfig.bin");
-
-			StoreLogMsg("Erase /dev/mtd12.\n");
-			runShellCmd("flash_erase /dev/mtd12 0 0");
-			StoreLogMsg("Write /dev/mtd12.\n");
-			runShellCmd("nandwrite -p /dev/mtd12 /mnt/FactoryDefaultConfig.bin");
-
-			system("rm -f /mnt/FactoryDefaultConfig.bin");
-
-			StoreLogMsg("FactoryConfig write to flash OK\n");
-		}
+	//fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT);
+	fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT | O_TRUNC);
+	if (fd < 0)
+	{
+		StoreLogMsg("[FactoryConfig]main: open /mnt/FactoryDefaultConfig.bin NG");
+		free(ptr);
+		return 0;
+	}
+	wrd=write(fd, ptr, MtdBlockSize);
+	close(fd);
+	if(wrd<MtdBlockSize)
+	{
+		StoreLogMsg("write /mnt/FactoryDefaultConfig.bin NG\r\n");
 		free(ptr);
+		return 0;
 	}
+	StoreLogMsg("FactoryConfig write to file in /mnt OK.\r\n");
 
-	/*
-	* Flash memory write
-	*/
+	/* * Flash memory write */
 	if((outType&OUTPUT_FLASH)>0)
 	{
-		// Save factory default setting value to flash factory default setting block
-		fd = open("/dev/mtdblock12", O_RDWR);
-		if (fd < 0)
-		{
-			StoreLogMsg("open /dev/mtdblock12 NG\r\n");
-			free(ptr);
-			return 0;
-		}
-		wrd=write(fd, ptr, MtdBlockSize);
-		close(fd);
-		if(wrd<MtdBlockSize)
-		{
-			StoreLogMsg("write /dev/mtdblock12 NG\r\n");
-			free(ptr);
-			return 0;
-		}
+		StoreLogMsg("Erase /dev/mtd10.\n");
+		runShellCmd("flash_erase /dev/mtd10 0 0");
+		StoreLogMsg("Write /dev/mtd10.\n");
+		runShellCmd("nandwrite -p /dev/mtd10 /mnt/FactoryDefaultConfig.bin");
 
-		// Save factory default setting value to flash backup setting block
-		fd = open("/dev/mtdblock11", O_RDWR);
-		if (fd < 0)
-		{
-			StoreLogMsg("open /dev/mtdblock11 NG\r\n");
-			free(ptr);
-			return 0;
-		}
-		wrd=write(fd, ptr, MtdBlockSize);
-		close(fd);
-		if(wrd<MtdBlockSize)
-		{
-			StoreLogMsg("write /dev/mtdblock11 NG\r\n");
-			free(ptr);
-			return 0;
-		}
+		StoreLogMsg("Erase /dev/mtd11.\n");
+		runShellCmd("flash_erase /dev/mtd11 0 0");
+		StoreLogMsg("Write /dev/mtd11.\n");
+		runShellCmd("nandwrite -p /dev/mtd11 /mnt/FactoryDefaultConfig.bin");
 
-		// Save factory default setting value to flash setting block
-		fd = open("/dev/mtdblock10", O_RDWR);
-		if (fd < 0)
-		{
-			StoreLogMsg("open /dev/mtdblock10 NG\r\n");
-			free(ptr);
-			return 0;
-		}
-		wrd=write(fd, ptr, MtdBlockSize);
-		close(fd);
-		if(wrd<MtdBlockSize)
-		{
-			StoreLogMsg("write /dev/mtdblock10 NG\r\n");
-			free(ptr);
-			return 0;
-		}
-		StoreLogMsg("FactoryConfig write to flash OK\r\n");
-	}
+		StoreLogMsg("Erase /dev/mtd12.\n");
+		runShellCmd("flash_erase /dev/mtd12 0 0");
+		StoreLogMsg("Write /dev/mtd12.\n");
+		runShellCmd("nandwrite -p /dev/mtd12 /mnt/FactoryDefaultConfig.bin");
 
-	free(ptr);
+		system("rm -f /mnt/FactoryDefaultConfig.bin");
+
+		StoreLogMsg("FactoryConfig write to flash OK\n");
+	}
 
+	free ( ptr );
 	return FAIL;
 }
 

+ 8 - 5
EVSE/Projects/DS60-120/Apps/Makefile

@@ -9,6 +9,7 @@ Internal485ProtocolLib = -L ../../../Modularization/Internal485Protocol -lIntern
 Lib_Module_RFID = "-L../../../Modularization" -lModule_RFID
 Lib_Module_Upgrade = "-L../../../Modularization" -lModule_Upgrade
 Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
+Lib_JSON = "-L../../../Modularization/ocppfiles" -ljson-c
 
 all: CopyFile apps
 #apps: Module_CSU Module_EvComm Module_EventLogging Module_InternalComm Module_LcmControl Module_PrimaryComm Module_PsuComm 
@@ -18,10 +19,10 @@ apps: MainTask EvCommTask EventLoggingTask InternalCommTask LcmControlTask Prima
 MainTask:
 	rm -f *.o
 	rm -f main;
-	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
-	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -O0 -g3 -Wall -c -fmessage-length=0 -o CheckSystemTask.o CheckSystemTask.c
-	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
-	$(CC) -lrt -o main main.o CheckSystemTask.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3}	
+	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
+	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h -O0 -g3 -Wall -c -fmessage-length=0 -o CheckSystemTask.o CheckSystemTask.c
+	$(CC) -D $(Project) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_Upgrade.h -include../../../Modularization/Module_RFID.h -include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
+	$(CC) -lrt -o main main.o CheckSystemTask.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} ${Lib_JSON}	
 	cp -f main ../Images/root
 
 EvCommTask:
@@ -46,8 +47,10 @@ InternalCommTask:
 	
 LcmControlTask:
 	rm -f Module_LcmControl; 
+	$(CC) -D $(Project) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o lcmComm_dgus.o lcmComm_dgus.c
+	$(CC) -D $(Project) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o cbmp.o cbmp.c
 	$(CC) -D $(Project) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_LcmControl.o Module_LcmControl.c
-	$(CC) -lrt -o Module_LcmControl Module_LcmControl.o
+	$(CC) -lrt -o Module_LcmControl Module_LcmControl.o cbmp.o lcmComm_dgus.o
 	cp -f Module_LcmControl ../Images/root			
 
 PrimaryCommTask:

BIN
EVSE/Projects/DS60-120/Apps/Module_EvComm


+ 226 - 134
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -2904,7 +2904,7 @@ void CANReceiver()
 						}
 
 						_chargingData[targetGun]->ConnectorPlugIn = frame.data[0];
-						_chargingData[targetGun]->PilotVoltage = frame.data[1];
+						_chargingData[targetGun]->PilotState = frame.data[1];
 
 						//PRINTF_FUNC("index = %d, ConnectorPlugIn = %x, data[0] = %x \n", targetGun, _chargingData[targetGun]->ConnectorPlugIn, frame.data[0]);
 						//PRINTF_FUNC("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
@@ -2962,13 +2962,13 @@ void CANReceiver()
 						break;
 					case EV_Command_GetOutputReq:
 					{
-						if ((_chargingData[targetGun]->SystemStatus >= SYS_MODE_PREPARE_FOR_EVSE &&
-								_chargingData[targetGun]->SystemStatus <= SYS_MODE_CHARGING) ||
+						if ((_chargingData[targetGun]->SystemStatus >= SYS_MODE_PREPARE_FOR_EV &&
+								_chargingData[targetGun]->SystemStatus <= SYS_MODE_TERMINATING) ||
 								(_chargingData[targetGun]->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 &&
 								_chargingData[targetGun]->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
 						{
 							if (frame.data[1] > _chargingData[targetGun]->EvBatterySoc ||
-									_chargingData[targetGun]->SystemStatus == SYS_MODE_CHARGING)
+									(_chargingData[targetGun]->SystemStatus >= SYS_MODE_CHARGING && _chargingData[targetGun]->SystemStatus <= SYS_MODE_COMPLETE))
 								_chargingData[targetGun]->EvBatterySoc = frame.data[1];
 						}
 
@@ -3045,7 +3045,7 @@ void CANReceiver()
 					case EV_Command_GetMiscellaneous:
 					{
 						_chargingData[targetGun]->GunLocked = frame.data[0];
-						_chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
+						_chargingData[targetGun]->PilotVoltage = (float)(-12 + frame.data[3]) / 10;
 
 						ShmDcCommonData->ConnectorTemp1[targetGun] = frame.data[1];
 						ShmDcCommonData->ConnectorTemp2[targetGun] = frame.data[2];
@@ -3093,8 +3093,10 @@ void CANReceiver()
 							{
 								if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 								{
-									memset(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID, 0, sizeof(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID));
-									memcpy(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID, frame.data, frame.can_dlc);
+									memset(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID,
+									        0, sizeof(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID));
+									memcpy( ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID,
+									        frame.data, frame.can_dlc);
 								}
 							}
 
@@ -3102,7 +3104,7 @@ void CANReceiver()
 									frame.data[0], frame.data[1], frame.data[2], frame.data[3],
 									frame.data[4], frame.data[5]);
 
-							PRINTF_FUNC("*******Gun %d->EVCCID = %s \n", targetGun, _chargingData[targetGun]->EVCCID);
+							PRINTF_FUNC("CCS - Gun %d->EVCCID = %s \n", targetGun, _chargingData[targetGun]->EVCCID);
 						}
 					}
 						break;
@@ -3122,8 +3124,11 @@ void CANReceiver()
 							// frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
 							if (frame.data[0] == 0x02)
 							{
-								PRINTF_FUNC("Gun_%d, ** Emc Level **, Stop charging by EV. \n", targetGun);
-								if (AbnormalStopAnalysis(targetGun, frame.data + 1))
+								PRINTF_FUNC("Gun_%d, ** Emc Level **, Stop charging by EV. SOC = %d \n",
+										targetGun,
+										_chargingData[targetGun]->EvBatterySoc);
+								if (AbnormalStopAnalysis(targetGun, frame.data + 1) &&
+										_chargingData[targetGun]->EvBatterySoc < 100)
 								{
 									_chargingData[targetGun]->StopChargeFlag = YES;
 								}
@@ -3141,6 +3146,66 @@ void CANReceiver()
 								_chargingData[targetGun]->NormalStopChargeFlag = YES;
 							}
 						}
+					}
+						break;
+					case EV_Command_VincodeData:
+					{
+						byte _tarPackage = frame.data[0];
+						byte _tarCount = 7;
+
+						if (_tarPackage <= ShmDcCommonData->gbtVincodeInfo[targetGun].packageCount)
+						{
+							if (_tarPackage == ShmDcCommonData->gbtVincodeInfo[targetGun].packageCount &&
+									_tarPackage != 0)
+							{
+								_tarCount = ShmDcCommonData->gbtVincodeInfo[targetGun].dataLen - ((_tarPackage - 1) * _tarCount);
+							}
+
+							memcpy((char *)ShmDcCommonData->gbtVincodeInfo[targetGun].data + ((_tarPackage - 1) * 7),
+										(char *)frame.data + 1, _tarCount);
+						}
+
+						if (_tarPackage == ShmDcCommonData->gbtVincodeInfo[targetGun].packageCount)
+						{
+							byte chksum = 0;
+
+							for (int idx = 0; idx < ShmDcCommonData->gbtVincodeInfo[targetGun].dataLen; idx++)
+									chksum ^= ShmDcCommonData->gbtVincodeInfo[targetGun].data[idx];
+
+							if (chksum == ShmDcCommonData->gbtVincodeInfo[targetGun].checksum)
+							{
+								// 放到 GBT Vincode
+								PRINTF_FUNC("data = %s \n",
+										ShmDcCommonData->gbtVincodeInfo[targetGun].data);
+								PRINTF_FUNC("EV state = %d \n",
+										ShmGBTData->evse[_chargingData[targetGun]->type_index].EvboardStatus);
+
+								//LW_GBT_EVCCID
+								PRINTF_FUNC("GBT - Gun %d->Vincode = %s \n", targetGun, _chargingData[targetGun]->EVCCID);
+
+								if (strcmp((char *) _chargingData[targetGun]->EVCCID, "") == EQUAL
+										&& _chargingData[targetGun]->Type == _Type_GB)
+								{
+									if (strlen((char*) ShmDcCommonData->gbtVincodeInfo[targetGun].data) > 0)
+									{
+										memcpy((char *) _chargingData[targetGun]->EVCCID, (char*) ShmDcCommonData->gbtVincodeInfo[targetGun].data,
+										        sizeof(_chargingData[targetGun]->EVCCID));
+									}
+								}
+							}
+						}
+					}
+						break;
+					case EV_Command_VincodeInfo:
+					{
+						ShmDcCommonData->gbtVincodeInfo[targetGun].dataLen = (frame.data[1] << 8) + frame.data[0];
+						ShmDcCommonData->gbtVincodeInfo[targetGun].packageCount = frame.data[2];
+						ShmDcCommonData->gbtVincodeInfo[targetGun].checksum = frame.data[4];
+
+//						PRINTF_FUNC("dataLen = %d, packageCount = %d, checksum = %x  \n",
+//								ShmDcCommonData->gbtVincodeInfo[targetGun].dataLen,
+//								ShmDcCommonData->gbtVincodeInfo[targetGun].packageCount,
+//								ShmDcCommonData->gbtVincodeInfo[targetGun].checksum);
 					}
 						break;
 					case EV_Command_SyncRtcInfo:
@@ -3215,7 +3280,7 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 
 	cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
-	if ((chargingData_1->SystemStatus >= SYS_MODE_PREPARING && chargingData_1->SystemStatus <= SYS_MODE_CHARGING) ||
+	if ((chargingData_1->SystemStatus >= SYS_MODE_PREPARING && chargingData_1->SystemStatus <= SYS_MODE_ALARM) ||
 			(chargingData_1->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && chargingData_1->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
 	{
 		if ((LogInfo[GUN_LEFT][EV_LOG_NOW_OUTPUT_VOL] >= vol1 + CHK_VOL_RANGE) || (LogInfo[GUN_LEFT][EV_LOG_NOW_OUTPUT_VOL] <= vol1 - CHK_VOL_RANGE) ||
@@ -3246,8 +3311,9 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 			curAllowCount[GUN_RIGHT] = 0;
 	}
 
-	if ((chargingData_2->SystemStatus >= SYS_MODE_PREPARING && chargingData_2->SystemStatus <= SYS_MODE_CHARGING) ||
-			(chargingData_2->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && chargingData_2->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
+	if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 &&
+			((chargingData_2->SystemStatus >= SYS_MODE_PREPARING && chargingData_2->SystemStatus <= SYS_MODE_ALARM) ||
+			(chargingData_2->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && chargingData_2->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1)))
 	{
 		if ((LogInfo[GUN_RIGHT][EV_LOG_NOW_OUTPUT_VOL] >= vol2 + CHK_VOL_RANGE) || (LogInfo[GUN_RIGHT][EV_LOG_NOW_OUTPUT_VOL] <= vol2 - CHK_VOL_RANGE) ||
 				(LogInfo[GUN_RIGHT][EV_LOG_NOW_OUTPUT_CUR] >= cur2 + CHK_CUR_RANGE) || (LogInfo[GUN_RIGHT][EV_LOG_NOW_OUTPUT_CUR] <= cur2 - CHK_CUR_RANGE))
@@ -3258,7 +3324,6 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 		}
 	}
 
-
 	if (!_useOfflineNoCharging)
 	{
 		if (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
@@ -3463,6 +3528,7 @@ void Initialization()
 void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 {
 	unsigned short configCurrent = ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent * 10;
+	unsigned short configVoltage = ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage * 10;
 
 	if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_BOTH)
 		configCurrent /= 2;
@@ -3470,6 +3536,9 @@ void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 	if (configCurrent != 0 && configCurrent < *cur)
 		*cur = configCurrent;
 
+	if (configVoltage != 0 && configVoltage < *vol)
+		*vol = configVoltage;
+
 	if (_chargingData[index]->ConnectorMaxVoltage != 0 &&
 			_chargingData[index]->ConnectorMaxVoltage <= *vol)
 		*vol = _chargingData[index]->ConnectorMaxVoltage;
@@ -3480,10 +3549,12 @@ void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 
 	_chargingData [index]->CurrentOffered = *cur ;
 
-	if (((_chargingData[index]->SystemStatus >= SYS_MODE_PREPARE_FOR_EVSE && _chargingData[index]->SystemStatus <= SYS_MODE_CHARGING) ||
-			(_chargingData[index]->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0 && _chargingData[index]->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1)) &&
-			_chargingData[index]->ChargingProfileCurrent >= 0 &&
-			_chargingData[index]->ChargingProfileCurrent <= *cur)
+	if (((_chargingData[index]->SystemStatus >= SYS_MODE_PREPARE_FOR_EVSE
+			&& _chargingData[index]->SystemStatus <= SYS_MODE_CHARGING) ||
+			(_chargingData[index]->SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0
+					&& _chargingData[index]->SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
+			&& _chargingData[index]->ChargingProfileCurrent >= 0
+			&& _chargingData[index]->ChargingProfileCurrent <= *cur)
 	{
 		*cur = _chargingData[index]->ChargingProfileCurrent;
 	}
@@ -3710,7 +3781,7 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 	return result;
 }
 
-void SendCommunicationOnly(byte index)
+void SetPermissionProc(byte index, byte param)
 {
 	byte targetID = _chargingData[index]->Evboard_id;
 
@@ -3721,38 +3792,20 @@ void SendCommunicationOnly(byte index)
 		targetID += 1;
 	}
 
-	SetChargingPermission(index, COMMUNICATION,
-		_chargingData[index]->AvailableChargingPower,
-		0,
-		0,
-		targetID);
-}
-
-void SendStopOnly(byte index)
-{
-	byte targetID = _chargingData[index]->Evboard_id;
-
-	if (gun_count == 1 &&
-			_chargingData[index]->Type == _Type_CCS &&
-			ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
+	float _maxVol = _chargingData[index]->ConnectorMaxVoltage;
+	if (ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage != 0 &&
+			_maxVol > ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage)
 	{
-		targetID += 1;
+		_maxVol = ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage;
 	}
 
-	SetChargingPermission(index, STOP,
-		_chargingData[index]->AvailableChargingPower,
-		0,
-		0,
-		targetID);
-}
 
-void InitialConnectorStatus(byte index)
-{
-	SetChargingPermission(index, INITIALIZATION,
-		0,
-		0,
-		0,
-		_chargingData[index]->Evboard_id);
+	//LW_GBT_EVCCID
+	SetChargingPermission (index, param,
+		ShmPsuData->SystemAvailablePower,
+		_chargingData[index]->ConnectorMaxCurrent,
+		_maxVol,
+		targetID);
 }
 
 void SetDertingInfo(byte _index)
@@ -3761,6 +3814,7 @@ void SetDertingInfo(byte _index)
 	{
 		case 'S':
 		{
+			// Chademo
 			_chargingData [_index]->deratingByConnOtp.isNeedDerating = YES;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [0] = 0;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [1] = 0;
@@ -3775,8 +3829,26 @@ void SetDertingInfo(byte _index)
 			_chargingData [_index]->deratingByConnOtp.deratingIndex = 0;
 		}
 			break;
+		case 'W':
+		{
+			// Chademo
+			_chargingData [_index]->deratingByConnOtp.isNeedDerating = YES;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [0] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [1] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [2] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [3] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [4] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetCurrent [0] = 3500;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetCurrent [1] = 2000;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetCurrent [2] = 2000;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetCurrent [3] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingTargetCurrent [4] = 0;
+			_chargingData [_index]->deratingByConnOtp.deratingIndex = 0;
+		}
+			break;
 		case 'K':
 		{
+			// Chademo
 			_chargingData [_index]->deratingByConnOtp.isNeedDerating = YES;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [0] = 1;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [1] = 0.8;
@@ -3786,9 +3858,10 @@ void SetDertingInfo(byte _index)
 			_chargingData [_index]->deratingByConnOtp.deratingIndex = 0;
 		}
 			break;
-		case 'T' :
-		case 'D' :
+		case 'I' :
+		case 'Q' :
 		{
+			// CCS
 			_chargingData [_index]->deratingByConnOtp.isNeedDerating = YES;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [0] = 0;
 			_chargingData [_index]->deratingByConnOtp.deratingTargetRate [1] = 0;
@@ -3949,7 +4022,9 @@ void FormatVoltageAndCurrent()
 		{
 			if (_chargingData[_index]->Type == _Type_Chademo)
 			{
-				if (_chargingData[_index]->ModelType == 'K' ||
+				if (_chargingData[_index]->ModelType == 'W')
+					_chargingData[_index]->ConnectorMaxCurrent = 3500;
+				else if (_chargingData[_index]->ModelType == 'K' ||
 						_chargingData[_index]->ModelType == 'S')
 					_chargingData[_index]->ConnectorMaxCurrent = 2000;
 				else if (_chargingData[_index]->ModelType == 'J' &&
@@ -3963,9 +4038,12 @@ void FormatVoltageAndCurrent()
 				if (_chargingData [_index]->ModelType == 'V' ||
 						_chargingData [_index]->ModelType == 'F')
 					_chargingData[_index]->ConnectorMaxCurrent = 5000;
-				if (_chargingData[_index]->ModelType == 'T' ||
-						_chargingData[_index]->ModelType == 'D')
+				else if (_chargingData[_index]->ModelType == 'I' ||
+						_chargingData[_index]->ModelType == 'Q')
 					_chargingData[_index]->ConnectorMaxCurrent = 5000;
+				else if (_chargingData[_index]->ModelType == 'T' ||
+						_chargingData[_index]->ModelType == 'D')
+					_chargingData[_index]->ConnectorMaxCurrent = 3000;
 				else if (_chargingData[_index]->ModelType == 'R')
 					_chargingData[_index]->ConnectorMaxCurrent = 2500;
 				else
@@ -4018,10 +4096,10 @@ void CalOutputPowerAndEnergy(int _index)
 	{
 		// DC Meter
 		if (ShmCsuMeterData->_meter[_index].curMeterValue == 0)
-				ShmCsuMeterData->_meter[_index].curMeterValue = ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
+				ShmCsuMeterData->_meter[_index].curMeterValue = (float)ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
 		else
 		{
-			if (ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy > ShmCsuMeterData->_meter[_index].curMeterValue)
+			if ((float)ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy > ShmCsuMeterData->_meter[_index].curMeterValue)
 			{
 				ShmCsuMeterData->_meter[_index]._curTotalCharging += ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy - ShmCsuMeterData->_meter[_index].curMeterValue;
 				float totalChargingValue = ShmCsuMeterData->_meter[_index]._curTotalCharging;
@@ -4041,7 +4119,7 @@ void CalOutputPowerAndEnergy(int _index)
 						_chargingData[_index]->ChargingFee = totalChargingValue * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 				}
 
-				ShmCsuMeterData->_meter[_index].curMeterValue = ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
+				ShmCsuMeterData->_meter[_index].curMeterValue = (float)ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
 			}
 		}
 	}
@@ -4109,9 +4187,9 @@ void InitTimeToPrintLog()
 
 void AuthorizeByCcid(byte _index)
 {
-	if (_chargingData[_index]->Type == _Type_CCS &&
-			_chargingData [_index]->IsAvailable &&
-			ShmDcCommonData->enObtainAuthorizbyCCID &&
+	//LW_GBT_EVCCID
+	//if ((_chargingData[_index]->Type == _Type_CCS || _chargingData[_index]->Type == _Type_GB)&&
+	if( _chargingData [_index]->IsAvailable && ShmDcCommonData->enObtainAuthorizbyCCID &&
 			strcmp ( (char *) _chargingData[_index]->StartUserId, "") == EQUAL)
 	{
 		if (_chargingData [_index]->ConnectorPlugIn)
@@ -4132,7 +4210,7 @@ void AuthorizeByCcid(byte _index)
 
 				if (strcmp ( (char *) _chargingData [_index]->EVCCID, "" ) == EQUAL)
 				{
-					SendCommunicationOnly ( _index );
+					SetPermissionProc(_index, COMMUNICATION);
 					GetEvccIdReq ( _index, targetID);
 				}
 				else
@@ -4140,17 +4218,32 @@ void AuthorizeByCcid(byte _index)
 			}
 			else if (ShmDcCommonData->_authWithCcidFlag [_index] == _CCID_AUTHFAIL)
 			{
-				SendStopOnly ( _index );
+				SetPermissionProc(_index, STOP);
 				strcpy ( (char *) _chargingData [_index]->EVCCID, "" );
 			}
 		}
 		else
 		{
-			SendStopOnly ( _index );
+			SetPermissionProc(_index, STOP);
 		}
 	}
 }
 
+//LW_GBT_EVCCID
+bool WaitStartTransactionResult(byte _index)
+{
+	bool result = NO;
+
+	//Condition: (1)Enable auth by RFID or Remote start. (2)Enable auth by CCID  and gun type was ccs
+	//Note: GBT type's CCID was authorized at SYS_MODE_PREPARE_FOR_EV state.
+
+	if (ShmDcCommonData->startTransactionFlag[_index] == START_TRANSATION_STATUS_WAIT
+			&& (!ShmDcCommonData->enObtainAuthorizbyCCID || _chargingData[_index]->Type == _Type_CCS))
+		result = YES;
+
+	return result;
+}
+
 void SampleOutputVoltage()
 {
 	for (byte group = 0; group < ShmPsuData->GroupCount; group++)
@@ -4246,7 +4339,7 @@ int main(int argc, char *argv[])
 					}
 
 					if (ShmDcCommonData->evBoardResetFlag)
-						InitialConnectorStatus(_index);
+						SetPermissionProc(_index, INITIALIZATION);
 				}
 				else if (_chargingData[_index]->Type == _Type_GB)
 				{
@@ -4258,7 +4351,7 @@ int main(int argc, char *argv[])
 					}
 
 					if (ShmDcCommonData->evBoardResetFlag)
-						InitialConnectorStatus(_index);
+						SetPermissionProc(_index, INITIALIZATION);
 				}
 				else if (_chargingData[_index]->Type == _Type_CCS)
 				{
@@ -4306,7 +4399,7 @@ int main(int argc, char *argv[])
 							{
 								chkChademoPermission[_index] = true;
 								GetTimespecFunc(&_chk_chademo_permission_timeout[_index]);
-								SendStopOnly(_index);
+								SetPermissionProc(_index, STOP);
 								chkChademoPermissionSend[_index] = NO;
 							}
 							else
@@ -4322,7 +4415,7 @@ int main(int argc, char *argv[])
 										if (chkChademoPermissionSend[_index] == NO)
 										{
 											chkChademoPermissionSend[_index] = YES;
-											SendCommunicationOnly(_index);
+											SetPermissionProc(_index, COMMUNICATION);
 										}
 										if (_timeBuf > 10)
 										{
@@ -4336,12 +4429,10 @@ int main(int argc, char *argv[])
 						else if (chkChademoPermission[_index])
 						{
 							chkChademoPermission[_index] = false;
-							//SendStopOnly(_index);
 						}
 
 						if (ShmDcCommonData->ConnectErrList[_index].GunBits.ChaConnectOTP == NO)
 							_chargingData[_index]->StopChargeFlag = NO;
-
 					}
 					else if (_chargingData[_index]->Type == _Type_GB)
 					{
@@ -4385,7 +4476,8 @@ int main(int argc, char *argv[])
 
 						// 使用 Meter 狀況
 						if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'M' ||
-								ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'L')
+								ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'L' ||
+								ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
 						{
 							if (ShmCsuMeterData->_meter[_index].isCalculation == NO)
 							{
@@ -4426,17 +4518,17 @@ int main(int argc, char *argv[])
 					break;
 				case SYS_MODE_PREPARE_FOR_EV:
 				{
-					AuthorizeByCcid(_index);
+					if(_chargingData[_index]->Type == _Type_CCS)
+						AuthorizeByCcid(_index);
 
-					if (ShmDcCommonData->startTransactionFlag[_index] == START_TRANSATION_STATUS_WAIT)
+					//LW_GBT_EVCCID
+					if (WaitStartTransactionResult(_index) == YES)
 						continue;
 
+					//LW_GBT_EVCCID ..
 					if (_chargingData[_index]->Type == _Type_CCS)
 						GetEvccIdReq(_index, targetID);
 
-					// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
-					GetOutputReq(_index, targetID);
-
 					// 設定當前輸出
 					if (gun_count == 1)
 						SetPresentChargingOutputPower(_chargingData[GUN_LEFT], _chargingData[GUN_LEFT]);
@@ -4458,18 +4550,20 @@ int main(int argc, char *argv[])
 							LogInfo[_index][EV_LOG_EVSE_MAX_VOL] = maxVol;
 							LogInfo[_index][EV_LOG_EVSE_MAX_CUR] = ShmPsuData->SystemAvailableCurrent;
 
-							PRINTF_FUNC("To EV_%d Max_Vol = %.1f, Cap_Cur = %d (A), Cap_Pow = %d (KW) \n",
-								_index, maxVol / 10, ShmPsuData->SystemAvailableCurrent / 10, ShmPsuData->SystemAvailablePower / 10);
+							PRINTF_FUNC("To EV_%d Max_Vol = %.1f, Sys_Cur = %d (A), Sys_Pow = %d (KW), Cap_Cur = %.1f (A) \n",
+								_index, maxVol / 10, ShmPsuData->SystemAvailableCurrent / 10, ShmPsuData->SystemAvailablePower / 10,
+								maxCur / 10);
 						}
 
 						_chargingData[_index]->RealMaxVoltage = maxVol;
-						SetChargingPermission ( _index, START,
-								ShmPsuData->SystemAvailablePower,
-								ShmPsuData->SystemAvailableCurrent,
-								maxVol, targetID);
+
+						SetPermissionProc(_index, START);
 
 						// 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
 						GetEvBatteryInfo(_index, targetID);
+
+						// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
+						GetOutputReq(_index, targetID);
 					}
 					GetTimespecFunc(&_chk_ratingPower_timeout[_index]);
 				}
@@ -4477,7 +4571,11 @@ int main(int argc, char *argv[])
 				case SYS_MODE_PREPARE_FOR_EVSE:
 				case SYS_MODE_CCS_PRECHARGE_STEP0:
 				case SYS_MODE_CCS_PRECHARGE_STEP1:
-				{
+					{
+					//LW_GBT_EVCCID
+					if (_chargingData[_index]->Type == _Type_GB)
+						GetEvccIdReq(_index, targetID);
+
 					// 開始確認車端是否同意開始充電
 					GetOutputReq(_index, targetID);
 
@@ -4489,9 +4587,6 @@ int main(int argc, char *argv[])
 
 					if (priorityLow % 5 == 1)
 					{
-						if (_chargingData[_index]->Type == _Type_CCS)
-							GetEvccIdReq(_index, targetID);
-
 						// 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
 						GetEvBatteryInfo(_index, targetID);
 
@@ -4505,7 +4600,8 @@ int main(int argc, char *argv[])
 					if (LogInfo[_index][EV_LOG_MAX_BATT_VOL] != _chargingData[_index]->EvBatteryMaxVoltage)
 					{
 						LogInfo[_index][EV_LOG_MAX_BATT_VOL] = _chargingData[_index]->EvBatteryMaxVoltage;
-						PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", _index, _chargingData[_index]->EvBatteryMaxVoltage);
+						PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", _index,
+						        _chargingData[_index]->EvBatteryMaxVoltage);
 					}
 
 					if (LogInfo[_index][EV_LOG_SOC] != _chargingData[_index]->EvBatterySoc)
@@ -4517,63 +4613,66 @@ int main(int argc, char *argv[])
 					// 持續通知 Isolation 測試狀態
 					if (priorityLow == 1)
 					{
-						// 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
-//						if (_chargingData[_index]->FireChargingVoltage >= 3500)
-//							_chargingData[_index]->GroundFaultStatus = GFD_PASS;
+						unsigned char _result = _chargingData[_index]->GroundFaultStatus;
 
-						//PRINTF_FUNC("To EV_%d GFD = %d \n",	_index, _chargingData[_index]->GroundFaultStatus);
-						//if(_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
+						// GB & Chademo ~ Warning 也先算 Pass,因為 CCS 認證會驗 Warning 故不可更動
+						if (_chargingData[_index]->Type == _Type_Chademo ||
+						        _chargingData[_index]->Type == _Type_GB)
 						{
-							//if ((GetTimeoutValue(_derating_time) / 1000) > 1000)
-							unsigned char _result = _chargingData[_index]->GroundFaultStatus;
-
-							// GB & Chademo ~ Warning 也先算 Pass,因為 CCS 認證會驗 Warning 故不可更動
-							if(_chargingData[_index]->Type == _Type_Chademo ||
-								_chargingData[_index]->Type == _Type_GB)
+							if (_result == GFD_WARNING)
 							{
-								if (_result == GFD_WARNING)
-								{
-									_result = GFD_PASS;
-								}
+								_result = GFD_PASS;
 							}
+						}
 
-							if (_result == GFD_WARNING || _result == GFD_PASS)
+						if (_result == GFD_WARNING || _result == GFD_PASS)
+						{
+							_timeBuf = GetTimeoutValue(&_chk_ratingPower_timeout[_index]);
+							if (_timeBuf < 0)
 							{
-								_timeBuf = GetTimeoutValue(&_chk_ratingPower_timeout[_index]);
-								if (_timeBuf < 0)
+								GetTimespecFunc(&_chk_ratingPower_timeout[_index]);
+							}
+							else
+							{
+								if ((_timeBuf > 6 &&
+								        _chargingData[_index]->RealRatingPower > 0) ||
+								        _timeBuf > 14)
 								{
-									GetTimespecFunc(&_chk_ratingPower_timeout[_index]);
+									PRINTF_FUNC("Conn %d, RealRatingPower = %d (KW) \n",
+									        _index, _chargingData[_index]->RealRatingPower / 10);
 								}
 								else
-								{
-									if ((_timeBuf > 6 &&
-											_chargingData[_index]->RealRatingPower > 0) ||
-											_timeBuf > 14)
-									{
-										PRINTF_FUNC("Conn %d, RealRatingPower = %d (KW) \n",
-												_index, _chargingData[_index]->RealRatingPower / 10);
-									}
-									else
-										_result = GFD_WAIT;
-								}
+									_result = GFD_WAIT;
 							}
-
-							if (_result != GFD_WAIT)
-								SetIsolationStatus(_index, _result, targetID);
 						}
 
-						if(_chargingData[_index]->SystemStatus == SYS_MODE_CCS_PRECHARGE_STEP0 &&
-								_chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
-						{
-							SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, targetID);
-						}
+						if (_result != GFD_WAIT)
+							SetIsolationStatus(_index, _result, targetID);
+					}
+
+					if (_chargingData[_index]->SystemStatus == SYS_MODE_CCS_PRECHARGE_STEP0 &&
+					        _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
+					{
+						SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, targetID);
+					}
+
+					//LW_GBT_EVCCID
+					if (_chargingData[_index]->Type == _Type_GB)
+						AuthorizeByCcid(_index);
+
+					//LW_GBT_EVCCID
+					if (ShmDcCommonData->startTransactionFlag[_index] == START_TRANSATION_STATUS_PASS
+					        && _chargingData[_index]->Type == _Type_GB)
+					{
+						SetPermissionProc(_index, START);
 					}
 				}
 					break;
 				case SYS_MODE_CHARGING:
 				{
 					// 當前 Power
-					_chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
+					_chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage)
+							* (_chargingData[_index]->PresentChargingCurrent)) / 1000);
 
 					CalOutputPowerAndEnergy(_index);
 
@@ -4662,7 +4761,8 @@ int main(int argc, char *argv[])
 						byte normalStop = 0x01;
 						byte stopReason[7] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
-						if (GetStopChargingReasonByEvse(_index, stopReason))
+						if (GetStopChargingReasonByEvse(_index, stopReason) ||
+								_chargingData[_index]->StopChargeFlag)
 						{
 							normalStop = 0x02;
 						}
@@ -4697,11 +4797,7 @@ int main(int argc, char *argv[])
 							maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
 							GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
-							SetChargingPermission(_index, STOP,
-									_chargingData[_index]->AvailableChargingPower,
-									maxCur,
-									maxVol,
-									targetID);
+							SetPermissionProc(_index, STOP);
 						}
 					}
 				}
@@ -4723,11 +4819,7 @@ int main(int argc, char *argv[])
 						maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
 						GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
-						SetChargingPermission(_index, STOP,
-								_chargingData[_index]->AvailableChargingPower,
-								maxCur,
-								maxVol,
-								targetID);
+						SetPermissionProc(_index, STOP);
 					}
 				}
 					break;

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

@@ -34,6 +34,8 @@ typedef enum
 	EV_Command_SyncRtcInfo      	= 0x14,
 	EV_Command_EvsePrechargeInfo  	= 0x15,
 	EV_Command_EvccidReq	      	= 0x16,
+	EV_Command_VincodeData			= 0xEB,
+	EV_Command_VincodeInfo			= 0xEC
 }EvCmd;
 
 typedef union

BIN
EVSE/Projects/DS60-120/Apps/Module_EventLogging


BIN
EVSE/Projects/DS60-120/Apps/Module_InternalComm


+ 34 - 14
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -84,14 +84,14 @@ struct SmartBoxData				*ShmSmartBoxData;
 //LWADD
 #define VIN_MAX_VOLTAGE_JARI			285	// 大於該值 : OVP // 日規 (W)
 #define VIN_MAX_REV_VOLTAGE_JARI		275	// 小於賦歸 OVP
-#define VIN_MIN_VOLTAGE_JARI			187	// 小於該值 : UVP
-#define VIN_MIN_REV_VOLTAGE_JARI 		197	// 大於賦歸 UVP
+#define VIN_MIN_VOLTAGE_JARI			180	// 小於該值 : UVP
+#define VIN_MIN_REV_VOLTAGE_JARI 		190	// 大於賦歸 UVP
 
 // 50KW 系統
 #define VIN_MAX_VOLTAGE_JARI_50KW		250	// 大於該值 : OVP // 日規 (W)
 #define VIN_MAX_REV_VOLTAGE_JARI_50KW	240	// 小於賦歸 OVP
-#define VIN_MIN_VOLTAGE_JARI_50KW		170	// 小於該值 : UVP
-#define VIN_MIN_REV_VOLTAGE_JARI_50KW	180	// 大於賦歸 UVP
+#define VIN_MIN_VOLTAGE_JARI_50KW		165	// 小於該值 : UVP
+#define VIN_MIN_REV_VOLTAGE_JARI_50KW	175	// 大於賦歸 UVP
 
 #define VIN_DROP_VOLTAGE	150	// 小於該值 : ac drop
 
@@ -875,7 +875,7 @@ void GetPresentInputVol()
 					if (_threePhaseOvp[0] >= OVP_UVP_CHK_COUNT)
 						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
 					else
-						_threePhaseOvp[0] += 0;
+						_threePhaseOvp[0] += 1;
 				}
 			}
 			else
@@ -895,7 +895,7 @@ void GetPresentInputVol()
 					if (_threePhaseOvp[1] >= OVP_UVP_CHK_COUNT)
 						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
 					else
-						_threePhaseOvp[1] += 0;
+						_threePhaseOvp[1] += 1;
 				}
 			}
 			else
@@ -940,7 +940,7 @@ void GetPresentInputVol()
 						if (_threePhaseOvp[0] >= OVP_UVP_CHK_COUNT)
 							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
 						else
-							_threePhaseOvp[0] += 0;
+							_threePhaseOvp[0] += 1;
 					}
 				}
 				else
@@ -960,7 +960,7 @@ void GetPresentInputVol()
 						if (_threePhaseOvp[1] >= OVP_UVP_CHK_COUNT)
 							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
 						else
-							_threePhaseOvp[1] += 0;
+							_threePhaseOvp[1] += 1;
 					}
 				}
 				else
@@ -1002,7 +1002,7 @@ void GetPresentInputVol()
 						if (_threePhaseOvp[0] >= OVP_UVP_CHK_COUNT)
 							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
 						else
-							_threePhaseOvp[0] += 0;
+							_threePhaseOvp[0] += 1;
 					}
 				}
 				else
@@ -1022,7 +1022,7 @@ void GetPresentInputVol()
 						if (_threePhaseOvp[1] >= OVP_UVP_CHK_COUNT)
 							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
 						else
-							_threePhaseOvp[1] += 0;
+							_threePhaseOvp[1] += 1;
 					}
 				}
 				else
@@ -2096,7 +2096,7 @@ int InitComPort()
 		#endif
 		if(ShmStatusCodeData!=NULL)
 		{
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
 		}
 		sleep(5);
 		return -1;
@@ -2777,6 +2777,11 @@ void SetCpDuty(byte _value)
 	Config_Ac_Duty(Uart5Fd, Addr.AcPlug, _value);
 }
 
+void ResetMcuReqAC()
+{
+	Config_Reset_MCU(Uart5Fd, Addr.AcPlug);
+}
+
 void SetModelName_AC()
 {
 	if (Config_Model_Name(Uart5Fd, Addr.AcPlug, ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
@@ -3066,6 +3071,16 @@ void ocpp_ac_clear_stopReason()
 		strcpy((char *)ShmOCPP20Data->TransactionEvent[hasDc].transactionInfo.stoppedReason, "");
 }
 
+void ocpp_ac_set_remoteStart_transaction_req(bool result)
+{
+	byte hasDc = ((ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 0) ? 1 : 0);
+
+	if (ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
+		ShmOCPP16Data->CsMsg.bits [hasDc].RemoteStartTransactionReq = result;
+	else if (ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
+		ShmOCPP20Data->CsMsg.bits [hasDc].RequestStartTransactionReq = result;
+}
+
 //===============================================
 // AC Main Process
 //===============================================
@@ -3110,6 +3125,7 @@ void AcChargeTypeProcess()
 		if (ac_chargingInfo[0]->SelfTest_Comp == NO)
 		{
 			ac_chargingInfo[0]->IsModeChagned = NO;
+			ResetMcuReqAC();
 			SetModelName_AC();
 			GetFwVersion_AC();
 			GetAcModelName();
@@ -3184,6 +3200,7 @@ void AcChargeTypeProcess()
 						ac_chargingInfo[0]->isRemoteStart = YES;
 						strcpy((char *)ac_chargingInfo[0]->StartUserId, "");
 						ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+						ocpp_ac_set_remoteStart_transaction_req(NO);
 						_status = SYS_MODE_PREPARING;
 					}
 					else if (ac_chargingInfo[0]->ReservedStartFlag == YES)
@@ -3758,8 +3775,9 @@ int main(void)
 				}
 			}
 
-			if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == ABNORMAL ||
-					ShmPrimaryMcuData->InputDet.bits.DoorOpen == ABNORMAL)
+			if ((ShmPrimaryMcuData->InputDet.bits.EmergencyButton == ABNORMAL ||
+					ShmPrimaryMcuData->InputDet.bits.DoorOpen == ABNORMAL) &&
+					ShmDcCommonData->_tiltSensorStep == _TILT_SENSOR_STEP_NONE)
 				outputRelay.relay_event.bits.AC_Contactor = NO;
 
 			if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm == ABNORMAL ||
@@ -3881,7 +3899,9 @@ int main(void)
 				GetTimespecFunc(&_led_priority_time);
 			else
 			{
-				if (GetTimeoutValue(&_led_blink_time) > 6)
+				int _ledTimebuf = GetTimeoutValue(&_led_blink_time);
+
+				if (_ledTimebuf > 6 ||_ledTimebuf < 0)
 					GetTimespecFunc(&_led_blink_time);
 
 				if (_timebuf >= 1)

+ 18 - 15
EVSE/Projects/DS60-120/Apps/Module_LcmContro.h

@@ -26,6 +26,8 @@
 #include 	<ifaddrs.h>
 #include 	<stdbool.h>
 #include 	<dirent.h>
+#include 	"lcmComm_dgus.h"
+#include	"cbmp.h"
 #include	"../../define.h"
 
 #define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
@@ -49,15 +51,8 @@ struct DcCommonInformation		*ShmDcCommonData;
 #define POWER_MAX_KW		5000
 #define ENERGY_MAX_KWH		5000
 
-#define CMD_TITLE_1				0x5A
-#define CMD_TITLE_2				0xA5
-#define CMD_READ				0x80
-#define CMD_WRITE				0x81
-#define CMD_MULTI_WRITE			0x82
-#define CMD_MULTI_READ			0x83
-
-#define CMD_BACKLIGHT			0x01
-#define CMD_REGISTER			0x03
+#define CMD_BACKLIGHT		0x01
+#define CMD_REGISTER		0x03
 
 //=======================================
 // Register Control type
@@ -88,6 +83,8 @@ struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
 byte ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5;
 byte isDiffStatus = false;
 byte isChangeBattMap = false;
+byte _lcmGunSelect;
+byte _lcmGunStatus;
 // ·í«e¿ï¾Üªººj¸¹
 short _currentPage = _LCM_NONE;
 short _oldPage = _LCM_NONE;
@@ -134,6 +131,8 @@ short __batt_map_empty = 0x0090;
 short __tpc_detect_map = 0x0092;
 
 short __conn_line_chag = 0x0096;
+short __conn1_cabinet_charging = 0x0098;
+short __conn1_cabinet_complete = 0x009A;
 short __batt_map = 0x0100;
 short __soc_value_charging = 0x0102;
 short __remain_time_map = 0x0106;
@@ -183,13 +182,13 @@ short __ctep_energy_mon_string = 0x0550;
 short __ctep_packing_mon_string = 0x0560;
 short __ctep_total_mon_string = 0x0570;
 
-short __Energy_Cost_charging = 0x610;
-short __Parking_Fee_charging = 0x620;
-short __Total_Cost_charging = 0x630;
+short __Energy_Cost_charging = 0x0610;
+short __Parking_Fee_charging = 0x0620;
+short __Total_Cost_charging = 0x0630;
 
-short __Energy_Cost_comp = 0x640;
-short __Parking_Fee_comp = 0x650;
-short __Total_Cost_comp = 0x660;
+short __Energy_Cost_comp = 0x0640;
+short __Parking_Fee_comp = 0x0650;
+short __Total_Cost_comp = 0x0660;
 short __receipt_qrcode = 0x0670;
 short __receipt_qrcode_bg = 0x0700;
 short _ctep_energy_mon_comm = 0x0702;
@@ -295,3 +294,7 @@ byte _n1_jp_cha_dark_cmp = 100;
 byte _n2_jp_cha_dark_cmp = 101;
 byte _n1_jp_cha_light_cmp = 102;
 byte _n2_jp_cha_light_cmp = 103;
+byte _conn1_cabinet_double_chg_map = 104;
+byte _conn2_cabinet_single_chg_map = 105;
+byte _conn1_cabinet_double_cop_map = 106;
+byte _conn2_cabinet_single_cop_map = 107;

BIN
EVSE/Projects/DS60-120/Apps/Module_LcmControl


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 642 - 84
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c


BIN
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm


+ 143 - 29
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm.c

@@ -37,6 +37,7 @@
 #define EQUAL				0
 #define NORMAL				0
 #define	ABNORMAL			1
+#define TILTSENSORDET		2
 
 typedef unsigned char 		byte;
 
@@ -59,8 +60,12 @@ Rtc rtc;
 
 struct timespec _flash_time;
 byte flash = NO;
+struct timespec _tilt_time;
+byte tilt = NO;
 
 byte gun_count;
+byte _acSwitch;
+bool _isNeedChkTilt;
 
 byte _curDeviceStatus[3] = {0, 0, 0};
 byte _reCheckCount[3] = {0, 0, 0};
@@ -308,36 +313,39 @@ void GetInputGpioStatus()
 {
 	if (Query_Gpio_Input(Uart1Fd, Addr.IoExtend, &gpio_in) == PASS)
 	{
-		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector ||
-				_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != ShmDcCommonData->psuKeepCommunication)
+		if (ShmDcCommonData->_tiltSensorStep == _TILT_SENSOR_STEP_NONE)
 		{
-			if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3)
+			if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector ||
+					_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != ShmDcCommonData->psuKeepCommunication)
 			{
-				if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == NORMAL &&
-					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm == NORMAL &&
-					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU == NORMAL &&
-					ShmPrimaryMcuData->InputDet.bits.DoorOpen == NORMAL &&
-						(ShmDcCommonData->psuKeepCommunication == YES ||
-						gpio_in.AC_Connector == YES))
+				if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3)
 				{
-					ShmSysConfigAndInfo->SysInfo.AcContactorStatus =
-						ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = YES;
+					if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == NORMAL &&
+						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuFailureAlarm == NORMAL &&
+						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU == NORMAL &&
+						ShmPrimaryMcuData->InputDet.bits.DoorOpen == NORMAL &&
+							(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] = YES;
+					}
+					else
+					{
+						ShmSysConfigAndInfo->SysInfo.AcContactorStatus =
+							ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = _acSwitch = NO;
 
-					_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = NO;
+						_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = NO;
+					}
 				}
+				else
+					_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT]++;
 			}
 			else
-				_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT]++;
+				_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] = NO;
 		}
-		else
-			_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] = 0;
 
 		if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3 &&
 				ShmDcCommonData->psuKeepCommunication == YES &&
@@ -373,7 +381,8 @@ void GetInputGpioStatus()
 		//PRINTF_FUNC("left = %d \n", ShmPrimaryMcuData->InputDet.bits.Button1);
 		//PRINTF_FUNC("right = %d \n", ShmPrimaryMcuData->InputDet.bits.Button2);
 		//PRINTF_FUNC("ShmSysConfigAndInfo->SysInfo.AcContactorStatus = %d \n", ShmSysConfigAndInfo->SysInfo.AcContactorStatus);
-		if (ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec == YES)
+		if (_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] == 3 &&
+				ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec == YES)
 			DEBUG_ERROR("AC Mainbreaker occur. \n");
 	}
 }
@@ -425,7 +434,7 @@ void GetMeterConsumption(byte index)
 	}
 }
 
-void SetOutputGpio(byte flash)
+void SetOutputGpio(byte flash, byte tilt)
 {
 	Gpio_out gpio;
 	// 藍燈
@@ -436,8 +445,8 @@ void SetOutputGpio(byte flash)
 
 	gpio.System_LED[0] = 0x00;
 	gpio.System_LED[1] = 0x00;
-	gpio.System_LED[2] = 0x00;
-	gpio.System_LED[3] = 0x00;
+	gpio.System_LED[2] = tilt;
+	gpio.System_LED[3] = tilt;
 
 	gpio.AC_Connector = 0x00;
 	gpio.AC_Breaker = 0x00;
@@ -496,8 +505,7 @@ void SetRtcData()
 void SetModelName()
 {
 	if (Config_Model_Name(Uart1Fd, Addr.IoExtend, ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
-	{
-	}
+	{}
 }
 //================================================
 // Main process
@@ -598,6 +606,102 @@ void Initialization()
 	}
 }
 
+bool CheckCustomer()
+{
+	bool result = false;
+	char _buf[3] = {0};
+
+	memcpy(_buf, &ShmSysConfigAndInfo->SysConfig.ModelName[12], 2);
+	if (strcmp(_buf, "OL") == EQUAL)
+		result = true;
+	return result;
+}
+
+void TiltSensorSwitch(bool _switch)
+{
+	if (tilt != _switch)
+		tilt = _switch;
+
+	SetOutputGpio(flash, tilt);
+}
+
+void ChkTiltSensor()
+{
+	if (ShmPrimaryMcuData->InputDet.bits.AcContactorDetec == YES)
+	{
+		if (_acSwitch == NO)
+		{
+			if (ShmDcCommonData->_tiltSensorStep == _TILT_SENSOR_STEP_NONE)
+			{
+				PRINTF_FUNC("---- Tilt Sensor : _TILT_SENSOR_STEP_PIN_ON ---- \n");
+				ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_PIN_ON;
+				_acSwitch = YES;
+			}
+		}
+		else
+		{
+			switch (ShmDcCommonData->_tiltSensorStep)
+			{
+				case _TILT_SENSOR_STEP_PIN_ON:
+				{
+					TiltSensorSwitch(YES);
+					GetTimespecFunc(&_tilt_time);
+					PRINTF_FUNC("---- Tilt Sensor : _TILT_SENSOR_STEP_PIN_WAIT ---- \n");
+					ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_PIN_WAIT;
+				}
+				break;
+				case _TILT_SENSOR_STEP_PIN_WAIT:
+				{
+					int _time = GetTimeoutValue(&_tilt_time);
+					if (_time < 0)
+						GetTimespecFunc(&_tilt_time);
+					else if (_time > 1)
+					{
+						if (ShmPrimaryMcuData->InputDet.bits.DoorOpen == NO)
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.TiltSensorStestFail = YES;
+						else
+							ShmStatusCodeData->AlarmCode.AlarmEvents.bits.TiltSensorStestFail = NO;
+
+						if (_time > TILTSENSORDET)
+						{
+							GetTimespecFunc(&_tilt_time);
+							PRINTF_FUNC("---- Tilt Sensor : _TILT_SENSOR_STEP_PIN_OFF ---- \n");
+							ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_PIN_OFF;
+						}
+					}
+				}
+					break;
+				case _TILT_SENSOR_STEP_PIN_OFF:
+				{
+					TiltSensorSwitch(NO);
+					GetTimespecFunc(&_tilt_time);
+					PRINTF_FUNC("---- Tilt Sensor : _TILT_SENSOR_STEP_PIN_FINISH ---- \n");
+					ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_PIN_FINISH;
+				}
+					break;
+				case _TILT_SENSOR_STEP_PIN_FINISH :
+				{
+					int _time = GetTimeoutValue(&_tilt_time);
+					if (_time < 0)
+						GetTimespecFunc(&_tilt_time);
+					else if (_time > TILTSENSORDET)
+					{
+						PRINTF_FUNC("---- Tilt Sensor : _TILT_SENSOR_STEP_NONE ---- \n");
+						ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_NONE;
+					}
+				}
+					break;
+			}
+		}
+	}
+	else
+	{
+		TiltSensorSwitch(NO);
+		ShmDcCommonData->_tiltSensorStep = _TILT_SENSOR_STEP_NONE;
+		_acSwitch = NO;
+	}
+}
+
 int main(void)
 {
 	if(InitShareMemory() == FAIL)
@@ -634,6 +738,11 @@ int main(void)
 	gun_count = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
 	Initialization();
 	byte _count = 0;
+	_acSwitch = NO;
+	sleep(1);
+
+	// 需要判斷這個的客戶碼 : OL
+	_isNeedChkTilt = CheckCustomer();
 
 	for(;;)
 	{
@@ -645,7 +754,7 @@ int main(void)
 					flash = YES;
 				else
 					flash = NO;
-				SetOutputGpio(flash);
+				SetOutputGpio(flash, tilt);
 				GetTimespecFunc(&_flash_time);
 			}
 		}
@@ -656,7 +765,7 @@ int main(void)
 				if (flash == NO)
 					flash = YES;
 
-				SetOutputGpio(flash);
+				SetOutputGpio(flash, tilt);
 				GetTimespecFunc(&_flash_time);
 			}
 		}
@@ -682,6 +791,11 @@ int main(void)
 				if (_count >= gun_count)
 					_count = 0;
 			}
+
+//			if (_isNeedChkTilt)
+//			{
+//				ChkTiltSensor();
+//			}
 		}
 
 		usleep(100000);

BIN
EVSE/Projects/DS60-120/Apps/Module_PsuComm


+ 133 - 74
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -6,27 +6,15 @@
 #define FAIL				-1
 #define YES					1
 #define NO					0
-#define DERATING_COUNT		30
-#define SHARE_CURRENT_GAP	50
-#define ELEMENT_NOT_FIND	255
+#define NORMAL				0
+#define	ABNORMAL			1
+#define SHARE_CURRENT_GAP	40
+#define RELEASE_CUR_GAP		40
 #define PSU_DEFAULT_ADDR	255
-#define CHK_VOL_RANGE		50
-#define CHK_CUR_RANGE		10
-#define DERATING_RANGE		100
-#define MIN_1A_CURRENT		10			// 該值須保持最小為 1A
-#define MIN_5V_VOLTAGE		50
-#define STOP_CURRENT		30
-#define PSU_MIN_CUR			1000
 #define PSU_MIN_VOL			1500
-#define PRE_CHARG_STEP_CUR	30
-#define PRE_CHARG_RANGE		50
 #define EQUAL				0
 #define CMD_DELAY_TIME 		25000
-#define LOG_VOL_GAP			50
-#define LOG_CUR_GAP			5
-#define PSU_MIN_OUTPUT_CUR	0.4
-#define SHUTDOWN_OUTPUT		0
-#define PSU_MODULE_MIN_VOL	50
+#define PSU_MIN_OUTPUT_CUR	0.4			// 1A
 // 安全在停止充電程序中斷開 Relay 的電流
 #define SEFETY_SWITCH_RELAY_CUR				50
 #define PSU_GONE_RESET		30
@@ -133,8 +121,10 @@ void PRINTF_FUNC(char *string, ...)
 //=================================
 // Common routine
 //=================================
-void FindTargetGpAndAddr(byte sourceAddr, byte *gp, byte *psuIndex)
+bool FindTargetGpAndAddr(byte sourceAddr, byte *gp, byte *psuIndex)
 {
+	bool result = false;
+
 	for (byte _gp = 0; _gp < ShmPsuData->GroupCount; _gp++)
 	{
 		for (byte _psu = 0; _psu < ShmPsuData->PsuGroup[_gp].GroupPresentPsuQuantity; _psu++)
@@ -143,10 +133,14 @@ void FindTargetGpAndAddr(byte sourceAddr, byte *gp, byte *psuIndex)
 			{
 				*gp = _gp;
 				*psuIndex = _psu;
-				return;
+				result = true;
+				return result;
 			}
 		}
 	}
+
+	PRINTF_FUNC("Can't find Psu index : %d \n", sourceAddr);
+	return result;
 }
 
 //=================================
@@ -527,20 +521,22 @@ bool AbnormalStopAnalysis_UU(byte gun_index, int errCode)
 			{
 				case AC_SITE_OVP :
 				{
-//					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage == NO)
-//					{
-//						PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_OVP \n" );
-//						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
-//					}
+					isErr = true;
+					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage == NO)
+					{
+						PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_OVP \n" );
+						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
+					}
 				}
 					break;
 				case AC_SITE_UVP :
 				{
-//					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal == NO)
-//					{
-//						PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_UVP \n" );
-//						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
-//					}
+					isErr = true;
+					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal == NO)
+					{
+						PRINTF_FUNC ( "PSU AbnormalStop : AC_SITE_UVP \n" );
+						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
+					}
 				}
 					break;
 				case AC_OVP_SHUTDOWN :
@@ -720,12 +716,12 @@ bool AbnormalStopAnalysis_UU(byte gun_index, int errCode)
 				case UU_NONE_DEFINE_6 : {} break;
 				case DC_TO_DC_DONT_WORK :
 				{
-					isErr = true;
-					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss == NO)
-					{
-						PRINTF_FUNC ( "PSU AbnormalStop : DC_TO_DC_DONT_WORK \n" );
-						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
-					}
+//					isErr = true;
+//					if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss == NO)
+//					{
+//						PRINTF_FUNC ( "PSU AbnormalStop : DC_TO_DC_DONT_WORK \n" );
+//						ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
+//					}
 				}
 					break;
 				case UU_NONE_DEFINE_7 : {} break;
@@ -807,11 +803,10 @@ void ChkUuPwrErrOccur(unsigned address, unsigned char err1, unsigned char err2,
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
-	int alarm = err1 | (err2 << 8) | (err3 << 16) | (err4 << 24);
+	int alarm = err4 | (err3 << 8) | (err2 << 16) | (err1 << 24);
 
 	if (AbnormalStopAnalysis_UU (group, alarm))
 	{
@@ -903,8 +898,7 @@ void GetStatusCallback(byte group, byte SN, byte temp, int alarm, byte type,
 		{
 			totalPsuQuantity += ShmPsuData->PsuGroup[_group].GroupPresentPsuQuantity;
 		}
-		PRINTF_FUNC("totalPsuQuantity = %d \n",
-				totalPsuQuantity);
+		PRINTF_FUNC("totalPsuQuantity = %d \n", totalPsuQuantity);
 
 		if (totalPsuQuantity == ShmPsuData->SystemPresentPsuQuantity)
 			isComp = true;
@@ -943,8 +937,7 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
 	ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AvailablePower = totalPow;
@@ -957,8 +950,7 @@ void GetFwCallback(byte address, short dcSwVer, short pfcSwVer, short hwVer, byt
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
 	sprintf((char *)ShmPsuData->PsuVersion[address].FwPrimaryVersion, "DC %d.%02d", (dcSwVer & 0xFF00) >> 8, dcSwVer & 0xFF);
@@ -974,8 +966,7 @@ void GetInputVoltageCallback(byte address, unsigned short vol1, unsigned short v
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
 	ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL1 = vol1;
@@ -996,8 +987,7 @@ void GetMisCallback(byte address, unsigned int value, byte type)
 	if (ShmPsuData->Work_Step < GET_SYS_CAP)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
 	if (type == 1)
@@ -1009,10 +999,6 @@ void GetMisCallback(byte address, unsigned int value, byte type)
 	}
 	else if (type == 2)
 	{
-		//printf("DC - group = %d, index = %d, value = %d \n", group, address, value);
-//		ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp1 = value;
-//		ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp2 = value;
-//		ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp3 = value;
 		ShmPsuData->PsuGroup[group].PsuModule[psuIndex].ExletTemp = value;
 	}
 	else if (type == 3)
@@ -1026,8 +1012,7 @@ void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short V
 	if (ShmPsuData->Work_Step < GET_SYS_CAP || Iavail > 1000)
 		return;
 
-	byte group, psuIndex;
-
+	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
 
 //	if (group == 2)
@@ -1069,8 +1054,8 @@ void GetOutputAndTempCallback(byte address, unsigned short outputVol_s,
 		return;
 
 	byte group = 0, psuIndex = 0;
-
 	FindTargetGpAndAddr(address, &group, &psuIndex);
+
 	//PRINTF_FUNC("GetOutputAndTempCallback = *address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
 	//printf("group = %d, addr = %d \n", group, addr);
 	ShmPsuData->PsuGroup[group].PsuModule[psuIndex].CriticalTemp1 = Temperature;
@@ -1101,8 +1086,8 @@ void GetModuleStatusCallback(byte address, unsigned char isErr, unsigned char st
 		return;
 
 	byte group = 0, psuIndex = 0;
-
 	FindTargetGpAndAddr(address, &group, &psuIndex);
+
 	//PRINTF_FUNC("GetModuleStatusCallback = *address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
 	int alarm = err1 | (err2 << 8) | (err3 << 16) | (err4 << 24);
 
@@ -1129,6 +1114,7 @@ void GetModuleInputCallback(byte address, unsigned short inputR,
 
 	byte group = 0, psuIndex = 0;
 	FindTargetGpAndAddr(address, &group, &psuIndex);
+
 	//PRINTF_FUNC("*address = %d, group = %d, psuIndex = %d \n", address, group, psuIndex);
 	ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL1 = inputR;
 	ShmPsuData->PsuGroup[group].PsuModule[psuIndex].InputVoltageL2 = inputS;
@@ -1290,7 +1276,7 @@ void Check2ClearPsuError()
 	{
 		for (byte psuIndex = 0; psuIndex < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; psuIndex++)
 		{
-			if (ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode != 0)
+			if (ShmPsuData->PsuGroup[group].PsuModule[psuIndex].AlarmCode != NO)
 			{
 				return;
 			}
@@ -1348,6 +1334,8 @@ void InitialPsuData()
 	{
 		chargingInfo[_gunCount]->PresentChargingVoltage = 0;
 		chargingInfo[_gunCount]->PresentChargingCurrent = 0;
+
+		_releaseWait_chk[_gunCount] = false;
 	}
 
 	ShmPsuData->PsuStopChargeFlag = NO;
@@ -1573,9 +1561,9 @@ int main(void)
 
 			if (_time > PSU_GONE_RESET)
 			{
-				if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU == NO)
+				if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU == NORMAL)
 				{
-					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU = YES;
+					ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuComminicationErrWithCSU = ABNORMAL;
 					ShmDcCommonData->rebootCount = 1;
 					PRINTF_FUNC("Psu is gone, reset one time. \n");
 				}
@@ -1734,6 +1722,7 @@ int main(void)
 
 					GetTimespecMFunc(&_cmdSubPsuPriority_time);
 					GetTimespecMFunc(&_log_time);
+					GetTimespecMFunc(&_smooth_time);
 				}
 			}
 				break;
@@ -1757,7 +1746,7 @@ int main(void)
 			{
 				int time = GetTimeoutMValue(&_cmdSubPsuPriority_time);
 				int logTime = GetTimeoutMValue(&_log_time);
-				//int _timebuf = 0;
+				int smoothTime = GetTimeoutMValue(&_smooth_time);
 
 				if (time < 0)
 					GetTimespecMFunc(&_cmdSubPsuPriority_time);
@@ -1850,14 +1839,14 @@ int main(void)
 
 									PsuOutputCurrentLimtit(_shareGroup, &_shareOutputCur_buf);
 									ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputCurrent = _shareOutputCur_buf;
-//									if (logTime >= 1000)
-//									{
-//										PRINTF_FUNC("_shareGroup = %d, ShareTargetCurrent = %d, GroupPresentOutputCurrent = %d, GroupTargetOutputCurrent = %d \n",
-//												_shareGroup,
-//												ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent,
-//												ShmPsuData->PsuGroup[_shareGroup].GroupPresentOutputCurrent,
-//												ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputCurrent);
-//									}
+									if (logTime >= LOG_TIME)
+									{
+										PRINTF_FUNC("_shareGroup = %d, ShareTargetCurrent = %d, GroupPresentOutputCurrent = %d, GroupTargetOutputCurrent = %d \n",
+												_shareGroup,
+												ShmSmartBoxData->Dynamic4Fetch[gunIndex].ShareTargetCurrent,
+												ShmPsuData->PsuGroup[_shareGroup].GroupPresentOutputCurrent,
+												ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputCurrent);
+									}
 
 									if (ShmPsuData->PsuGroup [_shareGroup].GroupTargetOutputVoltage <= PSU_MIN_VOL)
 									{
@@ -1878,7 +1867,7 @@ int main(void)
 							{
 								byte _releaseGroup = ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseGroup;
 
-								if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep >= _PSU_DYNAMIC_RELEASE_STEP_PWROFF &&
+								if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep >= _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE &&
 										ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep <= _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
 								{
 									unsigned short _releaseTargetVol = chargingInfo[gunIndex]->EvBatterytargetVoltage * 10;
@@ -1893,13 +1882,69 @@ int main(void)
 //												_releasePsuCount_buf);
 //									}
 
-									if ((chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP < PSU_MIN_OUTPUT_CUR)
-										_releaseTargetCur = PSU_MIN_OUTPUT_CUR;
+									if (ShmSmartBoxData->Dynamic4Release[gunIndex].AutoRelease)
+									{
+										_releaseTargetCur = ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent;
+										if (smoothTime >= SMOOTH_TIME)
+										{
+											if (ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent - RELEASE_CUR_GAP < PSU_MIN_OUTPUT_CUR * 10)
+												_releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
+											else
+												_releaseTargetCur = ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent - RELEASE_CUR_GAP;
+										}
+
+//										if (ShmSmartBoxData->Dynamic4Release [gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
+//										{
+//											ShmPsuData->PsuGroup [_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
+//											PsuOutputCurrentLimtit ( _releaseGroup,
+//													& _releaseTargetCur );
+//											ShmPsuData->PsuGroup [_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
+//
+//											PsuPowerON ( _releaseGroup );
+//										}
+//										else if (ShmSmartBoxData->Dynamic4Release [gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
+//										{
+//											PsuPowerOFF ( gunIndex, _releaseGroup );
+//										}
+									}
 									else
-										_releaseTargetCur = (chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP;
+									{
+										if ((chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP < PSU_MIN_OUTPUT_CUR * 10)
+											_releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
+										else
+											_releaseTargetCur = (chargingInfo[gunIndex]->EvBatterytargetCurrent * 10) - ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur - PSU_CUR_GAP;
+//
+//										if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
+//										{
+//											ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
+//											PsuOutputCurrentLimtit(_releaseGroup, &_releaseTargetCur);
+//											ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
+//
+//											PsuPowerON(_releaseGroup);
+//										}
+//										else if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
+//										{
+//											PsuPowerOFF(gunIndex, _releaseGroup);
+//										}
+									}
 
-									if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_PWROFF)
+									if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE)
 									{
+										int _releaseTime = 0;
+
+										if (!_releaseWait_chk[gunIndex])
+										{
+											_releaseWait_chk[gunIndex] = true;
+											GetTimespecMFunc(&_releaseWait_time[gunIndex]);
+										}
+										else
+										{
+											_releaseTime = GetTimeoutMValue(&_releaseWait_time[gunIndex]);
+
+											if (_releaseTime >= WAIT_LIMIT_TIME)
+												_releaseTargetCur = PSU_MIN_OUTPUT_CUR * 10 * ShmPsuData->PsuGroup[_releaseGroup].GroupPresentPsuQuantity;
+										}
+
 										ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputVoltage = _releaseTargetVol;
 										PsuOutputCurrentLimtit(_releaseGroup, &_releaseTargetCur);
 										ShmPsuData->PsuGroup[_releaseGroup].GroupTargetOutputCurrent = _releaseTargetCur;
@@ -1909,6 +1954,7 @@ int main(void)
 									else if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_WAIT_FINISH)
 									{
 										PsuPowerOFF(gunIndex, _releaseGroup);
+										_releaseWait_chk[gunIndex] = false;
 									}
 								}
 							}
@@ -1921,6 +1967,9 @@ int main(void)
 								byte _targetGroup = ConnectorUsingSeq[gunIndex][_psuGpIndex];
 								byte psuTotalCount = chargingInfo[gunIndex]->_TotalPsuCount - _releasePsuCount_buf;
 
+								if (ShmPsuData->PsuGroup[_targetGroup].GroupPresentPsuQuantity <= 0)
+									continue;
+
 								unsigned short _targetOutputVol_buf = chargingInfo[gunIndex]->EvBatterytargetVoltage * 10;
 								float _evTargetCur = chargingInfo[gunIndex]->EvBatterytargetCurrent;
 
@@ -1934,7 +1983,14 @@ int main(void)
 									if (ShmSmartBoxData->Dynamic4Release[gunIndex].ReleaseGroup == _targetGroup)
 										continue;
 									else
-										_evTargetCur = ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur / 10;
+									{
+										if (ShmSmartBoxData->Dynamic4Release[gunIndex].AutoRelease)
+										{
+											_evTargetCur = chargingInfo[gunIndex]->EvBatterytargetCurrent - _releaseTargetCur / 10;
+										}
+										else
+											_evTargetCur = ShmSmartBoxData->Dynamic4Release[gunIndex].LimitCur / 10;
+									}
 								}
 
 								unsigned short _targetOutputCur_buf = 0;
@@ -2012,6 +2068,9 @@ int main(void)
 
 				if (logTime > LOG_TIME)
 					GetTimespecMFunc(&_log_time);
+
+				if (smoothTime > SMOOTH_TIME)
+					GetTimespecMFunc(&_smooth_time);
 			}
 				break;
 		}

+ 7 - 1
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -35,7 +35,9 @@ typedef unsigned short 	word;
 typedef unsigned int 		unit;
 
 #define PSU_CUR_GAP			20 	// 0.1A
-#define LOG_TIME			5000 // 1ms
+#define LOG_TIME			2000 // 1ms
+#define SMOOTH_TIME			100	// 1ms
+#define WAIT_LIMIT_TIME		10000	// 1ms
 
 unsigned char _gunCountRecord;
 struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -45,6 +47,10 @@ struct timespec _cmdSubPsuPriority_time;
 struct timespec _derating_time;
 struct timespec _max_time;
 struct timespec _log_time;
+struct timespec	_smooth_time;
+
+struct timespec _releaseWait_time[DC_CONNECTOR_COUNT];
+bool _releaseWait_chk[DC_CONNECTOR_COUNT];
 
 byte _delayToGetCap;
 

BIN
EVSE/Projects/DS60-120/Apps/Module_SmartBox


+ 94 - 49
EVSE/Projects/DS60-120/Apps/Module_SmartBox.c

@@ -823,6 +823,27 @@ void Chk2StopFetchStep(byte _targetConn)
 	}
 }
 
+bool GetCanFetchResult(byte gun_index)
+{
+	// 如果當前輸出接近實際可提供的能量 (距離 <= CAP_GAP_FETCH <3KW>)
+	// 不取 EvBatterytargetVoltage 原因是小板會將該值做不同的處理方式
+	float needPower = chargingInfo[gun_index]->PresentChargingVoltage *
+			chargingInfo[gun_index]->EvBatterytargetCurrent / 100;
+
+	ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch =
+		(needPower > 0 && needPower >= chargingInfo[gun_index]->RealRatingPower - CAP_GAP_FETCH) ? true : false;
+
+	if (!ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch)
+	{
+		// 考慮每顆模塊最大輸出電流為 100A
+		ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch = (chargingInfo[gun_index]->EvBatterytargetCurrent >=
+			chargingInfo[gun_index]->AvailableChargingCurrent - LIMIT_PWR_MODULE_GAP) ? true : false;
+
+	}
+
+	return ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch;
+}
+
 void FetchFork()
 {
 	pid_t fetchPid;
@@ -883,7 +904,7 @@ void FetchFork()
 				else if (chargingInfo[gun_index]->SystemStatus == SYS_MODE_PREPARING)
 				{
 					// 這個階段只會拿到屬於該槍的模塊群
-					if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES && gun_index == GUN_RIGHT)
+					if (ShmDcCommonData->systemType == _SYSTEM_TYPE_SIMPLE)
 					{
 						// 壁掛 : 強制使用第零群
 					    AddGroup2Connector(gun_index, _PSU_GROUP_INDEX_0);
@@ -900,10 +921,6 @@ void FetchFork()
 				}
 				else if (chargingInfo[gun_index]->SystemStatus == SYS_MODE_CHARGING)
 				{
-					// 如果當前輸出接近實際可提供的能量 (距離 <= CAP_GAP_FETCH <3KW>)
-					// 不取 EvBatterytargetVoltage 原因是小板會將該值做不同的處理方式
-					float needPower = chargingInfo[gun_index]->PresentChargingVoltage *
-							chargingInfo[gun_index]->EvBatterytargetCurrent / 100;
 					// 判斷是否可以及需要提供多餘群輸出
 					byte chkRemainGp = NONE_GROUP_CAN_SELECTED;
 
@@ -912,8 +929,7 @@ void FetchFork()
 					else
 						chkRemainGp = ShmSmartBoxData->Dynamic4Fetch[gun_index].ShareGroup;
 
-					ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch =
-							(needPower > 0 && needPower >= chargingInfo[gun_index]->RealRatingPower - CAP_GAP_FETCH) ? true : false;
+					ShmSmartBoxData->ConnectorStatus[gun_index].NeedToFetch = GetCanFetchResult(gun_index);
 
 					if (ShmDcCommonData->systemType != _SYSTEM_TYPE_SIMPLE &&
 							ShmSmartBoxData->Dynamic4Release[gun_index].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_NONE &&
@@ -965,7 +981,7 @@ void FetchFork()
 				FetchLoopProcessing(gun_index);
 			}
 
-			usleep(200000);
+			usleep(50000);
 		}
 	}
 }
@@ -981,6 +997,7 @@ void InitializeDynamicRelease(byte _targetConn)
 	ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwrCap = 0;
 	ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCur = 0;
 	ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwr = 0;
+	ShmSmartBoxData->Dynamic4Release[_targetConn].AutoRelease = NO;
 	ShmSmartBoxData->Dynamic4Release[_targetConn].ReleaseLoopStep = _PSU_DYNAMIC_FETCH_STEP_FINISH;
 }
 
@@ -1009,47 +1026,27 @@ void ReleaseLoopProcessing(byte _targetConn)
 		case _PSU_DYNAMIC_RELEASE_STEP_LIMIT:
 		{
 			// 應該要通知可輸出的能量與電流
-//			PRINTF_FUNC("_targetConn = %d, LimitCurCap = %.1f, LimitPwrCap = %.1f \n",
-//					_targetConn,
-//					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCurCap,
-//					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwrCap);
-
-			// 通知可輸出的能量與電流
-//			PRINTF_FUNC("_targetConn = %d, LimitCur = %.1f, LimitPwr = %.1f \n",
-//					_targetConn,
-//					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCur,
-//					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwr);
-
-			// 需求能量與電流
-//			PRINTF_FUNC("_targetConn = %d, Req Power = %.1f (kw), Req Vol. = %.1f, Req Cur. = %.1f, Present Cur = %.1f \n",
-//					_targetConn,
-//					(chargingInfo[_targetConn]->EvBatterytargetVoltage * chargingInfo[_targetConn]->EvBatterytargetCurrent) / 100,
-//					chargingInfo[_targetConn]->EvBatterytargetVoltage,
-//					chargingInfo[_targetConn]->EvBatterytargetCurrent,
-//					chargingInfo[_targetConn]->PresentChargingCurrent);
-
 			// if the current and power limits are below their capacity
-			if ((ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCur <= ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCurCap &&
-					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwr <= ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwrCap) ||
-					chargingInfo[_targetConn]->PresentChargingCurrent * 10 <= PSU_LIMIT_CUR)
+//			if (ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwr <= ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwrCap ||
+//					chargingInfo[_targetConn]->PresentChargingCurrent * 10 <= PSU_LIMIT_CUR)
+
+			if (ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwr <= ShmSmartBoxData->Dynamic4Release[_targetConn].LimitPwrCap)
 			{
-				PRINTF_FUNC("***** RELEASE_STEP_PWROFF ***** (Gun - %d) \n", _targetConn);
-				ShmSmartBoxData->Dynamic4Release[_targetConn].ReleaseLoopStep = _PSU_DYNAMIC_RELEASE_STEP_PWROFF;
+				PRINTF_FUNC("***** RELEASE_STEP_CUR_SHARE ***** (Gun - %d) \n", _targetConn);
+				ShmSmartBoxData->Dynamic4Release[_targetConn].ReleaseLoopStep = _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE;
 			}
 		}
 			break;
-		case _PSU_DYNAMIC_RELEASE_STEP_PWROFF:
+		case _PSU_DYNAMIC_RELEASE_STEP_CUR_SHARE:
 		{
-//			PRINTF_FUNC("targetGroup = %d, PresentChargingCurrent = %.1f, LimitCur = %.1f \n",
-//				_targetConn,
-//				chargingInfo[_targetConn]->PresentChargingCurrent,
-//				ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCur / 10);
+			PRINTF_FUNC("targetGroup = %d, GroupPresentOutputCurrent = %.1f \n",
+					targetGroup,
+					ShmPsuData->PsuGroup[targetGroup].GroupPresentOutputCurrent);
 
 			// if the output current is below their capacity for 5s
 			int _t = GetTimeoutValue(&ShmSmartBoxData->SmartChk[_targetConn].ReleaseLoopTime);
 
-			if (chargingInfo[_targetConn]->PresentChargingCurrent <=
-					ShmSmartBoxData->Dynamic4Release[_targetConn].LimitCur &&
+			if (ShmPsuData->PsuGroup[targetGroup].GroupPresentOutputCurrent <= RELEASE_STEP_CUR_SHARE &&
 					_t >= WAIT_FOR_LIMIT_STABLE)
 			{
 				PRINTF_FUNC("***** RELEASE_STEP_RELAYOFF ***** (Gun - %d) \n", _targetConn);
@@ -1126,6 +1123,28 @@ void Chk2StopReleaseStep(byte _targetConn)
 		ShmSmartBoxData->SmartChk[_targetConn].IsReleaseStart = NO;
 }
 
+bool GetCanReleaseResult(byte gun_index, byte releaseGp)
+{
+	bool result = false;
+	unsigned short releasePwr = ShmPsuData->PsuGroup[releaseGp].TotalRatingPower * 10;
+	float needPower = chargingInfo[gun_index]->PresentChargingVoltage *
+				chargingInfo[gun_index]->EvBatterytargetCurrent / 100;
+
+	result = (chargingInfo[gun_index]->RealRatingPower > 0 && releasePwr > 0 &&
+			needPower < chargingInfo[gun_index]->RealRatingPower - releasePwr - CAP_GAP_RELEASE) ? true : false;
+
+	if (result)
+	{
+		// afterReleaseMdCur 每個模塊最大 100A : 1A
+		float afterReleaseMdCur = chargingInfo[gun_index]->AvailableChargingCurrent -
+				ShmPsuData->PsuGroup[releaseGp].GroupAvailableCurrent;
+
+		result = (chargingInfo[gun_index]->EvBatterytargetCurrent >= afterReleaseMdCur - LIMIT_PWR_MODULE_GAP) ? false : true;
+	}
+
+	return result;
+}
+
 void ReleaseFork()
 {
 	pid_t releasePid;
@@ -1163,19 +1182,16 @@ void ReleaseFork()
 					byte releaseGp = CheckReleasePwrByConIndex(gun_index);
 					if (releaseGp != NONE_GROUP_CAN_SELECTED)
 					{
-						unsigned short releasePwr = ShmPsuData->PsuGroup[releaseGp].TotalRatingPower * 10;
-						float needPower = chargingInfo[gun_index]->PresentChargingVoltage *
-									chargingInfo[gun_index]->EvBatterytargetCurrent / 100;
+						bool canRelease = GetCanReleaseResult(gun_index, releaseGp);
 
 						if (chargingInfo[gun_index]->Type != _Type_Test &&
 								ShmSmartBoxData->Dynamic4Fetch[gun_index].FetchLoopStep == _PSU_DYNAMIC_FETCH_STEP_NONE &&
 								(ShmSmartBoxData->AnotherConnectorStatus[gun_index].ConnectorStaus == _CONNECTOR_STATUS_WAIT ||
 								(ShmSmartBoxData->AnotherConnectorStatus[gun_index].NeedToFetch &&
 									SMART_MODE && chargingInfo[gun_index]->_TakePsuGpCount > ShmDcCommonData->halfGroupCount) ||
-								(chargingInfo[gun_index]->RealRatingPower > 0 && releasePwr > 0 &&
-									needPower < chargingInfo[gun_index]->RealRatingPower - releasePwr - CAP_GAP_RELEASE) ||
-									ShmDcCommonData->smartReleaseRun[gun_index])
-									)
+								canRelease ||
+								ShmDcCommonData->smartReleaseRun[gun_index])
+							)
 						{
 							//PRINTF_FUNC("RealRatingPower = %d \n", chargingInfo[gun_index]->RealRatingPower);
 							//PRINTF_FUNC("releasePwr = %d, needPower = %f \n", releasePwr, needPower);
@@ -1263,7 +1279,7 @@ void ReleaseFork()
 				ReleaseLoopProcessing(gun_index);
 			}
 
-			usleep(200000);
+			usleep(50000);
 		}
 	}
 }
@@ -1289,7 +1305,7 @@ void AssignedPwr2Connector()
 		byte usingGroupCount = 0;
 		float availablePwr = 0, availableCur = 0, iAvailableCur = 0, totalPsuCount = 0, kwAvailablePwr = 0;
 		float outputVol = 0, outputCur = 0;
-		float limitCur = 0, limitPwr = 0;
+		float limitCur = 0, limitPwr = 0, remainCur = 0;
 
 		for (byte group = 0; group < ShmPsuData->GroupCount; group++)
 		{
@@ -1317,6 +1333,7 @@ void AssignedPwr2Connector()
 						ShmSmartBoxData->Dynamic4Release[_gun].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_LIMIT)
 				{
 					limitCur += ShmPsuData->PsuGroup[group].GroupTargetOutputCurrent;
+					remainCur += ShmPsuData->PsuGroup[group].TotalIAvailableCurrent;
 					limitPwr += ShmPsuData->PsuGroup[group].TotalRatingPower;
 				}
 
@@ -1333,6 +1350,14 @@ void AssignedPwr2Connector()
 		chargingInfo[_gun]->DeratingChargingCurrent = iAvailableCur;
 		chargingInfo[_gun]->_TotalPsuCount = totalPsuCount;
 		chargingInfo[_gun]->PresentChargingVoltage = outputVol / 10;
+
+		// 在低於最大 1KW 輸出時~ 讓我們偷雞一下~
+		if (chargingInfo[_gun]->SystemStatus == SYS_MODE_CHARGING)
+		{
+			if (chargingInfo[_gun]->RealMaxPower <= 10 && outputCur < (chargingInfo[_gun]->RealMaxCurrent * 0.9))
+				outputCur = (chargingInfo[_gun]->RealMaxCurrent * 0.9);
+		}
+
 		chargingInfo[_gun]->PresentChargingCurrent = outputCur / 10;
 		chargingInfo[_gun]->RealRatingPower = kwAvailablePwr * 10;
 		chargingInfo[_gun]->_TakePsuGpCount = usingGroupCount;
@@ -1342,8 +1367,28 @@ void AssignedPwr2Connector()
 			TakeAnotherGunStatus(_gun);
 
 		// 取 Release group 的最大電流
-		if (ShmSmartBoxData->Dynamic4Release[_gun].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_LIMIT)
+		if (ShmSmartBoxData->Dynamic4Release[_gun].ReleaseLoopStep == _PSU_DYNAMIC_RELEASE_STEP_LIMIT &&
+				ShmSmartBoxData->Dynamic4Release[_gun].LimitPwrCap == 0)
 		{
+			// limitCur : 下給剩餘群的需求電流
+			//ShmSmartBoxData->Dynamic4Release[_gun].LimitCurCap = limitCur;
+
+			// Release 均流想法(總結) : 如果是抽載不足的自然釋放~ 應該都會跑均流方式
+			// 狀況一 : 群1 : 30A,群2 : 30A 共 60A 輸出,且實際上群1 可提供的電流為 75A (400V 輸出)
+			// 狀況二 : 群1 : 75A,群2 : 75A 共 150A 輸出,且實際上群1 可提供的電流為 75A (400V 輸出)
+			// 狀況三 : 群1 : 70A,群2 : 70A 共 140A 輸出,且實際上群1 可提供的電流為 75A (400V 輸出)
+			// ---------------------------------------------
+			// 狀況一 : 60A  <= 群1可提供的 75A : 均流
+			// 狀況一 : 150A > 群1可提供的 75A 	: 直接切斷
+			// 狀況一 : 140A > 群1可提供的 75A 	: 直接切斷
+			if (chargingInfo[_gun]->PresentChargingCurrent <= remainCur)
+			{
+				PRINTF_FUNC("PresentChargingCurrent = %f, remainCur = %f \n", chargingInfo[_gun]->PresentChargingCurrent, remainCur / 10);
+				limitCur = chargingInfo[_gun]->PresentChargingCurrent * 10;
+				ShmSmartBoxData->Dynamic4Release[_gun].AutoRelease = YES;
+			}
+			else
+				PRINTF_FUNC("limitCur = %f \n", limitCur);
 			ShmSmartBoxData->Dynamic4Release[_gun].LimitCurCap = limitCur;
 			ShmSmartBoxData->Dynamic4Release[_gun].LimitPwrCap = limitPwr * 10;
 		}

+ 2 - 1
EVSE/Projects/DS60-120/Apps/Module_SmartBox.h

@@ -53,6 +53,8 @@
 #define CAP_GAP_RELEASE			50	// 0.1kw
 #define STABLE_CAP_GAP			10	// 0.1kw
 #define SMART_MODE				1 	// 0 : FCFS, 1 : Average
+#define LIMIT_PWR_MODULE_GAP	2	// 1A
+#define RELEASE_STEP_CUR_SHARE	20	// 0.1A
 
 // Fetch Loop
 #define PSU_TG_VOL_GAP			100 // 0.1V
@@ -63,7 +65,6 @@
 #define PSU_LIMIT_CUR			50 	// 0.1A
 // Release Loop End
 
-
 #define FETCH_SMART_CHK_TIME		5000	// 1ms
 #define FETCH_FINISH_WAIT_TIME		1000	// 1ms
 

BIN
EVSE/Projects/DS60-120/Apps/ReadCmdline


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

@@ -61,7 +61,7 @@ typedef unsigned char			byte;
 
 byte _curAutoRunCount = 0;
 byte _usingAutoRun = 0;
-struct timeval _autoTime;
+struct timespec _autoTime;
 
 byte ConnectorUsingSeq[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY][4] =
 {{0, 2, 3, 1}, {1, 3, 2, 0}};
@@ -85,10 +85,14 @@ struct PsuData 					*ShmPsuData;
 struct DcCommonInformation		*ShmDcCommonData;
 struct OCPP16Data				*ShmOCPP16Data;
 struct SmartBoxData				*ShmSmartBoxData;
+struct MeterInformation			*ShmCsuMeterData;
 
 struct ChargingInfoData 		*_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct ChargingInfoData 		*ac_chargingInfo[AC_QUANTITY];
 
+bool isLog = false;
+struct timespec _log_time;
+
 char *msg = "state : get gun state (index) \n"
 		"card : scanning card (x) : \n"
 		"gun : get gun plugit state (index) \n"
@@ -97,6 +101,59 @@ char *msg = "state : get gun state (index) \n"
 		"ver : ver of board (407 or index or rb or fan) \n"
 		"ac : get ac relay state (x) \n";
 
+#define DEBUG_INFO_MSG(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+
+int StoreLogMsg(const char *fmt, ...)
+{
+	char Buf[4096+256];
+	char buffer[4096];
+	va_list args;
+	struct timeb  SeqEndTime;
+	struct tm *tm;
+
+	va_start(args, fmt);
+	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+	va_end(args);
+
+	memset(Buf,0,sizeof(Buf));
+	ftime(&SeqEndTime);
+	SeqEndTime.time = time(NULL);
+	tm=localtime(&SeqEndTime.time);
+
+	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog_%s_Log",
+		tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+		buffer,
+		tm->tm_year+1900,tm->tm_mon+1,
+		ShmSysConfigAndInfo->SysConfig.SerialNumber);
+	system(Buf);
+
+	return rc;
+}
+
+void PRINTF_FUNC(char *string, ...)
+{
+	va_list args;
+	char buffer[4096];
+	va_start(args, string);
+	vsnprintf(buffer, sizeof(buffer), string, args);
+	va_end(args);
+
+	DEBUG_INFO_MSG("%s ", buffer);
+}
+
+int GetTimeoutValue(struct timespec *startTime)
+{
+	struct timespec endTime;
+
+	clock_gettime(CLOCK_MONOTONIC_COARSE, &endTime);
+	return endTime.tv_sec - startTime->tv_sec;
+}
+
+void GetTimespecFunc(struct timespec *time)
+{
+	clock_gettime(CLOCK_MONOTONIC_COARSE, time);
+}
+
 bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
 {
 	for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
@@ -267,15 +324,16 @@ int InitShareMemory()
    		result = FAIL;
    	}
 
-    return result;
-}
-
-unsigned long GetTimeoutValue(struct timeval _sour_time)
-{
-	struct timeval _end_time;
-	gettimeofday(&_end_time, NULL);
+	if ((MeterSMId = shmget ( ShmCsuMeterKey, sizeof(struct MeterInformation), IPC_CREAT | 0777 )) < 0)
+	{
+		result = FAIL;
+	}
+	else if ((ShmCsuMeterData = shmat ( MeterSMId, NULL, 0 )) == (void *) - 1)
+	{
+		result = FAIL;
+	}
 
-	return (_end_time.tv_sec - _sour_time.tv_sec);
+    return result;
 }
 
 void PrintConnectorState(byte state)
@@ -374,6 +432,9 @@ void RunStatusProc(char *v1, char *v2)
 				ShmDcCommonData->ConnectorTemp1[_index] - 60,
 				ShmDcCommonData->ConnectorTemp2[_index] - 60);
 			printf ("index = %x, Available = %d \n", _index, _chargingData[_index]->IsAvailable);
+			printf ("IdTag = %s, ParentId = %s \n",
+					_chargingData[_index]->StartUserId,
+					_chargingData[_index]->ParentIdTag);
 		}
 		else
 		{
@@ -558,8 +619,8 @@ void CreateOneError()
 	for (byte i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
 	{
 		printf("(%d). %s \n", i, &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0]);
+		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], "", 7);
 	}
-
 }
 
 void GetAuthorizeFlag(char *v1)
@@ -639,6 +700,37 @@ void SetChargingInfoCCID(char *v1, char* v2)
 	_chargingData[_index]->EVCCID[strlen(v2)] = '\0';
 }
 
+void LogGunTempandCurrent(char *v1, char* v2)
+{
+	int _index = atoi(v1);
+	int _waitTime = atoi(v2);
+	if(!FindChargingInfoData(_index, &_chargingData [0]))
+	{
+		printf ( "FindChargingInfoData error\n" );
+		return;
+	}
+
+	GetTimespecFunc(&_log_time);
+	for(;;)
+	{
+		int time = GetTimeoutValue(&_log_time);
+
+		if (time < 0 || time > _waitTime)
+		{
+			PRINTF_FUNC("Gun_%d, Temp = %d, outCur = %f \n",
+						_index,
+						_chargingData[_index]->ConnectorTemp - 60,
+						_chargingData[_index]->PresentChargingCurrent);
+
+			PRINTF_FUNC ( "OutputV = %f, OutputC = %f \n",
+						 _chargingData[_index]->FireChargingVoltage,
+						 _chargingData[_index]->PresentChargingCurrent);
+
+			GetTimespecFunc(&_log_time);
+		}
+	}
+}
+
 void GetGunTemp(char *v1)
 {
 	int _index = atoi(v1);
@@ -704,6 +796,36 @@ void GetDcMeterInfor(char *v1)
 			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].presentPower,
 			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy,
 			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeExportEnergy);
+
+	printf("Index = %d, publicKeyOcmf = %s, transactionOCMF = %s, ActionCmd = %d, OcmpInfoReady = %d \n",
+			_index,
+			ShmSysConfigAndInfo->SysInfo.DcMeterStatusInfo[_index].publicKeyOcmf,
+			ShmSysConfigAndInfo->SysInfo.DcMeterTransactionAction[_index].transactionOCMF,
+			ShmSysConfigAndInfo->SysInfo.DcMeterTransactionAction[_index].ActionCmd,
+			ShmSysConfigAndInfo->SysInfo.DcMeterTransactionAction[_index].OcmfInfoReady);
+}
+
+void GetAcMeterInfor(char *v1)
+{
+	int _index = atoi(v1);
+
+	printf ("Index = %d, curMeterValue = %f newMeterValue = %f, isCalculation = %d, _chargingValue = %f, _curTotalCharging = %f \n",
+			_index,
+			ShmCsuMeterData->_meter[_index].curMeterValue,
+			ShmCsuMeterData->_meter[_index].newMeterValue,
+			ShmCsuMeterData->_meter[_index].isCalculation,
+			ShmCsuMeterData->_meter[_index]._chargingValue,
+			ShmCsuMeterData->_meter[_index]._curTotalCharging);
+}
+
+void GetLocalSharingInfor(char *v1)
+{
+	int _index = atoi(v1);
+
+	printf ("Index = %d, isConnectedSharingServer = %d, AvailableShargingCurrent = %d \n",
+		_index,
+		ShmSysConfigAndInfo->SysInfo.localSharingInfo.isConnectedSharingServer,
+		ShmSysConfigAndInfo->SysInfo.localSharingInfo.AvailableShargingCurrent[_index]);
 }
 
 void GetPowerValue()
@@ -731,9 +853,10 @@ void GetSystemInfo()
 			ShmPsuData->SystemAvailableCurrent / 10
 			);
 
-	printf ("Config : ChargingPower = %d, ChargingCurrent = %d \n",
+	printf ("Config : ChargingPower = %d, ChargingCurrent = %d, ChargingVoltage = %d \n",
 			ShmSysConfigAndInfo->SysConfig.MaxChargingPower,
-			ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
+			ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent,
+			ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage);
 }
 
 void ChangeGunNum()
@@ -1161,8 +1284,9 @@ void GetConnectorCapInfo(char *v1)
 		return;
 	}
 
-	printf ("Charger Max Current = %d, Max Power = %d \n",
+	printf ("Charger Max Current = %d, Max Voltage = %d, Max Power = %d \n",
 			ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent * 10,
+			ShmSysConfigAndInfo->SysConfig.MaxChargingVoltage * 10,
 			ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10);
 
 	printf ("Index = %d, MaxPow = %f, MaxVol = %f, MaxCur = %f\n",
@@ -1524,6 +1648,53 @@ void CalcPresentChargingPower(byte _index)
 	}
 }
 
+void LogPsuTemp()
+{
+	char _ex_maxTemp = 0;
+	char _cr_maxTemp = 0;
+
+	for (byte index = 0; index < ShmPsuData->GroupCount; index ++)
+	{
+		_ex_maxTemp = 0;
+		_cr_maxTemp = 0;
+		for (byte count = 0; count < ShmPsuData->PsuGroup [index].GroupPresentPsuQuantity; count ++)
+		{
+			if (ShmPsuData->PsuGroup [index].PsuModule [count].ExletTemp > _ex_maxTemp)
+				_ex_maxTemp = ShmPsuData->PsuGroup [index].PsuModule [count].ExletTemp;
+			if (ShmPsuData->PsuGroup [index].PsuModule [count].CriticalTemp1 > _cr_maxTemp)
+				_cr_maxTemp = ShmPsuData->PsuGroup [index].PsuModule [count].CriticalTemp1;
+		}
+		PRINTF_FUNC ( "D.D. Temp = %d ------ Env Temp = %d \n", _ex_maxTemp, _cr_maxTemp );
+	}
+}
+
+void LogPsuOutput(byte _GunIndex)
+{
+	for (int i = 0; i < ShmPsuData->GroupCount; i ++)
+	{
+		PRINTF_FUNC ( "Group Index = %d, OutputV = %d, OutputC = %d \n",
+				i, ShmPsuData->PsuGroup [i].GroupPresentOutputVoltage,
+				ShmPsuData->PsuGroup [i].GroupPresentOutputCurrent );
+	}
+
+	if (!FindChargingInfoData(_GunIndex, & _chargingData [0]))
+	{
+		PRINTF_FUNC("LogPsuOutput FindChargingInfoData error\n");
+		return;
+	}
+
+	PRINTF_FUNC ( "From RB : Group Index = %d, OutputV = %f \n",
+			_GunIndex, _chargingData[_GunIndex]->FireChargingVoltage);
+}
+
+void LogFanSpeed()
+{
+	PRINTF_FUNC("ShmFanModuleData->PresentFan1Speed = %d \n", ShmFanModuleData->PresentFan1Speed);
+	PRINTF_FUNC("ShmFanModuleData->PresentFan2Speed = %d \n", ShmFanModuleData->PresentFan2Speed);
+	PRINTF_FUNC("ShmFanModuleData->PresentFan3Speed = %d \n", ShmFanModuleData->PresentFan3Speed);
+	PRINTF_FUNC("ShmFanModuleData->PresentFan4Speed = %d \n", ShmFanModuleData->PresentFan4Speed);
+}
+
 void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 {
 	int _GunIndex;
@@ -1561,24 +1732,15 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
         return;
     }
 
-//    if(_Current > 100 || _Current < 2){
-//
-//        printf ("Input Current over range\n");
-//        return;
-//    }
-
     //測試期間先跳過自我測試 _STEST_COMPLETE = 0xfe
     //ShmSysConfigAndInfo->SysInfo.SelfTestSeq = 0xfe;
     ShmSysConfigAndInfo->SysInfo.CurGunSelected = _GunIndex;
     _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9;
     sleep(1);
-    //kill ev task
-    system("killall Module_EvComm");
-
-    //_Voltage = (_Voltage * 10);
-    //_Current = (_Current * 10);
 
-    //system(STTY_US TTY_PATH);
+    system("killall Module_EvComm");
+    isLog = false;
+    GetTimespecFunc(&_log_time);
 
     while(true)
     {
@@ -1757,7 +1919,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
         	        else
         	        {
         	        	_curAutoRunCount = 0;
-        	        	gettimeofday(&_autoTime, NULL);
+        	        	GetTimespecFunc(&_autoTime);
         	        }
 
         	        _chargingData[_GunIndex]->EvBatterySoc = 50;
@@ -1772,19 +1934,19 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
         	    if (_usingAutoRun == 0x01)
         	    {
-        	    	if (((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP1_TIME_START * 60 && (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP1_TIME_END * 60) ||
-        	    			((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP2_TIME_START * 60 && (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP2_TIME_END * 60))
+        	    	if (((GetTimeoutValue(&_autoTime)) >= AUTORUN_STEP1_TIME_START * 60 && (GetTimeoutValue(&_autoTime)) <= AUTORUN_STEP1_TIME_END * 60) ||
+        	    			((GetTimeoutValue(&_autoTime)) >= AUTORUN_STEP2_TIME_START * 60 && (GetTimeoutValue(&_autoTime)) <= AUTORUN_STEP2_TIME_END * 60))
         	    	{
         	    		_chargingData[_GunIndex]->EvBatterytargetVoltage = _Voltage;
         	    		_chargingData[_GunIndex]->EvBatterytargetCurrent = _Current;
         	    	}
-        	    	else if ((GetTimeoutValue(_autoTime)) >= AUTORUN_END_TIME * 60)
+        	    	else if ((GetTimeoutValue(&_autoTime)) >= AUTORUN_END_TIME * 60)
         	    	{
         	    		_curAutoRunCount++;
         	    		if (_curAutoRunCount >= AUTORUN_CYCLE_COUNT)
         	    			_chargingData[_GunIndex]->SystemStatus = SYS_MODE_TERMINATING;
         	    		else
-        	    			gettimeofday(&_autoTime, NULL);
+        	    			GetTimespecFunc(&_autoTime);
         	    	}
         	    	else
         	    	{
@@ -1849,6 +2011,19 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     			break;
     	}
 
+    	int time = GetTimeoutValue(&_log_time);
+
+    	if (time < 0 || time > 120)
+    	{
+    		if (isLog)
+    		{
+    			LogPsuTemp();
+    			LogPsuOutput(_GunIndex);
+    			LogFanSpeed();
+    		}
+    		GetTimespecFunc(&_log_time);
+    	}
+
     	char word[128];
     	char newString[7][10];
     	int i,j,ctr;
@@ -1894,6 +2069,10 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     		_chargingData[_GunIndex]->EvBatterytargetVoltage = _vol;
     		_chargingData[_GunIndex]->EvBatterytargetCurrent = _cur;
     	}
+    	else if (strcmp(newString[0], "log") == 0)
+    	{
+    		isLog = !isLog;
+    	}
     	else if (strcmp(newString[0], "c") == 0)
     	{
     		printf("stop \n\r");
@@ -2148,10 +2327,40 @@ int main(void)
 			}
 			GetDcMeterInfor(newString[1]);
 		}
+		else if (strcmp(newString[0], "acmeter") == 0)
+		{
+			// AC meter infor
+			if (strcmp ( newString [1], "-1" ) == 0 || strcmp ( newString [1], "" ) == 0)
+			{
+				printf ( "meter cmd fail.\n" );
+				continue;
+			}
+			GetAcMeterInfor ( newString [1] );
+		}
+		else if (strcmp(newString[0], "share") == 0)
+		{
+			// local sharing
+			if (strcmp ( newString [1], "-1" ) == 0 || strcmp ( newString [1], "" ) == 0)
+			{
+				printf ( "local sharing cmd fail.\n" );
+				continue;
+			}
+			GetLocalSharingInfor(newString[1]);
+		}
 		else if (strcmp(newString[0], "soc") == 0)
 		{
 			GetSOC(newString[1]);
 		}
+		else if (strcmp(newString[0], "log") == 0)
+		{
+			if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||
+					strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0)
+			{
+				printf ("log fail.\n");
+				continue;
+			}
+			LogGunTempandCurrent(newString[1], newString[2]);
+		}
 		else if (strcmp(newString[0], "run") == 0)
 		{
 			if (ShmDcCommonData->_isAutoRunTest == YES)
@@ -2177,16 +2386,13 @@ int main(void)
 		}
 		else if (strcmp(newString[0], "test") == 0)
 		{
-//			if (!FindChargingInfoData(1, &_chargingData[0]))
-//			{
-//				printf("FindChargingInfoData error\n");
-//			}
-			if (ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq)
-				ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq = false;
-			else
-				ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq = true;
+			int SOCvalue = atoi(newString[2]);
+			if (!FindChargingInfoData(atoi(newString[1]), &_chargingData[0]))
+			{
+				printf("FindChargingInfoData error\n");
+			}
 
-			printf("isReq = %d \n", ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq);
+			_chargingData[atoi(newString[1])]->EvBatterySoc = SOCvalue;
 		}
 		else if (strcmp(newString[0], "ocpp") == 0)
 		{

BIN
EVSE/Projects/DS60-120/Apps/UnsafetyOutputTask


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

@@ -1219,7 +1219,7 @@ unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
 unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
 {
 	unsigned char result = FAIL;
-	unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_reset_mcu, 0x02, 0x00, 0x01, 0x00};
+	unsigned char tx[10] = {0xaa, 0x00, targetAddr, Cmd.config_reset_mcu, 0x02, 0x00, 0x01, 0x00, 0x01};
 	unsigned char rx[512];
 	unsigned char chksum = 0x00;
 

+ 96 - 0
EVSE/Projects/DS60-120/Apps/lcmComm_dgus.c

@@ -0,0 +1,96 @@
+/*
+ * lcmComm_dgus.c
+ *
+ * Created on : 2020-10-20
+ * Update on : 2022-03-01
+ * Author : Folus Wen, Eason Yang
+ * Version : V0.27
+ *
+ */
+
+#include 	"lcmComm_dgus.h"
+
+//#define isDebugPrint
+
+//=======================================
+// Basic routine
+//=======================================
+void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX)
+{
+	uint8_t output[8192];
+
+	memset(output, 0x00, ARRAY_SIZE(output));
+	sprintf((char*)output, "%s", (isRX?"RX: ":"TX: "));
+	for(uint16_t idx = 0;idx<len;idx++)
+	{
+		sprintf((char*)output, "%s%02x ", output, data[idx]);
+	}
+
+	//printf("%s\n", output);
+}
+
+//=======================================
+// Call function (Transmit message into LCD)
+//=======================================
+int transceiverDgus(int32_t fd, uint8_t *tx, uint16_t tx_len, uint8_t *rx, uint16_t rx_len)
+{
+	int result = FAIL;
+	int len;
+
+	tcflush(fd,TCIOFLUSH);
+
+	displayMessageDgus(tx, tx_len, NO);
+
+	if(write(fd, tx, tx_len) >= ARRAY_SIZE(tx))
+	{
+		usleep(100);
+		len = read(fd, rx, rx_len);
+		if(len > 0)
+		{
+			if((rx[0] == CMD_ACK_VALUE_1) && (rx[1] == CMD_ACK_VALUE_2))
+			{
+				displayMessageDgus(rx, len, YES);
+				result = PASS;
+			}
+		}
+	}
+	else
+	{}
+
+	return result;
+}
+
+//=======================================
+// Call function (Write register value function)
+//=======================================
+int8_t lcdRegisterWrite(int32_t fd, uint16_t address, uint8_t *data, uint8_t dataLen)
+{
+	int8_t result = FAIL;
+	uint8_t tx[5 + dataLen];
+	uint8_t rx[128];
+
+	memset(tx, 0x00, sizeof(tx));
+	memset(rx, 0x00, sizeof(rx));
+
+	tx[0] = CMD_HEADER_1;
+	tx[1] = CMD_HEADER_2;
+	tx[2] = (2 + dataLen);
+	tx[3] = CMD_REG_WRITE;
+	tx[4] = (address & 0xff);
+
+	memcpy(&tx[5], data, dataLen);
+
+	if(fd > 0)
+	{
+		if(transceiverDgus(fd, tx, ARRAY_SIZE(tx), rx, ARRAY_SIZE(rx)) == PASS)
+		{
+			result = PASS;
+		}
+		else
+		{}
+	}
+	else
+	{}
+
+	return result;
+}

+ 85 - 0
EVSE/Projects/DS60-120/Apps/lcmComm_dgus.h

@@ -0,0 +1,85 @@
+/*
+ * lcmComm_dwin.h
+ *
+ * Created on : 2020-10-20
+ * Update on : 2022-03-01
+ * Author : Folus Wen, Eason Yang
+ * Version : V0.27
+ *
+ */
+
+#ifndef LCMCOMM_DGUS_H_
+#define LCMCOMM_DGUS_H_
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <unistd.h>
+#include    <fcntl.h>
+#include    <termios.h>
+#include    <errno.h>
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+
+
+#define ARRAY_SIZE(A)			(sizeof(A) / sizeof(A[0]))
+#define PASS					1
+#define FAIL					-1
+#define YES						1
+#define NO						0
+#define ON						1
+#define OFF						0
+#define PAGE_DISPLAY_PERIOD		3
+
+//=======================================
+// Register Control type
+//=======================================
+#define REG_TYPE_CONTROL						0x00
+#define REG_TYPE_RAM							0x01
+#define REG_TYPE_SPECIAL_CONTROL				0x02
+
+//=======================================
+// Register content (Variable storage)
+//=======================================
+#define REG_ADDRESS_READ_VERSION				0x0F
+#define REG_ADDRESS_READ_RTC					0x10
+#define REG_ADDRESS_READ_PAGE_ID				0x14
+#define REG_ADDRESS_READ_BRIGHTNESS       		0x31
+#define REG_ADDRESS_WRITE_BRIGHTNESS			0X82
+#define REG_ADDRESS_SET_PAGE_ID					0x84
+#define REG_ADDRESS_SET_RTC						0x9C
+
+//=======================================
+// LCD command constant
+//=======================================
+#define CMD_HEADER_1							0x5A
+#define CMD_HEADER_2							0xA5
+#define CMD_REG_WRITE							0x80
+#define CMD_REG_READ							0x81
+#define CMD_REG_WRITE_DATA						0x82
+#define CMD_REG_READ_DATA						0x83
+#define CMD_ACK_VALUE_1							0x4F
+#define CMD_ACK_VALUE_2							0x4B
+
+extern int StoreLogMsg(const char *fmt, ...);
+extern int8_t lcdRegisterWrite(int32_t fd, uint16_t address, uint8_t *data, uint8_t dataLen);
+
+#endif /* LCMCOMM_DGUS_H_ */

BIN
EVSE/Projects/DS60-120/Apps/main


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 472 - 232
EVSE/Projects/DS60-120/Apps/main.c


BIN
EVSE/Projects/DS60-120/Images/FactoryDefaultConfig.bin


BIN
EVSE/Projects/DS60-120/Images/ramdisk.gz


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.