swarmit 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dotbot-firmware/doc/sphinx/conf.py +191 -0
- {swarmit-0.2.0.dist-info → swarmit-0.3.0.dist-info}/METADATA +4 -2
- swarmit-0.3.0.dist-info/RECORD +12 -0
- {swarmit-0.2.0.dist-info → swarmit-0.3.0.dist-info}/WHEEL +1 -1
- testbed/cli/main.py +293 -527
- testbed/swarmit/__init__.py +1 -0
- testbed/swarmit/adapter.py +94 -0
- testbed/swarmit/controller.py +620 -0
- testbed/swarmit/protocol.py +292 -0
- swarmit-0.2.0.dist-info/RECORD +0 -7
- {swarmit-0.2.0.dist-info → swarmit-0.3.0.dist-info}/entry_points.txt +0 -0
- {swarmit-0.2.0.dist-info → swarmit-0.3.0.dist-info}/licenses/AUTHORS +0 -0
- {swarmit-0.2.0.dist-info → swarmit-0.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,292 @@
|
|
1
|
+
"""Swarmit protocol definition."""
|
2
|
+
|
3
|
+
import dataclasses
|
4
|
+
from dataclasses import dataclass
|
5
|
+
from enum import Enum, IntEnum
|
6
|
+
|
7
|
+
from dotbot.protocol import Packet, PacketFieldMetadata, register_parser
|
8
|
+
|
9
|
+
|
10
|
+
class StatusType(Enum):
|
11
|
+
"""Types of device status."""
|
12
|
+
|
13
|
+
Bootloader = 0
|
14
|
+
Running = 1
|
15
|
+
Stopping = 2
|
16
|
+
Resetting = 3
|
17
|
+
|
18
|
+
|
19
|
+
class SwarmitPayloadType(IntEnum):
|
20
|
+
"""Types of DotBot payload types."""
|
21
|
+
|
22
|
+
# Requests
|
23
|
+
SWARMIT_REQUEST_STATUS = 0x80
|
24
|
+
SWARMIT_REQUEST_START = 0x81
|
25
|
+
SWARMIT_REQUEST_STOP = 0x82
|
26
|
+
SWARMIT_REQUEST_RESET = 0x83
|
27
|
+
SWARMIT_REQUEST_OTA_START = 0x84
|
28
|
+
SWARMIT_REQUEST_OTA_CHUNK = 0x85
|
29
|
+
|
30
|
+
# Notifications
|
31
|
+
SWARMIT_NOTIFICATION_STATUS = 0x90
|
32
|
+
SWARMIT_NOTIFICATION_STARTED = 0x91
|
33
|
+
SWARMIT_NOTIFICATION_STOPPED = 0x92
|
34
|
+
SWARMIT_NOTIFICATION_OTA_START_ACK = 0x93
|
35
|
+
SWARMIT_NOTIFICATION_OTA_CHUNK_ACK = 0x94
|
36
|
+
SWARMIT_NOTIFICATION_EVENT_GPIO = 0x95
|
37
|
+
SWARMIT_NOTIFICATION_EVENT_LOG = 0x96
|
38
|
+
|
39
|
+
# Custom messages
|
40
|
+
SWARMIT_MESSAGE = 0xA0
|
41
|
+
|
42
|
+
|
43
|
+
# Requests
|
44
|
+
|
45
|
+
|
46
|
+
@dataclass
|
47
|
+
class PayloadRequest(Packet):
|
48
|
+
"""Dataclass that holds an application request packet (start/stop/status)."""
|
49
|
+
|
50
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
51
|
+
default_factory=lambda: [
|
52
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
53
|
+
]
|
54
|
+
)
|
55
|
+
|
56
|
+
device_id: int = 0x0000000000000000
|
57
|
+
|
58
|
+
|
59
|
+
@dataclass
|
60
|
+
class PayloadStatusRequest(PayloadRequest):
|
61
|
+
"""Dataclass that holds an application status request packet."""
|
62
|
+
|
63
|
+
|
64
|
+
@dataclass
|
65
|
+
class PayloadStartRequest(PayloadRequest):
|
66
|
+
"""Dataclass that holds an application start request packet."""
|
67
|
+
|
68
|
+
|
69
|
+
@dataclass
|
70
|
+
class PayloadStopRequest(PayloadRequest):
|
71
|
+
"""Dataclass that holds an application stop request packet."""
|
72
|
+
|
73
|
+
|
74
|
+
@dataclass
|
75
|
+
class PayloadResetRequest(Packet):
|
76
|
+
"""Dataclass that holds an application reset request packet."""
|
77
|
+
|
78
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
79
|
+
default_factory=lambda: [
|
80
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
81
|
+
PacketFieldMetadata(name="pos_x", length=4),
|
82
|
+
PacketFieldMetadata(name="pos_y", length=4),
|
83
|
+
]
|
84
|
+
)
|
85
|
+
|
86
|
+
device_id: int = 0
|
87
|
+
pos_x: int = 0
|
88
|
+
pos_y: int = 0
|
89
|
+
|
90
|
+
|
91
|
+
@dataclass
|
92
|
+
class PayloadOTAStartRequest(Packet):
|
93
|
+
"""Dataclass that holds an OTA start packet."""
|
94
|
+
|
95
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
96
|
+
default_factory=lambda: [
|
97
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
98
|
+
PacketFieldMetadata(name="fw_length", disp="len.", length=4),
|
99
|
+
PacketFieldMetadata(
|
100
|
+
name="fw_chunk_counts", disp="chunks", length=4
|
101
|
+
),
|
102
|
+
PacketFieldMetadata(
|
103
|
+
name="fw_hash", disp="hash.", type_=bytes, length=32
|
104
|
+
),
|
105
|
+
]
|
106
|
+
)
|
107
|
+
|
108
|
+
device_id: int = 0x0000000000000000
|
109
|
+
fw_length: int = 0
|
110
|
+
fw_chunk_count: int = 0
|
111
|
+
fw_hash: bytes = dataclasses.field(default_factory=lambda: bytearray)
|
112
|
+
|
113
|
+
|
114
|
+
@dataclass
|
115
|
+
class PayloadOTAChunkRequest(Packet):
|
116
|
+
"""Dataclass that holds an OTA chunk packet."""
|
117
|
+
|
118
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
119
|
+
default_factory=lambda: [
|
120
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
121
|
+
PacketFieldMetadata(name="index", disp="idx", length=4),
|
122
|
+
PacketFieldMetadata(name="count", disp="size"),
|
123
|
+
PacketFieldMetadata(name="chunk", type_=bytes, length=0),
|
124
|
+
]
|
125
|
+
)
|
126
|
+
|
127
|
+
device_id: int = 0x0000000000000000
|
128
|
+
index: int = 0
|
129
|
+
count: int = 0
|
130
|
+
chunk: bytes = dataclasses.field(default_factory=lambda: bytearray)
|
131
|
+
|
132
|
+
|
133
|
+
# Notifications
|
134
|
+
|
135
|
+
|
136
|
+
@dataclass
|
137
|
+
class PayloadStatusNotification(Packet):
|
138
|
+
"""Dataclass that holds an application status notification packet."""
|
139
|
+
|
140
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
141
|
+
default_factory=lambda: [
|
142
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
143
|
+
PacketFieldMetadata(name="status", disp="st."),
|
144
|
+
]
|
145
|
+
)
|
146
|
+
|
147
|
+
device_id: int = 0x0000000000000000
|
148
|
+
status: StatusType = StatusType.Bootloader
|
149
|
+
|
150
|
+
|
151
|
+
@dataclass
|
152
|
+
class PayloadStartedNotification(Packet):
|
153
|
+
"""Dataclass that holds an application started notification packet."""
|
154
|
+
|
155
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
156
|
+
default_factory=lambda: [
|
157
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
158
|
+
]
|
159
|
+
)
|
160
|
+
|
161
|
+
device_id: int = 0x0000000000000000
|
162
|
+
|
163
|
+
|
164
|
+
@dataclass
|
165
|
+
class PayloadStoppedNotification(Packet):
|
166
|
+
"""Dataclass that holds an application stopped notification packet."""
|
167
|
+
|
168
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
169
|
+
default_factory=lambda: [
|
170
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
171
|
+
]
|
172
|
+
)
|
173
|
+
|
174
|
+
device_id: int = 0x0000000000000000
|
175
|
+
|
176
|
+
|
177
|
+
@dataclass
|
178
|
+
class PayloadOTAStartAckNotification(Packet):
|
179
|
+
"""Dataclass that holds an application OTA start ACK notification packet."""
|
180
|
+
|
181
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
182
|
+
default_factory=lambda: [
|
183
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
184
|
+
]
|
185
|
+
)
|
186
|
+
|
187
|
+
device_id: int = 0x0000000000000000
|
188
|
+
|
189
|
+
|
190
|
+
@dataclass
|
191
|
+
class PayloadOTAChunkAckNotification(Packet):
|
192
|
+
"""Dataclass that holds an application OTA chunk ACK notification packet."""
|
193
|
+
|
194
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
195
|
+
default_factory=lambda: [
|
196
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
197
|
+
PacketFieldMetadata(name="index", disp="idx", length=4),
|
198
|
+
PacketFieldMetadata(name="hashes_match", disp="match"),
|
199
|
+
]
|
200
|
+
)
|
201
|
+
|
202
|
+
device_id: int = 0x0000000000000000
|
203
|
+
index: int = 0
|
204
|
+
hashes_match: int = 0
|
205
|
+
|
206
|
+
|
207
|
+
@dataclass
|
208
|
+
class PayloadEventNotification(Packet):
|
209
|
+
"""Dataclass that holds an event notification packet."""
|
210
|
+
|
211
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
212
|
+
default_factory=lambda: [
|
213
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
214
|
+
PacketFieldMetadata(name="timestamp", disp="ts", length=4),
|
215
|
+
PacketFieldMetadata(name="count", disp="len."),
|
216
|
+
PacketFieldMetadata(
|
217
|
+
name="data", disp="data", type_=bytes, length=0
|
218
|
+
),
|
219
|
+
]
|
220
|
+
)
|
221
|
+
|
222
|
+
device_id: int = 0x0000000000000000
|
223
|
+
timestamp: int = 0
|
224
|
+
count: int = 0
|
225
|
+
data: bytes = dataclasses.field(default_factory=lambda: bytearray)
|
226
|
+
|
227
|
+
|
228
|
+
@dataclass
|
229
|
+
class PayloadMessage(Packet):
|
230
|
+
"""Dataclass that holds a message packet."""
|
231
|
+
|
232
|
+
metadata: list[PacketFieldMetadata] = dataclasses.field(
|
233
|
+
default_factory=lambda: [
|
234
|
+
PacketFieldMetadata(name="device_id", disp="id", length=8),
|
235
|
+
PacketFieldMetadata(name="count", disp="len."),
|
236
|
+
PacketFieldMetadata(
|
237
|
+
name="message", disp="msg", type_=bytes, length=0
|
238
|
+
),
|
239
|
+
]
|
240
|
+
)
|
241
|
+
|
242
|
+
device_id: int = 0x0000000000000000
|
243
|
+
count: int = 0
|
244
|
+
message: bytes = dataclasses.field(default_factory=lambda: bytearray)
|
245
|
+
|
246
|
+
|
247
|
+
def register_parsers():
|
248
|
+
# Register all swarmit specific parsers at module level
|
249
|
+
register_parser(
|
250
|
+
SwarmitPayloadType.SWARMIT_REQUEST_STATUS,
|
251
|
+
PayloadStatusRequest,
|
252
|
+
)
|
253
|
+
register_parser(
|
254
|
+
SwarmitPayloadType.SWARMIT_REQUEST_START, PayloadStartRequest
|
255
|
+
)
|
256
|
+
register_parser(
|
257
|
+
SwarmitPayloadType.SWARMIT_REQUEST_STOP, PayloadStopRequest
|
258
|
+
)
|
259
|
+
register_parser(
|
260
|
+
SwarmitPayloadType.SWARMIT_REQUEST_RESET, PayloadResetRequest
|
261
|
+
)
|
262
|
+
register_parser(
|
263
|
+
SwarmitPayloadType.SWARMIT_REQUEST_OTA_START, PayloadOTAStartRequest
|
264
|
+
)
|
265
|
+
register_parser(
|
266
|
+
SwarmitPayloadType.SWARMIT_REQUEST_OTA_CHUNK, PayloadOTAChunkRequest
|
267
|
+
)
|
268
|
+
register_parser(
|
269
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_STATUS,
|
270
|
+
PayloadStatusNotification,
|
271
|
+
)
|
272
|
+
register_parser(
|
273
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_STARTED,
|
274
|
+
PayloadStartedNotification,
|
275
|
+
)
|
276
|
+
register_parser(
|
277
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_STOPPED,
|
278
|
+
PayloadStoppedNotification,
|
279
|
+
)
|
280
|
+
register_parser(
|
281
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_OTA_START_ACK,
|
282
|
+
PayloadOTAStartAckNotification,
|
283
|
+
)
|
284
|
+
register_parser(
|
285
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_OTA_CHUNK_ACK,
|
286
|
+
PayloadOTAChunkAckNotification,
|
287
|
+
)
|
288
|
+
register_parser(
|
289
|
+
SwarmitPayloadType.SWARMIT_NOTIFICATION_EVENT_LOG,
|
290
|
+
PayloadEventNotification,
|
291
|
+
)
|
292
|
+
register_parser(SwarmitPayloadType.SWARMIT_MESSAGE, PayloadMessage)
|
swarmit-0.2.0.dist-info/RECORD
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
testbed/cli/main.py,sha256=_mZJx_W549A_5FVMylU0jNXvCG_6cAcDj2fRMAoU65o,19689
|
2
|
-
swarmit-0.2.0.dist-info/METADATA,sha256=OkItUGFQ29DNW2xHUkOZLwYG0Mj9smwnmY9vjIlAt2Q,3279
|
3
|
-
swarmit-0.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
4
|
-
swarmit-0.2.0.dist-info/entry_points.txt,sha256=R6BGQe6I1FcI5B2jo7Dr-Gh6-Rjn1Ykx3uAGuV5rVTo,50
|
5
|
-
swarmit-0.2.0.dist-info/licenses/AUTHORS,sha256=o2cH3J5JkbZssK_1zYj0m8PHiGiILV0lySR6_hoWKK0,45
|
6
|
-
swarmit-0.2.0.dist-info/licenses/LICENSE,sha256=j97C1uBc5chpQWi4bv_2SrqExuvKaJK2Ch6L2LFkoc4,1492
|
7
|
-
swarmit-0.2.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|