#ifndef HDLC_FRAME_H
#define HDLC_FRAME_H

#include <stdint.h>

typedef struct {
    uint8_t address;
    uint8_t control;
    uint8_t* data;
    size_t data_length;
} HDLCFrame;

void init_HDLCFrame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_t* data, size_t data_length);
uint16_t calculate_fcs(const HDLCFrame *frame, size_t i);
void create_frame(const HDLCFrame* frame, uint8_t* result);

typedef struct {
    HDLCFrame base;
    uint8_t receive_sequence_number;
    uint8_t poll_final;
    uint8_t send_sequence_number;
} IFrame;

void init_IFrame(IFrame* frame, uint8_t address, uint8_t receive_sequence_number, uint8_t poll_final,
                 uint8_t send_sequence_number, uint8_t* data, size_t data_length);

typedef struct {
    HDLCFrame base;
    uint8_t receive_sequence_number;
    uint8_t poll_final;
    const char* frame_type;
} SFrame;

void init_SFrame(SFrame* frame, uint8_t address, uint8_t receive_sequence_number, uint8_t poll_final,
                 const char* frame_type);

typedef struct {
    HDLCFrame base;
    uint8_t poll_final;
    const char* frame_type;
} UFrame;

void init_UFrame(UFrame* frame, uint8_t address, uint8_t poll_final, const char* frame_type, uint8_t* data, size_t data_length);

#endif