X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2FConsole.java;h=76bd6e57d6b6c1fae9facbb63c21791d88cf0f68;hb=be3f24968584e816ad89e318f1d0f9078f90d200;hp=7f8b8eeb53954c9ad97e0036103a36e0ffc66c5a;hpb=e2721d511abab891e138bc87ab6b6cf2a90bdf19;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/Console.java b/src/kaka/cakelight/Console.java index 7f8b8ee..76bd6e5 100644 --- a/src/kaka/cakelight/Console.java +++ b/src/kaka/cakelight/Console.java @@ -8,11 +8,14 @@ import kaka.cakelight.mode.VideoMode; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.*; public class Console extends Thread { private CakeLight cakelight; private Configuration config; private BufferedReader reader; + private Map commands = new HashMap<>(); + private List commandList = new ArrayList<>(); public static void start(CakeLight cakelight, Configuration config) { new Console(cakelight, config).start(); @@ -22,6 +25,41 @@ public class Console extends Thread { this.cakelight = cakelight; this.config = config; reader = new BufferedReader(new InputStreamReader(System.in)); + register(new HelpCommand()); + register(TwoColorNoiseMode.getCommand()); + } + + public CakeLight getCakelight() { + return cakelight; + } + + public Configuration getConfig() { + return config; + } + + private class HelpCommand implements Command { + @Override + public String[] getNames() { + return new String[] {"?", "h", "help"}; + } + + @Override + public void activate(Console console, String[] args) { + for (Command c : commandList) { + System.out.println(String.join("|", c.getNames())); + } + } + } + + private void register(Command cmd) { + for (String name : cmd.getNames()){ + if (commands.containsKey(name)) { + System.out.println("Command name '" + name + "' is already registered by '" + commands.get(name).getClass() + "'!"); + System.exit(1); + } + commands.put(name, cmd); + } + commandList.add(cmd); } @Override @@ -30,6 +68,18 @@ public class Console extends Thread { System.out.print("> "); try { String input = reader.readLine(); + String[] splitInput = input.split("\\s+", 2); + String name = splitInput[0]; + String[] args = splitInput.length == 2 + ? splitInput[1].split("\\s+") + : new String[]{}; + + Command cmd = commands.get(name); + if (cmd != null) { + cmd.activate(this, args); + continue; + } + if (input.matches("[0-5]")) { cakelight.setMode(new AmbientMode(new String[] {input})); System.out.println("setting ambient mode to " + input); @@ -62,7 +112,7 @@ public class Console extends Thread { config.video.saturation = Double.parseDouble(split[1]); System.out.println("setting saturation to " + config.video.saturation); } else if (input.matches("(n|noise)(\\s+[a-z0-9]+){2}")) { - TwoColorNoiseMode.getCommand().activate(cakelight, config, input.split("\\s+")); + TwoColorNoiseMode.getCommand().activate(this, input.split("\\s+")); System.out.println("setting two-color noise mode"); } } catch (IOException e) { @@ -74,6 +124,37 @@ public class Console extends Thread { public interface Command { String[] getNames(); - void activate(CakeLight cakelight, Configuration config, String[] args); + void activate(Console console, String[] args); + + default Color parseColor(String s) { + switch (s.toLowerCase()) { + case "r": return Color.rgb(255, 0, 0); + case "g": return Color.rgb(0, 255, 0); + case "b": return Color.rgb(0, 0, 255); + default: // assume hexadecimal + if (s.startsWith("#")) { + s = s.substring(1); + } + if (s.length() == 3) { + return Color.rgb( + Integer.parseInt(s.substring(0, 1), 16) * 16 + Integer.parseInt(s.substring(0, 1), 16), + Integer.parseInt(s.substring(1, 2), 16) * 16 + Integer.parseInt(s.substring(1, 2), 16), + Integer.parseInt(s.substring(2, 3), 16) * 16 + Integer.parseInt(s.substring(2, 3), 16) + ); + } else if (s.length() == 6) { + return Color.rgb( + Integer.parseInt(s.substring(0, 2), 16), + Integer.parseInt(s.substring(2, 4), 16), + Integer.parseInt(s.substring(4, 6), 16) + ); + } + } + System.out.println("Failed to parse color '" + s + "'. Using black instead."); + return Color.BLACK; + } + + default void output(String text) { + System.out.println("(" + text + ")"); + } } }