You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

79 lines
2.3 KiB

# See LICENSE
class PortAddress(object):
def __init__(self, dest_port, orig_port, eight_bits):
self.dest_port = dest_port
self.orig_port = orig_port
self.eight_bits = eight_bits
def __repr__(self):
args = (self.dest_port, self.orig_port)
return "<PortAddress dest_port: %d orig_port: %d>" % args
class ConcatReference(object):
def __init__(self, ref, cnt, seq, eight_bits):
self.ref = ref
self.cnt = cnt
self.seq = seq
self.eight_bits = eight_bits
def __repr__(self):
args = (self.ref, self.cnt, self.seq)
return "<ConcatReference ref: %d cnt: %d seq: %d>" % args
class UserDataHeader(object):
def __init__(self):
self.concat = None
self.ports = None
self.headers = {}
def __repr__(self):
args = (self.headers, self.concat, self.ports)
return "<UserDataHeader data: %s concat: %s ports: %s>" % args
@classmethod
def from_status_report_ref(cls, ref):
udh = cls()
udh.concat = ConcatReference(ref, 0, 0, True)
return udh
@classmethod
def from_bytes(cls, data):
udh = cls()
while len(data):
iei = data.pop(0)
ie_len = data.pop(0)
ie_data = data[:ie_len]
data = data[ie_len:]
udh.headers[iei] = ie_data
if iei == 0x00:
# process SM concatenation 8bit ref.
ref, cnt, seq = ie_data
udh.concat = ConcatReference(ref, cnt, seq, True)
if iei == 0x08:
# process SM concatenation 16bit ref.
ref = ie_data[0] << 8 | ie_data[1]
cnt = ie_data[2]
seq = ie_data[3]
udh.concat = ConcatReference(ref, cnt, seq, False)
elif iei == 0x04:
# process App port addressing 8bit
dest_port, orig_port = ie_data
udh.ports = PortAddress(dest_port, orig_port, False)
elif iei == 0x05:
# process App port addressing 16bit
dest_port = ie_data[0] << 8 | ie_data[1]
orig_port = ie_data[2] << 8 | ie_data[3]
udh.ports = PortAddress(dest_port, orig_port, False)
return udh