find mode from VIS code

This commit is contained in:
Ahmet Inan 2024-04-29 07:49:58 +02:00
parent 0a506406f8
commit c2efb8036f
8 changed files with 64 additions and 20 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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);
}
}

View file

@ -26,6 +26,11 @@ public class RawDecoder implements Mode {
return "Raw";
}
@Override
public int getCode() {
return -1;
}
@Override
public int getScanLineSamples() {
return -1;

View file

@ -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;

View file

@ -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;