Skip to content

Commit 94027ca

Browse files
authored
Merge pull request #46 from nioinnovation/issue45-digimesh-p3
Fix Issue #45 DigiMesh Python 3 Support
2 parents 56699b1 + 62eed80 commit 94027ca

1 file changed

Lines changed: 122 additions & 104 deletions

File tree

xbee/digimesh.py

Lines changed: 122 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -14,124 +14,142 @@
1414

1515
class DigiMesh(XBeeBase):
1616
"""
17-
Provides an implementation of the XBee API for Digimesh modules
17+
Provides an implementation of the XBee API for DigiMesh modules
1818
with recent firmware.
1919
20-
Commands may be sent to a device by instansiating this class with
20+
Commands may be sent to a device by instantiating this class with
2121
a serial port object (see PySerial) and then calling the send
2222
method with the proper information specified by the API. Data may
23-
be read from a device syncronously by calling wait_read_frame. For
23+
be read from a device synchronously by calling wait_read_frame. For
2424
asynchronous reads, see the definition of XBeeBase.
2525
"""
2626
# Packets which can be sent to an XBee
2727

2828
# Format:
29-
# {name of command:
30-
# [{name:field name, len:field length, default: default value sent}
31-
# ...
32-
# ]
33-
# ...
34-
# }
35-
api_commands = {"at":
36-
[{'name':'id', 'len':1, 'default':'\x08'},
37-
{'name':'frame_id', 'len':1, 'default':'\x00'},
38-
{'name':'command', 'len':2, 'default':None},
39-
{'name':'parameter', 'len':None, 'default':None}],
40-
"queued_at":
41-
[{'name':'id', 'len':1, 'default':'\x09'},
42-
{'name':'frame_id', 'len':1, 'default':'\x00'},
43-
{'name':'command', 'len':2, 'default':None},
44-
{'name':'parameter', 'len':None, 'default':None}],
45-
# todo: Explicit Adrresing Command Frame
46-
"remote_at":
47-
[{'name':'id', 'len':1, 'default':'\x17'},
48-
{'name':'frame_id', 'len':1, 'default':'\x00'},
49-
{'name':'dest_addr_long', 'len':8, 'default':None},
50-
{'name':'reserved', 'len':2, 'default':'\xFF\xFE'},
51-
{'name':'options', 'len':1, 'default':'\x02'},
52-
{'name':'command', 'len':2, 'default':None},
53-
{'name':'parameter', 'len':None, 'default':None}],
54-
"tx":
55-
[{'name':'id', 'len':1, 'default':'\x10'},
56-
{'name':'frame_id', 'len':1, 'default':'\x00'},
57-
{'name':'dest_addr', 'len':8, 'default':None},
58-
{'name':'reserved', 'len':2, 'default':'\xFF\xFE'},
59-
{'name':'broadcast_radius', 'len':1, 'default':'\x00'},
60-
{'name':'options', 'len':1, 'default':'\x00'},
61-
{'name':'data', 'len':None, 'default':None}],
62-
63-
}
29+
# {
30+
# name of command: [
31+
# {name: field name, len: field length, default: default value sent}
32+
# ...
33+
# ]
34+
# ...
35+
# }
36+
api_commands = {
37+
"at": [
38+
{'name': 'id', 'len': 1, 'default': b'\x08'},
39+
{'name': 'frame_id', 'len': 1, 'default': b'\x00'},
40+
{'name': 'command', 'len': 2, 'default': None},
41+
{'name': 'parameter', 'len': None, 'default': None}
42+
],
43+
"queued_at": [
44+
{'name': 'id', 'len': 1, 'default': b'\x09'},
45+
{'name': 'frame_id', 'len': 1, 'default': b'\x00'},
46+
{'name': 'command', 'len': 2, 'default': None},
47+
{'name': 'parameter', 'len': None, 'default': None}
48+
],
49+
# todo: Explicit Adrresing Command Frame
50+
"remote_at": [
51+
{'name': 'id', 'len': 1, 'default': b'\x17'},
52+
{'name': 'frame_id', 'len': 1, 'default': b'\x00'},
53+
{'name': 'dest_addr_long', 'len': 8, 'default': None},
54+
{'name': 'reserved', 'len': 2, 'default': b'\xFF\xFE'},
55+
{'name': 'options', 'len': 1, 'default': b'\x02'},
56+
{'name': 'command', 'len': 2, 'default': None},
57+
{'name': 'parameter', 'len': None, 'default': None}
58+
],
59+
"tx": [
60+
{'name': 'id', 'len': 1, 'default': b'\x10'},
61+
{'name': 'frame_id', 'len': 1, 'default': b'\x00'},
62+
{'name': 'dest_addr' , 'len': 8, 'default': None},
63+
{'name': 'reserved', 'len': 2, 'default': b'\xFF\xFE'},
64+
{'name': 'broadcast_radius', 'len': 1, 'default': b'\x00'},
65+
{'name': 'options', 'len': 1, 'default': b'\x00'},
66+
{'name': 'data', 'len': None, 'default': None}
67+
]
68+
}
6469

6570
# Packets which can be received from an XBee
6671

6772
# Format:
68-
# {id byte received from XBee:
69-
# {name: name of response
70-
# structure:
71-
# [ {'name': name of field, 'len':length of field}
72-
# ...
73-
# ]
74-
# parse_as_io_samples:name of field to parse as io
75-
# }
76-
# ...
77-
# }
78-
#
79-
api_responses = {b"\x88":
80-
{'name':'at_response',
81-
'structure':
82-
[{'name':'frame_id', 'len':1},
83-
{'name':'command', 'len':2},
84-
{'name':'status', 'len':1},
85-
{'name':'parameter', 'len':None}]},
86-
b"\x8a":
87-
{'name':'status',
88-
'structure':
89-
[{'name':'status', 'len':1}]},
90-
b"\x8b":
91-
{'name':'tx_status',
92-
'structure':
93-
[{'name':'frame_id', 'len':1},
94-
{'name':'reserved', 'len':2, 'default':'\xFF\xFE'},
95-
{'name':'retries', 'len':1},
96-
{'name':'deliver_status', 'len':1},
97-
{'name':'discover_status', 'len':1}]},
98-
b"\x90":
99-
{'name':'rx',
100-
'structure':
101-
[{'name':'source_addr', 'len':8},
102-
{'name':'reserved', 'len':2},
103-
{'name':'options', 'len':1},
104-
{'name':'data', 'len':None}]},
105-
# todo: Explicit RX Indicator
106-
# b"\x91":
107-
# {'name':'explicit_rx_indicator',
108-
# 'structure':
109-
# [{'name':'source_addr', 'len':2},
110-
# {'name':'rssi', 'len':1},
111-
# {'name':'options', 'len':1},
112-
# {'name':'rf_data', 'len':None}]},
113-
b"\x95":
114-
{'name':'node_id',
115-
'structure':
116-
[{'name':'source_addr_long', 'len':8},
117-
{'name':'network_addr', 'len':2},
118-
{'name':'options', 'len':1},
119-
{'name':'source_addr', 'len':2},
120-
{'name':'network_addr_long', 'len':8},
121-
{'name':'node_id', 'len':'null_terminated'},
122-
{'name':'parent', 'len':2},
123-
{'name':'unknown', 'len':None}]},
73+
# {
74+
# id byte received from XBee: {
75+
# name: name of response
76+
# structure: [
77+
# {'name': name of field, 'len': length of field}
78+
# ...
79+
# ]
80+
# parse_as_io_samples: name of field to parse as io
81+
# }
82+
# ...
83+
# }
84+
api_responses = {
85+
b'\x88': {
86+
'name': 'at_response',
87+
'structure': [
88+
{'name': 'frame_id', 'len': 1},
89+
{'name': 'command', 'len': 2},
90+
{'name': 'status', 'len': 1},
91+
{'name': 'parameter', 'len': None}
92+
]
93+
},
94+
b'\x8a': {
95+
'name': 'status',
96+
'structure': [
97+
{'name': 'status', 'len': 1}
98+
]
99+
},
100+
b'\x8b': {
101+
'name': 'tx_status',
102+
'structure': [
103+
{'name': 'frame_id', 'len': 1},
104+
{'name': 'reserved', 'len': 2, 'default': b'\xFF\xFE'},
105+
{'name': 'retries', 'len': 1},
106+
{'name': 'deliver_status', 'len': 1},
107+
{'name': 'discover_status', 'len': 1}
108+
]
109+
},
110+
b'\x90': {
111+
'name': 'rx',
112+
'structure': [
113+
{'name': 'source_addr', 'len': 8},
114+
{'name': 'reserved', 'len': 2},
115+
{'name': 'options', 'len': 1},
116+
{'name': 'data', 'len': None}
117+
]
118+
},
119+
# todo: Explicit RX Indicator
120+
# b'\x91': {
121+
# 'name': 'explicit_rx_indicator',
122+
# 'structure': [
123+
# {'name': 'source_addr', 'len': 2},
124+
# {'name': 'rssi', 'len': 1},
125+
# {'name': 'options', 'len': 1},
126+
# {'name': 'rf_data', 'len': None}
127+
# ]
128+
# },
129+
b'\x95': {
130+
'name':'node_id',
131+
'structure': [
132+
{'name': 'source_addr_long', 'len': 8},
133+
{'name': 'network_addr', 'len': 2},
134+
{'name': 'options', 'len': 1},
135+
{'name': 'source_addr', 'len': 2},
136+
{'name': 'network_addr_long', 'len': 8},
137+
{'name': 'node_id', 'len': 'null_terminated'},
138+
{'name': 'parent', 'len': 2},
139+
{'name': 'unknown', 'len': None}]},
124140

125-
b"\x97":
126-
{'name':'remote_at_response',
127-
'structure':
128-
[{'name':'frame_id', 'len':1},
129-
{'name':'source_addr', 'len':8},
130-
{'name':'reserved', 'len':2},
131-
{'name':'command', 'len':2},
132-
{'name':'status', 'len':1},
133-
{'name':'parameter', 'len':None}]}
134-
}
141+
b'\x97': {
142+
'name':'remote_at_response',
143+
'structure': [
144+
{'name': 'frame_id', 'len': 1},
145+
{'name': 'source_addr', 'len': 8},
146+
{'name': 'reserved', 'len': 2},
147+
{'name': 'command', 'len': 2},
148+
{'name': 'status', 'len': 1},
149+
{'name': 'parameter', 'len': None}
150+
]
151+
}
152+
}
135153

136154
def __init__(self, *args, **kwargs):
137155
# Call the super class constructor to save the serial port

0 commit comments

Comments
 (0)