/**
  ******************************************************************************
  * @file    USART.h
  * @author  lo_
  * @version V0.0.1
  * @date    2018.5.16
  * @brief   
  *          
  *          
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */
#ifndef  _CC2530_TRANSPARENT_ANALYZE_H
#define  _CC2530_TRANSPARENT_ANALYZE_H

#ifdef __cplusplus
 extern "C" {
#endif 


/* Includes ------------------------------------------------------------------*/
//#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
/* Exported macro ------------------------------------------------------------*/

//#define USATR_1_DEBUG     1

#if (USATR_1_DEBUG == 1)
 		#define DEBUG_USATR1(format,...)  printf(format,##__VA_ARGS__)
#else
		#define DEBUG_USATR1(format,...) 
#endif


typedef unsigned int   TP_u32;
typedef unsigned short TP_u16;
typedef unsigned char  TP_u8;
typedef signed char    TP_s8;
typedef int16_t        TP_s16;

typedef  TP_u32     TP_uc32;    /*!< Read Only */
typedef  TP_u16    TP_uc16;    /*!< Read Only */
typedef  TP_u8     TP_uc8;      /*!< Read Only */

typedef enum {TP_false = 0, TP_true = !TP_false} TP_bool;
typedef enum {TP_ERROR = 0, TP_SUCCESS = !TP_ERROR} TP_ErrorStatus;



//定时向cc2530 查询网络状态，如果定时为0，代表不查询
#define DEF_STATUS_CHECK_INTERVAL_TIME         10000   //(MS)


#define    BYTE_MOVE(high_byte,low_byte)    ((high_byte << 8) | low_byte)

/**************************************************************************************************************
公共部分
***************************************************************************************************************/

#define     SOF_HIGH_BYTE_DEF       0XAA
#define     SOF_LOW_BYTE_DEF        0X55

#define     USART_RECIVE_LEN_DEF                48         //串口最多一次接受的数据量
#define     USART_RECIVE_DEPTH                  12          //缓存的深度

//透传数据接受最大间隔时间，超时未接收到数据，停止一串数据接收
#define     DEF_TRANSPARENT_MAXIMUM_INTERVAL    100   //（ms）



enum NET_STATUS
{
    //未入网
    no_network = 0,
    //组网中
    networking,
    //已组网
    in_network,
};

//usart 数据接受
typedef struct _Recive_usart_data_deal
{
	TP_u8 Data[USART_RECIVE_LEN_DEF]; //中断中接受到的数据
    
    TP_u8 Recive_len;   //接收到数据的长度
    
    TP_u8 Data_len;     //需要接受的数据
   
    TP_u8 time;         //时间
	
}RECIVE_USART_DATA_DEAL;


//homebuf  buf缓存
#define _IO					    volatile 	/*!< Defines 'read / write' permissions              */

typedef struct _Recive_usart_buff
{   
     TP_u8 Usart_buff[USART_RECIVE_DEPTH][USART_RECIVE_LEN_DEF];  //homebus 缓存存放区
 _IO TP_u8 Usart_buff_len[USART_RECIVE_DEPTH];   //homebus 缓存区长度
 _IO TP_u8 Buff_send_serial_num;   //BUFF发送序列
 _IO TP_u8 Download_serial_num;    //BUFF缓存序列
}RECIVE_USART_BUFF;

//协议中的功能码
typedef struct Protocol_
{
    //序列号
    TP_u16 SEQ;
    //通道
    TP_u8 Channel_ID;// 
    //功能呢个码
    TP_u16 Opcode;
    //控制位
    TP_u8 ControlField;
    //数据
    TP_uc8* ARG;
    //长高度
    TP_u8 ARG_len;
}PROTOCOL_DEAL;

//协议中的功能码
typedef struct Protocol_send_
{
    //序列号
    //TP_u16 SEQ;
    //通道
    TP_u8 Channel_ID;// 
    //功能呢个码
    TP_u16 Opcode;
    //控制位
    TP_u8 ControlField;
    //数据
    TP_uc8* ARG;
    //长高度
    TP_u8 ARG_len;
}PROTOCOL_SEND;

/* Exported constants --------------------------------------------------------*/

/* Exported functions ------------------------------------------------------- */
/**************************************************************************************************************
外部使用的函数
***************************************************************************************************************/
void transparent_msg_deal(void);
void transparent_time_manage(TP_uc8 timer);
void transparent_msg_recive(TP_uc8 RcvChar);
void ack_dev_info(PROTOCOL_DEAL recv_data, TP_uc8* arg, TP_u8 len);

TP_ErrorStatus tp_function_init(void (*send_drive)(TP_uc8* msg,TP_u32 len),
                                void (*transparent_function_point)(PROTOCOL_DEAL protocol_data),
                                void (*non_permeable_function_point)(PROTOCOL_DEAL protocol_data));
								
void transparent_protocol_send(PROTOCOL_SEND send_protocol,TP_u16 SEQ);
																
void tp_usart_init(void (*usart_init)());
																
void opcode_check_status_report(TP_uc8 *recive_data);

//ADD BY YWQ
extern void transparent_data_analyze(PROTOCOL_DEAL recv_data);
extern void not_transparent_data_analyze(PROTOCOL_DEAL recv_data);
extern void UART1_Send_Bytes(TP_uc8* bffs, TP_u32 n);
#ifdef _DEBUG
 		#define DEBUG(format,...)  printf(format,##__VA_ARGS__)
#else
		#define DEBUG(format,...) 
#endif



#ifdef __cplusplus
}
#endif


#ifdef USE_PRINTF
    #include<stdio.h>
    int fputc(int ch, FILE *f);
#endif


#endif






