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.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 */ @Override public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callbackCom){ 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() ; 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(){ this.isOver = true ;//升级完成 this.state = STATE_SUCCESS ; 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 ; } }