cleaning
This commit is contained in:
@@ -91,7 +91,10 @@ namespace arDev
|
||||
}
|
||||
|
||||
bool Recv0 = false;
|
||||
int Recv0Cnt = 0;
|
||||
bool Recv1 = false;
|
||||
int Recv1Cnt = 0;
|
||||
|
||||
public event EventHandler<ChargetDetectArgs> ChargeDetect;
|
||||
public override bool ProcessRecvData(byte[] data)
|
||||
{
|
||||
@@ -110,6 +113,13 @@ namespace arDev
|
||||
}
|
||||
|
||||
|
||||
if (VerifyChecksum(data) == false)
|
||||
{
|
||||
RaiseMessage(MessageType.Error, "Checksum error");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (data[1] == 0x03)
|
||||
{
|
||||
return ParseBMSInfo();
|
||||
@@ -123,6 +133,8 @@ namespace arDev
|
||||
}
|
||||
bool ParseBMSCellVoltage()
|
||||
{
|
||||
if (UseCmdLogging == true)
|
||||
RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList()));
|
||||
//var i = 0;
|
||||
var BatteryCell_Checksum = 0xffff;// - (LastReceiveBuffer[i + 3] + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
|
||||
for (int i = 3; i < 20; i++)
|
||||
@@ -170,8 +182,62 @@ namespace arDev
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static bool VerifyChecksum(byte[] dataBytes)
|
||||
{
|
||||
// 길이 바이트 (byte[3])
|
||||
byte length = dataBytes[3];
|
||||
|
||||
if (dataBytes[1] == 0x03)
|
||||
{
|
||||
|
||||
// 데이터 바이트 (byte[4] ~ byte[30])
|
||||
byte[] data = dataBytes.Skip(4).Take(27).ToArray();
|
||||
|
||||
// 길이와 데이터의 합을 계산
|
||||
ushort sum = (ushort)(length + data.Sum(b => b));
|
||||
|
||||
// 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함
|
||||
ushort checksum = (ushort)((~sum + 1) & 0xFFFF);
|
||||
|
||||
// 받은 체크섬 (byte[31] ~ byte[32])
|
||||
ushort receivedChecksum = (ushort)((dataBytes[31] << 8) | dataBytes[32]);
|
||||
|
||||
//252 1: 64514
|
||||
// 계산된 체크섬과 받은 체크섬을 비교
|
||||
return checksum == receivedChecksum;
|
||||
|
||||
}
|
||||
else if (dataBytes[1] == 0x04)
|
||||
{
|
||||
// 데이터 바이트 (byte[4] ~ byte[30])
|
||||
byte[] data = dataBytes.Skip(4).Take(16).ToArray();
|
||||
|
||||
// 길이와 데이터의 합을 계산
|
||||
ushort sum = (ushort)(length + data.Sum(b => b));
|
||||
|
||||
// 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함
|
||||
ushort checksum = (ushort)((~sum + 1) & 0xFFFF);
|
||||
|
||||
// 받은 체크섬 (byte[31] ~ byte[32])
|
||||
ushort receivedChecksum = (ushort)((dataBytes[20] << 8) | dataBytes[21]);
|
||||
|
||||
//252 1: 64514
|
||||
// 계산된 체크섬과 받은 체크섬을 비교
|
||||
return checksum == receivedChecksum;
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ParseBMSInfo()
|
||||
{
|
||||
if(UseCmdLogging == true)
|
||||
RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList()));
|
||||
|
||||
//전압확인
|
||||
UInt16 batH = (UInt16)LastReceiveBuffer[4];
|
||||
UInt16 batL = (UInt16)LastReceiveBuffer[5];
|
||||
@@ -361,6 +427,10 @@ namespace arDev
|
||||
|
||||
public int QueryIndex { get; set; } = 0;
|
||||
|
||||
public int CMDOutCnt { get; set; } = 3;
|
||||
|
||||
public bool UseCmdLogging { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 상태읽기와 전압읽기명령을 반복합니다
|
||||
/// </summary>
|
||||
@@ -375,8 +445,22 @@ namespace arDev
|
||||
Recv1 = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Recv0Cnt > CMDOutCnt)
|
||||
{
|
||||
Recv0Cnt = 0;
|
||||
RaiseMessage(MessageType.Error, "0 명령 Count Out");
|
||||
QueryIndex = 1;
|
||||
Recv1 = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return SendQuery_ReadStatue();
|
||||
}
|
||||
|
||||
return SendQuery_ReadStatue();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -386,29 +470,47 @@ namespace arDev
|
||||
Recv0 = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return SendQuery_ReadCellvoltage();
|
||||
else
|
||||
{
|
||||
if (Recv1Cnt > CMDOutCnt)
|
||||
{
|
||||
Recv1Cnt = 0;
|
||||
RaiseMessage(MessageType.Error, "1 명령 Count Out");
|
||||
QueryIndex = 0;
|
||||
Recv0 = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return SendQuery_ReadCellvoltage();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Boolean SendQuery_ReadStatue()
|
||||
{
|
||||
Recv0Cnt++;
|
||||
Recv0 = false;
|
||||
var cmd = new List<byte>();
|
||||
cmd.Add(0xDD); //stx
|
||||
cmd.Add(0xA5); //read
|
||||
cmd.Add(0x03); //command
|
||||
cmd.Add(0xDD);
|
||||
cmd.Add(0xA5);
|
||||
cmd.Add(0x03);
|
||||
cmd.Add(0x00);
|
||||
cmd.Add(0xFF);
|
||||
cmd.Add(0xFD); //checksum1
|
||||
cmd.Add(0x77); //checksum2
|
||||
cmd.Add(0x0D); //etx
|
||||
cmd.Add(0xFD);
|
||||
cmd.Add(0x77);
|
||||
cmd.Add(0x0D);
|
||||
if (UseCmdLogging == true)
|
||||
RaiseMessage(MessageType.Normal, ByteListToHexString(cmd));
|
||||
|
||||
return WriteData(cmd.ToArray());
|
||||
}
|
||||
|
||||
|
||||
public Boolean SendQuery_ReadCellvoltage()
|
||||
{
|
||||
Recv1Cnt++;
|
||||
Recv1 = false;
|
||||
var cmd = new List<byte>();
|
||||
cmd.Add(0xDD);
|
||||
@@ -419,8 +521,21 @@ namespace arDev
|
||||
cmd.Add(0xFC);
|
||||
cmd.Add(0x77);
|
||||
cmd.Add(0x0D);
|
||||
if (UseCmdLogging == true)
|
||||
RaiseMessage(MessageType.Normal, ByteListToHexString(cmd));
|
||||
return WriteData(cmd.ToArray());
|
||||
}
|
||||
|
||||
|
||||
public string ByteListToHexString(List<byte> byteList)
|
||||
{
|
||||
StringBuilder hex = new StringBuilder(byteList.Count * 2);
|
||||
foreach (byte b in byteList)
|
||||
{
|
||||
hex.AppendFormat("{0:X2} ", b);
|
||||
}
|
||||
return hex.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user