📄 timex.c
字号:
#include <limits.h>
//********************temporary define********************
static const float arrTVal[]=
{
1.00e-3,
2.50e-3,
5.00e-3,//ns
10.00e-3,
25.00e-3,
50.00e-3,
100.00e-3,
250.00e-3,
500.00e-3,
1.00, //us
2.50,
5.00,
10.00,
25.00,
50.00,
100.00,
250.00,
500.00,
1.00e3, //ms
2.50e3,
5.00e3,
10.00e3,
25.00e3,
50.00e3,
100.00e3,
250.00e3,
500.00e3,
1.00e6, //s
2.50e6,
5.00e6,
10.00e6,
25.00e6,
50.00e6,
100.00e6,
250.00e6
};
char stoplevel;
void std_real(fElement* fe)
{
if (fe->fdata!=0 && fe->funit<0x1c)
{
while (fabs(fe->fdata)>=1000.0)
{
fe->fdata=fe->fdata/1000.0;
fe->funit++;
}
if (fe->funit!=6)
{
while (fabs(fe->fdata)<1.0)
{
fe->fdata=fe->fdata*1000.0;
fe->funit--;
if (fe->funit==0) break;
}
}
}
//else fe->funit=4;
}
void std_Tmpos(char which)
{
if (T_range[which].Vallevel>225)
//此处的值225指预触发深度的最大值,是FIFO深度的90%.
T_range[which].Vallevel=225;
else if (T_range[which].Vallevel<INT_MIN+16)
T_range[which].Vallevel=INT_MIN+16;
//此处限制了随机方式下波形左移的最小值
if (basetime<LEV250NS && T_range[which].Vallevel<25)
T_range[which].Vallevel=25;
//此处限制了随机方式下波形左移的最小值
if (basetime>LEV50MS && T_range[which].Vallevel<0)
T_range[which].Vallevel=0;
T_range[which].fVal=125-T_range[which].Vallevel;
T_range[which].fVal=T_range[which].fVal*X_range[which].fVal/25.0;
if (which)
W_center=W_pos.fVal*25.0/M_range.fVal+M_pos.Vallevel;
}
static void std_TmStep()
{
int fx;
fx=125-T_range[0].fVal*25/X_range[0].fVal;
if (fx>225)
fx=225;
else if (fx<INT_MIN+16)
fx=INT_MIN+16;
if (basetime<LEV250NS && fx<25)
fx=25;
T_range[0].Vallevel=fx;
}
int Get_Tmpos(char which)
{
//if (T_range[which].Vallevel>225) return 225;
return T_range[which].Vallevel;
}
void Get_TmfVal(fElement *fe, char which)
{
fe->fdata=-X_range[which].fVal*4;
if (basetime<LEV250NS && T_range[which].fVal>X_range[which].fVal*5)
fe->fdata=X_range[which].fVal*5;
else if (T_range[which].fVal > (fe->fdata))
fe->fdata=T_range[which].fVal;
fe->funit=T_range[which].Valunit;
std_real(fe);
}
void Get_TmfVal2(fElement * ftemp, char which)
{
(*ftemp).fdata=X_range[which].fVal;
(*ftemp).funit=X_range[which].Valunit;
std_real(ftemp);
}
//////////////////////////////////////////////////////////time setting
void std_TmEx()
{
int iwidth;
//W_center+=gap;
iwidth=W_width/2;
if (W_center+iwidth>250)
{
M_pos.Vallevel=M_pos.Vallevel-(W_center+iwidth-250);
W_center=250-iwidth;
}
else if (W_center-iwidth<0)
{
M_pos.Vallevel=M_pos.Vallevel+(iwidth-W_center);
W_center=iwidth;
}
iwidth=W_width*2/5;
if (M_pos.Vallevel-W_center>iwidth)
{
M_pos.Vallevel=W_center+iwidth;
}
W_pos.fVal=(W_center-M_pos.Vallevel)*M_range.fVal;
W_pos.Vallevel=125.0-W_pos.fVal/W_range.fVal;
W_pos.fVal=W_pos.fVal/25.0;
std_Tmpos(0);
}
void expandW(char initWin)
{
int imin;
imin=M_range.Vallevel-3;
if ((iProcFlag<=PROC_READY) && imin<stoplevel-3) imin=stoplevel-3;
imin=imin>LEV250NS ? imin : LEV250NS;
if (W_range.Vallevel>=M_range.Vallevel)
{
if (initWin) W_range.Vallevel=imin;
else W_range.Vallevel=M_range.Vallevel-1;
}
if (W_range.Vallevel<imin) W_range.Vallevel=imin;
//W_range.fVal=arrTVal[W_range.Vallevel];
switch (stoplevel-W_range.Vallevel)
{
case 1: W_range.fVal=arrTVal[stoplevel]/2;
break;
case 2: //禁止200NS档的出现
if (stoplevel!=LEV1US)
W_range.fVal=arrTVal[stoplevel]/5;
else
W_range.fVal=arrTVal[stoplevel]/4;
break;
case 3: W_range.fVal=arrTVal[stoplevel]/10;
}
W_width=250.0/M_range.fVal*W_range.fVal;
if (initWin==0) std_TmEx();
Samples();
}
//////////////////////////////////////////////////////////////////////释抑时间
Delayer DTimer={{50, 0x0ffff}, 0};
void ModiTimer(int gap)
{
unsigned int i;
i=hor_1/2;
//if (X_range[i].Vallevel>17) gap*=20;
//else if (X_range[i].Vallevel>14) gap*=10;
//else if (X_range[i].Vallevel>11) gap*=5;
//else if (X_range[i].Vallevel>8) gap*=2;
if (DTimer.useWhich==0 && X_range[i].Vallevel>LEV100US)
{
DTimer.useWhich=1;
DTimer.uiVal[1]=25;
DTimer.uiVal[0]=0x0ffff;
}
else if (DTimer.useWhich==1 && X_range[i].Vallevel<=LEV100US)
{
DTimer.useWhich=0;
DTimer.uiVal[0]=50000;
DTimer.uiVal[1]=0x0ffff;
}
if (DTimer.useWhich)
{
i=(unsigned int)X_range[i].fVal/(5*20);
}
else
{
i=(unsigned int)X_range[i].fVal/(5*10.00e-3);
}
gap*=i;
DTimer.uiVal[DTimer.useWhich]+=gap;
if (DTimer.useWhich==0)
{
if (DTimer.uiVal[0]>50000)
{
DTimer.useWhich=1;
DTimer.uiVal[1]=25;
DTimer.uiVal[0]=0x0ffff;
}
else if (DTimer.uiVal[0]<50)
{
DTimer.uiVal[0]=50;
}
}
else
{
if (DTimer.uiVal[1]>50000)
{
DTimer.uiVal[1]=50000;
}
else if (DTimer.uiVal[1]<25)
{
DTimer.useWhich=0;
DTimer.uiVal[0]=50000;
DTimer.uiVal[1]=0x0ffff;
}
}
DelayTimer();
}
void DelayTimer()
{
int x;
if (GetStatus(EDGE_MENU, MENUITEM4)>0)
x=0x0000;
else
x=0x0004;
ECONTROL=x;
TIMER1_REG=DTimer.uiVal[0];
TIMER2_REG=DTimer.uiVal[1];
uiPower=x | 0x0001 | 0x0002;
ECONTROL=uiPower;
}
void DispTimer()
{
fElement fTimer;
if (DTimer.useWhich==0)
fTimer.fdata=DTimer.uiVal[0]*0.01; //计数时钟0.01us
else
fTimer.fdata=DTimer.uiVal[1]*20; //计数时钟20us
fTimer.funit=2;
std_real(&fTimer);
FtoC(fTimer.fdata, strFloat, 2, 5);
strcat(strFloat, zqstr[fTimer.funit]);
FillRect(MENU_Y+14, 264, 12, 60, 1, 1);
DrawOut(MENU_Y+16, 266, strFloat, 3, 0);
}
/////////////////////////////////////////////////time range adjust
static void t_stop()
{
if (stoplevel>LEV50MS)
{//在SCAN档位下STOP或READY状态的波形尺度变换处理
if (M_range.Vallevel>stoplevel+1)
M_range.Vallevel=stoplevel+1;
else if (M_range.Vallevel<stoplevel-6)
M_range.Vallevel=stoplevel-6;
}
else if (stoplevel>LEV100NS)
{//在实时档位下STOP或READY状态的尺度变换
if (M_range.Vallevel>stoplevel+1)
M_range.Vallevel=stoplevel+1;
else if (M_range.Vallevel<stoplevel-3)
M_range.Vallevel=stoplevel-3;
if (M_range.Vallevel<LEV250NS)
M_range.Vallevel=LEV250NS;
else if (M_range.Vallevel>LEV50MS)
// M_range.Vallevel=LEV50MS;
SetStatus(EDGE_MENU, MENUITEM4, TRI_AUTO);
}
else
{//在随机档位下STOP或READY状态的尺度变换
if (M_range.Vallevel>stoplevel+1)
M_range.Vallevel=stoplevel+1;
else if (M_range.Vallevel<stoplevel-2)
M_range.Vallevel=stoplevel-2;
if (M_range.Vallevel>LEV100NS) M_range.Vallevel=LEV100NS;
}
}
void t_modi()
{
if (ISRECMODE)
{
if (M_range.Vallevel>LEV250S)
M_range.Vallevel=LEV250S;
else if (M_range.Vallevel<LEV100MS)
M_range.Vallevel=LEV100MS;
}
else
{
if (M_range.Vallevel>LEV5S)
M_range.Vallevel=LEV5S;
else if (M_range.Vallevel<LEV1NS)
{
if (ISMENU(CALI_MENU))
M_range.Vallevel=LEV1NS;
else
M_range.Vallevel=LEV1NS;
}
}
if (!ISRECMODE && iProcFlag==PROC_STOP)
{
if (ISFFT)
{//在FFT模式的停止状态不能扩展频率档位
M_range.Vallevel=stoplevel;
return;
}
else
{
t_stop();
}
}
else
stoplevel=M_range.Vallevel;
M_range.fVal=arrTVal[M_range.Vallevel];
std_TmStep();
if (ISPEAKLEV)
{
if (GetStatus(SETUP_MENU, MENUITEM3) || ISSCANLEV)
PEAK_SEL=1;
}
else
PEAK_SEL=0;
base_t();
InitProcess(SA_RESET);
if (basetime<LEV25NS)
{//5ns/div和10ns/div时基上仅采用点显示方式
SetStatus(DISP_MENU, MENUITEM1, 0);
}
else
SetStatus(DISP_MENU, MENUITEM1, GetStatus(MATH_MENU, MENUITEM5));
//插值
if (basetime<LEV10NS)
{
SetStatus(ACQ_MENU, MENUITEM5, 1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -