fix crc check not being available

This commit is contained in:
Lewis Moten
2024-05-17 21:45:00 -04:00
parent bef7fcd0f3
commit 6f4b898f52
3 changed files with 35 additions and 14 deletions

View File

@@ -11,7 +11,8 @@ const dispatcher = new Dispatcher('StreamManager', [
'change', 'change',
'packetReceived', 'packetReceived',
'packetFailed', 'packetFailed',
'sizeReceived' 'sizeReceived',
'crcAvailable'
]); ]);
let DATA = new Uint8ClampedArray(); let DATA = new Uint8ClampedArray();
let FAILED_SEQUENCES = []; let FAILED_SEQUENCES = [];
@@ -85,8 +86,8 @@ export const applyPacket = ({
size size
}) => { }) => {
let trustedSize = isSizeTrusted(); let trustedSize = isSizeTrusted();
let crcAvailable = getCrcAvailable();
if(!isPacketInRange(sequence)) return; if(!isPacketInRange(sequence)) return;
const dataSize = PacketUtils.getPacketDataByteCount(); const dataSize = PacketUtils.getPacketDataByteCount();
const offset = sequence * dataSize; const offset = sequence * dataSize;
const length = offset + dataSize; const length = offset + dataSize;
@@ -102,14 +103,27 @@ export const applyPacket = ({
copy.set(DATA.subarray(0, DATA.length), 0); copy.set(DATA.subarray(0, DATA.length), 0);
DATA = copy; DATA = copy;
} }
// NOTE: overwrites prior successful packets
DATA.set(bytes, offset); DATA.set(bytes, offset);
if(!trustedSize && isSizeTrusted()) { if(!trustedSize && isSizeTrusted()) {
const dataSize = getSize();
const headerSize = getStreamHeaderByteCount();
const totalLength = dataSize + headerSize;
// We may now have a trusted size. update prior failures. // We may now have a trusted size. update prior failures.
FAILED_SEQUENCES = FAILED_SEQUENCES.filter(isPacketInRange); FAILED_SEQUENCES = FAILED_SEQUENCES.filter(isPacketInRange);
// Prior failed packets may have made our array to big
if(DATA.length > totalLength) {
const copy = new Uint8ClampedArray(totalLength);
copy.set(DATA.subarray(0, totalLength), 0);
DATA = copy;
}
dispatcher.emit('sizeReceived'); dispatcher.emit('sizeReceived');
} }
if(!crcAvailable && getCrcAvailable()) {
dispatcher.emit('crcAvailable');
}
dispatcher.emit('packetReceived'); dispatcher.emit('packetReceived');
} else { } else {
// do nothing if previously successful // do nothing if previously successful
@@ -130,7 +144,7 @@ export const getNeededPacketIndeces = () => {
let packetCount; let packetCount;
let sizeTrusted = isSizeTrusted(); let sizeTrusted = isSizeTrusted();
if(!sizeTrusted) { if(!sizeTrusted) {
packetCount = getFailedPacketIndeces().reduce((max, i) => Math.max(max, i)); packetCount = getFailedPacketIndeces().reduce((max, i) => Math.max(max, i), 0);
} else { } else {
packetCount = countExpectedPackets(); packetCount = countExpectedPackets();
} }
@@ -169,10 +183,10 @@ export const setPacketsExpected = packetCount => {
const hasPackets = (start, end) => { const hasPackets = (start, end) => {
for(let packetIndex = start; packetIndex <= end; packetIndex++) { for(let packetIndex = start; packetIndex <= end; packetIndex++) {
// We need this packet, but it failed to transfer
if(FAILED_SEQUENCES.includes(packetIndex)) return false;
// We need this packet, but it hasn't come through yet // We need this packet, but it hasn't come through yet
if(!SUCCESS_SEQUENCES.includes(packetIndex)) return false; if(!SUCCESS_SEQUENCES.includes(packetIndex)) return false;
// We need this packet, but it failed to transfer
if(FAILED_SEQUENCES.includes(packetIndex)) return false;
} }
return true; return true;
} }
@@ -180,7 +194,7 @@ const hasBytes = (index, length) => {
if(DATA.length < index + length) return false; if(DATA.length < index + length) return false;
const packetSize = PacketUtils.getPacketDataByteCount(); const packetSize = PacketUtils.getPacketDataByteCount();
const start = Math.floor(index / packetSize); const start = Math.floor(index / packetSize);
const end = Math.floor(index + length / packetSize); const end = Math.floor((index + --length) / packetSize);
return hasPackets(start, end); return hasPackets(start, end);
} }
export const getSizeAvailable = () => { export const getSizeAvailable = () => {
@@ -228,13 +242,12 @@ export const getSizeCrc = () => {
let startBitIndex = DATA_SIZE_BIT_COUNT; let startBitIndex = DATA_SIZE_BIT_COUNT;
let endBitIndex = startBitIndex + DATA_SIZE_CRC_BIT_COUNT; let endBitIndex = startBitIndex + DATA_SIZE_CRC_BIT_COUNT;
let startByte = Math.floor(startBitIndex / 8); let startByte = Math.floor(startBitIndex / 8);
let endByte = Math.ceil(endBitIndex / 8); let endByte = Math.ceil(endBitIndex / 8);
if(DATA.length < endByte) return CRC.INVALID; if(DATA.length < endByte) return CRC.INVALID;
let bits = bytesToBits(DATA.subarray(startByte, endByte)); let bits = bytesToBits(DATA.subarray(startByte, endByte));
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex); if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex % 8);
bits.length = DATA_SIZE_CRC_BIT_COUNT; bits.length = DATA_SIZE_CRC_BIT_COUNT;
return bitsToInt(bits, DATA_SIZE_CRC_BIT_COUNT); return bitsToInt(bits, DATA_SIZE_CRC_BIT_COUNT);
} }
@@ -249,7 +262,7 @@ export const getCrc = () => {
if(DATA.length < endByte) return CRC.INVALID; if(DATA.length < endByte) return CRC.INVALID;
let bits = bytesToBits(DATA.subarray(startByte, endByte)); let bits = bytesToBits(DATA.subarray(startByte, endByte));
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex); if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex % 8);
bits.length = DATA_CRC_BIT_COUNT; bits.length = DATA_CRC_BIT_COUNT;
return bitsToInt(bits, DATA_CRC_BIT_COUNT); return bitsToInt(bits, DATA_CRC_BIT_COUNT);
} }
@@ -272,7 +285,7 @@ export const getCrcAvailable = () => {
const headerByteCount = headerBitCount / 8; const headerByteCount = headerBitCount / 8;
byteCount += headerByteCount; byteCount += headerByteCount;
return hasBytes(0, byteCount); return hasBytes(0, byteCount); // 487 + 5 = 492
} }
export const getSizeCrcPassed = () => { export const getSizeCrcPassed = () => {
if(!getSizeCrcAvailable()) return false; if(!getSizeCrcAvailable()) return false;

View File

@@ -1,8 +1,13 @@
export const numberToBytes = (number, bitLength) => { export const numberToBytes = (number, bitLength) => {
const byteCount = Math.ceil(bitLength/8);
const bytes = []; const bytes = [];
for(let i = 0; i < byteCount; i++) { let byte = 0;
bytes.push((number >> (8 * (byteCount - 1 - i))) & 0xFF); for(let i = 0; i < bitLength; i++) {
let bit = (number >> (bitLength - 1 - i)) & 1;
byte = (byte << 1) | bit;
if((i + 1) % 8 === 0 || i === bitLength - 1) {
bytes.push(byte);
byte = 0;
}
} }
return bytes; return bytes;
} }

View File

@@ -223,6 +223,9 @@ function handleWindowLoad() {
StreamManager.addEventListener('sizeReceived', () => { StreamManager.addEventListener('sizeReceived', () => {
receivePanel.setExpectedPacketCount(StreamManager.countExpectedPackets()); receivePanel.setExpectedPacketCount(StreamManager.countExpectedPackets());
}); });
StreamManager.addEventListener('crcAvailable', () => {
packetErrorPanel.setCrcPassed(StreamManager.getCrcPassed());
});
StreamManager.addEventListener('packetFailed', () => { StreamManager.addEventListener('packetFailed', () => {
receivePanel.setFailedPacketCount(StreamManager.countFailedPackets()); receivePanel.setFailedPacketCount(StreamManager.countFailedPackets());
packetErrorPanel.setFailedPacketIndeces(StreamManager.getFailedPacketIndeces()); packetErrorPanel.setFailedPacketIndeces(StreamManager.getFailedPacketIndeces());