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