Source code for commands2.button.networkbutton
# validated: 2024-01-20 DS 7a099cb02a33 button/NetworkButton.java
from typing import overload
from ntcore import BooleanSubscriber, BooleanTopic, NetworkTable, NetworkTableInstance
from ..util import format_args_kwargs
from .trigger import Trigger
[docs]
class NetworkButton(Trigger):
"""
A Button that uses a :class:`ntcore.NetworkTable` boolean field.
"""
@overload
def __init__(self, topic: BooleanTopic) -> None:
"""
Creates a NetworkButton that commands can be bound to.
:param topic: The boolean topic that contains the value.
"""
pass
@overload
def __init__(self, sub: BooleanSubscriber) -> None:
"""
Creates a NetworkButton that commands can be bound to.
:param sub: The boolean subscriber that provides the value.
"""
pass
@overload
def __init__(self, table: NetworkTable, field: str) -> None:
"""
Creates a NetworkButton that commands can be bound to.
:param table: The table where the networktable value is located.
:param field: The field that is the value.
"""
pass
@overload
def __init__(self, table: str, field: str) -> None:
"""
Creates a NetworkButton that commands can be bound to.
:param table: The table where the networktable value is located.
:param field: The field that is the value.
"""
pass
@overload
def __init__(self, inst: NetworkTableInstance, table: str, field: str) -> None:
"""
Creates a NetworkButton that commands can be bound to.
:param inst: The NetworkTable instance to use
:param table: The table where the networktable value is located.
:param field: the field that is the value.
"""
pass
def __init__(self, *args, **kwargs) -> None:
def init_sub(sub: BooleanSubscriber):
return super(NetworkButton, self).__init__(
lambda: sub.getTopic().getInstance().isConnected() and sub.get()
)
def init_topic(topic: BooleanTopic):
init_sub(topic.subscribe(False))
def init_table_field(table: NetworkTable, field: str):
init_topic(table.getBooleanTopic(field))
def init_inst_table_field(inst: NetworkTableInstance, table: str, field: str):
init_table_field(inst.getTable(table), field)
def init_str_table_field(table: str, field: str):
init_inst_table_field(NetworkTableInstance.getDefault(), table, field)
num_args = len(args) + len(kwargs)
if num_args == 1:
if "topic" in kwargs:
return init_topic(kwargs["topic"])
if "sub" in kwargs:
return init_sub(kwargs["sub"])
if isinstance(args[0], BooleanTopic):
return init_topic(args[0])
if isinstance(args[0], BooleanSubscriber):
return init_sub(args[0])
elif num_args == 2:
table, field, *_ = args + (None, None)
if "table" in kwargs:
table = kwargs["table"]
if "field" in kwargs:
field = kwargs["field"]
if table is not None and field is not None:
if isinstance(table, NetworkTable):
return init_table_field(table, field)
if isinstance(table, str):
return init_str_table_field(table, field)
elif num_args == 3:
inst, table, field, *_ = args + (None, None, None)
if "inst" in kwargs:
inst = kwargs["inst"]
if "table" in kwargs:
table = kwargs["table"]
if "field" in kwargs:
field = kwargs["field"]
if inst is not None and table is not None and field is not None:
return init_inst_table_field(inst, table, field)
raise TypeError(
f"""
TypeError: NetworkButton(): incompatible function arguments. The following argument types are supported:
1. (self: NetworkButton, topic: BooleanTopic)
2. (self: NetworkButton, sub: BooleanSubscriber)
3. (self: NetworkButton, table: NetworkTable, field: str)
4. (self: NetworkButton, table: str, field: str)
5. (self: NetworkButton, inst: NetworkTableInstance, table: str, field: str)
Invoked with: {format_args_kwargs(self, *args, **kwargs)}
"""
)