Compare commits
34
Commits
master
..
c8dd8553ba
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8dd8553ba | ||
|
|
21038c1f8e | ||
|
|
11cf03910b | ||
|
|
613fdb998f | ||
|
|
d0578a0c0d | ||
|
|
d979f45179 | ||
|
|
a726babc1c | ||
|
|
4e2d8d4b22 | ||
|
|
bec5e29e2c | ||
|
|
a1c727c71f | ||
|
|
9ad09ee77b | ||
|
|
87954d40d9 | ||
|
|
e2eac4dd48 | ||
|
|
850a66e620 | ||
|
|
d1bd233399 | ||
|
|
b7eae9d469 | ||
|
|
b80ad585da | ||
|
|
4d1f7fdbe9 | ||
|
|
a44043593c | ||
|
|
b7ba42765b | ||
|
|
77005d7863 | ||
|
|
bf25bed9aa | ||
|
|
b4abb2eea2 | ||
|
|
fcde0a3d2b | ||
|
|
5a817dc910 | ||
|
|
8c283cb262 | ||
|
|
291c0af714 | ||
|
|
c0bc702c24 | ||
|
|
fdcce2ca58 | ||
|
|
4005818a19 | ||
|
|
2755d0a7ae | ||
|
|
60c823a8e2 | ||
|
|
317a4afc60 | ||
|
|
60a5c90c88 |
@@ -0,0 +1,4 @@
|
||||
*.csv
|
||||
*.tmp
|
||||
build
|
||||
BF_companion
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>BF_PC_companion</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,9 @@
|
||||
// Default configuration for BF_companion main_state
|
||||
// Format: field value // optional comment
|
||||
|
||||
run_mode FINITE_RUN // TEST | FINITE_RUN | INF_RUN
|
||||
BF_mode TRANSPARENT // TRANSPARENT | AVG
|
||||
run_length 100 // milliseconds
|
||||
runs_N 10000 // total runs (used in FINITE_RUN)
|
||||
run_I 0 // starting run index
|
||||
data_path /home/feda/MIPT/RadioPhotonic_Subserface_radar/Receiver_GUI/data // base directory for output files
|
||||
@@ -0,0 +1,9 @@
|
||||
// Default configuration for BF_companion main_state
|
||||
// Format: field value // optional comment
|
||||
|
||||
run_mode FINITE_RUN // TEST | FINITE_RUN | INF_RUN
|
||||
BF_mode TRANSPARENT // TRANSPARENT | AVG
|
||||
run_length 100 // milliseconds
|
||||
runs_N 1000 // total runs (used in FINITE_RUN)
|
||||
run_I 0 // starting run index
|
||||
data_path /home/feda/MIPT/RadioPhotonic_Subserface_radar/Receiver_GUI/data // base directory for output files
|
||||
Binary file not shown.
+10
@@ -0,0 +1,10 @@
|
||||
// Default configuration for BF_companion main_state
|
||||
// Format: field value // optional comment
|
||||
|
||||
run_mode TEST // TEST | FINITE_RUN | INF_RUN
|
||||
BF_mode TRANSPARENT // TRANSPARENT | AVG
|
||||
BlackFin_mode TRANSPARENT // TRANSPARENT | AVG | FFT
|
||||
run_length 100 // milliseconds
|
||||
runs_N 10 // total runs (used in FINITE_RUN)
|
||||
run_I 0 // starting run index
|
||||
data_path data // base directory for output files
|
||||
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/bash
|
||||
./plotter.py "$(./BF_companion 2>&1 1>/dev/tty)"
|
||||
@@ -0,0 +1,9 @@
|
||||
// Default configuration for BF_companion main_state
|
||||
// Format: field value // optional comment
|
||||
|
||||
run_mode FINITE_RUN // TEST | FINITE_RUN | INF_RUN
|
||||
BF_mode TRANSPARENT // TRANSPARENT | AVG
|
||||
run_length 100 // milliseconds
|
||||
runs_N 10 // total runs (used in FINITE_RUN)
|
||||
run_I 0 // starting run index
|
||||
data_path /home/feda/MIPT/RadioPhotonic_Subserface_radar/Receiver_GUI/data // base directory for output files
|
||||
@@ -1 +0,0 @@
|
||||
../BFfirmware_0/build/release/bin/l502-BFfirmware0.ldr
|
||||
Binary file not shown.
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.
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.
Binary file not shown.
Binary file not shown.
@@ -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.
Binary file not shown.
Binary file not shown.
@@ -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.
@@ -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.
@@ -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=""C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib"
|
||||
"C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" "C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib""/>
|
||||
<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;"C:\Program Files (x86)\L-Card\lpcie\include""/>
|
||||
<LIBPATH value=""C:\Program Files (x86)\Borland\CBuilder6\Projects";$(BCB)\lib\obj;$(BCB)\lib"/>
|
||||
<WARNINGS value="-w-par"/>
|
||||
<OTHERFILES value=""/>
|
||||
</MACROS>
|
||||
<OPTIONS>
|
||||
<IDLCFLAGS value="-I$(BCB)\include -I$(BCB)\include\vcl
|
||||
-I"C:\Program Files (x86)\L-Card\lpcie\include" -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"" -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;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
Binary file not shown.
@@ -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.
Binary file not shown.
|
After Width: | Height: | Size: 766 B |
Binary file not shown.
Binary file not shown.
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)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user