using JT808.Protocol.Formatters; using JT808.Protocol.MessagePack; using JT808.Protocol.Metadata; using System; using System.Collections.Generic; namespace JT808.Protocol.MessageBody { /// /// 设置路线 /// 0x8606 /// public class JT808_0x8606 : JT808Bodies, IJT808MessagePackFormatter { public override ushort MsgId { get; } = 0x8606; /// /// 路线 ID /// public uint RouteId { get; set; } /// /// 路线属性 /// 路线属性数据格式见 表 67 /// public ushort RouteProperty { get; set; } /// /// 起始时间 /// YY-MM-DD-hh-mm-ss,若区域属性 0 位为 0 则没有该字段 /// public DateTime? StartTime { get; set; } /// /// 结束时间 /// YY-MM-DD-hh-mm-ss,若区域属性 0 位为 0 则没有该字段 /// public DateTime? EndTime { get; set; } /// /// 路线总拐点数 /// public ushort InflectionPointCount { get; set; } /// /// 拐点项 /// public List InflectionPointItems { get; set; } public JT808_0x8606 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8606 jT808_0X8606 = new JT808_0x8606(); jT808_0X8606.RouteId = reader.ReadUInt32(); jT808_0X8606.RouteProperty = reader.ReadUInt16(); ReadOnlySpan routeProperty16Bit = Convert.ToString(jT808_0X8606.RouteProperty, 2).PadLeft(16, '0').AsSpan(); bool bit0Flag = routeProperty16Bit.Slice(routeProperty16Bit.Length - 1).ToString().Equals("0"); if (!bit0Flag) { jT808_0X8606.StartTime = reader.ReadDateTime6(); jT808_0X8606.EndTime = reader.ReadDateTime6(); } jT808_0X8606.InflectionPointCount = reader.ReadUInt16(); jT808_0X8606.InflectionPointItems = new List(); for (var i = 0; i < jT808_0X8606.InflectionPointCount; i++) { JT808InflectionPointProperty jT808InflectionPointProperty = new JT808InflectionPointProperty(); jT808InflectionPointProperty.InflectionPointId = reader.ReadUInt32(); jT808InflectionPointProperty.SectionId = reader.ReadUInt32(); jT808InflectionPointProperty.InflectionPointLat = reader.ReadUInt32(); jT808InflectionPointProperty.InflectionPointLng = reader.ReadUInt32(); jT808InflectionPointProperty.SectionWidth = reader.ReadByte(); jT808InflectionPointProperty.SectionProperty = reader.ReadByte(); ReadOnlySpan sectionProperty16Bit = Convert.ToString(jT808InflectionPointProperty.SectionProperty, 2).PadLeft(16, '0').AsSpan(); bool sectionBit0Flag = sectionProperty16Bit.Slice(sectionProperty16Bit.Length - 1).ToString().Equals("0"); if (!sectionBit0Flag) { jT808InflectionPointProperty.SectionLongDrivingThreshold = reader.ReadUInt16(); jT808InflectionPointProperty.SectionDrivingUnderThreshold = reader.ReadUInt16(); } bool sectionBit1Flag = sectionProperty16Bit.Slice(sectionProperty16Bit.Length - 2, 1).ToString().Equals("0"); if (!sectionBit1Flag) { jT808InflectionPointProperty.SectionHighestSpeed = reader.ReadUInt16(); jT808InflectionPointProperty.SectionOverspeedDuration = reader.ReadByte(); } jT808_0X8606.InflectionPointItems.Add(jT808InflectionPointProperty); } return jT808_0X8606; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8606 value, IJT808Config config) { writer.WriteUInt32(value.RouteId); writer.WriteUInt16(value.RouteProperty); ReadOnlySpan routeProperty16Bit = Convert.ToString(value.RouteProperty, 2).PadLeft(16, '0').AsSpan(); bool bit0Flag = routeProperty16Bit.Slice(routeProperty16Bit.Length - 1).ToString().Equals("0"); if (!bit0Flag) { if (value.StartTime.HasValue) writer.WriteDateTime6(value.StartTime.Value); if (value.EndTime.HasValue) writer.WriteDateTime6(value.EndTime.Value); } //bool bit1Flag = routeProperty16Bit.Slice(routeProperty16Bit.Length - 2, 1).ToString().Equals("0"); if (value.InflectionPointItems != null && value.InflectionPointItems.Count > 0) { writer.WriteUInt16((ushort)value.InflectionPointItems.Count); foreach (var item in value.InflectionPointItems) { writer.WriteUInt32(item.InflectionPointId); writer.WriteUInt32(item.SectionId); writer.WriteUInt32(item.InflectionPointLat); writer.WriteUInt32(item.InflectionPointLng); writer.WriteByte(item.SectionWidth); writer.WriteByte(item.SectionProperty); ReadOnlySpan sectionProperty16Bit = Convert.ToString(item.SectionProperty, 2).PadLeft(16, '0').AsSpan(); bool sectionBit0Flag = sectionProperty16Bit.Slice(sectionProperty16Bit.Length - 1).ToString().Equals("0"); if (!sectionBit0Flag) { if (item.SectionLongDrivingThreshold.HasValue) writer.WriteUInt16(item.SectionLongDrivingThreshold.Value); if (item.SectionDrivingUnderThreshold.HasValue) writer.WriteUInt16(item.SectionDrivingUnderThreshold.Value); } bool sectionBit1Flag = sectionProperty16Bit.Slice(sectionProperty16Bit.Length - 2, 1).ToString().Equals("0"); if (!sectionBit1Flag) { if (item.SectionHighestSpeed.HasValue) writer.WriteUInt16(item.SectionHighestSpeed.Value); if (item.SectionOverspeedDuration.HasValue) writer.WriteByte(item.SectionOverspeedDuration.Value); } } } } } }