remove packet size prefix from packet
This commit is contained in:
@@ -35,7 +35,6 @@
|
|||||||
<h2>Decoded</h2>
|
<h2>Decoded</h2>
|
||||||
<div class="raw-data" id="decoded-data"></div><br />
|
<div class="raw-data" id="decoded-data"></div><br />
|
||||||
Error Percent: <span id="decoded-data-error-percent">N/A</span>%<br />
|
Error Percent: <span id="decoded-data-error-percent">N/A</span>%<br />
|
||||||
Data Byte Count: <span id="decoded-byte-count">N/A</span><br />
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2>Decoded Text</h2>
|
<h2>Decoded Text</h2>
|
||||||
|
|||||||
59
index.js
59
index.js
@@ -185,9 +185,9 @@ function handleTextToSendInput() {
|
|||||||
const text = textToSend.value;
|
const text = textToSend.value;
|
||||||
const dataByteCount = text.length;
|
const dataByteCount = text.length;
|
||||||
const dataBitCount = dataByteCount * 8;
|
const dataBitCount = dataByteCount * 8;
|
||||||
const nibblesToEncode = HAMMING_ERROR_CORRECTION ? Math.ceil((dataBitCount + PACKET_SIZE_BITS) / 4) : 0;
|
const nibblesToEncode = HAMMING_ERROR_CORRECTION ? Math.ceil((dataBitCount) / 4) : 0;
|
||||||
const errorCorrectionBits = nibblesToEncode * 3;
|
const errorCorrectionBits = nibblesToEncode * 3;
|
||||||
const totalBits = errorCorrectionBits + dataBitCount + PACKET_SIZE_BITS;
|
const totalBits = errorCorrectionBits + dataBitCount;
|
||||||
const totalBytes = Math.ceil(totalBits / 8);
|
const totalBytes = Math.ceil(totalBits / 8);
|
||||||
const channelCount = getChannels().length;
|
const channelCount = getChannels().length;
|
||||||
const segmentCount = Math.ceil(totalBits / channelCount);
|
const segmentCount = Math.ceil(totalBits / channelCount);
|
||||||
@@ -202,7 +202,7 @@ function handleTextToSendInput() {
|
|||||||
document.getElementById('packet-send-channel-count').innerText = channelCount.toLocaleString();
|
document.getElementById('packet-send-channel-count').innerText = channelCount.toLocaleString();
|
||||||
document.getElementById('packet-send-segment-count').innerText = segmentCount.toLocaleString();
|
document.getElementById('packet-send-segment-count').innerText = segmentCount.toLocaleString();
|
||||||
document.getElementById('packet-send-segment-duration').innerText = (SEGMENT_DURATION / 1000).toLocaleString();
|
document.getElementById('packet-send-segment-duration').innerText = (SEGMENT_DURATION / 1000).toLocaleString();
|
||||||
document.getElementById('data-size-header-bits').innerText = PACKET_SIZE_BITS.toLocaleString();
|
document.getElementById('data-size-header-bits').innerText = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateFrequencyResolution() {
|
function updateFrequencyResolution() {
|
||||||
@@ -461,14 +461,6 @@ function sendBits(bits) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const packetLength = ((byteCount - 1) >>> 0)
|
|
||||||
.toString(2)
|
|
||||||
.padStart(PACKET_SIZE_BITS, '0')
|
|
||||||
.split('')
|
|
||||||
.map(Number);
|
|
||||||
|
|
||||||
bits.unshift(...packetLength);
|
|
||||||
|
|
||||||
EXPECTED_BITS = bits.slice();
|
EXPECTED_BITS = bits.slice();
|
||||||
|
|
||||||
document.getElementById('sent-data').value = bits.reduce(bitReducer, '');
|
document.getElementById('sent-data').value = bits.reduce(bitReducer, '');
|
||||||
@@ -565,6 +557,7 @@ function collectSample() {
|
|||||||
// we already have this sample
|
// we already have this sample
|
||||||
if(time === frequencyOverTime[0].time) return;
|
if(time === frequencyOverTime[0].time) return;
|
||||||
}
|
}
|
||||||
|
const channelCount = getChannels().length;
|
||||||
const frequencies = new Uint8Array(analyser.frequencyBinCount);
|
const frequencies = new Uint8Array(analyser.frequencyBinCount);
|
||||||
analyser.getByteFrequencyData(frequencies);
|
analyser.getByteFrequencyData(frequencies);
|
||||||
const length = audioContext.sampleRate / analyser.fftSize;
|
const length = audioContext.sampleRate / analyser.fftSize;
|
||||||
@@ -593,11 +586,15 @@ function collectSample() {
|
|||||||
// proposed end
|
// proposed end
|
||||||
data.streamEnded = priorStreamEnded;
|
data.streamEnded = priorStreamEnded;
|
||||||
} else {
|
} else {
|
||||||
|
const totalBits = 2 ** PACKET_SIZE_BITS;
|
||||||
|
const segments = Math.ceil(totalBits / channelCount);
|
||||||
|
const duration = segments * SEGMENT_DURATION;
|
||||||
if(pauseTimeoutId) {
|
if(pauseTimeoutId) {
|
||||||
window.clearTimeout(pauseTimeoutId);
|
window.clearTimeout(pauseTimeoutId);
|
||||||
pauseTimeoutId = undefined;
|
pauseTimeoutId = undefined;
|
||||||
// recover prior bit stream
|
// recover prior bit stream
|
||||||
data.streamStarted = LAST_STREAM_STARTED;
|
data.streamStarted = LAST_STREAM_STARTED;
|
||||||
|
data.streamEnded = LAST_STREAM_STARTED + duration;
|
||||||
} else {
|
} else {
|
||||||
// new bit stream
|
// new bit stream
|
||||||
data.streamStarted = time;
|
data.streamStarted = time;
|
||||||
@@ -606,6 +603,7 @@ function collectSample() {
|
|||||||
packetReceivedBits.length = 0;
|
packetReceivedBits.length = 0;
|
||||||
packetUninterlievedBits.length = 0;
|
packetUninterlievedBits.length = 0;
|
||||||
packetDataByteCount = 0;
|
packetDataByteCount = 0;
|
||||||
|
data.streamEnded = time + duration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -698,7 +696,6 @@ if((sampleDuration / SEGMENT_DURATION) < LAST_SEGMENT_PERCENT) return;
|
|||||||
packetReceivedBits.push(...bitValues);
|
packetReceivedBits.push(...bitValues);
|
||||||
packetUninterlievedBits.push(...removeInterleaving(bitValues));
|
packetUninterlievedBits.push(...removeInterleaving(bitValues));
|
||||||
|
|
||||||
const encodingRatio = HAMMING_ERROR_CORRECTION ? ERROR_CORRECTION_BLOCK_SIZE/4 : 1;
|
|
||||||
if(HAMMING_ERROR_CORRECTION) {
|
if(HAMMING_ERROR_CORRECTION) {
|
||||||
packetDecodedBits.length = 0;
|
packetDecodedBits.length = 0;
|
||||||
for(let i = 0; i < packetUninterlievedBits.length; i += ERROR_CORRECTION_BLOCK_SIZE) {
|
for(let i = 0; i < packetUninterlievedBits.length; i += ERROR_CORRECTION_BLOCK_SIZE) {
|
||||||
@@ -711,38 +708,6 @@ if((sampleDuration / SEGMENT_DURATION) < LAST_SEGMENT_PERCENT) return;
|
|||||||
packetDecodedBits.push(...packetUninterlievedBits);
|
packetDecodedBits.push(...packetUninterlievedBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine if we can identify the length of data comming
|
|
||||||
const encodedBitsNeededForDataLength = Math.ceil(Math.ceil(PACKET_SIZE_BITS / 4) * encodingRatio);
|
|
||||||
if(packetDecodedBits.length >= encodedBitsNeededForDataLength) {
|
|
||||||
// we can evaluate when we should know many bytes are comming
|
|
||||||
const dataLengthIndex = Math.floor(encodedBitsNeededForDataLength / channelCount);
|
|
||||||
// if(dataLengthIndex === segmentIndex) {
|
|
||||||
// we just got the bits we needed
|
|
||||||
packetDataByteCount = 1 + packetDecodedBits
|
|
||||||
.slice(0, PACKET_SIZE_BITS)
|
|
||||||
.reduce((value, bit) => (value << 1) | bit);
|
|
||||||
document.getElementById('decoded-byte-count').innerText = packetDataByteCount;
|
|
||||||
// let's get the end time
|
|
||||||
const totalBits = Math.ceil(((packetDataByteCount * 8) + PACKET_SIZE_BITS) * encodingRatio);
|
|
||||||
const segments = Math.ceil(totalBits / channelCount);
|
|
||||||
const duration = segments * SEGMENT_DURATION;
|
|
||||||
const streamEnded = streamStarted + duration;
|
|
||||||
// update everyones proposed end time
|
|
||||||
frequencyOverTime
|
|
||||||
.filter(fot => fot.streamStarted === streamStarted)
|
|
||||||
.forEach(fot => {
|
|
||||||
fot.streamEnded = streamEnded
|
|
||||||
});
|
|
||||||
// }
|
|
||||||
// remove phantom bits
|
|
||||||
// const totalBits = Math.ceil(((packetDataByteCount * 8) + PACKET_SIZE_BITS) * encodingRatio);
|
|
||||||
if(packetReceivedBits.length > totalBits) {
|
|
||||||
// const excess = packetReceivedBits.length % totalBits;
|
|
||||||
// packetReceivedBits.length = totalBits;
|
|
||||||
// bitValues.length = bitValues.length - excess;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById('decoded-data').innerHTML = packetDecodedBits.reduce(bitExpectorReducer(EXPECTED_BITS), '');
|
document.getElementById('decoded-data').innerHTML = packetDecodedBits.reduce(bitExpectorReducer(EXPECTED_BITS), '');
|
||||||
document.getElementById('received-data').innerHTML = packetReceivedBits.reduce(bitExpectorReducer(EXPECTED_ENCODED_BITS), '');
|
document.getElementById('received-data').innerHTML = packetReceivedBits.reduce(bitExpectorReducer(EXPECTED_ENCODED_BITS), '');
|
||||||
|
|
||||||
@@ -779,14 +744,14 @@ const bitExpectorReducer = expected => (all, bit, i) => {
|
|||||||
}
|
}
|
||||||
const textExpectorReducer = expected => (all, bit, i, bits) => {
|
const textExpectorReducer = expected => (all, bit, i, bits) => {
|
||||||
if(i < PACKET_SIZE_BITS) return all;
|
if(i < PACKET_SIZE_BITS) return all;
|
||||||
if((i - PACKET_SIZE_BITS) % 8 === 0) {
|
if(i % 8 === 0) {
|
||||||
const bitString = bits.slice(
|
const bitString = bits.slice(
|
||||||
i,
|
i,
|
||||||
i + 8
|
i + 8
|
||||||
).join('').padEnd(8, '0');
|
).join('').padEnd(8, '0');
|
||||||
const ascii = parseInt(bitString, 2);
|
const ascii = parseInt(bitString, 2);
|
||||||
const char = String.fromCharCode(ascii);
|
const char = String.fromCharCode(ascii);
|
||||||
const charIndex = Math.floor((i - PACKET_SIZE_BITS) / 8);
|
const charIndex = Math.floor(i / 8);
|
||||||
if(char !== expected[charIndex]) {
|
if(char !== expected[charIndex]) {
|
||||||
all += '<span class="bit-wrong">' + htmlEncode(printable(char)) + '</span>';
|
all += '<span class="bit-wrong">' + htmlEncode(printable(char)) + '</span>';
|
||||||
} else {
|
} else {
|
||||||
@@ -1121,7 +1086,7 @@ function getDataBitCount() {
|
|||||||
return dataByteCount * 8;
|
return dataByteCount * 8;
|
||||||
}
|
}
|
||||||
function getPacketSizeUnencodedBitCount() {
|
function getPacketSizeUnencodedBitCount() {
|
||||||
return getDataBitCount() + PACKET_SIZE_BITS;
|
return getDataBitCount();
|
||||||
}
|
}
|
||||||
function getErrorCorrectionBlocks() {
|
function getErrorCorrectionBlocks() {
|
||||||
if(!HAMMING_ERROR_CORRECTION) return 0;
|
if(!HAMMING_ERROR_CORRECTION) return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user