prepared for mode individual decoders

This commit is contained in:
Ahmet Inan 2024-04-19 17:34:58 +02:00
parent cfef97e6b4
commit 4f716e76a5
9 changed files with 106 additions and 16 deletions

View file

@ -12,6 +12,7 @@ public class Decoder {
private final Demodulator demodulator;
private final float[] scanLineBuffer;
private final int[] pixelBuffer;
private final int[] scopePixels;
private final int[] last5msSyncPulses;
private final int[] last9msSyncPulses;
@ -35,6 +36,7 @@ public class Decoder {
this.scopePixels = scopePixels;
this.scopeWidth = scopeWidth;
this.scopeHeight = scopeHeight;
pixelBuffer = new int[scopeWidth];
demodulator = new Demodulator(sampleRate);
double scanLineMaxSeconds = 5;
int scanLineMaxSamples = (int) Math.round(scanLineMaxSeconds * sampleRate);
@ -92,17 +94,6 @@ public class Decoder {
return stdDev;
}
private void processOneLine(int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return;
for (int i = 0; i < scopeWidth; ++i) {
int position = (i * scanLineSamples) / scopeWidth + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
scopePixels[scopeWidth * curLine + i] = pixelColor;
}
}
private Mode detectMode(ArrayList<Mode> modes, int line) {
Mode bestMode = rawMode;
int bestDist = Integer.MAX_VALUE;
@ -116,6 +107,12 @@ public class Decoder {
return bestMode;
}
private void slideOneLine() {
System.arraycopy(pixelBuffer, 0, scopePixels, scopeWidth * curLine, scopeWidth);
System.arraycopy(pixelBuffer, 0, scopePixels, scopeWidth * (curLine + scopeHeight), scopeWidth);
curLine = (curLine + 1) % scopeHeight;
}
private boolean processSyncPulse(ArrayList<Mode> modes, int[] pulses, int[] lines, int index) {
for (int i = 1; i < lines.length; ++i)
lines[i - 1] = lines[i];
@ -135,10 +132,12 @@ public class Decoder {
int extrapolate = endPulse / meanSamples;
int firstPulse = endPulse - extrapolate * meanSamples;
for (int pulseIndex = firstPulse; pulseIndex < endPulse; pulseIndex += meanSamples)
processOneLine(pulseIndex, meanSamples);
if (mode.decodeScanLine(pixelBuffer, scanLineBuffer, pulseIndex, meanSamples))
slideOneLine();
}
for (int i = 0; i < lines.length; ++i)
processOneLine(pulses[i], lines[i]);
if (mode.decodeScanLine(pixelBuffer, scanLineBuffer, pulses[i], lines[i]))
slideOneLine();
int shift = pulses[pulses.length - 1];
adjustSyncPulses(last5msSyncPulses, shift);
adjustSyncPulses(last9msSyncPulses, shift);
@ -147,9 +146,6 @@ public class Decoder {
curSample = 0;
for (int i = shift; i < endSample; ++i)
scanLineBuffer[curSample++] = scanLineBuffer[i];
for (int i = 0; i < scopeWidth; ++i)
scopePixels[scopeWidth * (curLine + scopeHeight) + i] = scopePixels[scopeWidth * curLine + i];
curLine = (curLine + 1) % scopeHeight;
return true;
}

View file

@ -27,4 +27,17 @@ public class Martin implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -8,5 +8,8 @@ package xdsopl.robot36;
public interface Mode {
String getName();
int getScanLineSamples();
boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples);
}

View file

@ -27,4 +27,17 @@ public class PaulDon implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -20,4 +20,17 @@ public class Raw implements Mode {
public int getScanLineSamples() {
return -1;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -29,4 +29,17 @@ public class Robot_36_Color implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -29,4 +29,17 @@ public class Robot_72_Color implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -27,4 +27,17 @@ public class Scottie implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}

View file

@ -26,4 +26,17 @@ public class Wraase_SC2_180 implements Mode {
public int getScanLineSamples() {
return scanLineSamples;
}
@Override
public boolean decodeScanLine(int[] pixelBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
return false;
for (int i = 0; i < pixelBuffer.length; ++i) {
int position = (i * scanLineSamples) / pixelBuffer.length + prevPulseIndex;
int intensity = (int) Math.round(255 * Math.sqrt(scanLineBuffer[position]));
int pixelColor = 0xff000000 | 0x00010101 * intensity;
pixelBuffer[i] = pixelColor;
}
return true;
}
}