Source code for pykit.networktables.loggednetworkvalue
from typing import Generic, TypeVar, Union
from ntcore import (
BooleanEntry,
DoubleEntry,
IntegerEntry,
StringEntry,
)
from pykit.logger import Logger
from pykit.logtable import LogTable
from pykit.networktables.loggednetworkinput import LoggedNetworkInput
NTEntry = Union[
DoubleEntry,
BooleanEntry,
StringEntry,
IntegerEntry,
]
PyNTValue = Union[float, bool, str, int]
T = TypeVar("T", bound=PyNTValue)
V = TypeVar("V", bound=NTEntry)
[docs]
class LoggedNetworkValue(LoggedNetworkInput, Generic[T, V]):
"""
A generic base class for loggable NetworkTables values.
This class provides a common framework for handling different types of
NetworkTables entries that need to be logged and replayed.
"""
_value: T
_defaultValue: T
_entry: V
def __init__(self, key: str, defaultValue: T) -> None:
"""
Initializes a LoggedNetworkValue.
:param key: The NetworkTables key.
:param defaultValue: The default value.
"""
self._key = key
self._value = defaultValue
self._defaultValue = defaultValue
Logger.registerDashboardInput(self)
self._entry.set(defaultValue)
self.setDefault(defaultValue)
def __call__(self) -> T:
"""
Allows the object to be called to retrieve its value.
:return: The current value.
"""
return self.value
@property
def value(self) -> T:
"""The current value of the network entry."""
return self._value
@value.setter
def value(self, value: T) -> None:
"""
Sets the value of the network entry.
:param value: The new value.
"""
self._value = value
[docs]
def setDefault(self, defaultValue: T) -> None:
"""
Sets the default value for the network entry.
:param defaultValue: The new default value.
"""
self._defaultValue = defaultValue
[docs]
def toLog(self, table: LogTable, prefix: str):
"""
Logs the current value to the log table.
:param table: The log table.
:param prefix: The prefix for the log entry.
"""
table.put(f"{prefix}/{LoggedNetworkInput.removeSlash(self._key)}", self._value)
[docs]
def fromLog(self, table: LogTable, prefix: str):
"""
Loads the value from the log table.
:param table: The log table.
:param prefix: The prefix for the log entry.
"""
self._value = table.get(
f"{prefix}/{LoggedNetworkInput.removeSlash(self._key)}",
self._defaultValue,
)
[docs]
def periodic(self):
"""
Updates the value periodically. In normal mode, it reads from NetworkTables.
In replay mode, it relies on `fromLog` to update the value.
"""
if not Logger.isReplay():
self._value = self._entry.get(self._defaultValue)
Logger.processInputs(self.prefix, self)