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}