private void InitializeTires() { for (ushort i = 0; i < MAX_TIRE_POSITIONS; i++) { Tires[i] = new TSTTire() { index = i, }; } }
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; } }