Skip to content

Commit 74cc41d

Browse files
committed
update
1 parent 89fef2b commit 74cc41d

File tree

1 file changed

+83
-60
lines changed

1 file changed

+83
-60
lines changed

extensions_v2/extension_arduino_uno.py

+83-60
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
1-
# https://github.com/MrYsLab/s3-extend/blob/master/s3_extend/gateways/arduino_gateway.pys
2-
# 作为node运行
3-
# 上报数据 关注: publish_payload,callback
4-
# python3.7
51
import argparse
62
import asyncio
73
import logging
84
import pathlib
95
import sys
106
import functools
117

12-
from codelab_adapter.utils import TokenBucket
13-
8+
from codelab_adapter.utils import TokenBucket
149

1510
from pymata_express.private_constants import PrivateConstants
1611
from pymata_express.pymata_express import PymataExpress
@@ -25,10 +20,12 @@ class ArduinoGateway(GatewayBaseAIO):
2520

2621
# NOTE: This class requires the use of Python 3.7 or above
2722

28-
# serial_port = None
29-
30-
def __init__(self, event_loop=None, com_port=None,
31-
arduino_instance_id=None, keep_alive=False, log=True):
23+
def __init__(self,
24+
event_loop=None,
25+
com_port=None,
26+
arduino_instance_id=None,
27+
keep_alive=False,
28+
log=True):
3229
self.bucket = TokenBucket(10, 5)
3330
self.EXTENSION_ID = "eim/arduino"
3431
# set the event loop to be used. accept user's if provided
@@ -47,8 +44,9 @@ def __init__(self, event_loop=None, com_port=None,
4744
com_port=com_port)
4845
# if user wants to set an instance id, then pass it in
4946
elif arduino_instance_id:
50-
self.arduino = PymataExpress(loop=self.event_loop,
51-
arduino_instance_id=arduino_instance_id)
47+
self.arduino = PymataExpress(
48+
loop=self.event_loop,
49+
arduino_instance_id=arduino_instance_id)
5250
# default settings
5351
else:
5452
self.arduino = PymataExpress(loop=self.event_loop)
@@ -65,11 +63,10 @@ def __init__(self, event_loop=None, com_port=None,
6563

6664
# Initialize the parent
6765
super().__init__()
68-
6966

7067
self.first_analog_pin = self.arduino.first_analog_pin
7168
self.keep_alive = keep_alive
72-
69+
7370
# self.event_loop.create_task(pub_notification_coroutine)
7471

7572
def init_pins_dictionary(self):
@@ -80,7 +77,8 @@ def init_pins_dictionary(self):
8077
8178
NOTE: that this a a non-asyncio method.
8279
"""
83-
report = self.event_loop.run_until_complete(self.arduino.get_capability_report())
80+
report = self.event_loop.run_until_complete(
81+
self.arduino.get_capability_report())
8482
x = 0
8583
pin = 0
8684
while x < len(report):
@@ -98,14 +96,14 @@ def init_pins_dictionary(self):
9896
# set up entry for i2c as pin 200 ( a pseudo pin number)
9997
self.pins_dictionary[200] = GatewayBaseAIO.DIGITAL_INPUT_MODE
10098

101-
10299
async def digital_write(self, topic, payload):
103100
"""
104101
This method performs a digital write
105102
:param topic: message topic
106103
:param payload content: {"command": "digital_write", "pin": “PIN”, "value": “VALUE”}
107104
"""
108-
await self.arduino.digital_write(payload['content']["pin"], payload['content']['value'])
105+
await self.arduino.digital_write(payload['content']["pin"],
106+
payload['content']['value'])
109107

110108
async def disable_analog_reporting(self, topic, payload):
111109
"""
@@ -157,7 +155,8 @@ async def i2c_read(self, topic, payload):
157155

158156
await self.arduino.i2c_read(payload['content']['addr'],
159157
payload['content']['register'],
160-
payload['content']['number_of_bytes'], callback=self.i2c_callback)
158+
payload['content']['number_of_bytes'],
159+
callback=self.i2c_callback)
161160

162161
async def i2c_write(self, topic, payload):
163162
"""
@@ -172,7 +171,8 @@ async def i2c_write(self, topic, payload):
172171
"addr": “I2C ADDRESS, "register": “I2C REGISTER”,
173172
"data": [“DATA IN LIST FORM”]}
174173
"""
175-
await self.arduino.i2c_write(payload['content']['addr'], payload['content']['data'])
174+
await self.arduino.i2c_write(payload['content']['addr'],
175+
payload['content']['data'])
176176

177177
async def play_tone(self, topic, payload):
178178
"""
@@ -198,7 +198,8 @@ async def pwm_write(self, topic, payload):
198198
"tag":”TAG”,
199199
“value”: “VALUE”}
200200
"""
201-
await self.arduino.analog_write(payload['content']["pin"], payload['content']['value'])
201+
await self.arduino.analog_write(payload['content']["pin"],
202+
payload['content']['value'])
202203

203204
async def servo_position(self, topic, payload):
204205
"""
@@ -211,7 +212,8 @@ async def servo_position(self, topic, payload):
211212
"pin": “PIN”,'tag': 'servo',
212213
“position”: “POSITION”}
213214
"""
214-
await self.arduino.servo_write(payload['content']["pin"], payload['content']["position"])
215+
await self.arduino.servo_write(payload['content']["pin"],
216+
payload['content']["position"])
215217

216218
async def set_mode_analog_input(self, topic, payload):
217219
"""
@@ -222,7 +224,8 @@ async def set_mode_analog_input(self, topic, payload):
222224
pin = payload['content']["pin"]
223225
self.pins_dictionary[pin + self.first_analog_pin][GatewayBaseAIO.PIN_MODE] = \
224226
GatewayBaseAIO.ANALOG_INPUT_MODE
225-
await self.arduino.set_pin_mode_analog_input(pin, self.analog_input_callback)
227+
await self.arduino.set_pin_mode_analog_input(
228+
pin, self.analog_input_callback)
226229

227230
async def set_mode_digital_input(self, topic, payload):
228231
"""
@@ -231,8 +234,10 @@ async def set_mode_digital_input(self, topic, payload):
231234
:param payload content: {"command": "set_mode_digital_input", "pin": “PIN”, "tag":”TAG” }
232235
"""
233236
pin = payload['content']["pin"]
234-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_INPUT_MODE
235-
await self.arduino.set_pin_mode_digital_input(pin, self.digital_input_callback)
237+
self.pins_dictionary[pin][
238+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_INPUT_MODE
239+
await self.arduino.set_pin_mode_digital_input(
240+
pin, self.digital_input_callback)
236241

237242
async def set_mode_digital_input_pullup(self, topic, payload):
238243
"""
@@ -241,8 +246,10 @@ async def set_mode_digital_input_pullup(self, topic, payload):
241246
:param payload content: message payload
242247
"""
243248
pin = payload['content']["pin"]
244-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_INPUT_PULLUP_MODE
245-
await self.arduino.set_pin_mode_digital_input_pullup(pin, self.digital_input_callback)
249+
self.pins_dictionary[pin][
250+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_INPUT_PULLUP_MODE
251+
await self.arduino.set_pin_mode_digital_input_pullup(
252+
pin, self.digital_input_callback)
246253

247254
async def set_mode_digital_output(self, topic, payload):
248255
"""
@@ -251,7 +258,8 @@ async def set_mode_digital_output(self, topic, payload):
251258
:param payload content: {"command": "set_mode_digital_output", "pin": PIN, "tag":”TAG” }
252259
"""
253260
pin = payload['content']["pin"]
254-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_OUTPUT_MODE
261+
self.pins_dictionary[pin][
262+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.DIGITAL_OUTPUT_MODE
255263
await self.arduino.set_pin_mode_digital_output(pin)
256264

257265
async def set_mode_i2c(self, topic, payload):
@@ -260,7 +268,8 @@ async def set_mode_i2c(self, topic, payload):
260268
:param topic: message topic
261269
:param payload content: {"command": "set_mode_i2c"}
262270
"""
263-
self.pins_dictionary[200][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.I2C_MODE
271+
self.pins_dictionary[200][
272+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.I2C_MODE
264273
await self.arduino.set_pin_mode_i2c()
265274

266275
async def set_mode_pwm(self, topic, payload):
@@ -270,7 +279,8 @@ async def set_mode_pwm(self, topic, payload):
270279
:param payload content: {"command": "set_mode_pwm", "pin": “PIN”, "tag":”TAG” }
271280
"""
272281
pin = payload['content']["pin"]
273-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.PWM_OUTPUT_MODE
282+
self.pins_dictionary[pin][
283+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.PWM_OUTPUT_MODE
274284
await self.arduino.set_pin_mode_pwm(pin)
275285

276286
async def set_mode_servo(self, topic, payload):
@@ -280,7 +290,8 @@ async def set_mode_servo(self, topic, payload):
280290
:param payload content: {"command": "set_mode_servo", "pin": “PIN”, "tag":”TAG” }
281291
"""
282292
pin = payload['content']["pin"]
283-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SERVO_MODE
293+
self.pins_dictionary[pin][
294+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SERVO_MODE
284295
await self.arduino.set_pin_mode_servo(pin)
285296

286297
async def set_mode_sonar(self, topic, payload):
@@ -293,10 +304,14 @@ async def set_mode_sonar(self, topic, payload):
293304

294305
trigger = payload['content']["trigger_pin"]
295306
echo = payload['content']["echo_pin"]
296-
self.pins_dictionary[trigger][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SONAR_MODE
297-
self.pins_dictionary[echo][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SONAR_MODE
307+
self.pins_dictionary[trigger][
308+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SONAR_MODE
309+
self.pins_dictionary[echo][
310+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.SONAR_MODE
298311

299-
await self.arduino.set_pin_mode_sonar(trigger, echo, cb=self.sonar_callback)
312+
await self.arduino.set_pin_mode_sonar(trigger,
313+
echo,
314+
cb=self.sonar_callback)
300315

301316
async def set_mode_stepper(self, topic, payload):
302317
"""
@@ -307,9 +322,11 @@ async def set_mode_stepper(self, topic, payload):
307322
"steps_per_revolution": “NUMBER OF STEPS”}
308323
"""
309324
for pin in payload['content']['pins']:
310-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.STEPPER_MODE
311-
await self.arduino.set_pin_mode_stepper(payload['content']['steps_per_revolution'],
312-
payload['content']['pins'])
325+
self.pins_dictionary[pin][
326+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.STEPPER_MODE
327+
await self.arduino.set_pin_mode_stepper(
328+
payload['content']['steps_per_revolution'],
329+
payload['content']['pins'])
313330

314331
async def set_mode_tone(self, topic, payload):
315332
"""
@@ -318,7 +335,8 @@ async def set_mode_tone(self, topic, payload):
318335
:param payload content:{"command": "set_mode_tone", "pin": “PIN”, "tag":”TAG” }
319336
"""
320337
pin = payload['content']["pin"]
321-
self.pins_dictionary[pin][GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.TONE_MODE
338+
self.pins_dictionary[pin][
339+
GatewayBaseAIO.PIN_MODE] = GatewayBaseAIO.TONE_MODE
322340
await self.arduino.set_pin_mode_tone(pin)
323341

324342
async def stepper_write(self, topic, payload):
@@ -340,18 +358,27 @@ async def digital_input_callback(self, data):
340358
"""
341359
# data = [pin, current reported value, pin_mode, timestamp]
342360
self.pins_dictionary[data[0]][GatewayBaseAIO.LAST_VALUE] = data[1]
343-
361+
344362
message = self.message_template()
345-
message["payload"]["content"] = {'report': 'digital_input', 'pin': data[0],
346-
'value': data[1], 'timestamp': data[3]}
363+
message["payload"]["content"] = {
364+
'report': 'digital_input',
365+
'pin': data[0],
366+
'value': data[1],
367+
'timestamp': data[3]
368+
}
347369
await self.publish_with_tokenbucket(message)
348370

349371
async def analog_input_callback(self, data):
350372
# data = [pin, current reported value, pin_mode, timestamp]
351-
self.pins_dictionary[data[0] + self.arduino.first_analog_pin][GatewayBaseAIO.LAST_VALUE] = data[1]
373+
self.pins_dictionary[data[0] + self.arduino.first_analog_pin][
374+
GatewayBaseAIO.LAST_VALUE] = data[1]
352375
message = self.message_template()
353-
message["payload"]["content"] = {'report': 'analog_input', 'pin': data[0],
354-
'value': data[1], 'timestamp': data[3]}
376+
message["payload"]["content"] = {
377+
'report': 'analog_input',
378+
'pin': data[0],
379+
'value': data[1],
380+
'timestamp': data[3]
381+
}
355382
await self.publish_with_tokenbucket(message)
356383

357384
async def i2c_callback(self, data):
@@ -377,7 +404,10 @@ async def sonar_callback(self, data):
377404
"""
378405
self.pins_dictionary[data[0]][GatewayBaseAIO.LAST_VALUE] = data[1]
379406
message = self.message_template()
380-
message["payload"]["content"] = {'report': 'sonar_data', 'value': data[1]}
407+
message["payload"]["content"] = {
408+
'report': 'sonar_data',
409+
'value': data[1]
410+
}
381411
await self.publish_with_tokenbucket(message)
382412

383413
def my_handler(self, tp, value, tb):
@@ -390,7 +420,7 @@ def my_handler(self, tp, value, tb):
390420
"""
391421
self.logger.exception("Uncaught exception: {0}".format(str(value)))
392422

393-
async def publish_with_tokenbucket(self,message):
423+
async def publish_with_tokenbucket(self, message):
394424
if self.bucket.consume(1):
395425
await self.publish(message)
396426

@@ -402,37 +432,30 @@ async def main(self):
402432
if self.keep_alive:
403433
await self.arduino.keep_alive()
404434
# sit in an endless loop to receive protocol messages
405-
await self.receive_loop() # pub_notification should after receive_loop
435+
await self.receive_loop() # pub_notification should after receive_loop
406436
# 在此之后才能发送,publisher先建立起来,消息可以后发
437+
407438
# The following methods and are called
408439
# by the gateway base class in its incoming_message_processing
409440
# method. They overwrite the default methods in the gateway_base.
410441

411-
412442
# noinspection DuplicatedCode
413443
def run(self):
414444
# get the event loop
415445
# this is for python 3.8
416446
if sys.platform == 'win32':
417-
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
418-
419-
# loop = asyncio.get_event_loop()
420-
447+
asyncio.set_event_loop_policy(
448+
asyncio.WindowsSelectorEventLoopPolicy())
421449

422-
# replace with the name of your class
423-
# app = ArduinoGateway(event_loop=loop)
424-
# app.pub_notification("Arduino found and connected to port!")
425450
try:
426-
# 0.5秒后发,如果成功的话
427-
self.event_loop.create_task(self.pub_notification(f'Arduino UNO Connected!', type="SUCCESS"))
428-
self.event_loop.run_until_complete(self.main()) # thread 之后才允许通信
451+
self.event_loop.create_task(
452+
self.pub_notification(f'Arduino UNO Connected!',
453+
type="SUCCESS"))
454+
self.event_loop.run_until_complete(self.main())
429455
self.logger.debug("arduino thread end")
430456
self.event_loop.run_until_complete(self.arduino.shutdown())
431457
except (KeyboardInterrupt, asyncio.CancelledError, RuntimeError):
432458
pass
433-
# self.event_loop.stop()
434-
# self.event_loop.close()
435-
# sys.exit(0)
436459

437460

438461
export = ArduinoGateway

0 commit comments

Comments
 (0)