Display_Avr_3/hdlc.h

110 lines
3.2 KiB
C

//
// Created by 79513 on 15.12.2023.
//
#ifndef HDLC_H
#define HDLC_H
#include "fcs.h"
#include <errno.h>
#include <stdint.h>
#include <stddef.h>
/** HDLC start/end flag sequence */
#define HDLC_FLAG_SEQUENCE 0x7E
/** HDLC control escape value */
#define HDLC_CONTROL_ESCAPE 0x7D
/** HDLC all station address */
#define HDLC_ALL_STATION_ADDR 0xFF
/** Supported HDLC frame types */
typedef enum {
I_FRAME,
S_FRAME,
S_FRAME_NACK,
} hdlc_frame_t;
/** Control field information */
typedef struct {
hdlc_frame_t frame;
unsigned char seq_no :3;
} hdlc_control_t;
/** Variables used in hdlc_get_data and hdlc_get_data_with_state
* to keep track of received buffers
*/
typedef struct {
char control_escape;
FCS_SIZE fcs;
int start_index;
int end_index;
int src_index;
int dest_index;
} hdlc_state_t;
/**
* Retrieves data from specified buffer containing the HDLC frame. Frames can be
* parsed from multiple buffers e.g. when received via UART.
*
* @param[out] control Control field structure with frame type and sequence number
* @param[in] src Source buffer with frame
* @param[in] src_len Source buffer length
* @param[out] dest Destination buffer (should be able to contain max frame size)
* @param[out] dest_len Destination buffer length
* @retval >=0 Success (size of returned value should be discarded from source buffer)
* @retval -EINVAL Invalid parameter
* @retval -ENOMSG Invalid message
* @retval -EIO Invalid FCS (size of dest_len should be discarded from source buffer)
*
* @see hdlc_get_data_with_state
*/
int hdlc_get_data(hdlc_control_t *control, uint8_t *src,
size_t src_len, uint8_t *dest, size_t *dest_len);
/**
* Retrieves data from specified buffer containing the HDLC frame. Frames can be
* parsed from multiple buffers e.g. when received via UART.
*
* This function is a variation of @ref hdlc_get_data
* The difference is only in first argument: hdlc_state_t *state
* Data under that pointer is used to keep track of internal buffers.
*
* @see hdlc_get_data
*/
int hdlc_get_data_with_state(hdlc_state_t *state, hdlc_control_t *control, uint8_t *src,
size_t src_len, uint8_t *dest, size_t *dest_len);
/**
* Resets values used in yahdlc_get_data function to keep track of received buffers
*/
void hdlc_get_data_reset();
/**
* This is a variation of @ref hdlc_get_data_reset
* Resets state values that are under the pointer provided as argument
*
* This function need to be called before the first call to hdlc_get_data_with_state
* when custom state storage is used.
*
* @see hdlc_get_data_reset
*/
void hdlc_get_data_reset_with_state(hdlc_state_t *state);
/**
* Creates HDLC frame with specified data buffer.
*
* @param[in] control Control field structure with frame type and sequence number
* @param[in] src Source buffer with data
* @param[in] src_len Source buffer length
* @param[out] dest Destination buffer (should be bigger than source buffer)
* @param[out] dest_len Destination buffer length
* @retval 0 Success
* @retval -EINVAL Invalid parameter
*/
int hdlc_frame_data(hdlc_control_t *control, uint8_t *src,
size_t src_len, uint8_t *dest, size_t *dest_len);
#endif //HDLC_H