|
@@ -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];
|