Здравствуйте.
Имеется код.
#include <windows.h>
#include "../include/ioctl.h"
#include "../include/ifc_ldev.h"
#include "../include/create.h"
#include "../include/e2010cmd.h"
#include "str_zoom.h"
#include "ifc_zoom.h"
#include "createz.h"
#include <math.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int CreateOsc(HWND hwnd);
ULONG slot;
char biosname[255];
HWND hwnd;
int* a =0;
int DSize;
int NCh;
HANDLE hEventData =0;
PLATA_DESCR_U2 ph;
HANDLE hDevice;
ADC_PAR adcPar;
DAC_PAR dacPar;
ULONG *data;
ULONG *sync;
//ULONG *data1; // PCI streaming
USHORT *data1; // for USB stream and PCI internal RAM
ULONG *sync1;
SLOT_PAR sl;
LUnknown *pIUnknown;
IDaqLDevice *pI =0;
IZoomer *pZ =0;
HANDLE hThread =0;
ULONG Tid;
DWORD WINAPI ServiceThread(PVOID Context)
{
int i;
while(1)
{
// test for event capture
pI->InitStartLDevice(); // зачистили переменные внутри драйвера
pI->StartLDevice(); // запустили сбор
WaitForSingleObject(hEventData,INFINITE); // ждем
pI->StopLDevice(); // дождались и остановили сбор
// обрабатываем данные
if(sl.BoardType==L791)
{
for(i=0;i<DSize;i++) a[i]=(short)(data[i]&0xFFFF);
}
else
{
for(i=0;i<DSize;i++) a[i]=((short *)(data))[i];
}
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
};
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
char szAppName[] = "ClientApp";
MSG msg;
WNDCLASSEX wndclass;
// parse cmd /////////////////////////////////////////////////////////////////////////////////////////
char param[255];
int j,i=0;
j=0;
while(szCmdLine[i]!=/' /')
{
if(szCmdLine[i]==0) { MessageBox(0, "No parameters. Usage: client <slot(0)> <biosname(l761)>", "Error", MB_OK); exit(-1);}
param[j++]=szCmdLine[i++];
}
param[j]=0;
slot = atoi(param);
while(szCmdLine[i]==/' /') i++;
j=0; while(szCmdLine[i] && szCmdLine[i]!=/' /') biosname[j++]=szCmdLine[i++]; biosname[j]=0;
///////////////////////////////////////////////////////////////////////////////////////////////////////
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)NULL;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow( szAppName,
biosname,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC dc;
PAINTSTRUCT ps;
RECT rect;
GetClientRect(hwnd, &rect);
switch(iMsg)
{
case WM_CREATE:
{
return CreateOsc(hwnd);
}
case WM_PAINT:
{
dc = BeginPaint(hwnd, &ps);
if(pZ) pZ->OnPaint(dc,rect,1);
EndPaint(hwnd, &ps);
return 0;
}
case WM_LBUTTONDBLCLK:
{
if(pZ) pZ->OnButtonDown(rect,MK_LBUTTON,lParam,-1);
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}
case WM_LBUTTONDOWN:
{
if(pZ) pZ->OnButtonDown(rect,MK_LBUTTON,lParam,0);
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}
case WM_RBUTTONDOWN:
{
if(pZ) pZ->OnButtonDown(rect,MK_RBUTTON,lParam,0);
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}
case WM_MOUSEMOVE:
{
if(pZ) pZ->OnMouseMove(rect,wParam,lParam);
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}
case WM_DESTROY:
{
if(hThread) TerminateThread(hThread,0);
if(pZ) pZ->Release();
if(hEventData) CloseHandle(hEventData);
if(a) delete[] a;
if(pI) pI->CloseLDevice();
if(pI) pI->Release();
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
int CreateOsc(HWND hwnd)
{
NCh=4;
DSize=32*1024;
a=new int[DSize];
memset(a,0,sizeof(int)*DSize);
/// init graph window
if(ZCallCreateInstance("zoomer.dll")!=1) {MessageBox(0,"Error","Failed load library",MB_OK); PostQuitMessage(-1);}
pIUnknown = ZCreateInstance();
if(pIUnknown == NULL) {MessageBox(0,"Error","Failed to get interface",MB_OK);PostQuitMessage(-1);}
HRESULT hr = pIUnknown->QueryInterface(IID_IZOOMER,(void**)&pZ);
if(!SUCCEEDED(hr)) { MessageBox(0,"Error","Failed QueryInterface",MB_OK); PostQuitMessage(-1); }
pIUnknown->Release();
pZ->MakeFont(hwnd,10);
ZoomScale ZS;
ZS.Set(0,8192,-9000,9000,-9000,9000);
pZ->SetDataI(a,DSize,NCh,0,&ZS);
/////////////////////////////////////
// setup adc
if(CallCreateInstance("lcomp.dll")==0) {MessageBox(0,"Error","Failed load library",MB_OK);PostQuitMessage(-1);}
pIUnknown = CreateInstance(slot);
if(pIUnknown == NULL) {MessageBox(0,"Error","Failed to get interface",MB_OK);PostQuitMessage(-1);}
hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
if(!SUCCEEDED(hr)) { MessageBox(0,"Error","Failed QueryInterface",MB_OK); PostQuitMessage(-1); }
pIUnknown->Release();
pI->OpenLDevice(); // открыли устройство
pI->GetSlotParam(&sl); // считали параметры слота - интересует тип платы
pI->LoadBios(biosname); // загрузили биос, если не поддерживается то вернет L_NOTSUPPORTED
pI->PlataTest(); // протестировали, у некотрых плат это просто заглушка
pI->ReadPlataDescr(&ph); // обязательно прочитали флеш, он нужен для расчетов внутри библиотеки
/*
// working witch DAC // цап закомментарен тк он не всегда есть
// change data1 defenition to ULONG for PCI board DAC streaming
// change data1 defenition to USHORT for PCI board DAC streaming from internal RAM.
// Set FIFO and IrqStep to fit in internal RAM (DSP CPU depend). Pages set 2
// change data1 defenition to USHORT for USB board DAC streaming.
dacPar.t1.s_Type = L_DAC_PARAM;
dacPar.t1.AutoInit=1;
dacPar.t1.dRate=50.0; // for e140m dac - very limited set of freq value
dacPar.t1.FIFO=2048; // 512
dacPar.t1.IrqStep=2048; // 512
dacPar.t1.Pages=4;
dacPar.t1.IrqEna=1;
dacPar.t1.DacEna=1;
dacPar.t1.DacNumber=0;
pI->FillDAQparameters(&dacPar.t1);
ULONG db=512000;
pI->RequestBufferStream(&db, L_STREAM_DAC);
pI->SetParametersStream(&dacPar.t1,&db, (void **)&data1, (void **)&sync1,L_STREAM_DAC);
// internal RAM PCI
// for(int i=0;i<1024;i+=2) data1[i]=((USHORT)(1024.0*sin((2.0*(3.1415*i)/1024.0)))&0xFFF)|0x0000;
// for(int i=1;i<1024;i+=2) data1[i]=((USHORT)(1024.0*sin((2.0*(3.1415*i)/1024.0)))&0xFFF)|0x1000;
// DAC streaming for PCI and E440
// for(int i=0;i<2048*4;i++) data1[i]=((USHORT)(512*sin((2.0*(3.1415*i)/1024.0)))&0xFFF)|0x0000; // for all
// DAC streaming for E140M
// for(int i=0;i<2048*4;i++) data1[i]=(USHORT)(16384*sin((2.0*(3.1415*i)/1024.0))); // for e140m stream
*/
// так вызывать IoAsync
// тест цифровых линий
/*
ASYNC_PAR pp;
pp.s_Type = L_ASYNC_TTL_CFG;
pp.Mode = 1;
pI->IoAsync(&pp);
pp.s_Type = L_ASYNC_TTL_OUT;
pp.Data[0] = 0xA525;
pI->IoAsync(&pp);
pp.s_Type = L_ASYNC_TTL_INP;
pp.Data[0] = 1;
pI->IoAsync(&pp);
printf("/n ttl input %X ",pp.Data[0]);
printf("/nPress any key");
_getch();
*/
ULONG tm = 512000; // выделили память в отсxетах АЦП, для 791 512Кбайт выделиться всегда, отсчеты там 32 бит
pI->RequestBufferStream(&tm,L_STREAM_ADC);
// настроили параметрыы сбора
switch(sl.BoardType)
{
case PCIA:
case PCIB:
case PCIC:
case E440:
case E140:
case E154:
{
adcPar.t1.s_Type = L_ADC_PARAM;
adcPar.t1.AutoInit = 0;
adcPar.t1.dRate = 1.0;
adcPar.t1.dKadr = 0.0;
adcPar.t1.dScale = 0;
adcPar.t1.SynchroType = 3;
if(sl.BoardType==E440 || sl.BoardType==E140 || sl.BoardType==E154) adcPar.t1.SynchroType = 0;
adcPar.t1.SynchroSensitivity = 0;
adcPar.t1.SynchroMode = 0;
adcPar.t1.AdChannel = 0;
adcPar.t1.AdPorog = 0;
adcPar.t1.NCh = NCh;
adcPar.t1.Chn[0] = 0x0;
adcPar.t1.Chn[1] = 0x1;
adcPar.t1.Chn[2] = 0x2;
adcPar.t1.Chn[3] = 0x3;
adcPar.t1.FIFO = 1024;
adcPar.t1.IrqStep = 1024;
adcPar.t1.Pages = 128;
if(sl.BoardType==E440 || sl.BoardType==E140 || sl.BoardType==E154)
{
adcPar.t1.FIFO = 4096;
adcPar.t1.IrqStep = 4096;
adcPar.t1.Pages = 32;
}
adcPar.t1.IrqEna = 1;
adcPar.t1.AdcEna = 1;
pI->FillDAQparameters(&adcPar.t1);
pI->SetParametersStream(&adcPar.t1, &tm, (void **)&data, (void **)&sync,L_STREAM_ADC);
} break;
case L791:
{
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 0;
adcPar.t2.dRate = 100.0;
adcPar.t2.dKadr = 0.0;
adcPar.t2.SynchroType = 0;
adcPar.t2.SynchroSrc = 0;
adcPar.t2.NCh = NCh;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;
adcPar.t2.FIFO = 128;
adcPar.t2.IrqStep = 1024;
adcPar.t2.Pages = 128;
adcPar.t2.IrqEna = 0x0003;
adcPar.t2.AdcEna = 1;
pI->FillDAQparameters(&adcPar.t2);
pI->SetParametersStream(&adcPar.t2, &tm, (void **)&data, (void **)&sync,L_STREAM_ADC);
} break;
case E2010B:
case E2010:
{
adcPar.t2.s_Type = L_ADC_PARAM;
adcPar.t2.AutoInit = 0;
adcPar.t2.dRate = 1000.0;
adcPar.t2.dKadr = 0.001;
adcPar.t2.SynchroType = 0x01;
adcPar.t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
adcPar.t2.NCh = NCh;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;
adcPar.t2.FIFO = 4096;
adcPar.t2.IrqStep = 4096;
adcPar.t2.Pages = 32;
adcPar.t2.IrqEna = 1;
adcPar.t2.AdcEna = 1;
pI->FillDAQparameters(&adcPar.t2);
pI->SetParametersStream(&adcPar.t2, &tm, (void **)&data, (void **)&sync,L_STREAM_ADC);
}
}
// Разрешили корректировку вводимых данных, правда не у все плат она реализована
pI->EnableCorrection();
hEventData = CreateEvent(0,FALSE,FALSE,NULL);
pI->SetLDeviceEvent(hEventData); // событие по заполению буфера
// !!!!!!!!!!!!!!!!!!!
hThread=CreateThread(0,0x2000,ServiceThread,0,0,&Tid);//
return 0;
}
Как задать для него параметры, чтобы он работал? Плата E440