390 lines
10 KiB
C
390 lines
10 KiB
C
|
#ifdef __cplusplus
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
#endif
|
|||
|
|
|||
|
#include "type.h"
|
|||
|
#include "UWater_pt_app.h"
|
|||
|
#include "UWater_gpio_driver.h"
|
|||
|
#include "UWater_timer1uS_driver.h"
|
|||
|
#include "UWater_adc_driver.h"
|
|||
|
#include "UWater_gp22_app.h"
|
|||
|
#include "UWater_frame_app.h"
|
|||
|
#include "UWater_sys.h"
|
|||
|
#include "sys_processor.h"
|
|||
|
|
|||
|
|
|||
|
static float s_g_temp_value = 20;//<2F>ϵ<EFBFBD>Ĭ<EFBFBD><C4AC>20<32><30>
|
|||
|
static u32 s_temp_adc_result = 0;
|
|||
|
static u8 s_temp_adc_if_done = 0;
|
|||
|
|
|||
|
static u32 s_pt_tickstart = 0;
|
|||
|
|
|||
|
//static u32 s_temp_adc_arr[PT_FILTER_NUM]; //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
//static u8 s_pt_arr_sub = 0; //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static u8 s_g_temp_machine_state_num = TEMP_S0; // <20><>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
|
|||
|
//static float s_g_temp_value_last = 0;
|
|||
|
static float s_g_temp_value_now;
|
|||
|
float Temp_cal(float temp_result);
|
|||
|
|
|||
|
#if (TEMP_RM)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#else //<2F><>IC<49>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
static float s_g_temp_voltage;
|
|||
|
static float s_g_temp_result;
|
|||
|
static float s_g_temp_error;
|
|||
|
#endif
|
|||
|
|
|||
|
extern float temp_calculate_last;//<2F><>ȡ<EFBFBD>¶<EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/***************************************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: u32 PtFilterJunZhi(u32 *data, u8 data_len)
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ֵ + <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>u32 *data <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
****************************************************************/
|
|||
|
//static u32 PtFilterJunZhi(u32 *data, u8 data_len) //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
//{
|
|||
|
// u8 i, j, len, count;
|
|||
|
// u32 *p;
|
|||
|
// u32 temp = 0, sum = 0;
|
|||
|
|
|||
|
// p = data;
|
|||
|
// len = data_len;
|
|||
|
|
|||
|
// for (j = 0; j < len - 1; j++)
|
|||
|
// {
|
|||
|
// for (i = 0; i < len - 1 - j; i++)
|
|||
|
// {
|
|||
|
// if (p[i] > p[i + 1])
|
|||
|
// {
|
|||
|
// temp = p[i];
|
|||
|
// p[i] = p[i + 1];
|
|||
|
// p[i + 1] = temp;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
// for (count = 2; count < len - 2; count++)
|
|||
|
// {
|
|||
|
// sum += p[count];
|
|||
|
// }
|
|||
|
|
|||
|
// return (sum / (len - 4));
|
|||
|
//}
|
|||
|
|
|||
|
/***********************<2A>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>***************************
|
|||
|
Function:
|
|||
|
Description:
|
|||
|
Input:
|
|||
|
Return:
|
|||
|
Others:
|
|||
|
****************************************************************/
|
|||
|
void TempADCPowEnable(void)
|
|||
|
{
|
|||
|
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_SET);//<2F><>
|
|||
|
}
|
|||
|
|
|||
|
void TempADCPowDisable(void)
|
|||
|
{
|
|||
|
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><>
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************
|
|||
|
Function: u8 TempStartTaskApp(void)
|
|||
|
Description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Input:
|
|||
|
return: 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
Others:
|
|||
|
*************************************************/
|
|||
|
u8 TempStartTaskApp(void)
|
|||
|
{
|
|||
|
if((s_g_temp_machine_state_num == TEMP_S0)&&(FixedTimeNbIoTUploadIfIdle() == TASK_IDLE))
|
|||
|
{
|
|||
|
TempADCPowEnable();
|
|||
|
s_pt_tickstart = Timer1usGetTick(); //power on delay
|
|||
|
s_g_temp_machine_state_num = TEMP_S2;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
else
|
|||
|
return 0;
|
|||
|
}
|
|||
|
/************************************************
|
|||
|
Function: float TempCheckValueApp(void)
|
|||
|
Description: <EFBFBD><EFBFBD>ѯ<EFBFBD>¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Input:
|
|||
|
return: <EFBFBD>¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Others:
|
|||
|
*************************************************/
|
|||
|
float TempCheckValueApp(void)
|
|||
|
{
|
|||
|
#if WENDU_FANSUAN_OPEN
|
|||
|
s_g_temp_value = temp_calculate_last;//<2F><><EFBFBD><EFBFBD><EFBFBD>¶ȵ<C2B6>ʵʱ<CAB5><CAB1>ֵ
|
|||
|
#else
|
|||
|
if(s_g_temp_value > 90)
|
|||
|
{
|
|||
|
s_g_temp_value = 36;
|
|||
|
}
|
|||
|
else if(s_g_temp_value < -30)
|
|||
|
{
|
|||
|
s_g_temp_value = -1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
return s_g_temp_value;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TempInitApp(void)
|
|||
|
{
|
|||
|
//// u8 i; //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
s_g_temp_machine_state_num = TEMP_S0;
|
|||
|
|
|||
|
stc_gpio_cfg_t stcGpioCfg;
|
|||
|
|
|||
|
DDL_ZERO_STRUCT(stcGpioCfg);
|
|||
|
//PF7
|
|||
|
stcGpioCfg.enDir = GpioDirOut; ///< <20>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD>
|
|||
|
stcGpioCfg.enDrv = GpioDrvL; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
stcGpioCfg.enPu = GpioPuDisable; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>
|
|||
|
stcGpioCfg.enPd = GpioPdDisable;
|
|||
|
stcGpioCfg.enOD = GpioOdDisable; ///< <20>˿ڿ<CBBF>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
|
|||
|
stcGpioCfg.enCtrlMode = GpioAHB; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>->AHB
|
|||
|
Gpio_Init(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, &stcGpioCfg);
|
|||
|
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
|
|||
|
|
|||
|
#if WENDU_FANSUAN_OPEN
|
|||
|
|
|||
|
#else
|
|||
|
TempStartTaskApp();//<2F>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳɼ<C8B2> <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><F2A3BAB1>Ƹ<EFBFBD>λ<EFBFBD>Ǽ춨6s<36><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳɼ<C8B2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ6s<36><73><EFBFBD>¶<EFBFBD>ֵ<EFBFBD><D6B5>0
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
/************************************************
|
|||
|
Function: TempPreSleep()
|
|||
|
Description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Input:
|
|||
|
return:
|
|||
|
Others:
|
|||
|
*************************************************/
|
|||
|
void TempPreSleep(void)
|
|||
|
{
|
|||
|
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><>
|
|||
|
}
|
|||
|
|
|||
|
/************************************************
|
|||
|
Function: TempWakeSleep()
|
|||
|
Description: <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Input:
|
|||
|
return:
|
|||
|
Others:
|
|||
|
*************************************************/
|
|||
|
void TempWakeSleep(void)
|
|||
|
{
|
|||
|
; //<2F><>
|
|||
|
}
|
|||
|
|
|||
|
u8 TempIfSleepApp(void)
|
|||
|
{
|
|||
|
if(s_g_temp_machine_state_num == TEMP_S0)
|
|||
|
return TRUE;
|
|||
|
else
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TempMachineApp(void)
|
|||
|
{
|
|||
|
switch (s_g_temp_machine_state_num)
|
|||
|
{
|
|||
|
case TEMP_S0:
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
case TEMP_S1:
|
|||
|
{
|
|||
|
if(Timer1usGetTick() - s_pt_tickstart > POWER_ON_DELAY)
|
|||
|
{
|
|||
|
s_g_temp_machine_state_num = TEMP_S2;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
case TEMP_S2:
|
|||
|
{
|
|||
|
if(TASK_IDLE == AdcIfIdle()) //<2F>¶<EFBFBD>
|
|||
|
{
|
|||
|
// AdcStartConvert(T_CHECK_ADC, T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_arr[s_pt_arr_sub],&s_temp_adc_if_done);
|
|||
|
AdcStartConvert(T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_result,&s_temp_adc_if_done);//20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
|||
|
s_g_temp_machine_state_num = TEMP_S3;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
case TEMP_S3:
|
|||
|
{
|
|||
|
if (TRUE == s_temp_adc_if_done)
|
|||
|
{
|
|||
|
if (ADC_OK == AdcGetStatus())
|
|||
|
{
|
|||
|
#if (TEMP_RM)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if(s_temp_adc_result>TEMP_SEGMENT_SMALL)
|
|||
|
{
|
|||
|
s_g_temp_value_now = (float)0.000000004785*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result -(float)0.0000595*s_temp_adc_result*s_temp_adc_result + (float)0.2187*s_temp_adc_result -(float)247.9;//<2F>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ-20~3
|
|||
|
s_g_temp_value_now = s_g_temp_value_now - (float)0.7;
|
|||
|
}
|
|||
|
else if(s_temp_adc_result>TEMP_SEGMENT_MIDDLE)
|
|||
|
{
|
|||
|
s_g_temp_value_now = (float)-0.000000002058*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.00001525*s_temp_adc_result*s_temp_adc_result - (float)0.05455*s_temp_adc_result + (float)82.24;//3~43
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
s_g_temp_value_now = (float)-0.00000005296*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.0001457*s_temp_adc_result*s_temp_adc_result - (float)0.1697*s_temp_adc_result + (float)117.5;//43<34><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
#else
|
|||
|
// s_g_temp_value_now = s_g_temp_result;
|
|||
|
|
|||
|
// s_temp_adc_result = PtFilterJunZhi(s_temp_adc_arr, PT_FILTER_NUM); //<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>˲<EFBFBD>
|
|||
|
// s_pt_arr_sub++;
|
|||
|
// s_pt_arr_sub %= PT_FILTER_NUM;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>temp_adc_result<6C><74><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// s_g_temp_voltage = ((float)s_g_temp_result)*1.2/10000.0/TMEP_NUM;
|
|||
|
// s_g_temp_voltage = (s_g_temp_voltage - 0.5)/0.01;
|
|||
|
// s_g_temp_error = 0.000244*(125 - s_g_temp_voltage)*(s_g_temp_voltage +40) - 2;
|
|||
|
|
|||
|
s_g_temp_voltage = (float)250*s_temp_adc_result/(float)4095; //<2F>Ŵ<EFBFBD>100<30><30>
|
|||
|
|
|||
|
|
|||
|
s_g_temp_result = s_g_temp_voltage;
|
|||
|
if(s_g_temp_result >= 50)
|
|||
|
{
|
|||
|
s_g_temp_result -= 50;
|
|||
|
s_g_temp_voltage = s_g_temp_result;
|
|||
|
|
|||
|
if(s_g_temp_result < 125)
|
|||
|
{
|
|||
|
s_g_temp_result = (125 - s_g_temp_result) * (s_g_temp_result + 40);
|
|||
|
s_g_temp_result = s_g_temp_result * (float)0.000244;
|
|||
|
s_g_temp_error = s_g_temp_result - 2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
s_g_temp_error = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
s_g_temp_result = 50 - s_g_temp_result;
|
|||
|
s_g_temp_voltage = - s_g_temp_result;
|
|||
|
if(s_g_temp_result >= 40)
|
|||
|
{
|
|||
|
s_g_temp_result = (125 + s_g_temp_result) * (40 - s_g_temp_result );
|
|||
|
s_g_temp_result = s_g_temp_result * (float)0.000244;
|
|||
|
s_g_temp_error = s_g_temp_result - 2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
s_g_temp_error = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
s_g_temp_value_now = s_g_temp_voltage - s_g_temp_error;
|
|||
|
#endif
|
|||
|
|
|||
|
// if(s_g_temp_value_last == 0)
|
|||
|
// {
|
|||
|
// ;
|
|||
|
// }
|
|||
|
// else if(s_g_temp_value_now >= s_g_temp_value_last)
|
|||
|
// {
|
|||
|
// if((s_g_temp_value_now - s_g_temp_value_last) > 1)
|
|||
|
// {
|
|||
|
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
|||
|
// }
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// if((s_g_temp_value_last - s_g_temp_value_now) > 1)
|
|||
|
// {
|
|||
|
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
|||
|
// }
|
|||
|
// }
|
|||
|
// s_g_temp_value_last = s_g_temp_value_now;
|
|||
|
s_g_temp_value = Temp_cal(s_g_temp_value_now);
|
|||
|
}
|
|||
|
TempADCPowDisable();
|
|||
|
|
|||
|
s_g_temp_machine_state_num = TEMP_S0;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
float Temp_cal(float temp_result)
|
|||
|
{
|
|||
|
// float temp = temp_result ;
|
|||
|
float temp;
|
|||
|
u32 heat_temp = FrameCheckParaApp(FramePara_Tc0);
|
|||
|
if(heat_temp >= 0x80000000)
|
|||
|
{
|
|||
|
heat_temp &= 0x7FFFFFFF;
|
|||
|
temp = temp_result - Gp30DataToFloat(heat_temp);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
temp = temp_result + Gp30DataToFloat(heat_temp);
|
|||
|
}
|
|||
|
#if (TEMP_RM)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#else//IC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
|
|||
|
if(temp >= (float)23)
|
|||
|
{
|
|||
|
temp += (float)0.2;
|
|||
|
}
|
|||
|
else if(temp > 15)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
else if(temp >= (float)8.5)
|
|||
|
{
|
|||
|
// temp -= (float)0.3;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
temp -= (float)(0.55 );
|
|||
|
}
|
|||
|
// if(temp <= 0)
|
|||
|
// {
|
|||
|
// temp = temp*(-1);
|
|||
|
// heat_temp = FloatToGp30Data(temp);
|
|||
|
// heat_temp = heat_temp|0x80000000;
|
|||
|
// return heat_temp;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// return FloatToGp30Data(temp);
|
|||
|
// }
|
|||
|
#endif
|
|||
|
return (temp);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif //#ifdef __cplusplus
|