private bool ReadObdPid(byte mode, byte pid, ProtocolID protocolId, ref List<byte> value)
{
PassThruMsg txMsg = new PassThruMsg();
int timeout;
txMsg.ProtocolID = protocolId;
switch (protocolId)
{
case ProtocolID.ISO15765:
txMsg.TxFlags = TxFlag.ISO15765_FRAME_PAD;
if (mode == 0x03 || mode == 0x04)
{
txMsg.SetBytes(new byte[] { 0x00, 0x00, 0x07, 0xdf, mode});
}
else
{
txMsg.SetBytes(new byte[] { 0x00, 0x00, 0x07, 0xdf, mode, pid });
}
timeout = 50;
break;
case ProtocolID.J1850PWM:
case ProtocolID.J1850VPW:
case ProtocolID.ISO9141:
case ProtocolID.ISO14230:
byte protocolByte = (byte)((protocolId == ProtocolID.J1850PWM) ? 0x61 : 0x68);
txMsg.TxFlags = TxFlag.NONE;
txMsg.SetBytes(new byte[]{protocolByte, 0x6A, 0xF1, mode, pid});
timeout = 100;
break;
default:
return false;
}
m_j2534Interface.ClearRxBuffer(m_channelId);
int numMsgs = 1;
m_status = m_j2534Interface.PassThruWriteMsgs(m_channelId, txMsg.ToIntPtr(), ref numMsgs, timeout);
if (J2534Err.STATUS_NOERROR != m_status)
{
return false;
}
IntPtr rxMsgs = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PassThruMsg)) * numMsgs);
numMsgs = 1;
while (J2534Err.STATUS_NOERROR == m_status)
{
m_status = m_j2534Interface.PassThruReadMsgs(m_channelId, rxMsgs, ref numMsgs, timeout * 4);
}
if (J2534Err.ERR_BUFFER_EMPTY == m_status || J2534Err.ERR_TIMEOUT == m_status)
{
if (numMsgs > 0)
{
// Select the last value
PassThruMsg msg = rxMsgs.AsMsgList(numMsgs).Last();
value = msg.GetBytes().ToList();
value.RemoveRange(0, txMsg.GetBytes().Length);
return true;
}
return false;
}
return false;
}