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}