Esempio n. 1
0
            public void UpdateAndPublish(PidValue pidValue, CanMessageSegment segment)
            {
                if (pidValue == null)
                {
                    pidValue = new PidValue();
                }
                pidValue.RawValue         = segment.RawValue;
                pidValue.StandardValue    = segment.StandardValue * Parameter.Multiplier + Parameter.Offset;
                pidValue.MetricValue      = segment.MetricValue * Parameter.Multiplier + Parameter.Offset;
                pidValue.TimeReceived     = segment.TimeReceived;
                Parameter.LastValue       = pidValue.StandardValue;
                Parameter.LastMetricValue = pidValue.MetricValue;
                Parameter.Seen            = true;
                var e = new VMSPidValueEventArgs(EventIDs.PID_BASE | Parameter.Pid, Parameter.LastValue)
                {
                    segment = segment,
                };

                RaiseVMSEvent?.Invoke(this, e);
                //VMSConsole.PrintLine("Time to parse: " + (segment.TimeParsed - segment.TimeReceived));
            }
Esempio n. 2
0
            public void UpdateWithJ1708(CanMessageSegment segment)
            {
                switch (ConfigManager.Settings.Contents.globalParseBehavior)
                {
                case ParseBehavior.IGNORE_1708:
                    break;

                case ParseBehavior.PRIORITIZE_1939:
                    if (Parameter.J1939Value.TimeReceived < DateTime.Now.AddMinutes(-1))
                    {
                        UpdateAndPublish(Parameter.J1708Value, segment);
                    }
                    break;

                case ParseBehavior.IGNORE_1939:
                case ParseBehavior.PARSE_ALL:
                case ParseBehavior.PRIORITIZE_1708:
                    UpdateAndPublish(Parameter.J1708Value, segment);
                    break;
                }
            }
        public override void Parse(CanMessageSegment segment)
        {
            byte        numTires, position;
            List <byte> buffer = segment.RawData;

            if (buffer == null)
            {
                return;
            }
            if ((segment as J1708MessageSegment).Mid != PProDeviceMid)
            {
                PProDeviceMid = (segment as J1708MessageSegment).Mid;
                ResubscribeForMid();
            }
            switch (segment.Pid)
            {
            case 194:
                ProcessError(buffer);
                break;

            case 210:
                ProcessTemperatures(buffer);
                break;

            case 211:
                ProcessPressures(buffer);
                break;

            case 212:
                ProcessTargetPressures(buffer);
                break;

            case 254:
                ProcessConfiguration(buffer);
                break;
            }
        }
Esempio n. 4
0
 public void UpdateWithInferred(CanMessageSegment segment)
 {
     UpdateAndPublish(Parameter.J1939Value, segment);
 }
Esempio n. 5
0
 public VMSParsedDataEventArgs(ushort pid, CanMessageSegment messageSegment)
     : base(EventIDs.PARSED_DATA_EVENT | pid)
 {
     this.messageSegment = messageSegment;
 }
        public override void Parse(CanMessageSegment segment)
        {
            messageCount++;
            LastMessageTimeStamp = DateTime.Now;
            byte axle;
            byte tire;
            byte position;
            var  data = (segment as J1939MessageSegment)?.RawData.ToArray();
            var  pgn  = (segment as J1939MessageSegment)?.PGN;

            switch (pgn)
            {
            case 0xFE33:
                if ((data[6] == 54) && data[7] == 50)       //indicating 'T' and 'P'
                {
                    axle     = (byte)((data[1] >> 4) & 0x0F);
                    tire     = (byte)(data[1] & 0x0F);
                    position = (byte)((byte)(axle * 4) + tire);
                    if (position < 20)
                    {
                        Tires[position].id = (data[3] << 16) | (data[4] << 8) | data[5];
                        byte idStatus = (byte)(data[2] & 0x03);
                        switch (idStatus)
                        {
                        case 0:         //Sensor position is in learning mode. Do nothing
                            break;

                        case 1:         //Sensor has been learned
                            if (Tires[position].TireStatus == TireStatus.None)
                            {
                                Tires[position].TireStatus = TireStatus.NoData;
                            }
                            break;

                        case 2:         //Sensor has been forgotten
                            Tires[position] = new TSTTire();
                            break;

                        case 3:         //Sensor ID report. Do nothing
                            break;
                        }
                    }
                }
                break;

            case 0xFEF4:
                axle     = (byte)((data[0] >> 4) & 0x0F);
                tire     = (byte)(data[0] & 0x0F);
                position = (byte)((axle * 4) + tire);
                TSTTire currentTire = (Tires[position] as TSTTire);
                if (position < 20)
                {
                    currentTire.sensorReporting = true;
                    if (UpdateByte(ref currentTire.pressure, data[1]) != 0)
                    {
                        UpdateFlag(ref currentTire.extendedPressure, data[4], 6);
                    }
                    UpdateWord(ref currentTire.temperature, data, 2);
                    UpdateFlag(ref currentTire.leakStatus, data[4], 2);
                    UpdateFlag(ref currentTire.electricalStatus, data[4], 4);
                    UpdateBits(ref currentTire.pressureStatus, data[7], 5, 3);
                    UpdateFlag(ref currentTire.enableStatus, data[4], 0);

                    currentTire.TireStatus = TireStatus.Okay;

                    if (currentTire.leakStatus != 0)
                    {
                        currentTire.TireStatus = TireStatus.Warning;
                    }
                    if (currentTire.electricalStatus == 1 || currentTire.electricalStatus == 2)
                    {
                        currentTire.TireStatus = TireStatus.Warning;
                    }
                    switch (currentTire.pressureStatus)
                    {
                    case 0:
                    case 1:
                    case 3:
                        currentTire.TireStatus = TireStatus.Warning;
                        break;

                    case 4:
                        currentTire.TireStatus = TireStatus.Alert;
                        break;

                    case 6:
                        currentTire.TireStatus = TireStatus.NoData;
                        break;
                    }
                    if ((currentTire.id == 0) || (currentTire.id == 0xFFFFFF))
                    {
                        if (PendingPosition == position)
                        {
                            PendingPosition = 0xFF;
                        }
                    }
                }
                break;

            case 0xFDB9:
                axle = (byte)((data[0] >> 4) & 0x0F);
                if (axle < MAX_AXLES)
                {
                    targetPsi[axle] = data[1];
                }
                else if (axle == 0xE)     //all axles
                {
                    for (int i = 0; i < 5; i++)
                    {
                        UpdateByte(ref targetPsi[i], data[1]);
                    }
                }
                break;

            case 0xFC43:
                UpdateByte(ref underPressureThreshold, data[3]);
                UpdateByte(ref extremeUnderPressureThreshold, data[4]);
                UpdateByte(ref overPressureThreshold, data[5]);
                UpdateByte(ref overTemperatureThreshold, data[6]);
                break;
            }
        }
Esempio n. 7
0
 public abstract void Parse(CanMessageSegment segment);