#ifndef _ANEMOMETER__H_
#define _ANEMOMETER__H_

#include "adc.h"
#include "dma.h"
#include "i2c.h"
#include "usart.h"
#include "tim.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"
#include "math.h"

#include "arr_tool.h"

#include "FreeRTOS.h"
#include "cmsis_os.h"

#include "arm_math.h"



#define ADC_GAIN_ENABLE 190
#define ADC_GAIN_DISABLE 1900

#define K_128 0xA12EE1FE
// 延时REV_MUTE_DELAY us启动ADC采集数据
// 最大风速30m/s 2.5M 采样率  延时260uS
#define REV_MUTE_DELAY_US 174
// adc 采样率 
//       5  5M
//       4  4M
//       3  3M
#define ADC_SAMP_RATE_MHz  ((float32_t)2.5)

// 驱动方波频率
#define DRIVE_FREQ_MHz   ((float32_t)0.2)

// 驱动方波个数  实际个数 DRIVE_NUM+1
#define DRIVE_NUM   2

// 温度探头版本,SHT30=1,TMP117=2
#define SHT30_SENSOR    1
#define TMP117_SENSOR   2
#define TEMP_SENSOR     SHT30_SENSOR


///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中
// 传播距离 风速计算公式中的L参数
//探头表面距离115.12mm(57.56mm*2),换能器探头到探头表面距离暂定2mm(1mm*2)
//#define DISTANCE ((float32_t)115120.0 + (float32_t)2000.0)
//探头表面距离115.12mm(57.56mm*2),换能器内部2mm速度2000,时间算2us减在tof上
//#define DISTANCE ((float32_t)115120.0)
// 传播距离 风速计算公式中的L参数
//#define DISTANCE ((float32_t)120000.0)
// 富奥通结构 L = 118946
// #define DISTANCE 118946

// 公式中的二倍cos45
#define TWO_COS45 1.41421356237309f

// x方向
#define WIND_DIRECTION_X 0x00
// y方向
#define WIND_DIRECTION_Y 0x01

// adc 采集buf长度
#define  ADC_VAL_LEN 1024

extern int16_t adc_val[ADC_VAL_LEN];
extern int16_t adc_val1[ADC_VAL_LEN];

//滑动平均值结构体
typedef struct {  
    float speed_data[3];  // 存储数据点的数组  
    float direction_data[3];  // 存储数据点的数组
    float ave_speed_data;  // 存储数据点平均值
    float ave_direction_data;  // 存储数据点平均值
    int index;        // 指向队列头部的索引(实际上是最近添加的元素)  
    int count;       // 当前队列中的元素数量  
} SlidingWindow_3s;
typedef struct {  
    float speed_data[600];  // 存储数据点的数组  
    float direction_data[600];  // 存储数据点的数组
    float ave_speed_data[600];  // 存储数据点平均值的数组  
    float ave_direction_data[600];  // 存储数据点平均值的数组
    int index;        // 指向队列头部的索引(实际上是最近添加的元素)  
    int count;       // 当前队列中的元素数量  
} SlidingWindow_10min;

#pragma pack(push,1)
typedef struct __weather_param
{
  float32_t wind_velocity_x;
  // 校准dtof 偏差
  //float32_t wind_velocity_x_dtof_offset;
  
  float32_t wind_velocity_y;
  //float32_t wind_velocity_y_offset;
  // 风速
  float32_t wind_velocity;
  // 超声波传播速度南北
  float32_t wind_c_NS;
  // 超声波传播速度东西
  float32_t wind_c_WE;
  // 风向
  float32_t wind_angle;
  // 温度
  float32_t temperature;
  // 湿度
  float32_t humidity;
  // 降雨量
  float32_t precipitation;
  // 算法出来的瞬时风速
  float32_t instantaneous_wind_speed;
  // 算法出来的瞬时风向
  float32_t instantaneous_wind_direction;
    
} Weather_param;
extern Weather_param weather_info;

typedef struct _mcs_para{
  float32_t min_wind_direction;              /* 最小风向  */
  float32_t trough_wind_direction;           /* 极小风向  */
  float32_t average_wind_direction;          /* 平均风向  */
  float32_t instantaneous_wind_direction;    /* 瞬时风向  */
  float32_t peak_wind_direction;             /* 极大风向  */
  float32_t max_wind_direction;              /* 最大风向  */
  float32_t min_wind_speed;                  /* 最小风速  */
  float32_t trough_wind_speed;               /* 极小风速  */
  float32_t average_wind_speed;              /* 平均风速  */
  float32_t instantaneous_wind_speed;        /* 瞬时风速  */
  float32_t peak_wind_speed;                 /* 极大风速  */
  float32_t max_wind_speed;                  /* 最大风速  */
  float32_t temperature;                     /*  环境温度 */
  float32_t humidity;                        /*  环境湿度 */
  float32_t pressure;                        /*  压强 */
  float32_t precipitation;                   /*  雨量     */
  float32_t precipitation_intensity;         /* 光辐射 */
}mcs_para;
extern mcs_para g_stMcs_Para;

//错误日志
typedef struct _error_log{
  uint16_t tof_error_NS:1;        /* 接受南北信号(tofy,tofx<0)很小  */
  uint16_t tof_error_WE:1;        /* 接受东西信号(tofy,tofx<0)很小 */
  uint16_t temp_error_SHT30:1;    /* SHT30错误日志(温湿度) */
  uint16_t temp_error_HP203B:1;   /* HP203B错误日志(大气压) */
  uint16_t temp_error_TMP117:1;   /* TMP117错误日志(温度) */
  uint16_t error_5:1;             /* 保留 */
  uint16_t error_6:1;             /* 保留 */
  uint16_t error_7:1;             /* 保留 */
  uint16_t error_8:1;             /* 保留 */
  uint16_t error_9:1;             /* 保留 */
  uint16_t error_10:1;            /* 保留 */
  uint16_t error_11:1;            /* 保留 */
  uint16_t error_12:1;            /* 保留 */
  uint16_t error_13:1;            /* 保留 */
  uint16_t error_14:1;            /* 保留 */
  uint16_t error_15:1;            /* 保留 */
}error_log;
extern error_log g_error_log;

//增益控制位
typedef struct _adc_gain_status{
  uint16_t gain_status_s:1;
  uint16_t gain_status_n:1;
  uint16_t gain_status_e:1;
  uint16_t gain_status_w:1;
  uint16_t bit4:1;
  uint16_t bit5:1;
  uint16_t bit6:1;
  uint16_t bit7:1;
}adc_gain_status;

#pragma pack(pop)

#define MAX_VALUES 50
typedef struct {
    uint16_t values[MAX_VALUES];
    uint16_t count;
    uint16_t currentIndex;
    uint16_t ave;
} AverageCalculator;
extern AverageCalculator wave_max_val_1;
extern AverageCalculator wave_max_val_2;
extern AverageCalculator wave_max_val_3;
extern AverageCalculator wave_max_val_4;

// 切换通道
void change_channel(uint32_t channel);

// 采集一次数据
void play_one_measure(int16_t* result_data,uint32_t len);

// 通过采集的数据计算 风速 风向
void calculate_param(Weather_param *parm ,uint32_t direction , int16_t *adc_buf1,int16_t *adc_buf2,uint32_t len);

// ADC增益控制
extern void enable_adc_gain(void);
extern void disable_adc_gain(void);

void wind_task(void const * argument);
void tem_hum_update_task(void const * argument);
void wind_update_task(void const * argument);
void my_update_mcs_param(float new_wind_speed, float new_wind_dirction);

#endif