// Packetized serial transport with HDLC-style framing and sliding window // Provides reliable, ordered delivery over an unreliable serial link. #ifndef PACKET_H #define PACKET_H #include #include // Maximum payload per packet (excluding header/CRC) #define PKT_MAX_PAYLOAD 256 // Default sliding window size (1-8) #define PKT_DEFAULT_WINDOW 4 // Maximum window size #define PKT_MAX_WINDOW 8 // Error codes #define PKT_SUCCESS 0 #define PKT_ERR_INVALID_PORT -1 #define PKT_ERR_NOT_OPEN -2 #define PKT_ERR_ALREADY_OPEN -3 #define PKT_ERR_WOULD_BLOCK -4 #define PKT_ERR_OVERFLOW -5 #define PKT_ERR_INVALID_PARAM -6 #define PKT_ERR_TX_FULL -7 #define PKT_ERR_NO_DATA -8 // Callback for received packets // ctx: user context pointer // data: payload (valid only during callback) // len: payload length typedef void (*PktRecvCallbackT)(void *ctx, const uint8_t *data, int len); // Connection handle (opaque) typedef struct PktConnS PktConnT; // Open a packetized connection over a COM port. // com: RS232 COM port index (RS232_COM1..RS232_COM4), must already be open // windowSize: sliding window size (1..PKT_MAX_WINDOW), 0 for default // callback: called when a complete, verified packet is received // callbackCtx: user pointer passed to callback // Returns connection handle, or 0 on failure. PktConnT *pktOpen(int com, int windowSize, PktRecvCallbackT callback, void *callbackCtx); // Close a packetized connection. Does not close the underlying COM port. void pktClose(PktConnT *conn); // Send a packet. Returns PKT_SUCCESS or error. // Blocks if the transmit window is full and block is true. // Returns PKT_ERR_TX_FULL if window is full and block is false. int pktSend(PktConnT *conn, const uint8_t *data, int len, bool block); // Poll for incoming data, process received frames, handle retransmits. // Must be called frequently (e.g. in your main loop). // Returns the number of valid data packets delivered to the callback. int pktPoll(PktConnT *conn); // Reset the connection state (sequence numbers, buffers). // Sends a RST frame to the remote side. int pktReset(PktConnT *conn); // Get number of unacknowledged packets in the transmit window. int pktGetPending(PktConnT *conn); #endif