Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

109 wiersze
4.8 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessageBody;
  4. using JT808.Protocol.MessagePack;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.Extensions.JT1078.MessageBody
  9. {
  10. /// <summary>
  11. /// 音视频通道列表设置
  12. /// 0x8103_0x0076
  13. /// </summary>
  14. public class JT808_0x8103_0x0076 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0x0076>, IJT808Analyze
  15. {
  16. public override uint ParamId { get; set; } = 0x0076;
  17. /// <summary>
  18. /// 数据 长度
  19. /// </summary>
  20. public override byte ParamLength { get; set; }
  21. /// <summary>
  22. /// 音视频通道总数
  23. /// l
  24. /// </summary>
  25. public byte AVChannelTotal { get; set; }
  26. /// <summary>
  27. /// 音频通道总数
  28. /// m
  29. /// </summary>
  30. public byte AudioChannelTotal { get; set; }
  31. /// <summary>
  32. /// 视频通道总数
  33. /// n
  34. /// </summary>
  35. public byte VudioChannelTotal { get; set; }
  36. /// <summary>
  37. /// 音视频通道对照表
  38. /// 4*(l+m+n)
  39. /// </summary>
  40. public List<JT808_0x8103_0x0076_AVChannelRefTable> AVChannelRefTables { get; set; }
  41. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  42. {
  43. JT808_0x8103_0x0076 value = new JT808_0x8103_0x0076();
  44. value.ParamId = reader.ReadUInt32();
  45. writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数 ID", value.ParamId);
  46. value.ParamLength = reader.ReadByte();
  47. writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]数据长度", value.ParamLength);
  48. value.AVChannelTotal = reader.ReadByte();
  49. writer.WriteNumber($"[{value.AVChannelTotal.ReadNumber()}]音视频通道总数", value.AVChannelTotal);
  50. value.AudioChannelTotal = reader.ReadByte();
  51. writer.WriteNumber($"[{value.AudioChannelTotal.ReadNumber()}]音频通道总数", value.AudioChannelTotal);
  52. value.VudioChannelTotal = reader.ReadByte();
  53. writer.WriteNumber($"[{value.VudioChannelTotal.ReadNumber()}]视频通道总数", value.VudioChannelTotal);
  54. var channelTotal = value.AVChannelTotal + value.AudioChannelTotal + value.VudioChannelTotal;//通道总数
  55. writer.WriteStartArray("音视频通道对照表");
  56. for (int i = 0; i < channelTotal; i++)
  57. {
  58. writer.WriteStartObject();
  59. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  60. formatter.Analyze(ref reader, writer, config);
  61. writer.WriteEndObject();
  62. }
  63. writer.WriteEndArray();
  64. }
  65. public JT808_0x8103_0x0076 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  66. {
  67. JT808_0x8103_0x0076 jT808_0X8103_0X0076 = new JT808_0x8103_0x0076();
  68. jT808_0X8103_0X0076.ParamId = reader.ReadUInt32();
  69. jT808_0X8103_0X0076.ParamLength = reader.ReadByte();
  70. jT808_0X8103_0X0076.AVChannelTotal = reader.ReadByte();
  71. jT808_0X8103_0X0076.AudioChannelTotal = reader.ReadByte();
  72. jT808_0X8103_0X0076.VudioChannelTotal = reader.ReadByte();
  73. var channelTotal = jT808_0X8103_0X0076.AVChannelTotal + jT808_0X8103_0X0076.AudioChannelTotal + jT808_0X8103_0X0076.VudioChannelTotal;//通道总数
  74. if (channelTotal > 0)
  75. {
  76. jT808_0X8103_0X0076.AVChannelRefTables = new List<JT808_0x8103_0x0076_AVChannelRefTable>();
  77. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  78. for (int i = 0; i < channelTotal; i++)
  79. {
  80. jT808_0X8103_0X0076.AVChannelRefTables.Add(formatter.Deserialize(ref reader, config));
  81. }
  82. }
  83. return jT808_0X8103_0X0076;
  84. }
  85. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0076 value, IJT808Config config)
  86. {
  87. writer.WriteUInt32(value.ParamId);
  88. writer.Skip(1, out int position);
  89. writer.WriteByte(value.AVChannelTotal);
  90. writer.WriteByte(value.AudioChannelTotal);
  91. writer.WriteByte(value.VudioChannelTotal);
  92. if (value.AVChannelRefTables.Any())
  93. {
  94. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  95. foreach (var AVChannelRefTable in value.AVChannelRefTables)
  96. {
  97. formatter.Serialize(ref writer, AVChannelRefTable, config);
  98. }
  99. }
  100. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position - 1), position);
  101. }
  102. }
  103. }