This commit is contained in:
2026-03-20 21:16:58 +08:00
parent 286ff98b8e
commit 90c3d919df
248 changed files with 94554 additions and 0 deletions

581
user/Core/DP2006_VM1000.c Executable file
View 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><><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
/****************************************************************************/