@@ -35,7 +35,7 @@ def __init__(self, decoder, client=None):
3535 """
3636 super ().__init__ (decoder , client )
3737 self ._hsize = 0x0
38- self .message_encoder = MessageTLS ([0 ], True )
38+ self .message_handler = MessageTLS ([0 ], True )
3939
4040 def decode_data (self , data ):
4141 """Decode data."""
@@ -47,38 +47,34 @@ def decode_data(self, data):
4747 def frameProcessIncomingPacket (self , single , callback , slave , _tid = None , ** kwargs ):
4848 """Process new packet pattern."""
4949 # no slave id for Modbus Security Application Protocol
50- def check_frame (self ):
51- """Check and decode the next frame."""
52- if len (self ._buffer ) > self ._hsize :
53- # we have at least a complete message, continue
54- if len (self ._buffer ) - self ._hsize >= 1 :
55- return True
56- # we don't have enough of a message yet, wait
57- return False
58-
59- if not len (self ._buffer ) > self ._hsize :
60- return
61- if not check_frame (self ):
62- Log .debug ("Frame check failed, ignoring!!" )
63- self .resetFrame ()
64- return
65- if not self ._validate_slave_id (slave , single ):
66- Log .debug ("Not in valid slave id - {}, ignoring!!" , slave )
67- self .resetFrame ()
68- return
69- data = self ._buffer [self ._hsize :]
70- if (result := self .decoder .decode (data )) is None :
71- raise ModbusIOException ("Unable to decode request" )
72- self .populateResult (result )
73- self ._buffer = b""
74- self ._header = {}
75- callback (result ) # defer or push to a thread?
50+
51+ while True :
52+ used_len , use_tid , dev_id , data = self .message_handler .decode (self ._buffer )
53+ if not data :
54+ if not used_len :
55+ return
56+ self ._buffer = self ._buffer [used_len :]
57+ continue
58+ self ._header ["uid" ] = dev_id
59+ self ._header ["tid" ] = use_tid
60+ self ._header ["pid" ] = 0
61+
62+ if not self ._validate_slave_id (slave , single ):
63+ Log .debug ("Not in valid slave id - {}, ignoring!!" , slave )
64+ self .resetFrame ()
65+ return
66+ if (result := self .decoder .decode (data )) is None :
67+ raise ModbusIOException ("Unable to decode request" )
68+ self .populateResult (result )
69+ self ._buffer = b""
70+ self ._header = {}
71+ callback (result ) # defer or push to a thread?
7672
7773 def buildPacket (self , message ):
7874 """Create a ready to send modbus packet.
7975
8076 :param message: The populated request/response to send
8177 """
8278 data = message .function_code .to_bytes (1 ,'big' ) + message .encode ()
83- packet = self .message_encoder .encode (data , message .slave_id , message .transaction_id )
79+ packet = self .message_handler .encode (data , message .slave_id , message .transaction_id )
8480 return packet
0 commit comments