Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pymodbus/register_write_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ def execute(self, context):
if not context.validate(self.function_code, self.address, 1):
return self.doException(merror.IllegalAddress)
values = context.getValues(self.function_code, self.address, 1)[0]
values = (values & self.and_mask) | self.or_mask
values = (values & self.and_mask) | (self.or_mask & ~self.and_mask)
context.setValues(self.function_code, self.address, [values])
return MaskWriteRegisterResponse(self.address, self.and_mask, self.or_mask)

Expand Down
22 changes: 22 additions & 0 deletions test/modbus_mocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,28 @@ def setValues(self, fx, address, values):
"""Set values."""


class MockLastValuesContext(IModbusSlaveContext):
"""Mock context."""

def __init__(self, valid=False, default=True):
"""Initialize."""
self.valid = valid
self.default = default
self.last_values = []

def validate(self, fx, address, count=0):
"""Validate values."""
return self.valid

def getValues(self, fx, address, count=0):
"""Get values."""
return [self.default] * count

def setValues(self, fx, address, values):
"""Set values."""
self.last_values = values


class FakeList:
"""Todo, replace with magic mock."""

Expand Down
13 changes: 10 additions & 3 deletions test/test_register_write_messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
WriteSingleRegisterResponse,
)

from .modbus_mocks import MockContext
from .modbus_mocks import MockContext, MockLastValuesContext

# ---------------------------------------------------------------------------#
# Fixture
Expand Down Expand Up @@ -138,10 +138,17 @@ def test_mask_write_register_request_decode(self):

def test_mask_write_register_request_execute(self):
"""Test write register request valid execution"""
context = MockContext(valid=True, default=0x0000)
handle = MaskWriteRegisterRequest(0x0000, 0x0101, 0x1010)
# The test uses the 4 nibbles of the 16-bit values to test
# the combinations:
# and_mask=0, or_mask=0
# and_mask=F, or_mask=0
# and_mask=0, or_mask=F
# and_mask=F, or_mask=F
context = MockLastValuesContext(valid=True, default=0xAA55)
handle = MaskWriteRegisterRequest(0x0000, 0x0F0F, 0x00FF)
result = handle.execute(context)
self.assertTrue(isinstance(result, MaskWriteRegisterResponse))
self.assertEqual([0x0AF5], context.last_values)

def test_mask_write_register_request_invalid_execute(self):
"""Test write register request execute with invalid data"""
Expand Down