package com.dy.rtuMw.server.upgrade; 
 | 
  
 | 
import com.alibaba.fastjson2.annotation.JSONField; 
 | 
import com.dy.common.mw.protocol.Command; 
 | 
import com.dy.common.mw.protocol.CommandType; 
 | 
import com.dy.common.mw.protocol.MidResult; 
 | 
import com.dy.common.mw.protocol.MidResultFromRtu; 
 | 
import com.dy.common.mw.protocol.p206V1.upVos.DataCd960XVo; 
 | 
import com.dy.common.softUpgrade.Com1601Vo; 
 | 
import com.dy.common.softUpgrade.state.UpgradeRtu; 
 | 
import com.dy.common.softUpgrade.state.UpgradeTaskVo; 
 | 
import com.dy.common.util.Callback; 
 | 
import com.dy.common.util.DateTime; 
 | 
import lombok.Data; 
 | 
import lombok.EqualsAndHashCode; 
 | 
  
 | 
/** 
 | 
 * @Author: liurunyu 
 | 
 * @Date: 2024/11/4 15:00 
 | 
 * @Description 
 | 
 */ 
 | 
@Data 
 | 
@EqualsAndHashCode(callSuper=false) 
 | 
public class UpgradeRtuDev extends UpgradeRtu { 
 | 
  
 | 
    @JSONField(serialize = false) 
 | 
    private Integer failTryTimes ;//升级失败后,重新偿试升级次数,0表示不重新偿试升级 
 | 
  
 | 
    @JSONField(serialize = false) 
 | 
    public UpgradeTaskVo taskVo ;//升级任务值对象 
 | 
  
 | 
    private UpgradeRtuDev(){ 
 | 
    } 
 | 
  
 | 
    public UpgradeRtuDev(UpgradeTaskVo taskVo, Integer failTryTimes , String rtuAddr, int totalPackage) { 
 | 
        super(); 
 | 
        this.taskVo = taskVo ; 
 | 
        this.failTryTimes = failTryTimes ; 
 | 
        this.rtuAddr = rtuAddr ; 
 | 
        this.state = STATE_UNSTART ; 
 | 
        this.totalPackage = totalPackage ; 
 | 
        this.currentPackage = 0 ; 
 | 
        this.currentRamAddr = 0 ; 
 | 
        this.lastDownDt = "" ; 
 | 
        this.lastDownDtAt = 0L ; 
 | 
        this.reTryTimes = 0 ; 
 | 
        this.isOver = false ; 
 | 
    } 
 | 
  
 | 
    public UpgradeRtuDev(UpgradeTaskVo taskVo, Integer failTryTimes, String rtuAddr, int totalPackage, int state) { 
 | 
        super(); 
 | 
        this.taskVo = taskVo ; 
 | 
        this.failTryTimes = failTryTimes ; 
 | 
        this.rtuAddr = rtuAddr ; 
 | 
        this.state = state ; 
 | 
        this.totalPackage = totalPackage ; 
 | 
        this.currentPackage = 0 ; 
 | 
        this.currentRamAddr = 0 ; 
 | 
        this.lastDownDt = "" ; 
 | 
        this.lastDownDtAt = 0L ; 
 | 
        this.reTryTimes = 0 ; 
 | 
        this.isOver = false ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 触发升级 
 | 
     * @param code 
 | 
     * @param softData 
 | 
     * @param callbackCom 
 | 
     * @param objects 
 | 
     */ 
 | 
    @Override 
 | 
    public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callbackCom, Object ...objects){ 
 | 
        if(!this.isOver){ 
 | 
            //升级未完成 
 | 
            if(this.state == STATE_OFFLINE || this.state == STATE_UNSTART){ 
 | 
                //当前未开始升级过程,下发升级配置指令 
 | 
                this.setStateAtSendCom1601Time(); 
 | 
                callbackCom.call(createCommand1601(protocolName, protocolVersion)); 
 | 
            }else if(this.state == STATE_RUNNING){ 
 | 
                //当前升级过程中 
 | 
                if(code.equals(UpgradeCode.cd_9601)){ 
 | 
                    //下发配置返回 
 | 
                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
                    this.lastDownDtAt = System.currentTimeMillis() ; 
 | 
                    callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));//下发数据包指令 
 | 
                }else if(code.equals(UpgradeCode.cd_9602)){ 
 | 
                    //下发数据包返回 
 | 
                    currentPackage++ ; 
 | 
                    currentRamAddr += RAMADDRADD ; 
 | 
                    if(currentPackage < totalPackage){ 
 | 
                        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
                        this.lastDownDtAt = System.currentTimeMillis() ; 
 | 
                        callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData)); 
 | 
                    }else{ 
 | 
                        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
                        this.lastDownDtAt = System.currentTimeMillis() ; 
 | 
                        callbackCom.call(createCommand1603(protocolName, protocolVersion));//下发校验指令 
 | 
                    } 
 | 
                }else if(code.equals(UpgradeCode.cd_9603)){ 
 | 
                    //下发校验返回 
 | 
                    this.setStateAtReceiveRes9603Time(objects) ; 
 | 
                    callbackCom.call(createCommand1600(protocolName, protocolVersion));//下发复位指令,此指令无应答 
 | 
                }else{ 
 | 
                    //当前是升级中状态,并且升级未完成,收到了非960X系列功能码,则升级失败 
 | 
                    if(currentPackage == 0 || currentPackage == 1){ 
 | 
                        //1包死,升级失败 
 | 
                        this.state = STATE_FAILONE ; 
 | 
                    }else{ 
 | 
                        //非1包死,升级失败 
 | 
                        this.state = STATE_FAIL ; 
 | 
                    } 
 | 
                } 
 | 
            }else if(this.state == STATE_FAILONE || this.state == STATE_FAIL){ 
 | 
                //上次设置了失败状态,并且升级未完成,收到了非960X系列功能码,则升级失败 
 | 
                if(this.reTryTimes < this.failTryTimes){ 
 | 
                    //重试次数未达到上限,继续重试 
 | 
                    this.reTryTimes += 1 ; 
 | 
                    this.setStateAtSendCom1601Time(); 
 | 
                    callbackCom.call(createCommand1601(protocolName, protocolVersion));//下发配置指令 
 | 
                }else{ 
 | 
                    //升级失败,并且重试次数达到上限,强制设置升级完成 
 | 
                    this.isOver = true ; 
 | 
                } 
 | 
            }else if(this.state == STATE_SUCCESS){ 
 | 
                //升级成功态,不会出现此情况,因为设置为成功态时,升级结束属性isOver设置为true了 
 | 
                //为安全见,这里再设置为结束态 
 | 
                this.isOver = true ; 
 | 
            }else if(this.state == STATE_FAILOFFLINE){ 
 | 
                //已经被其他逻辑模块强制设置成离线失败态了,不会出现此情况,因为设置为离线失败态时,升级结束属性isOver设置为true了 
 | 
                //这里不再有作为 
 | 
                //为安全见,这里再设置为结束态 
 | 
                this.isOver = true ; 
 | 
            }else{ 
 | 
                //其他状态(没有其他态了,除非再设计开发时增加了状态) 
 | 
                //为安全见,这里再设置为结束态 
 | 
                this.isOver = true ; 
 | 
            } 
 | 
        }else{ 
 | 
            //升级完成,无业务逻辑 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置发送配置命令时刻的状态 
 | 
     */ 
 | 
    private void setStateAtSendCom1601Time(){ 
 | 
        this.state = STATE_RUNNING;//升级进行中 
 | 
        this.currentPackage = 0 ; 
 | 
        this.currentRamAddr = 0 ; 
 | 
        this.isOver = false ; 
 | 
        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
        this.lastDownDtAt = System.currentTimeMillis() ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置1603指令返回时刻的状态 
 | 
     */ 
 | 
    private void setStateAtReceiveRes9603Time(Object ...objects){ 
 | 
        this.isOver = true ;//升级完成 
 | 
        this.state = STATE_SUCCESS ; 
 | 
        if(objects != null && objects.length > 0){ 
 | 
            if(objects[0] instanceof com.dy.common.mw.protocol.p206V1.upVos.DataCd960XVo){ 
 | 
                com.dy.common.mw.protocol.p206V1.upVos.DataCd960XVo vo = (com.dy.common.mw.protocol.p206V1.upVos.DataCd960XVo)objects[0] ; 
 | 
                if(vo != null && !vo.success){ 
 | 
                    this.state = STATE_FAILRTU ; 
 | 
                } 
 | 
            } else if(objects[0] instanceof com.dy.common.mw.protocol.p206V2.upVos.DataCd960XVo){ 
 | 
                com.dy.common.mw.protocol.p206V2.upVos.DataCd960XVo vo = (com.dy.common.mw.protocol.p206V2.upVos.DataCd960XVo)objects[0] ; 
 | 
                if(vo != null && !vo.success){ 
 | 
                    this.state = STATE_FAILRTU ; 
 | 
                } 
 | 
            } else if(objects[0] instanceof com.dy.common.mw.protocol.p206V202404.upVos.DataCd960XVo){ 
 | 
                com.dy.common.mw.protocol.p206V202404.upVos.DataCd960XVo vo = (com.dy.common.mw.protocol.p206V202404.upVos.DataCd960XVo)objects[0] ; 
 | 
                if(vo != null && !vo.success){ 
 | 
                    this.state = STATE_FAILRTU ; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
        this.lastDownDtAt = System.currentTimeMillis() ; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Command createCommand1601(String protocolName, Short protocolVersion){ 
 | 
        Command com = new Command() ; 
 | 
        com.id = Command.defaultId ; 
 | 
        com.type = CommandType.outerCommand ; 
 | 
        com.rtuAddr = this.rtuAddr ; 
 | 
        com.code = UpgradeCode.cd_1601 ; 
 | 
        com.protocol = protocolName ; 
 | 
        com.protocolVersion = protocolVersion ; 
 | 
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; 
 | 
  
 | 
        Com1601Vo vo = new Com1601Vo() ; 
 | 
        vo.softStoreAddr = this.taskVo.softStoreAddr ; 
 | 
        vo.softStartAddr = this.taskVo.softStartAddr ; 
 | 
        vo.totalByte =  this.taskVo.softBytesCalculate ; 
 | 
        vo.softCrc = this.taskVo.softByteSrc16; 
 | 
        com.param = vo ; 
 | 
        return com ; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Command createCommand1602(String protocolName, Short protocolVersion, int currentPackage, Integer ramAddr, byte[][] softData){ 
 | 
        Command com = new Command() ; 
 | 
        com.id = Command.defaultId ; 
 | 
        com.type = CommandType.outerCommand ; 
 | 
        com.rtuAddr = this.rtuAddr ; 
 | 
        com.code = UpgradeCode.cd_1602 ; 
 | 
        com.protocol = protocolName ; 
 | 
        com.protocolVersion = protocolVersion ; 
 | 
  
 | 
        com.param = ramAddr ; 
 | 
  
 | 
        if(currentPackage < softData.length){ 
 | 
            com.attachment = softData[currentPackage] ; 
 | 
        } 
 | 
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; 
 | 
        return com ; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Command createCommand1603(String protocolName, Short protocolVersion){ 
 | 
        Command com = new Command() ; 
 | 
        com.id = Command.defaultId ; 
 | 
        com.type = CommandType.outerCommand ; 
 | 
        com.rtuAddr = this.rtuAddr ; 
 | 
        com.code = UpgradeCode.cd_1603 ; 
 | 
        com.protocol = protocolName ; 
 | 
        com.protocolVersion = protocolVersion ; 
 | 
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; 
 | 
        return com ; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Command createCommand1600(String protocolName, Short protocolVersion){ 
 | 
        Command com = new Command() ; 
 | 
        com.id = Command.defaultId ; 
 | 
        com.type = CommandType.outerCommand ; 
 | 
        com.rtuAddr = this.rtuAddr ; 
 | 
        com.code = UpgradeCode.cd_1600 ; 
 | 
        com.protocol = protocolName ; 
 | 
        com.protocolVersion = protocolVersion ; 
 | 
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; 
 | 
        return com ; 
 | 
    } 
 | 
} 
 |