68 lines
2.3 KiB
C
68 lines
2.3 KiB
C
// 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 <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
// 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
|