[READ-ONLY] Mirror of https://github.com/SantaClaas/embedded-fan-control.

Rebuild the serial tool on SolidJS 2.0 and pnpm, starting with the Modbus core master

Replaces the Svelte 4 app with a SolidJS 2.0 (RC) one on Vite 8, managed with pnpm, and rewrites the protocol layer from scratch rather than porting it. The UI is a support gate for now; the devices and the interface come in the layers above. The protocol layer is the part worth reviewing: - `crc.ts` — the CRC-16, and the fact that it is the one little-endian field in Modbus. - `pdu.ts` — how long a frame is and what it says, per function code. Request and response are different shapes for the same code and neither announces which it is, so length inference and role are kept separate. - `monitor.ts` — recovering frames from a bus this app is not driving, which the old tool could not do at all. RTU has no start byte, no length field and no terminator; frames are separated by 3.5 characters of silence that neither Web Serial nor the CH340 preserves. So timing is only a hint here. What actually recovers the framing is that a frame is self-checking: the function code narrows the end to one or two candidates and the CRC says which was right, while the single-master alternation of request and response breaks the tie between two 8-byte frames. Tests are built on frames copied out of the manufacturers' own manuals, check bytes included — those agree only if this code agrees with the devices rather than with itself. That paid for itself immediately: both humidity frames in docs/temperature-sensor.md carry wrong check bytes, which the test found. Both are corrected there, with a note saying why and how to recompute them. The monitor also grew a `suspect` state while under test. A frame length read out of a byte whose frame has not been checked can be nonsense, and waiting on it swallowed every good frame behind it in the same burst. It now looks further along for a frame that does check out, but only once the shape it was actually expecting has been checked and disproven — otherwise a long response still arriving would be cut apart on a coincidental checksum. Both halves of that are tested. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>