DVX_GUI/packet/packet.h

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