/*!
    \file  rc5_decode.h
    \brief the header file of rc5 infrared decoding
*/

/*
    Copyright (C) 2017 GigaDevice

    2017-06-06, V1.0.0, firmware for GD32F3x0
*/

#ifndef RC5_DECODE_H
#define RC5_DECODE_H

#include "gd32f3x0.h"

/* rc5 frame structure */
typedef struct
{   
    __IO uint8_t field_bit;       /*!< field bit */   
    __IO uint8_t toggle_bit;      /*!< toggle bit field */
    __IO uint8_t address;         /*!< address field */ 
    __IO uint8_t command;         /*!< command field */ 
} rc5_frame_struct;

/* rc5 packet structure */
typedef struct
{
    __IO uint16_t data;          /*!< rc5 data */ 
    __IO uint8_t status;         /*!< rc5 status */
    __IO uint8_t last_bit;       /*!< rc5 last bit */
    __IO uint8_t bit_count;      /*!< rc5 bit count */
} trc5_packet_struct;

/* rc5 last bit type enum */
enum rc5_last_bit_type
{
    RC5_ZER,
    RC5_ONE,
    RC5_NAN,
    RC5_INV
};

typedef enum rc5_last_bit_type trc5_last_bit_type;

#define RC5_1T_TIME                          0x00
#define RC5_2T_TIME                          0x01
#define RC5_WRONG_TIME                       0xFF
#define RC5_TIME_OUT_US                      3600

/* half bit period */
#define RC5_T_US                             900

/* tolerance time */
#define RC5_T_TOLERANCE_US                   270
#define RC5_NUMBER_OF_VALID_PULSE_LENGTH     2

/* total bits */
#define RC5_PACKET_BIT_COUNT                 13

/* packet struct for reception */
#define RC5_PACKET_STATUS_EMPTY              (uint16_t)(1<<0)

void menu_rc5decode_func(void);
void rc5_decode_deinit(void);
void rc5_decode_init(void);
void rc5_decode(rc5_frame_struct *rc5_frame);
void rc5_reset_packet(void);
void rc5_data_sampling(uint16_t raw_pulse_length, uint8_t edge);

#endif /* RC5_DECODE_H */
