From c684d774f8412c351c832ae0b9a9af95da8973a1 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 10 Oct 2024 14:45:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=94=99=E8=AF=AF=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.db | Bin 225280 -> 225280 bytes .../a8k/hardware/type/a8kcanprotocol/A8kEcode.java | 50 ++++++++++----------- .../app/appctrl/ConsumablesScanService.java | 4 +- .../service/app/appctrl/DeviceInitCtrlService.java | 2 +- .../service/app/appctrl/TubeSettingMgrService.java | 4 +- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 12 ++--- .../mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java | 2 +- .../service/app/appdata/AppProjInfoMgrService.java | 4 +- .../EmergencySamplePosStateMgrService.java | 6 +-- .../commonctrl/HardwareCommonCtrl.java | 8 ++-- .../app/devicedriver/ctrl/ConsumablesScanCtrl.java | 2 +- .../app/devicedriver/ctrl/HbotControlService.java | 6 +-- .../devicedriver/ctrl/SampleScanTransportCtrl.java | 6 +-- .../devicedriver/ctrl/SamplesPreProcesCtrl.java | 8 ++-- .../a8k/service/debug/AppDebugHelperService.java | 4 +- .../java/a8k/type/ecode/ConsumeNotEnoughError.java | 2 +- .../java/a8k/utils/ReactionPlate2DCodeHelper.java | 4 +- 17 files changed, 62 insertions(+), 62 deletions(-) diff --git a/app.db b/app.db index 1dfeed2f513f491d7eb79077614460fd16ae6de9..55edcd18f44e3ef27a4e921f1641f5ec8a197874 100644 GIT binary patch delta 96 zcmZp8z}xVEcY?H_DFXw8IS`uxF&_g1{#*C(o39Si?TN9X4gBYu}9}8mAWM-_` y{vnj1-e-+K-&d6BVZWPP3-6)p%oDcx scanConsumables() throws AppException { if (!gstate.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DeviceNotInited); + throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); } List scanResult = new java.util.ArrayList<>(); //执行扫描耗材动作 @@ -227,7 +227,7 @@ public class ConsumablesScanService { public Map scanOneGroupConsumables(ConsumableGroup group) throws AppException { if (!gstate.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DeviceNotInited); + throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); } Integer chNum = group.off; diff --git a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java index ce91e27..de0e1b5 100644 --- a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java @@ -77,7 +77,7 @@ public class DeviceInitCtrlService { public void deviceMoveToZero() throws AppException { Boolean suc = checkBeforeInitDevicePass(); if (!suc) { - throw new AppException(A8kEcode.APPE_CheckPoint_checkFail); + throw new AppException(A8kEcode.APPE_CHECK_POINT_CHECK_FAIL); } //进出料初始化 diff --git a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java b/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java index 5bfe150..22cc177 100644 --- a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java @@ -55,10 +55,10 @@ public class TubeSettingMgrService { TubeHolderSetting getTubeHolderSettingAndCheckIsEditable(String uuid) throws AppException { TubeHolderSetting setting = getTubeHolderSetting(uuid); if (setting == null) { - throw new AppException(A8kEcode.APPE_TubeHolderSettingNotFound); + throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_NOT_FOUND); } if (setting.lock) { - throw new AppException(A8kEcode.APPE_TubeHolderSettingIsLocked); + throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_IS_LOCKED); } return setting; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 81bece3..80ec151 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -91,13 +91,13 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { if (!enterSuc) { logger.warn("进料超时,从入料口,弹出试管架"); stc.ejectTubeHolderInEnterPos(); - throw new AppException(A8kEcode.APPE_InfeedOvertimeFail); + throw new AppException(A8kEcode.APPE_INFEED_OVERTIME_FAIL); } //扫描试管架类型 String tubeType = stc.moveTubeRackToScanPosAndScan(); if (tubeType.isEmpty()) { logger.warn("扫描试管架类型失败,弹出试管架"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_ScanTubeholderTypeTimeout)); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT)); return null; } logger.info("扫描试管架类型成功,{}", tubeType); @@ -120,7 +120,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { //处理扫描结果 if (!hasTube) { logger.error("试管架中没有试管"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TubeHolderTypeIsNotSupport)); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); return null; } result.tubeHolderType = tubeType; @@ -154,8 +154,8 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { tube.projInfo = appProjInfoMgr.getProjBrifInfo(setting.tubeSettings[i].projIndex); if (tube.projInfo == null) { logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_ProjInfoIsNotExist)); - return A8kEcode.APPE_ProjInfoIsNotExist; + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_PROJ_INFO_IS_NOT_EXIST)); + return A8kEcode.APPE_PROJ_INFO_IS_NOT_EXIST; } } @@ -183,7 +183,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); if (tubeHolderType == null) { logger.error("不支持的试管架类型"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TubeHolderTypeIsNotSupport)); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); return null; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java index 5f232d2..dd0b415 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java @@ -85,7 +85,7 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { tipNum += flow.tipUseNum; } if (!consumablesMgrService.isHasEnoughTips(tipNum)) { - throw ebuilder.buildAppException(A8kEcode.APPE_TipNotEnough); + throw ebuilder.buildAppException(A8kEcode.APPE_TIP_NOT_ENOUGH); } logger.info("check tips ok"); diff --git a/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java b/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java index 417bb40..394a6a1 100644 --- a/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java +++ b/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java @@ -114,7 +114,7 @@ public class AppProjInfoMgrService { //校验解析结果 //TODO: 检查解析结果,如果解析结果存在异常,则抛出错误事件给前端 if (mountedIdCardInfo.lotId.isEmpty()) { - eventBus.pushEvent(new A8kErrorPromptEvent(A8kEcode.APPE_A8kIdCardLotIdIsEmpty)); + eventBus.pushEvent(new A8kErrorPromptEvent(A8kEcode.APPE_A8K_ID_CARD_LOT_ID_IS_EMPTY)); return; } @@ -131,7 +131,7 @@ public class AppProjInfoMgrService { @ExtApiFn(name = "读取当前挂载的ID卡信息", order = ORDER.readIDCardInfo) public A8kIdCardInfo readMountedIDCardInfo() throws AppException { if (mountedIdCardInfo == null) { - throw new AppException(A8kEcode.APPE_A8kIdCardNotMounted); + throw new AppException(A8kEcode.APPE_A8K_ID_CARD_NOT_MOUNTED); } return mountedIdCardInfo; } diff --git a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java index 81c07e9..51038c8 100644 --- a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java @@ -61,12 +61,12 @@ public class EmergencySamplePosStateMgrService { } if (projIndex.isEmpty()) { - throw new AppException(A8kEcode.APPE_ProjIndexIsEmpty); + throw new AppException(A8kEcode.APPE_PROJ_INDEX_IS_EMPTY); } projInfo = appProjInfoMgrService.getProjBrifInfo(projIndex); if (projInfo == null || projInfo.size() != projIndex.size()) { - throw new AppException(A8kEcode.APPE_CanNotFindProjInfo); + throw new AppException(A8kEcode.APPE_CAN_NOT_FIND_PROJ_INFO); } if (tube.state.equals(TubeState.EMPTY) || tube.state.equals(TubeState.PROCESS_COMPLETE) || tube.state.equals(TubeState.ERROR)) { @@ -87,7 +87,7 @@ public class EmergencySamplePosStateMgrService { tubeStateMgrService.updateTubeContext(tube); logger.info("更新紧急样本设置成功 {}", ZJsonHelper.objectToJson(tube)); } else { - throw new AppException(A8kEcode.APPE_EmergencySampleIsProcessing); + throw new AppException(A8kEcode.APPE_EMERGENCY_SAMPLE_IS_PROCESSING); } } diff --git a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java index a5a1c0f..5b28d16 100644 --- a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java @@ -49,12 +49,12 @@ public class HardwareCommonCtrl { //试管平移通道是否有障碍 if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) { logger.warn("THChInterPPS or THChOuterPPS is trigger"); - throw new AppException(A8kEcode.APPE_TubeXChannelIsNotEmpty); + throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); } //板夹仓盖子是否盖上 if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PlateBoxNotCover); + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); } //板夹仓卡板检测 @@ -73,7 +73,7 @@ public class HardwareCommonCtrl { } //板夹仓光电 if (canBus.getIOState(IOId.RecycleBinOverflowPPS)) { - throw new AppException(A8kEcode.APPE_RecycleBinOverflow); + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); } } @@ -353,7 +353,7 @@ public class HardwareCommonCtrl { public void checkBeforeMove(MId mId) throws AppException { //板夹仓盖子是否盖上 if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PlateBoxNotCover); + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); } } diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java index ebad875..973aff8 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java @@ -64,7 +64,7 @@ public class ConsumablesScanCtrl { @ExtApiFn(name = "扫描耗材") public ConsumableScanRawResult doScanConsumablesAction() throws AppException { if (!stateMgrService.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DeviceNotInited); + throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); } ConsumableScanRawResult result = new ConsumableScanRawResult(); for (int i = 0; i < 6; i++) { diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java b/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java index 7617dce..54d155c 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java @@ -49,7 +49,7 @@ public class HbotControlService { // 检查盖板是否关闭 if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PlateBoxNotCover); + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); } boolean zEnable = true; @@ -67,7 +67,7 @@ public class HbotControlService { pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); } if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { - throw new AppException(A8kEcode.CODEERROR_ZMNotAtZPosWhenHbotTryMove); + throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); } // HBot移动 @@ -130,7 +130,7 @@ public class HbotControlService { private void modGroupMoveToZero() throws AppException { if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PlateBoxNotCover); + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); } pipetteCtrlModule.zMotorEnable(1); diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/SampleScanTransportCtrl.java b/src/main/java/a8k/service/app/devicedriver/ctrl/SampleScanTransportCtrl.java index 811ed80..8ed29fe 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/SampleScanTransportCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/SampleScanTransportCtrl.java @@ -91,7 +91,7 @@ public class SampleScanTransportCtrl { @ExtApiFn(name = "移动到坐标", group = "基础方法", order = ORDER.moveTubeRackTo) public void moveTubeRackTo(Integer pos, TargetPosMeasureDirection moveDiretion, Boolean moveToZero) throws AppException { if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { - throw new AppException(A8kEcode.CODEERROR_ShakeModGripperZMNotInZeroPos); + throw new AppException(A8kEcode.CODEERROR_SHAKE_MOD_GRIPPER_ZMOTOR_NOT_IN_ZERO_POS); } //打开扫码夹具 scanClampModRelease(); @@ -172,7 +172,7 @@ public class SampleScanTransportCtrl { @ExtApiFn(name = "入料", group = "单步", order = ORDER.moveTubeRackToExitPos) public Boolean enterTubeHolder() throws AppException { if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_TubeXChannelIsNotEmpty); + throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); } moveTubeRackMoveToEnterPos(); try { @@ -217,7 +217,7 @@ public class SampleScanTransportCtrl { OS.hsleep(1000); canBus.stepMotorStop(MId.FeedingModOutfeedM); if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_EjectTubeholderTimeout); + throw new AppException(A8kEcode.APPE_EJECT_TUBEHOLDER_TIMEOUT); } } finally { canBus.moduleStop(MId.FeedingModOutfeedM); diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesCtrl.java b/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesCtrl.java index c1fb83e..13bcc39 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesCtrl.java @@ -120,22 +120,22 @@ public class SamplesPreProcesCtrl { //Z轴在原点 if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { - throw new AppException(A8kEcode.CODEERROR_MNotInZeroPos,MId.ShakeModGripperZM); + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS,MId.ShakeModGripperZM); } //Y轴在零点附近 if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperYSV), pp.getGripperZeroYPos(), 30)) { - throw new AppException(A8kEcode.CODEERROR_MNotInZeroPos,MId.ShakeModGripperYSV); + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS,MId.ShakeModGripperYSV); } //夹爪没有零位置 if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { - throw new AppException(A8kEcode.CODEERROR_MNotInZeroPos,MId.ShakeModGripperSV); + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS,MId.ShakeModGripperSV); } //检查摇匀夹紧是否在零位 if (!canBus.stepMotorReadIoState(MId.ShakeModClampingM, 0)) { - throw new AppException(A8kEcode.CODEERROR_MNotInZeroPos,MId.ShakeModClampingM); + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS,MId.ShakeModClampingM); } boolean isHighBlood = highTube; diff --git a/src/main/java/a8k/service/debug/AppDebugHelperService.java b/src/main/java/a8k/service/debug/AppDebugHelperService.java index 376a918..5c74a65 100644 --- a/src/main/java/a8k/service/debug/AppDebugHelperService.java +++ b/src/main/java/a8k/service/debug/AppDebugHelperService.java @@ -228,8 +228,8 @@ public class AppDebugHelperService { @ExtApiFn(name = "发送A8kEcodeContextListPromptEvent", group = "虚拟事件", order = 5) public void buildAndSendA8kEcodeContextListPromptEvent() { List errorContexts = new ArrayList<>(); - errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN, new AppError(A8kEcode.APPE_TubeHolderTypeIsNotSupport))); - errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ5_PROCESS, new AppError(A8kEcode.APPE_NoTubeInHolder))); + errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN, new AppError(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT))); + errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ5_PROCESS, new AppError(A8kEcode.APPE_NO_TUBE_IN_HOLDER))); eventBus.pushEvent(new A8kEcodeContextListPromptEvent(errorContexts)); } diff --git a/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java b/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java index 80f047c..5010720 100644 --- a/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java +++ b/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java @@ -6,7 +6,7 @@ public class ConsumeNotEnoughError extends AppError { public String projName; public ConsumeNotEnoughError(String projName) { - super(A8kEcode.APPE_ConsumeNotEnough); + super(A8kEcode.APPE_CONSUME_NOT_ENOUGH); this.projName = projName; } diff --git a/src/main/java/a8k/utils/ReactionPlate2DCodeHelper.java b/src/main/java/a8k/utils/ReactionPlate2DCodeHelper.java index 6ed8283..f550450 100644 --- a/src/main/java/a8k/utils/ReactionPlate2DCodeHelper.java +++ b/src/main/java/a8k/utils/ReactionPlate2DCodeHelper.java @@ -12,7 +12,7 @@ public class ReactionPlate2DCodeHelper { String[] parts = code.split("\\|\\|"); ReactionPlate2DCode ret = new ReactionPlate2DCode(); if (parts.length != 5) { - throw new AppException(A8kEcode.APPE_A8kPlate2DCodeFormatError); + throw new AppException(A8kEcode.APPE_A8K_PLATE_2D_CODE_FORMAT_ERROR); } ret.projIndex = Integer.parseInt(parts[0]); ret.lotId = parts[1]; @@ -21,7 +21,7 @@ public class ReactionPlate2DCodeHelper { try { ret.expDate = sdf.parse(parts[2]); } catch (ParseException e) { - throw new AppException(A8kEcode.APPE_A8kPlate2DCodeFormatError); + throw new AppException(A8kEcode.APPE_A8K_PLATE_2D_CODE_FORMAT_ERROR); } ret.ID0 = Integer.parseInt(parts[3]); ret.ID1 = Integer.parseInt(parts[4]);