@@ -53,12 +53,6 @@ def __init__(self, decoder, client=None):
53
53
self ._end = b"\x7d " # }
54
54
self ._repeat = [b"}" [0 ], b"{" [0 ]] # python3 hack
55
55
56
- # ----------------------------------------------------------------------- #
57
- # Private Helper Functions
58
- # ----------------------------------------------------------------------- #
59
- def _process (self , callback , error = False ):
60
- """Process incoming packets irrespective error condition."""
61
-
62
56
def decode_data (self , data ):
63
57
"""Decode data."""
64
58
if len (data ) > self ._hsize :
@@ -67,76 +61,45 @@ def decode_data(self, data):
67
61
return {"slave" : uid , "fcode" : fcode }
68
62
return {}
69
63
70
- def checkFrame (self ) -> bool :
71
- """Check and decode the next frame.
72
-
73
- :returns: True if we are successful, False otherwise
74
- """
75
- start = self ._buffer .find (self ._start )
76
- if start == - 1 :
77
- return False
78
- if start > 0 : # go ahead and skip old bad data
79
- self ._buffer = self ._buffer [start :]
80
-
81
- if (end := self ._buffer .find (self ._end )) != - 1 :
82
- self ._header ["len" ] = end
83
- self ._header ["uid" ] = struct .unpack (">B" , self ._buffer [1 :2 ])[0 ]
84
- self ._header ["crc" ] = struct .unpack (">H" , self ._buffer [end - 2 : end ])[0 ]
85
- data = self ._buffer [1 : end - 2 ]
86
- return checkCRC (data , self ._header ["crc" ])
87
- return False
88
-
89
- def advanceFrame (self ) -> None :
90
- """Skip over the current framed message.
91
-
92
- This allows us to skip over the current message after we have processed
93
- it or determined that it contains an error. It also has to reset the
94
- current frame header handle
95
- """
96
- self ._buffer = self ._buffer [self ._header ["len" ] + 2 :]
97
- self ._header = {"crc" : 0x0000 , "len" : 0 , "uid" : 0x00 }
98
-
99
- def isFrameReady (self ) -> bool :
100
- """Check if we should continue decode logic.
101
-
102
- This is meant to be used in a while loop in the decoding phase to let
103
- the decoder know that there is still data in the buffer.
104
-
105
- :returns: True if ready, False otherwise
106
- """
107
- return len (self ._buffer ) > 1
108
-
109
- def getFrame (self ):
110
- """Get the next frame from the buffer.
111
-
112
- :returns: The frame data or ""
113
- """
114
- start = self ._hsize + 1
115
- end = self ._header ["len" ] - 2
116
- buffer = self ._buffer [start :end ]
117
- if end > 0 :
118
- return buffer
119
- return b""
120
-
121
- # ----------------------------------------------------------------------- #
122
- # Public Member Functions
123
- # ----------------------------------------------------------------------- #
124
64
def frameProcessIncomingPacket (self , single , callback , slave , _tid = None , ** kwargs ):
125
65
"""Process new packet pattern."""
126
- while self .isFrameReady ():
127
- if not self .checkFrame ():
66
+ def check_frame (self ) -> bool :
67
+ """Check and decode the next frame."""
68
+ start = self ._buffer .find (self ._start )
69
+ if start == - 1 :
70
+ return False
71
+ if start > 0 : # go ahead and skip old bad data
72
+ self ._buffer = self ._buffer [start :]
73
+
74
+ if (end := self ._buffer .find (self ._end )) != - 1 :
75
+ self ._header ["len" ] = end
76
+ self ._header ["uid" ] = struct .unpack (">B" , self ._buffer [1 :2 ])[0 ]
77
+ self ._header ["crc" ] = struct .unpack (">H" , self ._buffer [end - 2 : end ])[0 ]
78
+ data = self ._buffer [1 : end - 2 ]
79
+ return checkCRC (data , self ._header ["crc" ])
80
+ return False
81
+
82
+ while len (self ._buffer ) > 1 :
83
+ if not check_frame (self ):
128
84
Log .debug ("Frame check failed, ignoring!!" )
129
- self .resetFrame ()
130
85
break
131
86
if not self ._validate_slave_id (slave , single ):
132
87
header_txt = self ._header ["uid" ]
133
88
Log .debug ("Not a valid slave id - {}, ignoring!!" , header_txt )
134
89
self .resetFrame ()
135
90
break
136
- if (result := self .decoder .decode (self .getFrame ())) is None :
91
+ start = self ._hsize + 1
92
+ end = self ._header ["len" ] - 2
93
+ buffer = self ._buffer [start :end ]
94
+ if end > 0 :
95
+ frame = buffer
96
+ else :
97
+ frame = b""
98
+ if (result := self .decoder .decode (frame )) is None :
137
99
raise ModbusIOException ("Unable to decode response" )
138
100
self .populateResult (result )
139
- self .advanceFrame ()
101
+ self ._buffer = self ._buffer [self ._header ["len" ] + 2 :]
102
+ self ._header = {"crc" : 0x0000 , "len" : 0 , "uid" : 0x00 }
140
103
callback (result ) # defer or push to a thread?
141
104
142
105
def buildPacket (self , message ):
0 commit comments