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

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,11 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN с одновременной выдачей
предварительно загруженного циклического сигнала на ЦАП на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT e502_eth_svc_browse)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api e502api)
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e502_eth_svc_browse", "e502_eth_svc_browse.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="e502_eth_svc_browse"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="e502_eth_svc_browse"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,205 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую, как можно выполнить поиск устройств E502 в локальной сети.
Пример запускается и непрерывно отслеживает появление (или исчезновение)
устройств в локальной сети, выводя информацию на консоль.
Поиск выполняется до нажатия любой клавиши на Windows или CTRL+C на Linux.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "e502api.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define INST_NAME_PRINT_FMT "%ls"
#else
#define INST_NAME_PRINT_FMT "%s"
#endif
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
int32_t stop_err;
uint32_t ver;
t_e502_eth_svc_browse_hnd browse_hnd;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/* Начинаем процесс поиска устройств в локальной сети */
err = E502_EthSvcBrowseStart(&browse_hnd, 0);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска поиска устройств в сети (%d): %s\n",
err, X502_GetErrorString(err));
} else {
printf("Запущен поиск устройств в локальной сети. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
while (!f_out && (err == X502_ERR_OK)) {
t_e502_eth_svc_record_hnd svc_rec;
uint32_t event;
/* пробуем получить запись, сообщающую о изменении информации о подулюенных
* устройтсвах */
err = E502_EthSvcBrowseGetEvent(browse_hnd, &svc_rec, &event, NULL, 300);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения записи о найденном устройстве (%d): %s\n",
err, X502_GetErrorString(err));
} else if (event != E502_ETH_SVC_EVENT_NONE) {
char inst_name[X502_INSTANCE_NAME_SIZE];
char dev_serial[X502_SERIAL_SIZE];
uint32_t addr;
int32_t cur_err;
#ifdef _WIN32
WCHAR inst_name_w[X502_INSTANCE_NAME_SIZE];
#endif
/* значение события, отличное от E502_ETH_SVC_EVENT_NONE, говорит
* о том, что изменение произошло. Для каждого события мы можем
* получить имя экземпляра и сер. номер устройства, для которого
* произошло событие */
cur_err = E502_EthSvcRecordGetInstanceName(svc_rec, inst_name);
if (cur_err == X502_ERR_OK)
cur_err = E502_EthSvcRecordGetDevSerial(svc_rec, dev_serial);
#ifdef _WIN32
if (cur_err == X502_ERR_OK) {
/* Имя устройства всегда в кодировке UTF-8. В Windows для
* представления юникодных строк используется формат UTF16
* и строка представляется в виде массива WCHAR.
* Для перевода используем функцию преобразования */
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, inst_name,
-1, inst_name_w, X502_INSTANCE_NAME_SIZE)==0) {
cur_err = X502_ERR_INSTANCE_NAME_ENCODING;
}
}
#endif
if (cur_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения параметров устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
} else {
if ((event == E502_ETH_SVC_EVENT_ADD) ||
(event == E502_ETH_SVC_EVENT_CHANGED)) {
/* События ADD и CHANGE означают, что устройство присутствует,
* и мы можем получить IP-адрес устройства */
cur_err = E502_EthSvcRecordResolveIPv4Addr(svc_rec, &addr, 4000);
if (cur_err == X502_ERR_OK) {
printf("%s: " INST_NAME_PRINT_FMT ", S/N: %s, Адрес = %d.%d.%d.%d\n",
event == E502_ETH_SVC_EVENT_ADD ? "Новое устройтсво" : "Изм. параметров",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial,
(addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
(addr >> 8) & 0xFF, addr & 0xFF
);
fflush(stdout);
} else {
fprintf(stderr, "Ошибка получения адреса устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
}
} else if (event == E502_ETH_SVC_EVENT_REMOVE) {
printf("Устройство отключено: " INST_NAME_PRINT_FMT ", S/N: %s\n",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial);
}
}
/* Для всех событий, кроме NONE, выделяется запись, которую
* нужно освободить вручную */
E502_EthSvcRecordFree(svc_rec);
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#endif
}
stop_err = E502_EthSvcBrowseStop(browse_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова поиска сервисов (%d): %s\n",
stop_err, X502_GetErrorString(stop_err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Останов поиска сервисов выполнен успешно!\n");
}
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -lx502api -le502api -o e502_eth_svc_browse
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.6)
set(PROJECT e502_timestamp_stream)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
@@ -0,0 +1,681 @@
/*
Пример работы с модулями E502-P1 поддерживающими механизм синхронизации времени по протоколу PTP.
Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу синхронного
ввода данных с АЦП и цифровых линий, а также работу с потоком данных включающим в себя метки времени.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include "x502tstp.h"
#include "../../devs/e502/e502_fpga_regs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <inttypes.h>
#include "x502api_private.h"
#define STREAM_IN_WRD_TYPE(wrd) wrd & 0x80000000 ? STREAM_IN_WRD_ADC : \
(wrd & 0xFF000000) == 0x0 ? STREAM_IN_WRD_DIN : \
(wrd & 0xF0000000) == 0x40000000 ? STREAM_IN_WRD_TSP : \
((wrd & 0xFF000000)>>24) == 0x01 ? STREAM_IN_WRD_MSG : STREAM_IN_WRD_USR
#ifdef _WIN32
#define CLOCK_MONOTONIC 1
int clock_gettime(int a, struct timespec *spec) {
__int64 wintime; GetSystemTimeAsFileTime((FILETIME*)&wintime);
wintime -=116444736000000000i64; //1jan1601 to 1jan1970
spec->tv_sec =wintime / 10000000i64; //seconds
spec->tv_nsec =wintime % 10000000i64 *100; //nano-seconds
return 0;
}
#endif
#define NSEC_PER_SEC 1000000000
void timespec_diff(struct timespec *a, struct timespec *b,
struct timespec *result) {
result->tv_sec = a->tv_sec - b->tv_sec;
result->tv_nsec = a->tv_nsec - b->tv_nsec;
if (result->tv_nsec < 0) {
--result->tv_sec;
result->tv_nsec += NSEC_PER_SEC;
}
}
double timespec_to_double(struct timespec *ts)
{
return ((double)(ts->tv_sec) + ((double)(ts->tv_nsec) / NSEC_PER_SEC));
}
/* признак необходимости завершить сбор данных */
static int f_out = 0;
/* количество используемых логических каналов */
#define ADC_LCH_CNT 1
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 1000000
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 1000000
#define ENABLE_ADC
#define ENABLE_DIN
// при ADC_FREQ==2000000 и DIN_FREQ==1000000 через Ethernet обязательно будет X502_STREAM_IN_MSG_OVERFLOW
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*66*3
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10};
t_x502_hnd g_hnd = NULL;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, uint32_t *ip_addr_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
//L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt + usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr(&rec_list[fnd_devcnt], ip_addr_list[i],0, TCP_CONNECTION_TOUT) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
uint32_t *ip_addr_list = NULL;
uint32_t ip_cnt = 0;
t_x502_hnd hnd = NULL;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_addr_list = malloc((argc-1) * sizeof(ip_addr_list[0]));
if (ip_addr_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_addr_list[ip_cnt++] = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_addr_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_addr_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
int streams = 0;
#ifdef ENABLE_ADC
streams |= X502_STREAM_ADC;
#endif
#ifdef ENABLE_DIN
streams |= X502_STREAM_DIN;
#endif
err = X502_StreamsEnable(hnd, streams);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
g_hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (g_hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(g_hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(g_hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/*err = X502_FpgaRegRead(g_hnd, E502_REGS_ARM_BLOCK, &val);
if (err) {
printf("X502_FpgaRegRead err=%d\n", err);
} else {
printf("X502_FpgaRegRead(E502_REGS_ARM_BLOCK) = %d\n", val);
} */
// Включаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 1);
X502_FpgaRegWrite(g_hnd, E502_REGS_IOHARD_GO_SYNC_IO, 0);
X502_FpgaRegWrite(g_hnd, E502_REGS_BF_CTL, X502_REGBIT_BF_CTL_BF_RESET_Msk);
X502_SetSyncMode(g_hnd, X502_SYNC_INTERNAL);
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(g_hnd);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
struct timespec start_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
int32_t g_rcv_cnt = 0;
int cntr = 0;
int rcv_cntr = 0;
t_x502_tstp_state tstp_state;
X502_tstp_init(&tstp_state, ADC_FREQ, DIN_FREQ);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
uint32_t adc_wrd_num = 0;
uint32_t din_wrd_num = 0;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static uint32_t snd_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
int i;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(g_hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
continue;
}
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
g_rcv_cnt += rcv_size;
int error = 0;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5) {
//printf("rcv speed=%lld wrds/sec cntr=%x\n", (g_rcv_cnt) / (cur_time.tv_sec - start_time.tv_sec), rcv_cntr);
start_time.tv_sec = cur_time.tv_sec;
g_rcv_cnt = 0;
}
for (i = 0; i < rcv_size; i++) {
uint32_t cur_wrd = rcv_buf[i];
uint64_t cur_wrd_time;
t_stream_in_wrd_type type = STREAM_IN_WRD_TYPE(cur_wrd);
X502_tstp_process_wrd(&tstp_state, cur_wrd);
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time) ;
/* проверяем - это данные от АЦП или цифровых входов */
if (type == STREAM_IN_WRD_DIN) {
uint16_t din_wrd;
static bool last_din_wrd_initialized = false;
static uint16_t last_din_wrd;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, DIN wrd unexpected!\n");
break;
}
din_wrd = din_data[din_wrd_num];
din_wrd_num++;
#define DIN_PPS_MASK 1
if (!last_din_wrd_initialized) {
last_din_wrd = din_wrd;
last_din_wrd_initialized = true;
} else
if ((din_wrd & DIN_PPS_MASK) != (last_din_wrd & DIN_PPS_MASK) && (din_wrd & DIN_PPS_MASK)) {
// дождались положительный фронт сигнала PPS на ножке DI1
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("DIN PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("DIN PPS positive edge pediod = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period), TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
last_din_wrd = din_wrd;
} else
if (type == STREAM_IN_WRD_ADC) {
static uint16_t last_adc_wrd;
register uint32_t wrd = rcv_buf[i];
double adc_val;
static bool adc_wait_for_edge = false;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, ADC wrd unexpected!\n");
break;
}
adc_val = adc_data[adc_wrd_num];
adc_wrd_num++;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
if (adc_wait_for_edge) {
if (adc_val > 2.4) {
// дождались положительный фронт сигнала PPS на 1 канале ADC
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
adc_wait_for_edge = false;
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("ADC PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("ADC PPS positive edge period = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period),
TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
} else
if (adc_val < 2.3) {
adc_wait_for_edge = true;
}
}
rcv_cntr++;
}
#if 0
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
int adc_data_num = 0;
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
#endif
if ((tstp_state.dinwrds_after_tstp / DIN_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.dinwrds_after_tstp / DIN_FREQ);
}
if ((tstp_state.adcwrds_after_tstp / ADC_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.adcwrds_after_tstp / ADC_FREQ);
}
continue;
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (_kbhit())
f_out = 1;
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(g_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
// Выключаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 0);
}
/* закрываем связь с модулем */
X502_Close(g_hnd);
/* освобождаем описатель */
X502_Free(g_hnd);
}
return err;
}
@@ -0,0 +1,33 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DL502API_INCLUDE_DIR=<путь к заголовочным файлам l502api> -DL502API_LIBRARIES_DIR=<путь к файлу линкера l502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DL502API_INCLUDE_DIR и -DL502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_cycle_out)
project(${PROJECT} C)
set(SOURCES main.c ../common/dev_funcs.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
if(CMAKE_COMPILER_IS_GNUCC)
target_link_libraries(${PROJECT} m)
endif(CMAKE_COMPILER_IS_GNUCC)
+296
View File
@@ -0,0 +1,296 @@
/* Данный пример демонстрирует возможность установки циклического сигнала на
вывод в модуль E16 / E502 / L502 (ввод не используется вообще).
В примере определена таблица сигналов, которая задает несколько
комбинаций сигналов для примера. Каждый сигнал задается количеством точек
на период (общее значение для всех трех сигналов), амплитудой для ЦАП'ов и
функцией для генерации очередного отсчета по его номеру и полному размеру.
Пользовтель может ввести номер сигнала, которых он хочет выставить и нажать Enter - и этот
сигнал будет выставлен на выходе.
Смена сигнала происходит по концу периода предыдущего.
Надо также помнить, что хотя мы можем загружать новый сигнал на фоне вывода
предыдущего, однако сразу после выполнения L502_OutCycleSetup() до того
времени как реально произойдет смена старого сигнала на новый нельзя
начинать загружать еще один новый сигнал.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в коментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файл l502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Доболнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dev_funcs.h"
#define TCP_CONNECTION_TOUT 5000
#define OUT_SIGNAL_SIZE 2000
#define OUT_BLOCK_SIZE 256
#define SEND_TOUT 500
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
typedef double (*f_gen_sig_word)(uint32_t cntr, uint32_t total_size, double amp);
typedef uint32_t (*f_gen_dout_word)(uint32_t cntr, uint32_t total_size);
/* структура, задающая сигналы на 2-х каналах ЦАП и/или1
1на DOUT */
typedef struct {
uint32_t size; /* количество точек в сигнале */
double amp_dac1; /* амплитуда сигнала для ЦАП1 */
f_gen_sig_word gen_func_dac1; /* функция для генерации отсчета для ЦАП1 */
double amp_dac2; /* амплитуда сигнала для ЦАП2 */
f_gen_sig_word gen_func_dac2; /* функция для генерации отсчета для ЦАП2 */
f_gen_dout_word gen_dout; /* функция для генерации слова на цифровой вывод */
} t_sig_struct;
/* генерация пилы на весь период */
static double f_gen_saw(uint32_t cntr, uint32_t total_size, double amp) {
return amp*( (int32_t)(cntr%total_size)-(int32_t)total_size/2)/(total_size/2);
}
/* генерация синуса на весь период */
static double f_gen_sin(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*M_PI*cntr/total_size);
}
/* генерация тестового честчика */
static double f_gen_cntr(uint32_t cntr, uint32_t total_size, double amp) {
return cntr + 0x123;
}
/* генерация синуса с периодом в два раза меньше периоду определяемому размером буфера */
static double f_gen_sin2(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*2*M_PI*cntr/total_size);
}
/* генерация меандра на всех выходах путем выдачи в первой половине на выходы 0xAA, а на второй 0x55 */
static uint32_t f_gen_dout_meander(uint32_t cntr, uint32_t total_size) {
return cntr < total_size/2 ? 0xAA : 0x55;
}
/* генерация счетчика на цифроых выхоах*/
static uint32_t f_gen_dout_cntr(uint32_t cntr, uint32_t total_size) {
return cntr;
}
/* таблица, задающая сигналы для выдачи на вход */
/* для модуля E16 частота выходного сигнала будет в 2 раза меньше, т.к. частота ЦАП 500КГц протип 1МГц у E502 */
static t_sig_struct f_sig_tbl[] = {
{100000, X502_DAC_RANGE, f_gen_saw, 0, NULL, NULL}, /* пила на одном канале с частотой 10 Гц */
{2000, X502_DAC_RANGE, f_gen_sin, 0, NULL, NULL}, /* синусоидальный сигнал на одном канале с частотой 500 Гц */
{100, X502_DAC_RANGE/2, f_gen_sin, X502_DAC_RANGE, f_gen_saw, NULL}, /* синус ампл. 2.5 и пила по 10 КГц */
{50, 0, NULL, X502_DAC_RANGE, f_gen_sin, f_gen_dout_cntr}, /* синус только на втором канале с частотой 20 КГц */
{2550, 1.5, f_gen_sin, 2.5, f_gen_sin2, f_gen_dout_meander}, /* на втором канале синус с частотой в 2 раза больше. меандр на цифровых линиях */
};
/* Запись в буфер драйвера блока данных от сигнала
cntr - номер отчета, соответствующего первому отсчету блока
size - количество отсчетов на канал (т.е. записывается ch_cnt*size отсчетов)
sig - номер сигнала
ch_cnt - кол-во используемых каналов (это кол-во можно определить по f_sig_tbl[sig],
но так как мы его уже определили, то передаем сюда, чтобы опять не определять */
static int32_t f_load_block(t_x502_hnd hnd, uint32_t cntr, uint32_t size, uint32_t sig, uint32_t ch_cnt) {
static double dac_data1[OUT_BLOCK_SIZE], dac_data2[OUT_BLOCK_SIZE];
static uint32_t dout_data[OUT_BLOCK_SIZE];
/* массив слов на запись в модуль - содержит смешенные подготовленные данные
для всех каналов (максимум для 3-х - 2 ЦАП + DOUT) */
static uint32_t sbuf[3*OUT_BLOCK_SIZE];
uint32_t i;
int32_t err = 0;
/* заполняем массив на вывод */
for (i=0; i < size; i++) {
if (f_sig_tbl[sig].gen_func_dac1 != NULL) {
dac_data1[i] = f_sig_tbl[sig].gen_func_dac1(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac1);
}
if (f_sig_tbl[sig].gen_func_dac2 != NULL) {
dac_data2[i] = f_sig_tbl[sig].gen_func_dac2(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac2);
}
if (f_sig_tbl[sig].gen_dout != NULL) {
dout_data[i] = f_sig_tbl[sig].gen_dout(cntr+i, f_sig_tbl[sig].size);
}
}
/* Если нужная функция определена, значит мы испоьлзуем этот канал, и
* подаем на вход сформированный массив. Иначе - канал не используется
* и передаем на вход NULL */
err = X502_PrepareData(hnd,
f_sig_tbl[sig].gen_func_dac1 ? dac_data1 : NULL,
f_sig_tbl[sig].gen_func_dac2 ? dac_data2 : NULL,
f_sig_tbl[sig].gen_dout ? dout_data : NULL,
size, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR,
sbuf);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка подкотовки данных на передачу: %s\n",
X502_GetErrorString(err));
} else {
/* посылаем данные */
int32_t snd_cnt = X502_Send(hnd, sbuf, size*ch_cnt, SEND_TOUT);
if (snd_cnt < 0) {
err = snd_cnt;
fprintf(stderr, "Ошибка передачи данных: %s\n", X502_GetErrorString(err));
} else if ((uint32_t)snd_cnt != size*ch_cnt) {
/* так как мы шлем всегда не больше чем готово, то должны
всегда передать все */
fprintf(stderr, "Переданно недостаточно данных: передавали = %d, передано = %d\n",
size*ch_cnt, snd_cnt);
err = X502_ERR_SEND_INSUFFICIENT_WORDS;
}
}
return err;
}
static int32_t f_load_cycle_signal(t_x502_hnd hnd, int sig) {
int32_t err = 0;
uint32_t cntr = 0;
uint32_t ch_cnt=0;
/* определяем, сколько каналов используем */
if (f_sig_tbl[sig].gen_func_dac1)
ch_cnt++;
if (f_sig_tbl[sig].gen_func_dac2)
ch_cnt++;
if (f_sig_tbl[sig].gen_dout)
ch_cnt++;
/* задаем размер буфера под все каналы! */
err = X502_OutCycleLoadStart(hnd, f_sig_tbl[sig].size*ch_cnt);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка старта загрузки данных: %s!", X502_GetErrorString(err));
/* в примере показано, что загружать можно поблочно, чтобы не выделять
* большой размер памяти на весь сигнал в программе. Но можно записать
* весь сигнал и за один L502_Send() */
while ((cntr != f_sig_tbl[sig].size) && (err == X502_ERR_OK)) {
uint32_t block_size = OUT_BLOCK_SIZE;
/* последний блок может быть меньшего размера, если размер буфера не кратен
* блоку */
if (block_size >(f_sig_tbl[sig].size-cntr))
block_size=f_sig_tbl[sig].size-cntr;
err = f_load_block(hnd, cntr, block_size, sig, ch_cnt);
if (!err)
cntr+=block_size;
}
/* делаем активным загруженный сигнал */
if (err == X502_ERR_OK) {
err = X502_OutCycleSetup(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка установки циклического сигнала: %s!", X502_GetErrorString(err));
}
return err;
}
int main(int argc, char **argv) {
int32_t err = 0;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifdef _WIN32
/* устанавливаем локаль, чтобы можно было выводить по-русски в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = select_dev_from_list(argc, argv, 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* Разрешаем все каналы на вывод (в этом примере мы не будем
использовать асинхронный вывод), а какие каналы реально будут
использованы определяем когда подаем данные в L502_PrepareData */
err = X502_StreamsEnable(hnd, X502_STREAM_ALL_OUT);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка разрешения потоков (%d): %s!", err,
X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
/* если хотим, то можем загрузить синхнал до разрешения
* синхронного ввода. Тогда мы могли бы его запустить, наприемер,
всесте с АЦП по L502_StreamsStart() */
err = f_load_cycle_signal(hnd, 1);
/* разрешаем синхронный ввод. В принципе можно его разрешить только
* после загрузки первого синала в нашем примере. Но данный пример
* показывает что мы можем сделать это и до выставления сигнала,
* например если захотим запустить ввод АЦП до того как будет нужно
* подать циклический сигнал на вывод */
if (err == X502_ERR_OK)
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
int exit = 0;
printf("Введите одно из следующего:\n");
printf(" число от 1 до %d - установить сигнал с указанным номером\n",
(int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])));
printf(" s или stop - останов генерации сигнала\n");
printf(" e или exit - выход из программы\n");
/* Цикл ввода команд */
while (!err && !exit) {
char cmd[512];
printf(">");
fflush(stdout);
scanf("%s", cmd);
if (!strcmp(cmd, "exit") || !strcmp(cmd,"e")) {
exit=1;
} else if (!strcmp(cmd, "stop")||!strcmp(cmd,"s")) {
err = X502_OutCycleStop(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова циклического сигнала (%d): %s\n",
err, X502_GetErrorString(err));
}
} else {
int sig = atoi(cmd);
if ((sig <= 0) || (sig > (int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])))) {
fprintf(stderr, "Неверный номер сигнала или неизвестная команда\n");
} else {
err = f_load_cycle_signal(hnd, sig-1);
}
}
}
X502_StreamsStop(hnd);
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_cycle_out
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_cycle_out", "x502_cycle_out.vcproj", "{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.ActiveCfg = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.Build.0 = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.ActiveCfg = Release|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_cycle_out"
ProjectGUID="{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
RootNamespace="x502_cycle_out"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_stream_read)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
+501
View File
@@ -0,0 +1,501 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу с модулями E16, L502 и E502 на примере синхронного
ввода данных с АЦП и цифровых линий.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам PCI-Express и USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 E16:192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Для указания что ip адрес принадлежит модулю E16, адрес надо указать с префиксом, пример: E16:192.168.1.6
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include <l502api.h>
#include "e502api.h"
//#include "dev_funcs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#endif
#include <stdio.h>
#include <stdlib.h>
/* количество используемых логических каналов */
#define ADC_LCH_CNT 3
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 500000
/* частота кадров (на логический канал). При ADC_FREQ/ADC_LCH_CNT - межкадровой задержки нет */
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 500000
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*200
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0,4,6};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10, X502_ADC_RANGE_10, X502_ADC_RANGE_10};
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
char const *DEV_E502 = "E502";
char const *DEV_E16 = "E16";
typedef struct {
uint32_t ip_addr;
char const *devname;
} ip_dev_list_t;
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, ip_dev_list_t *ip_dev_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
uint32_t e16_usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
E16_UsbGetDevRecordsList(NULL, 0, 0, &e16_usb_devcnt);
if ((pci_devcnt+usb_devcnt + e16_usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt +e16_usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E16, подключенных по USB, в конец массива */
if (e16_usb_devcnt!=0) {
int32_t res = E16_UsbGetDevRecordsList(&rec_list[fnd_devcnt], e16_usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr2(&rec_list[fnd_devcnt], ip_dev_list[i].ip_addr, 0, TCP_CONNECTION_TOUT, ip_dev_list[i].devname) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
t_x502_hnd hnd = NULL;
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
ip_dev_list_t *ip_dev_list = NULL;
uint32_t ip_cnt = 0;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_dev_list = malloc((argc - 1) * sizeof(ip_dev_list[0]));
if (ip_dev_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E502;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
} else
if (sscanf(argv[i], "E16:%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E16;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_dev_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_dev_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
err = X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DIN);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
/* результат меньше нуля означает ошибку */
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
} else if (rcv_size > 0) {
uint32_t first_lch;
/* получаем номер логического канала, которому соответствует первый отсчет АЦП в массиве */
X502_GetNextExpectedLchNum(hnd, &first_lch);
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
} else {
uint32_t lch;
printf("Блок %3d. Обработано данных АЦП = %d, цифровых входов = %d\n",
block, adc_size, din_size);
/* если приняли цифровые данные - выводим первый отсчет */
if (din_size != 0)
printf(" din_data = 0x%05X\n", din_data[0]);
/* выводим по одному отсчету на канал. если обработанный блок
начинается не с начала кадра, то в данном примере для
вывода берем конец неполного кадра и начало следующего */
for (lch=0; lch < ADC_LCH_CNT; lch++) {
/* определяем позицию первого отсчета, соответствующего заданному логическому каналу:
либо с конца не полного кадра, либо из начала следующего */
uint32_t pos = lch >= first_lch ? lch - first_lch : ADC_LCH_CNT-first_lch + lch;
if (pos <= adc_size) {
printf(" lch[%d]=%6.4f\n", lch, adc_data[pos]);
} else {
printf(" lch[%d]= ---- \n", lch);
}
}
printf("\n");
fflush(stdout);
}
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#else
{
// по нажатию Enter включаем/выключаем поток ADC
fd_set fds;
struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
if (select(1, &fds, NULL, NULL, &tv) == 1) {
int x;
static int adc_disabled = 0;
int ch;
if (adc_disabled) {
X502_StreamsEnable(hnd, X502_STREAM_ADC);
} else {
X502_StreamsDisable(hnd, X502_STREAM_ADC);
}
adc_disabled = !adc_disabled;
while(select(1, &fds, NULL, NULL, &tv) == 1) {
read(STDIN_FILENO, &ch, 1);
}
}
}
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_stream_read
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_stream_read", "x502_stream_read.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_stream_read"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="x502_stream_read"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

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