diff --git a/src/main/java/com/mykola2312/mptv/db/DBPool.java b/src/main/java/com/mykola2312/mptv/db/DBPool.java index 7434766..ed45239 100644 --- a/src/main/java/com/mykola2312/mptv/db/DBPool.java +++ b/src/main/java/com/mykola2312/mptv/db/DBPool.java @@ -47,8 +47,6 @@ public class DBPool implements ConnectionProvider { protected DBConnection spawnConnection() throws SQLException { DBConnection conn = new DBConnection(DriverManager.getConnection(url), false); connections.add(conn); - - logger.debug(String.format("spawned connection %s", conn.toString())); return conn; } @@ -72,7 +70,6 @@ public class DBPool implements ConnectionProvider { conn.beingUsed = true; - logger.debug(String.format("allocated connection %s", conn.toString())); return conn.connection; } diff --git a/src/main/java/com/mykola2312/mptv/piir/PiIR.java b/src/main/java/com/mykola2312/mptv/piir/PiIR.java index ef337eb..b968843 100644 --- a/src/main/java/com/mykola2312/mptv/piir/PiIR.java +++ b/src/main/java/com/mykola2312/mptv/piir/PiIR.java @@ -36,28 +36,62 @@ public class PiIR implements TaskProcess { private static final int BUFFER_SIZE = 512; + private enum ReaderState { + SKIPPING, + READING_JSON, + PARSE_JSON + } + @Override public void run() { + ReaderState state = ReaderState.SKIPPING; byte[] buf = new byte[BUFFER_SIZE]; + int off = 0; try { while (running && !Thread.currentThread().isInterrupted()) { // reader loop - int len = input.read(buf, 0, buf.length); + int len = input.read(buf, off, 1); if (len < 0) { logger.warn("reading error. exiting"); running = false; return; } - String line = new String( - Arrays.copyOfRange(buf, 0, len), - StandardCharsets.UTF_8); - try { - PiIRDump dump = PiIRDump.deserialize(line); + switch (buf[off]) { + case '{' -> state = ReaderState.READING_JSON; + case '}' -> state = ReaderState.PARSE_JSON; + } - piir.handleDump(dump); - } catch (JsonProcessingException e) { - logger.warn("failed to deserialize dump!", e); + switch (state) { + case SKIPPING -> {} + + case READING_JSON -> { + off++; + + if (off >= BUFFER_SIZE) { + logger.warn(String.format( + "buffer overflow from piir dump! %d >= %d", off, BUFFER_SIZE)); + state = ReaderState.SKIPPING; + off = 0; + } + } + + case PARSE_JSON -> { + String line = new String( + Arrays.copyOfRange(buf, 0, off+1), + StandardCharsets.UTF_8); + logger.info(line); + try { + PiIRDump dump = PiIRDump.deserialize(line); + + piir.handleDump(dump); + } catch (JsonProcessingException e) { + logger.warn("failed to deserialize dump!", e); + } finally { + state = ReaderState.SKIPPING; + off = 0; + } + } } } } catch (IOException e) { @@ -85,7 +119,7 @@ public class PiIR implements TaskProcess { @Override public boolean spawn() throws IOException { process = Runtime.getRuntime().exec(new String[] { - exec, "dump", "--gpio", String.valueOf(gpio) + "unbuffer", exec, "dump", "--gpio", String.valueOf(gpio) }); input = process.getInputStream(); @@ -122,6 +156,7 @@ public class PiIR implements TaskProcess { String key = formatBindKey(dump.pre_data, dump.data); MenuAction action = binds.get(key); if (action != null) { + logger.info("executing action " + action.toString()); Main.frame.action(action); } else { logger.warn(String.format( diff --git a/src/main/java/com/mykola2312/mptv/piir/PiIRDump.java b/src/main/java/com/mykola2312/mptv/piir/PiIRDump.java index cefc14d..a0b0142 100644 --- a/src/main/java/com/mykola2312/mptv/piir/PiIRDump.java +++ b/src/main/java/com/mykola2312/mptv/piir/PiIRDump.java @@ -1,8 +1,10 @@ package com.mykola2312.mptv.piir; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +@JsonIgnoreProperties(ignoreUnknown = true) public class PiIRDump { public String pre_data; public String data; diff --git a/src/main/java/com/mykola2312/mptv/ui/MenuAction.java b/src/main/java/com/mykola2312/mptv/ui/MenuAction.java index 0da6e74..4638dfc 100644 --- a/src/main/java/com/mykola2312/mptv/ui/MenuAction.java +++ b/src/main/java/com/mykola2312/mptv/ui/MenuAction.java @@ -16,5 +16,8 @@ public enum MenuAction { ACTION_RIGHT, @JsonProperty("open") - ACTION_OPEN + ACTION_OPEN, + + @JsonProperty("close") + ACTION_CLOSE } diff --git a/src/main/java/com/mykola2312/mptv/ui/MenuPanel.java b/src/main/java/com/mykola2312/mptv/ui/MenuPanel.java index de80e5e..6d20635 100644 --- a/src/main/java/com/mykola2312/mptv/ui/MenuPanel.java +++ b/src/main/java/com/mykola2312/mptv/ui/MenuPanel.java @@ -135,6 +135,8 @@ public class MenuPanel extends JPanel { } } } + + case ACTION_CLOSE -> closePlayer(); } if (categoryIndex < 0) categoryIndex = 0; if (channelIndex < 0) channelIndex = 0; diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 2110e94..cac9a05 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -17,12 +17,12 @@ - + - + \ No newline at end of file