--- /dev/null
+package kaka.cakelight;
+
+public class AmbientMode extends Mode { // TODO split into DynamicAmbient and StaticAmbient?
+ private Thread thread; // TODO move to a dynamic sub class
+ private Configuration config;
+
+ @Override
+ public void enter(Configuration config) {
+ this.config = config;
+// LedFrame frame = LedFrame.from(config);
+// frame.fillColor(255, 0, 128);
+// frame.setLedColor(0, Color.rgb(255, 0, 0));
+// frame.setLedColor(1, Color.rgb(0, 255, 0));
+// frame.setLedColor(2, Color.rgb(0, 0, 255));
+// for (int i = 0; i < config.leds.getCount(); i++) {
+//// int v = 255 * i / config.leds.getCount();
+// int v = 60 * (i % 3);
+// frame.setLedColor(i, Color.rgb(v, v, v));
+// }
+// frameListener.accept(frame);
+ startThread();
+ }
+
+ @Override
+ public void exit() {
+ stopThread();
+ }
+
+ public void startThread() {
+ thread = new Thread() {
+ public void run() {
+ try {
+ long start = System.currentTimeMillis();
+ int index = 0;
+ while (!isInterrupted()) {
+ LedFrame frame = LedFrame.from(config);
+ updateFrame(frame, System.currentTimeMillis() - start, index);
+ updateWithFrame(frame);
+ index = (index + 1) % config.leds.getCount();
+ Thread.sleep(0);
+ }
+ } catch (InterruptedException e) {
+ }
+ }
+ };
+ thread.start();
+ }
+
+ public void stopThread() {
+ thread.interrupt();
+ }
+
+ /**
+ * @param frame
+ * @param time Time in milliseconds since start
+ * @param count Goes from 0 to number of LEDs - 1
+ */
+ private void updateFrame(LedFrame frame, long time, int count) {
+ frame.setLedColor(count, Color.rgb(255, 0, 0));
+ frame.setLedColor((count + 1) % config.leds.getCount(), Color.rgb(0, 255, 0));
+ frame.setLedColor((count + 2) % config.leds.getCount(), Color.rgb(0, 0, 255));
+// for (int i = 0; i < config.leds.getCount(); i++) {
+//
+// }
+ }
+}
private Mode mode;
private LedController ledController;
- public CakeLight(Configuration config) {
+ public CakeLight(Configuration config, LedController ledController) {
this.config = config;
- this.ledController = new LedController(config);
+ this.ledController = ledController;
}
public void setMode(Mode mode) {
import java.io.IOException;
public class LedController {
+ private SpiDevice spi;
+
public static void main(String args[]) {
new LedController(null);
}
public LedController(Configuration config) {
try {
- SpiDevice spi = SpiFactory.getInstance(SpiChannel.CS0);
- spi.write(
- (byte)0xff, (byte)0x0, (byte)0x0,
- (byte)0x00, (byte)0xff, (byte)0x0,
- (byte)0x0, (byte)0x00, (byte)0xff
- );
+ spi = SpiFactory.getInstance(SpiChannel.CS0);
+// spi.write(
+// (byte)0xff, (byte)0x0, (byte)0x0,
+// (byte)0x00, (byte)0xff, (byte)0x0,
+// (byte)0x0, (byte)0x00, (byte)0xff
+// );
} catch (IOException e) {
e.printStackTrace();
}
}
public void onFrame(LedFrame ledFrame) {
- // TODO
+ try {
+ spi.write(ledFrame.getBytes());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
}
Configuration config = Configuration.from("config.properties");
log("Running with config:\n" + config);
- CakeLight cakelight = new CakeLight(config);
- cakelight.setMode(new VideoMode());
+ CakeLight cakelight = new CakeLight(config, new LedController(config));
+ cakelight.setMode(new AmbientMode());
cakelight.startLoop();
// try {
// Thread.sleep(1000);
import java.util.function.Consumer;
public abstract class Mode {
- protected Consumer<LedFrame> frameListener;
+ private Consumer<LedFrame> frameListener;
public abstract void enter(Configuration config);
public abstract void exit();
public void setFrameListener(Consumer<LedFrame> listener) {
frameListener = listener;
}
+
+ public void updateWithFrame(LedFrame frame) {
+ assert frameListener != null;
+ frameListener.accept(frame);
+ }
}
}
private void onFrame(Frame frame) {
- assert frameListener != null;
- frameListener.accept(frame.getLedFrame());
+ updateWithFrame(frame.getLedFrame());
}
public void onVideoDeviceChange(Optional<File> videoDevice) {