1
1
import functools
2
2
import inspect
3
3
import warnings
4
- from typing import Generic , Optional , TypeVar
4
+ from typing import Callable , Generic , Optional , TypeVar
5
5
6
6
from networktables import NetworkTables
7
7
from ntcore .value import Value
@@ -67,6 +67,7 @@ def execute(self):
67
67
# "__doc__",
68
68
"_mkv" ,
69
69
"_nt" ,
70
+ "_update_cb" ,
70
71
)
71
72
72
73
def __init__ (
@@ -87,16 +88,35 @@ def __init__(
87
88
88
89
self ._mkv = Value .getFactory (default )
89
90
self ._nt = NetworkTables
91
+ self ._update_cb = None
90
92
91
93
def __get__ (self , instance , owner ) -> V :
92
94
if instance is not None :
93
95
return instance ._tunables [self ].value
94
96
return self
95
97
96
- def __set__ (self , instance , value ) -> None :
98
+ def __set__ (self , instance , value : V ) -> None :
97
99
v = instance ._tunables [self ]
98
100
self ._nt ._api .setEntryValueById (v ._local_id , self ._mkv (value ))
99
101
102
+ def set_callback (self , callback : Callable [[V ], None ]) -> None :
103
+ """
104
+ Set a method to be called when the tunable is updated over NetworkTables.
105
+
106
+ This can be useful, for example, for changing PID gains on a
107
+ motor controller on the fly::
108
+
109
+ class Component:
110
+ pid: ...
111
+
112
+ kP = tunable(0.01)
113
+
114
+ @kP.set_callback
115
+ def set_kP(self, value: float) -> None:
116
+ self.pid.setP(value)
117
+ """
118
+ self ._update_cb = lambda inst , notif : callback (inst , notif .value .value )
119
+
100
120
101
121
def setup_tunables (component , cname : str , prefix : Optional [str ] = "components" ) -> None :
102
122
"""
@@ -137,6 +157,13 @@ def setup_tunables(component, cname: str, prefix: Optional[str] = "components")
137
157
)
138
158
tunables [prop ] = ntvalue
139
159
160
+ if prop ._update_cb :
161
+ prop ._nt ._api .addEntryListenerById (
162
+ ntvalue ._local_id ,
163
+ functools .partial (prop ._update_cb , component ),
164
+ NetworkTables .NotifyFlags .UPDATE ,
165
+ )
166
+
140
167
component ._tunables = tunables
141
168
142
169
0 commit comments