NULL
This commit is contained in:
581
user/Core/DP2006_VM1000.c
Executable file
581
user/Core/DP2006_VM1000.c
Executable file
@@ -0,0 +1,581 @@
|
||||
#include "../main/SystemInclude.h"
|
||||
|
||||
/**************************************************************************************/
|
||||
/**
|
||||
* @brief <20><EFBFBD><CDB9>Ķ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @note <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>صĺ<D8B5><C4BA><EFBFBD><EFBFBD><EFBFBD>IO
|
||||
*/
|
||||
|
||||
//##############################################################################
|
||||
#if(DP2006_VM1000)
|
||||
//##############################################################################
|
||||
|
||||
//__SAMPLE_STATUS_BIT_TypeDef sampleState;
|
||||
TypeSample sampleProcess;
|
||||
u16 processNextTime, processIndex;
|
||||
|
||||
// <20><>ǰ<EFBFBD><C7B0>ʾ<EFBFBD><CABE>λ
|
||||
static PressureUnitType current_unit = PRESSURE_UNIT_PA; // Ĭ<><C4AC><EFBFBD><EFBFBD>ʾPa
|
||||
float pressure_value;
|
||||
extern volatile uint8_t display_update_flag; // <20><>ʾ<EFBFBD><CABE><EFBFBD>±<EFBFBD>־
|
||||
|
||||
extern volatile uint8_t key_press_flag;//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>־
|
||||
volatile uint8_t display_update_flag = 0; // <20><>ʾ<EFBFBD><CABE><EFBFBD>±<EFBFBD>־
|
||||
extern volatile Device_StateTypeDef g_device_state; // <20><>ʼ״̬<D7B4><CCAC><EFBFBD>ػ<EFBFBD>
|
||||
u8 typecflag=0;
|
||||
extern uint8_t g_auto_shutdown_flag;
|
||||
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
static uint8_t g_ble_init_done = 0;
|
||||
static uint32_t led_timer = 0;
|
||||
static uint32_t shutdown_timer = 0;
|
||||
/******<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>***************************************************************************************************************************************************************************************************************/
|
||||
void FlowRateDealAndOuputSub(void)
|
||||
{
|
||||
ComputeFlowRateIndexAndFlowRate();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
void ComputeFlowRateIndexAndFlowRate(void)
|
||||
{
|
||||
voltageDetected[NIDX ]=(u16)sampleProcess.IRHResult; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//IRH 0X8303
|
||||
voltageDetected[VRHX ]= (u16)sampleProcess.RHypeResult; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//IRR 0X8304
|
||||
voltageDetected[IVHDX]=(u16) sampleProcess.RDResult; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URU 0X8305
|
||||
voltageDetected[RHVOL]= (u16)sampleProcess.BLypeResult; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URH 0X8306 <20><><EFBFBD>ص<EFBFBD>ѹ/3
|
||||
|
||||
voltageDetected[VRHX]=voltageDetected[VRHX]-32768;
|
||||
pressure_value=GetFlowRate(voltageDetected[VRHX],CURVE_1ST);
|
||||
display_update_flag = 1;
|
||||
if( voltageDetected[RHVOL]>50000)
|
||||
{
|
||||
typecflag=1;
|
||||
}
|
||||
|
||||
}
|
||||
u16 GetAdcGain(u16 gianX)
|
||||
{
|
||||
switch(gianX)
|
||||
{
|
||||
case 1: return GAIN1;
|
||||
case 2: return GAIN2;
|
||||
case 4: return GAIN4;
|
||||
case 8: return GAIN8;
|
||||
case 16: return GAIN16;
|
||||
case 32: return GAIN32;
|
||||
case 64: return GAIN64;
|
||||
case 128: return GAIN128;
|
||||
default:
|
||||
return GetAdcGain(ADC_GAIN_DEFAULT);
|
||||
}
|
||||
}
|
||||
/******<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>***************************************************************************************************************************************************************************************************************/
|
||||
void AnalogCircuitInit(void)
|
||||
{
|
||||
sampleProcess.CTypeGain = GetAdcGain(adcGain); //Ĭ<>ϲ<EFBFBD><CFB2><EFBFBD>ϵ<EFBFBD><CFB5>
|
||||
SampingADCInit();
|
||||
DisableSamplingInterrupt();
|
||||
}
|
||||
//void ProcessTimerInterruptCallBack(void)
|
||||
//{
|
||||
// FlowProcessManagement();
|
||||
//
|
||||
//}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
void ProcessTimerInterruptCallBack(void)
|
||||
{
|
||||
DisableProcessTimerInterrupt();
|
||||
HWState.ProcessTimerOut = 1;
|
||||
}
|
||||
//void StartNormolFlowMeasurement(void)//ÿ125ms<6D><73><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
//{
|
||||
// AnalogCircuitInit();//<2F><>ʼ<EFBFBD><CABC>ADC
|
||||
// HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||
// StartProcessTimer(32768); //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1>,<2C><>ʼ<EFBFBD><CABC>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Timer_register_irq_callback(ProcessTimer,ProcessTimerIT, ProcessTimerInterruptCallBack );//ע<><D7A2><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// processIndex = 0; //
|
||||
// processNextTime = 0;
|
||||
// FlowProcessManagement();//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//}
|
||||
void StartNormolFlowMeasurement(void)//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
AnalogCircuitInit();
|
||||
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||
StartProcessTimer(64000); // <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1>,<2C><>ʼ<EFBFBD><CABC>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Timer_register_irq_callback(ProcessTimer,ProcessTimerIT, ProcessTimerInterruptCallBack );//ע<><D7A2><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
sampleProcess.NextRun = 0;
|
||||
sampleProcess.NextTime= 0;
|
||||
|
||||
FlowProcessManagement();//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
//static void SetNextProcess(void)//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//{
|
||||
// if(processIndex == 0){
|
||||
// StopProcessTimer();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1>
|
||||
// return;
|
||||
// }
|
||||
// u32 currentTAR = pTIM1->CNT;//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
|
||||
// if(currentTAR > processNextTime) processNextTime = currentTAR + 5;
|
||||
// ResetProcessTimer(processNextTime);
|
||||
//}
|
||||
|
||||
void SetNextProcess(void)//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if(sampleProcess.NextRun == 0){
|
||||
StopProcessTimer();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1>
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// u32 currentTAR = ProcessTimer->CNT;//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
|
||||
// if(currentTAR > sampleProcess.NextTime) sampleProcess.NextTime = currentTAR + 5;
|
||||
// ResetProcessTimer(sampleProcess.NextTime);
|
||||
|
||||
StartProcessTimer(sampleProcess.NextTime);
|
||||
}
|
||||
|
||||
|
||||
void SetSystemForADCSample(u16 sampleNum)
|
||||
{
|
||||
sampleProcess.Counter = 0;
|
||||
sampleProcess.CounterMax = sampleNum;
|
||||
|
||||
StartSamplingADC();
|
||||
}
|
||||
void ComputeSampleData(u16 sampleNum, u16 sampleShift)
|
||||
{
|
||||
u32 I;
|
||||
|
||||
sampleProcess.ADC0Result = 0;
|
||||
sampleProcess.ADC1Result = 0;
|
||||
for(I = 0; I<sampleNum; I++)
|
||||
{
|
||||
sampleProcess.ADC0Result += ((sampleProcess.ADC0Buffer[I] >> 8) + 32768) & 0xFFFF;
|
||||
sampleProcess.ADC1Result += ((sampleProcess.ADC1Buffer[I] >> 8) + 32768) & 0xFFFF;
|
||||
}
|
||||
|
||||
sampleProcess.ADC0Result >>= sampleShift;
|
||||
sampleProcess.ADC1Result >>= sampleShift;
|
||||
}
|
||||
/******************************************************************************/
|
||||
void TurnOffAnalogCircuit(void)
|
||||
{
|
||||
StopSamplingADC();
|
||||
DisableSamplingInterrupt();
|
||||
}
|
||||
|
||||
//void FlowProcessManagement(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
|
||||
//{
|
||||
// switch(processIndex)
|
||||
// {
|
||||
// case 0:
|
||||
// {
|
||||
// HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
|
||||
// SetupRHChannle();
|
||||
// SetupIRHypeChannle();
|
||||
// SetSystemForADCSample(16); //<2F><><EFBFBD><EFBFBD>ADC
|
||||
// processNextTime += 20 * COUNT_VALUE_PER_MS; //20ms <20><><EFBFBD><EFBFBD>ֵ=65535/4000*t =
|
||||
// processIndex=1;
|
||||
// }break;
|
||||
// case 1:
|
||||
// {
|
||||
// TurnOffAnalogCircuit();
|
||||
// ComputeSampleData(16, 4);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// sampleProcess.RHypeResult = sampleProcess.ADC0Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
// sampleProcess.IRHResult = sampleProcess.ADC1Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
// SetupBLChannle();//<2F><><EFBFBD><EFBFBD>SIGNAL1
|
||||
// SetupRDChannle();
|
||||
// SetSystemForADCSample(16);
|
||||
// processNextTime += 20 * COUNT_VALUE_PER_MS;//20ms
|
||||
// processIndex=2;
|
||||
// }break;
|
||||
// case 2:
|
||||
// {
|
||||
// TurnOffAnalogCircuit();
|
||||
// ComputeSampleData(16, 4);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// sampleProcess.BLypeResult = sampleProcess.ADC0Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
// sampleProcess.RDResult = sampleProcess.ADC1Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
//
|
||||
// HWState.SampledOver = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// StopProcessTimer();
|
||||
// processIndex=3;
|
||||
// }break;
|
||||
// default : processIndex = 0; break;
|
||||
// }
|
||||
// SetNextProcess();
|
||||
//}
|
||||
void FlowProcessManagement(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
|
||||
{
|
||||
switch(sampleProcess.NextRun)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
|
||||
SetupBLChannle();
|
||||
SetupRDChannle();
|
||||
SetSystemForADCSample(SAMPLING_TIMES_IN_DETECT_STAGE);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
sampleProcess.NextTime = 20*COUNT_VALUE_PER_MS;
|
||||
sampleProcess.NextRun = 1;
|
||||
}break;
|
||||
|
||||
case 1:
|
||||
{
|
||||
TurnOffAnalogCircuit();
|
||||
ComputeSampleData(SAMPLING_TIMES_IN_DETECT_STAGE, SHIFT_IN_DETECT_STAGE);
|
||||
|
||||
sampleProcess.BLypeResult = sampleProcess.ADC0Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
sampleProcess.RDResult = sampleProcess.ADC1Result;//<2F><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
||||
// SetupVRHChannle();//<2F><><EFBFBD><EFBFBD>SIGNAL1
|
||||
// SetSystemForADCSample(PRESAMPLING_TIMES_IN_1ST_STAGE);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
// sampleProcess.NextTime = 20*COUNT_VALUE_PER_MS;//20ms
|
||||
sampleProcess.NextRun = 3;
|
||||
}break;
|
||||
|
||||
case 2:
|
||||
{
|
||||
TurnOffAnalogCircuit();
|
||||
ComputeSampleData(PRESAMPLING_TIMES_IN_1ST_STAGE, SHIFT_IN_PRESAMPLING_1ST_STAGE);
|
||||
|
||||
}break;
|
||||
case 3:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 4:
|
||||
{
|
||||
|
||||
}break;
|
||||
|
||||
case 5:
|
||||
{
|
||||
|
||||
}break;
|
||||
|
||||
case 6:
|
||||
{
|
||||
|
||||
}break;
|
||||
default : sampleProcess.NextRun = 0; break;
|
||||
}
|
||||
SetNextProcess();
|
||||
}
|
||||
//******************************************************************************/
|
||||
void CoreInit(void)
|
||||
{
|
||||
SystemGPIOInit();
|
||||
// ExternCalibratinInput();
|
||||
TurnOffAnalogCircuit();
|
||||
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>------------------------------------------------------------
|
||||
//void PrimaryTimer_IRQ_Callback()
|
||||
//{
|
||||
//// HWState.MainTimerOut = 1;
|
||||
// StartNormolFlowMeasurement();
|
||||
//}
|
||||
void PrimaryTimer_IRQ_Callback()
|
||||
{
|
||||
HWState.MainTimerOut = 1;
|
||||
// StartNormolFlowMeasurement();
|
||||
}
|
||||
/******<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>***************************************************************************************************************************************************************************************************************/
|
||||
void SwitchPressureUnit(void)
|
||||
{
|
||||
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>λ (ѭ<><D1AD><EFBFBD>л<EFBFBD>)
|
||||
current_unit = (PressureUnitType)((int)current_unit + 1);
|
||||
if (current_unit > PRESSURE_UNIT_MBAR) { // <20><><EFBFBD>ġ<DEB8><C4A1><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||
current_unit = PRESSURE_UNIT_PA;
|
||||
}
|
||||
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<D2AA><D7AA>pressure_value<75><65><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>Pa<50><61>λ
|
||||
}
|
||||
|
||||
double ConvertPressure(double value, PressureUnitType targetUnit, PressureUnitType originalUnit)
|
||||
{
|
||||
double valueInPa;
|
||||
|
||||
if (targetUnit == originalUnit) return value;
|
||||
// --- <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC>λת<CEBB><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><D7BC>λ Pa ---
|
||||
switch (originalUnit)
|
||||
{
|
||||
case PRESSURE_UNIT_MBAR:
|
||||
valueInPa = value * ONE_MBAR_TO_PA;
|
||||
break;
|
||||
case PRESSURE_UNIT_TORR:
|
||||
valueInPa = value * ONE_TORR_TO_PA;
|
||||
break;
|
||||
case PRESSURE_UNIT_MICRONS:
|
||||
valueInPa = value * ONE_MICRONS_TO_PA;
|
||||
break;
|
||||
case PRESSURE_UNIT_PA:
|
||||
valueInPa = value;
|
||||
break;
|
||||
default:
|
||||
return value; // δ֪<CEB4><D6AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭֵ
|
||||
}
|
||||
|
||||
// --- <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC>λ Pa ת<><D7AA>ΪĿ<CEAA>굥λ ---
|
||||
switch (targetUnit)
|
||||
{
|
||||
case PRESSURE_UNIT_MBAR:
|
||||
return valueInPa * ONE_PA_TO_MBAR;
|
||||
case PRESSURE_UNIT_TORR:
|
||||
return valueInPa * ONE_PA_TO_TORR;
|
||||
case PRESSURE_UNIT_MICRONS:
|
||||
return valueInPa * ONE_PA_TO_MICRONS;
|
||||
case PRESSURE_UNIT_PA:
|
||||
return valueInPa;
|
||||
default:
|
||||
return valueInPa; // δ֪Ŀ<D6AA>굥λ<EAB5A5><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Paֵ
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>32λ<32><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||
* @param num: Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @retval <20><><EFBFBD>ֵ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
*/
|
||||
static u8 GetDigitCount(u32 num)
|
||||
{
|
||||
u8 count = 0;
|
||||
if (num == 0) return 1; // 0 <20><>1λ<31><CEBB>
|
||||
while (num != 0)
|
||||
{
|
||||
num /= 10;
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void OLED_DrawRect_Cache(u8 x, u8 y, u8 w, u8 h);
|
||||
|
||||
void Update_Pressure_Display(void)
|
||||
{
|
||||
// --- 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> ---
|
||||
#define FONT_WIDTH 12
|
||||
#define FONT_HEIGHT 24
|
||||
#define SCREEN_WIDTH 128
|
||||
#define RIGHT_ALIGN_MARGIN 2
|
||||
|
||||
u8 unit_str_len = 0;
|
||||
const char* unit_str = "";
|
||||
u32 int_part = 0;
|
||||
u32 decimal_part = 0;
|
||||
u8 num_len = 0;
|
||||
u8 has_decimal = 0;
|
||||
u8 decimal_places = 0;
|
||||
|
||||
double display_val;
|
||||
u8 current_x;
|
||||
u8 total_num_width;
|
||||
u8 display_x;
|
||||
|
||||
u8 fixed_erase_start_x;
|
||||
u8 fixed_erase_end_x;
|
||||
|
||||
// --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ر<EFBFBD><D8B1><EFBFBD> ---
|
||||
u16 battery_adc = 0;
|
||||
u8 battery_level = 0;
|
||||
u8 i = 0;
|
||||
u8 bat_x = 0;
|
||||
u8 bat_y = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD><EFBFBD> 22<32><32><EFBFBD>߶<EFBFBD> 12
|
||||
u8 bat_w = 22;
|
||||
u8 bat_h = 12;
|
||||
|
||||
// --- 2. <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵ ---
|
||||
display_val = ConvertPressure((double)pressure_value / 1000.0, current_unit, PRESSURE_UNIT_PA);
|
||||
|
||||
// --- 3. <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
|
||||
has_decimal = 1;
|
||||
switch (current_unit)
|
||||
{
|
||||
case PRESSURE_UNIT_PA:
|
||||
decimal_places = 1; int_part = (u32)(display_val + 0.05f);
|
||||
decimal_part = (u32)(display_val * 10 + 0.5f) % 10;
|
||||
unit_str = "pa"; unit_str_len = 2; break;
|
||||
case PRESSURE_UNIT_MICRONS:
|
||||
decimal_places = 1; int_part = (u32)(display_val + 0.05f);
|
||||
decimal_part = (u32)(display_val * 10 + 0.5f) % 10;
|
||||
unit_str = "mcm"; unit_str_len = 3; break;
|
||||
case PRESSURE_UNIT_TORR:
|
||||
decimal_places = 3; int_part = (u32)(display_val + 0.0005f);
|
||||
decimal_part = (u32)(display_val * 1000 + 0.5f) % 1000;
|
||||
unit_str = "torr"; unit_str_len = 4; break;
|
||||
case PRESSURE_UNIT_MBAR:
|
||||
decimal_places = 2; int_part = (u32)(display_val + 0.0005f);
|
||||
decimal_part = (u32)(display_val * 100 + 0.5f) % 100;
|
||||
unit_str = "mbar"; unit_str_len = 4; break;
|
||||
}
|
||||
|
||||
num_len = GetDigitCount(int_part);
|
||||
|
||||
// --- 4. ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD> ---
|
||||
fixed_erase_start_x = 0;
|
||||
fixed_erase_end_x = SCREEN_WIDTH - RIGHT_ALIGN_MARGIN;
|
||||
OLED_FillArea(fixed_erase_start_x, 20, fixed_erase_end_x, 20 + FONT_HEIGHT);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ֵ...
|
||||
current_x = SCREEN_WIDTH - RIGHT_ALIGN_MARGIN;
|
||||
current_x -= unit_str_len * FONT_WIDTH;
|
||||
OLED_ShowString(current_x, 20, (u8*)unit_str, FONT_HEIGHT, 1);
|
||||
|
||||
total_num_width = num_len * FONT_WIDTH;
|
||||
if (has_decimal) {
|
||||
total_num_width += FONT_WIDTH;
|
||||
total_num_width += decimal_places * FONT_WIDTH;
|
||||
}
|
||||
current_x -= total_num_width;
|
||||
display_x = current_x;
|
||||
OLED_ShowNum(display_x, 20, int_part, num_len, FONT_HEIGHT, 1);
|
||||
display_x += num_len * FONT_WIDTH;
|
||||
if (has_decimal) {
|
||||
OLED_ShowChar(display_x, 20, '.', FONT_HEIGHT, 1);
|
||||
display_x += FONT_WIDTH;
|
||||
OLED_ShowNum(display_x, 20, decimal_part, decimal_places, FONT_HEIGHT, 1);
|
||||
}
|
||||
|
||||
// --- 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>---
|
||||
battery_adc = voltageDetected[RHVOL];
|
||||
|
||||
if(battery_adc >= 44761) battery_level = 4;
|
||||
else if(battery_adc >= 43646) battery_level = 3;
|
||||
else if(battery_adc >= 42532) battery_level = 2;
|
||||
else if(battery_adc >= 41418) battery_level = 1;
|
||||
else battery_level = 0;
|
||||
|
||||
// 2. ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||
bat_x = 128 - bat_w - 2;
|
||||
bat_y = 0;
|
||||
|
||||
// 3. <20><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>ͱ߿<CDB1> (<28><><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ٻ<EFBFBD><D9BB><EFBFBD>)
|
||||
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫʵ<C9AB>ľ<EFBFBD><C4BE><EFBFBD>
|
||||
OLED_FillRect_White(bat_x, bat_y, bat_x + 22, bat_y + 12);
|
||||
// <20>м<EFBFBD><D0BC>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> (<28>γɿ<CEB3><C9BF>ı߿<C4B1>)
|
||||
OLED_FillRect(bat_x + 1, bat_y + 1, bat_x + 21, bat_y + 11);
|
||||
|
||||
// 4. <20><><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
switch(battery_level)
|
||||
{
|
||||
case 4: // <20><><EFBFBD>磺<EFBFBD><E7A3BA><EFBFBD><EFBFBD>4<EFBFBD><34>
|
||||
OLED_FillRect_White(bat_x + 17, bat_y + 2, bat_x + 20, bat_y + 10);
|
||||
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD>û<EFBFBD><C3BB> break<61><6B><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʵ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><CDB8>Ч<EFBFBD><D0A7>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>磬<EFBFBD><E7A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33>2<EFBFBD><32>1<EFBFBD><31>
|
||||
case 3: // 3<><33><EFBFBD>磺<EFBFBD><E7A3BA><EFBFBD><EFBFBD>3<EFBFBD><33>
|
||||
OLED_FillRect_White(bat_x + 12, bat_y + 2, bat_x + 15, bat_y + 10);
|
||||
case 2: // 2<><32><EFBFBD>磺<EFBFBD><E7A3BA><EFBFBD><EFBFBD>2<EFBFBD><32>
|
||||
OLED_FillRect_White(bat_x + 7, bat_y + 2, bat_x + 10, bat_y + 10);
|
||||
case 1: // 1<><31><EFBFBD>磺<EFBFBD><E7A3BA><EFBFBD><EFBFBD>1<EFBFBD><31>
|
||||
OLED_FillRect_White(bat_x + 2, bat_y + 2, bat_x + 5, bat_y + 10);
|
||||
break; // <20><><EFBFBD><EFBFBD>
|
||||
case 0: // 0<><30><EFBFBD>磺ֻ<E7A3BA><D6BB>ʾ<EFBFBD>տ<D5BF><F2A3ACB2><EFBFBD><EFBFBD>ڲ<EFBFBD>
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// 5. <20><><EFBFBD><CDB9> (<28><><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD>)
|
||||
OLED_FillRect_White(bat_x + 22, bat_y + 3, bat_x + 24, bat_y + 9);
|
||||
|
||||
|
||||
// --- 6. <20><><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2> ---
|
||||
OLED_Refresh_Line_Diff(0);
|
||||
OLED_Refresh_Line_Diff(1);
|
||||
|
||||
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2>
|
||||
OLED_Refresh_Line_Diff(2);
|
||||
OLED_Refresh_Line_Diff(3);
|
||||
OLED_Refresh_Line_Diff(4);
|
||||
OLED_Refresh_Line_Diff(5);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE>α߿<DFBF><F2A3A8B2><EFBFBD><EFBFBD>䣩
|
||||
void OLED_DrawRect_Cache(u8 x, u8 y, u8 w, u8 h)
|
||||
{
|
||||
// <20>ϱ<EFBFBD>
|
||||
OLED_DrawLine(x, y, x + w - 1, y, 1);
|
||||
// <20>±<EFBFBD>
|
||||
OLED_DrawLine(x, y + h - 1, x + w - 1, y + h - 1, 1);
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
OLED_DrawLine(x, y, x, y + h - 1, 1);
|
||||
// <20>ұ<EFBFBD>
|
||||
OLED_DrawLine(x + w - 1, y, x + w - 1, y + h - 1, 1);
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LED<45><44>˸<EFBFBD><CBB8>ʱ<EFBFBD><CAB1>
|
||||
|
||||
|
||||
void My_Timer2_Callback(void)//ÿ10ms<6D><73>һ<EFBFBD><D2BB><EFBFBD>ж<EFBFBD>
|
||||
{
|
||||
// LED <20><EFBFBD>
|
||||
led_timer++;
|
||||
if(led_timer >= 10)
|
||||
{
|
||||
led_timer = 0;
|
||||
TOGGLE_PIN(LED_PIN_GPIO, LED_PIN);
|
||||
}
|
||||
|
||||
// <20>ػ<EFBFBD><D8BB><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
shutdown_timer++;
|
||||
if(shutdown_timer > 72000)
|
||||
{
|
||||
g_auto_shutdown_flag = 1;
|
||||
}
|
||||
|
||||
Key_Scan_Task();
|
||||
Unit_key();
|
||||
}
|
||||
|
||||
|
||||
void SystemPolling(void)
|
||||
{
|
||||
static uint8_t power_off_screen_cleared = 0;
|
||||
if(HWState.MainTimerOut == 1 ) {
|
||||
ManagePrimaryTimeInterval(); // <20>ж<EFBFBD><D0B6>½εĹ<CEB5><C4B9><EFBFBD>ģʽ
|
||||
ModeExitCount(); // <20>жϸ<D0B6><CFB8><EFBFBD>ģʽ<C4A3>˳<EFBFBD>
|
||||
Clear_WDT();
|
||||
StartNormolFlowMeasurement();
|
||||
HWState.MainTimerOut = 0;
|
||||
}
|
||||
if(comState.state.ReceivedData)
|
||||
{
|
||||
ReceivedDataProcessing();
|
||||
}
|
||||
/* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ (<28><><EFBFBD><EFBFBD><EFBFBD>豸״̬<D7B4><CCAC><EFBFBD><EFBFBD>) */
|
||||
if(g_device_state == DEVICE_STATE_ON || typecflag == 1)
|
||||
{
|
||||
/* --- <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>״̬ --- */
|
||||
// Update_Pressure_Display(); // <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>Ƶ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2>û<EFBFBD><C3BB><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>
|
||||
if(key_press_flag)
|
||||
{
|
||||
key_press_flag = 0;
|
||||
SwitchPressureUnit();
|
||||
Update_Pressure_Display(); // <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>Ƶ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2>û<EFBFBD><C3BB><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ˢ<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>
|
||||
if(display_update_flag)
|
||||
{
|
||||
display_update_flag = 0; // <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Update_Pressure_Display();
|
||||
if(g_ble_init_done==0)//<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־λ
|
||||
{
|
||||
BLE_Application_Init();//<2F><>һ<EFBFBD>βɼ<CEB2><C9BC><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
g_ble_init_done=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!power_off_screen_cleared)
|
||||
{
|
||||
OLED_Clear();
|
||||
OLED_Refresh();
|
||||
power_off_screen_cleared = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´β<C2B4><CEB2><EFBFBD>ִ<EFBFBD><D6B4>
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
/****************************************************************************/
|
||||
Reference in New Issue
Block a user