package com.cisdi.data.emserver.gateway.impl;

import java.util.List;

import com.cisdi.data.common.exception.BusinessException;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.util.CharsetUtil;

/**
 *
* <p>Title: 工业物联网标准plc协议 FrameDecoder.java</p>
* <p>Description: 得到一个完整报文长度</p>
* @author lhp
* @date 2019年6月18日
* @version 1.0
 */
public class EmiaProFrameDecoder extends ByteToMessageDecoder  {

    private static final Byte STARTF_LAG=0x02;
    private static final Byte END_FLAG=0x03;

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf bufferIn, List<Object> out) throws Exception
    {
        boolean getStartFlag=false;
        boolean getEndFlag=false;
        int beginIndex = bufferIn.readerIndex();
        int endIndex=beginIndex;
        for(int i=0;i<bufferIn.readableBytes();i++)
        {
            if(bufferIn.getByte(beginIndex+i)==STARTF_LAG)
            {
                getStartFlag=true;
                beginIndex=beginIndex+i;
                continue;
            }
            if(getStartFlag&&bufferIn.getByte(endIndex+i)==END_FLAG)
            {
                getEndFlag=true;
                endIndex=endIndex+i;
                break;
            }
        }
        if(!getStartFlag||!getEndFlag)
        {
            return;
        }

        //起始位+1,结束位-1，表示排除开始符和结束符
        ByteBuf otherByteBufRef = bufferIn.retainedSlice(beginIndex+1, endIndex-beginIndex);
        bufferIn.readerIndex(endIndex);

        out.add(otherByteBufRef);

        // 处理可能的粘包
        decode(ctx, bufferIn, out);
	}
}
