📄 ctrlbord.cpp
字号:
// CtrlBord.cpp : implementation file
//
#include "stdafx.h"
#include "USBOscillograph.h"
#include "CtrlBord.h"
#include <windows.h>
#include <winioctl.h>
#include <process.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include "usb100.h"
#include "usbdi.h"
//#include "ezusbsys.h"
#define MAX_DEVICE_NAME 256
#define PI 3.1415926
#define JK1_OFF 0xb0
#define JK1_ON 0xb1
#define JK2_OFF 0xb2
#define JK2_ON 0xb3
#define JK3_OFF 0xb4
#define JK3_ON 0xb5
#define JK4_OFF 0xb6
#define JK4_ON 0xb7
#define JK5_OFF 0xb8
#define JK5_ON 0xb9
#define JK6_OFF 0xba
#define JK6_ON 0xbb
#define JK7_OFF 0xbc
#define JK7_ON 0xbd
//-----------------------
#define VX_ENABLE_TRANS 0xe0
#define VX_DISABLE_TRANS 0xe1
//--Select signal ---------
#define SELECT_AC_USB 0xb0
#define SELECT_DC_USB 0xb1
#define SELECT_SIGNAL_USB 0xb2
#define SELECT_GND_USB 0xb3
//------------------------------
//---select dD-----
#define SELECT_10V_DIV_USB 0xb4
#define SELECT_5V_DIV_USB 0xb5
#define SELECT_2V_DIV_USB 0xb6
#define SELECT_1V_DIV_USB 0xb7
#define SELECT_500mV_DIV_USB 0xb8
#define SELECT_200mV_DIV_USB 0xb9
#define SELECT_100mV_DIV_USB 0xba
#define SELECT_50mV_DIV_USB 0xbb
#define SELECT_20mV_DIV_USB 0xbc
#define SELECT_10mV_DIV_USB 0xbd
#define SELECT_5mV_DIV_USB 0xbe
//2é?ù?μ?êéè??
#define SELECT_FT100M_USB 0xc0
#define SELECT_FT50M_USB 0xc1
#define SELECT_FT20M_USB 0xc2
#define SELECT_FT10M_USB 0xc3
#define SELECT_FT5M_USB 0xc4
#define SELECT_FT2M_USB 0xc5
#define SELECT_FT1M_USB 0xc6
#define PI 3.1415926
#define DISWIDTH 500
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const float vlots[11]={10000.0, 5000.0, 2000.0, 1000.0, 500.0, 200.0, 100.0, 50.0, 20.0, 10.0, 5.0};
// 1K 2 5 10 20 50 100 200 500K 1M 2 5
const float sampleFt[16]={1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0, 200.0, 500.0, 1000.0, 2000.0, 5000.0,
// 10 20 50 100M
10000.0, 20000.0, 50000.0, 100000.0};
char DeviceName[MAX_DEVICE_NAME] = "Ezusb-0";
const BYTE db_ctrl[11]={SELECT_10V_DIV_USB,SELECT_5V_DIV_USB,SELECT_2V_DIV_USB,SELECT_1V_DIV_USB,
SELECT_500mV_DIV_USB,SELECT_200mV_DIV_USB,SELECT_100mV_DIV_USB,SELECT_50mV_DIV_USB,
SELECT_20mV_DIV_USB,SELECT_10mV_DIV_USB,SELECT_5mV_DIV_USB};
const BYTE Fcount[7]={SELECT_FT100M_USB,SELECT_FT50M_USB,SELECT_FT20M_USB,SELECT_FT10M_USB,SELECT_FT5M_USB,SELECT_FT2M_USB,SELECT_FT1M_USB};
/////////////////////////////////////////////////////////////////////////////
// CCtrlBord
extern unsigned char addata[];
extern unsigned int time_div[];
WORD vv[5];
unsigned char adbuffer[1032];
int vt;
IMPLEMENT_DYNCREATE(CCtrlBord, CFormView)
CCtrlBord::CCtrlBord()
: CFormView(CCtrlBord::IDD)
{
//{{AFX_DATA_INIT(CCtrlBord)
m_TrigeMode = false;
m_JK1 = FALSE;
m_JK2 = FALSE;
m_JK3 = FALSE;
m_JK4 = FALSE;
m_JK5 = FALSE;
m_JK6 = FALSE;
m_JK7 = FALSE;
m_single_trige = FALSE;
m_mes = _T("");
m_mes2 = _T("");
m_trig_vlot = 0;
m_vlot_dis = _T("1.25V");
m_db10 = FALSE;
m_db2 = FALSE;
m_db5 = FALSE;
//}}AFX_DATA_INIT
isRun=false;
send_req=false;
busy_flag=false;
select_Tdv=13;
sampleT=1000; //1000ns 1Mhz采样率
//初始状态1ms/div
T_div=time_div[select_Tdv]/50;//20000;//ns 1,000,000/50
}
CCtrlBord::~CCtrlBord()
{
}
void CCtrlBord::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCtrlBord)
DDX_Control(pDX, IDC_CHB, m_select_ch2);
DDX_Control(pDX, IDC_CHA, m_select_ch1);
DDX_Control(pDX, IDC_CH1SUBCH2, m_ch1subch2);
DDX_Control(pDX, IDC_SLIDER_TRIG, m_trig_ctrl);
DDX_Control(pDX, IDC_COMBO_SELECT_FT, m_FT_comb);
DDX_Control(pDX, IDC_RUN, m_run_button);
DDX_Control(pDX, IDC_SIGNAL_TRIG, m_single_trige_button);
DDX_Control(pDX, IDC_CHECK_TRIGE, m_check_trige_button);
DDX_Control(pDX, IDC_GND, m_gnd_button);
DDX_Control(pDX, IDC_DC, m_dc_button);
DDX_Control(pDX, IDC_AC, m_ac_button);
DDX_Control(pDX, IDC_CH1ANDCH2, m_ch1_ch2_button);
DDX_Control(pDX, IDC_CH2, m_ch2_button);
DDX_Control(pDX, IDC_CH1, m_ch1_button);
DDX_Control(pDX, IDC_CH2DBCTRL, m_ch2dbCtl);
DDX_Control(pDX, IDC_DISPLAYWND, m_displayWnd);
DDX_Control(pDX, IDC_CH1TIMECTRL, m_ch1TimeCtl);
DDX_Control(pDX, IDC_CH1DBCTRL, m_ch1dbCtl);
DDX_Check(pDX, IDC_CHECK_TRIGE, m_TrigeMode);
DDX_Check(pDX, IDC_JK1, m_JK1);
DDX_Check(pDX, IDC_JK2, m_JK2);
DDX_Check(pDX, IDC_JK3, m_JK3);
DDX_Check(pDX, IDC_JK4, m_JK4);
DDX_Check(pDX, IDC_JK5, m_JK5);
DDX_Check(pDX, IDC_JK6, m_JK6);
DDX_Check(pDX, IDC_JK7, m_JK7);
DDX_Check(pDX, IDC_SIGNAL_TRIG, m_single_trige);
DDX_Control(pDX, IDC_MSCOMM, m_ComPort);
DDX_Text(pDX, IDC_EDIT1, m_mes);
DDX_Text(pDX, IDC_EDIT2, m_mes2);
DDX_Slider(pDX, IDC_SLIDER_TRIG, m_trig_vlot);
DDX_Text(pDX, IDC_VLOT_DIS, m_vlot_dis);
DDX_Check(pDX, IDC_DB10, m_db10);
DDX_Check(pDX, IDC_DB2, m_db2);
DDX_Check(pDX, IDC_DB5, m_db5);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCtrlBord, CFormView)
//{{AFX_MSG_MAP(CCtrlBord)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_CH1, OnCh1)
ON_BN_CLICKED(IDC_CH2, OnCh2)
ON_BN_CLICKED(IDC_CH1ANDCH2, OnCh1andch2)
ON_BN_CLICKED(IDC_RUN, OnRun)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_BN_CLICKED(IDC_CH1DBCTRL, OnCh1dbctrl)
ON_BN_CLICKED(IDC_CH1TIMECTRL, OnCh1timectrl)
ON_BN_CLICKED(IDC_CHECK_TRIGE, OnCheckTrige)
ON_BN_CLICKED(IDC_SCALELINE, OnScaleline)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_BN_CLICKED(IDC_SIGNAL_TRIG, OnSignalTrig)
ON_BN_CLICKED(IDC_AC, OnAc)
ON_BN_CLICKED(IDC_DC, OnDc)
ON_BN_CLICKED(IDC_GND, OnGnd)
ON_CBN_SELCHANGE(IDC_COMBO_SELECT_FT, OnSelchangeComboSelectFt)
ON_BN_CLICKED(IDC_KEY_UP, OnKeyUp)
ON_BN_CLICKED(IDC_KEY_LEFT, OnKeyLeft)
ON_BN_CLICKED(IDC_KEY_RIGHT, OnKeyRight)
ON_BN_CLICKED(IDC_KEY_DOWN, OnKeyDown)
ON_BN_CLICKED(IDC_KEY_OK, OnKeyOk)
ON_BN_CLICKED(IDC_KEY_EXIT, OnKeyExit)
ON_BN_CLICKED(IDC_OFF, OnOff)
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_JK1, OnJk1)
ON_BN_CLICKED(IDC_JK2, OnJk2)
ON_BN_CLICKED(IDC_JK3, OnJk3)
ON_BN_CLICKED(IDC_JK4, OnJk4)
ON_BN_CLICKED(IDC_DB10, OnDb10)
ON_BN_CLICKED(IDC_DB2, OnDb2)
ON_BN_CLICKED(IDC_DB5, OnDb5)
ON_BN_CLICKED(IDC_CH1ANDCH3, OnCh1andch3)
ON_BN_CLICKED(IDC_CH1SUBCH2, OnCh1subch2)
ON_BN_CLICKED(IDC_CHA, OnCha)
ON_BN_CLICKED(IDC_CHB, OnChb)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCtrlBord diagnostics
#ifdef _DEBUG
void CCtrlBord::AssertValid() const
{
CFormView::AssertValid();
}
void CCtrlBord::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCtrlBord message handlers
/*
0 50ns/div : 50ns/50=1ns 500*1=500ns 50Mhz 1024*20ns=20480ns 40 使用插值算法 屏数据
1 0.1us/div: 100ns/50=2ns 500*2=1,000ns 50Mhz 1024*20ns=20480ns 20 使用插值算法
2 0.2us/div: 200/50=4ns 500*4=2,000ns 50Mhz 20480/2000 =10 使用插值算法
3 0.5us/div: 500/50=10ns 500*10=5,000ns 50Mhz 20480/5000 =4 使用插值算法
4 1us/div: 1,000/50=20ns 500*20=10,000ns 50Mhz 0 20480/10000=2 不使用插值算法
5 2us/div: 2,000/50=40ns 500*40=20,000ns 50Mhz 1 1024*40ns=40960ns 2屏数据
6 5us/div: 5,000/50=100ns 500*100=50,000ns 5 10Mhz 0 1024*100ns=102400 /50000=2屏数据
7 10us/div: 10,000/50=200ns 500*200=100,000ns 5Mhz 0 1024*200/100000=2
8 20us/div: 20,000/50=400ns 500*400=200,000ns 5Mhz 1 采集1024*2数据在显示 显示2屏数据
9 50us/div: 50,000/50=1,000ns 500*1000=500,000ns 1Mhz 0 1024*1000=1024000 2 屏数据
10 0.1ms/div: 100,000/50=2,000ns 500*2000= 1,000,000ns 1Mhz 1 采集1024* 隔2取一点 数据显示2屏数据 2048000ns/1000000 =2ms 500hz
11 0.2ms/div: 200,000/50=4,000ns 500*4000= 2,000,000ns 1Mhz 3 采集1024* 隔4取一点 数据显示2屏数据 4096000ns/1000000 =4ms 200hz
12 0.5ms/div: 500,000/50=10,000ns 500*10,000= 5,000,000 ns 1Mhz 9 采集1024* 隔10取一点 数据显示2屏数据 10240000ns/ 1000000=10ms 100hz
13 1ms/div: 1,000,000/50=20,000ns 500*20,000=10,000,000 ns 1Mhz 19 采集1024* 隔20点取一点 数据显示2屏数据 20480000/1000000=20ms 50hz
14 2ms/div: 2,000,000/50=40,000ns 500*40,000=20,000,000 ns 1Mhz 采集1024* 隔40点取一点 数据显示2屏数据 40960000/1000000=40ms 25hz
15 5ms/div: 5,000,000/50=100,000ns 500*100,000= 50,000,000ns 1Mhz 采集1024* 隔100点取一点 数据显示2屏数据 100ms驱动 显示方式为滚动模式
16 10ms/div: 10,000,000/50=200,000ns 500*200,000=100,000,000NS 1Mhz 采集1024* 隔200点取一点 数据现实 200ms驱动 显示方式为滚动模式
17 20ms/div: 20,000,000/50=400,000ns ------------------------- 1Mhz 采集 隔400点取一点
18 50ms/div: 50,000,000/50=1000,000ns 1Mhz 采集 隔1000点取一点
*/
int CCtrlBord::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
m_ch1TimeCtl.SetSwitchNumber (19);
m_ch1TimeCtl.SetDisString ("50ns 0.1us 0.2 0.5 1us 2 5 10 20 50us 0.1ms 0.2 0.5 1ms 2 5 10 20 50ms");
m_ch1TimeCtl.SetSwitchName("Time/Div");
m_ch1TimeCtl.SetStartSwitch(13);
//m_RoundCtrl.SetBKColor (RGB(51,102,153));
m_ch1TimeCtl.SetTextColor (RGB(0,0,0));
// m_ch2TimeCtl.SetSwitchNumber (5);
// m_ch2TimeCtl.SetDisString (" 0.1us 0.2us 0.3us 0.4us 0.5us ");
// m_ch2TimeCtl.SetSwitchName("时间常数");
// m_ch2TimeCtl.SetStartSwitch(2);
// m_RoundCtrl.SetBKColor (RGB(51,102,153));
// m_ch2TimeCtl.SetTextColor (RGB(255,0,0));
// m_RoundCtrl.SetLineColor (RGB(255,255,255));
m_ch1dbCtl.SetSwitchNumber (10);
//m_FT_comb.SetWindowText("5M");
// 10V/Div 5X10V=50V -->衰减100倍=500mV 500/500=1 放大系数 1dB
// 5V/Div 5X5V=25V -->衰减100倍=250mV 500/250=2 放大系数 2dB
// 2V/Div 5X2V=10V -->衰减100倍=100mV 500/100=5 放大系数 5dB
// 1V/Div 5X1v=5V -->衰减100倍=50mV 500/50=10 -------->10dB
// 0.5V/Div 5X0.5V=2.5V -->衰减100倍=25mV 500/25=20 -------->20dB
// 0.2V/Div 5X0.2V=1V -->衰减100倍=10mV 500/10=50 ------->50dB
// 0.1V/Div 5X0.1V=500mV 500/500=1 ------->1dB
// 50mV/Div 5X50mV=250mV 500/250=2 ------->2dB
// 20mV/Div 5X20mV=100mV 500/100=5 ------->5dB
// 10mV/Div 5X10mV=50mV 500/50=10 ------->10dB
// 5mV/Div 5X5mV=25mV 500/25=20 ------->20dB
m_ch1dbCtl.SetDisString ("10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV");
m_ch1dbCtl.SetSwitchName("CH1 Volts / Div");
m_ch1dbCtl.SetTextColor (RGB(0,0,0));
m_ch1dbCtl.SetStartSwitch(1);
m_ch2dbCtl.SetSwitchNumber (10);
m_ch2dbCtl.SetDisString ("10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV");
m_ch2dbCtl.SetSwitchName("CH2 Volts / Div");
m_ch2dbCtl.SetTextColor (RGB(0,0,0));
m_ch2dbCtl.SetStartSwitch(1);
// m_select_ch1.SetCheck(1);
// m_ch2dbCtl.SetSwitchNumber (6);
// m_ch2dbCtl.SetDisString (" 1mV 2mV 3mV 4mV 5mV 6mV 7mV ");
// m_ch2dbCtl.SetSwitchName("电压幅度");
// m_ch2dbCtl.SetTextColor (RGB(0,0,255));
return 0;
}
void CCtrlBord::OnCh1()
{
m_ch2_button.SetCheck(0);
m_ch1_ch2_button.SetCheck(0);
}
void CCtrlBord::OnCh2()
{
// m_displayWnd.Caiyang=1;
// m_displayWnd.comEventStart.SetEvent();
m_ch1_button.SetCheck(0);
m_ch1_ch2_button.SetCheck(0);
}
void CCtrlBord::OnCh1andch2()
{
m_ch1_button.SetCheck(0);
m_ch2_button.SetCheck(0);
}
void CCtrlBord::OnRun()
{//unsigned char c;
if(!isRun)
{ isRun=true;
code[0]='C'; //开始采集数据
m_run_button.SetWindowText("停止");
// while(busy_flag);
SendMessageToCom(code,5);
}
else
{
code[0]='E'; //暂停采集
isRun=false;
m_run_button.SetWindowText("运行");
}
// SendMessageToCom(code,5);
}
void CCtrlBord::OnStop()
{
// m_displayWnd.Caiyang=false;
//unsigned char c='O';
// SendMessageToCom(&c,1);
// isRun=false;
}
void CCtrlBord::OnCh1dbctrl()
{ //10V 5V 2 1 0.5 0.2 0.1V 50mV 20 10 5mV
}
/*
0 50ns/div : 50ns/50=1ns 500*1=500ns 50Mhz 1024*20ns=20480ns 40 使用插值算法 屏数据
1 0.1us/div: 100ns/50=2ns 500*2=1,000ns 50Mhz 1024*20ns=20480ns 20 使用插值算法
2 0.2us/div: 200/50=4ns 500*4=2,000ns 50Mhz 20480/2000 =10 使用插值算法
3 0.5us/div: 500/50=10ns 500*10=5,000ns 50Mhz 20480/5000 =4 使用插值算法
4 1us/div: 1,000/50=20ns 500*20=10,000ns 50Mhz 0 20480/10000=2 不使用插值算法
5 2us/div: 2,000/50=40ns 500*40=20,000ns 50Mhz 1 1024*40ns=40960ns 2屏数据
6 5us/div: 5,000/50=100ns 500*100=50,000ns 5 10Mhz 0 1024*100ns=102400 /50000=2屏数据
7 10us/div: 10,000/50=200ns 500*200=100,000ns 5Mhz 0 1024*200/100000=2
8 20us/div: 20,000/50=400ns 500*400=200,000ns 5Mhz 1 采集1024*2数据在显示 显示2屏数据
9 50us/div: 50,000/50=1,000ns 500*1000=500,000ns 1Mhz 0 1024*1000=1024000 2 屏数据
10 0.1ms/div: 100,000/50=2,000ns 500*2000= 1,000,000ns 1Mhz 1 采集1024* 隔2取一点 数据显示2屏数据 2048000ns/1000000 =2ms 500hz
11 0.2ms/div: 200,000/50=4,000ns 500*4000= 2,000,000ns 1Mhz 3 采集1024* 隔4取一点 数据显示2屏数据 4096000ns/1000000 =4ms 200hz
12 0.5ms/div: 500,000/50=10,000ns 500*10,000= 5,000,000 ns 1Mhz 9 采集1024* 隔10取一点 数据显示2屏数据 10240000ns/ 1000000=10ms 100hz
13 1ms/div: 1,000,000/50=20,000ns 500*20,000=10,000,000 ns 1Mhz 19 采集1024* 隔20点取一点 数据显示2屏数据 20480000/1000000=20ms 50hz
14 2ms/div: 2,000,000/50=40,000ns 500*40,000=20,000,000 ns 1Mhz 采集1024* 隔40点取一点 数据显示2屏数据 40960000/1000000=40ms 25hz
15 5ms/div: 5,000,000/50=100,000ns 500*100,000= 50,000,000ns 1Mhz 采集1024* 隔100点取一点 数据显示2屏数据 100ms驱动 显示方式为滚动模式
16 10ms/div: 10,000,000/50=200,000ns 500*200,000=100,000,000NS 1Mhz 采集1024* 隔200点取一点 数据现实 200ms驱动 显示方式为滚动模式
17 20ms/div: 20,000,000/50=400,000ns ------------------------- 1Mhz 采集 隔400点取一点
18 50ms/div: 50,000,000/50=1000,000ns 1Mhz 采集 隔1000点取一点
*/
void CCtrlBord::OnCh1timectrl()
{
select_Tdv=m_ch1TimeCtl.GetSelectSwitch();
code[0]='E';
switch(select_Tdv)
{case 0:
case 1:
case 2:
case 4:
code[1]=0; //选择50M采样率
code[2]=0; //隔0点取样
sampleT =20 ;//ns
break;
case 5:
code[1]=0; //选择50M采样率
code[2]=1; //隔2点取样
sampleT =20 ;//ns
break;
case 6:
code[1]=2;//选择10M采样率
code[2]=0;
sampleT =100 ;//ns
break;
case 7:
code[1]=3; //选择5M采样率
code[2]=0;
sampleT =200 ;//ns
break;
case 8:
code[1]=3;//选择5M采样率
code[2]=1; //隔2点取样
sampleT =200 ;//ns
break;
case 9:
code[1]=4;//选择1M采样率
code[2]=0;
sampleT =1000 ;//ns
break;
case 10:
code[1]=4;
code[2]=1;
sampleT =1000 ;//ns
break;
case 11:
code[1]=4;
code[2]=3;//隔4点取样
sampleT =1000 ;//ns
break;
case 12:
code[1]=4;
code[2]=9;//隔10点取样
sampleT =1000 ;//ns
break;
case 13:
code[1]=4;
code[2]=19;//隔20点取样
sampleT =1000 ;//ns
break;
case 14:
code[1]=4;
code[2]=39;//隔40点取样
sampleT =1000 ;//ns
break;
case 15:
code[1]=4;
code[2]=99;
sampleT =1000 ;//ns
break;
case 16:
code[1]=4;
code[2]=199;
sampleT =1000 ;//ns
break;
case 17:
case 18:
code[1]=4;
code[2]=0;
sampleT =1000 ;//ns
break;
default:
code[1]=4;
code[2]=19;
sampleT =1000 ;//ns
break;
}
m_displayWnd.tdv =select_Tdv;
T_div=time_div[select_Tdv]/50;
if(!isRun)
{ SendMessageToCom(code,5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -