changing to support individual packet crc
This commit is contained in:
119
index.js
119
index.js
@@ -125,6 +125,8 @@ function handleWindowLoad() {
|
|||||||
packetizationPanel.setDataSizePower(16);
|
packetizationPanel.setDataSizePower(16);
|
||||||
packetizationPanel.setDataSizeCrc(8);
|
packetizationPanel.setDataSizeCrc(8);
|
||||||
packetizationPanel.setDataCrc(16);
|
packetizationPanel.setDataCrc(16);
|
||||||
|
packetizationPanel.setPacketCrc(8);
|
||||||
|
packetizationPanel.setSequenceNumberPower(16);
|
||||||
|
|
||||||
packetizationPanel.setErrorCorrection(true);
|
packetizationPanel.setErrorCorrection(true);
|
||||||
packetizationPanel.setInterleaving(true);
|
packetizationPanel.setInterleaving(true);
|
||||||
@@ -191,6 +193,8 @@ function handleWindowLoad() {
|
|||||||
packetizationPanel.addEventListener('dataSizePowerChange', configurationChanged);
|
packetizationPanel.addEventListener('dataSizePowerChange', configurationChanged);
|
||||||
packetizationPanel.addEventListener('dataSizeCrcChange', configurationChanged);
|
packetizationPanel.addEventListener('dataSizeCrcChange', configurationChanged);
|
||||||
packetizationPanel.addEventListener('dataCrcChange', configurationChanged);
|
packetizationPanel.addEventListener('dataCrcChange', configurationChanged);
|
||||||
|
packetizationPanel.addEventListener('packetCrcChange', configurationChanged);
|
||||||
|
packetizationPanel.addEventListener('sequenceNumberPowerChange', configurationChanged);
|
||||||
|
|
||||||
availableFskPairsPanel.addEventListener('change', (event) => {
|
availableFskPairsPanel.addEventListener('change', (event) => {
|
||||||
frequencyGraphPanel.setFskPairs(event.selected);
|
frequencyGraphPanel.setFskPairs(event.selected);
|
||||||
@@ -265,9 +269,7 @@ const handleReceivePanelStart = ({signalStart}) => {
|
|||||||
const handleReceivePanelReceive = ({signalStart, signalIndex, indexStart, bits}) => {
|
const handleReceivePanelReceive = ({signalStart, signalIndex, indexStart, bits}) => {
|
||||||
const packetIndex = PacketUtils.getPacketIndex(signalStart, indexStart);
|
const packetIndex = PacketUtils.getPacketIndex(signalStart, indexStart);
|
||||||
const segmentIndex = PacketUtils.getPacketSegmentIndex(signalStart, indexStart);
|
const segmentIndex = PacketUtils.getPacketSegmentIndex(signalStart, indexStart);
|
||||||
// Getting all 1's for only the first 5 segments?
|
StreamManager.addSample(packetIndex, segmentIndex, bits);
|
||||||
// console.log(signalIndex, packetIndex, segmentIndex, bits.join(''));
|
|
||||||
StreamManager.addBits(packetIndex, segmentIndex, bits);
|
|
||||||
}
|
}
|
||||||
const handleReceivePanelEnd = (e) => {
|
const handleReceivePanelEnd = (e) => {
|
||||||
frequencyGraphPanel.setSignalEnd(e.signalEnd);
|
frequencyGraphPanel.setSignalEnd(e.signalEnd);
|
||||||
@@ -329,6 +331,8 @@ function updatePacketUtils() {
|
|||||||
packetEncoding: packetizationPanel.getErrorCorrection(),
|
packetEncoding: packetizationPanel.getErrorCorrection(),
|
||||||
packetEncodingBitCount: ERROR_CORRECTION_BLOCK_SIZE,
|
packetEncodingBitCount: ERROR_CORRECTION_BLOCK_SIZE,
|
||||||
packetDecodingBitCount: ERROR_CORRECTION_DATA_SIZE,
|
packetDecodingBitCount: ERROR_CORRECTION_DATA_SIZE,
|
||||||
|
packetSequenceNumberBitCount: packetizationPanel.getSequenceNumberPower(),
|
||||||
|
packetCrcBitCount: packetizationPanel.getPacketCrc()
|
||||||
});
|
});
|
||||||
speedPanel.setMaximumDurationMilliseconds(PacketUtils.getMaxDurationMilliseconds());
|
speedPanel.setMaximumDurationMilliseconds(PacketUtils.getMaxDurationMilliseconds());
|
||||||
speedPanel.setDataBitsPerSecond(PacketUtils.getEffectiveBaud());
|
speedPanel.setDataBitsPerSecond(PacketUtils.getEffectiveBaud());
|
||||||
@@ -446,20 +450,17 @@ function sendBytes(bytes) {
|
|||||||
dataCrcNumber = CRC.check(bytes, dataCrcBitLength);
|
dataCrcNumber = CRC.check(bytes, dataCrcBitLength);
|
||||||
dataCrcBits = numberToBits(dataCrcNumber, dataCrcBitLength);
|
dataCrcBits = numberToBits(dataCrcNumber, dataCrcBitLength);
|
||||||
}
|
}
|
||||||
console.log('sending headers', {
|
const headers = [
|
||||||
// dataLengthBits,
|
|
||||||
// dataLengthCrcBits,
|
|
||||||
// dataCrcBits,
|
|
||||||
dataCrcHex: numberToHex(packetizationPanel.getDataCrc())(dataCrcNumber),
|
|
||||||
dataSizeCrcHex: numberToHex(packetizationPanel.getDataSizeCrc())(dataSizeCrcNumber),
|
|
||||||
})
|
|
||||||
|
|
||||||
// prefix with headers
|
|
||||||
bits.unshift(
|
|
||||||
...dataLengthBits,
|
...dataLengthBits,
|
||||||
...dataLengthCrcBits,
|
...dataLengthCrcBits,
|
||||||
...dataCrcBits
|
...dataCrcBits
|
||||||
);
|
];
|
||||||
|
// pad headers to take full bytes
|
||||||
|
while(headers.length % 8 !== 0) {
|
||||||
|
headers.push(0);
|
||||||
|
}
|
||||||
|
// prefix bits with headers
|
||||||
|
bits.unshift(...headers);
|
||||||
|
|
||||||
const bitCount = bits.length;
|
const bitCount = bits.length;
|
||||||
|
|
||||||
@@ -474,10 +475,12 @@ function sendBytes(bytes) {
|
|||||||
const packetCount = PacketUtils.getPacketCount(bitCount);
|
const packetCount = PacketUtils.getPacketCount(bitCount);
|
||||||
const totalDurationSeconds = PacketUtils.getDataTransferDurationSeconds(bitCount);
|
const totalDurationSeconds = PacketUtils.getDataTransferDurationSeconds(bitCount);
|
||||||
|
|
||||||
|
const packer = PacketUtils.pack(bits);
|
||||||
|
|
||||||
AudioSender.beginAt(startSeconds);
|
AudioSender.beginAt(startSeconds);
|
||||||
// send all packets
|
// send all packets
|
||||||
for(let i = 0; i < packetCount; i++) {
|
for(let i = 0; i < packetCount; i++) {
|
||||||
let packet = PacketUtils.getPacketBits(bits, i);
|
let packet = packer.getBits(i);
|
||||||
SENT_ENCODED_BITS.push(...packet);
|
SENT_ENCODED_BITS.push(...packet);
|
||||||
if(packet.length > packetBitCount) {
|
if(packet.length > packetBitCount) {
|
||||||
console.error('Too many bits in the packet. tried to send %s, limited to %s', packet.length, packetBitCount);
|
console.error('Too many bits in the packet. tried to send %s, limited to %s', packet.length, packetBitCount);
|
||||||
@@ -576,92 +579,8 @@ function resumeGraph() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleStreamManagerChange() {
|
function handleStreamManagerChange() {
|
||||||
const channelCount = availableFskPairsPanel.getSelectedFskPairs().length;
|
|
||||||
let allRawBits = StreamManager.getStreamBits();
|
|
||||||
let allEncodedBits = StreamManager.getAllPacketBits();
|
|
||||||
let allDecodedBits = StreamManager.getAllPacketBitsDecoded();
|
|
||||||
|
|
||||||
// get packet data before removing decoded bits
|
receivePanel.setProgress(StreamManager.getPercentReceived());
|
||||||
const transmissionByteCount = StreamManager.getTransferByteCount();
|
|
||||||
const transmissionByteCountCrc = StreamManager.getTransferByteCountCrc();
|
|
||||||
const transmissionByteCountActualCrc = StreamManager.getTransferByteCountActualCrc();
|
|
||||||
|
|
||||||
const trustedLength = StreamManager.isTransferByteCountTrusted();
|
|
||||||
const totalBitsTransferring = parseTotalBitsTransferring(allDecodedBits);
|
|
||||||
|
|
||||||
const transmissionDataCrc = StreamManager.getTransferDataCrc();
|
|
||||||
const transmissionDataActualCrc = StreamManager.getTransferActualDataCrc();
|
|
||||||
const transmissionCrc = document.getElementById('received-packet-original-data-crc');
|
|
||||||
transmissionCrc.innerText = numberToHex(packetizationPanel.getDataCrc())(transmissionDataCrc);
|
|
||||||
const trustedData = StreamManager.isTransferDataTrusted();
|
|
||||||
transmissionCrc.className = trustedData ? 'bit-correct' : 'bit-wrong';
|
|
||||||
if(!trustedData) {
|
|
||||||
transmissionCrc.innerText += ' (Expected ' + numberToHex(packetizationPanel.getDataCrc())(transmissionDataActualCrc) + ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
// reduce all decoded bits based on original data sent
|
|
||||||
allDecodedBits = removeDecodedHeadersAndPadding(allDecodedBits);
|
|
||||||
|
|
||||||
// reduce encoded bits based on original data sent
|
|
||||||
allEncodedBits = removeEncodedPadding(allEncodedBits);
|
|
||||||
|
|
||||||
const encodedBitCount = SENT_ENCODED_BITS.length;
|
|
||||||
const decodedBitCount = SENT_ORIGINAL_BITS.length;
|
|
||||||
const rawBitCount = SENT_TRANSFER_BITS.length;
|
|
||||||
|
|
||||||
const correctRawBits = allRawBits.filter((b, i) => i < rawBitCount && b === SENT_TRANSFER_BITS[i]).length;
|
|
||||||
const correctEncodedBits = allEncodedBits.filter((b, i) => i < encodedBitCount && b === SENT_ENCODED_BITS[i]).length;
|
|
||||||
const correctedDecodedBits = allDecodedBits.filter((b, i) => i < decodedBitCount && b === SENT_ORIGINAL_BITS[i]).length;
|
|
||||||
|
|
||||||
let percentReceived = StreamManager.sumTotalBits() / totalBitsTransferring;
|
|
||||||
receivePanel.setProgress(percentReceived);
|
|
||||||
|
|
||||||
bitsReceivedPanel.setCode(allRawBits
|
|
||||||
.reduce(
|
|
||||||
bitExpectorReducer(
|
|
||||||
SENT_TRANSFER_BITS,
|
|
||||||
PacketUtils.getPacketMaxBitCount() + PacketUtils.getPacketLastSegmentUnusedBitCount(),
|
|
||||||
channelCount,
|
|
||||||
(packetIndex, blockIndex) => `${blockIndex === 0 ? '' : '<br>'}Segment ${blockIndex}: `
|
|
||||||
),
|
|
||||||
''));
|
|
||||||
if(packetizationPanel.getErrorCorrection()) {
|
|
||||||
document.getElementById('received-encoded-bits').innerHTML = allEncodedBits
|
|
||||||
.reduce(
|
|
||||||
bitExpectorReducer(
|
|
||||||
SENT_ENCODED_BITS,
|
|
||||||
PacketUtils.getPacketDataBitCount(),
|
|
||||||
ERROR_CORRECTION_BLOCK_SIZE
|
|
||||||
),
|
|
||||||
'');
|
|
||||||
} else {
|
|
||||||
document.getElementById('received-encoded-bits').innerHTML = 'Not encoded.';
|
|
||||||
}
|
|
||||||
document.getElementById('received-decoded-bits').innerHTML = allDecodedBits
|
|
||||||
.reduce(
|
|
||||||
bitExpectorReducer(
|
|
||||||
SENT_ORIGINAL_BITS,
|
|
||||||
PacketUtils.getPacketDataBitCount(),
|
|
||||||
packetizationPanel.getErrorCorrection() ? ERROR_CORRECTION_DATA_SIZE : 8
|
|
||||||
),
|
|
||||||
'');
|
|
||||||
document.getElementById('received-packet-original-bytes').innerText = transmissionByteCount.toLocaleString();
|
|
||||||
const packetCrc = document.getElementById('received-packet-original-bytes-crc');
|
|
||||||
packetCrc.innerText = numberToHex(packetizationPanel.getDataSizeCrc())(transmissionByteCountCrc);
|
|
||||||
packetCrc.className = trustedLength ? 'bit-correct' : 'bit-wrong';
|
|
||||||
if(!trustedLength) {
|
|
||||||
packetCrc.innerText += ' (Expected ' + numberToHex(packetizationPanel.getDataSizeCrc())(transmissionByteCountActualCrc) + ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById('received-encoded-bits-error-percent').innerText = (
|
|
||||||
Math.floor((1 - (correctEncodedBits / allEncodedBits.length)) * 10000) * 0.01
|
|
||||||
).toLocaleString();
|
|
||||||
document.getElementById('received-raw-bits-error-percent').innerText = (
|
|
||||||
Math.floor((1 - (correctRawBits / allRawBits.length)) * 10000) * 0.01
|
|
||||||
).toLocaleString();
|
|
||||||
document.getElementById('received-decoded-bits-error-percent').innerText = (
|
|
||||||
Math.floor((1 - (correctedDecodedBits / allDecodedBits.length)) * 10000) * 0.01
|
|
||||||
).toLocaleString();
|
|
||||||
|
|
||||||
const bytes = StreamManager.getDataBytes();
|
const bytes = StreamManager.getDataBytes();
|
||||||
const receivedText = bytesToText(bytes);
|
const receivedText = bytesToText(bytes);
|
||||||
|
|||||||
Reference in New Issue
Block a user