Skip to content

Commit a95f909

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 9b92f0b commit a95f909

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
@@ -866,7 +866,7 @@ def power(self):
866866
name = self.args.name
867867
target = self._get_target(place)
868868
from ..resource.power import NetworkPowerPort, PDUDaemonPort
869-
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort
869+
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort, NetworkSysfsGPIO
870870
from ..resource import TasmotaPowerPort, NetworkYKUSHPowerPort
871871

872872
drv = None
@@ -888,6 +888,8 @@ def power(self):
888888
drv = self._get_driver_or_new(target, "TasmotaPowerDriver", name=name)
889889
elif isinstance(resource, NetworkYKUSHPowerPort):
890890
drv = self._get_driver_or_new(target, "YKUSHPowerDriver", name=name)
891+
elif isinstance(resource, NetworkSysfsGPIO):
892+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
891893
if drv:
892894
break
893895

@@ -899,6 +901,32 @@ def power(self):
899901
if action == "get":
900902
print(f"power{' ' + name if name else ''} for place {place.name} is {'on' if res else 'off'}")
901903

904+
def button(self):
905+
place = self.get_acquired_place()
906+
action = self.args.action
907+
delay = self.args.delay
908+
name = self.args.name
909+
target = self._get_target(place)
910+
from ..resource.remote import NetworkSysfsGPIO
911+
912+
drv = None
913+
try:
914+
drv = target.get_driver("ButtonProtocol", name=name)
915+
except NoDriverFoundError:
916+
for resource in target.resources:
917+
if isinstance(resource, NetworkSysfsGPIO):
918+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
919+
if drv:
920+
break
921+
922+
if not drv:
923+
raise UserError("target has no compatible resource available")
924+
if delay is not None:
925+
drv.delay = delay
926+
res = getattr(drv, action)()
927+
if action == "get":
928+
print(f"button{' ' + name if name else ''} for place {place.name} is {'pressed' if res else 'released'}")
929+
902930
def digital_io(self):
903931
place = self.get_acquired_place()
904932
action = self.args.action
@@ -937,6 +965,8 @@ def digital_io(self):
937965
drv.set(True)
938966
elif action == "low":
939967
drv.set(False)
968+
elif action == "invert":
969+
drv.invert()
940970

941971
async def _console(self, place, target, timeout, *, logfile=None, loop=False, listen_only=False):
942972
name = self.args.name
@@ -1821,8 +1851,16 @@ def main():
18211851
subparser.add_argument("--name", "-n", help="optional resource name")
18221852
subparser.set_defaults(func=ClientSession.power)
18231853

1854+
subparser = subparsers.add_parser("button", help="change (or get) a place's button status")
1855+
subparser.add_argument("action", choices=["press", "release", "press_for", "get"])
1856+
subparser.add_argument(
1857+
"-t", "--delay", type=float, default=None, help="wait time in seconds between the press and release during press_for"
1858+
)
1859+
subparser.add_argument("--name", "-n", help="optional resource name")
1860+
subparser.set_defaults(func=ClientSession.button)
1861+
18241862
subparser = subparsers.add_parser("io", help="change (or get) a digital IO status")
1825-
subparser.add_argument("action", choices=["high", "low", "get"], help="action")
1863+
subparser.add_argument("action", choices=["high", "low", "invert", "get"], help="action")
18261864
subparser.add_argument("name", help="optional resource name", nargs="?")
18271865
subparser.set_defaults(func=ClientSession.digital_io)
18281866

0 commit comments

Comments
 (0)