I wrote my own KISS library, and I framed it such that any arduino Stream object may be assigned to the KISS and logging interfaces. This will help later when I develop an html configuration page and need to change interfaces on the fly.
I posted a demo here: https://github.com/rkinnett/Esp32-Bluetooth-KISS-Demo
In this demo, I associate the KISS interface with Bluetooth serial, and I assign logging to the (USB) serial port. I'm using Winlink to generate KISS messages over Bluetooth and am showing the message parsing in the Arduino Serial Monitor window:
This demo is one-way only, from host to TNC. I have not yet worked out functions for encapsulating received AX.25 packets into KISS frames, and more generally, I have not worked out AFSK modulation and demodulation at all.
I expect AFSK modulation will be a piece of cake since I have already worked out the method to extract to-be-transmitted AX.25 packets from KISS frames, with KISS special character handling, so now it's just a matter of generating AFSK from the binary packets. I don't need to know anything about the AX.25 protocol since the KISS interface is just the transport for AX.25 packets which are to be transmitted verbatim, except for special character handling. Demodulation will be more interesting. I'm hoping digitization of the frequency-modulated audio signal is straightforward, although others have reported problems with ADC timing on the Esp32. I have not yet researched DSP methods for frequency-ID to convert the digitized frequency-modulated audio signal into binary and ultimately reassemble the received AX.25 packet. Also, is error checking handled at the physical layer or at the link layer? Encapsulating received AX.25 packets into KISS frames should be easy.
Next step: AFSK modulation