#ifndef _CONTROL
#define _CONTROL
#include "main.h"


//#include "usart.h"
#include "adc.h"
#include "gpio.h"
#include <stdbool.h>

#define TYPE_ECG 0
#define TYPE_WATCH 1
#define DEV_TYPE TYPE_WATCH

#define MEM_ADR FLASH_MEM_ADDR//адрес куда пишем данные со всеми настройками.
#define APP_ADR FLASH_BOOT_ADDR//проги куда прыгать, правда это бессмысленно

#define BUT_CNT 30
#define DISP_CNT 30

//////////////////////////////////////////////////////////////
//базовые значения основных параметров
#define BASE_SERIAL_NUM 0x4001
#define BASE_MASTER_ADR 0x1001
#define BASE_MESH_ADR 	BASE_SERIAL_NUM//пока он совпадает с серийным номером
#define BASE_MESH_ID 	0x1313
#define BASE_PASSWORD 	777777

//максимальный и минимальный серийник
#define MIN_SERIAL_NUM 0x4000
#define MAX_SERIAL_NUM 0x4FFF
//максимальный и минимальный id сети
#define MIN_MESH_ID 0x0000
#define MAX_MESH_ID 0xFFFF
//максимальный и минимальный адрес мастера(адрес куда мы шлём сообщения) сети
#define MIN_MESH_MASTER_ID 0x0000
#define MAX_MESH_MASTER_ID 0xFFFF
//минимально и максимально возможный пароль
#define MIN_PASS 0
#define MAX_PASS 999999
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
//базовые значения ФПГ
#define HAND_WAIT		  1000//100 5c примерно ждем устаканивания сигнала
#define HR_HIGH 		  16000
#define HR_LOW			  4000
#define HR_WAIT			  600//600 3c примерно ждем устаканивания сигнала
#define AFE_AMB_TRESHOLD -10000 //пороговое значение, выше которого мы считаем что часы сняты.

//максимальные и минимальные значения верхнего порога чсс
#define HR_HIGH_MIN			10000	//100-240 уд\мин
#define HR_HIGH_MAX			24000
//максимальные и минимальные значения нижнего порога чсс
#define HR_LOW_MIN			4000	//40-99 уд\мин
#define HR_LOW_MAX			9900
//максимальные и минимальные значения времени тревоги по поводу ЧСС
#define HR_WAIT_MIN			0		//0-10 сек
#define HR_WAIT_MAX			2000
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
//пороги акселерометра базовые
#define LOW_G_TRES	300			//порог от которого считаем падении
#define LOW_G_TIME	12			//0.05сек сколько должно длится это состояние
#define LOW_G_ALARM_TIME 750	//3сек сколько сигналим о тревоге*/

#define HIGH_G_TRES	8000		//порог от которого считаем удар
#define HIGH_G_ALARM_TIME 750	//3сек сколько сигналим о тревоге

//максимальные и минимальные значения порога свободного падения
#define LOW_G_TRES_MIN			10//10-1000mg
#define LOW_G_TRES_MAX			1000
//максимальные и минимальные значения времени свободного падения для срабатывания тревоги
#define LOW_G_TIME_MIN			2//10мс-500мс
#define LOW_G_TIME_MAX			100
//максимальные и минимальные значения времени тревоги по поводу свободного падения
#define LOW_G_ALARM_TIME_MIN	0//0-10 сек
#define LOW_G_ALARM_TIME_MAX	2000
//максимальные и минимальные значения порога высокого ускорения (удара)
#define HIGH_G_TRES_MIN			2000//2000-12000mg
#define HIGH_G_TRES_MAX			12000
//максимальные и минимальные значения времени тревоги по поводу высокого ускорения (удара)
#define HIGH_G_ALARM_TIME_MIN	0//0-10 сек
#define HIGH_G_ALARM_TIME_MAX	2000
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
//пороги термометра базовые
#define TEMP_LOW  3000//20*сек
#define TEMP_HIGH 3400//20*сек
#define TEMP_WAIT 2//20*сек
//максимальные и минимальные значения низкой температуры
#define TEMP_LOW_MIN			2800//28-33.5гр
#define TEMP_LOW_MAX			3350
//максимальные и минимальные значения высокой температуры
#define TEMP_HIGH_MIN			3360//33.6-38гр
#define TEMP_HIGH_MAX			3800
//максимальные и минимальные значения времени тревоги
#define TEMP_WAIT_MIN			0//20*сек
#define TEMP_WAIT_MAX			200

//////////////////////////////////////////////////////////////





//режим работы
typedef enum
{
	None		= 0x0,//технический когда ничего не загрузилось
	StartUP		= 0x1,//технический режим включения инициализация всего и вся, проверка оборудования
	SetUP		= 0x2,//технический режим настройки параметров и записи их в память, если не выйдет сделать это в потоке
	Stream		= 0x3,//потоковая передача данных без анализа тупо 3 канала как сейчас можно со счётчиком
	Analise     = 0x4,//передача данных + анализ
	HV_stimul   = 0x5,//и то и то
	USB_mode	= 0x6, //режим чтения файлов и их передача на ПК в этом режиме нужно отрубать все датчики.
	Sleep	 	= 0x7 // технический режим требуется для прехода в сон и всё
}	work_mode;


//режим BLE
typedef enum
{
	ble_off       = 0x0,//выключен4300
	ble_raw       = 0x1,//передаем сырые данные
	ble_mesh      = 0x2,//обмен сообщениями в mesh сети медлено, но надежно
}	ble_mode;

typedef struct Contr
{
	work_mode	set_mode;	//какой режим выставлен
	work_mode	now_mode;	//какой режим сейчас
	bool		btn_1_state;//состояние кнопки 1
	int			btn_1_cnt;	//счетчик кнопки 1
	bool		btn_2_state;//состояние кнопки 2
	int			btn_2_cnt;
	//это по идее не нужно
	int 		Ecount;		//подсчёт ошибок
	int			timer;
	bool		interupt;	//флаг
	uint32_t	rf_counter;	//подсчёт отправленных сообщений
	uint8_t		mesh_counter;//подсчёт отправленных сообщений
	//new

	bool		DATA_write;	//флаг что вообще нужно данные писать.
	ble_mode    ble_mode_set;		//режим работы BLE
	ble_mode    ble_mode_now;		//режим работы BLE

	//по идее от сюда идет только настройка параметров выше нет смысла записывать данные
	//настройки внутренних параметров
	bool    dev_type;		//что это за устройство неизменяемый параметр 0 ЭКГ 1 часы
	int		serial_number;	//серийный номер устройства
	int		password;		//пароль нужен для серийного режима.
	int		mesh_netid;		//номер сети для MESH режима
	int		mesh_adr;		//адрес в сети при режиме mesh
	int		master_adr;		//адрес куда отправлять данные в сети при режиме mesh
	bool 	ble_ask;		//мужно ли подтвержденеи отпрваки в режиме mesh

	//настройки порогов для переферии
	//пороги ФПГ
	int32_t ppg_hand_wait;//200 = 1c сколько ждем устаканивания сигнала
	int32_t ppg_hr_high;
	int32_t ppg_hr_low;
	int32_t ppg_hr_wait;//600 = 3c время сигнализирования ошибки
	int32_t ppg_hr_amd_tres;//пороговое значение, выше которого мы считаем что часы сняты.
	//акселерометры
	int16_t mpu_low_g_tres;//порог от которого считаем падение
	int32_t mpu_low_g_time;//время в низком G для срабатывания триггера
	int32_t mpu_low_g_Alarm_Tim;//Время в течении которого тревога активна 1 секунда = 250
	int16_t mpu_high_g_tres;//порог от которого считаем удар
	int32_t mpu_high_g_Alarm_Tim;//Время в течении которого тревога активна 1 секунда = 250
	//термометр
	int16_t temp_low_tres;	//порог от которого считаем низкую температуру
	int16_t temp_high_tres;	//порог от которого считаем что температура высокая
	int32_t temp_alarm_time;//Время в течении которого тревога активна 1 секунда = 20

} ctrl_struct;

void control_init(void);
void control_init_var(ctrl_struct * control);
void lets_sleep(void);
void FL_read_str(ctrl_struct * control);
void FL_write_str(ctrl_struct * control);
uint8_t FL_read_byte(uint32_t addr);

int update_str(ctrl_struct * buf_str,ctrl_struct * main_str);
int scan_str_USB(char* mess);

void new_app_start();//go to usb msd
#endif
