using JT808.Protocol.Exceptions;
using JT808.Protocol.Extensions;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using JT808.Protocol.Metadata;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace JT808.Protocol.MessageBody
{
///
/// CAN 总线数据上传
/// 0x0705
///
public class JT808_0x0705 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze, IJT808_2019_Version
{
///
/// 0x0705
///
public override ushort MsgId { get; } = 0x0705;
///
/// CAN总线数据上传
///
public override string Description => "CAN总线数据上传";
///
/// 数据项个数
/// 包含的 CAN 总线数据项个数,>0
///
public ushort CanItemCount { get; set; }
///
/// CAN 总线数据接收时间
/// 第 1 条 CAN 总线数据的接收时间,hh-mm-ss-msms
///
public DateTime FirstCanReceiveTime { get; set; }
///
/// CAN 总线数据项
///
public List CanItems { get; set; }
///
///
///
///
///
///
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0705 value = new JT808_0x0705();
value.CanItemCount = reader.ReadUInt16();
writer.WriteNumber($"[{value.CanItemCount.ReadNumber()}]数据项个数", value.CanItemCount);
var dateTimeBuffer = reader.ReadVirtualArray(5).ToArray();
value.FirstCanReceiveTime = reader.ReadDateTime5();
writer.WriteString($"[{dateTimeBuffer.ToHexString()}]CAN总线数据接收时间", value.FirstCanReceiveTime.ToString("HH-mm-ss:fff"));
writer.WriteStartArray("CAN总线数据项");
for (var i = 0; i < value.CanItemCount; i++)
{
writer.WriteStartObject();
JT808CanProperty jT808CanProperty = new JT808CanProperty();
jT808CanProperty.CanId = reader.ReadUInt32();
writer.WriteNumber($"[{ jT808CanProperty.CanId.ReadNumber()}]CAN_ID", jT808CanProperty.CanId);
jT808CanProperty.CanData = reader.ReadArray(8).ToArray();
writer.WriteString($"CAN_数据", jT808CanProperty.CanData.ToHexString());
if (jT808CanProperty.CanData.Length != 8)
{
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(jT808CanProperty.CanData)}->8");
}
writer.WriteEndObject();
}
writer.WriteEndArray();
}
///
///
///
///
///
///
public JT808_0x0705 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0705 value = new JT808_0x0705();
value.CanItemCount = reader.ReadUInt16();
value.FirstCanReceiveTime = reader.ReadDateTime5();
value.CanItems = new List();
for (var i = 0; i < value.CanItemCount; i++)
{
JT808CanProperty jT808CanProperty = new JT808CanProperty();
jT808CanProperty.CanId = reader.ReadUInt32();
jT808CanProperty.CanData = reader.ReadArray(8).ToArray();
if (jT808CanProperty.CanData.Length != 8)
{
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(jT808CanProperty.CanData)}->8");
}
value.CanItems.Add(jT808CanProperty);
}
return value;
}
///
///
///
///
///
///
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0705 value, IJT808Config config)
{
if (value.CanItems != null && value.CanItems.Count > 0)
{
writer.WriteUInt16((ushort)value.CanItems.Count);
writer.WriteDateTime5(value.FirstCanReceiveTime);
foreach (var item in value.CanItems)
{
writer.WriteUInt32(item.CanId);
if (item.CanData.Length != 8)
{
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(item.CanData)}->8");
}
writer.WriteArray(item.CanData);
}
}
}
}
}