Kendi Sendable Sınıflarınızı Yazmak
Sendable arayüzü saece tek bir metoda sahip olduğu için Sendable içerenı (ve sonuç olarak kendiliğinden verileri kaydeden ve/veya gösterge panelinden gelen değerleri tüketen) kendi sınıflarınız yazmak son derece kolaydır: sadece içinde sınıfınızın alanları için bildirimsel olarak anahtar değerlere bağlanmış (görüntüleme isimleri gösterge panelinde mevcut) setter ve getter metodları bulunan, devre dışı bırakılabilir bir initSendable metodu gerçekleştiriniz.
Örneğin, WPILib’in BangBangController’ında initSendable’ın uygulanması aşağıdaki gibidir:
151 @Override
152 public void initSendable(SendableBuilder builder) {
153 builder.setSmartDashboardType("BangBangController");
154 builder.addDoubleProperty("tolerance", this::getTolerance, this::setTolerance);
155 builder.addDoubleProperty("setpoint", this::getSetpoint, this::setSetpoint);
156 builder.addDoubleProperty("measurement", this::getMeasurement, null);
157 builder.addDoubleProperty("error", this::getError, null);
158 builder.addBooleanProperty("atSetpoint", this::atSetpoint, null);
159 }
55void BangBangController::InitSendable(wpi::SendableBuilder& builder) {
56 builder.SetSmartDashboardType("BangBangController");
57 builder.AddDoubleProperty(
58 "tolerance", [this] { return GetTolerance(); },
59 [this](double tolerance) { SetTolerance(tolerance); });
60 builder.AddDoubleProperty(
61 "setpoint", [this] { return GetSetpoint(); },
62 [this](double setpoint) { SetSetpoint(setpoint); });
63 builder.AddDoubleProperty(
64 "measurement", [this] { return GetMeasurement(); }, nullptr);
65 builder.AddDoubleProperty(
66 "error", [this] { return GetError(); }, nullptr);
67 builder.AddBooleanProperty(
68 "atSetpoint", [this] { return AtSetpoint(); }, nullptr);
69}
WPILib tarafından “arka planda” değerlerin kendiliğinden güncellenmesini etkinleştirmek için Sendable veri isimlerli belirli veri değerleri yerine getter ve setter işlevlerine bağlanmaktadır. Kaydetmek istediğiniz bir alanın tanımlı setter ve getter metodları yoksa, alan bir lambda ifadesiyle “inline” olarak tanımlanabilmektedir
SendableBuilder Sınıfı
As seen above, the initSendable method takes a single parameter, builder, of type SendableBuilder (Java, C++, Python). This builder exposes methods that allow binding of getters and setters to dashboard names, as well as methods for safely ensuring that values consumed from the dashboard do not cause unsafe robot behavior.
addProperty Metodları ile Veri Bağlama
Tüm WPILib gösterge paneli kodunda olduğu gibi Sendable alanları da NetworkTables üzerinden iletilmekte ve bu sebeple SendableBuilder tarafından sağlanan veri bağlama metodları, desteklenen NetworkTables veri türleri ile uyumludur:
boolean:addBooleanPropertyboolean[]:addBooleanArrayPropertydouble:addDoublePropertydouble[]:addDoubleArrayPropertystring:addStringPropertystring[]:addStringArrayPropertybyte[]:addRawProperty
setSafeState ve setActuator ile Güvenliğin Sağlanması
Since Sendable allows users to consume arbitrary values from the dashboard, it is possible for users to pipe dashboard controls directly to robot actuations. This is extremely unsafe if not done with care; dashboards are not a particularly good interface for controlling robot movement, and users generally do not expect the robot to move in response to a change on the dashboard.
To help users ensure safety when interfacing with dashboard values, SendableBuilder exposes a setSafeState method, which is called to place any Sendable mechanism that actuates based on dashboard input into a safe state. Any potentially hazardous user-written Sendable implementation should call setSafeState with a suitable safe state implementation. For example, here is the implementation from the WPILib PWMMotorController class:
120 @Override
121 public void initSendable(SendableBuilder builder) {
122 builder.setSmartDashboardType("Motor Controller");
123 builder.setActuator(true);
124 builder.setSafeState(this::disable);
125 builder.addDoubleProperty("Value", this::get, this::set);
126 }
56void PWMMotorController::InitSendable(wpi::SendableBuilder& builder) {
57 builder.SetSmartDashboardType("Motor Controller");
58 builder.SetActuator(true);
59 builder.SetSafeState([=, this] { Disable(); });
60 builder.AddDoubleProperty(
61 "Value", [=, this] { return Get(); },
62 [=, this](double value) { Set(value); });
Additionally, users may call builder.setActuator(true) to mark any mechanism that might move as a result of Sendable input as an actuator. Currently, this is used by Shuffleboard to disable actuator widgets when not in LiveWindow mode.