#ifndef WEBSOCKET_H_ #define WEBSOCKET_H_ #define WS_PORT 8080 #define WS_TIMEOUT 10 #define WS_DEBUG LWIP_DBG_ON #define WS_MAX_RETRIES 10 #define WS_POLL_INTERVAL 60 // WS_POLL_INTERVAL/2 seconds #define WS_MAX_CONN 4 struct ws_state { bool active; uint8_t retries; struct altcp_pcb *pcb; struct ws_state *next; }; #define WS_ALLOC_WS_STATE() (struct ws_state *)mem_malloc(sizeof(struct ws_state)) typedef void (* tWSHandler ) (uint8_t *data, uint16_t len); typedef void (* tWSOpenHandler ) (struct ws_state * wss); static struct ws_state* ws_state_alloc(void); static void ws_state_init(struct ws_state *wss); static void ws_state_free(struct ws_state *wss); void ws_server_init(void); static void ws_server_init_pcb( struct altcp_pcb *pcb, uint16_t port); static err_t ws_accept(void *arg, struct altcp_pcb *pcb, err_t err); static err_t ws_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err); static void ws_err (void *arg, err_t err); static err_t ws_close_conn(struct altcp_pcb *pcb, struct ws_state *wss); static err_t ws_close_or_abort_conn(struct altcp_pcb *pcb, struct ws_state *wss, uint8_t abort_conn); static err_t ws_poll(void *arg, struct altcp_pcb *pcb); static err_t ws_handshake(struct altcp_pcb *pcb, struct ws_state *wss, struct pbuf *p); static err_t ws_read(struct altcp_pcb *pcb, struct ws_state *wss, struct pbuf *p); static err_t ws_send(struct ws_state *wss, uint8_t *data, uint16_t len); void ws_send_all(uint8_t *data, uint16_t len); void ws_set_receive_handler( tWSHandler ws_handler); void ws_set_open_handler( tWSOpenHandler ws_handler); #endif