pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtuDev.java
@@ -3,11 +3,16 @@
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
@@ -15,36 +20,44 @@
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper=false)
public class UpgradeRtuDev extends UpgradeRtu {
    @JSONField(serialize = false)
    private UpgradeTask task ;
    private Integer failTryTimes ;//升级失败后,重新偿试升级次数,0表示不重新偿试升级
    @JSONField(serialize = false)
    public UpgradeTaskVo taskVo ;//升级任务值对象
    private UpgradeRtuDev(){
    }
    public UpgradeRtuDev(UpgradeTask task, String rtuAddr, int totalPackage) {
    public UpgradeRtuDev(UpgradeTaskVo taskVo, Integer failTryTimes , String rtuAddr, int totalPackage) {
        super();
        this.task = task ;
        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(UpgradeTask task, String rtuAddr, int totalPackage, int state) {
    public UpgradeRtuDev(UpgradeTaskVo taskVo, Integer failTryTimes, String rtuAddr, int totalPackage, int state) {
        super();
        this.task = task ;
        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 ;
    }
@@ -54,77 +67,118 @@
     * @param code
     * @param softData
     * @param callbackCom
     * @param objects
     */
    @Override
    public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callbackCom){
        if(this.state == STATE_OFFLINE || this.state == STATE_UNSTART){
            //当前未开始升级过程,下发升级配置指令
            this.setStateAtCom1601Time();
            callbackCom.call(createCommand1601(protocolName, protocolVersion));
        }else if(this.state == STATE_RUNNING){
            //当前升级过程中
            if(code.equals(UpgradeCode.cd_1601)){
                //下发配置返回
                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
                callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));//下发数据包指令
            }else if(code.equals(UpgradeCode.cd_1602)){
                //下发数据包返回
                currentPackage++ ;
                currentRamAddr += RAMADDRADD ;
                if(currentPackage < totalPackage){
    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() ;
                    callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));
                }else{
                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
                    callbackCom.call(createCommand1603(protocolName, protocolVersion));//下发校验指令
                }
            }else if(code.equals(UpgradeCode.cd_1603)){
                //下发校验返回
                this.isOver = true ;//升级完成
                this.state = STATE_SUCCESS ;
                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
                callbackCom.call(createCommand1600(protocolName, protocolVersion));//下发复位指令,此指令无应答
            }else{
                if(!this.isOver){
                    //升级未完成
                    if(this.state == STATE_FAILONE || this.state == STATE_FAIL){
                        //已经是升级失败态
                        if(this.reTryTimes < task.failTryTimes){
                            //重试次数未达到上限,继续重试
                            this.reTryTimes += 1 ;
                            this.setStateAtCom1601Time();
                            callbackCom.call(createCommand1601(protocolName, protocolVersion));//下发配置指令
                        }else{
                            this.isOver = true ;//升级完成
                        }
                    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{
                        //非升级功能码,如果在升级过程中收到这个功能码的上行数据,说明升级失败了
                        if(currentPackage == 0 || currentPackage == 1){
                            //1包死,升级失败
                            this.state = STATE_FAILONE ;
                        }else{
                            //非1包死,升级失败
                            this.state = STATE_FAIL ;
                        }
                        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 setStateAtCom1601Time(){
        this.state = STATE_RUNNING;
    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
@@ -139,10 +193,10 @@
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
        Com1601Vo vo = new Com1601Vo() ;
        vo.softStoreAddr = this.task.taskVo.softStoreAddr ;
        vo.softStartAddr = this.task.taskVo.softStartAddr ;
        vo.totalByte =  this.task.taskVo.softBytesCalculate ;
        vo.softCrc = this.task.taskVo.softByteSrc16;
        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 ;
    }