using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OrpaonEMS.App.CANDrive
{
///
/// 液冷AC数据解析
/// CAN 解析解析数据
/// 协议数据执行Motorola LSB格式;数据类型= Unsigned;
///协议内基于CAN2.0B的扩展帧。
///CAN 2.0B的29bit扩展ID帧标识符进行的分段定义
///
public class ACCANParsData
{
public static Msg_0x18008040 msg_0X18008040 { get; set; } = new Msg_0x18008040();
public static Msg_0x18018040 msg_0X18018040 { get; set; } = new Msg_0x18018040();
///
/// 获取0x18008040
///
///
public static void Load_0x18008040_Msg(CAN_FRAME_INFO srData)
{
msg_0X18008040.WorkState = (int)GetMotorolaSignalValue(srData.data, 0, 8, 1, 0);
msg_0X18008040.OutTemp = GetMotorolaSignalValue(srData.data, 8, 8, 1, -40);
msg_0X18008040.InTemp = GetMotorolaSignalValue(srData.data, 16, 8, 1, -40);
msg_0X18008040.SysEnvTemp = GetMotorolaSignalValue(srData.data, 24, 8, 1, -40);
msg_0X18008040.InPress = GetMotorolaSignalValue(srData.data, 32, 8, 0.1, 0);
msg_0X18008040.OutPress = GetMotorolaSignalValue(srData.data, 40, 8, 0.1, 0);
msg_0X18008040.InverterErrCode = (int)GetMotorolaSignalValue(srData.data, 48, 8, 1, 0);
msg_0X18008040.ErrCode = (int)GetMotorolaSignalValue(srData.data, 56, 6, 1, 0);
msg_0X18008040.ErrLevel = (int)GetMotorolaSignalValue(srData.data, 62, 2, 1, 0);
}
///
/// 获取0x18018040
///
///
public static void Load_0x18018040_Msg(CAN_FRAME_INFO srData)
{
msg_0X18018040.CompressorState = (int)GetMotorolaSignalValue(srData.data, 0, 1, 1, 0);
msg_0X18018040.CompressorHeatStripState = (int)GetMotorolaSignalValue(srData.data, 1, 1, 1, 0);
msg_0X18018040.EleHeatState = (int)GetMotorolaSignalValue(srData.data, 2, 1, 1, 0);
msg_0X18018040.WaterPumpState = (int)GetMotorolaSignalValue(srData.data, 3, 1, 1, 0);
msg_0X18018040.FanState1 = (int)GetMotorolaSignalValue(srData.data, 4, 1, 1, 0);
msg_0X18018040.FanState2 = (int)GetMotorolaSignalValue(srData.data, 5, 1, 1, 0);
msg_0X18018040.FanState3 = (int)GetMotorolaSignalValue(srData.data, 6, 1, 1, 0);
msg_0X18018040.CompressorSpeed = GetMotorolaSignalValue(srData.data, 8, 8, 100, 0);
msg_0X18018040.PumpSpeed = GetMotorolaSignalValue(srData.data, 16, 8, 100, 0);
}
/////
///// 获取交流 电流 电压 测量 值
/////
/////
//public static void Load_AC_Sense_Msg(AC_Sense_Msg aC_Sense_Msg, VCI_CAN_OBJ srData)
//{
// aC_Sense_Msg.A_Vol = GetIntelSignalValue(srData.Data, 0, 10, 1, -512);
// aC_Sense_Msg.B_Vol = GetIntelSignalValue(srData.Data, 10, 10, 1, -512);
// aC_Sense_Msg.C_Vol = GetIntelSignalValue(srData.Data, 20, 10, 1, -512);
// aC_Sense_Msg.A_Cur = GetIntelSignalValue(srData.Data, 30, 10, 1, -512);
// aC_Sense_Msg.B_Cur = GetIntelSignalValue(srData.Data, 40, 10, 1, -512);
// aC_Sense_Msg.C_Cur = GetIntelSignalValue(srData.Data, 50, 10, 1, -512);
//}
/////
///// 获取 直流 电流 电压 和交直流 交直流 功率 测量 值
/////
/////
//public static void Load_DC_Power_Sense_Msg(DC_Power_Sense_Msg value, VCI_CAN_OBJ srData)
//{
// value.Vbus_Ave = GetIntelSignalValue(srData.Data, 0, 11, 1, 0);
// value.Ibat_Ave = GetIntelSignalValue(srData.Data, 11, 10, 1, -512);
// value.PwrAC = GetIntelSignalValue(srData.Data, 21, 19, 1, -256000);
// value.PwrDC = GetIntelSignalValue(srData.Data, 40, 19, 1, -256000);
//}
/////
///// 获取 状态 帧
/////
/////
//public static void Load_State_Sense_Msg(State_Sense_Msg value, VCI_CAN_OBJ srData)
//{
// //冷却液进口温度测量值
// value.Coolant_Tin_Sense = GetIntelSignalValue(srData.Data, 0, 8, 1, -64);
// value.Coolant_Tout_Sense = GetIntelSignalValue(srData.Data, 8, 8, 1, -64);
// value.IGBT_Tmax_Sense = GetIntelSignalValue(srData.Data, 16, 8, 1, -64);
// value.Vac_Freq_Sense = GetIntelSignalValue(srData.Data, 24, 8, 0.25, 0);
// value.DrvCtrlModel = GetIntelSignalValue(srData.Data, 32, 4, 1, 0);
// switch (value.DrvCtrlModel)
// {
// case 0:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.NotActive;
// break;
// case 1:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.Init;
// break;
// case 2:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.PreCharge;
// break;
// case 3:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.Standby;
// break;
// case 5:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.GridDisChg;
// break;
// case 8:
// value.DrvCtrlModel_State = PCSDriveCtrlMode.Failure;
// break;
// default:
// break;
// }
// value.GateDrvModel = GetIntelSignalValue(srData.Data, 36, 2, 1, 0);
// switch (value.GateDrvModel)
// {
// case 0:
// value.GateDrvModel_State = PCSGateDriveMode.Freewheel;
// break;
// case 1:
// value.GateDrvModel_State = PCSGateDriveMode.ShortCircuit;
// break;
// case 2:
// value.GateDrvModel_State = PCSGateDriveMode.PWNRun;
// break;
// default:
// break;
// }
// value.flgTColantDerat = GetIntelSignalValue(srData.Data, 38, 1, 1, 0);
// switch (value.flgTColantDerat)
// {
// case 0:
// value.flgTColantDerat_State = PCSFlgColantDeratModel.Off;
// break;
// case 1:
// value.flgTColantDerat_State = PCSFlgColantDeratModel.On;
// break;
// default:
// break;
// }
// value.Runcrnd = GetIntelSignalValue(srData.Data, 39, 1, 1, 0);
// switch (value.Runcrnd)
// {
// case 0:
// value.Runcrnd_State = PCSRuncmdModel.Stop;
// break;
// case 1:
// value.Runcrnd_State = PCSRuncmdModel.Run;
// break;
// default:
// break;
// }
//}
//public static void Load_Fault_T_F_Sense_Msg(Fault_T_F_Sense_Msg value, VCI_CAN_OBJ srData)
//{
// value.HW_Fault = GetIntelSignalValue(srData.Data, 0, 16, 1, 0);
// value.Env_Fault = GetIntelSignalValue(srData.Data, 16, 32, 1, 0);
//}
///
/// 当前发送的Intel的数据
///
private byte[] CurrentSendIntelSignal { get; set; } = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
///
/// intel格式CAN报文 转 数值
///
/// CAN报文
/// 信号起始bit
/// 信号总长度
/// 精度值
/// 偏移值
/// 数值
public static double GetIntelSignalValue(byte[] data, int startBit, int bitLength, double factor, double offset)
{
ulong canSignalValue = 0;
for (int i = data.Length - 1; i >= 0; i--)
{
canSignalValue += (ulong)data[i] << i * 8;
}
int x = startBit / 8;
int y = startBit % 8;
int rightMoveCount = x * 8 + y;
canSignalValue >>= rightMoveCount;
canSignalValue = canSignalValue & ulong.MaxValue >> 64 - bitLength;
double values = canSignalValue * factor + offset;
return values;
}
///
/// 数值 转 intel格式CAN报文
///
/// 物理信号值
/// 信号起始bit
/// 信号总长度
/// 精度值
/// 偏移值
/// intel格式CAN报文
public static byte[] ValueToIntelSignal(double values, int startBit, int bitLength, double factor, double offset)
{
byte[] IntelSignal = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
ulong data = Convert.ToUInt64((values - offset) / factor);
int dataLength = bitLength / 8 + (bitLength / 4) % 2;
int IntelSignal_pos = startBit / 8;
for (int Count = 0; Count < dataLength; Count++, IntelSignal_pos++)
{
ulong lowBit = (data >> (8 * Count)) & 0xFF; // 将数据移至低8位并取出
IntelSignal[IntelSignal_pos] = Convert.ToByte(lowBit);
}
return IntelSignal;
}
///
/// 数值 转 intel格式CAN报文
///
/// 物理信号值
/// 信号起始bit
/// 信号总长度
/// 精度值
/// 偏移值
/// intel格式CAN报文
public static byte[] ValueToIntelSignal(byte[] IntelSignal, double values, int startBit, int bitLength, double factor, double offset)
{
//byte[] IntelSignal = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
ulong data = Convert.ToUInt64((values - offset) / factor);
int dataLength = bitLength / 8 + (bitLength / 4) % 2;
int IntelSignal_pos = startBit / 8;
for (int Count = 0; Count < dataLength; Count++, IntelSignal_pos++)
{
ulong lowBit = (data >> (8 * Count)) & 0xFF; // 将数据移至低8位并取出
IntelSignal[IntelSignal_pos] = Convert.ToByte(lowBit);
}
return IntelSignal;
}
///
/// Motorola格式CAN报文 转 数值
///
/// CAN报文
/// 信号起始bit
/// 信号总长度
/// 精度值
/// 偏移值
/// 物理信号值
public static double GetMotorolaSignalValue(byte[] data, int startBit, int bitLength, double factor, double offset)
{
ulong canSignalValue = 0;
for (int i = data.Length - 1, j = 0; i >= 0; i--, j++)
{
canSignalValue += (ulong)data[j] << i * 8;
}
int x = startBit / 8;
int y = startBit % 8;
int z = x * 8 + bitLength - y;
int rightMoveCount = data.Length * 8 - z;
canSignalValue >>= rightMoveCount;
canSignalValue = canSignalValue & ulong.MaxValue >> 64 - bitLength;
double values = canSignalValue * factor + offset;
return values;
}
///
/// 数值 转 Motorola格式CAN报文
///
/// CAN报文
/// 物理信号值
/// 信号起始bit
/// 信号总长度
/// 精度值
/// 偏移值
/// Motorola格式CAN报文
public static byte[] ValueToMotorolaSignal_Part(byte[] MotorolaSignal, double values, int startBit, int bitLength, double factor, double offset)
{
// = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
ulong data = Convert.ToUInt64((values - offset) / factor);
int dataLength = bitLength / 8 + (bitLength / 4) % 2;
int str_length = data.ToString().Length;
int MotorolaSignal_pos = startBit / 8;
data = str_length % 2 != 0 ? data << 4 : data;
for (int Count = dataLength - 1; Count >= 0; Count--, MotorolaSignal_pos++)
{
ulong newBit = (data >> (8 * Count)) & 0xFF;
ulong newBit2 = ((newBit << 4) & 0xF0) + ((newBit >> 4) & 0x0F);
ulong Bit = (data > 0x0F & bitLength > 8) ? newBit2 : newBit;
MotorolaSignal[MotorolaSignal_pos] = Convert.ToByte(Bit);
}
return MotorolaSignal;
}
}
}