using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// Inclusion of PEAK PCAN-Basic namespace
///
using TPCANHandle = System.UInt16;
using TPCANBitrateFD = System.String;
using TPCANTimestampFD = System.UInt64;
namespace SIASUN.Autopilot.Device
{
///
/// Message Status structure used to show CAN Messages
/// in a ListView
///
public class MessageStatus
{
private TPCANMsgFD m_Msg;
private TPCANTimestampFD m_TimeStamp = 0;
private TPCANTimestampFD m_oldTimeStamp = 0;
public MessageStatus(TPCANMsgFD canMsg, TPCANTimestampFD canTimestamp)
{
m_Msg = canMsg;
m_TimeStamp = canTimestamp;
m_oldTimeStamp = canTimestamp;
}
public void Update(TPCANMsgFD canMsg, TPCANTimestampFD canTimestamp)
{
m_Msg = canMsg;
m_TimeStamp = canTimestamp;
m_oldTimeStamp = canTimestamp;
}
public TPCANMsgFD CANMsg
{
get { return m_Msg; }
}
public TPCANTimestampFD Timestamp
{
get { return m_TimeStamp; }
}
public string TypeString
{
get { return GetMsgTypeString(); }
}
public string IdString
{
get { return GetIdString(); }
}
public string DataString
{
get { return GetDataString(); }
}
public string TimeString
{
get { return GetTimeString(); }
}
private string GetTimeString()
{
double fTime;
fTime = (m_TimeStamp / 1000.0);
//if (m_bShowPeriod)
// fTime -= (m_oldTimeStamp / 1000.0);
return fTime.ToString("F1");
}
private string GetDataString()
{
string strTemp;
strTemp = "";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_RTR) == TPCANMessageType.PCAN_MESSAGE_RTR)
return "Remote Request";
else
for (int i = 0; i < GetLengthFromDLC(m_Msg.DLC, (m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_FD) == 0); i++)
strTemp += string.Format("{0:X2} ", m_Msg.DATA[i]);
return strTemp;
}
private string GetIdString()
{
// We format the ID of the message and show it
//
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_EXTENDED) == TPCANMessageType.PCAN_MESSAGE_EXTENDED)
return string.Format("{0:X8}", m_Msg.ID);
else
return string.Format("{0:X3}", m_Msg.ID);
}
private string GetMsgTypeString()
{
string strTemp;
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_STATUS) == TPCANMessageType.PCAN_MESSAGE_STATUS)
return "STATUS";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_ERRFRAME) == TPCANMessageType.PCAN_MESSAGE_ERRFRAME)
return "ERROR";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_EXTENDED) == TPCANMessageType.PCAN_MESSAGE_EXTENDED)
strTemp = "EXT";
else
strTemp = "STD";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_RTR) == TPCANMessageType.PCAN_MESSAGE_RTR)
strTemp += "/RTR";
else
if ((int)m_Msg.MSGTYPE > (int)TPCANMessageType.PCAN_MESSAGE_EXTENDED)
{
strTemp += " [ ";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_FD) == TPCANMessageType.PCAN_MESSAGE_FD)
strTemp += " FD";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_BRS) == TPCANMessageType.PCAN_MESSAGE_BRS)
strTemp += " BRS";
if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_ESI) == TPCANMessageType.PCAN_MESSAGE_ESI)
strTemp += " ESI";
strTemp += " ]";
}
return strTemp;
}
#region Help functions
///
/// Convert a CAN DLC value into the actual data length of the CAN/CAN-FD frame.
///
/// A value between 0 and 15 (CAN and FD DLC range)
/// A value indicating if the msg is a standard CAN (FD Flag not checked)
/// The length represented by the DLC
private int GetLengthFromDLC(int dlc, bool isSTD)
{
if (dlc <= 8)
return dlc;
if (isSTD)
return 8;
switch (dlc)
{
case 9: return 12;
case 10: return 16;
case 11: return 20;
case 12: return 24;
case 13: return 32;
case 14: return 48;
case 15: return 64;
default: return dlc;
}
}
#endregion help functions
}
}