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}