package org.yzh.protocol.commons.transform.parameter; import io.github.yezhihao.protostar.Schema; import io.github.yezhihao.protostar.annotation.Field; import io.netty.buffer.ByteBuf; import lombok.Data; import lombok.ToString; import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.List; /** * 音视频通道列表设置 * @author yezhihao * https://gitee.com/yezhihao/jt808-server */ @ToString @Data @Accessors(chain = true) public class ParamChannels { public static final Integer key = 0x0076; public static final Schema SCHEMA = new ParamChannelsSchema(); @Field(desc = "音视频通道总数") private byte audioVideoChannels; @Field(desc = "音频通道总数") private byte audioChannels; @Field(desc = "视频通道总数") private byte videoChannels; @Field(desc = "音视频通道对照表") private List channels; @ToString @Data @Accessors(chain = true) private static class ChannelInfo { @Field(desc = "物理通道号(从1开始)") private byte channelId; @Field(desc = "逻辑通道号(按照JT/T 1076-2016 中的表2)") private byte channelNo; @Field(desc = "通道类型:0.音视频 1.音频 2.视频") private byte channelType; @Field(desc = "是否连接云台(类型为0和2时,此字段有效):0.未连接 1.连接") private boolean hasPanTilt; public ChannelInfo() { } public ChannelInfo(byte channelId, byte channelNo, byte channelType, boolean hasPanTilt) { this.channelId = channelId; this.channelNo = channelNo; this.channelType = channelType; this.hasPanTilt = hasPanTilt; } } private static class ParamChannelsSchema implements Schema { private ParamChannelsSchema() { } @Override public ParamChannels readFrom(ByteBuf input) { ParamChannels message = new ParamChannels(); message.audioVideoChannels = input.readByte(); message.audioChannels = input.readByte(); message.videoChannels = input.readByte(); List channels = new ArrayList<>(4); while (input.isReadable()) { byte channelId = input.readByte(); byte channelNo = input.readByte(); byte channelType = input.readByte(); boolean hasPanTilt = input.readBoolean(); channels.add(new ChannelInfo(channelId, channelNo, channelType, hasPanTilt)); } message.setChannels(channels); return message; } @Override public void writeTo(ByteBuf output, ParamChannels message) { output.writeByte(message.audioVideoChannels); output.writeByte(message.audioChannels); output.writeByte(message.videoChannels); List channelInfos = message.getChannels(); for (ChannelInfo channelInfo : channelInfos) { output.writeByte(channelInfo.channelId); output.writeByte(channelInfo.channelNo); output.writeByte(channelInfo.channelType); output.writeBoolean(channelInfo.hasPanTilt); } } } }