package com.dy.common.mw.protocol.p206V202404.parse; 
 | 
  
 | 
  
 | 
import com.dy.common.mw.protocol.*; 
 | 
import com.dy.common.mw.protocol.p206V202404.*; 
 | 
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd5CVo; 
 | 
import com.dy.common.util.ByteUtil; 
 | 
import org.apache.logging.log4j.LogManager; 
 | 
import org.apache.logging.log4j.Logger; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
  
 | 
@AnnotationCodeUp(ifAny={ 
 | 
        CodeV202404.cd_5C 
 | 
}) 
 | 
@SuppressWarnings("unused") 
 | 
public class Cd_5C_Up implements CodeParse{ 
 | 
  
 | 
    private static final Logger log = LogManager.getLogger(Cd_5C_Up.class); 
 | 
  
 | 
    /** 
 | 
     * 分析上行数据 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception { 
 | 
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ; 
 | 
        int bsLen = new CommonV202404().parseDataLen4P202404(para.upBuffer) ; 
 | 
        if(bsLen > 0){ 
 | 
            this.doParse(para.upBuffer, 
 | 
                    bsLen, 
 | 
                    para.upCode, 
 | 
                    para.data) ; 
 | 
        } 
 | 
        log.info("\n分析命令应答数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString()); 
 | 
  
 | 
        MidResultFromRtu midRs = new MidResultFromRtu() ; 
 | 
        midRs.protocolName = para.protocolName ;//协议名称 
 | 
        midRs.protocolVersion = para.protocolVersion ;//协议版本号 
 | 
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址 
 | 
        midRs.upCode = para.upCode ;//上行数据中的功能码 
 | 
        midRs.upHex = para.upHex ;//上行数据十六进制形式 
 | 
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组 
 | 
        midRs.data = para.data ;//解析后的数据 
 | 
  
 | 
        midRs.reportOrResponse_trueOrFalse = false ; 
 | 
  
 | 
        callback.callback(midRs.reportOrResponse_trueOrFalse, para.data.subData==null?null:((DataV202404)(para.data.subData)).subData); 
 | 
        return new MidResult[]{midRs} ; 
 | 
    } 
 | 
    /** 
 | 
     * 执行分析 
 | 
     * @param bs 字节数组 
 | 
     * @param bsLen 字节长度(总包长,包括包头和包尾) 
 | 
     * @param dataCode 功能码 
 | 
     * @param data 数据 
 | 
     * @throws Exception 异常 
 | 
     */ 
 | 
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception { 
 | 
        DataV202404 dV1 = (DataV202404)data.getSubData() ; 
 | 
  
 | 
        int index = ProtocolConstantV206V202404.dataIndex ; 
 | 
        String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ; 
 | 
  
 | 
        index++ ; 
 | 
        Integer projectNo = (int)bs[index]; 
 | 
  
 | 
        index++ ; 
 | 
        byte hasRecord = bs[index]; 
 | 
        if(hasRecord == 1){ 
 | 
            //有记录 
 | 
            List<DataCd5CVo> list = new ArrayList<>() ; 
 | 
            index++ ; 
 | 
            DataCd5CVo vo = this.doParseData(bs, index, bsLen, dataCode, controllerType, projectNo) ; 
 | 
            while(vo != null){ 
 | 
                index += 16 ; 
 | 
                list.add(vo) ; 
 | 
                vo = this.doParseData(bs, index, bsLen, dataCode, controllerType, projectNo) ; 
 | 
            } 
 | 
            dV1.subData = list ; 
 | 
        }else{ 
 | 
            //无记录 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private DataCd5CVo doParseData(byte[] bs, int index, int bsLen, String dataCode, String controllerType,Integer projectNo) throws Exception{ 
 | 
        //每条数据占16字节 
 | 
        if(bsLen - index > 16){ 
 | 
            DataCd5CVo cdData = new DataCd5CVo(CodeV202404.getCodeName(dataCode)) ; 
 | 
  
 | 
            cdData.controllerType = controllerType ; 
 | 
            cdData.projectNo = projectNo ; 
 | 
  
 | 
            String HH = ByteUtil.BCD2String_BE(bs, index, index) ; 
 | 
            index++ ; 
 | 
            String dd = ByteUtil.BCD2String_BE(bs, index, index) ; 
 | 
            index++ ; 
 | 
            String MM = ByteUtil.BCD2String_BE(bs, index, index) ; 
 | 
            index++ ; 
 | 
            String yy = ByteUtil.BCD2String_BE(bs, index, index) ; 
 | 
            cdData.dt = "20" + yy + "-" + MM + "-" + dd + " " + HH  ; 
 | 
  
 | 
            Long meterAmountDay = ByteUtil.BCD2Long_LE(bs, index, index + 3) ; 
 | 
            cdData.meterAmountDay = meterAmountDay/100.0D; 
 | 
  
 | 
            index += 4 ; 
 | 
            Long farmerAmountDay = ByteUtil.BCD2Long_LE(bs, index, index + 3) ; 
 | 
            cdData.farmerAmountDay = farmerAmountDay/100.0D; 
 | 
  
 | 
            index += 4 ; 
 | 
            Long lossAmountDay = ByteUtil.BCD2Long_LE(bs, index, index + 3) ; 
 | 
            cdData.lossAmountDay = lossAmountDay/100.0D; 
 | 
  
 | 
            return cdData ; 
 | 
        }else{ 
 | 
            return null ; 
 | 
        } 
 | 
    } 
 | 
} 
 |