diff --git a/app/src/main/java/xdsopl/robot36/Decoder.java b/app/src/main/java/xdsopl/robot36/Decoder.java index b7b493c..444795f 100644 --- a/app/src/main/java/xdsopl/robot36/Decoder.java +++ b/app/src/main/java/xdsopl/robot36/Decoder.java @@ -94,22 +94,22 @@ public class Decoder { lastSyncPulseIndex = curSample; syncPulse5msModes = new ArrayList<>(); syncPulse5msModes.add(RGBModes.Wraase_SC2_180(sampleRate)); - syncPulse5msModes.add(RGBModes.Martin("1", 0.146432, sampleRate)); - syncPulse5msModes.add(RGBModes.Martin("2", 0.073216, sampleRate)); + syncPulse5msModes.add(RGBModes.Martin("1", 44, 0.146432, sampleRate)); + syncPulse5msModes.add(RGBModes.Martin("2", 40, 0.073216, sampleRate)); syncPulse9msModes = new ArrayList<>(); syncPulse9msModes.add(robot36); syncPulse9msModes.add(new Robot_72_Color(sampleRate)); - syncPulse9msModes.add(RGBModes.Scottie("1", 0.138240, sampleRate)); - syncPulse9msModes.add(RGBModes.Scottie("2", 0.088064, sampleRate)); - syncPulse9msModes.add(RGBModes.Scottie("DX", 0.3456, sampleRate)); + syncPulse9msModes.add(RGBModes.Scottie("1", 60, 0.138240, sampleRate)); + syncPulse9msModes.add(RGBModes.Scottie("2", 56, 0.088064, sampleRate)); + syncPulse9msModes.add(RGBModes.Scottie("DX", 76, 0.3456, sampleRate)); syncPulse20msModes = new ArrayList<>(); - syncPulse20msModes.add(new PaulDon("50", 320, 0.09152, sampleRate)); - syncPulse20msModes.add(new PaulDon("90", 320, 0.17024, sampleRate)); - syncPulse20msModes.add(new PaulDon("120", 640, 0.1216, sampleRate)); - syncPulse20msModes.add(new PaulDon("160", 512, 0.195584, sampleRate)); - syncPulse20msModes.add(new PaulDon("180", 640, 0.18304, sampleRate)); - syncPulse20msModes.add(new PaulDon("240", 640, 0.24448, sampleRate)); - syncPulse20msModes.add(new PaulDon("290", 640, 0.2288, sampleRate)); + syncPulse20msModes.add(new PaulDon("50", 93, 320, 0.09152, sampleRate)); + syncPulse20msModes.add(new PaulDon("90", 99, 320, 0.17024, sampleRate)); + syncPulse20msModes.add(new PaulDon("120", 95, 640, 0.1216, sampleRate)); + syncPulse20msModes.add(new PaulDon("160", 98, 512, 0.195584, sampleRate)); + syncPulse20msModes.add(new PaulDon("180", 96, 640, 0.18304, sampleRate)); + syncPulse20msModes.add(new PaulDon("240", 97, 640, 0.24448, sampleRate)); + syncPulse20msModes.add(new PaulDon("290", 94, 640, 0.2288, sampleRate)); } private void adjustSyncPulses(int[] pulses, int shift) { @@ -154,6 +154,19 @@ public class Decoder { return bestMode; } + private Mode findMode(int code) { + for (Mode mode : syncPulse5msModes) + if (mode.getCode() == code) + return mode; + for (Mode mode : syncPulse9msModes) + if (mode.getCode() == code) + return mode; + for (Mode mode : syncPulse20msModes) + if (mode.getCode() == code) + return mode; + return rawMode; + } + private void copyUnscaled() { for (int row = 0; row < pixelBuffer.height; ++row) { int line = scopeBuffer.width * scopeBuffer.line; @@ -314,7 +327,7 @@ public class Decoder { } } if (detectHeader(last9msSyncPulses[last9msSyncPulses.length - 1])) - Log.d("Robot36", "VIS code: " + visCode); + Log.d("Robot36", "VIS mode: " + findMode(visCode).getName()); if (lastSyncPulseIndex >= scanLineReserveSamples && curSample > lastSyncPulseIndex + (lastScanLineSamples * 5) / 4) { copyLines(lastMode.decodeScanLine(pixelBuffer, scratchBuffer, scanLineBuffer, scopeBuffer.width, lastSyncPulseIndex, lastScanLineSamples, lastFrequencyOffset)); lastSyncPulseIndex += lastScanLineSamples; diff --git a/app/src/main/java/xdsopl/robot36/Mode.java b/app/src/main/java/xdsopl/robot36/Mode.java index 30c7e4e..d776d13 100644 --- a/app/src/main/java/xdsopl/robot36/Mode.java +++ b/app/src/main/java/xdsopl/robot36/Mode.java @@ -9,6 +9,8 @@ package xdsopl.robot36; public interface Mode { String getName(); + int getCode(); + int getScanLineSamples(); boolean decodeScanLine(PixelBuffer pixelBuffer, float[] scratchBuffer, float[] scanLineBuffer, int scopeBufferWidth, int syncPulseIndex, int scanLineSamples, float frequencyOffset); diff --git a/app/src/main/java/xdsopl/robot36/PaulDon.java b/app/src/main/java/xdsopl/robot36/PaulDon.java index da08414..49fab6a 100644 --- a/app/src/main/java/xdsopl/robot36/PaulDon.java +++ b/app/src/main/java/xdsopl/robot36/PaulDon.java @@ -18,10 +18,12 @@ public class PaulDon implements Mode { private final int yOddBeginSamples; private final int endSamples; private final String name; + private final int code; @SuppressWarnings("UnnecessaryLocalVariable") - PaulDon(String name, int horizontalPixels, double channelSeconds, int sampleRate) { + PaulDon(String name, int code, int horizontalPixels, double channelSeconds, int sampleRate) { this.name = "PD " + name; + this.code = code; this.horizontalPixels = horizontalPixels; double syncPulseSeconds = 0.02; double syncPorchSeconds = 0.00208; @@ -51,6 +53,11 @@ public class PaulDon implements Mode { return name; } + @Override + public int getCode() { + return code; + } + @Override public int getScanLineSamples() { return scanLineSamples; diff --git a/app/src/main/java/xdsopl/robot36/RGBDecoder.java b/app/src/main/java/xdsopl/robot36/RGBDecoder.java index e9eee60..a05a6f0 100644 --- a/app/src/main/java/xdsopl/robot36/RGBDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RGBDecoder.java @@ -19,9 +19,11 @@ public class RGBDecoder implements Mode { private final int blueSamples; private final int endSamples; private final String name; + private final int code; - RGBDecoder(String name, int horizontalPixels, double scanLineSeconds, double beginSeconds, double redBeginSeconds, double redEndSeconds, double greenBeginSeconds, double greenEndSeconds, double blueBeginSeconds, double blueEndSeconds, double endSeconds, int sampleRate) { + RGBDecoder(String name, int code, int horizontalPixels, double scanLineSeconds, double beginSeconds, double redBeginSeconds, double redEndSeconds, double greenBeginSeconds, double greenEndSeconds, double blueBeginSeconds, double blueEndSeconds, double endSeconds, int sampleRate) { this.name = name; + this.code = code; this.horizontalPixels = horizontalPixels; scanLineSamples = (int) Math.round(scanLineSeconds * sampleRate); beginSamples = (int) Math.round(beginSeconds * sampleRate); @@ -44,6 +46,11 @@ public class RGBDecoder implements Mode { return name; } + @Override + public int getCode() { + return code; + } + @Override public int getScanLineSamples() { return scanLineSamples; diff --git a/app/src/main/java/xdsopl/robot36/RGBModes.java b/app/src/main/java/xdsopl/robot36/RGBModes.java index 5a16881..6433778 100644 --- a/app/src/main/java/xdsopl/robot36/RGBModes.java +++ b/app/src/main/java/xdsopl/robot36/RGBModes.java @@ -9,7 +9,7 @@ package xdsopl.robot36; @SuppressWarnings("UnnecessaryLocalVariable") public final class RGBModes { - public static RGBDecoder Martin(String name, double channelSeconds, int sampleRate) { + public static RGBDecoder Martin(String name, int code, double channelSeconds, int sampleRate) { double syncPulseSeconds = 0.004862; double separatorSeconds = 0.000572; double scanLineSeconds = syncPulseSeconds + separatorSeconds + 3 * (channelSeconds + separatorSeconds); @@ -19,10 +19,10 @@ public final class RGBModes { double blueEndSeconds = blueBeginSeconds + channelSeconds; double redBeginSeconds = blueEndSeconds + separatorSeconds; double redEndSeconds = redBeginSeconds + channelSeconds; - return new RGBDecoder("Martin " + name, 320, scanLineSeconds, greenBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, redEndSeconds, sampleRate); + return new RGBDecoder("Martin " + name, code, 320, scanLineSeconds, greenBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, redEndSeconds, sampleRate); } - public static RGBDecoder Scottie(String name, double channelSeconds, int sampleRate) { + public static RGBDecoder Scottie(String name, int code, double channelSeconds, int sampleRate) { double syncPulseSeconds = 0.009; double separatorSeconds = 0.0015; double scanLineSeconds = syncPulseSeconds + 3 * (channelSeconds + separatorSeconds); @@ -32,7 +32,7 @@ public final class RGBModes { double greenBeginSeconds = greenEndSeconds - channelSeconds; double redBeginSeconds = separatorSeconds; double redEndSeconds = redBeginSeconds + channelSeconds; - return new RGBDecoder("Scottie " + name, 320, scanLineSeconds, greenBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, redEndSeconds, sampleRate); + return new RGBDecoder("Scottie " + name, code, 320, scanLineSeconds, greenBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, redEndSeconds, sampleRate); } public static RGBDecoder Wraase_SC2_180(int sampleRate) { @@ -46,6 +46,6 @@ public final class RGBModes { double greenEndSeconds = greenBeginSeconds + channelSeconds; double blueBeginSeconds = greenEndSeconds; double blueEndSeconds = blueBeginSeconds + channelSeconds; - return new RGBDecoder("Wraase SC2-180", 320, scanLineSeconds, redBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, blueEndSeconds, sampleRate); + return new RGBDecoder("Wraase SC2-180", 55, 320, scanLineSeconds, redBeginSeconds, redBeginSeconds, redEndSeconds, greenBeginSeconds, greenEndSeconds, blueBeginSeconds, blueEndSeconds, blueEndSeconds, sampleRate); } } diff --git a/app/src/main/java/xdsopl/robot36/RawDecoder.java b/app/src/main/java/xdsopl/robot36/RawDecoder.java index 622f6f7..077ae8a 100644 --- a/app/src/main/java/xdsopl/robot36/RawDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RawDecoder.java @@ -26,6 +26,11 @@ public class RawDecoder implements Mode { return "Raw"; } + @Override + public int getCode() { + return -1; + } + @Override public int getScanLineSamples() { return -1; diff --git a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java index 9bb36c1..de891c2 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java @@ -56,6 +56,11 @@ public class Robot_36_Color implements Mode { return "Robot 36 Color"; } + @Override + public int getCode() { + return 8; + } + @Override public int getScanLineSamples() { return scanLineSamples; diff --git a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java index db918e8..8a89786 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java @@ -54,6 +54,11 @@ public class Robot_72_Color implements Mode { return "Robot 72 Color"; } + @Override + public int getCode() { + return 12; + } + @Override public int getScanLineSamples() { return scanLineSamples;