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)); }
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; } }
public void UpdateWithInferred(CanMessageSegment segment) { UpdateAndPublish(Parameter.J1939Value, segment); }
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; } }
public abstract void Parse(CanMessageSegment segment);