Skip to content

Commit 85daf8d

Browse files
committed
added @devicegroup.code and @devicegroup.code_follow decorators
1 parent 9e19792 commit 85daf8d

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

changelog.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
- fix data feeding pipe missing blank lines in follow callback for BleDevice
1111
- deprecate self-signed certs in favor of ROOT CA signed certs for WebSocketDevices using SSL/TLS
1212
### Added
13-
- @code decorator for Device classes to declare and call functions in devices
14-
- @code decorator examples
13+
- @device.code decorator for Device classes to declare and call functions in devices
14+
- @device.code_follow for Device classes to declare and call functions in devices whose output need to be followed.
15+
- @devicegroup.code for DeviceGroup class to declare and call functions in group of devices
16+
@devicegroup.code_follow for Device classes to declare and call functions in a group of devices whose output need to be followed.
17+
- decorator examples
1518
## [0.3.6] - 2022-03-25
1619
### Fix
1720
- fixed missing dependencies in `setup.py` (@BradenM)

examples/decorators/test_dec.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def led_toggle(led):
1616

1717

1818
print('Toggling led..')
19-
for i in range(1,5):
19+
for i in range(1, 5):
2020
led_toggle(i)
2121

2222

@@ -30,7 +30,7 @@ def dothis():
3030

3131
dothis()
3232

33-
#espd = Device('espdev.local', "oXQdh0wQ", init=True)
33+
# espd = Device('espdev.local', "oXQdh0wQ", init=True)
3434

3535
# @espd.code
3636
# def esp_led_toggle():
@@ -62,5 +62,5 @@ def dothis():
6262
#
6363
#
6464
# doit()
65-
#res2 = espd.wr_cmd('esp_led_toggle()', rtn=True, rtn_resp=True)
66-
#print(res1 + 1)
65+
# res2 = espd.wr_cmd('esp_led_toggle()', rtn=True, rtn_resp=True)
66+
# print(res1 + 1)

upydevice/devgroup.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import time
2525
import multiprocessing
26+
from .decorators import getsource
27+
import functools
2628

2729
# DEV GROUP
2830

@@ -107,3 +109,57 @@ def reset(self, group_silent=False, silent_dev=True, ignore=[], include=[]):
107109
if not group_silent:
108110
print('Rebooting {}'.format(dev))
109111
self.devs[dev].reset(silent=silent_dev)
112+
113+
114+
class DeviceGroup(DEVGROUP):
115+
116+
def __init__(self, *args, **kargs):
117+
super().__init__(*args, **kargs)
118+
119+
def code(self, func):
120+
str_func = '\n'.join(getsource(func).split('\n')[1:])
121+
for dev in self.devs.keys():
122+
self.devs[dev].paste_buff(str_func)
123+
self.devs[dev].cmd('\x04', silent=True)
124+
125+
@functools.wraps(func)
126+
def wrapper_cmd(*args, **kwargs):
127+
flags = ['>', '<', 'object', 'at', '0x']
128+
args_repr = [repr(a) for a in args if any(
129+
f not in repr(a) for f in flags)]
130+
kwargs_repr = [f"{k}={v!r}" if not callable(
131+
v) else f"{k}={v.__name__}" for k, v in kwargs.items()]
132+
signature = ", ".join(args_repr + kwargs_repr)
133+
cmd_ = f"{func.__name__}({signature})"
134+
self.output = {}
135+
for dev in self.devs.keys():
136+
self.devs[dev].wr_cmd(cmd_, rtn=True)
137+
if self.devs[dev].output:
138+
self.output[dev] = self.devs[dev].output
139+
if self.output:
140+
return self.output
141+
return wrapper_cmd
142+
143+
def code_follow(self, func):
144+
str_func = '\n'.join(getsource(func).split('\n')[1:])
145+
for dev in self.devs.keys():
146+
self.devs[dev].paste_buff(str_func)
147+
self.devs[dev].cmd('\x04', silent=True)
148+
149+
@functools.wraps(func)
150+
def wrapper_cmd(*args, **kwargs):
151+
flags = ['>', '<', 'object', 'at', '0x']
152+
args_repr = [repr(a) for a in args if any(
153+
f not in repr(a) for f in flags)]
154+
kwargs_repr = [f"{k}={v!r}" if not callable(
155+
v) else f"{k}={v.__name__}" for k, v in kwargs.items()]
156+
signature = ", ".join(args_repr + kwargs_repr)
157+
cmd_ = f"{func.__name__}({signature})"
158+
self.output = {}
159+
for dev in self.devs.keys():
160+
self.devs[dev].wr_cmd(cmd_, rtn=True, follow=True)
161+
if self.devs[dev].output:
162+
self.output[dev] = self.devs[dev].output
163+
if self.output:
164+
return self.output
165+
return wrapper_cmd

0 commit comments

Comments
 (0)