93 lines
2.4 KiB
C
93 lines
2.4 KiB
C
/*
|
|
* kl_session.h
|
|
* Session layer: 5-baud init, handshake, ident stream, session lifecycle.
|
|
*/
|
|
|
|
#ifndef KL_SESSION_H
|
|
#define KL_SESSION_H
|
|
|
|
#include "kl_protocol.h"
|
|
|
|
/* ================================================================
|
|
* Session states
|
|
* ================================================================ */
|
|
typedef enum {
|
|
KL_SESS_IDLE,
|
|
|
|
/* 5-baud address reception */
|
|
KL_SESS_5BAUD_SAMPLING,
|
|
KL_SESS_5BAUD_DONE,
|
|
|
|
/* Handshake: sync + keywords */
|
|
KL_SESS_HS_SYNC,
|
|
KL_SESS_HS_SYNC_WAIT,
|
|
KL_SESS_HS_KW_LSB,
|
|
KL_SESS_HS_KW_LSB_WAIT,
|
|
KL_SESS_HS_KW_MSB,
|
|
KL_SESS_HS_KW_MSB_WAIT,
|
|
KL_SESS_HS_WAIT_ACK,
|
|
|
|
/* Identification stream */
|
|
KL_SESS_IDENT_SEND,
|
|
KL_SESS_IDENT_WAIT_TX,
|
|
KL_SESS_IDENT_WAIT_ACK,
|
|
KL_SESS_IDENT_FINAL_ACK,
|
|
KL_SESS_IDENT_FINAL_WAIT,
|
|
|
|
/* Active session */
|
|
KL_SESS_READY,
|
|
KL_SESS_CMD_RX,
|
|
KL_SESS_CMD_DISPATCH,
|
|
KL_SESS_CMD_RESPONSE,
|
|
KL_SESS_CMD_NAK_WAIT, /* Sending NAK after invalid packet */
|
|
|
|
/* Teardown */
|
|
KL_SESS_TERMINATE
|
|
} KL_SessionState;
|
|
|
|
/* ================================================================
|
|
* Session context
|
|
* ================================================================ */
|
|
typedef struct {
|
|
KL_SessionState state;
|
|
|
|
/* 5-baud sampling */
|
|
uint8_t five_bit_index;
|
|
uint8_t five_byte;
|
|
uint8_t five_active;
|
|
|
|
/* Handshake */
|
|
uint8_t hs_retry_count;
|
|
uint32_t hs_next_tick;
|
|
|
|
/* Identification stream */
|
|
uint8_t ident_buf[KL_IDENT_BUF_SIZE];
|
|
uint8_t ident_len;
|
|
uint8_t ident_offset;
|
|
uint8_t ident_chunk_len; /* Current chunk size being sent */
|
|
|
|
/* Session keepalive */
|
|
uint32_t session_deadline;
|
|
|
|
/* Connection status: 0=idle, 1=connecting, 2=active */
|
|
volatile uint8_t connection_status;
|
|
|
|
/* Signal from app layer that End command was handled */
|
|
uint8_t end_requested;
|
|
} KL_Session;
|
|
|
|
/* ================================================================
|
|
* API
|
|
* ================================================================ */
|
|
void KL_Session_Init(void);
|
|
void KL_Session_Service(void);
|
|
uint8_t KL_Session_GetStatus(void);
|
|
void KL_Session_RequestEnd(void); /* Called by app on CMD_End */
|
|
void KL_Session_Kick(void); /* Extend session deadline */
|
|
|
|
/* ISR callbacks */
|
|
void KL_Session_OnExtiRxFalling(void);
|
|
void KL_Session_OnTim17Elapsed(void);
|
|
|
|
#endif /* KL_SESSION_H */
|