|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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 | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 ; | 
|---|
|  |  |  | } | 
|---|