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 addBooleanProperty(String key, BooleanSupplier getter, BooleanConsumer setter) {
047    m_updates.add(() -> m_backend.log(key, getter.getAsBoolean()));
048  }
049
050  @Override
051  public void publishConstBoolean(String key, boolean value) {
052    m_backend.log(key, value);
053  }
054
055  @Override
056  public void addIntegerProperty(String key, LongSupplier getter, LongConsumer setter) {
057    m_updates.add(() -> m_backend.log(key, getter.getAsLong()));
058  }
059
060  @Override
061  public void publishConstInteger(String key, long value) {
062    m_backend.log(key, value);
063  }
064
065  @Override
066  public void addFloatProperty(String key, FloatSupplier getter, FloatConsumer setter) {
067    m_updates.add(() -> m_backend.log(key, getter.getAsFloat()));
068  }
069
070  @Override
071  public void publishConstFloat(String key, float value) {
072    m_backend.log(key, value);
073  }
074
075  @Override
076  public void addDoubleProperty(String key, DoubleSupplier getter, DoubleConsumer setter) {
077    m_updates.add(() -> m_backend.log(key, getter.getAsDouble()));
078  }
079
080  @Override
081  public void publishConstDouble(String key, double value) {
082    m_backend.log(key, value);
083  }
084
085  @Override
086  public void addStringProperty(String key, Supplier<String> getter, Consumer<String> setter) {
087    if (getter != null) {
088      m_updates.add(() -> m_backend.log(key, getter.get()));
089    }
090  }
091
092  @Override
093  public void publishConstString(String key, String value) {
094    m_backend.log(key, value);
095  }
096
097  @Override
098  public void addBooleanArrayProperty(
099      String key, Supplier<boolean[]> getter, Consumer<boolean[]> setter) {
100    if (getter != null) {
101      m_updates.add(() -> m_backend.log(key, getter.get()));
102    }
103  }
104
105  @Override
106  public void publishConstBooleanArray(String key, boolean[] value) {
107    m_backend.log(key, value);
108  }
109
110  @Override
111  public void addIntegerArrayProperty(
112      String key, Supplier<long[]> getter, Consumer<long[]> setter) {
113    if (getter != null) {
114      m_updates.add(() -> m_backend.log(key, getter.get()));
115    }
116  }
117
118  @Override
119  public void publishConstIntegerArray(String key, long[] value) {
120    m_backend.log(key, value);
121  }
122
123  @Override
124  public void addFloatArrayProperty(
125      String key, Supplier<float[]> getter, Consumer<float[]> setter) {
126    if (getter != null) {
127      m_updates.add(() -> m_backend.log(key, getter.get()));
128    }
129  }
130
131  @Override
132  public void publishConstFloatArray(String key, float[] value) {
133    m_backend.log(key, value);
134  }
135
136  @Override
137  public void addDoubleArrayProperty(
138      String key, Supplier<double[]> getter, Consumer<double[]> setter) {
139    if (getter != null) {
140      m_updates.add(() -> m_backend.log(key, getter.get()));
141    }
142  }
143
144  @Override
145  public void publishConstDoubleArray(String key, double[] value) {
146    m_backend.log(key, value);
147  }
148
149  @Override
150  public void addStringArrayProperty(
151      String key, Supplier<String[]> getter, Consumer<String[]> setter) {
152    if (getter != null) {
153      m_updates.add(() -> m_backend.log(key, getter.get()));
154    }
155  }
156
157  @Override
158  public void publishConstStringArray(String key, String[] value) {
159    m_backend.log(key, value);
160  }
161
162  @Override
163  public void addRawProperty(
164      String key, String typeString, Supplier<byte[]> getter, Consumer<byte[]> setter) {
165    if (getter != null) {
166      m_updates.add(() -> m_backend.log(key, getter.get()));
167    }
168  }
169
170  @Override
171  public void publishConstRaw(String key, String typeString, byte[] value) {
172    m_backend.log(key, value);
173  }
174
175  @Override
176  public BackendKind getBackendKind() {
177    return BackendKind.kUnknown;
178  }
179
180  @Override
181  public boolean isPublished() {
182    return true;
183  }
184
185  @Override
186  public void update() {
187    for (Runnable update : m_updates) {
188      update.run();
189    }
190  }
191
192  @Override
193  public void clearProperties() {
194    m_updates.clear();
195  }
196
197  @Override
198  public void addCloseable(AutoCloseable closeable) {
199    // Ignore
200  }
201
202  @Override
203  public void close() throws Exception {
204    clearProperties();
205  }
206}