Index: dialin/squish/crc.py =================================================================== diff -u -r4bdb012848d1b59be5edc31d677b77b9d95f6190 -r602f4a2cdb9264e7a0ad1e12f28f39c78b766360 --- dialin/squish/crc.py (.../crc.py) (revision 4bdb012848d1b59be5edc31d677b77b9d95f6190) +++ dialin/squish/crc.py (.../crc.py) (revision 602f4a2cdb9264e7a0ad1e12f28f39c78b766360) @@ -45,6 +45,11 @@ ) def crc8(vData): + """ + generates crc8 for the data vData + :param vData: + :return: + """ crc = 0 l = len(vData) i = 0 @@ -56,6 +61,12 @@ def calcCRC8(vString, vDelimiter='.'): + """ + calculates crc8 for each character in string vString + :param vString: + :param vDelimiter: + :return: + """ str = vString.replace(vDelimiter, '') ba = bytearray.fromhex(str) x = '{:02X}'.format(crc8(ba), 'x') Index: dialin/squish/denaliMessages.py =================================================================== diff -u -rfef5a97d8f0bc350e36ceee6b8ee6619d4f8e8de -r602f4a2cdb9264e7a0ad1e12f28f39c78b766360 --- dialin/squish/denaliMessages.py (.../denaliMessages.py) (revision fef5a97d8f0bc350e36ceee6b8ee6619d4f8e8de) +++ dialin/squish/denaliMessages.py (.../denaliMessages.py) (revision 602f4a2cdb9264e7a0ad1e12f28f39c78b766360) @@ -94,42 +94,81 @@ def send_acknowledge_HD(): + """ + the acknowledge from HD + :return: N/A + """ subprocess.call(['cansend', 'can0', '020#A5.01.00.FF.FF.00.19.00']) def send_acknowledge_UI(): + """ + the acknowledge from UI + :return: N/A + """ subprocess.call(['cansend', 'can0', '100#A5.01.00.FF.FF.00.19.00']) def send_CheckIn_DG(): + """ + check-in (keep alive) message from DG + :return: N/A + """ subprocess.call(['cansend', 'can0', '010#A5.01.00.06.00.00.76.00']) def show_PowerOffDialog(): + """ + the message from HD to UI to show the power off dialog + :return: N/A + """ subprocess.call(['cansend', 'can0', '020#A5.01.00.01.00.01.00.38']) def hide_PowerOffDialog(): + """ + the message from HD to UI to hide the power off dialog + :return: N/A + """ subprocess.call(['cansend', 'can0', '020#A5.01.00.01.00.01.01.09']) def show_PowerOffNotificationDialog(): + """ + the message from HD to UI to shew the shutting down notipication box + :return: N/A + """ subprocess.call(['cansend', 'can0', '040#A5.01.00.0E.00.00.24.00']) def show_PowerOffRejectionDialog(): + """ + the message from HD to UI to show the power off dialog + :return: N/A + """ subprocess.call(['cansend', 'can0', '020#A5.01.00.01.00.01.02.5A']) -################################################################################################## -# After each multi-frame message put a 100ms sleep, time.sleep(0.1) # -# it seems it's needed otherwise the test will check a value which has not been received yet. # -################################################################################################## def waitForMessageToBeSent(): + """ + After each multi-frame message put a 100ms sleep, time.sleep(0.1) # + it seems it's needed otherwise the test will check a value which has not been received yet. # + :return: N/A + """ time.sleep(0.050) # 50ms ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildHDDebugText(vText): + """ + the debug text message from HD builder method + :param vText: the debug text + :return: N/A + """ len = 40 txt = messageBuilder.textToByte(vText, len) # + 1 null term msg = messageBuilder.buildMessage( GuiActionType.HDDebugText, 1 * (len + 1), False, txt) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setHDDebugText (vText): + """ + the debug text message from HD setter/sender method + :param vText: the debug text + :return: N/A + """ frames = buildHDDebugText(vText) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -139,13 +178,23 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGDebugText(vText): + """ + the debug text message from DG builder method + :param vText: the debug text + :return: N/A + """ len = 40 txt = messageBuilder.textToByte(vText, len) # + 1 null term msg = messageBuilder.buildMessage( GuiActionType.DGDebugText, 1 * (len + 1), False, txt) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGDebugText (vText): + """ + the debug text message from DG setter/sender method + :param vText: the debug text + :return: N/A + """ frames = buildDGDebugText(vText) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -155,6 +204,18 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildSetTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(F32) | #4:(F32) | #5:(U32) | #6:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: | + |0x1A00| 0x020 | 6 | 1/60 Hz| Y | HD | UI | Treatment adjustment param ranges Data | \ref Data::mDuration_Min | \ref Data::mDuration_Max | \ref Data::mUltrafiltration_Volume_Min | \ref Data::mUltrafiltration_Volume_Max | \ref Data::mDialysate_Flow_Min | \ref Data::mDialysate_Flow_Max | + :param vMinTreatmentDuration: + :param vMaxTreatmentDuration: + :param vMinUFVolume: + :param vMaxUFVolume: + :param vMinDialysateFlowRate: + :param vMaxDialysateFlowRate: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.TreatmentRanges, 4 * 6, True, utils.toI32(vMinTreatmentDuration), utils.toI32(vMaxTreatmentDuration), @@ -167,6 +228,16 @@ def setTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate): + """ + the Treatment adjustment param ranges data message setter/sender method + :param vMinTreatmentDuration: + :param vMaxTreatmentDuration: + :param vMinUFVolume: + :param vMaxUFVolume: + :param vMinDialysateFlowRate: + :param vMaxDialysateFlowRate: + :return: + """ frames = buildSetTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -175,6 +246,19 @@ def buildSetTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(S32) | #2:(F32) | #3:(F32) | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: |:--: | + |0x0500| 0x040 | 7 | 1 Hz | N | HD | All | Blood Flow Data | \ref Data::mFlowSetPoint | \ref Data::mMeasuredFlow | \ref Data::mRotorSpeed | \ref Data::mMotorSpeed | \ref Data::mMotorCtlSpeed | \ref Data::mMotorCtlCurrent | \ref Data::mPWMDutyCycle | + :param vFlowSetPt: + :param vMeasFlow: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.BloodFlow, 4 * 7, False, utils.toI32(vFlowSetPt ), utils.toF32(vMeasFlow ), @@ -188,6 +272,17 @@ def setTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + the Blood Flow Data message setter/sender method + :param vFlowSetPt: + :param vMeasFlow: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ frames = buildSetTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -196,6 +291,19 @@ def buildSetTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(S32) | #2:(F32) | #3:(F32) | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: |:--: | + |0x0800| 0x040 | 7 | 1 Hz | N | HD | All | Dialysate Flow Data | mFlowSetPoint | mMeasuredFlow | mRotorSpeed | mMotorSpeed | mMotorCtlSpeed | mMotorCtlCurrent | mPWMDutyCycle | + :param vFlowSetPt: + :param vMeasFlow: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.DialysateInletFlow, 4 * 7, False, utils.toI32(vFlowSetPt), utils.toF32(vMeasFlow), @@ -209,6 +317,17 @@ def setTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + the Dialysate Flow Data message setter/sender method + :param vFlowSetPt: + :param vMeasFlow: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ frames = buildSetTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -217,6 +336,16 @@ def buildTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | #4:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x1800| 0x020 | 6 | Rsp | Y | HD | UI | Blood/dialysate rate change Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mBloodRate | \ref Data::mDialysateRate | + :param vAccepted: + :param vReason: + :param vBloodRate: + :param vDialysate: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.AdjustBloodDialysateRsp, 4 * 4, True, utils.toI32(vAccepted), utils.toI32(vReason), @@ -227,6 +356,14 @@ def sendTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate): + """ + the Blood/dialysate rate change Response message setter/sender method + :param vAccepted: + :param vReason: + :param vBloodRate: + :param vDialysate: + :return: + """ frames = buildTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -235,6 +372,16 @@ def buildTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | #5:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x1B00| 0x020 | 6 | Rsp | Y | HD | UI | Treatment Duration change Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mDuration | \ref Data::mUFVolume | + :param vAccepted: + :param vReason: + :param vDuration: + :param vUltrafiltration: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.AdjustDurationRsp, 4 * 4, True, utils.toI32(vAccepted), utils.toI32(vReason), @@ -245,6 +392,14 @@ def sendTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration): + """ + the Treatment Duration change Response message setter/sender method + :param vAccepted: + :param vReason: + :param vDuration: + :param vUltrafiltration: + :return: + """ frames = buildTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -253,13 +408,26 @@ def buildTreatmentAdjustUltrafiltrationStateResponse(vState): + """ + | MSG | CAN ID | M.Box | Type | Ack | Src | Dest | Description | #1:(U08) | + |:----:|:------:|:-----:|:----:|:---:|:---:|:----:|:-----------: |:--: | + |0x1000| 0x100 | 9 | Rsp | N | HD | UI | Generic response ACK/NAK | mAccepted | + :param vState: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationStateReq, 1 * 4 , False, utils.toI32(vState) ) return messageBuilder.toFrames(msg) def setTreatmentAdjustUltrafiltrationStateResponse(vState): + """ + the Treatment ultrafiltration adjustment response message setter/sender method + this is actually the Generic response ACK/NAK message + :param vState: + :return: + """ frames = buildTreatmentAdjustUltrafiltrationStateResponse(vState) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -268,14 +436,36 @@ def setTreatmentAdjustUltrafiltrationAccepted(): + """ + a convenient method for setTreatmentAdjustUltrafiltrationStateResponse which sends accept true + :return: + """ setTreatmentAdjustUltrafiltrationStateResponse( EResponse.Accepted ) def setTreatmentAdjustUltrafiltrationRejected(): + """ + a convenient method for setTreatmentAdjustUltrafiltrationStateResponse which sends accept false + :return: + """ setTreatmentAdjustUltrafiltrationStateResponse( EResponse.Rejected ) def buildTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #1:(U32) | #2:(U32) | #3:(F32) | #4:(U32) | #5:(F32) | #6:(U32) | #7:(U32) | #8:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: |:--: |:--: |:--: |:--: | + |0x1300| 0x020 | 6 | Rsp | Y | HD | UI | UF Vol. Change Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mVolume | \ref Data::mDuration | \ref Data::mRate | \ref Data::mDurationDiff | \ref Data::mRateDiff | \ref Data::mRateOld | + :param vAccepted: + :param vReason: + :param vVolume: + :param vDuration: + :param vDurationDiff: + :param vRate: + :param vRateDiff: + :param vRateOld: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationEditRsp, 8 * 4 , True, utils.toI32(vAccepted), utils.toI32(vReason), @@ -290,6 +480,18 @@ def setTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld): + """ + the ultrafiltration volume change response message setter/sender method + :param vAccepted: + :param vReason: + :param vVolume: + :param vDuration: + :param vDurationDiff: + :param vRate: + :param vRateDiff: + :param vRateOld: + :return: + """ frames = buildTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -298,6 +500,12 @@ def setTreatmentAdjustUltrafiltrationEditRejected(vReason): + """ + a convenient method for setTreatmentAdjustUltrafiltrationEditResponse which only sends a rejection reason + and sends other values all as zero + :param vReason: + :return: + """ frames = buildTreatmentAdjustUltrafiltrationEditResponse(0, vReason, 0, 0, 0, 0, 0, 0) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -306,6 +514,17 @@ def buildTreatmentAdjustUltrafiltrationConfirmResponse(vAccepted, vReason, vVolume, vDuration, vRate): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(F32) | #4:(U32) | #5:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: | + |0x2E00| 0x020 | 6 | Rsp | Y | HD | UI | UF Vol. Change Confirmation Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mVolume | \ref Data::mDuration | \ref Data::mRate | + :param vAccepted: + :param vReason: + :param vVolume: + :param vDuration: + :param vRate: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationConfirmRsp, 5 * 4 , True, utils.toI32(vAccepted), utils.toI32(vReason), @@ -317,6 +536,15 @@ def setTreatmentAdjustUltrafiltrationConfirmResponse (vAccepted, vReason, vVolume, vDuration, vRate): + """ + the ultrafiltratin volume Change Confirmation Response message setter/sender method + :param vAccepted: + :param vReason: + :param vVolume: + :param vDuration: + :param vRate: + :return: + """ frames = buildTreatmentAdjustUltrafiltrationConfirmResponse(vAccepted, vReason, vVolume, vDuration, vRate) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -325,6 +553,13 @@ def setTreatmentAdjustUltrafiltrationConfirmRejected ( vReason ): + """ + a convenient method for setTreatmentAdjustUltrafiltrationConfirmResponse which only sends a rejection reason + and sends other values all as zero + + :param vReason: + :return: + """ frames = buildTreatmentAdjustUltrafiltrationConfirmResponse(0, vReason, 0, 0, 0) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -333,6 +568,15 @@ def buildTreatmentTime(vSecsTotal, vSecsElap, vSecsRem): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x0D00| 0x040 | 7 | 1 Hz | N | HD | All | Treatment Time Data | \ref Data::mTotal | \ref Data::mElapsed | \ref Data::mRemaining | + :param vSecsTotal: + :param vSecsElap: + :param vSecsRem: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.TreatmentTime, 3 * 4, False, utils.toI32(vSecsTotal), utils.toI32(vSecsElap), @@ -342,6 +586,13 @@ def setTreatmentTime(vSecsTotal, vSecsElap, vSecsRem = None): + """ + the Treatment Time Data message setter/sender method + :param vSecsTotal: + :param vSecsElap: + :param vSecsRem: + :return: + """ if vSecsRem == None: vSecsRem = vSecsTotal - vSecsElap frames = buildTreatmentTime(vSecsTotal, vSecsElap, vSecsRem) @@ -352,6 +603,19 @@ def buildSetTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: |:--: | + |0x0B00| 0x040 | 7 | 1 Hz | N | HD | All | Outlet Flow Data | \ref Data::mRefUFVol | \ref Data::mMeasUFVol | \ref Data::mRotorSpeed | \ref Data::mMotorSpeed | \ref Data::mMotorCtlSpeed | \ref Data::mMotorCtlCurrent | \ref Data::mPWMDtCycle | + :param vRefUFVol: + :param vMeasUFVol: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.DialysateOutletFlow, 4 * 7, False, utils.toF32(vRefUFVol), utils.toF32(vMeasUFVol), @@ -365,6 +629,17 @@ def setTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): + """ + the Outlet Flow Data message setter/sender method + :param vRefUFVol: + :param vMeasUFVol: + :param vRotSpd: + :param vMotSpd: + :param vMCSpd: + :param vMCCurr: + :param vPWM: + :return: + """ frames = buildSetTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM ) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -373,9 +648,19 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0009,040,N,HD,All,PressureOcclusionData,(F32)^ArterialPressure,(F32)^VenousPressure,(F32)^BloodPumpOcclusion,(F32)^DialysateInletPumpOcclusion,(F32)^DialysateOutletPumpOcclusion -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildPressureOcclusionData(vArterialPressure, vVenousPressure, vBloodPumpOcclusion, vDialysateInletPumpOcclusion, vDialysateOutletPumpOcclusion): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | #5:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: | + |0x0900| 0x040 | 7 | 1 Hz | N | HD | All | PressureOcclusion Data | \ref Data::mArterialPressure | \ref Data::mVenousPressure | \ref Data::mBloodPumpOcclusion | \ref Data::mDialysateInletPumpOcclusion | \ref Data::mDialysateOutletPumpOcclusion | + :param vArterialPressure: + :param vVenousPressure: + :param vBloodPumpOcclusion: + :param vDialysateInletPumpOcclusion: + :param vDialysateOutletPumpOcclusion: + :return: + """ msg = messageBuilder.buildMessage( 0x0009, 4+4+4+4+4, False, utils.toF32(vArterialPressure ), utils.toF32(vVenousPressure ), @@ -387,6 +672,15 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setPressureOcclusionData (vArterialPressure, vVenousPressure, vBloodPumpOcclusion, vDialysateInletPumpOcclusion, vDialysateOutletPumpOcclusion): + """ + the Pressure/Occlusion Data messages setter/sender mehtod + :param vArterialPressure: + :param vVenousPressure: + :param vBloodPumpOcclusion: + :param vDialysateInletPumpOcclusion: + :param vDialysateOutletPumpOcclusion: + :return: + """ frames = buildPressureOcclusionData(vArterialPressure, vVenousPressure, vBloodPumpOcclusion, vDialysateInletPumpOcclusion, vDialysateOutletPumpOcclusion) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -395,9 +689,16 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x001F,080,N,DG,All,DGROPumpData,(U32)^SetPtPressure,(F32)^FlowRate,(F32)^PWM -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGROPumpData(vSetPtPressure, vFlowRate, vPWM): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(F32) | #3:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x1F00| 0x080 | 8 | 1 Hz | N | DG | All | DG RO Pump Data | \ref Data::mPressure | \ref Data::mFlowRate | \ref Data::mPWM | :param vSetPtPressure: + :param vFlowRate: + :param vPWM: + :return: + """ msg = messageBuilder.buildMessage( 0x001F, 4+4+4, False, utils.toI32(vSetPtPressure), utils.toF32(vFlowRate ), @@ -407,6 +708,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGROPumpData(vSetPtPressure, vFlowRate, vPWM): + """ + the DG RO Pump Data message setter/sender method + :param vSetPtPressure: + :param vFlowRate: + :param vPWM: + :return: + """ frames = buildDGROPumpData(vSetPtPressure, vFlowRate, vPWM) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -415,9 +723,18 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0020,080,N,DG,All,DGPressuresData,(F32)^ROInletPSI,(F32)^ROOutletPSI,(F32)^DrainInletPSI,(F32)^DrainOutletPSI -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x2000| 0x080 | 8 | 1 Hz | N | DG | All | DG Pressures Data | \ref Data::mROInletPSI | \ref Data::mROOutletPSI | \ref Data::mDrainInletPSI | \ref Data::mDrainOutletPSI | + :param vROInletPSI: + :param vROOutletPSI: + :param vDrainInletPSI: + :param vDrainOutletPSI: + :return: + """ msg = messageBuilder.buildMessage( 0x0020, 4+4+4+4, False, utils.toF32(vROInletPSI ), utils.toF32(vROOutletPSI ), @@ -428,6 +745,14 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): + """ + the DG Pressures Data message setter/sender method + :param vROInletPSI: + :param vROOutletPSI: + :param vDrainInletPSI: + :param vDrainOutletPSI: + :return: + """ frames = buildDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -436,9 +761,16 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0024,080,N,DG,All,DGDrainPumpData,(U32)^SetPtRPM,(U32)^DACValue -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGDrainPumpData(vSetPtRPM, vDACValue): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: | + |0x2400| 0x080 | 8 | 1 Hz | N | DG | All | DG Drain Pump Data | \ref Data::mRPM | \ref Data::mDAC | + :param vSetPtRPM: + :param vDACValue: + :return: + """ msg = messageBuilder.buildMessage( 0x0024, 4+4, False, utils.toI32(vSetPtRPM), utils.toI32(vDACValue)) @@ -447,6 +779,12 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGDrainPumpData(vSetPtRPM, vDACValue): + """ + the DG Drain Pump Data message setter/sender method + :param vSetPtRPM: + :param vDACValue: + :return: + """ frames = buildDGDrainPumpData(vSetPtRPM, vDACValue) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -455,16 +793,27 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0027,080,N,DG,All,DGOperationMode,(U32)^DGOpMode -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGOperationMode(vDGOpMode): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x2700| 0x080 | 8 | 1 Hz | N | DG | All | DG Operation Mode Data | \ref Data::mOpMode | + :param vDGOpMode: + :return: + """ msg = messageBuilder.buildMessage( 0x0027, 4, False, utils.toI32(vDGOpMode)) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGOperationMode(vDGOpMode): + """ + the DG Operation Mode Data message setter/sender method + :param vDGOpMode: + :return: + """ frames = buildDGOperationMode(vDGOpMode) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -473,9 +822,17 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0028,080,N,DG,All,DGReservoirData,(U32)^ActiveReservoir,(U32)^FillToVolML,(U32)^DrainToVolML -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2800| 0x080 | 8 | 1 Hz | N | DG | All | DG Reservoir Data | \ref Data::mActiveReservoir | \ref Data::mFillToVol | \ref Data::mDrainToVol | + :param vActiveReservoir: + :param vFillToVolML: + :param vDrainToVolML: + :return: + """ msg = messageBuilder.buildMessage( 0x0028, 4+4+4, False, utils.toI32(vActiveReservoir), utils.toI32(vFillToVolML ), @@ -485,6 +842,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML): + """ + the DG Reservoir Data message setter/sender method + :param vActiveReservoir: + :param vFillToVolML: + :param vDrainToVolML: + :return: + """ frames = buildDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -493,16 +857,27 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x002A,080,N,DG,All,DGValvesStates,(U16)^ValvesStates -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGValvesStates(vValvesStates): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U16) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x2A00| 0x080 | 8 | 2 Hz | N | DG | All | DG Valves States Data | \ref Data::mStates | + :param vValvesStates: + :return: + """ msg = messageBuilder.buildMessage( 0x002A, 2, False, utils.toI16(vValvesStates)) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGValvesStates(vValvesStates): + """ + the DG Valves States Data message setter/sender method + :param vValvesStates: + :return: + """ frames = buildDGValvesStates(vValvesStates) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -511,9 +886,17 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x002C,080,N,DG,All,DGHeatersData,(U32)^MainPriMaryDC,(U32)^SmallPrimaryDC,(U32)^TrimmerDC -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2C00| 0x080 | 8 | 2 Hz | N | DG | All | DG Heaters Data | \ref Data::mMainPrimaryDC | \ref Data::mSmallPrimaryDC | \ref Data::mTrimmerDC | + :param vMainPriMaryDC: + :param vSmallPrimaryDC: + :param vTrimmerDC: + :return: + """ msg = messageBuilder.buildMessage( 0x002C, 4+4+4, False, utils.toI32(vMainPriMaryDC ), utils.toI32(vSmallPrimaryDC), @@ -523,6 +906,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): + """ + the DG Heaters Data message setter/sender method + :param vMainPriMaryDC: + :param vSmallPrimaryDC: + :param vTrimmerDC: + :return: + """ frames = buildDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -531,9 +921,18 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x000C,080,N,DG,All,DGLoadCellReadingsData,(F32)^Rs1Prim,(F32)^Rs1Bkup,(F32)^Rs2Prim,(F32)^Rs2Bkup -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x0C00| 0x080 | 8 | 10 Hz | N | DG | All | DG Load Cell Readings Data | \ref Data::mReservoir1Prim | \ref Data::mReservoir1Bkup | \ref Data::mReservoir2Prim | \ref Data::mReservoir2Bkup | + :param vRs1Prim: + :param vRs1Bkup: + :param vRs2Prim: + :param vRs2Bkup: + :return: + """ msg = messageBuilder.buildMessage( 0x000C, 4+4+4+4, False, utils.toF32(vRs1Prim), utils.toF32(vRs1Bkup), @@ -544,6 +943,14 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): + """ + the DG Load Cell Readings Data message setter/sender method + :param vRs1Prim: + :param vRs1Bkup: + :param vRs2Prim: + :param vRs2Bkup: + :return: + """ frames = buildDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -552,9 +959,34 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x002D,080,N,DG,All,DGTemperaturesData,(F32)^InletPrimaryHeater,(F32)^OutletPrimaryHeater,(F32)^ConductivitySensor1,(F32)^ConductivitySensor2,(F32)^OutletRedundancy,(F32)^InletDialysate,(F32)^PrimaryHeaterThermocouple,(F32)^TrimmerHeaterThermocouple,(F32)^PrimaryHeaterColdJunction,(F32)^TrimmerHeaterColdJunction,(F32)^PrimaryHeaterInternalTemperature,(F32)^TrimmerHeaterInternalTemperature -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGTemperaturesData(vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, vTrimmerHeaterInternalTemperature): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2D00| 0x080 | 8 | 2 Hz | N | DG | All | DG Temperatures Data | \ref Data::mInletPrimaryHeater | \ref Data::mOutletPrimaryHeater | \ref Data::mConductivitySensor1 | + + | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | #8:(F32) | + |:--: |:--: |:--: |:--: |:--: | + | \ref Data::mConductivitySensor2 | \ref Data::mOutletRedundancy | \ref Data::mInletDialysate | \ref Data::mPrimaryHeaterThermoCouple | \ref Data::mTrimmerHeaterThermoCouple | + + | #9:(F32) | #10:(F32) | #11:(F32) | #12:(F32) | + | :--: |:--: |:--: |:--: | + | \ref Data::mPrimaryHeaterColdJunction | \ref Data::mTrimmerHeaterColdJunction | \ref Data::mPrimaryHeaterInternal | \ref Data::mTrimmerHeaterInternal | + :param vInletPrimaryHeater: + :param vOutletPrimaryHeater: + :param vConductivitySensor1: + :param vConductivitySensor2: + :param vOutletRedundancy: + :param vInletDialysate: + :param vPrimaryHeaterThermocouple: + :param vTrimmerHeaterThermocouple: + :param vPrimaryHeaterColdJunction: + :param vTrimmerHeaterColdJunction: + :param vPrimaryHeaterInternalTemperature: + :param vTrimmerHeaterInternalTemperature: + :return: + """ msg = messageBuilder.buildMessage( 0x002D, 4+4+4+4+4+4+4+4+4+4+4+4, False, utils.toF32(vInletPrimaryHeater ), utils.toF32(vOutletPrimaryHeater ), @@ -573,6 +1005,22 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGTemperaturesData(vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, vTrimmerHeaterInternalTemperature): + """ + the DG Temperatures Data message setter/sender method + :param vInletPrimaryHeater: + :param vOutletPrimaryHeater: + :param vConductivitySensor1: + :param vConductivitySensor2: + :param vOutletRedundancy: + :param vInletDialysate: + :param vPrimaryHeaterThermocouple: + :param vTrimmerHeaterThermocouple: + :param vPrimaryHeaterColdJunction: + :param vTrimmerHeaterColdJunction: + :param vPrimaryHeaterInternalTemperature: + :param vTrimmerHeaterInternalTemperature: + :return: + """ frames = buildDGTemperaturesData(vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, vTrimmerHeaterInternalTemperature) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -581,9 +1029,17 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x000F,040,N,HD,All,TreatmentStatesData,(U32)^SubMode,(U32)^UFState,(U32)^SalineState -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildTreatmentStatesData(vSubMode, vUFState, vSalineState): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x0F00| 0x040 | 7 | 1 Hz | N | HD | All | Treatment States Data | \ref Data::mSubMode | \ref Data::mUFState | \ref Data::mSalineState | + :param vSubMode: + :param vUFState: + :param vSalineState: + :return: + """ msg = messageBuilder.buildMessage( 0x000F, 4+4+4, False, utils.toI32(vSubMode ), utils.toI32(vUFState ), @@ -593,6 +1049,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setTreatmentStatesData(vSubMode, vUFState, vSalineState): + """ + the Treatment States Data message setter/sender method + :param vSubMode: + :param vUFState: + :param vSalineState: + :return: + """ frames = buildTreatmentStatesData(vSubMode, vUFState, vSalineState) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -601,16 +1064,27 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0025,040,N,HD,All,HDOperationModeData,(U32)^OpMode -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildHDOperationModeData(vOpMode): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x2500| 0x040 | 7 | 1 Hz | N | HD | All | HD Operation Mode Data | \ref Data::mOpMode | + :param vOpMode: + :return: + """ msg = messageBuilder.buildMessage( 0x0025, 4, False, utils.toI32(vOpMode)) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setHDOperationModeData(vOpMode): + """ + the HD Operation Mode Data message setter/sender method + :param vOpMode: + :return: + """ frames = buildHDOperationModeData(vOpMode) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -619,9 +1093,17 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x002F,040,N,HD,All,TreatmentSalineBolusData,(U32)^Target,(F32)^Cumulitive,(F32)^Delivered -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildTreatmentSalineBolusData(vTarget, vCumulitive, vDelivered): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(F32) | #3:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2F00| 0x040 | 7 | 1 Hz | N | HD | All | Treatment Saline Bolus Data | \ref Data::mTarget | \ref Data::mCumulative | \ref Data::mDelivered | + :param vTarget: + :param vCumulitive: + :param vDelivered: + :return: + """ msg = messageBuilder.buildMessage( 0x002F, 4+4+4, False, utils.toI32(vTarget ), utils.toF32(vCumulitive), @@ -631,6 +1113,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setTreatmentSalineBolusData(vTarget, vCumulitive, vDelivered): + """ + the Treatment Saline Bolus Data message setter/sender method + :param vTarget: + :param vCumulitive: + :param vDelivered: + :return: + """ frames = buildTreatmentSalineBolusData(vTarget, vCumulitive, vDelivered) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -639,9 +1128,17 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0014,020,Y,HD,UI,SalineBolusResponse,(U32)^Accepted,(U32)^Reason,(U32)^Target -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildSalineBolusResponse(vAccepted, vReason, vTarget): + """ + | MSG | CAN ID | M.Box | Type | Ack | Src | Dest | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:---:|:------:|:-----:|:----:|:---:|:---:|:----:|:---------------------:|:--------------------:|:-------------------:|:-------------------:| + | 20 | 0x020 | 6 | Rsp | Y | HD | UI | Saline Bolus Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mTarget | + :param vAccepted: + :param vReason: + :param vTarget: + :return: + """ msg = messageBuilder.buildMessage( 0x0014, 4+4+4, True, utils.toI32(vAccepted), utils.toI32(vReason ), @@ -651,6 +1148,13 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setSalineBolusResponse(vAccepted, vReason, vTarget): + """ + the Saline Bolus Response message setter/sender method + :param vAccepted: + :param vReason: + :param vTarget: + :return: + """ frames = buildSalineBolusResponse(vAccepted, vReason, vTarget) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -659,13 +1163,23 @@ def buildCanBUSFaultCount(vCount): + """ + the CANBus fault count message builder method + :param vCount: + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.CanBUSFaultCount, 4 * 1, False, utils.toI32(vCount) ) return messageBuilder.toFrames(msg) def setCanBUSFaultCount(vCount): + """ + the CANBus fault count message setter/sender method + :param vCount: + :return: + """ frames = buildCanBUSFaultCount(vCount) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -674,11 +1188,19 @@ def buildUnknown(): + """ + the unknown message builder method + :return: + """ msg = messageBuilder.buildMessage(GuiActionType.Unknown, 0, False) return messageBuilder.toFrames(msg) def sendUnknown_HD(): + """ + the unknown message from HD setter/sender method + :return: + """ frames = buildUnknown() frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -687,6 +1209,10 @@ def sendUnknown_DG(): + """ + the unknown message from DG setter/sender method + :return: + """ frames = buildUnknown() frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -695,12 +1221,26 @@ def clear_all_alarms(): + """ + a convenient method for setAlarmStatus to clear all alarms + :return: + """ setAlarmStatus(0, 0, 0, 0, 0) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0002,001,N,HD,All,AlarmStatus,(U32)^State,(U32)^Top,(U32)^EscalatesIn,(U32)^MuteTimeout,(U16)^Flags -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildAlarmStatus(vState, vTop, vEscalatesIn, vMuteTimeout, vFlags): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | #4:(U32) | #5:(U16) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: | + |0x0200| 0x001 | 1 | 1 Hz | N | HD | All | Alarm Status | \ref Data::mState | \ref Data::mTop | \ref Data::mEscalatesIn | \ref Data::mMuteTimeout | \ref Data::mFlags | + :param vState: + :param vTop: + :param vEscalatesIn: + :param vMuteTimeout: + :param vFlags: + :return: + """ msg = messageBuilder.buildMessage( 0x0002, 4+4+4+4+2, False, utils.toI32(vState ), utils.toI32(vTop ), @@ -712,6 +1252,15 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setAlarmStatus (vState, vTop, vEscalatesIn, vMuteTimeout, vFlags): + """ + the Alarm Status message setter/sender method + :param vState: + :param vTop: + :param vEscalatesIn: + :param vMuteTimeout: + :param vFlags: + :return: + """ frames = buildAlarmStatus(vState, vTop, vEscalatesIn, vMuteTimeout, vFlags) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -720,16 +1269,27 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0003,001,Y,HD,All,AlarmTriggered,(U32)^AlarmID -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildAlarmTriggered(vAlarmID): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x0300| 0x001 | 1 | Event | Y | HD | All | Alarm Triggered | \ref Data::mAlarmID | + :param vAlarmID: + :return: + """ msg = messageBuilder.buildMessage( 0x0003, 4, True, utils.toI32(vAlarmID)) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setAlarmTriggered(vAlarmID): + """ + the Alarm Triggered message setter/sender method + :param vAlarmID: + :return: + """ frames = buildAlarmTriggered(vAlarmID) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: @@ -738,16 +1298,27 @@ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## 0x0004,001,Y,HD,All,AlarmCleared,(U32)^AlarmID -## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildAlarmCleared(vAlarmID): + """ + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x0400| 0x001 | 1 | Event | Y | HD | All | Alarm Cleared | \ref Data::mAlarmID | + :param vAlarmID: + :return: + """ msg = messageBuilder.buildMessage( 0x0004, 4, True, utils.toI32(vAlarmID)) return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setAlarmCleared(vAlarmID): + """ + the Alarm Cleared message setter/sender method + :param vAlarmID: + :return: + """ frames = buildAlarmCleared(vAlarmID) frames = messageBuilder.toCandumpFormat(frames) for frame in frames: Index: dialin/squish/messageBuilder.py =================================================================== diff -u -re9104e0b4a45a64840a7cb66a115839698129844 -r602f4a2cdb9264e7a0ad1e12f28f39c78b766360 --- dialin/squish/messageBuilder.py (.../messageBuilder.py) (revision e9104e0b4a45a64840a7cb66a115839698129844) +++ dialin/squish/messageBuilder.py (.../messageBuilder.py) (revision 602f4a2cdb9264e7a0ad1e12f28f39c78b766360) @@ -38,9 +38,9 @@ def toCandumpFormat(vMsg): """ - - @param vMsg: - @return: + the converter method which converts the message vMsg to the string that candump tool understands. + :param vMsg: the message + :return: converted string to candump tool format """ if type(vMsg) == list: for index, value in enumerate(vMsg): @@ -51,9 +51,9 @@ def toFrames(vMsg): """ - - @param vMsg: - @return: + converts the message vMsg to frames + :param vMsg: adds the crc8 checksum at the end of the message vMsg + :return: the frames """ mLen = 16 padded = utils.padding(vMsg, mLen) @@ -62,15 +62,21 @@ def addCRC8(vString, vDelimiter = ""): """ - - @param vString: - @param vDelimiter: - @return: + adds the crc8 checksum at the end of the string vString + :param vString: the string to be used + :param vDelimiter: the string delimiter + :return: the string with crc8 """ return vString + vDelimiter + crc.calcCRC8(vString, vDelimiter) def textToByte(vText, vLen): + """ + converts the string vText to bytes by the length of vLen + :param vText: + :param vLen: + :return: converted text + """ text = "" l = len(vText) for i in range(vLen): @@ -84,12 +90,12 @@ def buildMessage(vMsgID, vLen, vAck, *vArgs): """ - - @param vMsgID: - @param vLen: - @param vAck: - @param vArgs: - @return: + builds message from the parameter givven + :param vMsgID: the message ID + :param vLen: length of the message payload in bytes + :param vAck: if true the message requires acknowledge back + :param vArgs: payload arguments. + :return: """ msg = "" if vAck: @@ -104,5 +110,3 @@ msg += arg msg += crc.calcCRC8(msg) return syncByte + msg - - Index: dialin/squish/unittests.py =================================================================== diff -u -r53e705f33c2ed316eaa876349d81d8e83b9de930 -r602f4a2cdb9264e7a0ad1e12f28f39c78b766360 --- dialin/squish/unittests.py (.../unittests.py) (revision 53e705f33c2ed316eaa876349d81d8e83b9de930) +++ dialin/squish/unittests.py (.../unittests.py) (revision 602f4a2cdb9264e7a0ad1e12f28f39c78b766360) @@ -39,12 +39,20 @@ def test_python_version(): + """ + tests the current python version compatibility + :return: + """ test.compare(sys.version_info.major,3) test.compare(sys.version_info.minor,6) test.compare(sys.version_info.micro in MICRO, True) def test_crc8(): + """ + test case for crc8 method + :return: + """ strByte1 = ( "4B 43 09 00 14 00 00" "00 00 00 00 00 00 00 00" "00 00 00 00 00 00 00 00" @@ -73,6 +81,10 @@ test.compare(crc.calcCRC8(strByte4, ' '), '7F') def test_can0(): + """ + check if the can0 bus driver presents + :return: + """ canid = "can0" ipa = "ip a" ipa = check_output(ipa, shell=True) Index: dialin/squish/utils.py =================================================================== diff -u -rb919e9cba87e4b3b8747227113fc5ae3df6fa6a6 -r602f4a2cdb9264e7a0ad1e12f28f39c78b766360 --- dialin/squish/utils.py (.../utils.py) (revision b919e9cba87e4b3b8747227113fc5ae3df6fa6a6) +++ dialin/squish/utils.py (.../utils.py) (revision 602f4a2cdb9264e7a0ad1e12f28f39c78b766360) @@ -32,20 +32,21 @@ def waitForGUI(vDelay = 2): """ - - @param vDelay: - @return: + a global 2 seconds default wait mehod which is used to wait for GUI animations mostly + to make sure the object is avaialable. + :param vDelay: + :return: """ time.sleep(vDelay) def toUXX(vValue, vByteCount, vDelimiter): """ - - @param vValue: - @param vByteCount: - @param vDelimiter: - @return: + converts the value vValue to hex + :param vValue: the value + :param vByteCount: number of bytes the value will take eg. U32=4, ... + :param vDelimiter: the bytes delimiter + :return: """ x = '{0:0{1}X}'.format(int(vValue) & (2**(4*vByteCount)-1), vByteCount, 'x') bytes = partition(x, 2) @@ -54,90 +55,91 @@ def toI32(vValue, vDelimiter = ""): """ - - @param vValue: - @param vDelimiter: - @return: + a convenient method for toUXX to convert the value vValue to integer 4 bytes + :param vValue: + :param vDelimiter: + :return: """ return toUXX(vValue, 8, vDelimiter) def toI16(vValue, vDelimiter = ""): """ - - @param vValue: - @param vDelimiter: - @return: + a convenient method for toUXX to convert the value vValue to integer 2 bytes + :param vValue: + :param vDelimiter: + :return: """ return toUXX(vValue, 4, vDelimiter) def toI08(vValue, vDelimiter = ""): """ - - @param vValue: - @param vDelimiter: - @return: + a convenient method for toUXX to convert the value vValue to integer 1 byte + :param vValue: + :param vDelimiter: + :return: """ return toUXX(vValue, 2, vDelimiter) def toF32(vValue): """ - - @param vValue: - @return: + converts value vValue to floating point 4 bytes. + :param vValue: + :return: """ return '{:08X}'.format(struct.unpack('f', vValue))[0],'X') def partition(vString, vPart, vRightDirection=True): """ - @param vString: - @param vPart: - @param vRightDirection: - @return: + :param vString: + :param vPart: + :param vRightDirection: + :return: """ return [vString[i: i + vPart] for i in range(0, len(vString), vPart)][::-1 if vRightDirection else 1] def padding(vString, vLen): """ - @param vString: - @param vLen: - @return: + :param vString: + :param vLen: + :return: """ lStr = len(vString) lPad = int(lStr / vLen) * vLen + ( vLen * (1 if lStr % vLen else 0) ) return vString.ljust(lPad, "0") def tstStart(vTestName): """ - - @return: + test case start print out with time + :param vTestName: + :return: """ print(time.strftime("%H:%M:%S Start", time.localtime()) + " - " + vTestName) def tstDone(): """ - - @return: + test case end print out with time + :return: """ print(time.strftime("%H:%M:%S Done ", time.localtime())) def l2ml(vValue): """ - - @param vValue: - @return: + converts liter to mili liter + :param vValue: + :return: """ return int(round (vValue, 3) * 1000) def ml2l(vValue): """ - - @param vValue: - @return: + converts mili liter to liter + :param vValue: + :return: """ return vValue / 1000 - +