Skip to content

Commit 1ac3bf9

Browse files
committed
client: add client commands to SysfsGPIO
Add support for the power and button protocols and add the "invert" method of the io protocol to SysffsGPIO Signed-off-by: Perry Melange <[email protected]>
1 parent b49dbd0 commit 1ac3bf9

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

labgrid/remote/client.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ def power(self):
859859
name = self.args.name
860860
target = self._get_target(place)
861861
from ..resource.power import NetworkPowerPort, PDUDaemonPort
862-
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort
862+
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort, NetworkSysfsGPIO
863863
from ..resource import TasmotaPowerPort, NetworkYKUSHPowerPort
864864

865865
drv = None
@@ -881,6 +881,8 @@ def power(self):
881881
drv = self._get_driver_or_new(target, "TasmotaPowerDriver", name=name)
882882
elif isinstance(resource, NetworkYKUSHPowerPort):
883883
drv = self._get_driver_or_new(target, "YKUSHPowerDriver", name=name)
884+
elif isinstance(resource, NetworkSysfsGPIO):
885+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
884886
if drv:
885887
break
886888

@@ -892,6 +894,32 @@ def power(self):
892894
if action == "get":
893895
print(f"power{' ' + name if name else ''} for place {place.name} is {'on' if res else 'off'}")
894896

897+
def button(self):
898+
place = self.get_acquired_place()
899+
action = self.args.action
900+
delay = self.args.delay
901+
name = self.args.name
902+
target = self._get_target(place)
903+
from ..resource.remote import NetworkSysfsGPIO
904+
905+
drv = None
906+
try:
907+
drv = target.get_driver("ButtonProtocol", name=name)
908+
except NoDriverFoundError:
909+
for resource in target.resources:
910+
if isinstance(resource, NetworkSysfsGPIO):
911+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
912+
if drv:
913+
break
914+
915+
if not drv:
916+
raise UserError("target has no compatible resource available")
917+
if delay is not None:
918+
drv.delay = delay
919+
res = getattr(drv, action)()
920+
if action == "get":
921+
print(f"button{' ' + name if name else ''} for place {place.name} is {'pressed' if res else 'released'}")
922+
895923
def digital_io(self):
896924
place = self.get_acquired_place()
897925
action = self.args.action
@@ -930,6 +958,8 @@ def digital_io(self):
930958
drv.set(True)
931959
elif action == "low":
932960
drv.set(False)
961+
elif action == "invert":
962+
drv.invert()
933963

934964
async def _console(self, place, target, timeout, *, logfile=None, loop=False, listen_only=False):
935965
name = self.args.name
@@ -1814,8 +1844,16 @@ def main():
18141844
subparser.add_argument("--name", "-n", help="optional resource name")
18151845
subparser.set_defaults(func=ClientSession.power)
18161846

1847+
subparser = subparsers.add_parser("button", help="change (or get) a place's button status")
1848+
subparser.add_argument("action", choices=["press", "release", "press_for", "get"])
1849+
subparser.add_argument(
1850+
"-t", "--delay", type=float, default=None, help="wait time in seconds between the press and release during press_for"
1851+
)
1852+
subparser.add_argument("--name", "-n", help="optional resource name")
1853+
subparser.set_defaults(func=ClientSession.button)
1854+
18171855
subparser = subparsers.add_parser("io", help="change (or get) a digital IO status")
1818-
subparser.add_argument("action", choices=["high", "low", "get"], help="action")
1856+
subparser.add_argument("action", choices=["high", "low", "invert", "get"], help="action")
18191857
subparser.add_argument("name", help="optional resource name", nargs="?")
18201858
subparser.set_defaults(func=ClientSession.digital_io)
18211859

0 commit comments

Comments
 (0)