Skip to content

File baton_link.h

File List > inc > baton_link.h

Go to the documentation of this file

#ifndef BATON_LINK_H
#define BATON_LINK_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include "baton_protocol.h"

#ifdef __cplusplus
extern "C"
{
#endif

#define BATON_LINK_NONE 0
#define BATON_LINK_FRAME 1
#define BATON_LINK_TX_DONE 2

typedef int (*baton_write_fn)(void* context, const uint8_t* data, size_t length);

struct baton_link_config
{
    baton_write_fn write;          
    void* context;                 
    uint32_t baudrate;             
    uint8_t tx_gap_ms;             
    uint8_t inter_byte_timeout_ms; 
    bool rx_echo;                  
};

struct baton_link_counters
{
    uint32_t tx_frames;   
    uint32_t rx_frames;   
    uint32_t crc_errors;  
    uint32_t rx_timeouts; 
    uint32_t collisions;  
    uint32_t tx_timeouts; 
};

struct baton_link
{
    struct baton_link_config config;     
    struct baton_parser parser;          
    struct baton_link_counters counters; 
    volatile uint8_t rx_buffer[BATON_RX_BUF_SIZE]; 
    volatile uint16_t rx_head;                     
    volatile uint16_t rx_tail;                     
    volatile uint32_t rx_overflows;                
    volatile bool tx_done_flag;                    
    const uint8_t* tx_data;  
    uint16_t tx_length;      
    uint16_t echo_index;     
    bool echo_error;         
    uint8_t tx_state;        
    uint32_t tx_start_ms;    
    uint32_t last_tx_end_ms; 
    uint32_t last_rx_ms;     
};

int baton_link_init(struct baton_link* link, const struct baton_link_config* config,
                    uint32_t now_ms);

void baton_link_rx_isr(struct baton_link* link, uint8_t byte);

void baton_link_tx_done_isr(struct baton_link* link);

int baton_link_receive(struct baton_link* link, uint32_t now_ms);

int baton_link_transmit(struct baton_link* link, uint32_t now_ms);

int baton_link_send(struct baton_link* link, const uint8_t* data, size_t length);

void baton_link_cancel(struct baton_link* link);

const struct baton_frame* baton_link_frame(const struct baton_link* link);

bool baton_link_rx_busy(const struct baton_link* link, uint32_t now_ms);

uint32_t baton_link_frame_ms(const struct baton_link* link, uint32_t bytes);

#ifdef __cplusplus
}
#endif

#endif /* BATON_LINK_H */