Skip to content

Commit 33e2c15

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 a8eaa23 commit 33e2c15

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
@@ -852,7 +852,7 @@ def power(self):
852852
name = self.args.name
853853
target = self._get_target(place)
854854
from ..resource.power import NetworkPowerPort, PDUDaemonPort
855-
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort
855+
from ..resource.remote import NetworkUSBPowerPort, NetworkSiSPMPowerPort, NetworkSysfsGPIO
856856
from ..resource import TasmotaPowerPort, NetworkYKUSHPowerPort
857857

858858
drv = None
@@ -874,6 +874,8 @@ def power(self):
874874
drv = self._get_driver_or_new(target, "TasmotaPowerDriver", name=name)
875875
elif isinstance(resource, NetworkYKUSHPowerPort):
876876
drv = self._get_driver_or_new(target, "YKUSHPowerDriver", name=name)
877+
elif isinstance(resource, NetworkSysfsGPIO):
878+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
877879
if drv:
878880
break
879881

@@ -885,6 +887,32 @@ def power(self):
885887
if action == "get":
886888
print(f"power{' ' + name if name else ''} for place {place.name} is {'on' if res else 'off'}")
887889

890+
def button(self):
891+
place = self.get_acquired_place()
892+
action = self.args.action
893+
delay = self.args.delay
894+
name = self.args.name
895+
target = self._get_target(place)
896+
from ..resource.remote import NetworkSysfsGPIO
897+
898+
drv = None
899+
try:
900+
drv = target.get_driver("ButtonProtocol", name=name)
901+
except NoDriverFoundError:
902+
for resource in target.resources:
903+
if isinstance(resource, NetworkSysfsGPIO):
904+
drv = self._get_driver_or_new(target, "GpioDigitalOutputDriver", name=name)
905+
if drv:
906+
break
907+
908+
if not drv:
909+
raise UserError("target has no compatible resource available")
910+
if delay is not None:
911+
drv.delay = delay
912+
res = getattr(drv, action)()
913+
if action == "get":
914+
print(f"button{' ' + name if name else ''} for place {place.name} is {'pressed' if res else 'released'}")
915+
888916
def digital_io(self):
889917
place = self.get_acquired_place()
890918
action = self.args.action
@@ -923,6 +951,8 @@ def digital_io(self):
923951
drv.set(True)
924952
elif action == "low":
925953
drv.set(False)
954+
elif action == "invert":
955+
drv.invert()
926956

927957
async def _console(self, place, target, timeout, *, logfile=None, loop=False, listen_only=False):
928958
name = self.args.name
@@ -1807,8 +1837,16 @@ def main():
18071837
subparser.add_argument("--name", "-n", help="optional resource name")
18081838
subparser.set_defaults(func=ClientSession.power)
18091839

1840+
subparser = subparsers.add_parser("button", help="change (or get) a place's button status")
1841+
subparser.add_argument("action", choices=["press", "release", "press_for", "get"])
1842+
subparser.add_argument(
1843+
"-t", "--delay", type=float, default=None, help="wait time in seconds between the press and release during press_for"
1844+
)
1845+
subparser.add_argument("--name", "-n", help="optional resource name")
1846+
subparser.set_defaults(func=ClientSession.button)
1847+
18101848
subparser = subparsers.add_parser("io", help="change (or get) a digital IO status")
1811-
subparser.add_argument("action", choices=["high", "low", "get"], help="action")
1849+
subparser.add_argument("action", choices=["high", "low", "invert", "get"], help="action")
18121850
subparser.add_argument("name", help="optional resource name", nargs="?")
18131851
subparser.set_defaults(func=ClientSession.digital_io)
18141852

0 commit comments

Comments
 (0)