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.
@@ -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)
@@ -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,,