Browse Source

2020-03-17 / Alston L in

Action
1. Update psu library

Files
1. As follow commit history
Alston 5 years ago
parent
commit
58e7553e40
2 changed files with 404 additions and 689 deletions
  1. 312 528
      EVSE/Modularization/Infypwr_PsuCommObj.c
  2. 92 161
      EVSE/Modularization/Infypwr_PsuCommObj.h

+ 312 - 528
EVSE/Modularization/Infypwr_PsuCommObj.c

@@ -7,43 +7,15 @@
 
 #include "Infypwr_PsuCommObj.h"
 
-struct Current_cmd_Proc Psu_cmd={
-		0,
-		0x02000200,
-		0x01000300,
-		0x01000400,
-		0x01000500,
-		0x01000600,
-		0x01000700,
-		0x01000800,
-		0x01000900,
-		0x02000A00,
-
-		0x02000B00,
-		0x01000C00,
-		0x02000F00,
-		0x02001000,
-		0x02001100,
-		0x02001200,
-
-		0x01001300,
-		0x02001400,
-		0x01001500,
-		0x01001600,
-		0x02001700,
-
-		0x01001800,
-		0x01001900,
-		0x01001A00,
-
-		0x02001B00,
-		0x0E001C00,
-};
-
-#define DEBUG_LIB						0
+#define DEBUG_LIB						1
 
 void PRINTF_LIB_FUNC(char *string, ...);
+float IEEE_754_to_float(const byte raw[4]);
+void IEEE_754_to_bytes(float target, byte *bytes2);
 
+//================================================
+// Private function
+//================================================
 void PRINTF_LIB_FUNC(char *string, ...)
 {
 	if (DEBUG_LIB)
@@ -58,32 +30,72 @@ void PRINTF_LIB_FUNC(char *string, ...)
 	}
 }
 
-//================================================
-// Callback function
-//================================================
-void GetPsuAddressReq(void *func)
+float IEEE_754_to_float(const byte raw[4])
+{
+    int sign = (raw[0] >> 7) ? -1 : 1;
+
+    byte exponent = (raw[0] << 1) + (raw[1] >> 7) - 126;
+
+    unsigned int fraction_bits = ((raw[1] & 0x7F) << 16) + (raw[2] << 8) + raw[3];
+
+    float fraction = 0.5f;
+    for (byte ii = 0; ii < 24; ++ii)
+        fraction += ldexpf((fraction_bits >> (23 - ii)) & 1, -(ii + 1));
+
+    float significand = sign * fraction;
+
+    return ldexpf(significand, exponent);
+}
+
+void IEEE_754_to_bytes(float target, byte *bytes2)
 {
-	get_psu_addr_req = func;
+	int value2 = 0;
+	number.f = target;
+	int index = 31;
+
+	value2 |= number.raw.sign << index;
+	int k;
+	for (k = 8 - 1; k >= 0; k--)
+	{
+		index--;
+		if ((number.raw.exponent >> k) & 1)
+			value2 |= 1 << index;
+	}
+
+	for (k = 23 - 1; k >= 0; k--)
+	{
+		index--;
+		if ((number.raw.mantissa >> k) & 1)
+			value2 |= 1 << index;
+	}
+
+	*(bytes2) = (value2 >> 24) & 0xFF;
+	*(bytes2 + 1) = (value2 >> 16) & 0xFF;
+	*(bytes2 + 2) = (value2 >> 8) & 0xFF;
+	*(bytes2 + 3) = value2 & 0xFF;
 }
 
-void RefreshSerialNumber(void *func)
+//================================================
+// Callback function
+//================================================
+void RefreshStatus(void *func)
 {
-	return_serial_number = func;
+	return_status = func;
 }
 
-void RefreshVextAndIavail(void *func)
+void RefreshModuleCount(void *func)
 {
-	return_vext_and_iavail = func;
+	return_module_count = func;
 }
 
-void RefreshMiscInfo(void *func)
+void RefreshAvailableCap(void *func)
 {
-	return_misc_info = func;
+	return_available_cap = func;
 }
 
-void RefreshStatus(void *func)
+void RefreshFwVersion(void *func)
 {
-	return_status = func;
+	return_fw_version = func;
 }
 
 void RefreshInputVol(void *func)
@@ -96,20 +108,16 @@ void RefreshGetOutput(void *func)
 	return_get_output = func;
 }
 
-void RefreshHWVersion(void *func)
+void RefreshFanInfo(void *func)
 {
-	//return_hw_version = func;
+	return_fanspeed_info = func;
 }
 
-void RefreshAvailableCap(void *func)
+void RefreshIavailable(void *func)
 {
-	return_available_cap = func;
+	return_iavail_info = func;
 }
 
-void RefreshOutputPowerSwitch(void *func)
-{
-	return_output_pow_switch = func;
-}
 //================================================
 // CANBUS initialization
 //================================================
@@ -164,160 +172,139 @@ void ReceiveDataFromCanBus()
 {
 	int nbytes;
 	struct can_frame frame;
-	int intCmd;
-	byte target, group, address;
+	int intCmd = 0;
+	byte group, address;
+
 	while(1)
 	{
 		memset(&frame, 0, sizeof(struct can_frame));
 		nbytes = read(CanFd, &frame, sizeof(struct can_frame));
 
-
 		if (nbytes > 0)
 		{
 			frame.can_id = frame.can_id & CAN_EFF_MASK;
-
-			intCmd = (uint) (frame.can_id &  0x003F0000);
-			target = (byte) ((frame.can_id & 0x0000FF00)>>8);
-			group = (word) ((frame.can_id &  0x03C00000)>>22);
-			address = (byte) (frame.can_id & 0xFF);
-
-            //if master id
-            if(target == 0xF0)
-            {
-                //PRINTF_LIB_FUNC("Get-INFYPWR-Msg : %08x - %02x%02x%02x%02x%02x%02x%02x%02x\n", frame.can_id,frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
-                //PRINTF_LIB_FUNC("Get-INFYPWR-Msg : %08x cmd:%08x target:%02x group:%02x address:%02x\n", frame.can_id, intCmd, target, group, address);
-
-    			switch (intCmd)
-    			{
-    				case INFYPWR_GET_TOTAL_MOULE_MSG:
-    				{
-    					byte Quantity;
-    					char sn[7];
-
-                        Quantity = frame.data[2];
-                        //get_psu_count_first(Quantity);
-//
-                        for (byte index = 0; index < Quantity; index++)
-                        {
-                        	sn[0] = sn[1] = sn[2] = sn[3] = sn[4] = sn[5] = sn[6] = index;
-                        	get_psu_addr_req(index, sn);
-                        }
-    				}
-    					break;
-    				case ACK_ADDRESS_ASSINGMENT:
-    				{ }
-    					break;
-    				case INFYPWR_GET_STATUS_MSG:
-    				{
-    				    //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
-    					//data[2] = group
-						//data[4] = temp
-						//data[5,6,7] = alarm
-						//if (statusPassID == FEEDBACK_ID)
-						return_status(frame.data[2], address, frame.data[4],
-								(((int) frame.data[5] << 16) + ((int) frame.data[6] << 8) + (int) frame.data[7]) & 0x00ffffff);
-    				}
-    					break;
-
-                    case INFYPWR_GET_BARCODE_MSG:
-                    {
-    				    //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
-    				    if(group == 0x0B)
-    				    {
-    				        char sn[6];
-
-    				        memcpy(sn, &frame.data[0], 6);
-    					    return_serial_number(address, sn , ((word) frame.data[6] * 256 ) + (word) frame.data[7]);
-    					}
-                    }
-                        break;
-
-
-                    case INFYPWR_GET_VEXT_IAVAIL_MSG:
-                    {
-        			    return_vext_and_iavail(address,
-        			        ((word) frame.data[0] * 256 ) + (word) frame.data[1],
-        			        ((word) frame.data[2] * 256 ) + (word) frame.data[3]);
-                    }
-                    //PRINTF_LIB_FUNC("INFYPWR_GET_VEXT_IAVAIL_MSG \n");
-                        break;
-
-                    case INFYPWR_GET_MISC_INFO_MSG:
-                    {
-                        //0,1 = type
-                        //5,6,7,8 = msg
-                    	return_misc_info(address,
-        			        ((word) frame.data[0] * 256 ) + (word) frame.data[1],
-        			        (((int) frame.data[4] << 24) + ((int) frame.data[5] << 16) + ((int) frame.data[6] << 8) + (int) frame.data[7])  & 0x00ffffff);
-                    }
-                    //PRINTF_LIB_FUNC("INFYPWR_GET_MISC_INFO_MSG \n");
-                        break;
-
-
-    				case INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG:
-    				{
-        			    return_input_vol(address,
-        			        ((word) frame.data[0] * 256 ) + (word) frame.data[1],
-        			        ((word) frame.data[2] * 256 ) + (word) frame.data[3],
-        			        ((word) frame.data[4] * 256 ) + (word) frame.data[5]);
-    				}
-    				    break;
-
-    				case INFYPWR_GET_PRESENT_OUTPUT_MSG:
-    				{
-    				    //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
-    				    //電壓值及電流值 = 4byte 精度 0.001位(高位在byte0)(轉為CSU使用 0.1位)
-    				    //if(group == 0x0B)
-    				    //{
-    				        //uint vol = (((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100);
-
-    				        //uint cur = (((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100);
-
-    				        //vol = vol / 100;
-    				        //cur = cur / 100;
-
-        					return_get_output(address,
-        							(word)((((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100),
-    								(word)((((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100));
-        				//}
-    				}
-    					break;
-
-    				case INFYPWR_GET_AVAILABLE_CAP_MSG:
-    				{
-    				    //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
-    				    if(group == 0x0B)
-    				    {
-        				    //英飛源單位
-        				    //最大電壓 1:1 (CSU使用是0.1位所以 X 10)
-        				    //最小電壓 1:1 (CSU使用是0.1位所以 X 10)
-        				    //電流 0.1位  (CSU使用是0.1位單位一樣)
-        				    //功率 0.01位 (CSU使用是0.1位所以再除 10)
-        					return_available_cap(address,
-        					        ((((word) frame.data[0] * 256) + (word) frame.data[1]) * 10),
-        					        ((((word) frame.data[2] * 256) + (word) frame.data[3]) * 10),
-        							(((word) frame.data[4] * 256) + (word) frame.data[5]),
-        							((((word) frame.data[6] * 256) + (word) frame.data[7]))/10);
-            			}
-    				}
-    					break;
-
-    				case INFYPWR_SET_POWER_SWITCH_MSG:
-    				{
-                        return_output_pow_switch(address, frame.data[0]);
-    				}
-    					break;
-    				case ACK_SET_PRESENT_OUTPUT:
-    				{
-    				}
-    					break;
-
-    			}
-    	    }
-		}
-		else
-		{
-
+			intCmd = frame.can_id & 0x00FF0000;
+			intCmd |= INFYPWR_GROUP_SHIFT | intCmd;
+
+			switch (intCmd)
+			{
+				case INFYPWR_GROUP_SHIFT | STATUS:
+				{
+					group = frame.data[2];
+					address = frame.can_id & 0x000000FF;
+
+					short temp = frame.data[4];
+					int status = (frame.data[5] << 16) + (frame.data[6] << 8) + frame.data[7];
+
+					return_status(group, address, temp, status);
+					//PRINTF_LIB_FUNC("group = %d, address = %d, temp = %d \n", group, address, temp);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_COUNT:
+				{
+					// 回傳模組數量
+					group = frame.can_id & 0x000000FF;
+
+					byte count = frame.data[2];
+
+					return_module_count(group, count);
+					//PRINTF_LIB_FUNC("group = %d, count = %d \n", group, count);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_CAP:
+				{
+					// 回傳輸出能力 : 最大電壓、最小電壓、最大電流、額定功率
+					address = frame.can_id & 0x000000FF;
+
+					short maxVol = ((frame.data[0] << 8) + frame.data[1]) * 10;
+					short minVol = ((frame.data[2] << 8) + frame.data[3]) * 10;
+					short maxCur = (frame.data[4] << 8) + frame.data[5];
+					short totalPow = ((frame.data[6] << 8) + frame.data[7]) / 10;
+
+					return_available_cap(address, maxVol, minVol, maxCur, totalPow);
+//					PRINTF_LIB_FUNC("address = %d, maxVol = %d, minVol = %d, maxCur = %d, totalPow = %d \n",
+//							address, maxVol, minVol, maxCur, totalPow);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_OUTPUT_VOL_CUR:
+				{
+					// 回傳當前輸出電壓電流
+					address = frame.can_id & 0x000000FF;
+
+					int outputVol = ((frame.data[0] << 24) + (frame.data[1] << 16) + (frame.data[2] << 8) + frame.data[3]) / 100;
+					int outputCur = ((frame.data[4] << 24) + (frame.data[5] << 16) + (frame.data[6] << 8) + frame.data[7]) / 100;
+
+					return_get_output(address, outputVol, outputCur);
+					//PRINTF_LIB_FUNC("address = %d, outputVol = %d, outputCur = %d \n", address, outputVol, outputCur);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_IAVAILABLE:
+				{
+					// 回傳降載後的電流
+					address = frame.can_id & 0x000000FF;
+
+					unsigned short vextVol = ((frame.data[0] << 8) + frame.data[1]);
+					unsigned short iAvailCur = ((frame.data[2] << 8) + frame.data[3]);
+
+					return_iavail_info(address, iAvailCur, vextVol);
+					//PRINTF_LIB_FUNC("address = %d, iAvailCur = %d \n", address, iAvailCur);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_MIS_INFO:
+				{
+					address = frame.can_id & 0x000000FF;
+					float FanSpeed;
+					byte value[4];
+
+					memcpy(value, frame.data + 4, sizeof(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);
+						//PRINTF_LIB_FUNC("address = %d, FanSpeed = %f \n", address, FanSpeed);
+					}
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_VER:
+				{
+					// 回傳版號 : 無系統回覆功能
+					address = frame.can_id & 0x000000FF;
+
+					short dcSwVer = ((frame.data[0] << 8) + frame.data[1]);
+					short pfcSwVer = ((frame.data[2] << 8) + frame.data[3]);
+					short hwVer = ((frame.data[4] << 8) + frame.data[5]);
+
+					return_fw_version(address, dcSwVer, pfcSwVer, hwVer);
+					//PRINTF_LIB_FUNC("address = %d, DC %d, PFC %d, HW %d \n", address, dcSwVer, pfcSwVer, hwVer);
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_BARCODE:
+				{
+					// 回傳BarCode
+				}
+					break;
+
+				case INFYPWR_GROUP_SHIFT | MODULE_INPUT:
+				{
+					// 回傳三向輸入電壓
+					address = frame.can_id & 0x000000FF;
+
+					short abVol = ((frame.data[0] << 8) + frame.data[1]) / 10;
+					short bcVol = ((frame.data[2] << 8) + frame.data[3]) / 10;
+					short caVol = ((frame.data[4] << 8) + frame.data[5]) / 10;
+
+					return_input_vol(address, abVol, bcVol, caVol);
+					//PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
+				}
+					break;
+			}
 		}
 
 		usleep(10000);
@@ -339,11 +326,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);
 }
 
-//================================================
-// API Function
-//================================================
 bool InitialCommunication()
 {
 	CanFd = InitCanBus();
@@ -367,434 +352,233 @@ bool InitialCommunication()
     return true;
 }
 
-void RequestModuleTotalMumbert(void)
+//================================================
+// API Function
+//================================================
+void SwitchPower(byte group, byte value)
 {
-	uint cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_TOTAL_MOULE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
-
 	byte data[8];
+	uint cmd = INFYPWR_CMD | SWITCH_POWER;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
+	// 1 : 關機
+	// 0 : 開機
+	data[0] = value;
+
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-//void PsuAddressAssignment(byte phy_addr, char *serial_number, byte real_addr, byte group)
-void PsuAddressAssignment(byte phy_addr, byte group)
-{
-	PRINTF_LIB_FUNC("phy_addr = %d, group = %d \n", phy_addr, group);
-	uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GROUP_ASSINGMENT_MSG | (phy_addr << 8) | INFYPWR_MASTER_TXID;
-
-	byte data[8];
-
-    memset(data, 0x00, ARRAY_SIZE(data));
-	data[0] =  group;
-	SendCmdToPsu(cmd, data, sizeof(data));
-}
-
-void GetStatus(byte group, byte address)
+void SleepMode(byte group, byte value)
 {
-	//如果用 group 發送 (該 group 內的模組會自動依序回應)
-	//PRINTF_LIB_FUNC("PSU_C_DLL : GetStatus. group = %x, address = %x \n", group, address);
-	uint cmd;
 	byte data[8];
-
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_STATUS_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_STATUS_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_STATUS_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
+	uint cmd = INFYPWR_CMD | SLEEP_MODE;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
+	// 1 : 休眠
+	// 0 : 起床
+	data[0] = value;
+
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void GetFwVersion(byte group, byte address, byte type)
-{
-}
-
-void GetSerialNumber(byte group, byte address)
+void FlashLed(byte group, byte value)
 {
-    	//如果用 group 發送 (該 group 內的模組會自動依序回應)
-	uint cmd;
 	byte data[8];
-
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_BARCODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_BARCODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    }
+	uint cmd = INFYPWR_CMD | FLASH_LED;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
+	// 1 : 閃爍
+	// 0 : 正常
+	data[0] = value;
+
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-
-void GetVextAndIavail(byte group, byte address)
+void PresentOutputVol(byte group, int voltage, int current)
 {
-    	//如果用 group 發送 (該 group 內的模組會自動依序回應)
-	uint cmd;
 	byte data[8];
-
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_VEXT_IAVAIL_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_VEXT_IAVAIL_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    }
+	uint cmd = INFYPWR_CMD | PRESENT_OUT_VOL;
+	int Vol = (voltage / 10) * 1000;
+	int Cur = (current / 10) * 1000;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
+
+	// 輸出電壓
+	data[0] = (Vol >> 24) & 0xFF;
+	data[1] = (Vol >> 16) & 0xFF;
+	data[2] = (Vol >> 8) & 0xFF;
+	data[3] = Vol & 0xFF;
+	// 輸出電流
+	data[4] = (Cur >> 24) & 0xFF;
+	data[5] = (Cur >> 16) & 0xFF;
+	data[6] = (Cur >> 8) & 0xFF;
+	data[7] = Cur & 0xFF;
+
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-
-void GetMiscInfo(byte group, byte address, unsigned short CmdType)
+void FanNoiseInfo(byte group, byte value)
 {
-    	//如果用 group 發送 (該 group 內的模組會自動依序回應)
-	uint cmd;
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MIS_INFO;
 
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_MISC_INFO_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-    //如果是群組命令
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
+	memset(data, 0x00, ARRAY_SIZE(data));
 
+	// 風扇低噪音
+	data[0] = 0x11;
+	data[1] = 0x13;
 
-    memset(data, 0x00, ARRAY_SIZE(data));
-    data[0] = (CmdType >> 8) & 0xFF;
-    data[1] = (CmdType) & 0xFF;
+	// 0xA0 power poriority mode
+	// 0xA1 denoise mode
+	// 0xA2 quiet mode
+	data[7] = value;
 
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void SetMiscInfo(byte group, byte address, unsigned short CmdType, unsigned int value)
+/**********************************************************************************/
+/***                                                                            ***/
+/***                                   Get                                      ***/
+/***                                                                            ***/
+/**********************************************************************************/
+void GetStatus(byte group)
 {
-	int cmd;
 	byte data[8];
-
-	//PRINTF_LIB_FUNC("cmd = %x \n", cmd);
+	uint cmd = INFYPWR_CMD | STATUS;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-
-    data[0] = (CmdType >> 8) & 0xFF;
-    data[1] = (CmdType) & 0xFF;
-
-	if(CmdType == MISC_SETCMD_FAN_DENOISE_MODE){
-
-        data[7] = (byte)value;
-	}else{
-	    data[4] = (value >> 24) & 0xff;
-	    data[5] = (value >> 16) & 0xff;
-	    data[6] = (value >> 8) & 0xff;
-	    data[7] = value & 0xff;
-	}
-
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-        //PRINTF_LIB_FUNC("Module-onoff(g) :%08x - %d - %d \n",cmd, data[0],address);
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-        // PRINTF_LIB_FUNC("Modele-onoff(M) :%08x - %d - %d \n",cmd, data[0],address);
-    }
-
+	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void GetPresentInputVol(byte group, byte address)
+void GetFanSpeed(byte group)
 {
-	//PRINTF_LIB_FUNC("PSU_C_DLL : GetPresentInputVol. group = %x, address = %x \n", group, address);
-	//如果用 group 發送 (該 group 內的模組會自動依序回應)
 	uint cmd;
 	byte data[8];
 
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-    };
+	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
-	SendCmdToPsu(cmd, data, sizeof(data));
-}
-
-void GetAvailableCap(byte group, byte address, short _outputVol)
-{
-	//如果用 group 發送 (該 group 內的模組會自動依序回應)
-	uint cmd;
-	byte data[8];
 
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
+	data[0] = (FAN_SPEED_CMD >> 8) & 0xFF;
+	data[1] = FAN_SPEED_CMD & 0xFF;
 
-	memset(data, 0x00, ARRAY_SIZE(data));
+	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 GetPresentOutput(byte group, byte address)
+void GetModuleCount(byte group)
 {
-	//PRINTF_LIB_FUNC("PSU_C_DLL : GetPresentOutput. group = %x, address = %x \n", group, address);
-	int cmd;
 	byte data[8];
-
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//    }
+	uint cmd = INFYPWR_CMD | MODULE_COUNT;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
-	SendCmdToPsu(cmd, data, sizeof(data));
-}
 
-void SetPresentOutput(byte group, byte address, float vol, float cur, float AvailableCur)
-{
-    uint cmd;
-    byte data[8];
-    //bool isSearch = false;
-    //if (cur >= AvailableCur)
-	//cur = AvailableCur;
-
-	//if(vol == 0 && cur == 0)PRINTF_LIB_FUNC("output v=0 a =0 \n");
-    //PRINTF_LIB_FUNC("group = %d, address = %d, vol = %f, cur = %f \n", group, address, vol, cur);
-    //英飛源使用 0.001 精度
-    uint vol2 =  vol * 100;
-    uint cur2 =  cur * 100;
-
-    //PRINTF_LIB_FUNC("vol = %f, cur = %f, vol2 = %d, cur2 = %d \n", vol, cur, vol2, cur2);
-
- 	// 電壓
-	data[0] = (vol2 >> 24) & 0xff;
-	data[1] = (vol2 >> 16) & 0xff;
-	data[2] = (vol2 >> 8) & 0xff;
-	data[3] = vol2 & 0xff;
-
- 	// 電壓
-	data[4] = (cur2 >> 24) & 0xff;
-	data[5] = (cur2 >> 16) & 0xff;
-	data[6] = (cur2 >> 8) & 0xff;
-	data[7] = cur2 & 0xff;
-
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        //PRINTF_LIB_FUNC("setout(G) :%08x /n",cmd);
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//
-//    	//search group
-//    	/*
-//        for (byte groupIndex = 0; groupIndex < ShmPsuData->GroupCount; groupIndex++)
-//        {
-//        	for (byte index = 0; index < ShmPsuData->PsuGroup[groupIndex].GroupPresentPsuQuantity; index++)
-//        	{
-//        	    //search id
-//        		if (ShmPsuData->PsuGroup[groupIndex].PsuModule[index].Address == address)
-//        		{
-//        		    //修改英飛為 id
-//                    address = ShmPsuData->PsuGroup[groupIndex].PsuModule[index].PhysicalID;
-//        			isSearch = true;
-//        			break;
-//        		}
-//        	}
-//        	if(isSearch) break;
-//        }
-//        */
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_MODULE_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        //PRINTF_LIB_FUNC("setout(M) :%08x /n",cmd);
-//    }
-
-	PRINTF_LIB_FUNC("typecmd = %02x, addr = %02x ,vol = %d, tot_Amp = %f, need_cur = %d, \n",
-			group, address, vol2, AvailableCur, cur2);
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void EnableGreenLedFlash(byte group, byte address, byte value)
+void GetModuleVer(byte group)
 {
-	int cmd;
+	// 無系統廣播功能
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MODULE_VER;
 
-	if(value){
-	    //pwr off
-	    data[0] = 0x01;
-	}else{
-	    //pwr on
-	    data[0] = 0x00;
-	}
-
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        //PRINTF_LIB_FUNC("Green Led Flash(g) :%08x - %d - %d \n",cmd, data[0],address);
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        //PRINTF_LIB_FUNC("Green Led Flash(M) :%08x - %d - %d \n",cmd, data[0],address);
-//    }
+	memset(data, 0x00, ARRAY_SIZE(data));
 
+	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+	//PRINTF_LIB_FUNC("GetModuleVer cmd = %x\n", cmd);
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void EnableWalkInMode(byte group, byte address, byte value)
+void GetModuleCap(byte group)
 {
-	int cmd;
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MODULE_CAP;
 
-	if(value){
-	    //pwr off
-	    data[0] = 0x01;
-	}else{
-	    //pwr on
-	    data[0] = 0x00;
-	}
-
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-        //PRINTF_LIB_FUNC("WalkIn(g) :%08x - %d - %d \n",cmd, data[0],address);
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-        // PRINTF_LIB_FUNC("WalkIn(M) :%08x - %d - %d \n",cmd, data[0],address);
-    }
+	memset(data, 0x00, ARRAY_SIZE(data));
 
+	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+	//PRINTF_LIB_FUNC("GetModuleCap cmd = %x\n", cmd);
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void EnableSleepMode(byte group, byte address, byte value)
+void GetModuleBarCode(byte group)
 {
-	int cmd;
+	// 無系統廣播功能
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MODULE_BARCODE;
 
-	if(value){
-	    //pwr off
-	    data[0] = 0x01;
-	}else{
-	    //pwr on
-	    data[0] = 0x00;
-	}
-
-    //如果是群組命令
-    if(group == SET_GROUP_CMD)
-    {
-        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-        //PRINTF_LIB_FUNC("SleepMode(g) :%08x - %d - %d \n",cmd, data[0],address);
-    }
-    //如果是模組命令則找出模組對應到 (英飛源的ID)
-    else
-    {
-        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-         //PRINTF_LIB_FUNC("SleepMode(M) :%08x - %d - %d \n",cmd, data[0],address);
-    }
+	memset(data, 0x00, ARRAY_SIZE(data));
 
+	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
-void EnableDipAddrMode(void)
+void GetModuleInput(byte group)
 {
-	uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
-
+	// 無系統廣播功能
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MODULE_INPUT;
+
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	data[0] = 0x01;
+	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
-
 }
 
-void DisableDipAddrMode(void)
+void GetModuleIavailable(byte group)
 {
-	uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
-
 	byte data[8];
+	uint cmd = INFYPWR_CMD | MODULE_IAVAILABLE;
+
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	data[0] = 0x00;
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
-
 }
 
-void EnableOutputPower(byte group, byte address, byte value)
+void GetModuleOutput(byte group)
 {
-	int cmd;
 	byte data[8];
-
-	//PRINTF_LIB_FUNC("cmd = %x \n", cmd);
+	uint cmd = INFYPWR_CMD | MODULE_OUTPUT_VOL_CUR;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	if(value == 0){
-	    //pwr off
-	    data[0] = 0x01;
-	}else{
-	    //pwr on
-	    data[0] = 0x00;
-	}
-
-	cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (group << 8) | INFYPWR_MASTER_TXID;
-//    if(group == SET_GROUP_CMD)
-//    {
-//        cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        //PRINTF_LIB_FUNC("Module-onoff(g) :%08x - %d - %d \n",cmd, data[0],address);
-//    }
-//    //如果是模組命令則找出模組對應到 (英飛源的ID)
-//    else
-//    {
-//        cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
-//        // PRINTF_LIB_FUNC("Modele-onoff(M) :%08x - %d - %d \n",cmd, data[0],address);
-//    }
-
+	if (group == SYSTEM_CMD)
+		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	else
+		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 

+ 92 - 161
EVSE/Modularization/Infypwr_PsuCommObj.h

@@ -39,196 +39,127 @@
 #include 	<ifaddrs.h>
 #include 	<math.h>
 
+#define INFYPWR_CMD				0x02000000
+#define INFYPWR_BROADCAST		0x00003F00
+#define INFYPWR_DEFAULT			0x000000F0
 
-typedef unsigned char 		byte;
-typedef unsigned short 	word;
-typedef unsigned int 		unit;
+#define INFYPWR_GROUP_SHIFT		0x00400000
 
-#define INFYPWR_MODULE_CMD				0x02800000  //
-#define INFYPWR_GROUP_CMD				0x02C00000  //
-#define INFYPWR_MASTER_TXID				0xF0  //
-#define INFYPWR_BROADCAST_ID			0x3F  //
+#define SYSTEM_CMD				0x3F
 
-#define UNFEEDBACK_ID        0
-#define FEEDBACK_ID          1
+#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+#define CMD_DELAY_TIME 		25000
+#define FAN_SPEED_CMD		0x1201
 
-#define SET_MODULE_CMD             0
-#define SET_GROUP_CMD              1
+typedef unsigned char 		byte;
+typedef unsigned short 	word;
+typedef unsigned int 		unit;
 
+int 						CanFd;
+pid_t 						recFork;
 
-extern struct Current_cmd_Proc
+enum PSU_POWER_CMD
 {
-	int none;							// 0
-	int _address_assignment;			// 0x02000200
-	int _get_status;					// 0x01000300
-	int _get_fw_ver;					// 0x01000400
-	int _get_fan_speed;					// 0x01000500
-	int _get_temperature;				// 0x01000600
-	int _get_present_input_vol;			// 0x01000700
-	int _get_present_output;			// 0x01000800
-	int _get_available_cap;				// 0x01000900
-	int _switch_output_pow;				// 0x02000A00
-
-	int _set_present_output;			// 0x02000B00
-	int _set_fan_speed;					// 0x01000C00
-	int _upgrade_req;					// 0x02000F00
-	int _start_block_trans;				// 0x02001000
-	int _img_trans;						// 0x02001100
-	int _upgrade_finish;				// 0x02001200
-
-	int _get_serial_number;				// 0x01001300
-	int _set_cooling_water_temp;		// 0x02001400
-	int _get_presnet_input_cur;			// 0x01001500
-	int _get_hw_verstion;				// 0x01001600
-	int _switch_pfc_output;				// 0x02001700
-
-	int _get_log_size;					// 0x01001800
-	int _get_log_block_checksum;		// 0x01001900
-	int _get_log_block_data;			// 0x01001A00
-
-	int _switch_custom_info;			// 0x02001B00
-	int _custom_info_transfer;			// 0x0E001C00
-}Psu_cmd;
-
-enum Receieve_PSU_msg
-{
-    ADDRESS_REQ = 	                    					0x08000100,
-	ACK_ADDRESS_ASSINGMENT = 								0x0B000200,
-    ACK_STATUS =                        					0x0B000300,
-    ACK_FIRMWARE_VERSION =              					0x0B000400,
-    ACK_FAN_SPEED =                     					0x0B000500,
-    ACK_TEMPERATURE =                  						0x0B000600,
-    ACK_PRESENT_INPUT_VOLTAGE =         					0x0B000700,
-    ACK_GET_PRESENT_OUTPUT =            					0x0B000800,
-    ACK_AVAILABLE_CAP = 	            					0x0B000900,
-    ACK_OUTPUT_POWER_SWITCH =           					0x0B000A00,
-    ACK_SET_PRESENT_OUTPUT =            					0x0B000B00,
-	ACK_SET_FAN_SPEED = 									0x0B000C00,
-    ACK_UPGRADE_REQ = 	                					0x0B000F00,
-    ACK_START_BLOCK_TRANS = 	        					0x0B001000,
-    ACK_UPGRADE_FINISH = 	            					0x0B001200,
-    ACK_GET_SERIAL_NUMBER =                 				0x0B001300,
-    ACK_COOLING_WATER_TEMP =            					0x0B001400,
-    ACK_PRESENT_INPUT_CURRENT =         					0x0B001500,
-    ACK_HARDWARE_VERSION =              					0x0B001600,
-    ACK_PFC_OUTPUT_SWITCH =             					0x0B001700,
-    ACK_LOG_SIZE =                      					0x0B001800,
-    ACK_LOG_BLOCK_CHECKSUM =            					0x0B001900,
-    ACK_LOG_BLOCK_DATA =                					0x0B001A00,
-    ACK_CUSTOM_INFO_TRANSFER_SWITCH =   					0x0B001B00,
-    CUSTOM_LOG_INFO =                   					0x0E001C00,
-    ALARM_NOTIFICATION =                					0x0C000D00,
-    FAULT_NOTIFICATION =                					0X0D001D00,
-    STATUS_NOTIFICATION =               					0x0E000E00,
+	PSU_POWER_ON = 		0,
+	PSU_POWER_OFF = 	1,
 };
 
-enum Receieve_INFYPWR_msg
+enum PSU_SLEEP_MODE_CMD
 {
-	INFYPWR_GET_TOTAL_MOULE_MSG  = 			                    0x00020000,
-	INFYPWR_GET_STATUS_MSG       = 			                    0x00040000,
-    INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG =              		0x00060000,
-    INFYPWR_GET_PRESENT_OUTPUT_MSG =            				0x00090000,
-    INFYPWR_GET_AVAILABLE_CAP_MSG = 	            			0x000A0000,
-    INFYPWR_GET_BARCODE_MSG = 	            			        0x000B0000,
-    INFYPWR_GET_VEXT_IAVAIL_MSG = 	            			    0x000C0000,
-    INFYPWR_GET_MISC_INFO_MSG = 	            			    0x000E0000,
-    INFYPWR_SET_MISC_INFO_MSG = 	            			    0x000F0000,
-    INFYPWR_SET_WALKIN_MODE_MSG = 	            			    0x00130000,
-    INFYPWR_SET_GREEN_KED_FLASH_MSG = 	            			0x00140000,
-    INFYPWR_SET_GROUP_ASSINGMENT_MSG = 	            			0x00160000,
-    INFYPWR_SET_SLEEP_MODE_MSG = 	            			    0x00190000,
-    INFYPWR_SET_POWER_SWITCH_MSG = 	            			    0x001A0000,
-	INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG =                   	0x001B0000,
-	INFYPWR_SET_MODULE_PERSENT_OUTPUT_MSG =               		0x001C0000,
-    INFYPWR_SET_ADDRESS_MODE_MSG = 	            			    0x001F0000,
+	PSU_SLEEP_MODE_WAKE_UP = 	0,
+	PSU_SLEEP_MODE_SLEEP = 		1,
 };
 
+enum PSU_FLASH_CMD
+{
+	PSU_FLASH_NORMAL = 		0,
+	PSU_FLASH_ON = 			1,
+};
 
-#define MISC_REQCMD_DC_BOARD_TMP            0x1107
-#define MISC_REQCMD_PFC_BOARD_TMP           0x1108
-#define MISC_REQCMD_FAN_SPEED               0x1201
-
-#define MISC_SETCMD_FAN_DENOISE_MODE        0x1113
-#define MISC_SETCMD_FAN_SPEED               0x1201
-#define MISC_SETCMD_AC_INPUT_LIMIT          0x1205
+enum PSU_FAN_NOISE_CMD
+{
+	PSU_FAN_NOISE_BY_POWER = 		0xA0,
+	PSU_FAN_NOISE_BY_DENOISE = 		0xA1,
+	PSU_FAN_NOISE_BY_QUIET = 		0xA2
+};
 
-#define 	ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+enum PSU_SET_CMD
+{
+	MIS_INFO = 					0x008F0000,		// 現在只能改變降噪模式
+	FLASH_LED = 				0x00940000,
+	SLEEP_MODE =  	            0x00990000,		// 當 SWITCH POWER 打開時,可透過該指令讓模塊休眠 (風扇會停)
+    SWITCH_POWER = 	            0x009A0000,		// 打開,則模塊依照設定的輸出功率輸出
+	PRESENT_OUT_VOL = 			0x009B0000,
+};
 
-int 						CanFd;
-pid_t 						recFork;
+enum PSU_GET_CMD
+{
+	MODULE_COUNT = 	            0x00820000,		// 取得模塊數量
+	STATUS = 					0x00840000,		// 取得溫度、狀態
+	MODULE_INPUT = 				0x00860000,		// 取得三向輸入電壓
+	MODULE_VER = 				0x00870000,		// 取得版號
+	MODULE_OUTPUT_VOL_CUR = 	0x00880000,		// 取得當前輸出電壓電流
+	MODULE_CAP = 				0x008A0000,		// 取得當前 Group 的最大電壓、最大電流、最小電壓、額定功率
+	MODULE_BARCODE =			0x008B0000,		// 取得 BarCode
+	MODULE_IAVAILABLE =			0x008C0000,		// 取得實際模塊可輸出的電流能力 (降載)
+	MODULE_MIS_INFO = 			0x008E0000		// 取得模塊資訊 (Tdc、Tpfc、風扇速度)
+};
 
-/* API Function */
+union FloatingPointIEEE754
+{
+	struct
+	{
+		unsigned int mantissa : 23;
+		unsigned int exponent : 8;
+		unsigned int sign : 1;
+	} raw;
+	float f;
+} number;
+
+/*Initialization*/
 bool InitialCommunication();
-//void PsuAddressAssignment(byte phy_addr, char *serial_number, byte real_addr, byte group);
-void PsuAddressAssignment(byte phy_addr, byte group);
-void GetStatus(byte group, byte address);
-void GetFwVersion(byte group, byte address, byte type);
-void GetSerialNumber(byte group, byte address);     //barcode
-void GetVextAndIavail(byte group, byte address);
-//void GetFanSpeed(byte group, byte address);
-void GetMiscInfo(byte group, byte address, unsigned short CmdType);
-//void GetTemperature(byte group, byte address);
-void GetPresentInputVol(byte group, byte address);
-void GetPresentOutput(byte group, byte address);
-void GetPresentInputCurrent(byte group, byte address);
-void GetAvailableCap(byte group, byte address, short _outputVol);
-
-void SetPresentOutput(byte group, byte address, float vol, float cur, float AvailableCur);
-void SetMiscInfo(byte group, byte address, unsigned short CmdType, unsigned int value);
-
-void EnableGreenLedFlash(byte group, byte address, byte value);
-void EnableSleepMode(byte group, byte address, byte value);
-void EnableDipAddrMode(void);
-
-void EnableWalkInMode(byte group, byte address, byte value);
-void RequestModuleTotalMumbert(void);
-/* API Function end */
-
-/* Callback Function */
-
 
-void GetPsuAddressReq(void *func);
-//void GetPsuRequestCallback(byte phy_id, char *serial_number)
-void (*get_psu_addr_req)(byte phy_id, char *serial_number);
+/*Set Cmd*/
+void SwitchPower(byte group, byte value);
+void SleepMode(byte group, byte value);
+void FlashLed(byte group, byte value);
+void PresentOutputVol(byte group, int voltage, int current);
+void FanNoiseInfo(byte group, byte value);
+/*Get Cmd*/
+void GetStatus(byte group);
+void GetFanSpeed(byte group);
+void GetModuleCount(byte group);
+void GetModuleVer(byte group);
+void GetModuleCap(byte group);
+void GetModuleBarCode(byte group);
+void GetModuleInput(byte group);
+void GetModuleIavailable(byte group);
+void GetModuleOutput(byte group);
 
-//ver 1.8 & 1.9
-void RefreshSerialNumber(void *func);
-//void GetBarCodeCallback(byte address, char *serial_number , unsigned short module_ver)
-void (*return_serial_number)(byte address, char *serial_number , unsigned short module_ver);
+/* Callback Function */
+void RefreshStatus(void *func);
+void (*return_status)(byte group, byte address, byte temp, int status);
 
-//ver 1.9
-void RefreshVextAndIavail(void *func);
-//void SavePresentModeleVextIavailCallback(byte address, unsigned short Vext, unsigned short Iavail)
-void (*return_vext_and_iavail)(byte address, unsigned short Vext, unsigned short Iavail);
+void RefreshModuleCount(void *func);
+void (*return_module_count)(byte group, byte count);
 
-void RefreshMiscInfo(void *func);
-//void GetMiscInfoCallback(byte address, unsigned short CmdType , unsigned int value)
-void (*return_misc_info)(byte address, unsigned short CmdType , unsigned int value);
+void RefreshAvailableCap(void *func);
+void (*return_available_cap)(byte address, short maxVol, short minVol, short maxCur, short totalPow);
 
-void RefreshStatus(void *func);
-//void SaveStatusCallback(byte group, byte address, char cri_temp1, int alarm)
-void (*return_status)(byte group, byte address, int alarm, int fault);
+void RefreshFwVersion(void *func);
+void (*return_fw_version)(byte address, short dcSwVer, short pfcSwVer, short hwVer);
 
 void RefreshInputVol(void *func);
-//void SavePresentInputVoltageCallback(byte address, unsigned short vol1, unsigned short vol2, unsigned short vol3)
 void (*return_input_vol)(byte address, unsigned short vol1, unsigned short vol2, unsigned short vol3);
 
 void RefreshGetOutput(void *func);
-//void SavePresentOutputCallback(byte address, unsigned short out_vol, unsigned short out_cur)
-void (*return_get_output)(byte address, unsigned short out_vol, unsigned short out_cur);
+void (*return_get_output)(byte address, unsigned short outVol, unsigned short outCur);
 
-void RefreshAvailableCap(void *func);
-//void SaveAvailableCapCallback(byte address, unsigned short maxv,unsigned short minv, unsigned short able_cur, unsigned short able_power)
-void (*return_available_cap)(byte address, unsigned short maxv,unsigned short minv , unsigned short able_cur,unsigned short able_power);
+void RefreshFanInfo(void *func);
+void (*return_fanspeed_info)(byte address, unsigned int fanSpeed);
 
-void RefreshOutputPowerSwitch(void *func);
-//void GetOutputPowerSwitchStatusCallback(byte address, unsigned char value)
-void (*return_output_pow_switch)(byte address, int result);
+void RefreshIavailable(void *func);
+void (*return_iavail_info)(byte address, unsigned short Iavail, unsigned short Vext);
 
 /* Callback Function end */
-
-
-
-void DisableDipAddrMode(void);
-void EnableOutputPower(byte group, byte address, byte value);
 #endif /* INFYPWR_PSUCOMMOBJ_H_ */