//
// Created by dell on 24-12-3.
//

#ifndef RS485_H
#define RS485_H

#include "gd32e23x_it.h"
#include "gd32e23x.h"
#include "systick.h"
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#define RS485_RCU            RCU_USART0
#define RS485_GPIO_RCU       RCU_GPIOA
#define RS485_GPIO_PORT      GPIOA
#define RS485_TX_PIN         GPIO_PIN_2
#define RS485_RX_PIN         GPIO_PIN_3
#define RS485_PHY            USART0
#define RS485_BAUDRATE       115200U

#define RS485_EN_PIN         GPIO_PIN_1

#define RX_BUFFER_SIZE 64

typedef enum {
    VALIDATION_SUCCESS = 0,
    VALIDATION_CRC_ERROR = 1
} validation_result_t;

void rs485_config(void);
void process_command(uint8_t *cmd, size_t length);
uint8_t calculate_crc(uint8_t data[], size_t data_length);
validation_result_t validate_package_header(uint8_t *data);
validation_result_t validate_package_type(uint8_t *data);
void eddy_current_value_report(void);
void tempture_value_report(void);

#endif //RS485_H