001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.epilogue.logging;
006
007import edu.wpi.first.util.function.BooleanConsumer;
008import edu.wpi.first.util.function.FloatConsumer;
009import edu.wpi.first.util.function.FloatSupplier;
010import edu.wpi.first.util.sendable.SendableBuilder;
011import java.util.ArrayList;
012import java.util.Collection;
013import java.util.function.BooleanSupplier;
014import java.util.function.Consumer;
015import java.util.function.DoubleConsumer;
016import java.util.function.DoubleSupplier;
017import java.util.function.LongConsumer;
018import java.util.function.LongSupplier;
019import java.util.function.Supplier;
020
021/** A sendable builder implementation that sends data to a {@link EpilogueBackend}. */
022public class LogBackedSendableBuilder implements SendableBuilder {
023  private final EpilogueBackend m_backend;
024  private final Collection<Runnable> m_updates = new ArrayList<>();
025
026  /**
027   * Creates a new sendable builder that delegates writes to an underlying backend.
028   *
029   * @param backend the backend to write the sendable data to
030   */
031  public LogBackedSendableBuilder(EpilogueBackend backend) {
032    this.m_backend = backend;
033  }
034
035  @Override
036  public void setSmartDashboardType(String type) {
037    m_backend.log(".type", type);
038  }
039
040  @Override
041  public void setActuator(boolean value) {
042    // ignore
043  }
044
045  @Override
046  public void setSafeState(Runnable func) {
047    // ignore
048  }
049
050  @Override
051  public void addBooleanProperty(String key, BooleanSupplier getter, BooleanConsumer setter) {
052    m_updates.add(() -> m_backend.log(key, getter.getAsBoolean()));
053  }
054
055  @Override
056  public void publishConstBoolean(String key, boolean value) {
057    m_backend.log(key, value);
058  }
059
060  @Override
061  public void addIntegerProperty(String key, LongSupplier getter, LongConsumer setter) {
062    m_updates.add(() -> m_backend.log(key, getter.getAsLong()));
063  }
064
065  @Override
066  public void publishConstInteger(String key, long value) {
067    m_backend.log(key, value);
068  }
069
070  @Override
071  public void addFloatProperty(String key, FloatSupplier getter, FloatConsumer setter) {
072    m_updates.add(() -> m_backend.log(key, getter.getAsFloat()));
073  }
074
075  @Override
076  public void publishConstFloat(String key, float value) {
077    m_backend.log(key, value);
078  }
079
080  @Override
081  public void addDoubleProperty(String key, DoubleSupplier getter, DoubleConsumer setter) {
082    m_updates.add(() -> m_backend.log(key, getter.getAsDouble()));
083  }
084
085  @Override
086  public void publishConstDouble(String key, double value) {
087    m_backend.log(key, value);
088  }
089
090  @Override
091  public void addStringProperty(String key, Supplier<String> getter, Consumer<String> setter) {
092    if (getter != null) {
093      m_updates.add(() -> m_backend.log(key, getter.get()));
094    }
095  }
096
097  @Override
098  public void publishConstString(String key, String value) {
099    m_backend.log(key, value);
100  }
101
102  @Override
103  public void addBooleanArrayProperty(
104      String key, Supplier<boolean[]> getter, Consumer<boolean[]> setter) {
105    if (getter != null) {
106      m_updates.add(() -> m_backend.log(key, getter.get()));
107    }
108  }
109
110  @Override
111  public void publishConstBooleanArray(String key, boolean[] value) {
112    m_backend.log(key, value);
113  }
114
115  @Override
116  public void addIntegerArrayProperty(
117      String key, Supplier<long[]> getter, Consumer<long[]> setter) {
118    if (getter != null) {
119      m_updates.add(() -> m_backend.log(key, getter.get()));
120    }
121  }
122
123  @Override
124  public void publishConstIntegerArray(String key, long[] value) {
125    m_backend.log(key, value);
126  }
127
128  @Override
129  public void addFloatArrayProperty(
130      String key, Supplier<float[]> getter, Consumer<float[]> setter) {
131    if (getter != null) {
132      m_updates.add(() -> m_backend.log(key, getter.get()));
133    }
134  }
135
136  @Override
137  public void publishConstFloatArray(String key, float[] value) {
138    m_backend.log(key, value);
139  }
140
141  @Override
142  public void addDoubleArrayProperty(
143      String key, Supplier<double[]> getter, Consumer<double[]> setter) {
144    if (getter != null) {
145      m_updates.add(() -> m_backend.log(key, getter.get()));
146    }
147  }
148
149  @Override
150  public void publishConstDoubleArray(String key, double[] value) {
151    m_backend.log(key, value);
152  }
153
154  @Override
155  public void addStringArrayProperty(
156      String key, Supplier<String[]> getter, Consumer<String[]> setter) {
157    if (getter != null) {
158      m_updates.add(() -> m_backend.log(key, getter.get()));
159    }
160  }
161
162  @Override
163  public void publishConstStringArray(String key, String[] value) {
164    m_backend.log(key, value);
165  }
166
167  @Override
168  public void addRawProperty(
169      String key, String typeString, Supplier<byte[]> getter, Consumer<byte[]> setter) {
170    if (getter != null) {
171      m_updates.add(() -> m_backend.log(key, getter.get()));
172    }
173  }
174
175  @Override
176  public void publishConstRaw(String key, String typeString, byte[] value) {
177    m_backend.log(key, value);
178  }
179
180  @Override
181  public BackendKind getBackendKind() {
182    return BackendKind.kUnknown;
183  }
184
185  @Override
186  public boolean isPublished() {
187    return true;
188  }
189
190  @Override
191  public void update() {
192    for (Runnable update : m_updates) {
193      update.run();
194    }
195  }
196
197  @Override
198  public void clearProperties() {
199    m_updates.clear();
200  }
201
202  @Override
203  public void addCloseable(AutoCloseable closeable) {
204    // Ignore
205  }
206
207  @Override
208  public void close() throws Exception {
209    clearProperties();
210  }
211}