Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Как запустить пример

Вы не вошли.

 Поиск | Регистрация | Вход 

Николай
28.03.2012 21:21:23
#1

Гость

Как запустить пример

Здравствуйте.
Имеется код.
#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

28.03.2012 21:49:47
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Как запустить пример

Usage: client <slot(0)> <biosname(l761) те для одной 440 : client 0 E440

Николай
29.03.2012 06:44:44
#3

Гость

Re: Как запустить пример

В коде куда вставлять это значение?

29.03.2012 07:40:12
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Как запустить пример

это при вызове программы указывать...

Николай
29.03.2012 08:35:42
#5

Гость

Re: Как запустить пример

Так при вызове появляется сообщение: No parameters. Usage: client <slot(0)> <biosname(l761)> Как и где я их укажу? Объясните пожалуйста поподробнее. Какой переменной в коде присвоить какие параметры.

29.03.2012 10:50:10
#6

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Как запустить пример

в командной строке. Или из консоли запустить или создать ярлык и его отредактировать.

Николай
29.03.2012 12:23:22
#7

Гость

Re: Как запустить пример

Дык после задания аргументов в консоле он пишет: Failed load library
Или просто остается черное окно консоли. Но появляется в диспетчере задач процесс, который жрет много ресурсов.

29.03.2012 13:53:51
#8

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Как запустить пример

а где лежат zoomer.dll и lcomp.dll? ну и биос E440.bio где? В простоейшем случае все можно рядом с exe положить...

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4

Многоканальный телефон:+7 (495) 785-95-25

Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск