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}. */
022@SuppressWarnings("PMD.CouplingBetweenObjects") // most methods simply delegate to the backend
023public class LogBackedSendableBuilder implements SendableBuilder {
024  private final EpilogueBackend m_backend;
025  private final Collection<Runnable> m_updates = new ArrayList<>();
026
027  /**
028   * Creates a new sendable builder that delegates writes to an underlying backend.
029   *
030   * @param backend the backend to write the sendable data to
031   */
032  public LogBackedSendableBuilder(EpilogueBackend backend) {
033    this.m_backend = backend;
034  }
035
036  @Override
037  public void setSmartDashboardType(String type) {
038    m_backend.log(".type", type);
039  }
040
041  @Override
042  public void setActuator(boolean value) {
043    // ignore
044  }
045
046  @Override
047  public void addBooleanProperty(String key, BooleanSupplier getter, BooleanConsumer setter) {
048    m_updates.add(() -> m_backend.log(key, getter.getAsBoolean()));
049  }
050
051  @Override
052  public void publishConstBoolean(String key, boolean value) {
053    m_backend.log(key, value);
054  }
055
056  @Override
057  public void addIntegerProperty(String key, LongSupplier getter, LongConsumer setter) {
058    m_updates.add(() -> m_backend.log(key, getter.getAsLong()));
059  }
060
061  @Override
062  public void publishConstInteger(String key, long value) {
063    m_backend.log(key, value);
064  }
065
066  @Override
067  public void addFloatProperty(String key, FloatSupplier getter, FloatConsumer setter) {
068    m_updates.add(() -> m_backend.log(key, getter.getAsFloat()));
069  }
070
071  @Override
072  public void publishConstFloat(String key, float value) {
073    m_backend.log(key, value);
074  }
075
076  @Override
077  public void addDoubleProperty(String key, DoubleSupplier getter, DoubleConsumer setter) {
078    m_updates.add(() -> m_backend.log(key, getter.getAsDouble()));
079  }
080
081  @Override
082  public void publishConstDouble(String key, double value) {
083    m_backend.log(key, value);
084  }
085
086  @Override
087  public void addStringProperty(String key, Supplier<String> getter, Consumer<String> setter) {
088    if (getter != null) {
089      m_updates.add(() -> m_backend.log(key, getter.get()));
090    }
091  }
092
093  @Override
094  public void publishConstString(String key, String value) {
095    m_backend.log(key, value);
096  }
097
098  @Override
099  public void addBooleanArrayProperty(
100      String key, Supplier<boolean[]> getter, Consumer<boolean[]> setter) {
101    if (getter != null) {
102      m_updates.add(() -> m_backend.log(key, getter.get()));
103    }
104  }
105
106  @Override
107  public void publishConstBooleanArray(String key, boolean[] value) {
108    m_backend.log(key, value);
109  }
110
111  @Override
112  public void addIntegerArrayProperty(
113      String key, Supplier<long[]> getter, Consumer<long[]> setter) {
114    if (getter != null) {
115      m_updates.add(() -> m_backend.log(key, getter.get()));
116    }
117  }
118
119  @Override
120  public void publishConstIntegerArray(String key, long[] value) {
121    m_backend.log(key, value);
122  }
123
124  @Override
125  public void addFloatArrayProperty(
126      String key, Supplier<float[]> getter, Consumer<float[]> setter) {
127    if (getter != null) {
128      m_updates.add(() -> m_backend.log(key, getter.get()));
129    }
130  }
131
132  @Override
133  public void publishConstFloatArray(String key, float[] value) {
134    m_backend.log(key, value);
135  }
136
137  @Override
138  public void addDoubleArrayProperty(
139      String key, Supplier<double[]> getter, Consumer<double[]> setter) {
140    if (getter != null) {
141      m_updates.add(() -> m_backend.log(key, getter.get()));
142    }
143  }
144
145  @Override
146  public void publishConstDoubleArray(String key, double[] value) {
147    m_backend.log(key, value);
148  }
149
150  @Override
151  public void addStringArrayProperty(
152      String key, Supplier<String[]> getter, Consumer<String[]> setter) {
153    if (getter != null) {
154      m_updates.add(() -> m_backend.log(key, getter.get()));
155    }
156  }
157
158  @Override
159  public void publishConstStringArray(String key, String[] value) {
160    m_backend.log(key, value);
161  }
162
163  @Override
164  public void addRawProperty(
165      String key, String typeString, Supplier<byte[]> getter, Consumer<byte[]> setter) {
166    if (getter != null) {
167      m_updates.add(() -> m_backend.log(key, getter.get()));
168    }
169  }
170
171  @Override
172  public void publishConstRaw(String key, String typeString, byte[] value) {
173    m_backend.log(key, value);
174  }
175
176  @Override
177  public BackendKind getBackendKind() {
178    return BackendKind.kUnknown;
179  }
180
181  @Override
182  public boolean isPublished() {
183    return true;
184  }
185
186  @Override
187  public void update() {
188    for (Runnable update : m_updates) {
189      update.run();
190    }
191  }
192
193  @Override
194  public void clearProperties() {
195    m_updates.clear();
196  }
197
198  @Override
199  public void addCloseable(AutoCloseable closeable) {
200    // Ignore
201  }
202
203  @Override
204  public void close() throws Exception {
205    clearProperties();
206  }
207}