Index: dialin/squish/denaliMessages.py =================================================================== diff -u -rc6b120f6a2e0e9e23550e39c7034bef31b8dbe54 -re9104e0b4a45a64840a7cb66a115839698129844 --- dialin/squish/denaliMessages.py (.../denaliMessages.py) (revision c6b120f6a2e0e9e23550e39c7034bef31b8dbe54) +++ dialin/squish/denaliMessages.py (.../denaliMessages.py) (revision e9104e0b4a45a64840a7cb66a115839698129844) @@ -28,10 +28,14 @@ import time import subprocess -from .utils import toI32, toF32, toI16 -from .messageBuilder import buildMessage, toFrames, toCandumpFormat -from dialin.squish import messageBuilder +import names +if names.DIALIN_LINK: + from dialin.squish import utils + from dialin.squish import messageBuilder +else: + import utils + import messageBuilder class EResponse: Rejected = 0 @@ -78,6 +82,7 @@ AdjustUltrafiltrationConfirmReq = 21 AdjustUltrafiltrationConfirmRsp = 46 + TreatmentRanges = 26 String = 65279 @@ -92,6 +97,9 @@ def send_acknowledge_UI(): subprocess.call(['cansend', 'can0', '100#A5.01.00.FF.FF.00.19.00']) + +def send_CheckIn_DG(): + subprocess.call(['cansend', 'can0', '010#A5.01.00.06.00.00.76.00']) def show_PowerOffDialog(): subprocess.call(['cansend', 'can0', '020#A5.01.00.01.00.01.00.38']) @@ -117,12 +125,12 @@ def buildHDDebugText(vText): len = 40 txt = messageBuilder.textToByte(vText, len) # + 1 null term - msg = buildMessage( GuiActionType.HDDebugText, 1 * (len + 1), False, txt) - return toFrames(msg) + msg = messageBuilder.buildMessage( GuiActionType.HDDebugText, 1 * (len + 1), False, txt) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setHDDebugText (vText): frames = buildHDDebugText(vText) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() @@ -132,127 +140,127 @@ def buildDGDebugText(vText): len = 40 txt = messageBuilder.textToByte(vText, len) # + 1 null term - msg = buildMessage( GuiActionType.DGDebugText, 1 * (len + 1), False, txt) + msg = messageBuilder.buildMessage( GuiActionType.DGDebugText, 1 * (len + 1), False, txt) - return toFrames(msg) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGDebugText (vText): frames = buildDGDebugText(vText) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '070#{}'.format(frame)]) waitForMessageToBeSent() ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildSetTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate): - msg = buildMessage(GuiActionType.TreatmentRanges, 4 * 6, True, - toI32(vMinTreatmentDuration), - toI32(vMaxTreatmentDuration), - toF32(vMinUFVolume ), - toF32(vMaxUFVolume ), - toI32(vMinDialysateFlowRate), - toI32(vMaxDialysateFlowRate) + msg = messageBuilder.buildMessage(GuiActionType.TreatmentRanges, 4 * 6, True, + utils.toI32(vMinTreatmentDuration), + utils.toI32(vMaxTreatmentDuration), + utils.toF32(vMinUFVolume ), + utils.toF32(vMaxUFVolume ), + utils.toI32(vMinDialysateFlowRate), + utils.toI32(vMaxDialysateFlowRate) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate): frames = buildSetTreatmentParamRanges(vMinTreatmentDuration, vMaxTreatmentDuration, vMinUFVolume, vMaxUFVolume, vMinDialysateFlowRate, vMaxDialysateFlowRate) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def buildSetTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): - msg = buildMessage(GuiActionType.BloodFlow, 4 * 7, False, - toI32(vFlowSetPt ), - toF32(vMeasFlow ), - toF32(vRotSpd ), - toF32(vMotSpd ), - toF32(vMCSpd ), - toF32(vMCCurr ), - toF32(vPWM ) + msg = messageBuilder.buildMessage(GuiActionType.BloodFlow, 4 * 7, False, + utils.toI32(vFlowSetPt ), + utils.toF32(vMeasFlow ), + utils.toF32(vRotSpd ), + utils.toF32(vMotSpd ), + utils.toF32(vMCSpd ), + utils.toF32(vMCCurr ), + utils.toF32(vPWM ) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): frames = buildSetTreatmentBloodFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() def buildSetTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): - msg = buildMessage(GuiActionType.DialysateInletFlow, 4 * 7, False, - toI32(vFlowSetPt), - toF32(vMeasFlow), - toF32(vRotSpd), - toF32(vMotSpd), - toF32(vMCSpd), - toF32(vMCCurr), - toF32(vPWM) + msg = messageBuilder.buildMessage(GuiActionType.DialysateInletFlow, 4 * 7, False, + utils.toI32(vFlowSetPt), + utils.toF32(vMeasFlow), + utils.toF32(vRotSpd), + utils.toF32(vMotSpd), + utils.toF32(vMCSpd), + utils.toF32(vMCCurr), + utils.toF32(vPWM) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): frames = buildSetTreatmentDialysateFlowRate(vFlowSetPt, vMeasFlow, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() def buildTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate): - msg = buildMessage(GuiActionType.AdjustBloodDialysateRsp, 4 * 4, True, - toI32(vAccepted), - toI32(vReason), - toI32(vBloodRate), - toI32(vDialysate) + msg = messageBuilder.buildMessage(GuiActionType.AdjustBloodDialysateRsp, 4 * 4, True, + utils.toI32(vAccepted), + utils.toI32(vReason), + utils.toI32(vBloodRate), + utils.toI32(vDialysate) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def sendTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate): frames = buildTreatmentAdjustBloodDialysateResponse(vAccepted, vReason, vBloodRate, vDialysate) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def buildTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration): - msg = buildMessage(GuiActionType.AdjustDurationRsp, 4 * 4, True, - toI32(vAccepted), - toI32(vReason), - toI32(vDuration), - toF32(vUltrafiltration) + msg = messageBuilder.buildMessage(GuiActionType.AdjustDurationRsp, 4 * 4, True, + utils.toI32(vAccepted), + utils.toI32(vReason), + utils.toI32(vDuration), + utils.toF32(vUltrafiltration) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def sendTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration): frames = buildTreatmentAdjustDurationResponse(vAccepted, vReason, vDuration, vUltrafiltration) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def buildTreatmentAdjustUltrafiltrationStateResponse(vState): - msg = buildMessage(GuiActionType.AdjustUltrafiltrationStateReq, 1 * 4 , False, - toI32(vState) + msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationStateReq, 1 * 4 , False, + utils.toI32(vState) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentAdjustUltrafiltrationStateResponse(vState): frames = buildTreatmentAdjustUltrafiltrationStateResponse(vState) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() @@ -267,97 +275,97 @@ def buildTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld): - msg = buildMessage(GuiActionType.AdjustUltrafiltrationEditRsp, 8 * 4 , True, - toI32(vAccepted), - toI32(vReason), - toF32(vVolume), - toI32(vDuration), - toI32(vDurationDiff), - toF32(vRate), - toF32(vRateDiff), - toF32(vRateOld) + msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationEditRsp, 8 * 4 , True, + utils.toI32(vAccepted), + utils.toI32(vReason), + utils.toF32(vVolume), + utils.toI32(vDuration), + utils.toI32(vDurationDiff), + utils.toF32(vRate), + utils.toF32(vRateDiff), + utils.toF32(vRateOld) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld): frames = buildTreatmentAdjustUltrafiltrationEditResponse(vAccepted, vReason, vVolume, vDuration, vDurationDiff, vRate, vRateDiff, vRateOld) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def setTreatmentAdjustUltrafiltrationEditRejected(vReason): frames = buildTreatmentAdjustUltrafiltrationEditResponse(0, vReason, 0, 0, 0, 0, 0, 0) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def buildTreatmentAdjustUltrafiltrationConfirmResponse(vAccepted, vReason, vVolume, vDuration, vRate): - msg = buildMessage(GuiActionType.AdjustUltrafiltrationConfirmRsp, 5 * 4 , True, - toI32(vAccepted), - toI32(vReason), - toF32(vVolume), - toI32(vDuration), - toF32(vRate) + msg = messageBuilder.buildMessage(GuiActionType.AdjustUltrafiltrationConfirmRsp, 5 * 4 , True, + utils.toI32(vAccepted), + utils.toI32(vReason), + utils.toF32(vVolume), + utils.toI32(vDuration), + utils.toF32(vRate) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentAdjustUltrafiltrationConfirmResponse (vAccepted, vReason, vVolume, vDuration, vRate): frames = buildTreatmentAdjustUltrafiltrationConfirmResponse(vAccepted, vReason, vVolume, vDuration, vRate) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def setTreatmentAdjustUltrafiltrationConfirmRejected ( vReason ): frames = buildTreatmentAdjustUltrafiltrationConfirmResponse(0, vReason, 0, 0, 0) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() def buildTreatmentTime(vSecsTotal, vSecsElap, vSecsRem): - msg = buildMessage(GuiActionType.TreatmentTime, 3 * 4, False, - toI32(vSecsTotal), - toI32(vSecsElap), - toI32(vSecsRem) + msg = messageBuilder.buildMessage(GuiActionType.TreatmentTime, 3 * 4, False, + utils.toI32(vSecsTotal), + utils.toI32(vSecsElap), + utils.toI32(vSecsRem) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentTime(vSecsTotal, vSecsElap, vSecsRem = None): if vSecsRem == None: vSecsRem = vSecsTotal - vSecsElap frames = buildTreatmentTime(vSecsTotal, vSecsElap, vSecsRem) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() def buildSetTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): - msg = buildMessage(GuiActionType.DialysateOutletFlow, 4 * 7, False, - toF32(vRefUFVol), - toF32(vMeasUFVol), - toF32(vRotSpd), - toF32(vMotSpd), - toF32(vMCSpd), - toF32(vMCCurr), - toF32(vPWM) + msg = messageBuilder.buildMessage(GuiActionType.DialysateOutletFlow, 4 * 7, False, + utils.toF32(vRefUFVol), + utils.toF32(vMeasUFVol), + utils.toF32(vRotSpd), + utils.toF32(vMotSpd), + utils.toF32(vMCSpd), + utils.toF32(vMCCurr), + utils.toF32(vPWM) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM): frames = buildSetTreatmentUltrafiltration(vRefUFVol, vMeasUFVol, vRotSpd, vMotSpd, vMCSpd, vMCCurr, vPWM ) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() @@ -367,19 +375,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 = buildMessage( 0x0009, 4+4+4+4+4, False, - toF32(vArterialPressure ), - toF32(vVenousPressure ), - toF32(vBloodPumpOcclusion ), - toF32(vDialysateInletPumpOcclusion ), - toF32(vDialysateOutletPumpOcclusion)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0009, 4+4+4+4+4, False, + utils.toF32(vArterialPressure ), + utils.toF32(vVenousPressure ), + utils.toF32(vBloodPumpOcclusion ), + utils.toF32(vDialysateInletPumpOcclusion ), + utils.toF32(vDialysateOutletPumpOcclusion)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setPressureOcclusionData (vArterialPressure, vVenousPressure, vBloodPumpOcclusion, vDialysateInletPumpOcclusion, vDialysateOutletPumpOcclusion): frames = buildPressureOcclusionData(vArterialPressure, vVenousPressure, vBloodPumpOcclusion, vDialysateInletPumpOcclusion, vDialysateOutletPumpOcclusion) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() @@ -389,17 +397,17 @@ ## 0x001F,080,N,DG,All,DGROPumpData,(U32)^SetPtPressure,(F32)^FlowRate,(F32)^PWM ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGROPumpData(vSetPtPressure, vFlowRate, vPWM): - msg = buildMessage( 0x001F, 4+4+4, False, - toI32(vSetPtPressure), - toF32(vFlowRate ), - toF32(vPWM )) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x001F, 4+4+4, False, + utils.toI32(vSetPtPressure), + utils.toF32(vFlowRate ), + utils.toF32(vPWM )) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGROPumpData(vSetPtPressure, vFlowRate, vPWM): frames = buildDGROPumpData(vSetPtPressure, vFlowRate, vPWM) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -409,18 +417,18 @@ ## 0x0020,080,N,DG,All,DGPressuresData,(F32)^ROInletPSI,(F32)^ROOutletPSI,(F32)^DrainInletPSI,(F32)^DrainOutletPSI ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): - msg = buildMessage( 0x0020, 4+4+4+4, False, - toF32(vROInletPSI ), - toF32(vROOutletPSI ), - toF32(vDrainInletPSI ), - toF32(vDrainOutletPSI)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0020, 4+4+4+4, False, + utils.toF32(vROInletPSI ), + utils.toF32(vROOutletPSI ), + utils.toF32(vDrainInletPSI ), + utils.toF32(vDrainOutletPSI)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): frames = buildDGPressuresData(vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -430,16 +438,16 @@ ## 0x0024,080,N,DG,All,DGDrainPumpData,(U32)^SetPtRPM,(U32)^DACValue ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGDrainPumpData(vSetPtRPM, vDACValue): - msg = buildMessage( 0x0024, 4+4, False, - toI32(vSetPtRPM), - toI32(vDACValue)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0024, 4+4, False, + utils.toI32(vSetPtRPM), + utils.toI32(vDACValue)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGDrainPumpData(vSetPtRPM, vDACValue): frames = buildDGDrainPumpData(vSetPtRPM, vDACValue) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -449,15 +457,15 @@ ## 0x0027,080,N,DG,All,DGOperationMode,(U32)^DGOpMode ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGOperationMode(vDGOpMode): - msg = buildMessage( 0x0027, 4, False, - toI32(vDGOpMode)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0027, 4, False, + utils.toI32(vDGOpMode)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGOperationMode(vDGOpMode): frames = buildDGOperationMode(vDGOpMode) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -467,17 +475,17 @@ ## 0x0028,080,N,DG,All,DGReservoirData,(U32)^ActiveReservoir,(U32)^FillToVolML,(U32)^DrainToVolML ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML): - msg = buildMessage( 0x0028, 4+4+4, False, - toI32(vActiveReservoir), - toI32(vFillToVolML ), - toI32(vDrainToVolML )) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0028, 4+4+4, False, + utils.toI32(vActiveReservoir), + utils.toI32(vFillToVolML ), + utils.toI32(vDrainToVolML )) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML): frames = buildDGReservoirData(vActiveReservoir, vFillToVolML, vDrainToVolML) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -487,15 +495,15 @@ ## 0x002A,080,N,DG,All,DGValvesStates,(U16)^ValvesStates ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGValvesStates(vValvesStates): - msg = buildMessage( 0x002A, 2, False, - toI16(vValvesStates)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x002A, 2, False, + utils.toI16(vValvesStates)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGValvesStates(vValvesStates): frames = buildDGValvesStates(vValvesStates) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -505,17 +513,17 @@ ## 0x002C,080,N,DG,All,DGHeatersData,(U32)^MainPriMaryDC,(U32)^SmallPrimaryDC,(U32)^TrimmerDC ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): - msg = buildMessage( 0x002C, 4+4+4, False, - toI32(vMainPriMaryDC ), - toI32(vSmallPrimaryDC), - toI32(vTrimmerDC )) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x002C, 4+4+4, False, + utils.toI32(vMainPriMaryDC ), + utils.toI32(vSmallPrimaryDC), + utils.toI32(vTrimmerDC )) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): frames = buildDGHeatersData(vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -525,18 +533,18 @@ ## 0x000C,080,N,DG,All,DGLoadCellReadingsData,(F32)^Rs1Prim,(F32)^Rs1Bkup,(F32)^Rs2Prim,(F32)^Rs2Bkup ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): - msg = buildMessage( 0x000C, 4+4+4+4, False, - toF32(vRs1Prim), - toF32(vRs1Bkup), - toF32(vRs2Prim), - toF32(vRs2Bkup)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x000C, 4+4+4+4, False, + utils.toF32(vRs1Prim), + utils.toF32(vRs1Bkup), + utils.toF32(vRs2Prim), + utils.toF32(vRs2Bkup)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): frames = buildDGLoadCellReadingsData(vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -546,26 +554,26 @@ ## 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 = buildMessage( 0x002D, 4+4+4+4+4+4+4+4+4+4+4+4, False, - toF32(vInletPrimaryHeater ), - toF32(vOutletPrimaryHeater ), - toF32(vConductivitySensor1 ), - toF32(vConductivitySensor2 ), - toF32(vOutletRedundancy ), - toF32(vInletDialysate ), - toF32(vPrimaryHeaterThermocouple ), - toF32(vTrimmerHeaterThermocouple ), - toF32(vPrimaryHeaterColdJunction ), - toF32(vTrimmerHeaterColdJunction ), - toF32(vPrimaryHeaterInternalTemperature), - toF32(vTrimmerHeaterInternalTemperature)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x002D, 4+4+4+4+4+4+4+4+4+4+4+4, False, + utils.toF32(vInletPrimaryHeater ), + utils.toF32(vOutletPrimaryHeater ), + utils.toF32(vConductivitySensor1 ), + utils.toF32(vConductivitySensor2 ), + utils.toF32(vOutletRedundancy ), + utils.toF32(vInletDialysate ), + utils.toF32(vPrimaryHeaterThermocouple ), + utils.toF32(vTrimmerHeaterThermocouple ), + utils.toF32(vPrimaryHeaterColdJunction ), + utils.toF32(vTrimmerHeaterColdJunction ), + utils.toF32(vPrimaryHeaterInternalTemperature), + utils.toF32(vTrimmerHeaterInternalTemperature)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setDGTemperaturesData(vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, vTrimmerHeaterInternalTemperature): frames = buildDGTemperaturesData(vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, vTrimmerHeaterInternalTemperature) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '080#{}'.format(frame)]) waitForMessageToBeSent() @@ -575,17 +583,17 @@ ## 0x000F,040,N,HD,All,TreatmentStatesData,(U32)^SubMode,(U32)^UFState,(U32)^SalineState ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildTreatmentStatesData(vSubMode, vUFState, vSalineState): - msg = buildMessage( 0x000F, 4+4+4, False, - toI32(vSubMode ), - toI32(vUFState ), - toI32(vSalineState)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x000F, 4+4+4, False, + utils.toI32(vSubMode ), + utils.toI32(vUFState ), + utils.toI32(vSalineState)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setTreatmentStatesData(vSubMode, vUFState, vSalineState): frames = buildTreatmentStatesData(vSubMode, vUFState, vSalineState) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() @@ -595,107 +603,114 @@ ## 0x0025,040,N,HD,All,HDOperationModeData,(U32)^OpMode ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildHDOperationModeData(vOpMode): - msg = buildMessage( 0x0025, 4, False, - toI32(vOpMode)) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0025, 4, False, + utils.toI32(vOpMode)) + return messageBuilder.toFrames(msg) ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setHDOperationModeData(vOpMode): frames = buildHDOperationModeData(vOpMode) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) waitForMessageToBeSent() - def buildCanBUSFaultCount(vCount): - msg = buildMessage(GuiActionType.CanBUSFaultCount, 4 * 1, False, - toI32(vCount) + msg = messageBuilder.buildMessage(GuiActionType.CanBUSFaultCount, 4 * 1, False, + utils.toI32(vCount) ) - return toFrames(msg) + return messageBuilder.toFrames(msg) def setCanBUSFaultCount(vCount): frames = buildCanBUSFaultCount(vCount) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) waitForMessageToBeSent() -def buildAlarm(vState, vTop, vEsclatesIn, vSilentExpires, vFlags): - msg = buildMessage(GuiActionType.AlarmStatus, 4 * 4 + 2, False, - toI32(vState), - toI32(vTop), - toI32(vEsclatesIn), - toI32(vSilentExpires), - toI16(vFlags) - ) - return toFrames(msg) +def buildUnknown(): + msg = messageBuilder.buildMessage(GuiActionType.Unknown, 0, False) + return messageBuilder.toFrames(msg) -def sendAlarm(vState, vTop, vEsclatesIn, vSilentExpires, vFlags): - frames = buildAlarm(vState, vTop, vEsclatesIn, vSilentExpires, vFlags) - frames = toCandumpFormat(frames) +def sendUnknown_HD(): + frames = buildUnknown() + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: + subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) # send from HD + waitForMessageToBeSent() + + +def sendUnknown_DG(): + frames = buildUnknown() + frames = messageBuilder.toCandumpFormat(frames) + for frame in frames: + subprocess.call(['cansend', 'can0', '070#{}'.format(frame)]) # send from DG + waitForMessageToBeSent() + + +def clear_all_alarms(): + 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 = messageBuilder.buildMessage( 0x0002, 4+4+4+4+2, False, + utils.toI32(vState ), + utils.toI32(vTop ), + utils.toI32(vEscalatesIn), + utils.toI32(vMuteTimeout), + utils.toI16(vFlags )) + return messageBuilder.toFrames(msg) + + +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +def setAlarmStatus (vState, vTop, vEscalatesIn, vMuteTimeout, vFlags): + frames = buildAlarmStatus(vState, vTop, vEscalatesIn, vMuteTimeout, vFlags) + frames = messageBuilder.toCandumpFormat(frames) + for frame in frames: subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) waitForMessageToBeSent() +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## 0x0003,001,Y,HD,All,AlarmTriggered,(U32)^AlarmID +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildAlarmTriggered(vAlarmID): - msg = buildMessage(GuiActionType.AlarmTriggered, 4 , True, - toI16(vAlarmID) - ) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0003, 4, True, + utils.toI32(vAlarmID)) + return messageBuilder.toFrames(msg) +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setAlarmTriggered(vAlarmID): frames = buildAlarmTriggered(vAlarmID) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) waitForMessageToBeSent() +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## 0x0004,001,Y,HD,All,AlarmCleared,(U32)^AlarmID +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def buildAlarmCleared(vAlarmID): - msg = buildMessage(GuiActionType.AlarmCleared, 4 , True, - toI32(vAlarmID) - ) - return toFrames(msg) + msg = messageBuilder.buildMessage( 0x0004, 4, True, + utils.toI32(vAlarmID)) + return messageBuilder.toFrames(msg) +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def setAlarmCleared(vAlarmID): frames = buildAlarmCleared(vAlarmID) - frames = toCandumpFormat(frames) + frames = messageBuilder.toCandumpFormat(frames) for frame in frames: subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) waitForMessageToBeSent() - -def buildUnknown(): - msg = buildMessage(GuiActionType.Unknown, 0, False) - return toFrames(msg) - - -def sendUnknown_HD(): - frames = buildUnknown() - frames = toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) # send from HD - waitForMessageToBeSent() - - -def sendUnknown_DG(): - frames = buildUnknown() - frames = toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '070#{}'.format(frame)]) # send from DG - waitForMessageToBeSent() - - -def clear_all_alarms(): - sendAlarm(0, 0, 0, 0, 0) - Index: dialin/squish/messageBuilder.py =================================================================== diff -u -rc6b120f6a2e0e9e23550e39c7034bef31b8dbe54 -re9104e0b4a45a64840a7cb66a115839698129844 --- dialin/squish/messageBuilder.py (.../messageBuilder.py) (revision c6b120f6a2e0e9e23550e39c7034bef31b8dbe54) +++ dialin/squish/messageBuilder.py (.../messageBuilder.py) (revision e9104e0b4a45a64840a7cb66a115839698129844) @@ -26,9 +26,14 @@ # author Behrouz NematiPour # -from .utils import partition, padding, toI16, toI08 -from .crc import calcCRC8 - +import names +if names.DIALIN_LINK: + from dialin.squish import utils + from dialin.squish import crc +else: + import utils + import crc + syncByte = 'A5' def toCandumpFormat(vMsg): @@ -39,9 +44,9 @@ """ if type(vMsg) == list: for index, value in enumerate(vMsg): - vMsg[index] = ".".join(partition(value, 2, False)) + vMsg[index] = ".".join(utils.partition(value, 2, False)) else: - vMsg = ".".join(partition(vMsg, 2, False)) + vMsg = ".".join(utils.partition(vMsg, 2, False)) return vMsg def toFrames(vMsg): @@ -51,8 +56,8 @@ @return: """ mLen = 16 - padded = padding(vMsg, mLen) - frames = partition(padded, mLen, False) + padded = utils.padding(vMsg, mLen) + frames = utils.partition(padded, mLen, False) return frames def addCRC8(vString, vDelimiter = ""): @@ -62,18 +67,18 @@ @param vDelimiter: @return: """ - return vString + vDelimiter + calcCRC8(vString, vDelimiter) + return vString + vDelimiter + crc.calcCRC8(vString, vDelimiter) def textToByte(vText, vLen): text = "" l = len(vText) for i in range(vLen): if i < l: - text += toI08(ord(vText[i])) + text += utils.toI08(ord(vText[i])) else: - text += toI08(0) - text += toI08(0) #null /0 + text += utils.toI08(0) + text += utils.toI08(0) #null /0 return text @@ -92,12 +97,12 @@ else: seq = 1 - msg += toI16(seq) # always used seq# (-)1 (for now) - msg += toI16(vMsgID) - msg += toI08(vLen) + msg += utils.toI16(seq) # always used seq# (-)1 (for now) + msg += utils.toI16(vMsgID) + msg += utils.toI08(vLen) for arg in vArgs: msg += arg - msg += calcCRC8(msg) + msg += crc.calcCRC8(msg) return syncByte + msg Index: dialin/squish/unittests.py =================================================================== diff -u -r4bdb012848d1b59be5edc31d677b77b9d95f6190 -re9104e0b4a45a64840a7cb66a115839698129844 --- dialin/squish/unittests.py (.../unittests.py) (revision 4bdb012848d1b59be5edc31d677b77b9d95f6190) +++ dialin/squish/unittests.py (.../unittests.py) (revision e9104e0b4a45a64840a7cb66a115839698129844) @@ -27,12 +27,21 @@ # import test import sys -from .crc import calcCRC8 +import names +if names.DIALIN_LINK: + from dialin.squish import crc + MICRO = [8, 9] +else: + import crc + MICRO = [4] + + def test_python_version(): test.compare(sys.version_info.major,3) test.compare(sys.version_info.minor,6) - test.compare(sys.version_info.micro in [8,9], True) + + test.compare(sys.version_info.micro in MICRO, True) def test_crc8(): strByte1 = ( "4B 43 09 00 14 00 00" @@ -57,7 +66,7 @@ "00 00" #7F ) - test.compare(calcCRC8(strByte1, ' '), '9D') - test.compare(calcCRC8(strByte2, ' '), '55') - test.compare(calcCRC8(strByte3, ' '), '4F') - test.compare(calcCRC8(strByte4, ' '), '7F') + test.compare(crc.calcCRC8(strByte1, ' '), '9D') + test.compare(crc.calcCRC8(strByte2, ' '), '55') + test.compare(crc.calcCRC8(strByte3, ' '), '4F') + test.compare(crc.calcCRC8(strByte4, ' '), '7F')