MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / writeSLIP

Method writeSLIP

tools/xsbug/esptool.js:646–703  ·  view source on GitHub ↗
(payload, purge = true)

Source from the content-addressed store, hash-verified

644 }
645 }
646 async writeSLIP(payload, purge = true) {
647 let escapes = 0;
648 payload = new Uint8Array(payload);
649 for (let i = 0; i < payload.length; i++) {
650 if (0xdb === payload[i])
651 escapes += 1;
652 if (0xc0 === payload[i])
653 escapes += 1;
654 }
655 let data = new Uint8Array(2 + payload.length + escapes);
656 data[0] = 0xc0;
657 for (let i = 0, o = 1; i < payload.length; i++) {
658 if (0xdb === payload[i]) {
659 data[o++] = 0xdb;
660 data[o++] = 0xdd;
661 }
662 else
663 if (0xc0 === payload[i]) {
664 data[o++] = 0xdb;
665 data[o++] = 0xdc;
666 }
667 else
668 data[o++] = payload[i];
669 }
670 data[data.length - 1] = 0xc0;
671
672 tracePacket("<<", data);
673 if (purge)
674 this.#serial.purge();
675
676 const buffer = data.buffer;
677 if (!this.#writeSpaceAvailable)
678 throw new Error("unexpected: not ready to write");
679
680 if (buffer.byteLength <= this.#writeSpaceAvailable) {
681 this.#serial.write(buffer);
682 this.#writeSpaceAvailable -= buffer.byteLength;
683 }
684 else {
685 let byteOffset = 0, byteLength = buffer.byteLength;
686
687 while (byteOffset < byteLength) {
688 const writePromise = new Promise(resolve => {
689 this.#writable = resolve;
690 });
691
692 let count = this.#writeSpaceAvailable;
693 if (count > (byteLength - byteOffset))
694 count = (byteLength - byteOffset)
695
696 this.#writeSpaceAvailable -= count;
697 this.#serial.write(buffer.slice(byteOffset, byteOffset + count));
698 byteOffset += count;
699
700 await writePromise;
701 }
702 }
703 }

Callers 2

readPartMethod · 0.95
commandMethod · 0.95

Calls 4

tracePacketFunction · 0.70
purgeMethod · 0.65
writeMethod · 0.65
sliceMethod · 0.65

Tested by

no test coverage detected