Add fire mode
[kaka/cakelight.git] / src / kaka / cakelight / Commands.java
index 75b1b10..8f61713 100644 (file)
@@ -1,11 +1,9 @@
 package kaka.cakelight;
 
-import kaka.cakelight.mode.AmbientMode;
-import kaka.cakelight.mode.SingleColorMode;
-import kaka.cakelight.mode.TwoColorNoiseMode;
-import kaka.cakelight.mode.VideoMode;
+import kaka.cakelight.mode.*;
 
 import java.util.function.BiFunction;
+import java.util.stream.Stream;
 
 class Commands {
     private static Console.Command command(String[] names, BiFunction<Console, String[], Boolean> activate) {
@@ -16,31 +14,74 @@ class Commands {
            }
 
            @Override
-           public void activate(Console console, String[] args) {
+           public Object activate(Console console, String[] args) {
                if (!activate.apply(console, args)) {
                    console.out("did NOT run command");
                }
+               return null;
            }
        };
     }
 
+    private static Console.Command modeCommand(String[] names, BiFunction<Console, String[], Mode> activate) {
+        return new Console.Command() {
+           @Override
+           public String[] getNames() {
+               return names;
+           }
+
+           @Override
+           public Object activate(Console console, String[] args) {
+               Mode mode = activate.apply(console, args);
+               if (mode == null) {
+                   console.out("did NOT run command");
+               }
+               return mode;
+           }
+       };
+    }
+
+    static Console.Command help() {
+       return command(new String[] {"?", "h", "help"}, (console, args) -> {
+           for (Console.Command c : console.getCommands()) {
+               System.out.println(String.join("|", c.getNames()));
+           }
+           return true;
+       });
+    }
+
     static Console.Command quit() {
        return command(new String[] {"q", "quit"}, (console, args) -> {
-           console.getCakelight().turnOff();
-           console.out("stopping cakelight");
+           console.quit();
+           console.out("terminating");
            return true;
        });
     }
 
-    static Console.Command video() {
-        return command(new String[] {"v", "video"}, (console, args) -> {
-           console.getCakelight().setMode(new VideoMode());
-           return true;
+    static Console.Command push() {
+        return command(new String[] {"push"}, (console, args) -> {
+            Object obj = console.internalHandleInput(String.join(" ", args));
+           if (obj instanceof Mode) { // obj could be anything, which should be fixed
+               console.out("pushing mode " + obj.getClass().getSimpleName());
+               console.getCakelight().pushMode((Mode) obj);
+           }
+            return true;
        });
     }
 
+    static Console.Command pop() {
+        return command(new String[] {"pop"}, (console, args) -> {
+            console.out("popping mode " + console.getCakelight().popMode().getClass().getSimpleName());
+            return true;
+       });
+    }
+
+    static Console.Command video() {
+        return modeCommand(new String[] {"v", "video"}, (console, args) -> new VideoMode());
+    }
+
     static Console.Command color() {
-        return command(new String[] {"c", "col", "color"}, (console, args) -> {
+        return modeCommand(new String[] {"c", "col", "color"}, (console, args) -> {
             Color c = null;
             if (args.length == 1) {
                c = console.parseColor(args[0]);
@@ -52,19 +93,22 @@ class Commands {
                );
            }
             if (c != null) {
-               console.getCakelight().setMode(new SingleColorMode(c));
                console.out("setting color to " + c);
-               return true;
-            } else {
-               return false;
+               return new SingleColorMode(c);
            }
+           return null;
        });
     }
 
     static Console.Command brightness() {
        return command(new String[] {"b", "brightness"}, (console, args) -> {
            if (args.length == 1) {
-               int b = Integer.parseInt(args[0]);
+               int b = Integer.parseInt(args[0].replaceAll("[+-]+", ""));
+               if (args[0].startsWith("+")) {
+                   b = Math.min(console.getConfig().leds.brightness + b, 31);
+               } else if (args[0].startsWith("-")) {
+                   b = Math.max(console.getConfig().leds.brightness - b, 0);
+               }
                console.getConfig().leds.brightness = b;
                console.out("setting brightness to " + b);
                return true;
@@ -102,29 +146,49 @@ class Commands {
     }
 
     static Console.Command ambientMode() {
-        return command(new String[] {"m", "mode"}, (console, args) -> {
+        return modeCommand(new String[] {"m", "mode"}, (console, args) -> {
            if (args.length == 1) {
-               console.getCakelight().setMode(new AmbientMode(new String[] {args[0]}));
                console.out("setting ambient mode to " + args[0]);
-               return true;
-           } else {
-               return false;
+               return new AmbientMode(new String[]{args[0]});
            }
+           return null;
        });
     }
 
-    static Console.Command twoColorNoiseMode() {
-        return command(new String[] {"n", "noise"}, (console, args) -> {
-           if (args.length == 2) {
-               console.getCakelight().setMode(new TwoColorNoiseMode(
-                       console.parseColor(args[0]),
-                       console.parseColor(args[1])
-               ));
-               console.out("setting two-color noise mode");
-               return true;
-           } else {
-               return false;
+    static Console.Command noiseMode() {
+        return modeCommand(new String[] {"n", "noise"}, (console, args) -> {
+           if (args.length > 1) {
+               console.out("setting multi-color noise mode");
+               return new NoiseMode(Stream.of(args)
+                                            .map(console::parseColor)
+                                            .toArray(Color[]::new)
+               );
+           }
+           return null;
+       });
+    }
+
+    static Console.Command fireMode() {
+        return modeCommand(new String[] {"f", "fire"}, (console, args) -> {
+           if (args.length > 1) {
+               console.out("setting multi-color fire mode");
+               return new FireMode(Stream.of(args)
+                       .map(console::parseColor)
+                       .toArray(Color[]::new)
+               );
+           }
+           return null;
+       });
+    }
+
+    static Console.Command sunriseMode() {
+        return modeCommand(new String[] {"sunrise"}, (console, args) -> {
+           if (args.length == 1) {
+               int durationSeconds = Integer.parseInt(args[0]);
+               console.out("setting sunrise mode with duration " + durationSeconds);
+               return new SunriseMode(durationSeconds);
            }
+           return null;
        });
     }
 }