static void ProcessIKEMessage(Message m)
{
if (m.Data.Length == 3 && m.Data[0] == 0x18)
{
OnSpeedRPMChanged((ushort)(m.Data[1] * 2), (ushort)(m.Data[2] * 100));
m.ReceiverDescription = "Speed " + CurrentSpeed + "km/h " + CurrentRPM + "RPM";
}
else if (m.Data.Length == 2 && m.Data[0] == 0x11)
{
byte ign = m.Data[1];
if ((ign & 0x02) != 0)
{
CurrentIgnitionState = IgnitionState.Ign;
}
else if ((ign & 0x01) != 0)
{
CurrentIgnitionState = IgnitionState.Acc;
}
else if (ign == 0x00)
{
CurrentIgnitionState = IgnitionState.Off;
}
else
{
m.ReceiverDescription = "Ignition unknown " + ign.ToHex();
return;
}
m.ReceiverDescription = "Ignition " + CurrentIgnitionState.ToStringValue();
}
else if (m.Data[0] == 0x17 && m.Data.Length == 8)
{
OnOdometerChanged((uint)(m.Data[3] << 16 + m.Data[2] << 8 + m.Data[1]));
m.ReceiverDescription = "Odometer " + Odometer + " km";
}
else if (m.Data[0] == 0x54 && m.Data.Length == 14)
{
OnVinChanged("" + (char)m.Data[1] + (char)m.Data[2] + m.Data[3].ToHex() + m.Data[4].ToHex() + m.Data[5].ToHex()[0]);
m.ReceiverDescription = "VIN " + VIN;
}
else if (m.Data.Length == 4 && m.Data[0] == 0x19)
{
OnTemperatureChanged((sbyte)m.Data[1], (sbyte)m.Data[2]);
m.ReceiverDescription = "Temperature. Outside " + TemperatureOutside + "°C, Coolant " + TemperatureCoolant + "°C";
}
else if (m.Data[0] == 0x24 && m.Data.Length > 2)
{
switch (m.Data[1])
{
case 0x01:
if (m.Data.Length == 10)
{
var hourStr = new string(new[] { (char)m.Data[3], (char)m.Data[4] });
var minuteStr = new string(new[] { (char)m.Data[6], (char)m.Data[7] });
if (hourStr == "--" || minuteStr == "--")
{
m.ReceiverDescription = "Time: unset";
break;
}
var hour = Convert.ToByte(hourStr);
var minute = Convert.ToByte(minuteStr);
if (hour == 12 && m.Data[8] == 'A') // 12AM
{
hour = 0;
}
else if (hour != 12 && m.Data[8] == 'P') // PM < 12
{
hour += 12;
}
OnTimeChanged(hour, minute);
m.ReceiverDescription = "Time: " + hour + ":" + minute;
}
break;
case 0x02:
if (m.Data.Length == 13)
{
var dayStr = new string(new[] { (char)m.Data[3], (char)m.Data[4] });
var monthStr = new string(new[] { (char)m.Data[6], (char)m.Data[7] });
var yearStr = new string(new[] { (char)m.Data[9], (char)m.Data[10], (char)m.Data[11], (char)m.Data[12] });
if (dayStr == "--" || monthStr == "--" || yearStr == "----") // year is always set
{
m.ReceiverDescription = "Date: unset";
break;
}
var day = Convert.ToByte(dayStr);
var month = Convert.ToByte(monthStr);
var year = Convert.ToUInt16(yearStr);
if (m.Data[5] == 0x2F || month > 12 && day <= 12)
{
// TODO use region settings
var t = day;
day = month;
month = t;
}
OnDateChanged(day, month, year);
m.ReceiverDescription = "Date: " + day + "/" + month + "/" + year;
}
break;
case 0x03:
if (m.Data.Length == 8)
{
float temperature;
if (m.Data.ParseFloat(out temperature, 3, 5))
{
//TemperatureOutside = (sbyte)temperature;
m.ReceiverDescription = "Outside temperature " + temperature + "°C";
}
}
break;
case 0x04:
case 0x05:
if (m.Data.Length == 7)
{
float consumption = 0;
m.Data.ParseFloat(out consumption, 3, 4);
OnConsumptionChanged(m.Data[1] == 0x04, consumption);
m.ReceiverDescription = "Consumption " + (m.Data[1] == 0x04 ? 1 : 2) + " = " + consumption + " l/km";
}
break;
case 0x06:
if (m.Data.Length == 7)
{
int range;
if (m.Data.ParseInt(out range, 3, 4))
{
OnRangeChanged((uint)range);
m.ReceiverDescription = "Range " + Range + " km";
}
}
break;
case 0x09:
if (m.Data.Length == 7)
{
int speedLimit;
if (m.Data.ParseInt(out speedLimit, 3, 3))
{
OnSpeedLimitChanged((ushort)speedLimit);
m.ReceiverDescription = "Speed limit " + SpeedLimit + " km/h";
}
}
break;
case 0x0A:
if (m.Data.Length == 7)
{
float speed = 0;
m.Data.ParseFloat(out speed, 3, 4);
OnAverageSpeedChanged(speed);
m.ReceiverDescription = "Average speed " + AverageSpeed + " km/h";
}
break;
}
}
else if (m.DestinationDevice == DeviceAddress.FrontDisplay && m.Data.Compare(0x2A, 0x00, 0x00))
{
OnSpeedLimitChanged(0);
m.ReceiverDescription = "Speed limit turned off";
}
else if (m.DestinationDevice == DeviceAddress.FrontDisplay && m.Data.Compare(0x2A, 0x02, 0x00))
{
OnSpeedLimitChanged(_lastSpeedLimit);
m.ReceiverDescription = "Speed limit turned on";
}
// TODO arrive time, arrive distance, timers
}