moved libs to the lib directory

This commit is contained in:
2025-11-13 18:40:06 +03:00
parent 4d1f7fdbe9
commit b80ad585da
634 changed files with 3 additions and 2 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+149
View File
@@ -0,0 +1,149 @@
[Version]
Signature="$WINDOWS NT$"
Class=LPCIE
ClassGuid={73FE9311-0D50-4FCD-A895-571CA87A26DC}
Provider=%LCardMfg%
CatalogFile=lpcie.cat
;PnpLockDown=1
DriverPackageDisplayName=%PkgName%
DriverPackageType=PlugAndPlay
DriverVer=11/16/2016,1.0.11.0
[SourceDisksFiles]
lpcie.sys=1
[SourceDisksNames]
1=%DISK_NAME%,,,.
[PreCopySection]
HKR,,NoSetupUI,,1
[DestinationDirs]
DefaultDestDir = 12 ;%SystemRoot%\system32\drivers
; ================= Class section =====================
[ClassInstall32]
Addreg=LpcieClassReg
[LpcieClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
HKR,,DeviceCharacteristics,0x10001,0x100 ;Use same security checks on relative opens
;HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" ;Allow generic all access to system and built-in Admin.
;[HKR,,Exclusive,0x10001,1]
;[HKR,,SilentInstall,,1]
; ================= Device Install section =====================
[ControlFlags]
ExcludeFromSelect=*
[Manufacturer]
%LCardMfg%=LCardMfg,NTx86
; For Win2K
[LCardMfg]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
; For XP and later
[LCardMfg.NTx86]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
[lpcie_inst.HW]
AddReg = lpcie_hw_addreg
[lpcie_inst.NT.HW]
AddReg = lpcie_hw_addreg
;Äîáàâëÿåì â ðååñòð ôëàã, ÷òî ìîæíî èñïîëüçîâàòü MSI
[lpcie_hw_addreg]
HKR, Interrupt Management,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties, MSISupported, 0x00010001, 1
[lpcie_inst]
CopyFiles=Lpcie.CopyFiles
[lpcie_inst.NT]
CopyFiles=Lpcie.CopyFiles
[Lpcie.CopyFiles]
lpcie.sys
[lpcie_inst.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_inst.NT.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_service]
DisplayName = %LPCIE.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 1 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\lpcie.sys
;AddReg = Pci9x5x_Parameters_AddReg
;-------------- Coinstaller installation
[DestinationDirs]
CoInstaller_CopyFiles = 11
[lpcie_inst.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[lpcie_inst.NT.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[CoInstaller_CopyFiles]
WdfCoInstaller01009.dll
[SourceDisksFiles]
WdfCoInstaller01009.dll=1 ; make sure the number matches with SourceDisksNames
[CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller01009.dll,WdfCoInstaller"
[lpcie_inst.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_inst.NT.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_wdfsect]
KmdfLibraryVersion = 1.9
[Strings]
LCardMfg = "L Card"
L502.DeviceDescr = "L-502"
ClassName = "'L Card' PCI Express devices"
LPCIE.SVCDESC = "KMDF driver for 'L-Card' PCI Express devices"
PkgName = "driver for PCI Express boards"
DISK_NAME = "'L Card' Software Install Disk"
[Strings.0419]
LCardMfg="Ë Êàðä"
L502.DeviceDescr = "L-502"
LPCIE.SVCDESC="KMDF äðàéâåð äëÿ PCI Express óñòðîéñòâ ôèðìû 'Ë Êàðä'"
PkgName = "Äðàéâåð äëÿ ïëàò PCI Express"
ClassName="PCI Express óñòðîéñòâà îò ôèðìû 'Ë Êàðä'"
DISK_NAME = "Äèñê ñ ïðîãðàììíûì îáåñïå÷åíèåì 'Ë Êàðä'"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+80
View File
@@ -0,0 +1,80 @@
История изменений L-Card L502/E502 SDK:
1.0.4 (24.10.2012):
- обновление описания, билиотеки l502api и драйвера (исправления ошибок, добавлен режим циклического вывода)
- добавлена обертка dotNet с возможностью установки в GAC
- добавлены примеры для delphi, C#, LabView
- добавлен приемер режима циклического генератора для С
- добавлена утилита для обновления прошивки ПЛИС с версией прошивки 0.2
1.0.5 (21.02.2013)
- добавлено низкоуровневое описание для модуля L502
- добавлен исходный код прошивки BlackFin (устанавливается вместе с файлами для разработчика)
- обновлены библиотека и драйвер (исправления и изменения для работы с сигнальным процессором)
- включена версия 0.3 прошивки ПЛИС для модуля L502
1.0.6 (27.02.2013)
- добавлена новая прошивка ПЛИС модуля L502 (версия 0.4)
- добавлен файл firm_versions.txt с описаниями изменений в прошивках ПЛИС
- незначительные коррекции драйвера и библиотеки
1.1.0 (29.05.2015)
- обновление драйвера для L502 (1.0.8) с критическим исправлением зависания на некоторых ПК
- включение поддержки модуля E502, добавлено новое API для возможности работать с обоими модулями
(добавлен драйвер USB, обновлены библиотеки и описание, изменены все примеры для работы как с L502, так и E502)
- включена опция установки службы Bonjour для поиска в сети модулей E502
- утилита lpcie-firm-update переименована в lxfw-update и включена возможность обновлять прошивки ПЛИС модуля E502.
1.1.1 (08.06.2015)
- обновление библиотеки до версии 1.1.1 (исправлены ошибки в функциях обнаружения устройств в сети и утечка памяти)
1.1.2 (08.07.2015)
- обновление библиотеки до версии 1.1.2, драйвера L502 до версии 1.0.9 и документации (для поддержки флага
X502_OUT_CYCLE_FLAGS_WAIT_DONE и функции X502_OutCycleCheckSetupDone())
1.1.3 (21.07.2015)
- обновление библиотеки до версии 1.1.3 (исправлена ошибка при загрузке прошивки BlackFin в L502)
1.1.4 (28.07.2015)
- обновление библиотеки до версии 1.1.4 (добавлены функции X502_SetExtRefFreqValue() и X502_GetRefFreqValue())
1.1.5 (22.12.2015)
- в примере на C# исправлена установка режима синхронизации старта
1.1.6 (23.06.2016)
- в lxfw_update обновлена прошивка ПЛИС модуля E502 до версии 0.2 (рекомендуется обновить в модулях с прошивкой ARM)
- обновление библиотеки до версии 1.1.5 (добавлены функции для изменения портов E502 при работе по TCP/IP)
- добавлен пример LabView с выводом на ЦАП в циклическом режиме, а также более корректное завершение при ошибке в примерах
1.1.7 (05.07.2016)
- в lxfw_update обновлены прошивки ПЛИС: модуля L502 до версии 0.5, а модуля E502 до версии 0.3
- обновление библиотеки до версии 1.1.6 (проверка возможности установки делителя частоты вывода, добавление функций
X502_CheckFeature() и X502_OutGetStatusFlags(), выставление шага прерывнаия на вывода)
- Обновление драйвера L502 до версии 1.0.10 (включена возможность настройки шага прерывания в циклическом выводе для низких частот вывода)
1.1.8 (04.08.2016)
- добавлен пример для Visual Basic 6
1.1.9 (24.08.2016)
- обновлено низкоуровневое описание программиcта (добавлены сведения по E502)
- обновление библиотеки до версии 1.1.7 (исправление привязки первого отсчета АЦП к моменту запуска
исправления некоторых команд в режиме с DSP)
- исправления и небольшие дополнения примера прошивки BlackFin
- в lxfw_update обновлены прошивки ПЛИС: модуля L502 до версии 0.7 и модуля E502 до версии 0.11
1.1.10 (05.09.2016)
- обновлена библиотека до версии 1.1.8 (включена в экспортируемые функции ранее забытая X502_GetEnabledStreams())
1.1.11 (16.11.2016)
- обновление x502api до 1.1.9 (включены функции X502_CalcAdcFreq, X502_CalcDinFreq и X502_CalcOutFreq) и описания программиста
- обновление низкоуровнего описания (включена версия с описанием протокола обмена с модулем E502)
1.1.12 (27.02.2017)
- обновление x502api до 1.1.10 (исправлены коды режимов синхронизации для Pascal и C#, а также работа функции X502_OutGetStatusFlags)
- в lxfw_update обновлена прошивка ПЛИС модулей L502 и E502 до версий 0.8 и 0.13 соответственно, добавлена прошивка для индустриального исполнения модуля E502
1.1.13 (12.10.2017)
- в lxfw_update обновлена прошивка ПЛИС модуля L502 до версии 0.9
- обновление x502api до 1.1.11 (незначительные коррекции библиотеки)
- в низкоуровневом описании исправлены адреса Flash-памяти, по которым хранится информация о модуле
1.1.14 (11.12.2017)
- обновление x502api до 1.1.12 - исправлена проблема работы с одновременной работой с 4 и более модулями E502, подключенными по USB, из одной программы
1.1.15 (13.03.2018)
- обновление x502api до 1.1.13 (исправлена утечка памяти при закрытии соединения по TCP).
1.1.16 (10.08.2018)
- в lxfw_update обновлена прошивка ПЛИС модулей L502 и E502 до версий 0.10 и 0.14 соответственно
1.1.17 (28.08.2018)
- обновление lpcieNet до версии 1.1.7.0 - исправление возможного падения в 64-битных приложениях при получении списка записей о найденных устройствах
1.1.18 (20.11.2019)
- в lxfw_update обновлена прошивка ПЛИС модуля E502 до версии 0.15
1.1.19 (25.12.2019)
- обновление x502api до версии 1.1.14 и ее документации до версии 1.1.9, а также обновление низкоуровневого описания до версии 1.0.5.
1.1.33 (22.01.2025)
- поддержка модулей E16
Binary file not shown.
Binary file not shown.
+149
View File
@@ -0,0 +1,149 @@
[Version]
Signature="$WINDOWS NT$"
Class=LPCIE
ClassGuid={73FE9311-0D50-4FCD-A895-571CA87A26DC}
Provider=%LCardMfg%
CatalogFile=lpcie.cat
;PnpLockDown=1
DriverPackageDisplayName=%PkgName%
DriverPackageType=PlugAndPlay
DriverVer=11/16/2016,1.0.11.0
[SourceDisksFiles]
lpcie.sys=1
[SourceDisksNames]
1=%DISK_NAME%,,,.
[PreCopySection]
HKR,,NoSetupUI,,1
[DestinationDirs]
DefaultDestDir = 12 ;%SystemRoot%\system32\drivers
; ================= Class section =====================
[ClassInstall32]
Addreg=LpcieClassReg
[LpcieClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
HKR,,DeviceCharacteristics,0x10001,0x100 ;Use same security checks on relative opens
;HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" ;Allow generic all access to system and built-in Admin.
;[HKR,,Exclusive,0x10001,1]
;[HKR,,SilentInstall,,1]
; ================= Device Install section =====================
[ControlFlags]
ExcludeFromSelect=*
[Manufacturer]
%LCardMfg%=LCardMfg,NTAMD64
; For Win2K
[LCardMfg]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
; For XP and later
[LCardMfg.NTAMD64]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
[lpcie_inst.HW]
AddReg = lpcie_hw_addreg
[lpcie_inst.NT.HW]
AddReg = lpcie_hw_addreg
;Äîáàâëÿåì â ðååñòð ôëàã, ÷òî ìîæíî èñïîëüçîâàòü MSI
[lpcie_hw_addreg]
HKR, Interrupt Management,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties, MSISupported, 0x00010001, 1
[lpcie_inst]
CopyFiles=Lpcie.CopyFiles
[lpcie_inst.NT]
CopyFiles=Lpcie.CopyFiles
[Lpcie.CopyFiles]
lpcie.sys
[lpcie_inst.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_inst.NT.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_service]
DisplayName = %LPCIE.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 1 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\lpcie.sys
;AddReg = Pci9x5x_Parameters_AddReg
;-------------- Coinstaller installation
[DestinationDirs]
CoInstaller_CopyFiles = 11
[lpcie_inst.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[lpcie_inst.NT.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[CoInstaller_CopyFiles]
WdfCoInstaller01009.dll
[SourceDisksFiles]
WdfCoInstaller01009.dll=1 ; make sure the number matches with SourceDisksNames
[CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller01009.dll,WdfCoInstaller"
[lpcie_inst.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_inst.NT.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_wdfsect]
KmdfLibraryVersion = 1.9
[Strings]
LCardMfg = "L Card"
L502.DeviceDescr = "L-502"
ClassName = "'L Card' PCI Express devices"
LPCIE.SVCDESC = "KMDF driver for 'L-Card' PCI Express devices"
PkgName = "driver for PCI Express boards"
DISK_NAME = "'L Card' Software Install Disk"
[Strings.0419]
LCardMfg="Ë Êàðä"
L502.DeviceDescr = "L-502"
LPCIE.SVCDESC="KMDF äðàéâåð äëÿ PCI Express óñòðîéñòâ ôèðìû 'Ë Êàðä'"
PkgName = "Äðàéâåð äëÿ ïëàò PCI Express"
ClassName="PCI Express óñòðîéñòâà îò ôèðìû 'Ë Êàðä'"
DISK_NAME = "Äèñê ñ ïðîãðàììíûì îáåñïå÷åíèåì 'Ë Êàðä'"
Binary file not shown.
Binary file not shown.
Binary file not shown.
+149
View File
@@ -0,0 +1,149 @@
[Version]
Signature="$WINDOWS NT$"
Class=LPCIE
ClassGuid={73FE9311-0D50-4FCD-A895-571CA87A26DC}
Provider=%LCardMfg%
CatalogFile=lpcie.cat
;PnpLockDown=1
DriverPackageDisplayName=%PkgName%
DriverPackageType=PlugAndPlay
DriverVer=11/16/2016,1.0.11.0
[SourceDisksFiles]
lpcie.sys=1
[SourceDisksNames]
1=%DISK_NAME%,,,.
[PreCopySection]
HKR,,NoSetupUI,,1
[DestinationDirs]
DefaultDestDir = 12 ;%SystemRoot%\system32\drivers
; ================= Class section =====================
[ClassInstall32]
Addreg=LpcieClassReg
[LpcieClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
HKR,,DeviceCharacteristics,0x10001,0x100 ;Use same security checks on relative opens
;HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" ;Allow generic all access to system and built-in Admin.
;[HKR,,Exclusive,0x10001,1]
;[HKR,,SilentInstall,,1]
; ================= Device Install section =====================
[ControlFlags]
ExcludeFromSelect=*
[Manufacturer]
%LCardMfg%=LCardMfg,NTx86
; For Win2K
[LCardMfg]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
; For XP and later
[LCardMfg.NTx86]
; DisplayName Section DeviceId
; ----------- ------- --------
%L502.DeviceDescr% = lpcie_inst, PCI\VEN_1172&DEV_0502&SUBSYS_4C353032
[lpcie_inst.HW]
AddReg = lpcie_hw_addreg
[lpcie_inst.NT.HW]
AddReg = lpcie_hw_addreg
;Äîáàâëÿåì â ðååñòð ôëàã, ÷òî ìîæíî èñïîëüçîâàòü MSI
[lpcie_hw_addreg]
HKR, Interrupt Management,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties,, 0x00000010
HKR, Interrupt Management\MessageSignaledInterruptProperties, MSISupported, 0x00010001, 1
[lpcie_inst]
CopyFiles=Lpcie.CopyFiles
[lpcie_inst.NT]
CopyFiles=Lpcie.CopyFiles
[Lpcie.CopyFiles]
lpcie.sys
[lpcie_inst.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_inst.NT.Services]
AddService=lpcie,0x00000002,lpcie_service
[lpcie_service]
DisplayName = %LPCIE.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 1 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\lpcie.sys
;AddReg = Pci9x5x_Parameters_AddReg
;-------------- Coinstaller installation
[DestinationDirs]
CoInstaller_CopyFiles = 11
[lpcie_inst.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[lpcie_inst.NT.CoInstallers]
AddReg=CoInstaller_AddReg
CopyFiles=CoInstaller_CopyFiles
[CoInstaller_CopyFiles]
WdfCoInstaller01009.dll
[SourceDisksFiles]
WdfCoInstaller01009.dll=1 ; make sure the number matches with SourceDisksNames
[CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller01009.dll,WdfCoInstaller"
[lpcie_inst.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_inst.NT.Wdf]
KmdfService = lpcie, lpcie_wdfsect
[lpcie_wdfsect]
KmdfLibraryVersion = 1.9
[Strings]
LCardMfg = "L Card"
L502.DeviceDescr = "L-502"
ClassName = "'L Card' PCI Express devices"
LPCIE.SVCDESC = "KMDF driver for 'L-Card' PCI Express devices"
PkgName = "driver for PCI Express boards"
DISK_NAME = "'L Card' Software Install Disk"
[Strings.0419]
LCardMfg="Ë Êàðä"
L502.DeviceDescr = "L-502"
LPCIE.SVCDESC="KMDF äðàéâåð äëÿ PCI Express óñòðîéñòâ ôèðìû 'Ë Êàðä'"
PkgName = "Äðàéâåð äëÿ ïëàò PCI Express"
ClassName="PCI Express óñòðîéñòâà îò ôèðìû 'Ë Êàðä'"
DISK_NAME = "Äèñê ñ ïðîãðàììíûì îáåñïå÷åíèåì 'Ë Êàðä'"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,18 @@
Данный пример демонстрирует работу с модулеми L502 и E502 из среды "Borland C++ Builder".
Пример содержит файл проекта для среды "Borland C++ Builder 6" (x502_example.dpr) и для
среды "Embarcadero C++ Builder XE" (x502_example.cbproj)
Для того чтобы собрать проект, необходимо изменить путь к заголовочным файлам,
на путь где находится на Вашем компьютере файлы x502api.h, e502api.h, l502api.h и lcard_pstdint.h и заменить добавленые
в проект файлы x502api.lib, e5l502api.lib и l502api.lib на те, которые находится на Вашем компьютере (ставятся в SDK_DIR/lib/borland).
Проект демонстрирует в первую очередь как можно работать с модулями L502 и E502, а не как нужно программировать
в среде C++ Builder.
Пример демонстрирует синхронный потоковый ввод с АЦП для трех логических каналов
с возможностью запуска синхронного ввода с цифроых линий, а так же
асинхронный ввод/вывод для цифровых линий, ЦАП и асинхронный ввод одного кадра АЦП.
Синхронный ввод осуществляется в отдельном потоке (X502_ProcessThread), который создается
и запускается по нажатию кнопки. В потоке осуществляется прием, обработка данных и вывод их
на индикаторы (указатели на элементы индикаторов сохраняются в объекте потока перед его запуском).
@@ -0,0 +1,526 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "unit.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
/* ìåòîä îïðåäåëÿåò êàêèå óïðàâëÿþùèå ýëåìåíòû ðàçðåøåíû, à êàêèå çàïðåùåíû */
void TForm1::updateControls() {
/* êíîïêà îáíîâèòü ñïèñîê äîñòóïíà ïîêà íå îòêðûëè óñòðîéñòâî */
btnRefreshDeviceList->Enabled = (hnd==NULL);
cbbDevList->Enabled = (hnd==NULL);
btnOpen->Caption = hnd == NULL ? "Óñòàíîâèòü ñâÿçü ñ ìîäóëåì" :
"Ðàçîðâàòü ñâÿçü ñ ìîäóëåì";
btnOpen->Enabled = (hnd!=NULL) || (cbbDevList->ItemIndex >= 0);
btnOpenByIP->Enabled = (hnd==NULL);
edtIpAddr->Enabled = (hnd==NULL);
chkSyncDin->Enabled = (hnd!=NULL) && !threadRunning;
btnStart->Enabled = (hnd!=NULL) && !threadRunning;
btnStop->Enabled = (hnd!=NULL) && threadRunning;
btnSetAdcFreq->Enabled = (hnd!=NULL) && !threadRunning;
btnAsyncDigOut->Enabled = (hnd!=NULL);
btnAsyncDigIn->Enabled = (hnd!=NULL);
btnAsyncDac1->Enabled = (hnd!=NULL) && chkDacPresent->Checked;
btnAsyncDac2->Enabled = (hnd!=NULL) && chkDacPresent->Checked;
btnAsyncAdcFrame->Enabled = (hnd!=NULL) && !threadRunning;
}
void TForm1::freeDevList() {
if (devrecList.Length != 0) {
X502_FreeDevRecordList(&devrecList[0], devrecList.Length);
devrecList.Length = 0;
}
cbbDevList->Items->Clear();
}
/* îáíîâëåíèå ñïèñêà ïîäêëþ÷åííûõ ïëàò L502 è E502*/
void TForm1::refreshDeviceList(void) {
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
int32_t fnd_devcnt = 0;
int old_index = cbbDevList->ItemIndex;
/* î÷èùàåì ðåñóðñû çàïèñåé, åñëè áûëè âûäåëåíû */
freeDevList();
/* ïîëó÷àåì êîëè÷åñòâî ïîäêëþ÷åííûõ óñòðîéñòâ ïî èíòåðôåéñàì PCI è USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt+usb_devcnt) != 0) {
/* âûäåëÿåì ïàìÿòü äëÿ ìàññèâà äëÿ ñîõðàíåíèÿ íàéäåííîãî
êîëè÷åñòâà çàïèñåé */
devrecList.Length = pci_devcnt + usb_devcnt;
/* ïîëó÷àåì çàïèñè î ìîäóëÿõ L502, íî íå áîëüøå pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&devrecList[fnd_devcnt],
pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* äîáàâëÿåì çàïèñè î ìîäóëÿõ E502, ïîäêëþ÷åííûõ ïî USB, â êîíåö ìàññèâà */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&devrecList[fnd_devcnt],
usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
devrecList.Length = fnd_devcnt;
if (fnd_devcnt > 0) {
/* äîáàâëÿåì âñå íàéäåííûå çàïèñè â ñïèñîê ComboBox'à äëÿ âûáîðà */
for (int32_t i=0; i < fnd_devcnt; i++) {
cbbDevList->Items->Add(AnsiString(devrecList[i].devname) + ", " + AnsiString(devrecList[i].serial));
}
/* åñëè äî îáíîâëåíèÿ ñïèñêà áûë âûáðàí äåéñòâèòåëüíûé èíäåêñ - âîññòàíàâëèâàåì åãî */
cbbDevList->ItemIndex = (old_index >= 0) && (old_index < fnd_devcnt) ? old_index : 0;
}
}
updateControls();
}
/* Óñòàíîâêà ïåðàìåòðîâ ñáîðà ìîäóëÿ â ñîîòâåòñòâèè ñ ýëåìåíòàìè GUI */
int32_t TForm1::setupParams() {
int32_t err = 0;
uint32_t lch_cnt = cbbLChCnt->ItemIndex+1;
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ ðåæèìà èçìåðåíèÿ */
static uint32_t f_mode_tbl[] = {X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO};
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ äèàïàçîíîâ ÀÖÏ */
static uint32_t f_range_tbl[] = {X502_ADC_RANGE_10, X502_ADC_RANGE_5, X502_ADC_RANGE_2,
X502_ADC_RANGE_1, X502_ADC_RANGE_05, X502_ADC_RANGE_02};
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ èñòî÷íèêà ñèíõðîíèçàöèè */
static uint32_t f_sync_tbl[] = {X502_SYNC_INTERNAL, X502_SYNC_EXTERNAL_MASTER,
X502_SYNC_DI_SYN1_RISE, X502_SYNC_DI_SYN2_RISE,
X502_SYNC_DI_SYN1_FALL, X502_SYNC_DI_SYN2_FALL};
/* Óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ */
err = X502_SetLChannelCount(hnd, lch_cnt);
if (err == X502_ERR_OK) {
err = X502_SetLChannel(hnd, 0, cbbLCh1_Channel->ItemIndex,
f_mode_tbl[cbbLCh1_Mode->ItemIndex], f_range_tbl[cbbLCh1_Range->ItemIndex],0);
}
if ((err == X502_ERR_OK) && (lch_cnt>=2)) {
err = X502_SetLChannel(hnd, 1, cbbLCh2_Channel->ItemIndex,
f_mode_tbl[cbbLCh2_Mode->ItemIndex], f_range_tbl[cbbLCh2_Range->ItemIndex],0);
}
if ((err == X502_ERR_OK) && (lch_cnt>=3)) {
err = X502_SetLChannel(hnd, 2, cbbLCh3_Channel->ItemIndex,
f_mode_tbl[cbbLCh3_Mode->ItemIndex], f_range_tbl[cbbLCh3_Range->ItemIndex],0);
}
/* Íàñòðàèâàåì èñòî÷íèê ÷àñòîòû ñèíõðîíèçàöèè è çàïóñêà ñáîðà */
if (err == X502_ERR_OK)
err = X502_SetSyncMode(hnd, f_sync_tbl[cbbSyncMode->ItemIndex]);
if (err == X502_ERR_OK)
err = X502_SetSyncStartMode(hnd, f_sync_tbl[cbbSyncStartMode->ItemIndex]);
/* íàñòðàèâàåì ÷àñòîòó ñáîðà ñ ÀÖÏ */
if (err == X502_ERR_OK)
err = setAdcFreq();
/* Çàïèñûâàåì íàñòðîéêè â ìîäóëü */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
return err;
}
int32_t TForm1::setAdcFreq() {
double f_acq = StrToFloat(edtAdcFreq->Text);
double f_lch = StrToFloat(edtAdcFreqLch->Text);
double f_din = StrToFloat(edtDinFreq->Text);
/* óñòàíàâëèâàåì òðåáóåìóþ ÷àñòîòó ñáîðà. */
int32_t err = X502_SetAdcFreq(hnd, &f_acq, &f_lch);
if (err == X502_ERR_OK) {
/* îáíîâëÿåì çíà÷åíèå èíäèêàòîðà, äëÿ îòîáðàæåíèÿ
ðåàëüíî óñòàíîâèâøåéñÿ ÷àñòîòû */
edtAdcFreq->Text = FloatToStr(f_acq);
edtAdcFreqLch->Text = FloatToStr(f_lch);
/* Óñòàíàâëèâàåì ÷àñòîòó ñèíõðîííîãî ñáîðà */
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK)
edtDinFreq->Text = FloatToStr(f_din);
}
return err;
}
int32_t TForm1::setSyncDinStream() {
int32_t err;
/* ðàçðåøàåì èëè çàïðåùàåì ïîòîê ñèíõðîííîãî ââîäà
â çàâèñèìîñòè îò ñîñòîÿíèÿ ïåðåêëþ÷àòåëÿ */
if (chkSyncDin->Checked) {
err = X502_StreamsEnable(hnd, X502_STREAM_DIN);
} else {
err = X502_StreamsDisable(hnd, X502_STREAM_DIN);
}
return err;
}
void __fastcall TForm1::OnThreadTerminate(TObject *obj) {
if (thread->err != X502_ERR_OK) {
MessageDlg("Ñáîð äàííûõ çàâåðøåí ñ îøèáêîé: " + String(X502_GetErrorString(thread->err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
threadRunning = false;
updateControls();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner), hnd(NULL) {
refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnRefreshDeviceListClick(TObject *Sender) {
refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender) {
/* íàñòðàèâàåì âñå ïàðàìåòðû â ñîîòâåòñòâèè ñ ýëåìåíòàìè óïðàâëåíèÿ */
int32_t err = setupParams();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà íàñòðîéêè ïàðàìåòðîâ ïëàòû: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
/* ðàçðåøàåì ñèíõðîííûé ââîä ÀÖÏ */
if (err == X502_ERR_OK)
err = X502_StreamsEnable(hnd, X502_STREAM_ADC);
/* ðàçðåøàåì ñèíõðîííûé ââîä ñ öèôðîâûõ ëèíèé â çàâèñèìîñòè îò ïåðåêëþ÷àòåëÿ */
if (err == X502_ERR_OK)
err = setSyncDinStream();
if (err == X502_ERR_OK) {
/* åñëè îñòàëñÿ íå óäàëåííûé îáúåêò ïîòîêà - óäàëÿåì */
if (thread) {
delete thread;
thread = NULL;
}
//ñîçäàíèå êëàññà ïîòîêà
thread = new X502_ProcessThread(true);
thread->hnd = hnd;
//ïåðåäà÷à ïîòîêó ýëåìåíòîâ óïðàâëåíèÿ äëÿ îòîáðàæåíèÿ ðåçóëüòàòîâ ñáîðà
thread->lchResEdits[0] = edtLCh1_Result;
thread->lchResEdits[1] = edtLCh2_Result;
thread->lchResEdits[2] = edtLCh3_Result;
thread->dinResEdit = edtDin_Result;
edtLCh1_Result->Text="";
edtLCh2_Result->Text="";
edtLCh3_Result->Text="";
edtDin_Result->Text="";
/* óñòàíàâëèâàåì ôóíêöèþ íà ñîáûòèå çàâåðøåíèÿ ïîòîêà (â ÷àñòíîñòè
÷òîáû îòñëåäèòü, åñëè ïîòîê çàâåðøèëñÿ ñàì èç-çà îøèáêè ïðè ñáîðå
äàííûõ) */
thread->OnTerminate = OnThreadTerminate;
thread->Resume(); //çàïóñê ïîòîêà
threadRunning = true;
updateControls();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender) {
/* óñòàíàâëèâàåì çàïðîñ íà çàâåðøåíèå ïîòîêà */
if (threadRunning)
thread->stop = true;
btnStop->Enabled = false;
}
void TForm1::showDevInfo(void) {
t_x502_info info;
int32_t err = X502_GetDevInfo(hnd, &info);
if (err == X502_ERR_OK) {
chkDacPresent->Checked = info.devflags & X502_DEVFLAGS_DAC_PRESENT;
chkGalPresent->Checked = info.devflags & X502_DEVFLAGS_GAL_PRESENT;
chkDspPresent->Checked = info.devflags & X502_DEVFLAGS_BF_PRESENT;
chkEthPresent->Checked = info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH;
edtPldaVer->Text = IntToStr(info.plda_ver);
edtFpgaVer->Text = IntToStr((info.fpga_ver>>8)&0xFF) + "."
+ IntToStr(info.fpga_ver & 0xFF);
if (info.mcu_firmware_ver != 0) {
edtMcuVer->Text = IntToStr((int)(info.mcu_firmware_ver>>24)&0xFF) + "." +
IntToStr((int)(info.mcu_firmware_ver>>16)&0xFF) + "." +
IntToStr((int)(info.mcu_firmware_ver>>8)&0xFF) + "." +
IntToStr((int)info.mcu_firmware_ver & 0xFF);
} else {
edtMcuVer->Text = "";
}
} else {
MessageDlg("Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î ìîäóëå: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Close(hnd);
X502_Free(hnd);
hnd = NULL;
}
}
/* ôóíêöèÿ îòêðûòèÿ óñòðîéñòâà ñ âûáðàííûì ñåðèéíûì íîìåðîì èëè çàêðûòèÿ åãî,
åñëè îíî óæå áûëî îòêðûòî */
void __fastcall TForm1::btnOpenClick(TObject *Sender) {
/* åñëè óñòðîéñòâî áûëî çàêðûòî - ñîçäàåì íîâûé îïèñàòåëü è îòêðûâàåì åãî */
if (hnd==NULL) {
int idx = cbbDevList->ItemIndex;
if ((idx >= 0) && (idx < devrecList.Length)) {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* îòêðûâàåì ìîäóëü, ñîîòâåòñòâóþùèé çàïèñè ñ âûáðàííûì èíäåêñîì */
int32_t err = X502_OpenByDevRecord(hnd, &devrecList[idx]);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
} else {
/* åñëè óñòðîéñòâî áûëî îòêðûòî - çàêðûâàåì */
closeDevice();
}
updateControls();
}
uint32_t TForm1::parseIpAddr(AnsiString addr) {
int a[4],i;
if (sscanf(addr.c_str(), "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])!=4) {
throw new Exception("Íåâåðíûé ôîðìàò IP-àäðåñà!!");
}
for (i=0; i < 4; i++) {
if ((a[i]<0) || (a[i] > 255)) {
throw new Exception("Íåäåéñòâèòåëüíûé IP-àäðåñ!!");
}
}
return (a[0] << 24) | (a[1]<<16) | (a[2]<<8) | a[3];
}
void __fastcall TForm1::btnOpenByIPClick(TObject *Sender) {
t_x502_devrec devrec;
int32_t err = E502_MakeDevRecordByIpAddr(&devrec, parseIpAddr(edtIpAddr->Text), 0, 5000);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ñîçäàíèÿ çàïèñè: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* óñòàíàâëèâàåì ñâÿçü ïî ñîçäàííîé çàïèñè */
int32_t err = X502_OpenByDevRecord(hnd, &devrec);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
updateControls();
}
//---------------------------------------------------------------------------
void TForm1::closeDevice() {
if (hnd != NULL) {
/* åñëè çàïóùåí ïîòîê ñáîðà äàííûõ - òî îñòàíàâëèâàåì åãî */
if (threadRunning) {
thread->stop=1;
thread->WaitFor();
}
/* çàêðûòèå ñâÿçè ñ ìîäóëåì */
X502_Close(hnd);
/* îñâîáîæäåíèå îïèñàòåëÿ */
X502_Free(hnd);
hnd = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) {
closeDevice();
freeDevList();
if (thread)
delete thread;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDigOutClick(TObject *Sender) {
if (hnd!=NULL) {
uint32_t val = StrToInt(edtAsyncDigOut->Text);
int32_t err = X502_AsyncOutDig(hnd, val, 0);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà àñèíõðîííîãî âûâîäà íà öèôðîâûå ëèíèè: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::adcFreqEditChange(TObject *Sender) {
if (hnd != NULL) {
/* óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ, ÷òîáû ïðàâèëüíî
ðàñ÷èòàòü ÷àñòîòó íà êàíàë */
int32_t err = X502_SetLChannelCount(hnd, cbbLChCnt->ItemIndex+1);
if (err == X502_ERR_OK)
err = setAdcFreq();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà óñòàíîâêè ÷àñòîòû ñáîðà: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::chkSyncDinClick(TObject *Sender) {
if (hnd != NULL) {
int32_t err = setSyncDinStream();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ðàçðåøåíèÿ/çàïðåòà ñèíõðîííîãî ââîäà: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDigInClick(TObject *Sender) {
if (hnd != NULL) {
uint32_t din;
int32_t err = X502_AsyncInDig(hnd, &din);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà àñèíõðîííîãî ââîäà ñ öèôðîâûõ ëèíèé: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
edtAsyncDigIn->Text = IntToHex((int)din&0x3FFFF, 5);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDac1Click(TObject *Sender) {
if (hnd != NULL) {
double val = StrToFloat(edtAsyncDac1->Text);;
int32_t err;
err = X502_AsyncOutDac(hnd, X502_DAC_CH1, val, X502_DAC_FLAGS_CALIBR |
X502_DAC_FLAGS_VOLT);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà âûâîäà íà ÖÀÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDac2Click(TObject *Sender) {
if (hnd != NULL) {
double val = StrToFloat(edtAsyncDac2->Text);;
int32_t err;
err = X502_AsyncOutDac(hnd, X502_DAC_CH2, val, X502_DAC_FLAGS_CALIBR |
X502_DAC_FLAGS_VOLT);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà âûâîäà íà ÖÀÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncAdcFrameClick(TObject *Sender) {
if (hnd != NULL) {
uint32_t lch_cnt;
/* íàñòðàèâàåì ëîãè÷åñêóþ òàáëèöó ÀÖÏ */
int32_t err = setupParams();
if (err == X502_ERR_OK)
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà íàñòðîéêè ïàðàìåòðîâ ÀÖÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
if (err == X502_ERR_OK) {
/* â ïðèìåðå èñïîëüçóåì 3 êàíàëà - ñîçäàåì ìàññèâ äëÿ ïðèåìà
îòñ÷åòà íà êàæäûé êàíàë */
double adc_data[3];
err = X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ïðèåìà êàäðà ÀÖÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
edtLCh1_Result->Text = FloatToStrF(adc_data[0], ffFixed, 4, 8);
if (lch_cnt>=2) {
edtLCh2_Result->Text = FloatToStrF(adc_data[1], ffFixed, 4, 8);
} else {
edtLCh2_Result->Text ="";
}
if (lch_cnt>=3) {
edtLCh3_Result->Text = FloatToStrF(adc_data[2], ffFixed, 4, 8);
} else {
edtLCh3_Result->Text = "";
}
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbbDevListChange(TObject *Sender) {
//refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbbLChCntChange(TObject *Sender) {
if (cbbLChCnt->ItemIndex < 0)
cbbLChCnt->ItemIndex = 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
@@ -0,0 +1,669 @@
object Form1: TForm1
Left = 599
Top = 94
Caption = 'L502/E502 test'
ClientHeight = 702
ClientWidth = 577
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
PixelsPerInch = 96
TextHeight = 13
object btnRefreshDeviceList: TButton
Left = 16
Top = 8
Width = 217
Height = 25
Caption = #1054#1073#1085#1086#1074#1080#1090#1100' '#1089#1087#1080#1089#1082#1086' '#1091#1089#1090#1088#1086#1081#1089#1090#1074
TabOrder = 0
OnClick = btnRefreshDeviceListClick
end
object cbbDevList: TComboBox
Left = 264
Top = 8
Width = 225
Height = 21
TabOrder = 1
OnChange = cbbDevListChange
end
object btnStart: TButton
Left = 16
Top = 88
Width = 217
Height = 25
Caption = #1047#1072#1087#1091#1089#1082' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 2
OnClick = btnStartClick
end
object GroupBox1: TGroupBox
Left = 16
Top = 376
Width = 513
Height = 153
Caption = #1050#1072#1085#1072#1083#1099
TabOrder = 3
object Label2: TLabel
Left = 8
Top = 40
Width = 31
Height = 13
Caption = #1050#1072#1085#1072#1083
end
object Label1: TLabel
Left = 64
Top = 40
Width = 51
Height = 13
Caption = #1044#1080#1072#1087#1072#1079#1086#1085
end
object Label3: TLabel
Left = 152
Top = 40
Width = 94
Height = 13
Caption = #1056#1077#1078#1080#1084' '#1080#1079#1084#1077#1088#1077#1085#1080#1103
end
object Label4: TLabel
Left = 336
Top = 40
Width = 52
Height = 13
Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090
end
object Label9: TLabel
Left = 16
Top = 16
Width = 164
Height = 13
Caption = #1050#1086#1083#1080#1095#1077#1089#1090#1074#1086' '#1083#1086#1075#1080#1095#1077#1089#1082#1080#1093' '#1082#1072#1085#1072#1083#1086#1074
end
object cbbLCh1_Channel: TComboBox
Left = 8
Top = 56
Width = 41
Height = 21
ItemIndex = 0
TabOrder = 0
Text = '1'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh1_Range: TComboBox
Left = 64
Top = 56
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 1
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh1_Mode: TComboBox
Left = 136
Top = 56
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 2
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh1_Result: TEdit
Left = 328
Top = 56
Width = 121
Height = 21
TabOrder = 3
end
object cbbLCh2_Channel: TComboBox
Left = 8
Top = 80
Width = 41
Height = 21
ItemIndex = 1
TabOrder = 4
Text = '2'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh2_Range: TComboBox
Left = 64
Top = 80
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 5
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh2_Mode: TComboBox
Left = 136
Top = 80
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 6
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh2_Result: TEdit
Left = 328
Top = 80
Width = 121
Height = 21
TabOrder = 7
end
object cbbLCh3_Channel: TComboBox
Left = 8
Top = 104
Width = 41
Height = 21
ItemIndex = 2
TabOrder = 8
Text = '3'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh3_Range: TComboBox
Left = 64
Top = 104
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 9
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh3_Mode: TComboBox
Left = 136
Top = 104
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 10
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh3_Result: TEdit
Left = 328
Top = 104
Width = 121
Height = 21
TabOrder = 11
end
object chkSyncDin: TCheckBox
Left = 120
Top = 128
Width = 185
Height = 17
Caption = #1056#1072#1079#1088#1072#1096#1077#1085#1080#1077' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072
TabOrder = 12
OnClick = chkSyncDinClick
end
object edtDin_Result: TEdit
Left = 328
Top = 128
Width = 121
Height = 21
TabOrder = 13
end
object cbbLChCnt: TComboBox
Left = 192
Top = 16
Width = 73
Height = 21
ItemIndex = 2
TabOrder = 14
Text = '3'
OnChange = cbbLChCntChange
Items.Strings = (
'1'
'2'
'3')
end
end
object btnStop: TButton
Left = 16
Top = 120
Width = 217
Height = 25
Caption = #1054#1089#1090#1072#1085#1086#1074' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
Enabled = False
TabOrder = 4
OnClick = btnStopClick
end
object btnOpen: TButton
Left = 16
Top = 56
Width = 217
Height = 25
Caption = #1054#1090#1082#1088#1099#1090#1100' '#1091#1089#1090#1088#1086#1081#1089#1090#1074#1086
TabOrder = 5
OnClick = btnOpenClick
end
object btnAsyncDigOut: TButton
Left = 16
Top = 600
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1094#1080#1092#1088#1086#1074#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 6
OnClick = btnAsyncDigOutClick
end
object edtAsyncDigOut: TEdit
Left = 248
Top = 600
Width = 121
Height = 21
TabOrder = 7
Text = '0x0000'
end
object edtAsyncDigIn: TEdit
Left = 248
Top = 568
Width = 121
Height = 21
Enabled = False
TabOrder = 8
Text = '0x0000'
end
object btnAsyncDigIn: TButton
Left = 16
Top = 568
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1094#1080#1092#1088#1086#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 9
OnClick = btnAsyncDigInClick
end
object GroupBox2: TGroupBox
Left = 264
Top = 40
Width = 257
Height = 169
Caption = #1048#1085#1092#1086#1088#1084#1072#1094#1080#1103' '#1086' '#1084#1086#1076#1091#1083#1077
TabOrder = 10
object Label6: TLabel
Left = 112
Top = 93
Width = 124
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' '#1055#1051#1048#1057
end
object labelPldaVer: TLabel
Left = 112
Top = 117
Width = 121
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' PLDA'
end
object lbl11: TLabel
Left = 112
Top = 144
Width = 117
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' ARM'
end
object chkDacPresent: TCheckBox
Left = 16
Top = 24
Width = 97
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1062#1040#1055
Enabled = False
TabOrder = 0
end
object edtFpgaVer: TEdit
Left = 16
Top = 93
Width = 89
Height = 21
ReadOnly = True
TabOrder = 1
end
object edtPldaVer: TEdit
Left = 16
Top = 117
Width = 89
Height = 21
ReadOnly = True
TabOrder = 2
end
object edtMcuVer: TEdit
Left = 16
Top = 144
Width = 89
Height = 21
ReadOnly = True
TabOrder = 3
end
object chkEthPresent: TCheckBox
Left = 16
Top = 72
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1077#1090#1077#1074#1086#1075#1086' '#1080#1085#1090#1077#1088#1092#1077#1081#1089#1072
Enabled = False
TabOrder = 4
end
end
object chkGalPresent: TCheckBox
Left = 280
Top = 80
Width = 169
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1075#1072#1083#1100#1074#1072#1085#1086#1088#1072#1079#1074#1103#1079#1082#1080
Enabled = False
TabOrder = 11
end
object chkDspPresent: TCheckBox
Left = 280
Top = 96
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1080#1075#1085#1072#1083#1100#1085#1086#1075#1086' '#1087#1088#1086#1094#1077#1089#1089#1086#1088#1072
Enabled = False
TabOrder = 12
end
object edtAsyncDac1: TEdit
Left = 248
Top = 640
Width = 81
Height = 21
TabOrder = 13
Text = '5'
end
object btnAsyncDac1: TButton
Left = 16
Top = 640
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'1 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 14
OnClick = btnAsyncDac1Click
end
object btnAsyncDac2: TButton
Left = 16
Top = 672
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'2 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 15
OnClick = btnAsyncDac2Click
end
object edtAsyncDac2: TEdit
Left = 248
Top = 672
Width = 81
Height = 21
TabOrder = 16
Text = '5'
end
object btnAsyncAdcFrame: TButton
Left = 16
Top = 536
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1082#1072#1076#1088#1072' '#1040#1062#1055
TabOrder = 17
OnClick = btnAsyncAdcFrameClick
end
object GroupBox3: TGroupBox
Left = 16
Top = 240
Width = 513
Height = 65
Caption = #1063#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 18
object Label5: TLabel
Left = 16
Top = 20
Width = 136
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093' ('#1043#1094')'
end
object Label7: TLabel
Left = 168
Top = 20
Width = 111
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1085#1072' '#1082#1072#1085#1072#1083' ('#1043#1094')'
end
object Label8: TLabel
Left = 296
Top = 20
Width = 163
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072' ('#1043#1094')'
end
object btnSetAdcFreq: TButton
Left = 432
Top = 32
Width = 73
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100
TabOrder = 0
OnClick = adcFreqEditChange
end
object edtAdcFreq: TEdit
Left = 16
Top = 36
Width = 105
Height = 21
TabOrder = 1
Text = '2000000'
end
object edtAdcFreqLch: TEdit
Left = 176
Top = 36
Width = 105
Height = 21
TabOrder = 2
Text = '2000000'
end
object edtDinFreq: TEdit
Left = 296
Top = 36
Width = 105
Height = 21
TabOrder = 3
Text = '2000000'
end
end
object GroupBox4: TGroupBox
Left = 16
Top = 311
Width = 513
Height = 65
Caption = #1057#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1103
TabOrder = 19
object Label10: TLabel
Left = 16
Top = 20
Width = 172
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1095#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1080
end
object Label11: TLabel
Left = 264
Top = 20
Width = 238
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1079#1072#1087#1091#1089#1082#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072'/'#1074#1099#1074#1086#1076#1072
end
object cbbSyncMode: TComboBox
Left = 16
Top = 38
Width = 169
Height = 21
ItemIndex = 0
TabOrder = 0
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
object cbbSyncStartMode: TComboBox
Left = 264
Top = 38
Width = 169
Height = 21
ItemIndex = 0
TabOrder = 1
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
end
object btnOpenByIP: TButton
Left = 16
Top = 168
Width = 217
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100' '#1089#1086#1077#1076#1080#1085#1077#1085#1080#1077' '#1087#1086' IP-'#1072#1076#1088#1077#1089#1091
TabOrder = 20
OnClick = btnOpenByIPClick
end
object edtIpAddr: TEdit
Left = 16
Top = 200
Width = 217
Height = 21
TabOrder = 21
Text = '192.168.0.1'
end
end
@@ -0,0 +1,122 @@
//---------------------------------------------------------------------------
#ifndef unitH
#define unitH
#include "l502api.h"
#include "e502api.h"
#include "x502_thread.h"
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *btnRefreshDeviceList;
TComboBox *cbbDevList;
TButton *btnStart;
TGroupBox *GroupBox1;
TLabel *Label2;
TLabel *Label1;
TComboBox *cbbLCh1_Channel;
TComboBox *cbbLCh1_Range;
TComboBox *cbbLCh1_Mode;
TEdit *edtLCh1_Result;
TComboBox *cbbLCh2_Channel;
TComboBox *cbbLCh2_Range;
TComboBox *cbbLCh2_Mode;
TEdit *edtLCh2_Result;
TComboBox *cbbLCh3_Channel;
TComboBox *cbbLCh3_Range;
TComboBox *cbbLCh3_Mode;
TComboBox *cbbSyncMode;
TComboBox *cbbSyncStartMode;
TEdit *edtLCh3_Result;
TButton *btnStop;
TLabel *Label3;
TLabel *Label4;
TCheckBox *chkSyncDin;
TEdit *edtDin_Result;
TButton *btnOpen;
TButton *btnAsyncDigOut;
TEdit *edtAsyncDigOut;
TEdit *edtAsyncDigIn;
TButton *btnAsyncDigIn;
TGroupBox *GroupBox2;
TCheckBox *chkDacPresent;
TCheckBox *chkGalPresent;
TCheckBox *chkDspPresent;
TEdit *edtFpgaVer;
TLabel *Label6;
TEdit *edtPldaVer;
TLabel *labelPldaVer;
TEdit *edtAsyncDac1;
TButton *btnAsyncDac1;
TButton *btnAsyncDac2;
TEdit *edtAsyncDac2;
TButton *btnAsyncAdcFrame;
TGroupBox *GroupBox3;
TButton *btnSetAdcFreq;
TLabel *Label5;
TEdit *edtAdcFreq;
TEdit *edtAdcFreqLch;
TEdit *edtDinFreq;
TLabel *Label7;
TLabel *Label8;
TComboBox *cbbLChCnt;
TLabel *Label9;
TLabel *lbl11;
TEdit *edtMcuVer;
TCheckBox *chkEthPresent;
TButton *btnOpenByIP;
TEdit *edtIpAddr;
void __fastcall btnRefreshDeviceListClick(TObject *Sender);
void __fastcall btnStartClick(TObject *Sender);
void __fastcall btnStopClick(TObject *Sender);
void __fastcall btnOpenClick(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall btnAsyncDigOutClick(TObject *Sender);
void __fastcall adcFreqEditChange(TObject *Sender);
void __fastcall chkSyncDinClick(TObject *Sender);
void __fastcall btnAsyncDigInClick(TObject *Sender);
void __fastcall btnAsyncDac1Click(TObject *Sender);
void __fastcall btnAsyncDac2Click(TObject *Sender);
void __fastcall btnAsyncAdcFrameClick(TObject *Sender);
void __fastcall cbbDevListChange(TObject *Sender);
void __fastcall cbbLChCntChange(TObject *Sender);
void __fastcall btnOpenByIPClick(TObject *Sender);
private: // User declarations
t_x502_hnd hnd; //îïèñàòåëü ìîäóëÿ
bool threadRunning; //ïðèçíàê, çàïóùåí ëè ïîòîê ñáîðà äàííûõ
X502_ProcessThread *thread; //ïîòîê äëÿ ñèíõðîííîãî ââîäà
DynamicArray<t_x502_devrec> devrecList;
void freeDevList();
void refreshDeviceList();
void closeDevice();
void showDevInfo();
uint32_t parseIpAddr(AnsiString addr);
int32_t setSyncDinStream();
int32_t setAdcFreq();
int32_t setupParams();
void updateControls();
__fastcall void OnThreadTerminate(TObject *obj);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
@@ -0,0 +1,146 @@
<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
<MACROS>
<VERSION value="BCB.06.00"/>
<PROJECT value="x502_example.exe"/>
<OBJFILES value="x502_example.obj unit.obj x502_thread.obj"/>
<RESFILES value="x502_example.res"/>
<IDLFILES value=""/>
<IDLGENFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES) unit.dfm"/>
<LIBFILES value="&quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib&quot;
&quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib&quot; &quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib&quot;"/>
<LIBRARIES value=""/>
<SPARELIBS value="vcl.lib rtl.lib"/>
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
indy.bpi bcb2kaxserver.bpi"/>
<PATHCPP value=".;"/>
<PATHPAS value=".;"/>
<PATHRC value=".;"/>
<PATHASM value=".;"/>
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="ilink32"/>
<USERDEFINES value="_DEBUG"/>
<SYSDEFINES value="_RTLDLL;NO_STRICT;USEPACKAGES"/>
<MAINSOURCE value="x502_example.cpp"/>
<INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl;&quot;C:\Program Files (x86)\L-Card\lpcie\include&quot;"/>
<LIBPATH value="&quot;C:\Program Files (x86)\Borland\CBuilder6\Projects&quot;;$(BCB)\lib\obj;$(BCB)\lib"/>
<WARNINGS value="-w-par"/>
<OTHERFILES value=""/>
</MACROS>
<OPTIONS>
<IDLCFLAGS value="-I$(BCB)\include -I$(BCB)\include\vcl
-I&quot;C:\Program Files (x86)\L-Card\lpcie\include&quot; -src_suffix cpp -D_DEBUG
-boa"/>
<CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
-tW -tWM"/>
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
<RFLAGS value=""/>
<AFLAGS value="/mx /w2 /zd"/>
<LFLAGS value="-D&quot;&quot; -aa -Tpe -x -Gn -v"/>
<OTHERFILES value=""/>
</OPTIONS>
<LINKER>
<ALLOBJ value="c0w32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/>
<OTHERFILES value=""/>
</LINKER>
<FILELIST>
<FILE FILENAME="x502_example.res" FORMNAME="" UNITNAME="x502_example.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="x502_example.cpp" FORMNAME="" UNITNAME="x502_example" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="unit.cpp" FORMNAME="Form1" UNITNAME="unit" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="x502_thread.cpp" FORMNAME="" UNITNAME="x502_thread" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" FORMNAME="" UNITNAME="e502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" FORMNAME="" UNITNAME="l502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" FORMNAME="" UNITNAME="x502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
</FILELIST>
<BUILDTOOLS>
</BUILDTOOLS>
<IDEOPTIONS>
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1049
CodePage=1251
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl=Borland Integrated Translation Environment
[HistoryLists\hlIncludePath]
Count=5
Item0=$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include
Item1=C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include
Item2=C:\Program Files (x86)\Borland\CBuilder6\Projects;
Item3=$(BCB)\include;$(BCB)\include\vcl;
Item4=$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=2
Item0=C:\Program Files (x86)\Borland\CBuilder6\Projects
Item1=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=1
Item0=_DEBUG
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl
[Parameters]
RunParams=
Launcher=
UseLauncher=0
DebugCWD=
HostApplication=
RemoteHost=
RemotePath=
RemoteLauncher=
RemoteCWD=
RemoteDebug=0
[Compiler]
ShowInfoMsgs=0
LinkDebugVcl=0
LinkCGLIB=0
[CORBA]
AddServerUnit=1
AddClientUnit=1
PrecompiledHeaders=1
</IDEOPTIONS>
</PROJECT>
@@ -0,0 +1,294 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{52F5121E-CB05-4B98-8B26-2A5FA28782E4}</ProjectGuid>
<ProjectType>CppVCLApplication</ProjectType>
<MainSource>x502_example.cpp</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>15.4</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<SanitizedProjectName>x502_example</SanitizedProjectName>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Locale>1049</VerInfo_Locale>
<AllPackageLibs>vcl.lib;rtl.lib</AllPackageLibs>
<DCC_UnitSearchPath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<FinalOutputDir>.</FinalOutputDir>
<TASM_AdditionalSwitches> /w2</TASM_AdditionalSwitches>
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
<BRCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BRCC_IncludePath)</BRCC_IncludePath>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
<DCC_AdditionalSwitches> -M</DCC_AdditionalSwitches>
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
<UsePackages>true</UsePackages>
<ILINK_AppType>Windows</ILINK_AppType>
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<DCC_IncludePath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_IncludePath)</DCC_IncludePath>
<BCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BCC_IncludePath)</BCC_IncludePath>
<TASM_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(TASM_IncludePath)</TASM_IncludePath>
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
<DynamicRTL>true</DynamicRTL>
<ILINK_LibraryPath>C:\Program Files (x86)\Borland\CBuilder6\Projects;$(BDS)\lib\obj;$(BDS)\lib;$(BDS)\lib\psdk;$(ILINK_LibraryPath)</ILINK_LibraryPath>
<BCC_GenerateWindowsApp>true</BCC_GenerateWindowsApp>
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
<BCC_PCHCache>true</BCC_PCHCache>
<PackageImports>vcl.bpi;rtl.bpi;dbrtl.bpi;adortl.bpi;vcldb.bpi;vclx.bpi;bdertl.bpi;vcldbx.bpi;ibxpress.bpi;dsnap.bpi;dsnap.bpi;dsnapcon.bpi;teeui.bpi;teedb.bpi;tee.bpi;dss.bpi;dsnapcon.bpi;bcbsmp.bpi;vclie.bpi;xmlrtl.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;inetdb.bpi;webdsnap.bpi;bcbie.bpi;websnap.bpi;soaprtl.bpi;dbexpress.bpi;dbxcds.bpi;indycore.bpi;indysystem.bpi;bcboffice2k.bpi;$(PackageImports)</PackageImports>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve</BCC_UserSuppliedOptions>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<OutputExt>.exe</OutputExt>
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
<ILINK_LibraryPath>C:\Program Files (x86)\L-Card\lpcie\lib\borland\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<IntermediateOutputDir>Debug_Build</IntermediateOutputDir>
<DCC_AdditionalSwitches> -M -V</DCC_AdditionalSwitches>
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
<TASM_Debugging>Full</TASM_Debugging>
<DCC_Define>DEBUG;$(DCC_Define);$(DCC_Define)</DCC_Define>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<VerInfo_Locale>1033</VerInfo_Locale>
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -k</BCC_UserSuppliedOptions>
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
<LinkPackageImports>vcl.bpi;rtl.bpi</LinkPackageImports>
<OutputExt>exe</OutputExt>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<ILINK_LibraryPath>$(BDS)\lib\win32\release\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<BCC_OptimizationLevel>Level2</BCC_OptimizationLevel>
<DCC_AdditionalSwitches> -M -$O+</DCC_AdditionalSwitches>
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
<TASM_Debugging>None</TASM_Debugging>
<IntermediateOutputDir>Release_Build</IntermediateOutputDir>
<BCC_InlineFunctionExpansion>true</BCC_InlineFunctionExpansion>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -r</BCC_UserSuppliedOptions>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
</PropertyGroup>
<ItemGroup>
<CppCompile Include="unit.cpp">
<BuildOrder>8</BuildOrder>
<Form>Form1</Form>
<DependentOn>unit.h</DependentOn>
<BuildOrder>6</BuildOrder>
</CppCompile>
<CppCompile Include="x502_example.cpp">
<BuildOrder>5</BuildOrder>
<BuildOrder>5</BuildOrder>
</CppCompile>
<ResFiles Include="x502_example.res">
<BuildOrder>2</BuildOrder>
<BuildOrder>4</BuildOrder>
</ResFiles>
<CppCompile Include="x502_thread.cpp">
<BuildOrder>11</BuildOrder>
<BuildOrder>3</BuildOrder>
</CppCompile>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>4</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>5</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>6</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<FormResources Include="unit.dfm"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets"/>
<ProjectExtensions>
<Borland.Personality>CPlusPlusBuilder.Personality.12</Borland.Personality>
<Borland.ProjectType>CppVCLApplication</Borland.ProjectType>
<BorlandProject>
<CPlusPlusBuilder.Personality>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">0</VersionInfo>
<VersionInfo Name="AutoIncBuild">0</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">0</VersionInfo>
<VersionInfo Name="PreRelease">0</VersionInfo>
<VersionInfo Name="Special">0</VersionInfo>
<VersionInfo Name="Private">0</VersionInfo>
<VersionInfo Name="DLL">0</VersionInfo>
<VersionInfo Name="Locale">1049</VersionInfo>
<VersionInfo Name="CodePage">1251</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<ExcludedPackages>
<ExcludedPackages Name="c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl">Borland Integrated Translation Environment</ExcludedPackages>
</ExcludedPackages>
<HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Count">5</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item0">$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item1">C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item2">C:\Program Files (x86)\Borland\CBuilder6\Projects;</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item3">$(BCB)\include;$(BCB)\include\vcl;</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item4">$(BCB)\include;$(BCB)\include\vcl</HistoryLists_hlIncludePath>
</HistoryLists_hlIncludePath>
<HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Count">2</HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Item0">C:\Program Files (x86)\Borland\CBuilder6\Projects</HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Item1">$(BCB)\lib\obj;$(BCB)\lib</HistoryLists_hlLibraryPath>
</HistoryLists_hlLibraryPath>
<HistoryLists_hlDebugSourcePath>
<HistoryLists_hlDebugSourcePath Name="Count">1</HistoryLists_hlDebugSourcePath>
<HistoryLists_hlDebugSourcePath Name="Item0">$(BCB)\source\vcl</HistoryLists_hlDebugSourcePath>
</HistoryLists_hlDebugSourcePath>
<HistoryLists_hlConditionals>
<HistoryLists_hlConditionals Name="Count">1</HistoryLists_hlConditionals>
<HistoryLists_hlConditionals Name="Item0">_DEBUG</HistoryLists_hlConditionals>
</HistoryLists_hlConditionals>
<Debugging>
<Debugging Name="DebugSourceDirs">$(BCB)\source\vcl</Debugging>
</Debugging>
<Parameters>
<Parameters Name="RunParams"/>
<Parameters Name="Launcher"/>
<Parameters Name="UseLauncher">0</Parameters>
<Parameters Name="DebugCWD"/>
<Parameters Name="HostApplication"/>
<Parameters Name="RemoteHost"/>
<Parameters Name="RemotePath"/>
<Parameters Name="RemoteLauncher"/>
<Parameters Name="RemoteCWD"/>
<Parameters Name="RemoteDebug">0</Parameters>
</Parameters>
<Compiler>
<Compiler Name="ShowInfoMsgs">0</Compiler>
<Compiler Name="LinkDebugVcl">0</Compiler>
<Compiler Name="LinkCGLIB">0</Compiler>
</Compiler>
<CORBA>
<CORBA Name="AddServerUnit">1</CORBA>
<CORBA Name="AddClientUnit">1</CORBA>
<CORBA Name="PrecompiledHeaders">1</CORBA>
</CORBA>
<ProjectProperties>
<ProjectProperties Name="AutoShowDeps">False</ProjectProperties>
<ProjectProperties Name="ManagePaths">True</ProjectProperties>
<ProjectProperties Name="VerifyPackages">True</ProjectProperties>
<ProjectProperties Name="IndexFiles">False</ProjectProperties>
</ProjectProperties>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k200.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp200.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k200.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp200.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
<Source>
<Source Name="MainSource">x502_example.cpp</Source>
</Source>
</CPlusPlusBuilder.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Cpp.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>
@@ -0,0 +1,40 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("unit.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
@@ -0,0 +1,100 @@
//---------------------------------------------------------------------------
#pragma hdrstop
#include "x502_thread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define RECV_BUF_SIZE 8*1024*1024
#define RECV_TOUT 250
__fastcall X502_ProcessThread::X502_ProcessThread(bool CreateSuspended)
: TThread(CreateSuspended), stop(false), err (X502_ERR_OK) {
}
/* обновление индикаторов формы результатами последнего измерения.
Метод должен выполняться только через Syncronize, который нужен
для доступа к элементам VCL не из основного потока */
void __fastcall X502_ProcessThread::updateData() {
uint32_t lch_cnt;
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err == X502_ERR_OK) {
/* устанавливаем в индикаторах значение первого отсчета из массива */
for (uint32_t i=0; (i < lch_cnt) && (i < adcSize); i++)
lchResEdits[(firstLch + i)%lch_cnt]->Text = FloatToStrF(adcData[i], ffFixed, 4, 8);
/* если есть данные цифрового выхода, то устанавливаем индикатор
в соответствии с первым значением */
if (dinSize) {
dinResEdit->Text = IntToHex((int)dinData[0]&0x3FFFF, 5);
} else {
dinResEdit->Text = "";
}
}
}
void __fastcall X502_ProcessThread::Execute() {
/* выделяем буферы под принимаемые данные */
uint32_t *rcv_buf = new uint32_t[RECV_BUF_SIZE];
dinData = new uint32_t[RECV_BUF_SIZE];
adcData = new double[RECV_BUF_SIZE];
if (!rcv_buf || !dinData || !adcData) {
err = X502_ERR_MEMORY_ALLOC;
} else {
/* запускаем синхронные потоки */
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
/* выполняем прием пока не произойдет ошибка или
не будет запроса на останов от основного приложения */
while (!stop && (err == X502_ERR_OK)) {
/* принимаем данные синхронного ввода */
int32_t rcv_size = X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
/* значение меньше нуля означает ошибку... */
if (rcv_size < 0) {
err = rcv_size;
} else if (rcv_size>0) {
/* если больше нуля - значит приняли новые данные */
dinSize=RECV_BUF_SIZE;
adcSize=RECV_BUF_SIZE;
/* получаем номер лог. какнала, соответствующий первому
отсчету АЦП, так как до этого могли обработать
некратное количество кадров */
err = X502_GetNextExpectedLchNum(hnd, &firstLch);
if (err == X502_ERR_OK) {
/* разбираем данные на синхронный ввод и отсчеты АЦП и
переводим АЦП в Вольты */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, L502_PROC_FLAGS_VOLT,
adcData, &adcSize, dinData, &dinSize);
}
if (err == X502_ERR_OK) {
/* обновляем значения элементов управления */
Synchronize(updateData);
}
}
}
/* по выходу из цикла отсанавливаем поток.
Чтобы не сбросить код ошибки (если вышли по ошибке)
результат останова сохраняем в отдельную переменную */
int32_t stop_err = X502_StreamsStop(hnd);
if (err == X502_ERR_OK)
err = stop_err;
}
}
/* освобождаем выделенную память */
delete rcv_buf;
delete dinData;
delete adcData;
}
@@ -0,0 +1,41 @@
//---------------------------------------------------------------------------
#ifndef X502_THREAD_H
#define X502_THREAD_H
#include "l502api.h"
#include "e502api.h"
#include <vcl.h>
class X502_ProcessThread : public TThread {
protected:
void __fastcall Execute();
public:
bool stop; //çàïðîñ íà îñòàíîâ (óñòàíàâëèâàåòñÿ èç îñíîâíîãî ïîòîêà)
int err; //êîä îøèáêè ïðè âûïîëíåíèè ïîòîêà ñáîðà
t_x502_hnd hnd; //îïèñàòåëü ìîäóëÿ
TEdit* lchResEdits[X502_LTABLE_MAX_CH_CNT];
TEdit* dinResEdit;
__fastcall X502_ProcessThread(bool CreateSuspended);
private:
void __fastcall updateData() ;
double* adcData;
uint32_t firstLch; /* íîìåð ïåðâîãî ëîãè÷åñêîãî êàíàëà â áóôåðå ÀÖÏ */
uint32_t adcSize;
uint32_t* dinData;
uint32_t dinSize;
};
//---------------------------------------------------------------------------
#endif
@@ -0,0 +1,681 @@
object MainForm: TMainForm
Left = 630
Top = 162
Width = 585
Height = 774
Caption = 'X502 Example'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object btnRefreshDeviceList: TButton
Left = 8
Top = 8
Width = 217
Height = 25
Caption = #1054#1073#1085#1086#1074#1080#1090#1100' '#1089#1087#1080#1089#1086#1082' '#1091#1089#1090#1088#1086#1081#1089#1090#1074
TabOrder = 0
OnClick = btnRefreshDeviceListClick
end
object cbbDevList: TComboBox
Left = 256
Top = 8
Width = 241
Height = 21
ItemHeight = 13
TabOrder = 1
end
object btnOpen: TButton
Left = 8
Top = 48
Width = 217
Height = 25
Caption = #1054#1090#1082#1088#1099#1090#1100' '#1091#1089#1090#1088#1086#1081#1089#1090#1074#1086
TabOrder = 2
OnClick = btnOpenClick
end
object grpDevInfo: TGroupBox
Left = 256
Top = 40
Width = 241
Height = 169
Caption = #1048#1085#1092#1086#1088#1084#1072#1094#1080#1103' '#1086' '#1084#1086#1076#1091#1083#1077
TabOrder = 3
object lbl1: TLabel
Left = 104
Top = 96
Width = 119
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' '#1055#1051#1048#1057
end
object lbl2: TLabel
Left = 104
Top = 120
Width = 116
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' PLDA'
end
object lbl11: TLabel
Left = 104
Top = 144
Width = 113
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' ARM'
end
object chkDacPresent: TCheckBox
Left = 8
Top = 24
Width = 97
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1062#1040#1055
Enabled = False
TabOrder = 0
end
object chkGalPresent: TCheckBox
Left = 8
Top = 40
Width = 177
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1075#1072#1083#1100#1074#1072#1085#1086#1088#1072#1079#1074#1103#1079#1082#1080
Enabled = False
TabOrder = 1
end
object chkDspPresent: TCheckBox
Left = 8
Top = 56
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1080#1075#1085#1072#1083#1100#1085#1086#1075#1086' '#1087#1088#1086#1094#1077#1089#1089#1086#1088#1072
Enabled = False
TabOrder = 2
end
object edtFpgaVer: TEdit
Left = 8
Top = 96
Width = 89
Height = 21
ReadOnly = True
TabOrder = 3
end
object edtPldaVer: TEdit
Left = 8
Top = 120
Width = 89
Height = 21
ReadOnly = True
TabOrder = 4
end
object chkEthPresent: TCheckBox
Left = 8
Top = 72
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1077#1090#1077#1074#1086#1075#1086' '#1080#1085#1090#1077#1088#1092#1077#1081#1089#1072
Enabled = False
TabOrder = 5
end
object edtMcuVer: TEdit
Left = 8
Top = 144
Width = 89
Height = 21
ReadOnly = True
TabOrder = 6
end
end
object btnAsyncDigIn: TButton
Left = 8
Top = 560
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1094#1080#1092#1088#1086#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 4
OnClick = btnAsyncDigInClick
end
object edtAsyncDigIn: TEdit
Left = 248
Top = 560
Width = 121
Height = 21
Enabled = False
TabOrder = 5
Text = '0x0000'
end
object btnAsyncDigOut: TButton
Left = 8
Top = 592
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1094#1080#1092#1088#1086#1074#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 6
OnClick = btnAsyncDigOutClick
end
object edtAsyncDigOut: TEdit
Left = 248
Top = 592
Width = 121
Height = 21
TabOrder = 7
Text = '0x0000'
end
object grp1: TGroupBox
Left = 8
Top = 224
Width = 513
Height = 65
Caption = #1063#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 8
object lbl3: TLabel
Left = 16
Top = 20
Width = 139
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093' ('#1043#1094')'
end
object lbl4: TLabel
Left = 168
Top = 20
Width = 113
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1085#1072' '#1082#1072#1085#1072#1083' ('#1043#1094')'
end
object lbl5: TLabel
Left = 296
Top = 20
Width = 166
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072' ('#1043#1094')'
end
object btnSetAdcFreq: TButton
Left = 432
Top = 32
Width = 73
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100
TabOrder = 0
OnClick = btnSetAdcFreqClick
end
object edtAdcFreq: TEdit
Left = 16
Top = 36
Width = 105
Height = 21
TabOrder = 1
Text = '2000000'
end
object edtAdcFreqLch: TEdit
Left = 176
Top = 36
Width = 105
Height = 21
TabOrder = 2
Text = '2000000'
end
object edtDinFreq: TEdit
Left = 296
Top = 36
Width = 105
Height = 21
TabOrder = 3
Text = '2000000'
end
end
object grp2: TGroupBox
Left = 8
Top = 368
Width = 513
Height = 153
Caption = #1050#1072#1085#1072#1083#1099
TabOrder = 9
object lbl6: TLabel
Left = 8
Top = 40
Width = 31
Height = 13
Caption = #1050#1072#1085#1072#1083
end
object lbl7: TLabel
Left = 64
Top = 40
Width = 49
Height = 13
Caption = #1044#1080#1072#1087#1072#1079#1086#1085
end
object lbl8: TLabel
Left = 152
Top = 40
Width = 88
Height = 13
Caption = #1056#1077#1078#1080#1084' '#1080#1079#1084#1077#1088#1077#1085#1080#1103
end
object lbl9: TLabel
Left = 336
Top = 40
Width = 53
Height = 13
Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090
end
object lbl10: TLabel
Left = 16
Top = 16
Width = 166
Height = 13
Caption = #1050#1086#1083#1080#1095#1077#1089#1090#1074#1086' '#1083#1086#1075#1080#1095#1077#1089#1082#1080#1093' '#1082#1072#1085#1072#1083#1086#1074
end
object cbbLCh1_Channel: TComboBox
Left = 8
Top = 56
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 0
Text = '1'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh1_Range: TComboBox
Left = 64
Top = 56
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 1
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh1_Mode: TComboBox
Left = 136
Top = 56
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 2
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh1_Result: TEdit
Left = 328
Top = 56
Width = 121
Height = 21
TabOrder = 3
end
object cbbLCh2_Channel: TComboBox
Left = 8
Top = 80
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 4
Text = '2'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh2_Range: TComboBox
Left = 64
Top = 80
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 5
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh2_Mode: TComboBox
Left = 136
Top = 80
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 6
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh2_Result: TEdit
Left = 328
Top = 80
Width = 121
Height = 21
TabOrder = 7
end
object cbbLCh3_Channel: TComboBox
Left = 8
Top = 104
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 2
TabOrder = 8
Text = '3'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh3_Range: TComboBox
Left = 64
Top = 104
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 9
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh3_Mode: TComboBox
Left = 136
Top = 104
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 10
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh3_Result: TEdit
Left = 328
Top = 104
Width = 121
Height = 21
TabOrder = 11
end
object chkSyncDin: TCheckBox
Left = 120
Top = 128
Width = 185
Height = 17
Caption = #1056#1072#1079#1088#1072#1096#1077#1085#1080#1077' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072
TabOrder = 12
OnClick = chkSyncDinClick
end
object edtDin_Result: TEdit
Left = 328
Top = 128
Width = 121
Height = 21
TabOrder = 13
end
object cbbLChCnt: TComboBox
Left = 192
Top = 16
Width = 73
Height = 21
ItemHeight = 13
ItemIndex = 2
TabOrder = 14
Text = '3'
Items.Strings = (
'1'
'2'
'3')
end
end
object btnAsyncAdcFrame: TButton
Left = 8
Top = 528
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1082#1072#1076#1088#1072' '#1040#1062#1055
TabOrder = 10
OnClick = btnAsyncAdcFrameClick
end
object btnStop: TButton
Left = 8
Top = 112
Width = 217
Height = 25
Caption = #1054#1089#1090#1072#1085#1086#1074' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
Enabled = False
TabOrder = 11
OnClick = btnStopClick
end
object btnStart: TButton
Left = 8
Top = 80
Width = 217
Height = 25
Caption = #1047#1072#1087#1091#1089#1082' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 12
OnClick = btnStartClick
end
object btnAsyncDac1: TButton
Left = 8
Top = 624
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'1 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 13
OnClick = btnAsyncDac1Click
end
object edtAsyncDac1: TEdit
Left = 248
Top = 624
Width = 81
Height = 21
TabOrder = 14
Text = '5'
end
object edtAsyncDac2: TEdit
Left = 248
Top = 656
Width = 81
Height = 21
TabOrder = 15
Text = '5'
end
object btnAsyncDac2: TButton
Left = 8
Top = 656
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'2 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 16
OnClick = btnAsyncDac2Click
end
object GroupBox4: TGroupBox
Left = 8
Top = 295
Width = 513
Height = 65
Caption = #1057#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1103
TabOrder = 17
object Label10: TLabel
Left = 16
Top = 20
Width = 173
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1095#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1080
end
object Label11: TLabel
Left = 264
Top = 20
Width = 238
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1079#1072#1087#1091#1089#1082#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072'/'#1074#1099#1074#1086#1076#1072
end
object cbbSyncMode: TComboBox
Left = 16
Top = 38
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 0
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
object cbbSyncStartMode: TComboBox
Left = 264
Top = 38
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 1
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
end
object btnOpenByIP: TButton
Left = 8
Top = 160
Width = 217
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100' '#1089#1086#1077#1076#1080#1085#1077#1085#1080#1077' '#1087#1086' IP-'#1072#1076#1088#1077#1089#1091
TabOrder = 18
OnClick = btnOpenByIPClick
end
object edtIpAddr: TEdit
Left = 8
Top = 192
Width = 217
Height = 21
TabOrder = 19
Text = '192.168.0.1'
end
end
@@ -0,0 +1,712 @@
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
l502api, x502api, e502api, X502_ProcessThread;
type
TMainForm = class(TForm)
btnRefreshDeviceList: TButton;
cbbDevList: TComboBox;
btnOpen: TButton;
grpDevInfo: TGroupBox;
chkDacPresent: TCheckBox;
chkGalPresent: TCheckBox;
chkDspPresent: TCheckBox;
edtFpgaVer: TEdit;
edtPldaVer: TEdit;
lbl1: TLabel;
lbl2: TLabel;
btnAsyncDigIn: TButton;
edtAsyncDigIn: TEdit;
btnAsyncDigOut: TButton;
edtAsyncDigOut: TEdit;
grp1: TGroupBox;
lbl3: TLabel;
lbl4: TLabel;
lbl5: TLabel;
btnSetAdcFreq: TButton;
edtAdcFreq: TEdit;
edtAdcFreqLch: TEdit;
edtDinFreq: TEdit;
grp2: TGroupBox;
lbl6: TLabel;
lbl7: TLabel;
lbl8: TLabel;
lbl9: TLabel;
lbl10: TLabel;
cbbLCh1_Channel: TComboBox;
cbbLCh1_Range: TComboBox;
cbbLCh1_Mode: TComboBox;
edtLCh1_Result: TEdit;
cbbLCh2_Channel: TComboBox;
cbbLCh2_Range: TComboBox;
cbbLCh2_Mode: TComboBox;
edtLCh2_Result: TEdit;
cbbLCh3_Channel: TComboBox;
cbbLCh3_Range: TComboBox;
cbbLCh3_Mode: TComboBox;
edtLCh3_Result: TEdit;
chkSyncDin: TCheckBox;
edtDin_Result: TEdit;
cbbLChCnt: TComboBox;
btnAsyncAdcFrame: TButton;
btnStop: TButton;
btnStart: TButton;
btnAsyncDac1: TButton;
edtAsyncDac1: TEdit;
edtAsyncDac2: TEdit;
btnAsyncDac2: TButton;
GroupBox4: TGroupBox;
Label10: TLabel;
Label11: TLabel;
cbbSyncMode: TComboBox;
cbbSyncStartMode: TComboBox;
chkEthPresent: TCheckBox;
edtMcuVer: TEdit;
lbl11: TLabel;
btnOpenByIP: TButton;
edtIpAddr: TEdit;
procedure btnRefreshDeviceListClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnAsyncDigInClick(Sender: TObject);
procedure btnAsyncDigOutClick(Sender: TObject);
procedure btnSetAdcFreqClick(Sender: TObject);
procedure btnAsyncAdcFrameClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnAsyncDac1Click(Sender: TObject);
procedure btnAsyncDac2Click(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure chkSyncDinClick(Sender: TObject);
procedure btnOpenByIPClick(Sender: TObject);
private
hnd : t_x502_hnd; //îïèñàòåëü ìîäóëÿ
devrecList : array of t_x502_devrec;
threadRunning : Boolean; //ïðèçíàê, çàïóùåí ëè ïîòîê ñáîðà äàííûõ
thread: TX502_ProcessThread; //ïîòîê äëÿ ñèíõðîííîãî ââîäà
procedure updateControls();
procedure freeDevList();
procedure refreshDeviceList();
procedure showDevInfo();
procedure closeDevice();
procedure OnThreadTerminate(par : TObject);
function setAdcFreq() : LongInt;
function setupParams() : LongInt;
function setSyncDinStream() : LongInt;
function parseIpAddr(addr : string) : LongWord;
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.updateControls();
begin
//êíîïêà îáíîâèòü ñïèñîê äîñòóïíà ïîêà íå îòêðûëè óñòðîéñòâî
btnRefreshDeviceList.Enabled := hnd=nil;
cbbDevList.Enabled:= hnd=nil;
if hnd = nil then
btnOpen.Caption := 'Óñòàíîâèòü ñâÿçü ñ ìîäóëåì'
else
btnOpen.Caption := 'Ðàçîðâàòü ñâÿçü ñ ìîäóëåì';
btnOpen.Enabled := (hnd<>nil) or (cbbDevList.ItemIndex >= 0);
btnOpenByIP.Enabled := hnd=nil;
edtIpAddr.Enabled := hnd=nil;
chkSyncDin.Enabled := (hnd<>nil) and not threadRunning;
btnStart.Enabled := (hnd<>nil) and not threadRunning;
btnStop.Enabled := (hnd<>nil) and threadRunning;
btnSetAdcFreq.Enabled := (hnd<>nil) and not threadRunning;
btnAsyncDigOut.Enabled := (hnd<>nil);
btnAsyncDigIn.Enabled := (hnd<>nil);
btnAsyncDac1.Enabled := (hnd<>nil) and chkDacPresent.Checked;
btnAsyncDac2.Enabled := (hnd<>nil) and chkDacPresent.Checked;
btnAsyncAdcFrame.Enabled := (hnd<>nil) and not threadRunning;
end;
procedure TMainForm.freeDevList();
begin
if Length(devrecList) <> 0 then
begin
X502_FreeDevRecordList(devrecList, Length(devrecList));
SetLength(devrecList, 0);
end;
cbbDevList.Items.Clear;
end;
{ Ôóíêöèÿ îáíîâëÿåò ñïèñîê ñåðèéíûõ íîìåðîâ ïîäêëþ÷åííûõ óñòðîéñòâ }
procedure TMainForm.refreshDeviceList();
var
//óêàçàòåëü íà ìàññèâ ñåðèéíûõ íîìåðîâ, êîòîðûé âûäåëèì äèíàìè÷åñêè
res,i, old_index : LongInt;
devcnt : LongWord;
pci_devrecs, usb_devrecs : array of t_x502_devrec;
begin
old_index := cbbDevList.ItemIndex;
freeDevList;
L502_GetDevRecordsList(pci_devrecs, 0, devcnt);
if devcnt > 0 then
begin
//óñòàíàâëèâàåì ðàçìåð ìàññèâà, ÷òîáû åãî õâàòàëî äëÿ íóæíîãî êîë-âà íîìåðîâ
SetLength(pci_devrecs, devcnt);
//ïîëó÷àåì ñåðèéíûå íîìåðà ìîäóëåé
res := L502_GetDevRecordsList(pci_devrecs, 0);
if res > 0 then
SetLength(pci_devrecs, res)
else
SetLength(pci_devrecs, 0);
end;
E502_UsbGetDevRecordsList(usb_devrecs, 0, devcnt);
if devcnt > 0 then
begin
//óñòàíàâëèâàåì ðàçìåð ìàññèâà, ÷òîáû åãî õâàòàëî äëÿ íóæíîãî êîë-âà íîìåðîâ
SetLength(usb_devrecs, devcnt);
//ïîëó÷àåì ñåðèéíûå íîìåðà ìîäóëåé
res := E502_UsbGetDevRecordsList(usb_devrecs, 0);
if res > 0 then
SetLength(usb_devrecs, res)
else
SetLength(usb_devrecs, 0);
end;
// Â devrecList ñîõðàíÿåì îáà ìàññèâà çàïèñåé
SetLength(devrecList, Length(pci_devrecs) + Length(usb_devrecs));
if Length(devrecList) > 0 then
begin
for i:=0 to Length(pci_devrecs)-1 do
devrecList[i] := pci_devrecs[i];
for i:=0 to Length(usb_devrecs)-1 do
devrecList[i+Length(pci_devrecs)] := usb_devrecs[i];
// äîáàâëÿåì âñå íàéäåííûå çàïèñè â ñïèñîê ComboBox'à äëÿ âûáîðà
for i:=0 to Length(devrecList)-1 do
cbbDevList.Items.Add(AnsiString(devrecList[i].devname) + ', ' + AnsiString(devrecList[i].serial));
//åñëè äî îáíîâëåíèÿ ñïèñêà áûë âûáðàí äåéñòâèòåëüíûé èíäåêñ - âîññòàíàâëèâàåì åãî
if (old_index >= 0) and (old_index < Length(pci_devrecs)) then
cbbDevList.ItemIndex := old_index
else
cbbDevList.ItemIndex := 0;
end;
updateControls;
end;
// Óñòàíîâêà ïåðàìåòðîâ ñáîðà ìîäóëÿ â ñîîòâåòñòâèè ñ ýëåìåíòàìè GUI
function TMainForm.setupParams() : Integer;
var
err : Integer;
lch_cnt : LongWord;
const
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ ðåæèìà èçìåðåíèÿ }
mode_tbl: array[0..2] of LongWord = (X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO);
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ äèàïàçîíîâ ÀÖÏ }
range_tbl: array[0..5] of LongWord = (X502_ADC_RANGE_10, X502_ADC_RANGE_5, X502_ADC_RANGE_2,
X502_ADC_RANGE_1, X502_ADC_RANGE_05, X502_ADC_RANGE_02);
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ èñòî÷íèêà ñèíõðîíèçàöèè }
f_sync_tbl: array[0..5] of LongWord = (X502_SYNC_INTERNAL, X502_SYNC_EXTERNAL_MASTER,
X502_SYNC_DI_SYN1_RISE, X502_SYNC_DI_SYN2_RISE,
X502_SYNC_DI_SYN1_FALL, X502_SYNC_DI_SYN2_FALL);
begin
lch_cnt := cbbLChCnt.ItemIndex + 1;
// Óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ
err := X502_SetLChannelCount(hnd, lch_cnt);
// Íàñòðàíèâàåì òàáëèöó ëîãè÷åñêèõ êàíàëîâ
if err = X502_ERR_OK then
begin
err := X502_SetLChannel(hnd,0, cbbLCh1_Channel.ItemIndex,
mode_tbl[cbbLCh1_Mode.ItemIndex], range_tbl[cbbLCh1_Range.ItemIndex],0);
end;
if (err = X502_ERR_OK) and (lch_cnt>=2) then
begin
err := X502_SetLChannel(hnd,1, cbbLCh2_Channel.ItemIndex,
mode_tbl[cbbLCh2_Mode.ItemIndex], range_tbl[cbbLCh2_Range.ItemIndex],0);
end;
if (err = X502_ERR_OK) and (lch_cnt>=3) then
begin
err := X502_SetLChannel(hnd,2, cbbLCh3_Channel.ItemIndex,
mode_tbl[cbbLCh3_Mode.ItemIndex], range_tbl[cbbLCh3_Range.ItemIndex],0);
end;
// Íàñòðàèâàåì èñòî÷íèê ÷àñòîòû ñèíõðîíèçàöèè è çàïóñêà ñáîðà
if err = X502_ERR_OK then
err := X502_SetSyncMode(hnd, f_sync_tbl[cbbSyncMode.ItemIndex]);
if err = X502_ERR_OK then
err := X502_SetSyncStartMode(hnd, f_sync_tbl[cbbSyncStartMode.ItemIndex]);
// íàñòðàèâàåì ÷àñòîòó ñáîðà ñ ÀÖÏ
if err = X502_ERR_OK then
err := setAdcFreq();
// Çàïèñûâàåì íàñòðîéêè â ìîäóëü
if err = X502_ERR_OK then
err := X502_Configure(hnd, 0);
setupParams:= err;
end;
procedure TMainForm.closeDevice();
begin
if hnd<>nil then
begin
//åñëè çàïóùåí ïîòîê ñáîðà äàííûõ - òî îñòàíàâëèâàåì åãî
if threadRunning then
begin
thread.stop:=True;
thread.WaitFor;
end;
// çàêðûòèå ñâÿçè ñ ìîäóëåì
X502_Close(hnd);
// îñâîáîæäåíèå îïèñàòåëÿ
X502_Free(hnd);
hnd := nil;
end;
end;
//óñòàíîâêà ÷àñòîòû ÀÖÏ â ñîîòâåòñòâèè ñî çíà÷åíèÿìè
//ýëåìåíòîâ óïðàâëåíèÿ, è îáíîâëåíèå èõ â ñîîòâåòñòâèè
//ñ ðåàëüíî óñòàíîâëåííûìè
function TMainForm.setAdcFreq() : Integer;
var f_acq, f_lch, f_din: Double;
err : Integer;
begin
f_acq := StrToFloat(edtAdcFreq.Text);
f_lch := StrToFloat(edtAdcFreqLch.Text);
f_din := StrToFloat(edtDinFreq.Text);
// óñòàíàâëèâàåì òðåáóåìóþ ÷àñòîòó ñáîðà.
err := X502_SetAdcFreq(hnd, f_acq, f_lch);
if err = X502_ERR_OK then
begin
// îáíîâëÿåì çíà÷åíèå èíäèêàòîðà, äëÿ îòîáðàæåíèÿ
// ðåàëüíî óñòàíîâèâøåéñÿ ÷àñòîòû
edtAdcFreq.Text := FloatToStr(f_acq);
edtAdcFreqLch.Text := FloatToStr(f_lch);
// Óñòàíàâëèâàåì ÷àñòîòó ñèíõðîííîãî ñáîðà
err := X502_SetDinFreq(hnd, f_din);
if err = X502_ERR_OK then
edtDinFreq.Text := FloatToStr(f_din);
end;
setAdcFreq:= err;
end;
function TMainForm.setSyncDinStream : LongInt;
var err : LongInt;
begin
{ ðàçðåøàåì èëè çàïðåùàåì ïîòîê ñèíõðîííîãî ââîäà
â çàâèñèìîñòè îò ñîñòîÿíèÿ ïåðåêëþ÷àòåëÿ }
if chkSyncDin.Checked then
err := X502_StreamsEnable(hnd, X502_STREAM_DIN)
else
err := X502_StreamsDisable(hnd, X502_STREAM_DIN);
setSyncDinStream:= err;
end;
procedure TMainForm.btnRefreshDeviceListClick(Sender: TObject);
begin
refreshDeviceList;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
hnd := nil;
refreshDeviceList;
end;
procedure TMainForm.showDevInfo();
var
err : LongInt;
info : t_x502_info;
begin
//ïîëó÷àåì èíôîðìàöèþ î óñòðîéñòâå
err := X502_GetDevInfo(hnd,info);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î óñòðîéñòâå: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
//ïðè îøèáêå çàêðûâàåì ñâÿçü ñ óñòðîéñòâîì
X502_Close(hnd);
X502_Free(hnd);
hnd := nil;
end
else
begin
//âûâîäèì ïðîè÷èòàííóþ èíôîðìàöèþ íà èíäèêàòîðû
chkDacPresent.Checked := (info.devflags and X502_DEVFLAGS_DAC_PRESENT) <> 0;
chkGalPresent.Checked := (info.devflags and X502_DEVFLAGS_GAL_PRESENT) <> 0;
chkDspPresent.Checked := (info.devflags and X502_DEVFLAGS_BF_PRESENT) <> 0;
chkEthPresent.Checked := (info.devflags and X502_DEVFLAGS_IFACE_SUPPORT_ETH) <> 0;
edtPldaVer.Text := IntToStr(info.plda_ver);
edtFpgaVer.Text := IntToStr((info.fpga_ver shr 8) and $FF) + '.' +
IntToStr(info.fpga_ver and $FF);
if info.mcu_firmware_ver <> 0 then
begin
edtMcuVer.Text := IntToStr((info.mcu_firmware_ver shr 24) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver shr 16) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver shr 8) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver) and $FF);
end
else
begin
edtMcuVer.Text := '';
end;
end;
end;
procedure TMainForm.btnOpenClick(Sender: TObject);
var
idx : integer;
err : LongInt;
begin
if hnd=nil then
begin
// ïîëó÷àåì èíäåêñ âûáðàííîãî ìîäóëÿ
idx := cbbDevList.ItemIndex;
if (idx >= 0) and (idx < Length(devrecList)) then
begin
//ñîçäàåì îïèñàòåëü
hnd := X502_Create();
if hnd=nil then
MessageDlg('Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ',mtError, [mbOK], 0)
else
begin
// îòêðûâàåì ìîäóëü, ñîîòâåòñòâóþùèé çàïèñè ñ âûáðàííûì èíäåêñîì
err := X502_OpenByDevRecord(hnd, devrecList[idx]);
if err <> X502_ERR_OK then
begin
// Íå ñìîãëè îòêðûòü => îñâîáîæäàåì îïèñàòåëü
MessageDlg('Îøèáêà îòêðûòèÿ ìîäóëÿ: ' + X502_GetErrorString(err),mtError, [mbOK], 0);
X502_Free(hnd);
hnd := nil;
end
else
begin
showDevInfo;
end;
end;
end;
end
else
begin
//åñëè óñòðîéñòâî áûëî îòêðûòî - çàêðûâàåì
closeDevice;
end;
updateControls;
end;
{ ïðåîáðàçîâàíèå ñòðîêè ñ ip-àäðåñîì â DWORD }
function TMainForm.parseIpAddr(addr : string) : LongWord;
var
S: TStrings;
begin
S := TStringList.Create;
S.Delimiter := '.';
S.DelimitedText := addr;
// do preeliminary check. The IP4 Address string must consists of 4 parts. Less or more than that would be invalid values
if S.Count<>4 then
begin
S.Free;
raise Exception.Create('Invalid IP4 Address string');
end;
Result := (StrToInt(S[0]) shl 24) + (StrToInt(S[1]) shl 16) +
(StrToInt(S[2]) shl 8) + (StrToInt(S[3]));
S.Free;
end;
procedure TMainForm.btnOpenByIPClick(Sender: TObject);
var
devrec : t_x502_devrec;
err : LongInt;
begin
// Ñîçäàåì çàïèñü, ñîîòâåòñòâóþùóþ çàäàííîìó àäðåñó
err := E502_MakeDevRecordByIpAddr(devrec, parseIpAddr(edtIpAddr.Text), 0, 5000);
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà ñîçäàíèÿ çàïèñè: ' + X502_GetErrorString(err),mtError, [mbOK], 0)
else
begin
// Ñîçäàíèå îïèñàòåëÿ ìîäóëÿ
hnd := X502_Create;
if hnd=nil then
MessageDlg('Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ',mtError, [mbOK], 0)
else
begin
// óñòàíàâëèâàåì ñâÿçü ïî ñîçäàííîé çàïèñè
err := X502_OpenByDevRecord(hnd, devrec);
if err <> X502_ERR_OK then
begin
// Íå ñìîãëè îòêðûòü => îñâîáîæäàåì îïèñàòåëü
MessageDlg('Îøèáêà îòêðûòèÿ ìîäóëÿ: ' + X502_GetErrorString(err),mtError, [mbOK], 0);
X502_Free(hnd);
hnd := nil;
end
else
begin
showDevInfo;
end;
end;
X502_FreeDevRecordList(devrec);
end;
updateControls();
end;
procedure TMainForm.btnAsyncDigInClick(Sender: TObject);
var din: Cardinal;
var err: Integer;
begin
if hnd<>nil then
begin
err := X502_AsyncInDig(hnd, din);
if err<>X502_ERR_OK then
MessageDlg('Îøèáêà àñèíõðîííîãî ââîäà ñ öèôðîâûõ ëèíèé: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
else
edtAsyncDigIn.Text := IntToHex(din and $3FFFF, 5);
end;
end;
procedure TMainForm.btnAsyncDigOutClick(Sender: TObject);
var dout: Cardinal;
var err: Integer;
begin
if hnd<>nil then
begin
dout:= StrToInt(edtAsyncDigOut.Text);
err := X502_AsyncOutDig(hnd, dout, 0);
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà àñèíõðîííîãî âûâîäà öèôðîâûõ ëèíèé: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
end;
end;
procedure TMainForm.btnSetAdcFreqClick(Sender: TObject);
var err : Integer;
begin
{ óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ, ÷òîáû ïðàâèëüíî
ðàñ÷èòàòü ÷àñòîòó íà êàíàë }
err := X502_SetLChannelCount(hnd, cbbLChCnt.ItemIndex+1);
if err = X502_ERR_OK then
err := setAdcFreq();
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà óñòàíîâêè ÷àñòîòû: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
end;
procedure TMainForm.btnAsyncAdcFrameClick(Sender: TObject);
var err : Integer;
adc_data : array of double;
lch_cnt : LongWord;
begin
if hnd <> nil then
begin
// óñòàíàâëèâàåì ïàðàìåòðû ìîäóëÿ
err := setupParams();
if err = X502_ERR_OK then
err := X502_GetLChannelCount(hnd, lch_cnt);
if err = X502_ERR_OK then
begin
// óñòàíàâëèâàåì ðàçìåð ìàññèâà ðàâíûì êîëè÷åñòâó ëîãè÷åñêèõ êàíàëîâ
SetLength(adc_data, lch_cnt);
err := X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if err = X502_ERR_OK then
begin
//âûâîäèì ðåçóëüòàò
edtLCh1_Result.Text := FloatToStrF(adc_data[0], ffFixed, 4, 8);
if lch_cnt >= 2 then
edtLCh2_Result.Text := FloatToStrF(adc_data[1], ffFixed, 4, 8)
else
edtLCh2_Result.Text := '';
if lch_cnt >= 3 then
edtLCh3_Result.Text := FloatToStrF(adc_data[2], ffFixed, 4, 8)
else
edtLCh3_Result.Text := '';
end
else
begin
MessageDlg('Îøèáêà ïðèåìà êàäðà ÀÖÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end
end
else
begin
MessageDlg('Îøèáêà íàñòðîéêè ïàðàìåòðîâ ÀÖÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStartClick(Sender: TObject);
var
err : LongInt;
begin
//íàñòðàèâàåì âñå ïàðàìåòðû â ñîîòâåòñòâèè ñ ýëåìåíòàìè óïðàâëåíèÿ
err := setupParams();
//ðàçðåøàåì ñèíõðîííûé ââîä ÀÖÏ
if err = X502_ERR_OK then
err := X502_StreamsEnable(hnd, X502_STREAM_ADC);
// ðàçðåøàåì ñèíõðîííûé ââîä ñ öèôðîâûõ ëèíèé â çàâèñèìîñòè îò ïåðåêëþ÷àòåëÿ
if err = X502_ERR_OK then
err := setSyncDinStream();
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà íàñòðîéêè ïàðàìåòðîâ ìîäóëÿ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end
else
begin
if thread <> nil then
begin
FreeAndNil(thread);
end;
thread := TX502_ProcessThread.Create(True);
thread.hnd := hnd;
SetLength(thread.LChEdits, 3);
thread.LChEdits[0] := edtLCh1_Result;
thread.LChEdits[1] := edtLCh2_Result;
thread.LChEdits[2] := edtLCh3_Result;
thread.dinResEdit := edtDin_Result;
edtLCh1_Result.Text:= '';
edtLCh2_Result.Text:= '';
edtLCh3_Result.Text:= '';
edtDin_Result.Text:= '';
{ óñòàíàâëèâàåì ôóíêöèþ íà ñîáûòèå çàâåðøåíèÿ ïîòîêà (â ÷àñòíîñòè
÷òîáû îòñëåäèòü, åñëè ïîòîê çàâåðøèëñÿ ñàì èç-çà îøèáêè ïðè ñáîðå
äàííûõ) }
thread.OnTerminate := OnThreadTerminate;
thread.Resume; //äëÿ Delphi 2010 è âûøå ðåêîìåíäóåòñÿ èñïîëüçîâàòü Start
threadRunning := True;
updateControls;
end;
end;
//ôóíêöèÿ, âûçûâàåìàÿ ïî çàâåðøåíèþ ïîòîêà ñáîðà äàííûõ
//ðàçðåøàåò ñòàðò íîâîãî, óñòàíàâëèâàåò thread_run
procedure TMainForm.OnThreadTerminate(par : TObject);
begin
if thread.err <> X502_ERR_OK then
begin
MessageDlg('Ñáîð äàííûõ çàâåðøåí ñ îøèáêîé: ' + X502_GetErrorString(thread.err),
mtError, [mbOK], 0);
end;
threadRunning := false;
updateControls();
end;
procedure TMainForm.btnAsyncDac1Click(Sender: TObject);
var
err : LongInt;
val : Double;
begin
if hnd<>nil then
begin
val := StrToFloat(edtAsyncDac1.Text);;
err := X502_AsyncOutDac(hnd, X502_DAC_CH1, val, X502_DAC_FLAGS_CALIBR or
X502_DAC_FLAGS_VOLT);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà âûâîäà íà ÖÀÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnAsyncDac2Click(Sender: TObject);
var
err : LongInt;
val : Double;
begin
if hnd<>nil then
begin
val := StrToFloat(edtAsyncDac2.Text);;
err := X502_AsyncOutDac(hnd, X502_DAC_CH2, val, X502_DAC_FLAGS_CALIBR or
X502_DAC_FLAGS_VOLT);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà âûâîäà íà ÖÀÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStopClick(Sender: TObject);
begin
// óñòàíàâëèâàåì çàïðîñ íà çàâåðøåíèå ïîòîêà
if threadRunning then
thread.stop:=True;
btnStop.Enabled:= False;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closeDevice;
freeDevList;
if thread <> nil then
FreeAndNil(thread);
end;
procedure TMainForm.chkSyncDinClick(Sender: TObject);
var err : LongInt;
begin
if hnd<>nil then
begin
err := setSyncDinStream();
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà ðàçðåøåíèÿ/çàïðåòà ñèíõðîííîãî ââîäà: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
end.
@@ -0,0 +1,123 @@
unit X502_ProcessThread;
interface
uses Classes, Math, SyncObjs,StdCtrls,SysUtils, x502api;
const RECV_BUF_SIZE = 8*1024*1024;
const RECV_TOUT = 250;
type TX502_ProcessThread = class(TThread)
public
LChEdits : array of TEdit;
dinResEdit : TEdit;
hnd: t_x502_hnd; //îïèñàòåëü ìîäóëÿ
err : LongInt; //êîä îøèáêè ïðè âûïîëíåíèè ïîòîêà ñáîðà
stop : Boolean; //çàïðîñ íà îñòàíîâ (óñòàíàâëèâàåòñÿ èç îñíîâíîãî ïîòîêà)
constructor Create(SuspendCreate : Boolean);
destructor Free();
private
{ Private declarations }
adcData : array [0..RECV_BUF_SIZE-1] of double;
dinData : array [0..RECV_BUF_SIZE-1] of LongWord;
adcSize, dinSize, firstLch : LongWord;
procedure updateData;
protected
procedure Execute; override;
end;
implementation
constructor TX502_ProcessThread.Create(SuspendCreate : Boolean);
begin
Inherited Create(SuspendCreate);
stop:=False;
hnd:=Nil;
err:=X502_ERR_OK;
end;
destructor TX502_ProcessThread.Free();
begin
Inherited Free();
end;
{ îáíîâëåíèå èíäèêàòîðîâ ôîðìû ðåçóëüòàòàìè ïîñëåäíåãî èçìåðåíèÿ.
Ìåòîä äîëæåí âûïîëíÿòüñÿ òîëüêî ÷åðåç Syncronize, êîòîðûé íóæåí
äëÿ äîñòóïà ê ýëåìåíòàì VCL íå èç îñíîâíîãî ïîòîêà }
procedure TX502_ProcessThread.updateData;
var
lch_cnt, i : LongWord;
err : LongInt;
begin
err := X502_GetLChannelCount(hnd, lch_cnt);
if err=X502_ERR_OK then
begin
// óñòàíàâëèâàåì â èíäèêàòîðàõ çíà÷åíèå ïåðâîãî îòñ÷åòà èç ìàññèâà
for i:=0 to Min(lch_cnt, adcSize) do
LChEdits[(firstLch + i) mod lch_cnt].Text := FloatToStrF(adcData[i], ffFixed, 4, 8);
{ åñëè åñòü äàííûå öèôðîâîãî âûõîäà, òî óñòàíàâëèâàåì èíäèêàòîð
â ñîîòâåòñòâèè ñ ïåðâûì çíà÷åíèåì }
if dinSize <> 0 then
dinResEdit.Text := IntToHex(dinData[0] and $3FFFF, 5)
else
dinResEdit.Text := '';
end;
end;
procedure TX502_ProcessThread.Execute;
var
stoperr, rcv_size : LongInt;
rcv_buf : array of LongWord;
begin
setlength(rcv_buf, RECV_BUF_SIZE);
// çàïóñêàåì ñèíõðîííûå ïîòîêè
err:= X502_StreamsStart(hnd);
if err = X502_ERR_OK then
begin
{ âûïîëíÿåì ïðèåì ïîêà íå ïðîèçîéäåò îøèáêà èëè
íå áóäåò çàïðîñà íà îñòàíîâ îò îñíîâíîãî ïðèëîæåíèÿ }
while not stop and (err = X502_ERR_OK) do
begin
//ïðèíèìàåì äàííûå ñèíõðîííîãî ââîäà
rcv_size := X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
// çíà÷åíèå ìåíüøå íóëÿ îçíà÷àåò îøèáêó...
if rcv_size < 0 then
err := rcv_size
else if rcv_size>0 then
begin
//åñëè áîëüøå íóëÿ - çíà÷èò ïðèíÿëè íîâûå äàííûå
dinSize:=RECV_BUF_SIZE;
adcSize:=RECV_BUF_SIZE;
{ ïîëó÷àåì íîìåð ëîã. êàêíàëà, ñîîòâåòñòâóþùèé ïåðâîìó
îòñ÷åòó ÀÖÏ, òàê êàê äî ýòîãî ìîãëè îáðàáîòàòü
íåêðàòíîå êîëè÷åñòâî êàäðîâ }
err:=X502_GetNextExpectedLchNum(hnd, firstLch);
if err = X502_ERR_OK then
begin
{ ðàçáèðàåì äàííûå íà ñèíõðîííûé ââîä è îòñ÷åòû ÀÖÏ è
ïåðåâîäèì ÀÖÏ â Âîëüòû }
err := X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adcData, adcSize, dinData, dinSize);
if err = X502_ERR_OK then
begin
// îáíîâëÿåì çíà÷åíèÿ ýëåìåíòîâ óïðàâëåíèÿ
Synchronize(updateData);
end;
end;
end
end;
{ Ïî âûõîäó èç öèêëà îòñàíàâëèâàåì ïîòîê.
×òîáû íå ñáðîñèòü êîä îøèáêè (åñëè âûøëè ïî îøèáêå)
ðåçóëüòàò îñòàíîâà ñîõðàíÿåì â îòäåëüíóþ ïåðåìåííóþ }
stoperr:= X502_StreamsStop(hnd);
if err = X502_ERR_OK then
err:= stoperr;
end;
end;
end.
@@ -0,0 +1,24 @@
Данный пример демонстрирует работу с модулеми L502 и E502 из среды Delphi.
Пример содержит файл проекта для среды "Delphi 7" (x502_example.dpr) и для
среды "Embarcadero Delphi XE" (x502_example.dproj).
В последнем проекте также добавлена платформа Win64, для сборки 64-битных приложений.
В проекте необходимо указать путь к файлам x502api.pas, l502api.pas и e502api.pas,
которые устанавливаются вместе с SDK в SDK_DIR/pas
Путь можно задать следующим образом:
Delphi 7 - "Project->Options->Directories/Conditionals->Search path",
Delphi XE - "Project->Options->Delphi Compiler->Search path"
Проект демонстрирует в первую очередь как можно работать с модулями L502 и E502, а не как нужно программировать
в среде Delphi.
Пример аналогичен примеру для "Borland C++ Builder" и демонстрирует синхронный потоковый
ввод с АЦП для трех логических каналов с возможностью запуска синхронного ввода с цифроых линий, а так же
асинхронный ввод/вывод для цифровых линий, ЦАП и асинхронный ввод одного кадра АЦП.
Синхронный ввод осуществляется в отдельном потоке (TX502_ProcessThread), который создается
и запускается по нажатию кнопки. В потоке осуществляется прием, обработка данных и вывод их
на индикаторы (указатели на элементы индикаторов сохраняются в объекте потока перед его запуском).
@@ -0,0 +1,141 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=1
UnsafeCode=1
UnsafeCast=1
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=c:\Program Files (x86)\L-Card\lpcie\pas\
Packages=vcl;rtl;dbrtl;inet;inetdb;dsnap;bdertl;vclx;vcldb;vcldbx;visualclx;visualdbclx;vclactnband;vclshlctrls;vclie;xmlrtl;inetdbbde;inetdbxpress;webdsnap;soaprtl;websnap;adortl;dbexpress;dsnapcon;dbxcds;ibxpress;teeui;teedb;tee;dss;indy;VclSmp;qrpt;teeqr;Rave50CLX;Rave50VCL;IntrawebDB_50_70;Intraweb_50_70;VclNewlyext
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1033
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=c:\Program Files (x86)\L-Card\lpcie\pas\
@@ -0,0 +1,14 @@
program x502_example;
uses
Forms,
MainUnit in 'MainUnit.pas' {MainForm},
X502_ProcessThread in 'X502_ProcessThread.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
@@ -0,0 +1,119 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{7C3D1E6C-FE9D-4A33-89CC-FFA83DED1261}</ProjectGuid>
<MainSource>x502_example.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>15.4</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<SanitizedProjectName>x502_example</SanitizedProjectName>
<DCC_K>false</DCC_K>
<DCC_UsePackage>vcl;rtl;dbrtl;inet;inetdb;dsnap;bdertl;vclx;vcldb;vcldbx;visualclx;visualdbclx;vclactnband;vclshlctrls;vclie;xmlrtl;inetdbbde;inetdbxpress;webdsnap;soaprtl;websnap;adortl;dbexpress;dsnapcon;dbxcds;ibxpress;teeui;teedb;tee;dss;indy;VclSmp;qrpt;teeqr;Rave50CLX;Rave50VCL;IntrawebDB_50_70;Intraweb_50_70;VclNewlyext;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo>
<DCC_F>false</DCC_F>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)</DCC_Namespace>
<DCC_ImageBase>00400000</DCC_ImageBase>
<DCC_E>false</DCC_E>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_UNSAFE_CAST>true</DCC_UNSAFE_CAST>
<DCC_DebugInformation>1</DCC_DebugInformation>
<DCC_N>true</DCC_N>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0</VerInfo_Keys>
<DCC_UNSAFE_CODE>true</DCC_UNSAFE_CODE>
<DCC_UnitSearchPath>c:\Program Files (x86)\L-Card\lpcie\pas\;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UNSAFE_TYPE>true</DCC_UNSAFE_TYPE>
<DCC_S>false</DCC_S>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<Icon_MainIcon>x502_example_Icon.ico</Icon_MainIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<Icon_MainIcon>x502_example_Icon.ico</Icon_MainIcon>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="MainUnit.pas">
<Form>MainForm</Form>
</DCCReference>
<DCCReference Include="X502_ProcessThread.pas"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">x502_example.dpr</Source>
</Source>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>
Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,11 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN с одновременной выдачей
предварительно загруженного циклического сигнала на ЦАП на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT e502_eth_svc_browse)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api e502api)
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e502_eth_svc_browse", "e502_eth_svc_browse.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="e502_eth_svc_browse"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="e502_eth_svc_browse"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,205 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую, как можно выполнить поиск устройств E502 в локальной сети.
Пример запускается и непрерывно отслеживает появление (или исчезновение)
устройств в локальной сети, выводя информацию на консоль.
Поиск выполняется до нажатия любой клавиши на Windows или CTRL+C на Linux.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "e502api.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define INST_NAME_PRINT_FMT "%ls"
#else
#define INST_NAME_PRINT_FMT "%s"
#endif
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
int32_t stop_err;
uint32_t ver;
t_e502_eth_svc_browse_hnd browse_hnd;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/* Начинаем процесс поиска устройств в локальной сети */
err = E502_EthSvcBrowseStart(&browse_hnd, 0);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска поиска устройств в сети (%d): %s\n",
err, X502_GetErrorString(err));
} else {
printf("Запущен поиск устройств в локальной сети. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
while (!f_out && (err == X502_ERR_OK)) {
t_e502_eth_svc_record_hnd svc_rec;
uint32_t event;
/* пробуем получить запись, сообщающую о изменении информации о подулюенных
* устройтсвах */
err = E502_EthSvcBrowseGetEvent(browse_hnd, &svc_rec, &event, NULL, 300);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения записи о найденном устройстве (%d): %s\n",
err, X502_GetErrorString(err));
} else if (event != E502_ETH_SVC_EVENT_NONE) {
char inst_name[X502_INSTANCE_NAME_SIZE];
char dev_serial[X502_SERIAL_SIZE];
uint32_t addr;
int32_t cur_err;
#ifdef _WIN32
WCHAR inst_name_w[X502_INSTANCE_NAME_SIZE];
#endif
/* значение события, отличное от E502_ETH_SVC_EVENT_NONE, говорит
* о том, что изменение произошло. Для каждого события мы можем
* получить имя экземпляра и сер. номер устройства, для которого
* произошло событие */
cur_err = E502_EthSvcRecordGetInstanceName(svc_rec, inst_name);
if (cur_err == X502_ERR_OK)
cur_err = E502_EthSvcRecordGetDevSerial(svc_rec, dev_serial);
#ifdef _WIN32
if (cur_err == X502_ERR_OK) {
/* Имя устройства всегда в кодировке UTF-8. В Windows для
* представления юникодных строк используется формат UTF16
* и строка представляется в виде массива WCHAR.
* Для перевода используем функцию преобразования */
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, inst_name,
-1, inst_name_w, X502_INSTANCE_NAME_SIZE)==0) {
cur_err = X502_ERR_INSTANCE_NAME_ENCODING;
}
}
#endif
if (cur_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения параметров устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
} else {
if ((event == E502_ETH_SVC_EVENT_ADD) ||
(event == E502_ETH_SVC_EVENT_CHANGED)) {
/* События ADD и CHANGE означают, что устройство присутствует,
* и мы можем получить IP-адрес устройства */
cur_err = E502_EthSvcRecordResolveIPv4Addr(svc_rec, &addr, 4000);
if (cur_err == X502_ERR_OK) {
printf("%s: " INST_NAME_PRINT_FMT ", S/N: %s, Адрес = %d.%d.%d.%d\n",
event == E502_ETH_SVC_EVENT_ADD ? "Новое устройтсво" : "Изм. параметров",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial,
(addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
(addr >> 8) & 0xFF, addr & 0xFF
);
fflush(stdout);
} else {
fprintf(stderr, "Ошибка получения адреса устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
}
} else if (event == E502_ETH_SVC_EVENT_REMOVE) {
printf("Устройство отключено: " INST_NAME_PRINT_FMT ", S/N: %s\n",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial);
}
}
/* Для всех событий, кроме NONE, выделяется запись, которую
* нужно освободить вручную */
E502_EthSvcRecordFree(svc_rec);
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#endif
}
stop_err = E502_EthSvcBrowseStop(browse_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова поиска сервисов (%d): %s\n",
stop_err, X502_GetErrorString(stop_err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Останов поиска сервисов выполнен успешно!\n");
}
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -lx502api -le502api -o e502_eth_svc_browse
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.6)
set(PROJECT e502_timestamp_stream)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
@@ -0,0 +1,681 @@
/*
Пример работы с модулями E502-P1 поддерживающими механизм синхронизации времени по протоколу PTP.
Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу синхронного
ввода данных с АЦП и цифровых линий, а также работу с потоком данных включающим в себя метки времени.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include "x502tstp.h"
#include "../../devs/e502/e502_fpga_regs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <inttypes.h>
#include "x502api_private.h"
#define STREAM_IN_WRD_TYPE(wrd) wrd & 0x80000000 ? STREAM_IN_WRD_ADC : \
(wrd & 0xFF000000) == 0x0 ? STREAM_IN_WRD_DIN : \
(wrd & 0xF0000000) == 0x40000000 ? STREAM_IN_WRD_TSP : \
((wrd & 0xFF000000)>>24) == 0x01 ? STREAM_IN_WRD_MSG : STREAM_IN_WRD_USR
#ifdef _WIN32
#define CLOCK_MONOTONIC 1
int clock_gettime(int a, struct timespec *spec) {
__int64 wintime; GetSystemTimeAsFileTime((FILETIME*)&wintime);
wintime -=116444736000000000i64; //1jan1601 to 1jan1970
spec->tv_sec =wintime / 10000000i64; //seconds
spec->tv_nsec =wintime % 10000000i64 *100; //nano-seconds
return 0;
}
#endif
#define NSEC_PER_SEC 1000000000
void timespec_diff(struct timespec *a, struct timespec *b,
struct timespec *result) {
result->tv_sec = a->tv_sec - b->tv_sec;
result->tv_nsec = a->tv_nsec - b->tv_nsec;
if (result->tv_nsec < 0) {
--result->tv_sec;
result->tv_nsec += NSEC_PER_SEC;
}
}
double timespec_to_double(struct timespec *ts)
{
return ((double)(ts->tv_sec) + ((double)(ts->tv_nsec) / NSEC_PER_SEC));
}
/* признак необходимости завершить сбор данных */
static int f_out = 0;
/* количество используемых логических каналов */
#define ADC_LCH_CNT 1
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 1000000
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 1000000
#define ENABLE_ADC
#define ENABLE_DIN
// при ADC_FREQ==2000000 и DIN_FREQ==1000000 через Ethernet обязательно будет X502_STREAM_IN_MSG_OVERFLOW
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*66*3
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10};
t_x502_hnd g_hnd = NULL;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, uint32_t *ip_addr_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
//L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt + usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr(&rec_list[fnd_devcnt], ip_addr_list[i],0, TCP_CONNECTION_TOUT) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
uint32_t *ip_addr_list = NULL;
uint32_t ip_cnt = 0;
t_x502_hnd hnd = NULL;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_addr_list = malloc((argc-1) * sizeof(ip_addr_list[0]));
if (ip_addr_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_addr_list[ip_cnt++] = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_addr_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_addr_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
int streams = 0;
#ifdef ENABLE_ADC
streams |= X502_STREAM_ADC;
#endif
#ifdef ENABLE_DIN
streams |= X502_STREAM_DIN;
#endif
err = X502_StreamsEnable(hnd, streams);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
g_hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (g_hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(g_hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(g_hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/*err = X502_FpgaRegRead(g_hnd, E502_REGS_ARM_BLOCK, &val);
if (err) {
printf("X502_FpgaRegRead err=%d\n", err);
} else {
printf("X502_FpgaRegRead(E502_REGS_ARM_BLOCK) = %d\n", val);
} */
// Включаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 1);
X502_FpgaRegWrite(g_hnd, E502_REGS_IOHARD_GO_SYNC_IO, 0);
X502_FpgaRegWrite(g_hnd, E502_REGS_BF_CTL, X502_REGBIT_BF_CTL_BF_RESET_Msk);
X502_SetSyncMode(g_hnd, X502_SYNC_INTERNAL);
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(g_hnd);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
struct timespec start_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
int32_t g_rcv_cnt = 0;
int cntr = 0;
int rcv_cntr = 0;
t_x502_tstp_state tstp_state;
X502_tstp_init(&tstp_state, ADC_FREQ, DIN_FREQ);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
uint32_t adc_wrd_num = 0;
uint32_t din_wrd_num = 0;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static uint32_t snd_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
int i;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(g_hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
continue;
}
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
g_rcv_cnt += rcv_size;
int error = 0;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5) {
//printf("rcv speed=%lld wrds/sec cntr=%x\n", (g_rcv_cnt) / (cur_time.tv_sec - start_time.tv_sec), rcv_cntr);
start_time.tv_sec = cur_time.tv_sec;
g_rcv_cnt = 0;
}
for (i = 0; i < rcv_size; i++) {
uint32_t cur_wrd = rcv_buf[i];
uint64_t cur_wrd_time;
t_stream_in_wrd_type type = STREAM_IN_WRD_TYPE(cur_wrd);
X502_tstp_process_wrd(&tstp_state, cur_wrd);
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time) ;
/* проверяем - это данные от АЦП или цифровых входов */
if (type == STREAM_IN_WRD_DIN) {
uint16_t din_wrd;
static bool last_din_wrd_initialized = false;
static uint16_t last_din_wrd;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, DIN wrd unexpected!\n");
break;
}
din_wrd = din_data[din_wrd_num];
din_wrd_num++;
#define DIN_PPS_MASK 1
if (!last_din_wrd_initialized) {
last_din_wrd = din_wrd;
last_din_wrd_initialized = true;
} else
if ((din_wrd & DIN_PPS_MASK) != (last_din_wrd & DIN_PPS_MASK) && (din_wrd & DIN_PPS_MASK)) {
// дождались положительный фронт сигнала PPS на ножке DI1
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("DIN PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("DIN PPS positive edge pediod = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period), TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
last_din_wrd = din_wrd;
} else
if (type == STREAM_IN_WRD_ADC) {
static uint16_t last_adc_wrd;
register uint32_t wrd = rcv_buf[i];
double adc_val;
static bool adc_wait_for_edge = false;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, ADC wrd unexpected!\n");
break;
}
adc_val = adc_data[adc_wrd_num];
adc_wrd_num++;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
if (adc_wait_for_edge) {
if (adc_val > 2.4) {
// дождались положительный фронт сигнала PPS на 1 канале ADC
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
adc_wait_for_edge = false;
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("ADC PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("ADC PPS positive edge period = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period),
TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
} else
if (adc_val < 2.3) {
adc_wait_for_edge = true;
}
}
rcv_cntr++;
}
#if 0
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
int adc_data_num = 0;
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
#endif
if ((tstp_state.dinwrds_after_tstp / DIN_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.dinwrds_after_tstp / DIN_FREQ);
}
if ((tstp_state.adcwrds_after_tstp / ADC_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.adcwrds_after_tstp / ADC_FREQ);
}
continue;
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (_kbhit())
f_out = 1;
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(g_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
// Выключаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 0);
}
/* закрываем связь с модулем */
X502_Close(g_hnd);
/* освобождаем описатель */
X502_Free(g_hnd);
}
return err;
}
@@ -0,0 +1,33 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DL502API_INCLUDE_DIR=<путь к заголовочным файлам l502api> -DL502API_LIBRARIES_DIR=<путь к файлу линкера l502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DL502API_INCLUDE_DIR и -DL502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_cycle_out)
project(${PROJECT} C)
set(SOURCES main.c ../common/dev_funcs.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
if(CMAKE_COMPILER_IS_GNUCC)
target_link_libraries(${PROJECT} m)
endif(CMAKE_COMPILER_IS_GNUCC)
+296
View File
@@ -0,0 +1,296 @@
/* Данный пример демонстрирует возможность установки циклического сигнала на
вывод в модуль E16 / E502 / L502 (ввод не используется вообще).
В примере определена таблица сигналов, которая задает несколько
комбинаций сигналов для примера. Каждый сигнал задается количеством точек
на период (общее значение для всех трех сигналов), амплитудой для ЦАП'ов и
функцией для генерации очередного отсчета по его номеру и полному размеру.
Пользовтель может ввести номер сигнала, которых он хочет выставить и нажать Enter - и этот
сигнал будет выставлен на выходе.
Смена сигнала происходит по концу периода предыдущего.
Надо также помнить, что хотя мы можем загружать новый сигнал на фоне вывода
предыдущего, однако сразу после выполнения L502_OutCycleSetup() до того
времени как реально произойдет смена старого сигнала на новый нельзя
начинать загружать еще один новый сигнал.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в коментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файл l502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Доболнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dev_funcs.h"
#define TCP_CONNECTION_TOUT 5000
#define OUT_SIGNAL_SIZE 2000
#define OUT_BLOCK_SIZE 256
#define SEND_TOUT 500
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
typedef double (*f_gen_sig_word)(uint32_t cntr, uint32_t total_size, double amp);
typedef uint32_t (*f_gen_dout_word)(uint32_t cntr, uint32_t total_size);
/* структура, задающая сигналы на 2-х каналах ЦАП и/или1
1на DOUT */
typedef struct {
uint32_t size; /* количество точек в сигнале */
double amp_dac1; /* амплитуда сигнала для ЦАП1 */
f_gen_sig_word gen_func_dac1; /* функция для генерации отсчета для ЦАП1 */
double amp_dac2; /* амплитуда сигнала для ЦАП2 */
f_gen_sig_word gen_func_dac2; /* функция для генерации отсчета для ЦАП2 */
f_gen_dout_word gen_dout; /* функция для генерации слова на цифровой вывод */
} t_sig_struct;
/* генерация пилы на весь период */
static double f_gen_saw(uint32_t cntr, uint32_t total_size, double amp) {
return amp*( (int32_t)(cntr%total_size)-(int32_t)total_size/2)/(total_size/2);
}
/* генерация синуса на весь период */
static double f_gen_sin(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*M_PI*cntr/total_size);
}
/* генерация тестового честчика */
static double f_gen_cntr(uint32_t cntr, uint32_t total_size, double amp) {
return cntr + 0x123;
}
/* генерация синуса с периодом в два раза меньше периоду определяемому размером буфера */
static double f_gen_sin2(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*2*M_PI*cntr/total_size);
}
/* генерация меандра на всех выходах путем выдачи в первой половине на выходы 0xAA, а на второй 0x55 */
static uint32_t f_gen_dout_meander(uint32_t cntr, uint32_t total_size) {
return cntr < total_size/2 ? 0xAA : 0x55;
}
/* генерация счетчика на цифроых выхоах*/
static uint32_t f_gen_dout_cntr(uint32_t cntr, uint32_t total_size) {
return cntr;
}
/* таблица, задающая сигналы для выдачи на вход */
/* для модуля E16 частота выходного сигнала будет в 2 раза меньше, т.к. частота ЦАП 500КГц протип 1МГц у E502 */
static t_sig_struct f_sig_tbl[] = {
{100000, X502_DAC_RANGE, f_gen_saw, 0, NULL, NULL}, /* пила на одном канале с частотой 10 Гц */
{2000, X502_DAC_RANGE, f_gen_sin, 0, NULL, NULL}, /* синусоидальный сигнал на одном канале с частотой 500 Гц */
{100, X502_DAC_RANGE/2, f_gen_sin, X502_DAC_RANGE, f_gen_saw, NULL}, /* синус ампл. 2.5 и пила по 10 КГц */
{50, 0, NULL, X502_DAC_RANGE, f_gen_sin, f_gen_dout_cntr}, /* синус только на втором канале с частотой 20 КГц */
{2550, 1.5, f_gen_sin, 2.5, f_gen_sin2, f_gen_dout_meander}, /* на втором канале синус с частотой в 2 раза больше. меандр на цифровых линиях */
};
/* Запись в буфер драйвера блока данных от сигнала
cntr - номер отчета, соответствующего первому отсчету блока
size - количество отсчетов на канал (т.е. записывается ch_cnt*size отсчетов)
sig - номер сигнала
ch_cnt - кол-во используемых каналов (это кол-во можно определить по f_sig_tbl[sig],
но так как мы его уже определили, то передаем сюда, чтобы опять не определять */
static int32_t f_load_block(t_x502_hnd hnd, uint32_t cntr, uint32_t size, uint32_t sig, uint32_t ch_cnt) {
static double dac_data1[OUT_BLOCK_SIZE], dac_data2[OUT_BLOCK_SIZE];
static uint32_t dout_data[OUT_BLOCK_SIZE];
/* массив слов на запись в модуль - содержит смешенные подготовленные данные
для всех каналов (максимум для 3-х - 2 ЦАП + DOUT) */
static uint32_t sbuf[3*OUT_BLOCK_SIZE];
uint32_t i;
int32_t err = 0;
/* заполняем массив на вывод */
for (i=0; i < size; i++) {
if (f_sig_tbl[sig].gen_func_dac1 != NULL) {
dac_data1[i] = f_sig_tbl[sig].gen_func_dac1(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac1);
}
if (f_sig_tbl[sig].gen_func_dac2 != NULL) {
dac_data2[i] = f_sig_tbl[sig].gen_func_dac2(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac2);
}
if (f_sig_tbl[sig].gen_dout != NULL) {
dout_data[i] = f_sig_tbl[sig].gen_dout(cntr+i, f_sig_tbl[sig].size);
}
}
/* Если нужная функция определена, значит мы испоьлзуем этот канал, и
* подаем на вход сформированный массив. Иначе - канал не используется
* и передаем на вход NULL */
err = X502_PrepareData(hnd,
f_sig_tbl[sig].gen_func_dac1 ? dac_data1 : NULL,
f_sig_tbl[sig].gen_func_dac2 ? dac_data2 : NULL,
f_sig_tbl[sig].gen_dout ? dout_data : NULL,
size, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR,
sbuf);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка подкотовки данных на передачу: %s\n",
X502_GetErrorString(err));
} else {
/* посылаем данные */
int32_t snd_cnt = X502_Send(hnd, sbuf, size*ch_cnt, SEND_TOUT);
if (snd_cnt < 0) {
err = snd_cnt;
fprintf(stderr, "Ошибка передачи данных: %s\n", X502_GetErrorString(err));
} else if ((uint32_t)snd_cnt != size*ch_cnt) {
/* так как мы шлем всегда не больше чем готово, то должны
всегда передать все */
fprintf(stderr, "Переданно недостаточно данных: передавали = %d, передано = %d\n",
size*ch_cnt, snd_cnt);
err = X502_ERR_SEND_INSUFFICIENT_WORDS;
}
}
return err;
}
static int32_t f_load_cycle_signal(t_x502_hnd hnd, int sig) {
int32_t err = 0;
uint32_t cntr = 0;
uint32_t ch_cnt=0;
/* определяем, сколько каналов используем */
if (f_sig_tbl[sig].gen_func_dac1)
ch_cnt++;
if (f_sig_tbl[sig].gen_func_dac2)
ch_cnt++;
if (f_sig_tbl[sig].gen_dout)
ch_cnt++;
/* задаем размер буфера под все каналы! */
err = X502_OutCycleLoadStart(hnd, f_sig_tbl[sig].size*ch_cnt);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка старта загрузки данных: %s!", X502_GetErrorString(err));
/* в примере показано, что загружать можно поблочно, чтобы не выделять
* большой размер памяти на весь сигнал в программе. Но можно записать
* весь сигнал и за один L502_Send() */
while ((cntr != f_sig_tbl[sig].size) && (err == X502_ERR_OK)) {
uint32_t block_size = OUT_BLOCK_SIZE;
/* последний блок может быть меньшего размера, если размер буфера не кратен
* блоку */
if (block_size >(f_sig_tbl[sig].size-cntr))
block_size=f_sig_tbl[sig].size-cntr;
err = f_load_block(hnd, cntr, block_size, sig, ch_cnt);
if (!err)
cntr+=block_size;
}
/* делаем активным загруженный сигнал */
if (err == X502_ERR_OK) {
err = X502_OutCycleSetup(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка установки циклического сигнала: %s!", X502_GetErrorString(err));
}
return err;
}
int main(int argc, char **argv) {
int32_t err = 0;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifdef _WIN32
/* устанавливаем локаль, чтобы можно было выводить по-русски в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = select_dev_from_list(argc, argv, 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* Разрешаем все каналы на вывод (в этом примере мы не будем
использовать асинхронный вывод), а какие каналы реально будут
использованы определяем когда подаем данные в L502_PrepareData */
err = X502_StreamsEnable(hnd, X502_STREAM_ALL_OUT);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка разрешения потоков (%d): %s!", err,
X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
/* если хотим, то можем загрузить синхнал до разрешения
* синхронного ввода. Тогда мы могли бы его запустить, наприемер,
всесте с АЦП по L502_StreamsStart() */
err = f_load_cycle_signal(hnd, 1);
/* разрешаем синхронный ввод. В принципе можно его разрешить только
* после загрузки первого синала в нашем примере. Но данный пример
* показывает что мы можем сделать это и до выставления сигнала,
* например если захотим запустить ввод АЦП до того как будет нужно
* подать циклический сигнал на вывод */
if (err == X502_ERR_OK)
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
int exit = 0;
printf("Введите одно из следующего:\n");
printf(" число от 1 до %d - установить сигнал с указанным номером\n",
(int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])));
printf(" s или stop - останов генерации сигнала\n");
printf(" e или exit - выход из программы\n");
/* Цикл ввода команд */
while (!err && !exit) {
char cmd[512];
printf(">");
fflush(stdout);
scanf("%s", cmd);
if (!strcmp(cmd, "exit") || !strcmp(cmd,"e")) {
exit=1;
} else if (!strcmp(cmd, "stop")||!strcmp(cmd,"s")) {
err = X502_OutCycleStop(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова циклического сигнала (%d): %s\n",
err, X502_GetErrorString(err));
}
} else {
int sig = atoi(cmd);
if ((sig <= 0) || (sig > (int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])))) {
fprintf(stderr, "Неверный номер сигнала или неизвестная команда\n");
} else {
err = f_load_cycle_signal(hnd, sig-1);
}
}
}
X502_StreamsStop(hnd);
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_cycle_out
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_cycle_out", "x502_cycle_out.vcproj", "{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.ActiveCfg = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.Build.0 = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.ActiveCfg = Release|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_cycle_out"
ProjectGUID="{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
RootNamespace="x502_cycle_out"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_stream_read)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
+501
View File
@@ -0,0 +1,501 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу с модулями E16, L502 и E502 на примере синхронного
ввода данных с АЦП и цифровых линий.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам PCI-Express и USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 E16:192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Для указания что ip адрес принадлежит модулю E16, адрес надо указать с префиксом, пример: E16:192.168.1.6
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include <l502api.h>
#include "e502api.h"
//#include "dev_funcs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#endif
#include <stdio.h>
#include <stdlib.h>
/* количество используемых логических каналов */
#define ADC_LCH_CNT 3
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 500000
/* частота кадров (на логический канал). При ADC_FREQ/ADC_LCH_CNT - межкадровой задержки нет */
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 500000
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*200
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0,4,6};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10, X502_ADC_RANGE_10, X502_ADC_RANGE_10};
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
char const *DEV_E502 = "E502";
char const *DEV_E16 = "E16";
typedef struct {
uint32_t ip_addr;
char const *devname;
} ip_dev_list_t;
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, ip_dev_list_t *ip_dev_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
uint32_t e16_usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
E16_UsbGetDevRecordsList(NULL, 0, 0, &e16_usb_devcnt);
if ((pci_devcnt+usb_devcnt + e16_usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt +e16_usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E16, подключенных по USB, в конец массива */
if (e16_usb_devcnt!=0) {
int32_t res = E16_UsbGetDevRecordsList(&rec_list[fnd_devcnt], e16_usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr2(&rec_list[fnd_devcnt], ip_dev_list[i].ip_addr, 0, TCP_CONNECTION_TOUT, ip_dev_list[i].devname) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
t_x502_hnd hnd = NULL;
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
ip_dev_list_t *ip_dev_list = NULL;
uint32_t ip_cnt = 0;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_dev_list = malloc((argc - 1) * sizeof(ip_dev_list[0]));
if (ip_dev_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E502;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
} else
if (sscanf(argv[i], "E16:%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E16;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_dev_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_dev_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
err = X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DIN);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
/* результат меньше нуля означает ошибку */
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
} else if (rcv_size > 0) {
uint32_t first_lch;
/* получаем номер логического канала, которому соответствует первый отсчет АЦП в массиве */
X502_GetNextExpectedLchNum(hnd, &first_lch);
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
} else {
uint32_t lch;
printf("Блок %3d. Обработано данных АЦП = %d, цифровых входов = %d\n",
block, adc_size, din_size);
/* если приняли цифровые данные - выводим первый отсчет */
if (din_size != 0)
printf(" din_data = 0x%05X\n", din_data[0]);
/* выводим по одному отсчету на канал. если обработанный блок
начинается не с начала кадра, то в данном примере для
вывода берем конец неполного кадра и начало следующего */
for (lch=0; lch < ADC_LCH_CNT; lch++) {
/* определяем позицию первого отсчета, соответствующего заданному логическому каналу:
либо с конца не полного кадра, либо из начала следующего */
uint32_t pos = lch >= first_lch ? lch - first_lch : ADC_LCH_CNT-first_lch + lch;
if (pos <= adc_size) {
printf(" lch[%d]=%6.4f\n", lch, adc_data[pos]);
} else {
printf(" lch[%d]= ---- \n", lch);
}
}
printf("\n");
fflush(stdout);
}
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#else
{
// по нажатию Enter включаем/выключаем поток ADC
fd_set fds;
struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
if (select(1, &fds, NULL, NULL, &tv) == 1) {
int x;
static int adc_disabled = 0;
int ch;
if (adc_disabled) {
X502_StreamsEnable(hnd, X502_STREAM_ADC);
} else {
X502_StreamsDisable(hnd, X502_STREAM_ADC);
}
adc_disabled = !adc_disabled;
while(select(1, &fds, NULL, NULL, &tv) == 1) {
read(STDIN_FILENO, &ch, 1);
}
}
}
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_stream_read
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_stream_read", "x502_stream_read.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_stream_read"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="x502_stream_read"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,84 @@
using System;
using System.Net;
using lpcieapi;
using x502api;
/* Данный пример представляет из себя консольную программу на языке C#,
демонстрирующую, как можно выполнить поиск устройств E502 в локальной сети.
Пример запускается и непрерывно отслеживает появление (или исчезновение)
устройств в локальной сети, выводя информацию на консоль.
Поиск выполняется до нажатия любой клавиши. */
namespace e502_eth_svc_browse
{
class Program
{
static void Main(string[] args)
{
/* функции для поиска представлены в виде методов отдельного класса EthSvcBrowser */
E502.EthSvcBrowser sb = new E502.EthSvcBrowser();
/* запуск поиска сервисов */
lpcie.Errs err = sb.Start();
if (err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка запуска поиска устройств в сети {0}: {1}", err, X502.GetErrorString(err));
}
else
{
bool end = false;
Console.WriteLine("Запущен поиск устройств в локальной сети. Для останова нажмите любую клавишу");
while (!end && (err == lpcie.Errs.OK))
{
E502.EthSvcEvent svc_evt;
/* Метод EthSvcRecord предоставляет доступ ко функциям для работы с описателем сервиса.
* В отличие от С не нужно освобождать память вручную, т.к. освобождение выполняется
* в деструкторе */
E502.EthSvcRecord svc_rec;
err = sb.GetEvent(out svc_rec, out svc_evt, 300);
if (err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка получения записи о найденном устройстве {0}: {1}", err, X502.GetErrorString(err));
}
else if (svc_evt != E502.EthSvcEvent.NONE)
{
/* Адрес мы можем получить только для присутствующего устройства */
if ((svc_evt == E502.EthSvcEvent.ADD) || (svc_evt == E502.EthSvcEvent.CHANGED))
{
IPAddress addr;
lpcie.Errs cur_err = svc_rec.ResolveIPv4Addr(out addr, 2000);
if (cur_err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка получения IP-адреса устройтсва {0}: {1}", cur_err, X502.GetErrorString(cur_err));
}
else
{
Console.WriteLine("{0}: {1}, S/N: {2}, Адрес = {3}", svc_evt == E502.EthSvcEvent.ADD ?
"Новое устройтсво" : "Изм. параметров", svc_rec.InstanceName, svc_rec.DevSerial, addr.ToString());
}
}
else if (svc_evt == E502.EthSvcEvent.REMOVE)
{
Console.WriteLine("Устройство отключено: {0}, S/N: {1}", svc_rec.InstanceName, svc_rec.DevSerial);
}
}
/* вход по нажатию клавиши */
if (Console.KeyAvailable)
end = true;
}
lpcie.Errs stop_err = sb.Stop();
if (stop_err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка останова поиска сервисов {0}: {1}", stop_err, X502.GetErrorString(stop_err));
}
else
{
Console.WriteLine("Останов поиска сервисов выполнен успешно!\n");
}
}
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("e502_eth_svc_browse")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("e502_eth_svc_browse")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c7548c80-fc0f-4cb6-a4ed-355b7e40c86d")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{714093CB-3EAA-464F-9D27-8E91381E0651}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>e502_eth_svc_browse</RootNamespace>
<AssemblyName>e502_eth_svc_browse</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="lpcieNet, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lpcieNet\bin\Release\lpcieNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+955
View File
@@ -0,0 +1,955 @@
namespace x502_example
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.btnRefreshDeviceList = new System.Windows.Forms.Button();
this.cbbSerialList = new System.Windows.Forms.ComboBox();
this.btnOpen = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.edtPldaVer = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.edtFpgaVer = new System.Windows.Forms.TextBox();
this.chkBfPresent = new System.Windows.Forms.CheckBox();
this.chkGalPresent = new System.Windows.Forms.CheckBox();
this.chkDacPresent = new System.Windows.Forms.CheckBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.btnSetAdcFreq = new System.Windows.Forms.Button();
this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.edtDinFreq = new System.Windows.Forms.TextBox();
this.edtAdcFreqLch = new System.Windows.Forms.TextBox();
this.edtAdcFreq = new System.Windows.Forms.TextBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.chkSyncDin = new System.Windows.Forms.CheckBox();
this.edtDin_Result = new System.Windows.Forms.TextBox();
this.edtLCh3_Result = new System.Windows.Forms.TextBox();
this.edtLCh2_Result = new System.Windows.Forms.TextBox();
this.cbbLCh3_Mode = new System.Windows.Forms.ComboBox();
this.label10 = new System.Windows.Forms.Label();
this.cbbLCh3_Range = new System.Windows.Forms.ComboBox();
this.cbbLCh2_Mode = new System.Windows.Forms.ComboBox();
this.cbbLCh3_Channel = new System.Windows.Forms.ComboBox();
this.label9 = new System.Windows.Forms.Label();
this.cbbLCh2_Range = new System.Windows.Forms.ComboBox();
this.label8 = new System.Windows.Forms.Label();
this.cbbLCh2_Channel = new System.Windows.Forms.ComboBox();
this.edtLCh1_Result = new System.Windows.Forms.TextBox();
this.cbbLCh1_Mode = new System.Windows.Forms.ComboBox();
this.cbbLCh1_Range = new System.Windows.Forms.ComboBox();
this.label7 = new System.Windows.Forms.Label();
this.cbbLCh1_Channel = new System.Windows.Forms.ComboBox();
this.label6 = new System.Windows.Forms.Label();
this.cbbLChCnt = new System.Windows.Forms.ComboBox();
this.btnStart = new System.Windows.Forms.Button();
this.btnStop = new System.Windows.Forms.Button();
this.btnAsyncAdcFrame = new System.Windows.Forms.Button();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.cbbSyncStartMode = new System.Windows.Forms.ComboBox();
this.label12 = new System.Windows.Forms.Label();
this.cbbSyncMode = new System.Windows.Forms.ComboBox();
this.label11 = new System.Windows.Forms.Label();
this.btnAsyncDigIn = new System.Windows.Forms.Button();
this.btnAsyncDigOut = new System.Windows.Forms.Button();
this.btnAsyncDac1 = new System.Windows.Forms.Button();
this.btnAsyncDac2 = new System.Windows.Forms.Button();
this.edtAsyncDigIn = new System.Windows.Forms.TextBox();
this.edtAsyncDigOut = new System.Windows.Forms.TextBox();
this.edtAsyncDac1 = new System.Windows.Forms.TextBox();
this.edtAsyncDac2 = new System.Windows.Forms.TextBox();
this.chkEthSupport = new System.Windows.Forms.CheckBox();
this.label13 = new System.Windows.Forms.Label();
this.edtMcuVer = new System.Windows.Forms.TextBox();
this.edtIpAddr = new System.Windows.Forms.TextBox();
this.btnOpenByIP = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
this.SuspendLayout();
//
// btnRefreshDeviceList
//
this.btnRefreshDeviceList.Location = new System.Drawing.Point(27, 12);
this.btnRefreshDeviceList.Name = "btnRefreshDeviceList";
this.btnRefreshDeviceList.Size = new System.Drawing.Size(212, 23);
this.btnRefreshDeviceList.TabIndex = 0;
this.btnRefreshDeviceList.Text = "Обновить список модулей";
this.btnRefreshDeviceList.UseVisualStyleBackColor = true;
this.btnRefreshDeviceList.Click += new System.EventHandler(this.btnRefreshDeviceList_Click);
//
// cbbSerialList
//
this.cbbSerialList.FormattingEnabled = true;
this.cbbSerialList.Location = new System.Drawing.Point(258, 14);
this.cbbSerialList.Name = "cbbSerialList";
this.cbbSerialList.Size = new System.Drawing.Size(139, 21);
this.cbbSerialList.TabIndex = 1;
//
// btnOpen
//
this.btnOpen.Location = new System.Drawing.Point(27, 55);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(212, 23);
this.btnOpen.TabIndex = 2;
this.btnOpen.Text = "Установить связь с модулем";
this.btnOpen.UseVisualStyleBackColor = true;
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.label13);
this.groupBox1.Controls.Add(this.edtMcuVer);
this.groupBox1.Controls.Add(this.chkEthSupport);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.edtPldaVer);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.edtFpgaVer);
this.groupBox1.Controls.Add(this.chkBfPresent);
this.groupBox1.Controls.Add(this.chkGalPresent);
this.groupBox1.Controls.Add(this.chkDacPresent);
this.groupBox1.Location = new System.Drawing.Point(258, 40);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(230, 183);
this.groupBox1.TabIndex = 3;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Информация о модуле";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(74, 131);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(128, 13);
this.label2.TabIndex = 8;
this.label2.Text = "Версия прошивки PLDA";
//
// edtPldaVer
//
this.edtPldaVer.Enabled = false;
this.edtPldaVer.Location = new System.Drawing.Point(6, 128);
this.edtPldaVer.Name = "edtPldaVer";
this.edtPldaVer.Size = new System.Drawing.Size(62, 20);
this.edtPldaVer.TabIndex = 7;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(74, 105);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(131, 13);
this.label1.TabIndex = 6;
this.label1.Text = "Версия прошивки ПЛИС";
//
// edtFpgaVer
//
this.edtFpgaVer.Enabled = false;
this.edtFpgaVer.Location = new System.Drawing.Point(6, 102);
this.edtFpgaVer.Name = "edtFpgaVer";
this.edtFpgaVer.Size = new System.Drawing.Size(62, 20);
this.edtFpgaVer.TabIndex = 5;
//
// chkBfPresent
//
this.chkBfPresent.AutoSize = true;
this.chkBfPresent.Enabled = false;
this.chkBfPresent.Location = new System.Drawing.Point(6, 65);
this.chkBfPresent.Name = "chkBfPresent";
this.chkBfPresent.Size = new System.Drawing.Size(199, 17);
this.chkBfPresent.TabIndex = 4;
this.chkBfPresent.Text = "Наличие сигнального процессора";
this.chkBfPresent.UseVisualStyleBackColor = true;
//
// chkGalPresent
//
this.chkGalPresent.AutoSize = true;
this.chkGalPresent.Enabled = false;
this.chkGalPresent.Location = new System.Drawing.Point(6, 42);
this.chkGalPresent.Name = "chkGalPresent";
this.chkGalPresent.Size = new System.Drawing.Size(167, 17);
this.chkGalPresent.TabIndex = 1;
this.chkGalPresent.Text = "Наличие гальваноразвязки";
this.chkGalPresent.UseVisualStyleBackColor = true;
//
// chkDacPresent
//
this.chkDacPresent.AutoSize = true;
this.chkDacPresent.Enabled = false;
this.chkDacPresent.Location = new System.Drawing.Point(6, 19);
this.chkDacPresent.Name = "chkDacPresent";
this.chkDacPresent.Size = new System.Drawing.Size(95, 17);
this.chkDacPresent.TabIndex = 0;
this.chkDacPresent.Text = "Наличие ЦАП";
this.chkDacPresent.UseVisualStyleBackColor = true;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.btnSetAdcFreq);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Controls.Add(this.edtDinFreq);
this.groupBox2.Controls.Add(this.edtAdcFreqLch);
this.groupBox2.Controls.Add(this.edtAdcFreq);
this.groupBox2.Location = new System.Drawing.Point(27, 247);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(518, 60);
this.groupBox2.TabIndex = 4;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Частоты синхронного сбора";
//
// btnSetAdcFreq
//
this.btnSetAdcFreq.Location = new System.Drawing.Point(437, 32);
this.btnSetAdcFreq.Name = "btnSetAdcFreq";
this.btnSetAdcFreq.Size = new System.Drawing.Size(75, 23);
this.btnSetAdcFreq.TabIndex = 10;
this.btnSetAdcFreq.Text = "Установить";
this.btnSetAdcFreq.UseVisualStyleBackColor = true;
this.btnSetAdcFreq.Click += new System.EventHandler(this.btnSetAdcFreq_Click);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(291, 16);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(170, 13);
this.label5.TabIndex = 9;
this.label5.Text = "Частота синхронного ввода (Гц)";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(159, 15);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(118, 13);
this.label4.TabIndex = 8;
this.label4.Text = "Частота на канал (Гц)";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(7, 15);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(143, 13);
this.label3.TabIndex = 7;
this.label3.Text = "Частота сбора данных (Гц)";
//
// edtDinFreq
//
this.edtDinFreq.Location = new System.Drawing.Point(294, 34);
this.edtDinFreq.Name = "edtDinFreq";
this.edtDinFreq.Size = new System.Drawing.Size(126, 20);
this.edtDinFreq.TabIndex = 6;
this.edtDinFreq.Text = "2000000";
//
// edtAdcFreqLch
//
this.edtAdcFreqLch.Location = new System.Drawing.Point(162, 34);
this.edtAdcFreqLch.Name = "edtAdcFreqLch";
this.edtAdcFreqLch.Size = new System.Drawing.Size(126, 20);
this.edtAdcFreqLch.TabIndex = 5;
this.edtAdcFreqLch.Text = "2000000";
//
// edtAdcFreq
//
this.edtAdcFreq.Location = new System.Drawing.Point(6, 34);
this.edtAdcFreq.Name = "edtAdcFreq";
this.edtAdcFreq.Size = new System.Drawing.Size(126, 20);
this.edtAdcFreq.TabIndex = 0;
this.edtAdcFreq.Text = "2000000";
//
// groupBox3
//
this.groupBox3.Controls.Add(this.chkSyncDin);
this.groupBox3.Controls.Add(this.edtDin_Result);
this.groupBox3.Controls.Add(this.edtLCh3_Result);
this.groupBox3.Controls.Add(this.edtLCh2_Result);
this.groupBox3.Controls.Add(this.cbbLCh3_Mode);
this.groupBox3.Controls.Add(this.label10);
this.groupBox3.Controls.Add(this.cbbLCh3_Range);
this.groupBox3.Controls.Add(this.cbbLCh2_Mode);
this.groupBox3.Controls.Add(this.cbbLCh3_Channel);
this.groupBox3.Controls.Add(this.label9);
this.groupBox3.Controls.Add(this.cbbLCh2_Range);
this.groupBox3.Controls.Add(this.label8);
this.groupBox3.Controls.Add(this.cbbLCh2_Channel);
this.groupBox3.Controls.Add(this.edtLCh1_Result);
this.groupBox3.Controls.Add(this.cbbLCh1_Mode);
this.groupBox3.Controls.Add(this.cbbLCh1_Range);
this.groupBox3.Controls.Add(this.label7);
this.groupBox3.Controls.Add(this.cbbLCh1_Channel);
this.groupBox3.Controls.Add(this.label6);
this.groupBox3.Controls.Add(this.cbbLChCnt);
this.groupBox3.Location = new System.Drawing.Point(27, 377);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(518, 166);
this.groupBox3.TabIndex = 5;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Каналы АЦП";
//
// chkSyncDin
//
this.chkSyncDin.AutoSize = true;
this.chkSyncDin.Location = new System.Drawing.Point(182, 140);
this.chkSyncDin.Name = "chkSyncDin";
this.chkSyncDin.Size = new System.Drawing.Size(189, 17);
this.chkSyncDin.TabIndex = 17;
this.chkSyncDin.Text = "Разрешение синхронного ввода";
this.chkSyncDin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.chkSyncDin.UseVisualStyleBackColor = true;
//
// edtDin_Result
//
this.edtDin_Result.Location = new System.Drawing.Point(380, 138);
this.edtDin_Result.Name = "edtDin_Result";
this.edtDin_Result.Size = new System.Drawing.Size(107, 20);
this.edtDin_Result.TabIndex = 16;
//
// edtLCh3_Result
//
this.edtLCh3_Result.Location = new System.Drawing.Point(380, 112);
this.edtLCh3_Result.Name = "edtLCh3_Result";
this.edtLCh3_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh3_Result.TabIndex = 15;
//
// edtLCh2_Result
//
this.edtLCh2_Result.Location = new System.Drawing.Point(380, 85);
this.edtLCh2_Result.Name = "edtLCh2_Result";
this.edtLCh2_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh2_Result.TabIndex = 11;
//
// cbbLCh3_Mode
//
this.cbbLCh3_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Mode.FormattingEnabled = true;
this.cbbLCh3_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh3_Mode.Location = new System.Drawing.Point(182, 111);
this.cbbLCh3_Mode.Name = "cbbLCh3_Mode";
this.cbbLCh3_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh3_Mode.TabIndex = 14;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(386, 41);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(59, 13);
this.label10.TabIndex = 10;
this.label10.Text = "Результат";
//
// cbbLCh3_Range
//
this.cbbLCh3_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Range.FormattingEnabled = true;
this.cbbLCh3_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh3_Range.Location = new System.Drawing.Point(73, 111);
this.cbbLCh3_Range.Name = "cbbLCh3_Range";
this.cbbLCh3_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh3_Range.TabIndex = 13;
//
// cbbLCh2_Mode
//
this.cbbLCh2_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Mode.FormattingEnabled = true;
this.cbbLCh2_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh2_Mode.Location = new System.Drawing.Point(182, 84);
this.cbbLCh2_Mode.Name = "cbbLCh2_Mode";
this.cbbLCh2_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh2_Mode.TabIndex = 10;
//
// cbbLCh3_Channel
//
this.cbbLCh3_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Channel.FormattingEnabled = true;
this.cbbLCh3_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh3_Channel.Location = new System.Drawing.Point(8, 111);
this.cbbLCh3_Channel.Name = "cbbLCh3_Channel";
this.cbbLCh3_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh3_Channel.TabIndex = 12;
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(185, 41);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(101, 13);
this.label9.TabIndex = 9;
this.label9.Text = "Режим измерения";
//
// cbbLCh2_Range
//
this.cbbLCh2_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Range.FormattingEnabled = true;
this.cbbLCh2_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh2_Range.Location = new System.Drawing.Point(73, 84);
this.cbbLCh2_Range.Name = "cbbLCh2_Range";
this.cbbLCh2_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh2_Range.TabIndex = 9;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(72, 41);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(58, 13);
this.label8.TabIndex = 8;
this.label8.Text = "Диапазон";
//
// cbbLCh2_Channel
//
this.cbbLCh2_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Channel.FormattingEnabled = true;
this.cbbLCh2_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh2_Channel.Location = new System.Drawing.Point(8, 84);
this.cbbLCh2_Channel.Name = "cbbLCh2_Channel";
this.cbbLCh2_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh2_Channel.TabIndex = 8;
//
// edtLCh1_Result
//
this.edtLCh1_Result.Location = new System.Drawing.Point(380, 58);
this.edtLCh1_Result.Name = "edtLCh1_Result";
this.edtLCh1_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh1_Result.TabIndex = 7;
//
// cbbLCh1_Mode
//
this.cbbLCh1_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Mode.FormattingEnabled = true;
this.cbbLCh1_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh1_Mode.Location = new System.Drawing.Point(182, 57);
this.cbbLCh1_Mode.Name = "cbbLCh1_Mode";
this.cbbLCh1_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh1_Mode.TabIndex = 6;
//
// cbbLCh1_Range
//
this.cbbLCh1_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Range.FormattingEnabled = true;
this.cbbLCh1_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh1_Range.Location = new System.Drawing.Point(73, 57);
this.cbbLCh1_Range.Name = "cbbLCh1_Range";
this.cbbLCh1_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh1_Range.TabIndex = 5;
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(6, 41);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(38, 13);
this.label7.TabIndex = 4;
this.label7.Text = "Канал";
//
// cbbLCh1_Channel
//
this.cbbLCh1_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Channel.FormattingEnabled = true;
this.cbbLCh1_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh1_Channel.Location = new System.Drawing.Point(8, 57);
this.cbbLCh1_Channel.Name = "cbbLCh1_Channel";
this.cbbLCh1_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh1_Channel.TabIndex = 2;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(25, 22);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(171, 13);
this.label6.TabIndex = 1;
this.label6.Text = "Количество логических каналов";
//
// cbbLChCnt
//
this.cbbLChCnt.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLChCnt.FormattingEnabled = true;
this.cbbLChCnt.Items.AddRange(new object[] {
"1",
"2",
"3"});
this.cbbLChCnt.Location = new System.Drawing.Point(211, 14);
this.cbbLChCnt.Name = "cbbLChCnt";
this.cbbLChCnt.Size = new System.Drawing.Size(49, 21);
this.cbbLChCnt.TabIndex = 0;
//
// btnStart
//
this.btnStart.Location = new System.Drawing.Point(27, 92);
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(212, 23);
this.btnStart.TabIndex = 6;
this.btnStart.Text = "Запуск сбора данных";
this.btnStart.UseVisualStyleBackColor = true;
this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
//
// btnStop
//
this.btnStop.Location = new System.Drawing.Point(27, 121);
this.btnStop.Name = "btnStop";
this.btnStop.Size = new System.Drawing.Size(212, 23);
this.btnStop.TabIndex = 7;
this.btnStop.Text = "Останов сбора данных";
this.btnStop.UseVisualStyleBackColor = true;
this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
//
// btnAsyncAdcFrame
//
this.btnAsyncAdcFrame.Location = new System.Drawing.Point(27, 549);
this.btnAsyncAdcFrame.Name = "btnAsyncAdcFrame";
this.btnAsyncAdcFrame.Size = new System.Drawing.Size(212, 23);
this.btnAsyncAdcFrame.TabIndex = 8;
this.btnAsyncAdcFrame.Text = "Асинхронный ввод кадра АЦП";
this.btnAsyncAdcFrame.UseVisualStyleBackColor = true;
this.btnAsyncAdcFrame.Click += new System.EventHandler(this.btnAsyncAdcFrame_Click);
//
// groupBox4
//
this.groupBox4.Controls.Add(this.cbbSyncStartMode);
this.groupBox4.Controls.Add(this.label12);
this.groupBox4.Controls.Add(this.cbbSyncMode);
this.groupBox4.Controls.Add(this.label11);
this.groupBox4.Location = new System.Drawing.Point(27, 307);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(518, 64);
this.groupBox4.TabIndex = 9;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Синхронизация";
//
// cbbSyncStartMode
//
this.cbbSyncStartMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbSyncStartMode.FormattingEnabled = true;
this.cbbSyncStartMode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbSyncStartMode.Items.AddRange(new object[] {
"Внутренний",
"От внешнего мастера",
"Фронт сигнала DI_SYN1",
"Фронт сигнала DI_SYN2",
"Спад сигнала DI_SYN1",
"Спад сигнала DI_SYN2"});
this.cbbSyncStartMode.Location = new System.Drawing.Point(228, 37);
this.cbbSyncStartMode.Name = "cbbSyncStartMode";
this.cbbSyncStartMode.Size = new System.Drawing.Size(176, 21);
this.cbbSyncStartMode.TabIndex = 11;
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(228, 16);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(242, 13);
this.label12.TabIndex = 10;
this.label12.Text = "Источник запуска синхронного ввода/вывода";
//
// cbbSyncMode
//
this.cbbSyncMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbSyncMode.FormattingEnabled = true;
this.cbbSyncMode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbSyncMode.Items.AddRange(new object[] {
"Внутренний",
"От внешнего мастера",
"Фронт сигнала DI_SYN1",
"Фронт сигнала DI_SYN2",
"Спад сигнала DI_SYN1",
"Спад сигнала DI_SYN2"});
this.cbbSyncMode.Location = new System.Drawing.Point(10, 37);
this.cbbSyncMode.Name = "cbbSyncMode";
this.cbbSyncMode.Size = new System.Drawing.Size(176, 21);
this.cbbSyncMode.TabIndex = 9;
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(7, 16);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(179, 13);
this.label11.TabIndex = 8;
this.label11.Text = "Источник частоты синхронизации";
//
// btnAsyncDigIn
//
this.btnAsyncDigIn.Location = new System.Drawing.Point(27, 578);
this.btnAsyncDigIn.Name = "btnAsyncDigIn";
this.btnAsyncDigIn.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDigIn.TabIndex = 10;
this.btnAsyncDigIn.Text = "Асинхронный ввод цифровых линий";
this.btnAsyncDigIn.UseVisualStyleBackColor = true;
this.btnAsyncDigIn.Click += new System.EventHandler(this.btnAsyncDigIn_Click);
//
// btnAsyncDigOut
//
this.btnAsyncDigOut.Location = new System.Drawing.Point(27, 607);
this.btnAsyncDigOut.Name = "btnAsyncDigOut";
this.btnAsyncDigOut.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDigOut.TabIndex = 11;
this.btnAsyncDigOut.Text = "Асинхронный вывод цифровых линий";
this.btnAsyncDigOut.UseVisualStyleBackColor = true;
this.btnAsyncDigOut.Click += new System.EventHandler(this.btnAsyncDigOut_Click);
//
// btnAsyncDac1
//
this.btnAsyncDac1.Location = new System.Drawing.Point(27, 636);
this.btnAsyncDac1.Name = "btnAsyncDac1";
this.btnAsyncDac1.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDac1.TabIndex = 12;
this.btnAsyncDac1.Text = "Асинхронный вывод на ЦАП1 (Вольты)";
this.btnAsyncDac1.UseVisualStyleBackColor = true;
this.btnAsyncDac1.Click += new System.EventHandler(this.btnAsyncDac1_Click);
//
// btnAsyncDac2
//
this.btnAsyncDac2.Location = new System.Drawing.Point(27, 665);
this.btnAsyncDac2.Name = "btnAsyncDac2";
this.btnAsyncDac2.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDac2.TabIndex = 13;
this.btnAsyncDac2.Text = "Асинхронный вывод на ЦАП2 (Вольты)";
this.btnAsyncDac2.UseVisualStyleBackColor = true;
this.btnAsyncDac2.Click += new System.EventHandler(this.btnAsyncDac2_Click);
//
// edtAsyncDigIn
//
this.edtAsyncDigIn.Location = new System.Drawing.Point(255, 580);
this.edtAsyncDigIn.Name = "edtAsyncDigIn";
this.edtAsyncDigIn.Size = new System.Drawing.Size(101, 20);
this.edtAsyncDigIn.TabIndex = 14;
//
// edtAsyncDigOut
//
this.edtAsyncDigOut.Location = new System.Drawing.Point(255, 610);
this.edtAsyncDigOut.Name = "edtAsyncDigOut";
this.edtAsyncDigOut.Size = new System.Drawing.Size(101, 20);
this.edtAsyncDigOut.TabIndex = 15;
this.edtAsyncDigOut.Text = "0x0000";
//
// edtAsyncDac1
//
this.edtAsyncDac1.Location = new System.Drawing.Point(255, 639);
this.edtAsyncDac1.Name = "edtAsyncDac1";
this.edtAsyncDac1.Size = new System.Drawing.Size(58, 20);
this.edtAsyncDac1.TabIndex = 16;
this.edtAsyncDac1.Text = "5";
//
// edtAsyncDac2
//
this.edtAsyncDac2.Location = new System.Drawing.Point(255, 665);
this.edtAsyncDac2.Name = "edtAsyncDac2";
this.edtAsyncDac2.Size = new System.Drawing.Size(58, 20);
this.edtAsyncDac2.TabIndex = 17;
this.edtAsyncDac2.Text = "5";
//
// chkEthSupport
//
this.chkEthSupport.AutoSize = true;
this.chkEthSupport.Enabled = false;
this.chkEthSupport.Location = new System.Drawing.Point(6, 85);
this.chkEthSupport.Name = "chkEthSupport";
this.chkEthSupport.Size = new System.Drawing.Size(182, 17);
this.chkEthSupport.TabIndex = 9;
this.chkEthSupport.Text = "Наличие сетевого интерфейса";
this.chkEthSupport.UseVisualStyleBackColor = true;
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(74, 157);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(124, 13);
this.label13.TabIndex = 11;
this.label13.Text = "Версия прошивки ARM";
//
// edtMcuVer
//
this.edtMcuVer.Enabled = false;
this.edtMcuVer.Location = new System.Drawing.Point(6, 154);
this.edtMcuVer.Name = "edtMcuVer";
this.edtMcuVer.Size = new System.Drawing.Size(62, 20);
this.edtMcuVer.TabIndex = 10;
//
// edtIpAddr
//
this.edtIpAddr.Location = new System.Drawing.Point(27, 203);
this.edtIpAddr.Name = "edtIpAddr";
this.edtIpAddr.Size = new System.Drawing.Size(212, 20);
this.edtIpAddr.TabIndex = 18;
this.edtIpAddr.Text = "192.168.0.1";
//
// btnOpenByIP
//
this.btnOpenByIP.Location = new System.Drawing.Point(27, 174);
this.btnOpenByIP.Name = "btnOpenByIP";
this.btnOpenByIP.Size = new System.Drawing.Size(212, 23);
this.btnOpenByIP.TabIndex = 19;
this.btnOpenByIP.Text = "Установить соединение по IP-адресу";
this.btnOpenByIP.UseVisualStyleBackColor = true;
this.btnOpenByIP.Click += new System.EventHandler(this.btnOpenByIP_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(553, 736);
this.Controls.Add(this.btnOpenByIP);
this.Controls.Add(this.edtIpAddr);
this.Controls.Add(this.edtAsyncDac2);
this.Controls.Add(this.edtAsyncDac1);
this.Controls.Add(this.edtAsyncDigOut);
this.Controls.Add(this.edtAsyncDigIn);
this.Controls.Add(this.btnAsyncDac2);
this.Controls.Add(this.btnAsyncDac1);
this.Controls.Add(this.btnAsyncDigOut);
this.Controls.Add(this.btnAsyncDigIn);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.btnAsyncAdcFrame);
this.Controls.Add(this.btnStop);
this.Controls.Add(this.btnStart);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.btnOpen);
this.Controls.Add(this.cbbSerialList);
this.Controls.Add(this.btnRefreshDeviceList);
this.Name = "MainForm";
this.Text = "L502/E502 example";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnRefreshDeviceList;
private System.Windows.Forms.ComboBox cbbSerialList;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.CheckBox chkBfPresent;
private System.Windows.Forms.CheckBox chkGalPresent;
private System.Windows.Forms.CheckBox chkDacPresent;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox edtPldaVer;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox edtFpgaVer;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button btnSetAdcFreq;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox edtDinFreq;
private System.Windows.Forms.TextBox edtAdcFreqLch;
private System.Windows.Forms.TextBox edtAdcFreq;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.ComboBox cbbLChCnt;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ComboBox cbbLCh1_Channel;
private System.Windows.Forms.ComboBox cbbLCh1_Mode;
private System.Windows.Forms.ComboBox cbbLCh1_Range;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.CheckBox chkSyncDin;
private System.Windows.Forms.TextBox edtDin_Result;
private System.Windows.Forms.TextBox edtLCh3_Result;
private System.Windows.Forms.TextBox edtLCh2_Result;
private System.Windows.Forms.ComboBox cbbLCh3_Mode;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.ComboBox cbbLCh3_Range;
private System.Windows.Forms.ComboBox cbbLCh2_Mode;
private System.Windows.Forms.ComboBox cbbLCh3_Channel;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.ComboBox cbbLCh2_Range;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.ComboBox cbbLCh2_Channel;
private System.Windows.Forms.TextBox edtLCh1_Result;
private System.Windows.Forms.Button btnStart;
private System.Windows.Forms.Button btnStop;
private System.Windows.Forms.Button btnAsyncAdcFrame;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.ComboBox cbbSyncStartMode;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.ComboBox cbbSyncMode;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Button btnAsyncDigIn;
private System.Windows.Forms.Button btnAsyncDigOut;
private System.Windows.Forms.Button btnAsyncDac1;
private System.Windows.Forms.Button btnAsyncDac2;
private System.Windows.Forms.TextBox edtAsyncDigIn;
private System.Windows.Forms.TextBox edtAsyncDigOut;
private System.Windows.Forms.TextBox edtAsyncDac1;
private System.Windows.Forms.TextBox edtAsyncDac2;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox edtMcuVer;
private System.Windows.Forms.CheckBox chkEthSupport;
private System.Windows.Forms.TextBox edtIpAddr;
private System.Windows.Forms.Button btnOpenByIP;
}
}
@@ -0,0 +1,592 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using x502api;
using lpcieapi;
namespace x502_example
{
public partial class MainForm : Form
{
const uint RECV_BUF_SIZE = 8*1024*1024;
const uint RECV_TOUT = 250;
X502.DevRec[] devrecs;
X502 hnd; /* Описатель модуля с которым работаем (null, если связи нет) */
Thread thread; /* Объект потока для синхронного сбора */
bool reqStop; /* Запрос на останов потока сбора данных */
bool threadRunning; /* Признак, идет ли сбор данных в отдельном потоке */
UInt32[] rcv_buf; /* буфер для приема сырых данных */
double[] adcData; /* буфер для данных АЦП */
UInt32[] dinData; /* буфер для отсчетов цифровых входов */
UInt32 adcSize, dinSize; /* размер действительных данных в adcData и dinData */
UInt32 firstLch; /* номер логического канала, которому соответствует отсчет в adcData[0] */
private delegate void finishThreadDelegate(lpcie.Errs err);
private delegate void updateDateDelegate();
/* Обновление элементов управления, значениями, снятыми при синхронном вводе.
* Так работа с интерфейсом может быть только из основного потока, а
* фунция вызывается из потока сбора данных, то если мы находимся
* в потоке сбора данных, планируем ее выполнение в основном потоке */
private void UpdateData()
{
if (this.InvokeRequired)
{
this.Invoke(new updateDateDelegate(this.UpdateData));
}
else
{
TextBox[] lchResEdits = {edtLCh1_Result, edtLCh2_Result, edtLCh3_Result};
UInt32 lch_cnt = hnd.LChannelCount;
/* устанавливаем в индикаторах значение первого отсчета из массива */
for (uint i = 0; (i < lch_cnt) && (i < adcSize); i++)
lchResEdits[(firstLch + i) % lch_cnt].Text = adcData[i].ToString("F7");
/* если есть данные цифрового выхода, то устанавливаем индикатор
в соответствии с первым значением */
if (dinSize>0)
edtDin_Result.Text = dinData[0].ToString("X5");
else
edtDin_Result.Text = "";
}
}
/* Функция, вызываемая по завершению потока сбора данных.
* Так как она работает с интерфейсом, то при вызове из другого потока,
* она планируется на выполнения в основном потоке, как и UpdateData */
private void finishThread(lpcie.Errs err)
{
if (this.InvokeRequired)
this.Invoke(new finishThreadDelegate(this.finishThread), err);
else
{
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Сбор данных завершен с ошибкой",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
threadRunning = false;
updateControls();
}
}
/* Функция синхронного сбора данных. Выполняется в отдельном потоке */
private void threadFunc()
{
reqStop = false;
/* запускаем синхронные потоки ввода-вывода*/
lpcie.Errs err = hnd.StreamsStart();
if (err == lpcie.Errs.OK)
{
/* выполняем прием пока не произойдет ошибка или
не будет запроса на останов от основного приложения */
while (!reqStop && (err == lpcie.Errs.OK))
{
/* принимаем данные синхронного ввода */
Int32 rcv_size = hnd.Recv(rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
/* значение меньше нуля означает ошибку... */
if (rcv_size < 0)
err = (lpcie.Errs)rcv_size;
else if (rcv_size > 0)
{
/* если больше нуля - значит приняли новые данные */
dinSize = RECV_BUF_SIZE;
adcSize = RECV_BUF_SIZE;
/* получаем номер лог. какнала, соответствующий первому
отсчету АЦП, так как до этого могли обработать
некратное количество кадров */
firstLch = hnd.NextExpectedLchNum;
/* разбираем данные на синхронный ввод и отсчеты АЦП и
переводим АЦП в Вольты */
err = hnd.ProcessData(rcv_buf, (uint)rcv_size, X502.ProcFlags.VOLT,
adcData, ref adcSize, dinData, ref dinSize);
if (err == lpcie.Errs.OK)
{
/* обновляем значения элементов управления */
UpdateData();
}
}
}
/* по выходу из цикла отсанавливаем поток.
Чтобы не сбросить код ошибки (если вышли по ошибке)
результат останова сохраняем в отдельную переменную */
lpcie.Errs stop_err = hnd.StreamsStop();
if (err == lpcie.Errs.OK)
err = stop_err;
}
/* завершаем поток */
finishThread(err);
}
/* обновление состояния элементов управления (какие разрешены, какие нет) */
private void updateControls()
{
btnRefreshDeviceList.Enabled = hnd==null;
cbbSerialList.Enabled = hnd==null;
btnOpen.Text = hnd==null ? "Установить связь с устройством" :
"Разорвать связь с устройством";
btnOpen.Enabled = (hnd!=null) || (cbbSerialList.SelectedItem != null);
btnOpenByIP.Enabled = (hnd == null);
edtIpAddr.Enabled = (hnd == null);
chkSyncDin.Enabled = (hnd != null) && !threadRunning;
btnStart.Enabled = (hnd != null) && !threadRunning;
btnStop.Enabled = (hnd != null) && threadRunning;
btnSetAdcFreq.Enabled = (hnd != null) && !threadRunning;
btnAsyncDigOut.Enabled = (hnd != null);
btnAsyncDigIn.Enabled = (hnd != null);
btnAsyncDac1.Enabled = (hnd != null) && chkDacPresent.Checked;
btnAsyncDac2.Enabled = (hnd != null) && chkDacPresent.Checked;
btnAsyncAdcFrame.Enabled = (hnd != null) && !threadRunning;
}
private void deviceClose()
{
if (hnd != null)
{
//останов сбора данных
if (threadRunning)
{
reqStop = true;
/* ожидаем завершения потока. Так как
* поток работает с GUI и планирует выполнение части
* функций в основном потоке, то мы не можем сдесь просто
* сделать Join, вызываем Application.DoEvents(), чтобы
* в нем обработать запланированные UpdateData()/finishThread() */
while (threadRunning)
{
Application.DoEvents();
}
}
// закрытие связи с модулем
hnd.Close();
// память освободится диспетчером мусора, т.к. нет больше ссылок
hnd = null;
}
}
private void refreshDevList()
{
cbbSerialList.Items.Clear();
//получаем список серийных номеров
X502.DevRec[] pci_devrecs;
X502.DevRec[] usb_devrecs;
Int32 res = L502.GetDevRecordsList(out pci_devrecs, 0);
res = E502.UsbGetDevRecordsList(out usb_devrecs, 0);
devrecs = new X502.DevRec[pci_devrecs.Length + usb_devrecs.Length];
pci_devrecs.CopyTo(devrecs, 0);
usb_devrecs.CopyTo(devrecs, pci_devrecs.Length);
/* заполняем полученные серийные номера в ComboBox */
for (int i = 0; i < devrecs.Length; i++)
cbbSerialList.Items.Add(devrecs[i].DevName + ", " + devrecs[i].Serial);
if (devrecs.Length > 0)
cbbSerialList.SelectedIndex = 0;
updateControls();
}
/* установка частот сбора данных из элементов управления и обновление их реально
* установленными значениями */
lpcie.Errs setAdcFreq()
{
lpcie.Errs err = lpcie.Errs.OK;
double f_acq, f_lch, f_din;
f_acq = Convert.ToDouble(edtAdcFreq.Text);
f_lch = Convert.ToDouble(edtAdcFreqLch.Text);
f_din = Convert.ToDouble(edtDinFreq.Text);
// устанавливаем требуемую частоту сбора.
err = hnd.SetAdcFreq(ref f_acq, ref f_lch);
if (err == lpcie.Errs.OK)
{
// обновляем значение индикатора, для отображения
// реально установившейся частоты
edtAdcFreq.Text = f_acq.ToString();
edtAdcFreqLch.Text = f_lch.ToString();
// Устанавливаем частоту синхронного сбора
err = hnd.SetDinFreq(ref f_din);
if (err == lpcie.Errs.OK)
edtDinFreq.Text = f_din.ToString();
}
return err;
}
/* настройка параметров модуля значениями из элементов управления */
lpcie.Errs setupParams()
{
lpcie.Errs err = lpcie.Errs.OK;
/* таблица соответствия индексов в ComboBox и кодов режима измерения */
X502.LchMode[] f_mode_tbl = {X502.LchMode.COMM, X502.LchMode.DIFF, X502.LchMode.ZERO};
/* таблица соответствия индексов в ComboBox и кодов диапазонов АЦП */
X502.AdcRange[] f_range_tbl = {X502.AdcRange.RANGE_10, X502.AdcRange.RANGE_5, X502.AdcRange.RANGE_2,
X502.AdcRange.RANGE_1, X502.AdcRange.RANGE_05, X502.AdcRange.RANGE_02};
/* таблица соответствия индексов в ComboBox и кодов источника синхронизации */
X502.Sync[] f_sync_tbl = {X502.Sync.INTERNAL, X502.Sync.EXTERNAL_MASTER,
X502.Sync.DI_SYN1_RISE, X502.Sync.DI_SYN2_RISE,
X502.Sync.DI_SYN1_FALL, X502.Sync.DI_SYN2_FALL};
UInt32 lch_cnt = Convert.ToUInt32(cbbLChCnt.Text);
/* Устанавливаем кол-во логических каналов */
hnd.LChannelCount = lch_cnt;
/* Настраниваем таблицу логических каналов */
err = hnd.SetLChannel(0, Convert.ToUInt32(cbbLCh1_Channel.Text) - 1,
f_mode_tbl[cbbLCh1_Mode.SelectedIndex], f_range_tbl[cbbLCh1_Range.SelectedIndex], 0);
if ((err == lpcie.Errs.OK) && (lch_cnt >= 2))
{
err = hnd.SetLChannel(1, Convert.ToUInt32(cbbLCh2_Channel.Text) - 1,
f_mode_tbl[cbbLCh2_Mode.SelectedIndex], f_range_tbl[cbbLCh2_Range.SelectedIndex], 0);
}
if ((err == lpcie.Errs.OK) && (lch_cnt >= 3))
{
err = hnd.SetLChannel(2, Convert.ToUInt32(cbbLCh3_Channel.Text) - 1,
f_mode_tbl[cbbLCh3_Mode.SelectedIndex], f_range_tbl[cbbLCh3_Range.SelectedIndex], 0);
}
/* Настраиваем источник частоты синхронизации и запуска сбора */
if (err == lpcie.Errs.OK)
{
hnd.SyncMode = f_sync_tbl[cbbSyncMode.SelectedIndex];
hnd.SyncStartMode = f_sync_tbl[cbbSyncStartMode.SelectedIndex];
}
/* настраиваем частоту сбора с АЦП */
if (err == lpcie.Errs.OK)
err = setAdcFreq();
/* Записываем настройки в модуль */
if (err == lpcie.Errs.OK)
err = hnd.Configure(0);
return err;
}
lpcie.Errs setSyncDinStream()
{
lpcie.Errs err;
/* разрешаем или запрещаем поток синхронного ввода
с цифровых линий в зависимости от состояния переключателя */
if (chkSyncDin.Checked)
err = hnd.StreamsEnable(X502.Streams.DIN);
else
err = hnd.StreamsDisable(X502.Streams.DIN);
return err;
}
public MainForm()
{
InitializeComponent();
cbbLChCnt.SelectedIndex = 2;
cbbLCh1_Channel.SelectedIndex = 0;
cbbLCh2_Channel.SelectedIndex = 1;
cbbLCh3_Channel.SelectedIndex = 2;
cbbLCh1_Range.SelectedIndex = 0;
cbbLCh2_Range.SelectedIndex = 0;
cbbLCh3_Range.SelectedIndex = 0;
cbbLCh1_Mode.SelectedIndex = 1;
cbbLCh2_Mode.SelectedIndex = 1;
cbbLCh3_Mode.SelectedIndex = 1;
cbbSyncMode.SelectedIndex = 0;
cbbSyncStartMode.SelectedIndex = 0;
rcv_buf = new UInt32[RECV_BUF_SIZE];
dinData = new UInt32[RECV_BUF_SIZE];
adcData = new double[RECV_BUF_SIZE];
threadRunning = false;
refreshDevList();
}
private void btnRefreshDeviceList_Click(object sender, EventArgs e)
{
refreshDevList();
}
private void showDevInfo()
{
/* получаем информацию о модуле */
X502.Info devinfo = hnd.DevInfo;
/* отображаем ее на панели */
chkBfPresent.Checked = (devinfo.DevFlags & X502.DevFlags.BF_PRESENT) != 0;
chkDacPresent.Checked = (devinfo.DevFlags & X502.DevFlags.DAC_PRESENT) != 0;
chkGalPresent.Checked = (devinfo.DevFlags & X502.DevFlags.GAL_PRESENT) != 0;
chkEthSupport.Checked = (devinfo.DevFlags & X502.DevFlags.IFACE_SUPPORT_ETH) != 0;
edtFpgaVer.Text = devinfo.FpgaVerString;
edtPldaVer.Text = string.Format("{0}", devinfo.PldaVer);
edtMcuVer.Text = devinfo.McuFirmwareVerString;
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (hnd == null)
{
lpcie.Errs res;
int idx = cbbSerialList.SelectedIndex;
if (idx >= 0)
{
/* создаем описатель модуля */
hnd = X502.Create(devrecs[idx].DevName);
/* устанавливаем связь по выбранному серийному номеру */
res = hnd.Open(devrecs[idx]);
if (res == lpcie.Errs.OK)
{
showDevInfo();
}
else
{
MessageBox.Show(X502.GetErrorString(res), "Ошибка открытия модуля", MessageBoxButtons.OK,
MessageBoxIcon.Error);
hnd = null;
}
}
}
else
{
deviceClose();
}
updateControls();
}
private void btnOpenByIP_Click(object sender, EventArgs e)
{
/* создаем запись, соответствующую заданному адресу */
X502.DevRec rec = E502.MakeDevRecordByIpAddr(IPAddress.Parse(edtIpAddr.Text), 0, 5000);
if (rec != null)
{
/* создание объекта */
hnd = X502.Create(rec.DevName);
/* станавливаем связь устанавливаем связь по созданной записи */
lpcie.Errs res = hnd.Open(rec);
if (res == lpcie.Errs.OK)
{
showDevInfo();
}
else
{
MessageBox.Show(X502.GetErrorString(res), "Ошибка открытия модуля", MessageBoxButtons.OK,
MessageBoxIcon.Error);
hnd = null;
}
}
updateControls();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
deviceClose();
}
private void btnSetAdcFreq_Click(object sender, EventArgs e)
{
if (hnd != null)
{
hnd.LChannelCount = Convert.ToUInt32(cbbLChCnt.Text);
lpcie.Errs err = setAdcFreq();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка установки частоты сбора",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncAdcFrame_Click(object sender, EventArgs e)
{
if (hnd != null)
{
/* устанавливаем параметры модуля */
lpcie.Errs err = setupParams();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров АЦП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (err == lpcie.Errs.OK)
{
UInt32 lch_cnt = hnd.LChannelCount;
/* Создаем массив для приема количества отсчетов, равному количеству
* логических каналов */
double[] adc_data = new double[lch_cnt];
err = hnd.AsyncGetAdcFrame(X502.ProcFlags.VOLT, 1000, adc_data);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка приема кадра АЦП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
/* выводим результат */
edtLCh1_Result.Text = adc_data[0].ToString("F7");
if (lch_cnt >= 2)
edtLCh2_Result.Text = adc_data[1].ToString("F7");
else
edtLCh2_Result.Text = "";
if (lch_cnt >= 3)
edtLCh3_Result.Text = adc_data[2].ToString("F7");
else
edtLCh3_Result.Text = "";
}
}
}
}
private void btnAsyncDigIn_Click(object sender, EventArgs e)
{
if (hnd != null)
{
UInt32 din;
lpcie.Errs err = hnd.AsyncInDig(out din);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного ввода с цифровых линий",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
edtAsyncDigIn.Text = din.ToString("X5");
}
}
}
private void btnAsyncDigOut_Click(object sender, EventArgs e)
{
if (hnd != null)
{
UInt32 val = Convert.ToUInt32(edtAsyncDigOut.Text, 16);
lpcie.Errs err = hnd.AsyncOutDig(val, 0);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного вывода на цифровые линии",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncDac1_Click(object sender, EventArgs e)
{
if (hnd != null)
{
double val = Convert.ToDouble(edtAsyncDac1.Text); ;
lpcie.Errs err = hnd.AsyncOutDac(X502.DacCh.CH1, val, X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка вывода на ЦАП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncDac2_Click(object sender, EventArgs e)
{
if (hnd != null)
{
double val = Convert.ToDouble(edtAsyncDac2.Text); ;
lpcie.Errs err = hnd.AsyncOutDac(X502.DacCh.CH2, val, X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка вывода на ЦАП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
/* настраиваем все параметры в соответствии с элементами управления */
lpcie.Errs err = setupParams();
/* разрешаем синхронный ввод АЦП */
if (err == lpcie.Errs.OK)
err = hnd.StreamsEnable(X502.Streams.ADC);
/* разрешаем синхронный ввод с цифровых линий в зависимости от переключателя */
if (err == lpcie.Errs.OK)
err = setSyncDinStream();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров модуля",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
/* создаем новый поток для сбора в нем данных */
thread = new Thread(this.threadFunc);
threadRunning = true;
thread.Start();
updateControls();
}
}
private void btnStop_Click(object sender, EventArgs e)
{
if (threadRunning)
reqStop = true;
btnStop.Enabled = false;
}
}
}
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace x502_example
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("l502_example")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("l502_example")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d011dc13-469b-4bd3-9597-97af3ea785db")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace l502_example.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("l502_example.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

Some files were not shown because too many files have changed in this diff Show More