Browse Source

2021-02-04 / Alston Lin

Actions
1. Modify the structure of infypower lib to fit the standard format

Files
1. As follow the commit history
Alston 4 years ago
parent
commit
63c69a9bf5
2 changed files with 682 additions and 425 deletions
  1. 589 418
      EVSE/Modularization/Infypwr_PsuCommObj.c
  2. 93 7
      EVSE/Modularization/Infypwr_PsuCommObj.h

+ 589 - 418
EVSE/Modularization/Infypwr_PsuCommObj.c

@@ -39,19 +39,15 @@ void PRINTF_LIB_FUNC(char *string, ...)
 
 float IEEE_754_to_float(const byte raw[4])
 {
-    int sign = (raw[0] >> 7) ? -1 : 1;
+    float fValue = 0;
+    byte *pbyte = (byte *)&fValue;
 
-    byte exponent = (raw[0] << 1) + (raw[1] >> 7) - 126;
+    *(pbyte + 0) = raw[3];
+    *(pbyte + 1) = raw[2];
+    *(pbyte + 2) = raw[1];
+    *(pbyte + 3) = raw[0];
 
-    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);
+    return fValue;
 }
 
 void IEEE_754_to_bytes(float target, byte *bytes2)
@@ -248,7 +244,7 @@ void ReceiveDataFromCanBus()
 {
 	int nbytes;
 	struct can_frame frame;
-	int intCmd = 0;
+	PwrFrame *PwrFrameMsg;
 	byte group, address;
 	byte _totalModuleCount = 0;
 	bool colFinished = false;
@@ -270,304 +266,305 @@ void ReceiveDataFromCanBus()
 
 		if (nbytes > 0)
 		{
-			if (isFilterValue(frame.can_id & 0xFFFF0000) == YES)
-				continue;
-
-//			if (frame.can_id == 0x82caf000 || frame.can_id == 0x82caf001 ||
-//					frame.can_id == 0x82c1f000 || frame.can_id == 0x82c1f001 ||
-//					frame.can_id == 0x82ccf000 || frame.can_id == 0x82ccf001 ||
-//					frame.can_id == 0x9901ff00 || frame.can_id == 0x9902ff00 || frame.can_id == 0x9903ff00 ||
-//					frame.can_id == 0x9901ff01 || frame.can_id == 0x9902ff01 || frame.can_id == 0x9903ff01 ||
-//					frame.can_id == 0x82c7f000 || frame.can_id == 0x82c7f001)
-//			{}
-//			else
-//				printf("can_id = %x \n", frame.can_id);
-
-			frame.can_id = frame.can_id & CAN_EFF_MASK;
-			intCmd = frame.can_id & 0x00FF0000;
-			intCmd |= INFYPWR_GROUP_SHIFT | intCmd;
-
-			switch (intCmd)
-			{
-				case WALK_IN_MODE:
-				case INFYPWR_GROUP_SHIFT | WALK_IN_MODE:
-				{
-					//address = frame.can_id & 0x000000FF;
-//					printf("walk in response address = %d, [0] = %d, [1] = %d, [2] = %d, [3] = %d, [4] = %d, [5] = %d, [6] = %d, [7] = %d \n"
-//							, address,
-//							frame.data[0], frame.data[1],
-//							frame.data[2], frame.data[3],
-//							frame.data[4], frame.data[5],
-//							frame.data[6], frame.data[7]);
-				}
-					break;
-
-				case INFYPWR_GROUP_SHIFT | STATUS:
-				{
-					group = frame.data[2];
-					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, SN, 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];
-					if (group == SYSTEM_CMD)
-					{
-						_totalModuleCount = count;
-					}
-
-					return_module_count(group, count);
-					//PRINTF_LIB_FUNC("group = %d, count = %d \n", group, count);
-				}
-					break;
-
-				case MODULE_CAP:
-				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;
-					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_OUTPUT_VOL_CUR_FLOAT:
-				{
-					group = frame.can_id & 0x000000FF;
-
-					byte vol[4], cur[4];
-					memcpy(vol, frame.data, 4);
-					memcpy(cur, frame.data + 4, 4);
-
-					float _Vol = IEEE_754_to_float(vol);
-					float _Cur = IEEE_754_to_float(cur);
-
-					return_get_output_float(group, _Vol, _Cur);
-				}
-					break;
-				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]);
-
-					return_iavail_info(address, iAvailCur, vextVol);
-					//PRINTF_LIB_FUNC("address = %d, iAvailCur = %d \n", address, iAvailCur);
-				}
-					break;
-
-				case INFYPWR_GROUP_SHIFT | MODULE_MIS_INFO:
-				{
-					if (!colFinished)
-						break;
-
-					address = frame.can_id & 0x000000FF;
-					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))
-					{
-						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);
-					}
-				}
-					break;
-
-				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]);
-					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:
-				{
-					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;
-					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;
-				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]);
-					short outputPow = ((frame.data[4] << 8) + frame.data[5]);
-					byte temp = frame.data[6];
-
-					return_output_temp(address, outputVol, outputCur, outputPow, temp);
-					//PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
-				}
-					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;
-					byte err1 = frame.data[2];
-					byte err2 = frame.data[3];
-					byte err3 = frame.data[4];
-					byte err4 = frame.data[5];
-
-					return_module_status(address, isErr, status, err1, err2, err3, err4);
-					//PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
-				}
-					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]);
-					short vT = ((frame.data[4] << 8) + frame.data[5]);
-
-					return_module_input(address, vR, vS, vT);
-					//PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
-				}
-					break;
-			}
+            PwrFrameMsg = (PwrFrame *)&frame.can_id;
+            address = PwrFrameMsg->InfyBits.SourceAddress;
+
+            if(PwrFrameMsg->InfyBits.DestinationAddress != NEXTON_ADD)
+            {
+                if(PwrFrameMsg->InfyBits.DestinationAddress != INFY_ADD_CSU || PwrFrameMsg->InfyBits.Error != Infy_MsgErr_Normal)
+                {
+                    continue;
+                }
+
+                switch (PwrFrameMsg->InfyBits.CmdValue)
+                {
+                    case PSU_WCmd_ModuleWalkIn:
+                    {
+                        //address = frame.can_id & 0x000000FF;
+    //					printf("walk in response address = %d, [0] = %d, [1] = %d, [2] = %d, [3] = %d, [4] = %d, [5] = %d, [6] = %d, [7] = %d \n"
+    //							, address,
+    //							frame.data[0], frame.data[1],
+    //							frame.data[2], frame.data[3],
+    //							frame.data[4], frame.data[5],
+    //							frame.data[6], frame.data[7]);
+                    }
+                        break;
+
+                    case PSU_RCmd_ModuleStatus:
+                    {
+                        group = frame.data[2];
+                        byte SN = address;
+                        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, SN, temp, status);
+                        //PRINTF_LIB_FUNC("group = %d, address = %d, temp = %d \n", group, address, temp);
+                    }
+                        break;
+
+                    case PSU_RCmd_SysModuleCount:
+                    {
+                        // 回傳模組數量
+                        group = address;
+
+                        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);
+                    }
+                        break;
+
+                    case PSU_RCmd_ModuleCapability:
+                    {
+                        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;
+                        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 PSU_RCmd_SysOutputVolCur:
+                    {
+                        // 回傳當前輸出電壓電流
+                        //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 PSU_RCmd_SysOutputVolCur_F:
+                    {
+                        group = address;
+
+                        byte vol[4], cur[4];
+                        memcpy(vol, frame.data, 4);
+                        memcpy(cur, frame.data + 4, 4);
+
+                        float _Vol = IEEE_754_to_float(vol);
+                        float _Cur = IEEE_754_to_float(cur);
+
+                        return_get_output_float(group, _Vol, _Cur);
+                    }
+                        break;
+                    case PSU_RCmd_ModuleIAvailable:
+                    {
+                        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]);
+
+                        return_iavail_info(address, iAvailCur, vextVol);
+                        //PRINTF_LIB_FUNC("address = %d, iAvailCur = %d \n", address, iAvailCur);
+                    }
+                        break;
+
+                    case PSU_RCmd_ModuleMiscInfo:
+                    {
+                        if (!colFinished)
+                            break;
+
+                        //address = frame.can_id & 0x000000FF;
+                        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))
+                        {
+                            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);
+                        }
+                    }
+                        break;
+
+                    case PSU_RCmd_ModuleVersion:
+                    {
+                        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]);
+                        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 PSU_RCmd_ModuleBarcode:
+                    {
+                        // 回傳BarCode
+                    }
+                        break;
+
+                    case PSU_RCmd_ModuleInputVoltage:
+                    {
+                        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;
+                        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;
+                    default:
+                        break;
+                }
+            }
+            else
+            {
+                switch(PwrFrameMsg->NextonBits.CmdValue)
+                {
+                    case Nexton_PSU_DcOutputValue:
+                    {
+                        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]);
+                        short outputPow = ((frame.data[4] << 8) + frame.data[5]);
+                        byte temp = frame.data[6];
+
+                        return_output_temp(address, outputVol, outputCur, outputPow, temp);
+                        //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
+                    }
+                        break;
+                    case Nexton_PSU_StatusEvent:
+                    {
+                        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;
+                        byte err1 = frame.data[2];
+                        byte err2 = frame.data[3];
+                        byte err3 = frame.data[4];
+                        byte err4 = frame.data[5];
+
+                        return_module_status(address, isErr, status, err1, err2, err3, err4);
+                        //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
+                    }
+                        break;
+                    case Nexton_PSU_AcInputValue:
+                    {
+                        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]);
+                        short vT = ((frame.data[4] << 8) + frame.data[5]);
+
+                        return_module_input(address, vR, vS, vT);
+                        //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
+                    }
+                        break;
+                    default:
+                        break;
+                }
+            }
 		}
 		else
 			usleep(10000);
@@ -579,18 +576,19 @@ void ReceiveDataFromCanBus()
 //================================================
 void SendCmdToPsu(int cmd, byte *data, byte dataLen)
 {
+    PwrFrame PwrFrameMsg;
     struct can_frame frame;
 
     //設定 CANBSU 2.0B 長封包
-    cmd = cmd | 0x80000000;
+    PwrFrameMsg.PwrMessage = cmd | 0x80000000;
 
-    frame.can_id = cmd;
+    frame.can_id = PwrFrameMsg.PwrMessage;
     frame.can_dlc = dataLen;
     memcpy(frame.data, data, dataLen);
 
     write(CanFd, &frame, sizeof(struct can_frame));
     // 群命令才 delay
-    if ((cmd & 0x0000FF00) == INFYPWR_BROADCAST)
+    if (PwrFrameMsg.InfyBits.DestinationAddress == INFY_ADD_BROADCAST)
     	usleep(CMD_DELAY_TIME);
 }
 
@@ -619,58 +617,88 @@ bool InitialCommunication()
 void SwitchPower(byte group, byte value)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | SWITCH_POWER;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModulePowerOnOff;
 
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void SleepMode(byte group, byte value)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | SLEEP_MODE;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleSleepMode;
 
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void FlashLed(byte group, byte value)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | FLASH_LED;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleFlashLed;
 
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void PresentOutputVol(byte group, int voltage, int current)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | PRESENT_OUT_VOL;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_SetOutput;
+
 	int Vol = voltage * 100;
 	int Cur = current * 100;
 
@@ -687,41 +715,58 @@ void PresentOutputVol(byte group, int voltage, int current)
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void FanNoiseInfo(byte group, byte value)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MIS_INFO;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleSetMiscInfo;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
 	// 風扇低噪音
-	data[0] = 0x11;
-	data[1] = 0x13;
+    data[0] = ((SetMiscInfo_FanMode >> 8) & 0xFF);
+    data[1] = (SetMiscInfo_FanMode & 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));
-}
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
 
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
+}
 
 void SetWalkInConfig(byte group, byte enable, byte sec)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | WALK_IN_MODE;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleWalkIn;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 	unsigned short _Sec = sec * 100;
@@ -732,13 +777,19 @@ void SetWalkInConfig(byte group, byte enable, byte sec)
 	data[6] = (_Sec >> 8) & 0xFF;
 	data[7] = _Sec & 0xFF;
 
-	if (group == SYSTEM_CMD)
-		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-	else
-		cmd |= (group << 8) | INFYPWR_DEFAULT;
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
 
 	//printf("walk in cmd = %x \n", cmd);
-	SendCmdToPsu(cmd, data, sizeof(data));
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay)
@@ -769,13 +820,18 @@ void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switc
 void SetDipSwitchMode()
 {
     byte data[8];
-    uint cmd = INFYPWR_CMD | DIP_SWITCH_MODE;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_DipSwitchMode;
 
     memset(data, 0x00, ARRAY_SIZE(data));
     data[0] = 0x01;
 
-    cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-    SendCmdToPsu(cmd, data, sizeof(data));
+    PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    PwrFrameMsg.InfyBits.DestinationAddress = INFY_ADD_BROADCAST;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+    SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 /**********************************************************************************/
 /***                                                                            ***/
@@ -785,174 +841,289 @@ void SetDipSwitchMode()
 void GetStatus(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | STATUS;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleStatus;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetFanSpeed(byte group)
 {
-	uint cmd;
 	byte data[8];
-
-	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
 	data[0] = (FAN_SPEED_CMD >> 8) & 0xFF;
 	data[1] = FAN_SPEED_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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetDcTemperature(byte group)
 {
-	uint cmd;
 	byte data[8];
-
-	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
 
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetPfcTemperature(byte group)
 {
-	uint cmd;
 	byte data[8];
-
-	cmd = INFYPWR_CMD | MODULE_MIS_INFO;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
 
 	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));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleCount(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_COUNT;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysModuleCount;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	if (group == SYSTEM_CMD)
-		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-	else
-		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleVer(byte group)
 {
 	// 無系統廣播功能
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_VER;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleVersion;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
 	//PRINTF_LIB_FUNC("GetModuleVer cmd = %x\n", cmd);
-	SendCmdToPsu(cmd, data, sizeof(data));
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleCap(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_CAP;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleCapability;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
 	//PRINTF_LIB_FUNC("GetModuleCap cmd = %x\n", cmd);
-	SendCmdToPsu(cmd, data, sizeof(data));
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleBarCode(byte group)
 {
 	// 無系統廣播功能
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_BARCODE;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleBarcode;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleInput(byte group)
 {
 	// 無系統廣播功能
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_INPUT;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleInputVoltage;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+	SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleIavailable(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_IAVAILABLE;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleIAvailable;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	if (group == SYSTEM_CMD)
-		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-	else
-		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+    SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleOutput(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_OUTPUT_VOL_CUR;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysOutputVolCur;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	if (group == SYSTEM_CMD)
-		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-	else
-		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+    SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 void GetModuleOutputF(byte group)
 {
 	byte data[8];
-	uint cmd = INFYPWR_CMD | MODULE_OUTPUT_VOL_CUR_FLOAT;
+    PwrFrame PwrFrameMsg;
+    PwrFrameMsg.PwrMessage = 0;
+    PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysOutputVolCur_F;
 
 	memset(data, 0x00, ARRAY_SIZE(data));
 
-	if (group == SYSTEM_CMD)
-		cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
-	else
-		cmd |= INFYPWR_GROUP_SHIFT | (group << 8) | INFYPWR_DEFAULT;
-	SendCmdToPsu(cmd, data, sizeof(data));
+    if (group == INFY_ADD_BROADCAST)
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
+    }
+    else
+    {
+        PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
+    }
+    PwrFrameMsg.InfyBits.DestinationAddress = group;
+    PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
+
+    SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
 }
 
 /**********************************************************************************/

+ 93 - 7
EVSE/Modularization/Infypwr_PsuCommObj.h

@@ -45,7 +45,12 @@
 
 #define INFYPWR_GROUP_SHIFT		0x00400000
 
-#define SYSTEM_CMD				0x3F
+#define SYSTEM_CMD                  0x3F
+#define DEVICE_NO_SINGLE_MODULE     0x0A
+#define DEVICE_NO_GROUP_MODULE      0x0B
+#define INFY_ADD_BROADCAST          0x3F
+#define INFY_ADD_CSU                0xF0
+#define NEXTON_ADD                  0xFF
 
 #define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
 #define CMD_DELAY_TIME 		25000
@@ -53,13 +58,34 @@
 #define TEMP_DC_CMD			0x1107
 #define TEMP_PFC_CMD		0x1108
 
-typedef unsigned char 		byte;
-typedef unsigned short 	word;
-typedef unsigned int 		unit;
+typedef unsigned char       byte;
+typedef unsigned short      word;
+typedef unsigned int        unit;
 
 int 						CanFd;
 pid_t 						recFork;
 
+typedef union
+{
+    unsigned int PwrMessage;
+    struct
+    {
+        unsigned int SourceAddress:8;                   // source address
+        unsigned int DestinationAddress:8;              // destination address
+        unsigned int CmdValue:6;                        // command value
+        unsigned int DeviceValue:4;                     // 0x0A: for module command, 0x0B group command
+        unsigned int Error:3;                           // error code
+        unsigned int res:3;
+    }InfyBits;
+    struct
+    {
+        unsigned int SourceAddress:8;                   // source address
+        unsigned int DestinationAddress:8;              // destination address
+        unsigned int CmdValue:13;                       // command value
+        unsigned int res:3;
+    }NextonBits;
+}PwrFrame;
+
 enum PSU_POWER_CMD
 {
 	PSU_POWER_ON = 		0,
@@ -80,9 +106,9 @@ enum PSU_FLASH_CMD
 
 enum PSU_FAN_NOISE_CMD
 {
-	PSU_FAN_NOISE_BY_POWER = 		0xA0,
-	PSU_FAN_NOISE_BY_DENOISE = 		0xA1,
-	PSU_FAN_NOISE_BY_QUIET = 		0xA2
+    PSU_FAN_NOISE_BY_POWER =        0xA0,       // power poriority mode
+    PSU_FAN_NOISE_BY_DENOISE =      0xA1,       // denoise mode
+    PSU_FAN_NOISE_BY_QUIET =        0xA2,       // quiet mode
 };
 
 enum PSU_SET_CMD
@@ -118,6 +144,66 @@ enum PSU_GET_CMD
     AUTO_MODULE_INPUT =             0x00030000,
 };
 
+typedef enum
+{
+    Infy_MsgErr_Normal          = 0x00,
+    Infy_MsgErr_Reserved1       = 0x01,
+    Infy_MsgErr_CmdInvalid      = 0x02,
+    Infy_MsgErr_DataInvalid     = 0x03,
+    Infy_MsgErr_InvalidAdd      = 0x04,
+    Infy_MsgErr_Reserved2       = 0x05,
+    Infy_MsgErr_Reserved3       = 0x06,
+    Infy_MsgErr_StartProcess    = 0x07,
+}InfyMessageError;
+
+typedef enum
+{
+    PSU_RCmd_SysOutputVolCur_F      = 0x01,
+    PSU_RCmd_SysModuleCount         = 0x02,
+    PSU_RCmd_ModuleOutputVolCur_F   = 0x03,     // no use
+    PSU_RCmd_ModuleStatus           = 0x04,
+    PSU_RCmd_ModuleInputVoltage     = 0x06,
+    PSU_RCmd_ModuleVersion          = 0x07,
+    PSU_RCmd_SysOutputVolCur        = 0x08,
+    PSU_RCmd_ModuleOutputVolCur     = 0x09,     // no use
+    PSU_RCmd_ModuleCapability       = 0x0A,
+    PSU_RCmd_ModuleBarcode          = 0x0B,
+    PSU_RCmd_ModuleIAvailable       = 0x0C,
+    PSU_RCmd_ModuleMiscInfo         = 0x0E,
+    PSU_WCmd_ModuleSetMiscInfo      = 0x0F,
+    PSU_WCmd_ModuleWalkIn           = 0x13,
+    PSU_WCmd_ModuleFlashLed         = 0x14,
+    PSU_WCmd_ModuleSetGroup         = 0x16,
+    PSU_WCmd_ModuleSleepMode        = 0x19,
+    PSU_WCmd_ModulePowerOnOff       = 0x1A,
+    PSU_WCmd_SetOutput              = 0x1B,
+    PSU_WCmd_ModuleSetOutput        = 0x1C,
+    PSU_WCmd_DipSwitchMode          = 0x1F,
+}InfyPwrCommand;
+
+typedef enum
+{
+    Nexton_PSU_ChargingRequest      = 0x1801,
+    Nexton_PSU_DcOutputValue        = 0x1901,
+    Nexton_PSU_StatusEvent          = 0x1902,
+    Nexton_PSU_AcInputValue         = 0x1903,
+}NextonPwrCommand;
+
+typedef enum
+{
+    GetMiscInfo_DcTemperature       = 0x1107,
+    GetMiscInfo_PfcTemperature      = 0x1108,
+    GetMiscInfo_FanSpeed            = 0x1201,
+}GetMiscInfoCommand;
+
+typedef enum
+{
+    SetMiscInfo_FanMode             = 0x1113,
+    SetMiscInfo_FanSpeed            = 0x1201,
+    SetMiscInfo_CurrentLimit        = 0x1205,
+    SetMiscInfo_SendTemperature     = 0x1301,
+}SetMiscInfoCommand;
+
 union FloatingPointIEEE754
 {
 	struct