/****************************************************************************************************
* created by sunpeng 2017 all rights reserved!
****************************************************************************************************/

#ifndef __INCLUDE_H__
#define __INCLUDE_H__

#include "version.h"
#include "datatypes.h"
#include "uart_api.h"

/* 调试模式，定以后代表开启，注释掉后关闭调试模式 */
//#define DEBUG

//#define  bool unsigned int
#define true 1
#define false 0 

#define mpu_TRUE 	0
#define mpu_FALSE 	-1


/*** 主函数调试模式，定以后代表开启，注释掉后关闭调试模式 ***/
//#define DEBUG_MAIN

#if ARCH_MODE == NRF52832_Slave_Mode
#include "boards.h"

#elif ARCH_MODE == CC254X_Peripheral_Mode
#include "OSAL.h"

#elif ARCH_MODE == NRF51802_Peripheral_Mode
#include "boards.h"

#endif

/********************************************************/

typedef enum
{
	ROLL_DIRECTION_MIN = -1,
    ROLL_DIRECTION_Clockwise,				//顺时针转动
    ROLL_DIRECTION_AntiClockwise,			//逆时针转动
	ROLL_DIRECTION_MAX
}ROLL_DIRECTION_ENUM;			//转动方向

typedef enum
{
	ROLL_1STEP_DEGREE_MIN = -1,
	ROLL_1STEP_DEGREE_45,					//45度为一步
	ROLL_1STEP_DEGREE_90,					//90度为一步
	ROLL_1STEP_DEGREE_MAX
}ROLL_1STEP_DEGREE_ENUM;		//转动一步所占度数


typedef struct
{
	char flag;						//周期到达标志 true=周期到
	char isAllowPeriodTrigFlag;		//是否允许重复触发 false=只触发一次  true=重复触发
	char isTrigedOnceFlag;			//是否已经触发过一次，配合isAllowPeriodTrigFlag使用,防止单次模式下重复触发
	unsigned int cnt;				//周期计数
	unsigned int cntMax;			//周期计数上限
}STATUS_CTL_STRUCT;			//标准周期计数控制数据

extern const u8 Num_Tab[];			//="0123456789";
extern u8 debug_str[64];			//public debug printf string temp

/********************************************************/
/**
* extern include variables
*
*/
extern u16 iTimCntLedShineIntervalCnt;		//Led闪烁时间间隙计数

#if ARCH_MODE == ESP8266_Station_Mode
extern s8 wifiResetReady_Flag;				//
extern s8 wifiApConnected_Flag;				//wifi Ap 连接成功标志
extern u8 wifiConnectWaitDelayCnt;			//
extern s8 udpClientLink1Connected_Flag;		//udp Client 链接1 链接udpServer成功
extern u8 udpClientLink1ConnectedWaitDelayCnt;		//
#endif

extern s8 wireless_connected_Flag;			//无线连接成功标志 true=已连接  false=断开

extern s8 COMAppCmdCheckByte_Flag ; 		//串口字符串协议解析程序 标志位
extern int lineAllMatchCnt;			  		//当前匹配第几条AT返回关键字符串

extern s8 RF_RecEN_Flag;				 	//无线定时接收中断使能标志位


extern s8 rotation_upload_en_Flag;			//使能 上传 转动数据
extern s8 cell_res_data_upload_en_Flag;		// 

#if MOTION_SENSOR_TYPE != MOTION_SENSOR_TYPE_NONE
extern s8 motion_sensor_inited_Flag;		//运动传感器已经初始化成功
extern s8 angle_3x_upload_en_Flag;			//使能 上传 三轴角度数据
extern u16 angle_3x_detect_Cnt;				//
extern s8 angle_3x_detect_Flag;				//

extern float pitch, roll, yaw;  			//三轴角度数据
#endif

extern const u8 ADC_CHAN_SIGN[];			// = "URDLFB";
extern const u8 ADC_CHAN_SIGN_BL[];				// = "URDLFBurdlfb";
extern const u8 ALL_COLOR_SIGN[];			//所有面颜色符号

extern NET_DATA_STRUCT netData;

extern s8 isLedTeachQueueDoing;				//led转动面自动提示进行中标志


extern s8 DEBUG_FLAG;						//全局调试模式 标志
extern s8 mpu_init_Flag;					//mpu三轴是否初始化成功

#define AxisPerFpc 3   						//每块FPC电路拥有的轴数

#define ADC_CHAN_SIGN_MAX  6  				//ADC_CHAN_SIGN 数组成员最大个数

extern s8 APServerCubeDebugMailAdd_Flag;	//AP Server CubeDebug无线调试 回复抄送标志

/*****************************************************************/
extern STATUS_CTL_STRUCT isLedTeachQueueDoingStatus;
extern s8 LedTeachQueueEnable_Flag;			// = false;

extern STATUS_CTL_STRUCT DispatchSetRotationUploadFreq,DispatchSetColorUploadFreq;  //上传频率控制
#define chargeDoingLedShineTimeout_Max				4			//充电中提示灯自动超时关闭最大值
extern STATUS_CTL_STRUCT chargeDoingLedShineTimeout;  			//充电中提示灯自动超时关闭
#define chargeFinishedLedShineTimeout_Max			5			//充电满提示灯自动超时关闭最大值
extern STATUS_CTL_STRUCT chargeFinishedLedShineTimeout;  		//充电满提示灯自动超时关闭

extern STATUS_CTL_STRUCT chargeDoingLedShineInterval;   		//充电中提示灯间隔时间
extern STATUS_CTL_STRUCT chargeFinishedLedShineInterval;   		//充电满提示灯间隔时间

extern s8 chargeStatusDisplay_EN_Flag;// = true;				//充电状态led提示 总使能开关

extern STATUS_CTL_STRUCT isAllowSystemOff;						//是否允许进入系统关闭状态定时器
extern STATUS_CTL_STRUCT chargeDonnotAllowSystemOffInterval;	//充电过程中不允许关机设置时间间隔
extern STATUS_CTL_STRUCT disallowShutdownAfterBootTimeout;	//开机后禁止关机时间

#if MOTION_SENSOR_TYPE != MOTION_SENSOR_TYPE_NONE
extern STATUS_CTL_STRUCT motionSensorReadInterval;			//运动传感器读取周期
extern STATUS_CTL_STRUCT motionSensorUploadInterval;		//运动传感器上传周期
#endif

#if HW_VOICE_TYPE == HW_VOICE_TYPE_SPEAKER
extern STATUS_CTL_STRUCT setSpeakerVoiceLower;				//设置扬声器声音小于30%触发标志
#endif

extern s8 isAllowSystemOff_EN_Flag;// = false;					//是否允许进入系统关闭状态标志

extern s8 allowChargingLedShining_EN_Flag;// = false;			//允许充电闪烁灯闪烁

/*****************************************************************/
u8 init_STATUS_CTL_STRUCT(	STATUS_CTL_STRUCT *statusControl, 		//周期存储变量
								char flag, 							//周期到达标志
								char isAllowPeriodTrigFlag,			//周期重复触发标志
								unsigned int cnt, 					//周期计数
								unsigned int cntMax					//周期计数上限
									);
								
void clear_cnt_STATUS_CTL_STRUCT(	STATUS_CTL_STRUCT *statusControl);
								
u8 add_STATUS_CTL_STRUCT(	STATUS_CTL_STRUCT *statusControl);
								
u8 init_StrBuf(u8 *buf, u16 len);

//小写ASCII英文字符转大些
u8 charToUpper(u8 *chr);

//翻转char 字符 0变1 1变0
u8 toggleChar(u8 chr);

//minus_abs_u16_u16  两个u16数相减后取绝对值
u16 minus_abs_u16_u16(u16 a, u16 b);

void setVariablseAtBoot(void);

//实现类似printf功能
int m_printf(const char *str,...);

s32 formatAngle360(s32 angle);


/*****************************************************************/
/**
	name      		IRQ  pri
	EXTI15_10_IRQn	0	  1
	ADC1   	  		0     2
	USART2	  		0	  3
	EXTI0_IRQn		0	  4
	TIM3			0	  5

	TIM2			0	  7
	USART1	  		0	  8
	USART3	  		0	  9

	RTC_IRQn		1	  0

*/

#endif
/*********************************************end of file*********************************************/
