/*
*********************************************************************************************************
*                                       IAR Development Kits
*                                              on the
*
*                                    Nano130
*
* Filename      : adc_calculate.h
* Version       : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/

#ifndef  USER_ADC_CALCULATE_PRESENT
#define  USER_ADC_CALCULATE_PRESENT

#include "type.h"

// 本模块大部分代码为车载瓶和罐箱液位计项目移植过来的

// 定义常量π
#define PI (3.1415926)

#define CAP_K_C1	150		// 电容K值校验C1（pF）
#define CAP_K_C2	500	// 电容K值校验C2（pF）

// 介质介电常数
extern const float e_Src[];

typedef struct // size = 10 if --float=32
{
	float k;		// 真空电容常数，根据传感器尺寸综合计算得到
	s16 nl_len;		// 非线性段总长度（mm），结合传感器长度计算有效测量长度（对应增长电容部分）
	s16 base_d;		// 底座厚度(mm)，计算传感器底座下缘和罐子之间的缝隙高度
	s16 base_len;	// 底部非线性段长度（mm），传感器底座下缘和内管之间的高度
} Sensor_Model;

// 传感器规格参数
extern const Sensor_Model Adc_Sensor_Tables[1];

// 储罐理论参数
typedef struct
{
	// 储罐总容积(L)
	u32	v;
	u32	ve;				// 有效容积（可充装容积）
	u16	v0;				// 留底容量
	u16 zero_height;	// 留底高度

	s16 nl_len;			// 底部不可测高度
	
	// dp=h*density*g => h=dp/g/density
	// 其中dp为差压, h为液位高度, density为密度, g为9.8
	// 为简少浮点运算，先算出差压->高度的转换系数
	
	// dp以KPa为单位, 高度以mm为单位, density以kg/L为单位
	// LSrc_k = 1/g/density*1000=1000/g/density
	// h = dp * LSrc_k
	// 假设液源为LNG, LSrc_k = 1000/9.8/0.42 = 242.9543
	float	LSrc_k;
} Bottle_Data;

extern Bottle_Data Theoretical_Param;

// 计算理论参数: 直径，长度，类型（立罐或卧罐）		
u8 Calculate_Theoretical_Params();

// 根据液位高度与直径之比，计算剩余液量（有扣除）
// v0: 留底液量
u32 Calculate_Volume(u16 d, float h, u32 v, u16 v0);
u32 Calculate_Volume_Stand(u16 d, u16 L, float h, u16 v0);

// 判断采集数据范围是否合法
// 输入：采集值、校零值、校满值
// 返回：传感器状态字节
u8 ADC_Validate(u32 adc, u32 zero, u32 full);

// 计算采集数据
// 输入：adc，校准值，量程
// 输出：经计算得到的值
float ADC_Calculate(u32 adc, u32 zero, u32 full, s32 low, s32 high);

// 冒泡排序，用于数量较少的排序法
void sort(u32 numbs[], s8 cnt);

// KPa转换成mmH2O
float KPa2mmH2O(float KPa);
	
// 差压转换为液位高度
float Diff2Level(float dp); // 单位KPa、mm
	
// 高度转换为体积
u32 Level2Vol(float h); // 单位mm、L
	
// 体积转换为质量
u32 Vol2Quantity(float v); // 单位L、kg

// 质量转换为体积
u32 Quantity2Vol(float quantity); // 单位kg、L

float adc_k_convert(s16 adc, s16 c1ADC, s16 c2ADC, s16 c1, s16 c2);
float Cap_Calculate(float cap, s16 base, s16 ref);

int16_t PT100_CalTempr(s32 adc1, s32 adc2, s16 cTx10, s16 cRx10);
// 计算实测电阻
float PT100_CalResit(s32 adc1, s32 adc2);

// 根据标定值计算最小、最大量程的测量值
void PT100_Calculate_Theoretical_Params(int16_t lowRange, int16_t highRange);

extern const float PT100_Resis[281];

#endif

