Files
CHJ/user/Core/D9V2FR_DP2006V1000 .c

484 lines
15 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
#if(DP2006V1000)
__SAMPLE_STATUS_BIT_TypeDef sampleState;
u16 offsetRType, offsetGCFX;
u16 processNextTime, processIndex;
u16 voltageDetected[ANX], adcGain;
// <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;
/******<2A><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><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)sampleData.TCode[IRHCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//IRH 0X8303
voltageDetected[VRHX ]= (u16)sampleData.TCode[IRRCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//IRR 0X8304
voltageDetected[IVHDX]= (u16)sampleData.TCode[URUCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URU 0X8305
voltageDetected[RHVOL]= (u16)sampleData.TCode[URHCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URH 0X8306
voltageDetected[VDUGX]= (u16)sampleData.TCode[BASCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URU 0X8307 ADC<44><43>׼<EFBFBD><D7BC>ѹ/2
voltageDetected[TPCB]= (u16)sampleData.TCode[BATCode]; // ǿת<C7BF><D7AA>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>//URH 0X8308 <20><><EFBFBD>ص<EFBFBD>ѹ/3
voltageDetected[RHVOL]=voltageDetected[RHVOL]-32768;
pressure_value=GetFlowRate(voltageDetected[RHVOL],CURVE_1ST);
display_update_flag = 1;
if( voltageDetected[TPCB]>50000)
{
typecflag=1;
}
}
u16 WordSubFunction(u16 minuend, u16 subtractor)
{
u16 subResult;
subResult = minuend - subtractor;
if(minuend >= subtractor)
{
if(subResult < 32768) subResult += 32768;
else subResult = 65535;
}
else
{
if(subResult < 32768) subResult = 0;
else subResult -= 32768;
}
return subResult;
}
/******<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>***************************************************************************************************************************************************************************************************************/
void SamplingTimer_IRQ_Callback(void)
{
FlowProcessManagement();
}
void StartNormolFlowMeasurement(void)//ÿ125ms<6D><73><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
{
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
StartSamplingTimerInterval(32768); //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1>,<2C><>ʼ<EFBFBD><CABC>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Timer_register_irq_callback(SamplingTimer,SamplingTimer_IRQ_Callback );//ע<><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>
}
static void SetSystemForADCSample(u16 SampleSiagnl)//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
switch(SampleSiagnl)
{
case SIGNAL0:{
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN0;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;//IRH
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN2;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//URU
sampleData.adcConfig.SPS=SPS_488;
}break;
case SIGNAL1: {
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN1;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;//IRR
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN3;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//URH
sampleData.adcConfig.SPS=SPS_488;
}break;
case SIGNAL2: {
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN4;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN7;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//<2F><><EFBFBD>ص<EFBFBD>ѹ/3.2
sampleData.adcConfig.SPS=SPS_488;
}break;
}
}
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){
StopSamplingTimerInterval();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1>
return;
}
u32 currentTAR = pTIM1->CNT;//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
if(currentTAR > processNextTime) processNextTime = currentTAR + 5;
ResetSamplingTimerInterval(processNextTime);
}
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>ʼ
SetSystemForADCSample(SIGNAL0);//<2F><><EFBFBD><EFBFBD>SIGNAL0
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
processNextTime += 327; //20ms <20><><EFBFBD><EFBFBD>ֵ=65535/4000*t =
processIndex=1;
}break;
case 1:
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[IRHCode] = sampleData.ADCBuffer[0];//<2F><><EFBFBD><EFBFBD><EBBBBA>
sampleData.TCode[URUCode] = sampleData.ADCBuffer[1];//<2F><><EFBFBD><EFBFBD><EBBBBA>
SetSystemForADCSample(SIGNAL1);//<2F><><EFBFBD><EFBFBD>SIGNAL1
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
processNextTime += 327;//20ms
processIndex=2;
}break;
case 2:
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[IRRCode] = sampleData.ADCBuffer[0];//<2F><><EFBFBD><EFBFBD><EBBBBA>
sampleData.TCode[URHCode] = sampleData.ADCBuffer[1];//<2F><><EFBFBD><EFBFBD><EBBBBA>
SetSystemForADCSample(SIGNAL2);//<2F><><EFBFBD><EFBFBD>SIGNAL1
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
processNextTime += 327;//20ms
processIndex=3;
}break;
case 3:
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[BASCode] = sampleData.ADCBuffer[0];//<2F><><EFBFBD><EFBFBD><EBBBBA>
sampleData.TCode[BATCode] = sampleData.ADCBuffer[1];//<2F><><EFBFBD><EFBFBD><EBBBBA>
HWState.SampledOver = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StopSamplingTimerInterval();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1>
processIndex=4;
}break;
default : processIndex = 0; break;
}
SetNextProcess();
}
/******<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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>32λ<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* @param num: Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>λ<EFBFBD><EFBFBD>
*/
static u8 GetDigitCount(u32 num)
{
u8 count = 0;
if (num == 0) return 1; // 0 <20><><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[TPCB];
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>
static uint32_t led_timer = 0;
static uint32_t shutdown_timer = 0;
void My_Timer2_Callback(void)
{
// LED <20>߼<EFBFBD>
led_timer++;
if(led_timer >= 10) // 500ms
{
led_timer = 0;
LHL_GPIO_TogglePin(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;
/* 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢 (<28><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>) */
if(mucSaveParams == PARAMS_READY)
{
SaveSysParams(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>漰Flash<73><68>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʱ<EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̫<EFBFBD><CCAB>
}
if(HWState.SampledOver)
{
FlowRateDealAndOuputSub(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
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