+ pass
+
+ # Converters
+ @staticmethod
+ def findCode(dataMap, name):
+ for code in dataMap:
+ if dataMap[code] == name:
+ return code
+ print("[ERROR] No code found")
+
+ # Parse frame
+ def parse(self, byte):
+ # save current pos and increment read index
+ # if we have an error we cna reset index below
+ pos = self.index
+ self.index += 1
+
+ if pos == Frame.HEADER_POS:
+ if ord(byte) != Frame.HEADER:
+ self.index = 0
+ #print('parse: header %02x' % ord(byte))
+
+ elif pos == Frame.BITS_POS:
+ self.bits_sns = (ord(byte) & Frame.SNS_MASK) >> Frame.SNS_SHIFT
+ self.bits_typ = (ord(byte) & Frame.TYP_MASK) >> Frame.TYP_SHIFT
+ if self.bits_sns >= Frame.SNS_NUM:
+ self.index = 0
+ if self.bits_typ >= Frame.TYP_NUM:
+ self.index = 0
+ #print('parse: bits sns=%d typ=%d' %
+ # (self.bits_sns, self.bits_typ))
+
+ elif pos == Frame.COUNT_POS:
+ wordsize = Frame.sizeMap[self.bits_typ]
+ self.count = ord(byte)
+ self.length = Frame.DATA_POS + self.count*wordsize + 1
+ #print('parse: count cnt=%d len=%d' %
+ # (self.count, self.length))
+
+ elif pos < self.length-1:
+ self.binary += byte
+ #print('parse: data %02x @%d' %
+ # (ord(byte), pos-Frame.DATA_POS))
+
+ elif pos == self.length-1:
+ #print('parse: tail %02x' % ord(byte))
+ if ord(byte) == Frame.TAIL:
+ state = self.convert()
+ else:
+ state = None
+ self.binary = ""
+ self.index = 0
+ return state
+
+ elif pos > self.length-1:
+ print('Error parsing')
+
+ # Convert frame to state
+ def convert(self):
+ # Covnert data
+ fmt = Frame.fmtMap[self.bits_typ] * self.count
+ sns = Frame.snsMap[self.bits_sns]
+ self.values = unpack('<'+fmt, self.binary)
+ print('convert: %3s = \'%3s\'%%[%s] -> [%s]' %
+ (sns, fmt, hexDump(self.binary), fltDump(self.values)))
+
+ # Create state
+ state = State()
+ setattr(state, sns, self.values)
+ return state