Browse Source

2020-09-15 / Alston Lin

Actions
1. Modify the infypower lib structure

Files
1. As follow commit history
Alston 4 years ago
parent
commit
5d9d2821fc

+ 168 - 8
EVSE/Modularization/Infypwr_PsuCommObj.c

@@ -120,9 +120,9 @@ void RefreshGetOutputF(void *func)
 	return_get_output_float = func;
 }
 
-void RefreshFanInfo(void *func)
+void RefreshMisInfo(void *func)
 {
-	return_fanspeed_info = func;
+	return_mis_info = func;
 }
 
 void RefreshIavailable(void *func)
@@ -224,12 +224,44 @@ byte isFilterValue(unsigned int value)
 	return result;
 }
 
+bool GetRealIndexByGroup(byte *_address)
+{
+	for (byte i = 0; i < 2; i++)
+	{
+		for (byte j = 0; j < infy_pow_info[i].psuCount; j++)
+		{
+			if (infy_pow_info[i].serialNumber[j] == *_address)
+			{
+				*_address = infy_pow_info[i].targetNumber[j];
+				if (i > 0)
+					*_address += infy_pow_info[0].psuCount;
+
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
 void ReceiveDataFromCanBus()
 {
 	int nbytes;
 	struct can_frame frame;
 	int intCmd = 0;
 	byte group, address;
+	byte _totalModuleCount = 0;
+	bool colFinished = false;
+
+	for (byte i = 0; i < 2; i++)
+	{
+		infy_pow_info[i].psuCount = 0;
+		for (byte j = 0; j < 12; j++)
+		{
+			infy_pow_info[i].serialNumber[j] = 0xFF;
+			infy_pow_info[i].targetNumber[j] = 0xFF;
+		}
+	}
 
 	while(1)
 	{
@@ -273,12 +305,41 @@ void ReceiveDataFromCanBus()
 				case INFYPWR_GROUP_SHIFT | STATUS:
 				{
 					group = frame.data[2];
-					address = frame.can_id & 0x000000FF;
+					byte SN = frame.can_id & 0x000000FF;
+					bool isfind = false;
+
+					if (group < 2 && !colFinished)
+					{
+						for(byte _index = 0; _index < infy_pow_info[group].psuCount; _index++)
+						{
+							if (infy_pow_info[group].serialNumber[_index] == SN)
+							{
+								isfind = true;
+								break;
+							}
+						}
+
+						if (!isfind)
+						{
+							infy_pow_info[group].serialNumber[infy_pow_info[group].psuCount] = SN;
+							infy_pow_info[group].targetNumber[infy_pow_info[group].psuCount] = infy_pow_info[group].psuCount;
+							infy_pow_info[group].psuCount++;
+						}
+
+						byte subPcount = 0;
+						for (byte i = 0; i < 2; i++)
+						{
+							subPcount += infy_pow_info[i].psuCount;
+						}
+
+						if (subPcount > 0 && subPcount == _totalModuleCount)
+							colFinished = true;
+					}
 
 					short temp = frame.data[4];
 					int status = (frame.data[5] << 16) + (frame.data[6] << 8) + frame.data[7];
 
-					return_status(group, address, temp, status);
+					return_status(group, SN, temp, status);
 					//PRINTF_LIB_FUNC("group = %d, address = %d, temp = %d \n", group, address, temp);
 				}
 					break;
@@ -289,6 +350,10 @@ void ReceiveDataFromCanBus()
 					group = frame.can_id & 0x000000FF;
 
 					byte count = frame.data[2];
+					if (group == SYSTEM_CMD)
+					{
+						_totalModuleCount = count;
+					}
 
 					return_module_count(group, count);
 					//PRINTF_LIB_FUNC("group = %d, count = %d \n", group, count);
@@ -297,8 +362,13 @@ void ReceiveDataFromCanBus()
 
 				case INFYPWR_GROUP_SHIFT | MODULE_CAP:
 				{
+					if (!colFinished)
+						break;
+
 					// 回傳輸出能力 : 最大電壓、最小電壓、最大電流、額定功率
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					short maxVol = ((frame.data[0] << 8) + frame.data[1]) * 10;
 					short minVol = ((frame.data[2] << 8) + frame.data[3]) * 10;
@@ -340,8 +410,13 @@ void ReceiveDataFromCanBus()
 				case INFYPWR_GROUP_SHIFT | MODULE_IAVAILABLE:
 				case MODULE_IAVAILABLE:
 				{
+					if (!colFinished)
+						break;
+
 					// 回傳降載後的電流
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					unsigned short vextVol = ((frame.data[0] << 8) + frame.data[1]);
 					unsigned short iAvailCur = ((frame.data[2] << 8) + frame.data[3]);
@@ -353,15 +428,35 @@ void ReceiveDataFromCanBus()
 
 				case INFYPWR_GROUP_SHIFT | MODULE_MIS_INFO:
 				{
+					if (!colFinished)
+						break;
+
 					address = frame.can_id & 0x000000FF;
-					float FanSpeed;
+					float ReturnValue;
 					byte value[4];
+					byte type;
+
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					memcpy(value, frame.data + 4, sizeof(value));
+					ReturnValue = IEEE_754_to_float(value);
 					if (frame.data[0] == ((FAN_SPEED_CMD >> 8) & 0xFF) && frame.data[1] == (FAN_SPEED_CMD & 0xFF))
 					{
-						FanSpeed = IEEE_754_to_float(value);
-						return_fanspeed_info(address, FanSpeed);
+						type = 1;
+						return_mis_info(address, ReturnValue, type);
+						//PRINTF_LIB_FUNC("address = %d, FanSpeed = %f \n", address, FanSpeed);
+					}
+					else if (frame.data[0] == ((TEMP_DC_CMD >> 8) & 0xFF) && frame.data[1] == (TEMP_DC_CMD & 0xFF))
+					{
+						type = 2;
+						return_mis_info(address, ReturnValue, type);
+						//PRINTF_LIB_FUNC("address = %d, FanSpeed = %f \n", address, FanSpeed);
+					}
+					else if (frame.data[0] == ((TEMP_DC_CMD >> 8) & 0xFF) && frame.data[1] == (TEMP_DC_CMD & 0xFF))
+					{
+						type = 3;
+						return_mis_info(address, ReturnValue, type);
 						//PRINTF_LIB_FUNC("address = %d, FanSpeed = %f \n", address, FanSpeed);
 					}
 				}
@@ -369,8 +464,13 @@ void ReceiveDataFromCanBus()
 
 				case INFYPWR_GROUP_SHIFT | MODULE_VER:
 				{
+					if (!colFinished)
+						break;
+
 					// 回傳版號 : 無系統回覆功能
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					short dcSwVer = ((frame.data[0] << 8) + frame.data[1]);
 					short pfcSwVer = ((frame.data[2] << 8) + frame.data[3]);
@@ -389,8 +489,13 @@ void ReceiveDataFromCanBus()
 
 				case INFYPWR_GROUP_SHIFT | MODULE_INPUT:
 				{
+					if (!colFinished)
+						break;
+
 					// 回傳三向輸入電壓
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					short abVol = ((frame.data[0] << 8) + frame.data[1]) / 10;
 					short bcVol = ((frame.data[2] << 8) + frame.data[3]) / 10;
@@ -402,9 +507,14 @@ void ReceiveDataFromCanBus()
 					break;
 				case INFYPWR_GROUP_SHIFT | AUTO_OUTPUT_TEMP:
 				{
+					if (!colFinished)
+						break;
+
 					/*Test mode used*/
 					// 回傳輸出值與入風口溫度
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					short outputVol = ((frame.data[0] << 8) + frame.data[1]);
 					short outputCur = ((frame.data[2] << 8) + frame.data[3]);
@@ -417,9 +527,14 @@ void ReceiveDataFromCanBus()
 					break;
 				case INFYPWR_GROUP_SHIFT | AUTO_MODULE_STATUS:
 				{
+					if (!colFinished)
+						break;
+
 					/*Test mode used*/
 					// 回傳輸出值與入風口溫度
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					byte isErr =  (frame.data[0] >> 0) & 0x01;
 					byte status = (frame.data[0] >> 1) & 0x01;
@@ -434,9 +549,14 @@ void ReceiveDataFromCanBus()
 					break;
 				case INFYPWR_GROUP_SHIFT | AUTO_MODULE_INPUT:
 				{
+					if (!colFinished)
+						break;
+
 					/*Test mode used*/
 					// 回傳輸出值與入風口溫度
 					address = frame.can_id & 0x000000FF;
+					if(!GetRealIndexByGroup(&address))
+						break;
 
 					short vR = ((frame.data[0] << 8) + frame.data[1]);
 					short vS = ((frame.data[2] << 8) + frame.data[3]);
@@ -468,7 +588,9 @@ void SendCmdToPsu(int cmd, byte *data, byte dataLen)
     memcpy(frame.data, data, dataLen);
 
     write(CanFd, &frame, sizeof(struct can_frame));
-	usleep(CMD_DELAY_TIME);
+    // 群命令才 delay
+    if ((cmd & 0x0000FF00) == INFYPWR_BROADCAST)
+    	usleep(CMD_DELAY_TIME);
 }
 
 bool InitialCommunication()
@@ -682,6 +804,44 @@ void GetFanSpeed(byte group)
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
+void GetDcTemperature(byte group)
+{
+	uint cmd;
+	byte data[8];
+
+	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
+
+	memset(data, 0x00, ARRAY_SIZE(data));
+
+	data[0] = (TEMP_DC_CMD >> 8) & 0xFF;
+	data[1] = TEMP_DC_CMD & 0xFF;
+
+	if (group == (INFYPWR_BROADCAST >> 8))
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+	SendCmdToPsu(cmd, data, sizeof(data));
+}
+
+void GetPfcTemperature(byte group)
+{
+	uint cmd;
+	byte data[8];
+
+	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
+
+	memset(data, 0x00, ARRAY_SIZE(data));
+
+	data[0] = (TEMP_PFC_CMD >> 8) & 0xFF;
+	data[1] = TEMP_PFC_CMD & 0xFF;
+
+	if (group == (INFYPWR_BROADCAST >> 8))
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+	SendCmdToPsu(cmd, data, sizeof(data));
+}
+
 void GetModuleCount(byte group)
 {
 	byte data[8];

+ 16 - 2
EVSE/Modularization/Infypwr_PsuCommObj.h

@@ -50,6 +50,8 @@
 #define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
 #define CMD_DELAY_TIME 		25000
 #define FAN_SPEED_CMD		0x1201
+#define TEMP_DC_CMD			0x1107
+#define TEMP_PFC_CMD		0x1108
 
 typedef unsigned char 		byte;
 typedef unsigned short 	word;
@@ -126,6 +128,15 @@ union FloatingPointIEEE754
 	float f;
 } number;
 
+struct INFY_POW_MODULE_INFO
+{
+	byte serialNumber[12];
+	byte targetNumber[12];
+	byte psuCount;
+};
+
+struct INFY_POW_MODULE_INFO infy_pow_info[2];
+
 /*Initialization*/
 bool InitialCommunication();
 
@@ -142,6 +153,9 @@ void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switc
 /*Get Cmd*/
 void GetStatus(byte group);
 void GetFanSpeed(byte group);
+void GetDcTemperature(byte group);
+void GetPfcTemperature(byte group);
+void GetFanSpeed(byte group);
 void GetModuleCount(byte group);
 void GetModuleVer(byte group);
 void GetModuleCap(byte group);
@@ -176,8 +190,8 @@ void (*return_get_output)(byte address, unsigned short outVol, unsigned short ou
 void RefreshGetOutputF(void *func);
 void (*return_get_output_float)(byte group, float outVol, float outCur);
 
-void RefreshFanInfo(void *func);
-void (*return_fanspeed_info)(byte address, unsigned int fanSpeed);
+void RefreshMisInfo(void *func);
+void (*return_mis_info)(byte address, unsigned int fanSpeed, byte type);
 
 void RefreshIavailable(void *func);
 void (*return_iavail_info)(byte address, unsigned short Iavail, unsigned short Vext);

+ 2 - 0
EVSE/Projects/define.h

@@ -413,6 +413,7 @@ struct SysConfigData
 	unsigned char			chargePointVendor[20];		//the Vendor of the ChargePoint
 	unsigned int 			Checksum;					//4 bytes checksum
 	struct LED				LedInfo;					// LED configuration info
+	unsigned char			ShowInformation;
 };
 
 struct ChargingInfoData
@@ -496,6 +497,7 @@ struct ChargingInfoData
 	unsigned char		EVCCID[18];						//the MAC address of the EVCC in Hex
 	unsigned char 		isRemoteStart;
 	struct Schedule		schedule;						// Schedule
+	int 				EvBatteryStartSoc;				// 0~100%
 };
 
 struct SysInfoData