package com.dy.common.mw.protocol.p206V1_0_0; 
 | 
  
 | 
import com.dy.common.mw.protocol.*; 
 | 
import com.dy.common.util.DateTime; 
 | 
  
 | 
import java.net.URI; 
 | 
import java.net.URL; 
 | 
  
 | 
@AnnotationDriver(name= ProtocolConstantV206V1_0_0.protocolName) 
 | 
public class DriverV1_0_1 extends Driver { 
 | 
     
 | 
    private static String scanRootPackage = "" ; 
 | 
     
 | 
    //在Driver中是单例,随Driver的单例对象在单线程中运行 
 | 
    private ParseParamsForUpV1_0_1 upCpParams ; 
 | 
    private ParseParamsForDownV1_0_1 downCpParams ; 
 | 
     
 | 
    private Boolean reportOrResponse_trueOrFalse = null ; 
 | 
    private String rtuAddrInData = null ; 
 | 
  
 | 
    public DriverV1_0_1(){ 
 | 
        upCpParams = new ParseParamsForUpV1_0_1() ; 
 | 
        downCpParams = new ParseParamsForDownV1_0_1() ; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 扫描识别功能码注解类 
 | 
     */ 
 | 
    @Override 
 | 
    public void scanAnnotationCode() throws Exception{ 
 | 
        if(!scanRootPackage.endsWith(".")){ 
 | 
            scanRootPackage += "." ; 
 | 
        } 
 | 
        URL url = this.getClass().getResource("/" + scanRootPackage.replace('.', '/')); 
 | 
        URI uri = new URI(url.toString());   
 | 
        super.doScanAnnotationCode(this, ProtocolConstantV206V1_0_0.protocolName, uri, scanRootPackage) ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析上行数据 
 | 
     * @param isLowPower 是否在低功耗环境下运行 
 | 
     * @param rtuAddr 
 | 
     * @param upBuffer 
 | 
     * @param callback 
 | 
     * @param upHex 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] parseData(Boolean isLowPower, String rtuAddr, byte[] upBuffer, String upHex, DriverParserDataCallback callback, Object... params) { 
 | 
        reportOrResponse_trueOrFalse = null ; 
 | 
        boolean isFail = false ; 
 | 
        String upCode = null ; 
 | 
        try{ 
 | 
            CommonV1_0_1 cp = new CommonV1_0_1() ; 
 | 
            cp.checkHead(upBuffer) ; 
 | 
            cp.checkTail(upBuffer) ; 
 | 
            String crcStr = cp.checkCrc_str(upBuffer) ; 
 | 
            if(crcStr != null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr, "严重错误,上行数据CRC检查失败," + crcStr, null))} ; 
 | 
            } 
 | 
            rtuAddr = cp.parseRtuAddr(upBuffer) ; 
 | 
            upCode = cp.parseCode(upBuffer) ; 
 | 
            if(upCode == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr, "严重错误,未能从上行数据中解析出功能码!", null))} ; 
 | 
            } 
 | 
            //Integer dataLen = cp.parseFrameLen(upBuffer) ; 
 | 
            Data upData = new Data() ; 
 | 
            upData.setRtuAddr(rtuAddr) ; 
 | 
            upData.setProtocol(ProtocolConstantV206V1_0_0.protocolName); 
 | 
            upData.setCode(upCode) ; 
 | 
            upData.setHex(upHex) ; 
 | 
             
 | 
             
 | 
            DataV1_0_1 dV1_0_1 = new DataV1_0_1() ; 
 | 
            //dV1_0_1.version = cp.parseVersion(upBuffer) ; 
 | 
            dV1_0_1.rtuAddr = rtuAddr ; 
 | 
            dV1_0_1.dt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
             
 | 
            upData.setSubData(dV1_0_1) ; 
 | 
             
 | 
            this.upCpParams.clear(); 
 | 
            this.upCpParams.setValue(ProtocolConstantV206V1_0_0.protocolName,  
 | 
                    rtuAddr,  
 | 
                    upCode, 
 | 
                    upHex,  
 | 
                    upBuffer,  
 | 
                    upData); 
 | 
            CodeParse codeParse = this.getUpCodeParser(upCode) ; 
 | 
            if(codeParse == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr, "严重错误,未能得到上行数据功能码" + upCode + "处理类!", null))} ; 
 | 
            }else{ 
 | 
                return codeParse.parse(isLowPower, this.upCpParams, new CodeParseCallback(){ 
 | 
                    @Override 
 | 
                    public void callback(Boolean flag) { 
 | 
                        reportOrResponse_trueOrFalse = flag ; 
 | 
                        rtuAddrInData = dV1_0_1.getRtuAddr() ; 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
                 
 | 
        } catch (Exception e) { 
 | 
            isFail = true ; 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr, "严重错误,分析Rtu数据出错!数据为:" + upHex + (e.getMessage() == null?"":(",出错信息:" + e.getMessage())), e))} ; 
 | 
        } finally{ 
 | 
            callback.callback(rtuAddr, upCode, upHex, reportOrResponse_trueOrFalse, isFail, rtuAddrInData); 
 | 
        } 
 | 
    } 
 | 
    /** 
 | 
     * 构造下行数据(命令) 
 | 
     * @param isLowPower 是否在低功耗环境下运行 
 | 
     * @param command 命令 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] createCommand(Boolean isLowPower, Command command, Object... params) { 
 | 
        String rtuAddr = command.getRtuAddr() ; 
 | 
        if(rtuAddr == null){ 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; 
 | 
        } 
 | 
        try { 
 | 
            String commandCode = command.getCode() ; 
 | 
             
 | 
            this.downCpParams.clear(); 
 | 
            this.downCpParams.setValue( 
 | 
                    ProtocolConstantV206V1_0_0.protocolName,  
 | 
                    rtuAddr,  
 | 
                    command.getId(), 
 | 
                    commandCode,  
 | 
                    command.getParam(),  
 | 
                    command.getAttachment()); 
 | 
             
 | 
            if(commandCode == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; 
 | 
            }else{ 
 | 
                CodeParse codeParse = this.getDownCodeParser(commandCode) ; 
 | 
                if(codeParse == null){ 
 | 
                    return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr,  "严重错误,未能得到下行数据功能码" + commandCode + "处理类!", null))} ; 
 | 
                }else{ 
 | 
                    return codeParse.parse(isLowPower, this.downCpParams, null); 
 | 
                } 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1_0_0.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |