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

2022-11-30 / Alston Lin
Actions
1. Support LCM update function
2. Optimize the function of Psu task to release module
3. Add OCMF function of DC meter to communicate with the backend
4. Add chademo type (W) support to 200A and can boost to 350A
5. GBT type supports Vincode authorization
6. Add CTEP features including version 1.0 and 2.0
7. Supports communication with Bazel8
8. Optimize charging profile function to fix GL008_6
9. Add method to change max charging voltage before communcation (Customer : PS)
10. System Optimization
Files
1. As follow commit history

Alston Lin 2 жил өмнө
parent
commit
2d8a579592
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


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