/*
 * @Description: 
 * @Date: 2020-12-16 18:05:14
 * @LastEditors: CK.Zh
 * @LastEditTime: 2020-12-25 17:52:50
 * @FilePath: \NaviKit_stm32\Core\Inc\navikit.h
 */
/*
 * navikit.h
 *
 *  Created on: Apr 17, 2020
 *      Author: oarap
 */

#ifndef _NAVIKIT_H_
#define _NAVIKIT_H_

#include "main.h"
#include "adc.h"
#include <isp.h>

//#include "stm32f1xx_hal.h"
//#include "gpio.h"


#define ADC_CH_COUNT 5+2	//number of adc channels (include temp sensor and vrefint adc_in17)



typedef enum
{
	standby,	//minimum current state
	idle,	//only mcu runing
	run, 		//all function runing
	sleep, 		//SOCs and FANs are stop
	dfu,		//device firmware update for SOM
	isp			//in system program for EC
}state_t;

typedef struct
{
	struct{
		state_t sta,next_sta;	//power state machine
		bool ps_on_allow;	//allow power-on
		//  bool power_btn;	//power button pressed flag
		//  bool custom_btn;//custom button pressed flag
		// bool pwr_led;//power led (on switch)
		// bool run_led;//run led (on board)
		// bool dbg_msg_out;//enable/disable debug message output
	}sys;
	struct{
		bool mod_sleep;
		bool power_en;
		bool shutdown_req;
		bool sys_reset;
		bool force_recovery;
		bool sleep_wake;
	}som;//som power management

	struct{
		struct{
			uint32_t adc[ADC_CH_COUNT];
			float out_24v;//_div16
			float out_5v;//_div8
			float out_12v;//_div8
			float bkp_bat;//_div8
			float main_pwr;//_div16
		}rails;//power rails
		struct{
			bool temp_sen_en;
			bool temp_sen_alt;
			bool coulomb_alcc;
			bool chrg_stat2;
			bool chrg_stat1;
		}sta;
		struct{
			float voltage;
			float current;
			float cap;
			float temp;
		}coulomb;
		bool main_pwr_good;
	}pmb;//power management board
	
}NaviKit_t;
extern NaviKit_t NaviKit;

//device on board 
enum Device_t{USB2_Port1=0x00,USB2_Port2,USB2_Port3,USB2_Port4,USB2_Port5,USB2_Port6,	//USB2.0 Port
				USB3_Port5,USB3_Port6,USB3_Port1,USB3_Port2,USB3_Port3,USB3_Port4,	//USB3.0 Port

				SOC_USB2_HUB=0x10,SOC_USB3_HUB,SOC_USB3_HOST,SOC_USB3_GEC,SOC_GE_SW,		//SOC on Board

				SYS_FAN1=0x20,SYS_FAN2,SYS_FAN3,											//Fan on Board
				SYS_RUN_LED,SYS_PWR_LED,											//LED on Board

				SOM_PWR_EN=0x30,SOM_DFU,SOM_RESET,SOM_SLEEP,										//SOM Control

				PMB_PS_ON=0x40};															//Power Management Board

void PWR_Enable(enum Device_t device,bool en,uint16_t delay);
bool PWR_Enable_IRQ(enum Device_t device,bool en,uint16_t delay);
bool PWR_Status(enum Device_t device);

void NaviKit_var_init();

//power state machine switch function
void enter_standby_state(uint16_t delay);
void enter_isp_state();
void enter_run_state(uint16_t delay);
void enter_idle_state(uint16_t delay);
void enter_sleep_state(uint16_t delay);
void enter_dfu_state(uint16_t delay);
void som_reboot(uint16_t delay);
//non-blocking beep function with os delay
void TaskBeep(uint32_t time_ms, uint8_t n);

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);



#endif /* INC_NAVIKIT_H_ */
