imBMW.iBus.Devices.Real.InstrumentClusterElectronics.ProcessIKEMessage C# (CSharp) Method

ProcessIKEMessage() static private method

static private ProcessIKEMessage ( Message m ) : void
m Message
return void
        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
        }