manually merged with ARM version

This commit is contained in:
2025-11-13 17:43:55 +03:00
parent f978759ae0
commit 04015fb4cb
463 changed files with 119514 additions and 45 deletions

View File

@ -0,0 +1,18 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20> E502 <20><> <20><><EFBFBD><EFBFBD><EFBFBD> "Borland C++ Builder".
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> "Borland C++ Builder 6" (x502_example.dpr) <20> <20><><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "Embarcadero C++ Builder XE" (x502_example.cbproj)
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> x502api.h, e502api.h, l502api.h <20> lcard_pstdint.h <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> x502api.lib, e5l502api.lib <20> l502api.lib <20><> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDK_DIR/lib/borland).
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20> E502, <20> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> C++ Builder.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD> <20><>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (X502_ProcessThread), <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>).

View File

@ -0,0 +1,526 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "unit.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
/* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void TForm1::updateControls() {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
btnRefreshDeviceList->Enabled = (hnd==NULL);
cbbDevList->Enabled = (hnd==NULL);
btnOpen->Caption = hnd == NULL ? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" :
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
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();
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> L502 <20> 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;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
freeDevList();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCI <20> USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt+usb_devcnt) != 0) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
devrecList.Length = pci_devcnt + usb_devcnt;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502, <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&devrecList[fnd_devcnt],
pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> E502, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> USB, <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ComboBox'<27> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
for (int32_t i=0; i < fnd_devcnt; i++) {
cbbDevList->Items->Add(AnsiString(devrecList[i].devname) + ", " + AnsiString(devrecList[i].serial));
}
/* <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
cbbDevList->ItemIndex = (old_index >= 0) && (old_index < fnd_devcnt) ? old_index : 0;
}
}
updateControls();
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GUI */
int32_t TForm1::setupParams() {
int32_t err = 0;
uint32_t lch_cnt = cbbLChCnt->ItemIndex+1;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
static uint32_t f_mode_tbl[] = {X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO};
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
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};
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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};
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
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]);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> */
if (err == X502_ERR_OK)
err = setAdcFreq();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. */
int32_t err = X502_SetAdcFreq(hnd, &f_acq, &f_lch);
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
edtAdcFreq->Text = FloatToStr(f_acq);
edtAdcFreqLch->Text = FloatToStr(f_lch);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
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;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + 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) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int32_t err = setupParams();
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> */
if (err == X502_ERR_OK)
err = X502_StreamsEnable(hnd, X502_STREAM_ADC);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (err == X502_ERR_OK)
err = setSyncDinStream();
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (thread) {
delete thread;
thread = NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
thread = new X502_ProcessThread(true);
thread->hnd = hnd;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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="";
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) */
thread->OnTerminate = OnThreadTerminate;
thread->Resume(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
threadRunning = true;
updateControls();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Close(hnd);
X502_Free(hnd);
hnd = NULL;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>,
<20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void __fastcall TForm1::btnOpenClick(TObject *Sender) {
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
if (hnd==NULL) {
int idx = cbbDevList->ItemIndex;
if ((idx >= 0) && (idx < devrecList.Length)) {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int32_t err = X502_OpenByDevRecord(hnd, &devrecList[idx]);
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
} else {
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!");
}
for (i=0; i < 4; i++) {
if ((a[i]<0) || (a[i] > 255)) {
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP-<2D><><EFBFBD><EFBFBD><EFBFBD>!!");
}
}
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int32_t err = X502_OpenByDevRecord(hnd, &devrec);
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
updateControls();
}
//---------------------------------------------------------------------------
void TForm1::closeDevice() {
if (hnd != NULL) {
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
if (threadRunning) {
thread->stop=1;
thread->WaitFor();
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
X502_Close(hnd);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::adcFreqEditChange(TObject *Sender) {
if (hnd != NULL) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> */
int32_t err = X502_SetLChannelCount(hnd, cbbLChCnt->ItemIndex+1);
if (err == X502_ERR_OK)
err = setAdcFreq();
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: " + 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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: " + 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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: " + 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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>: " + 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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncAdcFrameClick(TObject *Sender) {
if (hnd != NULL) {
uint32_t lch_cnt;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
int32_t err = setupParams();
if (err == X502_ERR_OK)
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
if (err == X502_ERR_OK) {
/* <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
double adc_data[3];
err = X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if (err != X502_ERR_OK) {
MessageDlg("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>: " + 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;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

View File

@ -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

View File

@ -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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool threadRunning; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
X502_ProcessThread *thread; //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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

View File

@ -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>

View File

@ -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>

View File

@ -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;
}
//---------------------------------------------------------------------------

View File

@ -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) {
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Syncronize, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VCL <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void __fastcall X502_ProcessThread::updateData() {
uint32_t lch_cnt;
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
for (uint32_t i=0; (i < lch_cnt) && (i < adcSize); i++)
lchResEdits[(firstLch + i)%lch_cnt]->Text = FloatToStrF(adcData[i], ffFixed, 4, 8);
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (dinSize) {
dinResEdit->Text = IntToHex((int)dinData[0]&0x3FFFF, 5);
} else {
dinResEdit->Text = "";
}
}
}
void __fastcall X502_ProcessThread::Execute() {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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 {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
<20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
while (!stop && (err == X502_ERR_OK)) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
int32_t rcv_size = X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... */
if (rcv_size < 0) {
err = rcv_size;
} else if (rcv_size>0) {
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
dinSize=RECV_BUF_SIZE;
adcSize=RECV_BUF_SIZE;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
err = X502_GetNextExpectedLchNum(hnd, &firstLch);
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, L502_PROC_FLAGS_VOLT,
adcData, &adcSize, dinData, &dinSize);
}
if (err == X502_ERR_OK) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
Synchronize(updateData);
}
}
}
/* <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
<20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int32_t stop_err = X502_StreamsStop(hnd);
if (err == X502_ERR_OK)
err = stop_err;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
delete rcv_buf;
delete dinData;
delete adcData;
}

View File

@ -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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
int err; //<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
t_x502_hnd hnd; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TEdit* lchResEdits[X502_LTABLE_MAX_CH_CNT];
TEdit* dinResEdit;
__fastcall X502_ProcessThread(bool CreateSuspended);
private:
void __fastcall updateData() ;
double* adcData;
uint32_t firstLch; /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> */
uint32_t adcSize;
uint32_t* dinData;
uint32_t dinSize;
};
//---------------------------------------------------------------------------
#endif

View File

@ -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

View File

@ -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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
devrecList : array of t_x502_devrec;
threadRunning : Boolean; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
thread: TX502_ProcessThread; //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
btnRefreshDeviceList.Enabled := hnd=nil;
cbbDevList.Enabled:= hnd=nil;
if hnd = nil then
btnOpen.Caption := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
else
btnOpen.Caption := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>';
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;
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
procedure TMainForm.refreshDeviceList();
var
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetLength(pci_devrecs, devcnt);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetLength(usb_devrecs, devcnt);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
res := E502_UsbGetDevRecordsList(usb_devrecs, 0);
if res > 0 then
SetLength(usb_devrecs, res)
else
SetLength(usb_devrecs, 0);
end;
// <20> devrecList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ComboBox'<27> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for i:=0 to Length(devrecList)-1 do
cbbDevList.Items.Add(AnsiString(devrecList[i].devname) + ', ' + AnsiString(devrecList[i].serial));
//<2F><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
if (old_index >= 0) and (old_index < Length(pci_devrecs)) then
cbbDevList.ItemIndex := old_index
else
cbbDevList.ItemIndex := 0;
end;
updateControls;
end;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GUI
function TMainForm.setupParams() : Integer;
var
err : Integer;
lch_cnt : LongWord;
const
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
mode_tbl: array[0..2] of LongWord = (X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO);
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> }
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);
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ComboBox <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := X502_SetLChannelCount(hnd, lch_cnt);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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]);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>
if err = X502_ERR_OK then
err := setAdcFreq();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if err = X502_ERR_OK then
err := X502_Configure(hnd, 0);
setupParams:= err;
end;
procedure TMainForm.closeDevice();
begin
if hnd<>nil then
begin
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
if threadRunning then
begin
thread.stop:=True;
thread.WaitFor;
end;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
X502_Close(hnd);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
X502_Free(hnd);
hnd := nil;
end;
end;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
err := X502_SetAdcFreq(hnd, f_acq, f_lch);
if err = X502_ERR_OK then
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
edtAdcFreq.Text := FloatToStr(f_acq);
edtAdcFreqLch.Text := FloatToStr(f_lch);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
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
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := X502_GetDevInfo(hnd,info);
if err <> X502_ERR_OK then
begin
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
//<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
X502_Close(hnd);
X502_Free(hnd);
hnd := nil;
end
else
begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
idx := cbbDevList.ItemIndex;
if (idx >= 0) and (idx < Length(devrecList)) then
begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hnd := X502_Create();
if hnd=nil then
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',mtError, [mbOK], 0)
else
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := X502_OpenByDevRecord(hnd, devrecList[idx]);
if err <> X502_ERR_OK then
begin
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> => <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + X502_GetErrorString(err),mtError, [mbOK], 0);
X502_Free(hnd);
hnd := nil;
end
else
begin
showDevInfo;
end;
end;
end;
end
else
begin
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
closeDevice;
end;
updateControls;
end;
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ip-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := E502_MakeDevRecordByIpAddr(devrec, parseIpAddr(edtIpAddr.Text), 0, 5000);
if err <> X502_ERR_OK then
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + X502_GetErrorString(err),mtError, [mbOK], 0)
else
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hnd := X502_Create;
if hnd=nil then
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',mtError, [mbOK], 0)
else
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := X502_OpenByDevRecord(hnd, devrec);
if err <> X502_ERR_OK then
begin
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> => <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + 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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: ' + 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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
end;
end;
procedure TMainForm.btnSetAdcFreqClick(Sender: TObject);
var err : Integer;
begin
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> }
err := X502_SetLChannelCount(hnd, cbbLChCnt.ItemIndex+1);
if err = X502_ERR_OK then
err := setAdcFreq();
if err <> X502_ERR_OK then
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + 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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := setupParams();
if err = X502_ERR_OK then
err := X502_GetLChannelCount(hnd, lch_cnt);
if err = X502_ERR_OK then
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetLength(adc_data, lch_cnt);
err := X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if err = X502_ERR_OK then
begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end
end
else
begin
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStartClick(Sender: TObject);
var
err : LongInt;
begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err := setupParams();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>
if err = X502_ERR_OK then
err := X502_StreamsEnable(hnd, X502_STREAM_ADC);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if err = X502_ERR_OK then
err := setSyncDinStream();
if err <> X502_ERR_OK then
begin
MessageDlg('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + 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:= '';
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) }
thread.OnTerminate := OnThreadTerminate;
thread.Resume; //<2F><><EFBFBD> Delphi 2010 <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Start
threadRunning := True;
updateControls;
end;
end;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> thread_run
procedure TMainForm.OnThreadTerminate(par : TObject);
begin
if thread.err <> X502_ERR_OK then
begin
MessageDlg('<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ' + 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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>: ' + 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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStopClick(Sender: TObject);
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
end.

View File

@ -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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err : LongInt; //<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
stop : Boolean; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
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;
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Syncronize, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VCL <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for i:=0 to Min(lch_cnt, adcSize) do
LChEdits[(firstLch + i) mod lch_cnt].Text := FloatToStrF(adcData[i], ffFixed, 4, 8);
{ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err:= X502_StreamsStart(hnd);
if err = X502_ERR_OK then
begin
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
<20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
while not stop and (err = X502_ERR_OK) do
begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
rcv_size := X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
if rcv_size < 0 then
err := rcv_size
else if rcv_size>0 then
begin
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dinSize:=RECV_BUF_SIZE;
adcSize:=RECV_BUF_SIZE;
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
err:=X502_GetNextExpectedLchNum(hnd, firstLch);
if err = X502_ERR_OK then
begin
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
err := X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adcData, adcSize, dinData, dinSize);
if err = X502_ERR_OK then
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Synchronize(updateData);
end;
end;
end
end;
{ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
<20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
stoperr:= X502_StreamsStop(hnd);
if err = X502_ERR_OK then
err:= stoperr;
end;
end;
end.

View File

@ -0,0 +1,24 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20> E502 <20><> <20><><EFBFBD><EFBFBD><EFBFBD> Delphi.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> "Delphi 7" (x502_example.dpr) <20> <20><><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "Embarcadero Delphi XE" (x502_example.dproj).
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Win64, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x502api.pas, l502api.pas <20> e502api.pas,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDK <20> SDK_DIR/pas
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
Delphi 7 - "Project->Options->Directories/Conditionals->Search path",
Delphi XE - "Project->Options->Delphi Compiler->Search path"
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20> E502, <20> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Delphi.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> "Borland C++ Builder" <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD> <20><>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (TX502_ProcessThread), <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>).

View File

@ -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\

View File

@ -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.

View File

@ -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.

Binary file not shown.

View File

@ -0,0 +1,18 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x502_out.vi <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> subVi.
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (x502_open, x502_outcfg)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OUT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> STOP <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (x502_stop) <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (x502_close)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lpcieNet.dll, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> GAC),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x502api.dll, l502api.dll <20> e502api.dll (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDK)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> LabView 8 <20> LabView 2010 (<28><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LabView <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> LabView 8)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,9 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20> DIN <20><> LabView <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20><><EFBFBD> E502.
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCIe <20> USB <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ethernet <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lpcieNet.dll, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> GAC),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x502api.dll, l502api.dll <20> e502api.dll (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDK)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> LabView 8 <20> LabView 2010 (<28><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LabView <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> LabView 8)

Binary file not shown.

View File

@ -0,0 +1,11 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20> DIN <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><> LabView <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 <20><><EFBFBD> E502.
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCIe <20> USB <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ethernet <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lpcieNet.dll, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> GAC),
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x502api.dll, l502api.dll <20> e502api.dll (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDK)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> LabView 8 <20> LabView 2010 (<28><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LabView <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> LabView 8)

View File

@ -0,0 +1,13 @@
This example demonstrates how to programm in LabView synchronous stream data acquisition from ADC and DIN and simultaneous preloaded cyclic DAC signal generation for L-502 and/or E-502 devices.
In example we first detect all detected devices on PCIe and USB buses and show them for user to select device. There is also option in example to use connected by Ethernet device by specify it IP-address.
After START button press we connect to selected device, configure it, preload DAC cyclic signals and start data acquisition and generation until STOP button press.
In this example we use .Net assembly lpcieNet.dll to get access to device functions from LabView
(this assemply is part of "L502/E502 SDK" http://www.lcard.ru/download/lpcie_setup.exe),
therefore it is necessary to have Microsoft Net Framework 2.0 installed. (preinstalled in Windows started from Vista).
Also it is necessary to have installed x502api.dll, l502api.dll <20> e502api.dll libraries in system (also part of SDK)
This example can be used in all LabView versions started from 8.0. Use example from subdirectory 10.0 for LabView 10.0
or higher and from subdirectory 8.0 for previous LabView version.

View File

@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 2.8.12)
add_subdirectory(x502_stream_read)
add_subdirectory(x502_dac_cntr_test)
add_subdirectory(e16_dac_cntr_test)
add_subdirectory(e16_overflow_test)
add_subdirectory(x502_ring_mode0_test)
add_subdirectory(x502_cycle_out)
add_subdirectory(e502_eth_svc_browse)
add_subdirectory(e502_timestamp_stream)
add_subdirectory(e16_dac_shift_test)

View File

@ -0,0 +1,274 @@
#include "l502api.h"
#include "e502api.h"
#include "../../devs/e502/e502_fpga_regs.h"
#include "dev_funcs.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>
#define TCP_CONNECTION_TOUT 5000
#define EVENT_CONNECTION_TOUT 100
#define DEV_E502_DEF "E502"
#define DEV_E16_DEF "E16"
#define DEV_LTA37_DEF "LTA37"
static char const *DEV_E502 = DEV_E502_DEF;
static char const *DEV_E16 = DEV_E16_DEF;
static char const *DEV_LTA37 = DEV_LTA37_DEF;
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;
uint32_t eth_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);
E502_SearchEthForDevicesIPv4Addr(NULL, 0, 0, &eth_devcnt, EVENT_CONNECTION_TOUT, TCP_CONNECTION_TOUT);
if ((pci_devcnt+usb_devcnt + e16_usb_devcnt + ip_cnt + eth_devcnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt +e16_usb_devcnt + ip_cnt + eth_devcnt) * 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;
}
}
if(eth_devcnt != 0) {
int32_t res = E502_SearchEthForDevicesIPv4Addr(&rec_list[fnd_devcnt], 0, eth_devcnt, NULL, EVENT_CONNECTION_TOUT, TCP_CONNECTION_TOUT);
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, uint32_t flags_clear) {
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 ||
sscanf(argv[i], DEV_E502_DEF":%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], DEV_E16_DEF":%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);
} else
if (sscanf(argv[i], DEV_LTA37_DEF":%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_LTA37;
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 {
devrec_list[dev_ind].flags &= ~flags_clear;
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK && err != X502_ERR_FPGA_NOT_LOADED) {
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;
}
t_x502_hnd select_dev_from_list(int argc, char** argv, uint32_t flags_clear) {
t_x502_hnd hnd;
uint32_t ver;
int32_t err = X502_ERR_OK;
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = f_dev_select_open(argc, argv, flags_clear);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd == NULL) {
return 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 && hnd) {
X502_Free(hnd);
hnd = NULL;
}
return hnd;
}

View File

@ -0,0 +1,8 @@
#ifndef __DEV_FUNCS_H__
#define __DEV_FUNCS_H__
#include "x502api.h"
t_x502_hnd select_dev_from_list(int argc, char** argv, uint32_t flags_clear);
#endif //__DEV_FUNCS_H__

View File

@ -0,0 +1,41 @@
#ifdef _WIN32
#include <windows.h>
#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 <time.h>
#ifdef _WIN32
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));
}

View File

@ -0,0 +1,15 @@
#ifndef __TIMESPEC_FUNCS_H__
#define __TIMESPEC_FUNCS_H__
#ifdef _WIN32
#define CLOCK_MONOTONIC 1
int clock_gettime(int a, struct timespec *spec);
#endif //_WIN32
void timespec_diff(struct timespec *a, struct timespec *b, struct timespec *result);
double timespec_to_double(struct timespec *ts);
#endif //__TIMESPEC_FUNCS_H__

View File

@ -0,0 +1,30 @@
# Данный файл описывает проект для системы сборки 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 e16_dac_cntr_test)
project(${PROJECT} C)
set(SOURCES main.c ../common/dev_funcs.c ../common/timespec_funcs.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api l502api e502api)

View File

@ -0,0 +1,230 @@
#include "l502api.h"
#include "e502api.h"
#include "../../devs/e502/e502_fpga_regs.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>
#define TCP_CONNECTION_TOUT 5000
int32_t f_setup_params(t_x502_hnd hnd);
/* Функция находит все подключенные модули по интерфейсам 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);
E16_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 = E16_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;
}
t_x502_hnd select_dev_from_list(int argc, char** argv) {
t_x502_hnd hnd;
uint32_t ver;
int32_t err = X502_ERR_OK;
/* получаем версию библиотеки */
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) {
return 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 && hnd) {
X502_Free(hnd);
hnd = NULL;
}
return hnd;
}

View File

@ -0,0 +1,489 @@
/*
При использовании заглушки соединяющей DOUT -> DIN есть возмость проверить корректность приема/передачи цифровых каналов в петле
При использовании флага DCI_TEST_MODE по каналу АЦП должен приниматься 32-битный счетчик
*/
/*
Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу с модулями L502 и E502 на примере синхронного
ввода данных с АЦП и цифровых линий.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам PCI-Express и 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 "dev_funcs.h"
#include "../../devs/e502/e502_fpga_regs.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 "timespec_funcs.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.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 & 0xFF000000)>>24) == 0x01 ? STREAM_IN_WRD_MSG : STREAM_IN_WRD_USR
/* признак необходимости завершить сбор данных */
static volatile int f_out = 0;
/* количество используемых логических каналов */
#define ADC_LCH_CNT 3
/* частота сбора АЦП в Гц*/
//#define ADC_FREQ 2000000
#define ADC_FREQ 400000
/* частота кадров (на логический канал). При ADC_FREQ/ADC_LCH_CNT - межкадровой задержки нет */
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 20000
//#define DIN_FREQ 50000
#define DOUT_FREQ 20000
#define ENABLE_DOUT
//#define ENABLE_DAC1
//#define ENABLE_DAC2
//#define STREAM_IN_ENABLE (X502_STREAM_ADC | X502_STREAM_DIN)
#define STREAM_IN_ENABLE (X502_STREAM_DIN)
//#define STREAM_IN_ENABLE (X502_STREAM_ADC)
//#define STREAM_IN_ENABLE (0)
//#define STREAM_IN_ENABLE (X502_STREAM_ADC)
#define TEST_ADC_CNTR_FLAG (1 << 7)
#define TEST_WR_DISABLE_FLAG (1 << 6)
#define TEST_RING_MODE_FLAG (1 << 5)
//#define WRD_MASK 0x3ffff
//#define WRD_MASK 0xffffff
#define WRD_MASK 0xffff
//#define WRD_MASK 0x3ff
//#define ENABLE_DCI_TEST_MODE (TEST_RING_MODE_FLAG)
//#define ENABLE_DCI_TEST_MODE (TEST_ADC_CNTR_FLAG | TEST_WR_DISABLE_FLAG | TEST_RING_MODE_FLAG)
//#define ENABLE_DCI_TEST_MODE TEST_ADC_CNTR_FLAG
//#define ENABLE_DCI_TEST_MODE (TEST_ADC_CNTR_FLAG | TEST_WR_DISABLE_FLAG)
//#define ENABLE_DCI_TEST_MODE TEST_WR_DISABLE_FLAG
#define TEST_MODE 0
//#define TEST_MODE TEST_ADC_CNTR_FLAG
// при ADC_FREQ==2000000 и DIN_FREQ==1000000 через Ethernet обязательно будет X502_STREAM_IN_MSG_OVERFLOW
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*66*3
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 500
uint32_t tstCntr = 0x7788;
uint32_t tstCntr24 = 0x7788;
int dac2_once = 1;
volatile int stream_ingibit_cntr = 1;
int g_test_mode;
#ifdef _WIN32
DWORD WINAPI ThreadFunc(void* arg)
#else
void * threadFunc(void * arg)
#endif
{
t_x502_hnd hnd = (t_x502_hnd)arg;
int32_t g_snd_cnt = 0;
static uint32_t snd_buf[READ_BLOCK_SIZE];
struct timespec start_time;
struct timespec cur_time;
struct timespec spent_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
while(!f_out) {
int32_t snd_cnt = 0;
uint32_t to_send = READ_BLOCK_SIZE;
uint32_t *to_send_ptr = snd_buf;
for (int i = 0; i < READ_BLOCK_SIZE; ) {
if (g_test_mode == TEST_RING_MODE_FLAG) {
snd_buf[i] = (tstCntr | ((tstCntr << 14) & 0xC0000000));
i++;
} else {
#ifdef ENABLE_DOUT
snd_buf[i] = tstCntr24 & 0xffff;
i++;
#endif
#ifdef ENABLE_DAC1
snd_buf[i] = (tstCntr & 0xffff) | X502_STREAM_OUT_WORD_TYPE_DAC1;
i++;
#endif
#ifdef ENABLE_DAC2
snd_buf[i] = (tstCntr & 0xffff) | X502_STREAM_OUT_WORD_TYPE_DAC2;
i++;
#endif
}
tstCntr++;
tstCntr24++;
}
while (to_send && !f_out) {
snd_cnt = X502_Send(hnd, to_send_ptr, to_send, READ_TIMEOUT);
if (snd_cnt < 0 || f_out) {
printf("thread exiting X502_Send err=%d\n", snd_cnt);
return 0;
}
to_send -= snd_cnt;
to_send_ptr += snd_cnt;
if (stream_ingibit_cntr > 0) {
stream_ingibit_cntr -=snd_cnt;
}
}
g_snd_cnt += READ_BLOCK_SIZE;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5)
{
timespec_diff(&cur_time, &start_time, &spent_time);
printf("cnt=%d sec=%f snd speed=%f wrds/sec\n", g_snd_cnt, timespec_to_double(&spent_time), g_snd_cnt / timespec_to_double(&spent_time));
start_time = cur_time;
g_snd_cnt = 0;
}
}
return 0;
}
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0,4,6};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_ZERO, 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};
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
int ch_cnt = 1;//ADC_LCH_CNT;
X502_SetSyncMode(hnd, X502_SYNC_INTERNAL);
//X502_SetSyncMode(hnd, X502_SYNC_DI_SYN1_FALL);
X502_StreamsStop(hnd);
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ch_cnt);
for (i=0; (i < ch_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_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, NULL);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота цифрового ввода = %0.0f\n",
f_adc, f_din);
}
}
double dout_freq = DOUT_FREQ;
err = X502_SetOutFreq(hnd, &dout_freq);
printf("X502_SetOutFreq err=%d dout_freq = %.1f\n", err, dout_freq);
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
int streams = 0;
#if defined(STREAM_IN_ENABLE)
streams |= STREAM_IN_ENABLE;
#endif
#if defined(ENABLE_DOUT) || defined(ENABLE_DAC1) || defined(ENABLE_DAC2)
streams |= X502_STREAM_ALL_OUT;
#endif
err = X502_StreamsEnable(hnd, streams);
}
return err;
}
void recv_proc(t_x502_hnd hnd) {
struct timespec start_time;
int32_t err = X502_ERR_OK;
int32_t g_rcv_cnt = 0;
int cntr = 0;
int rcv_cntr = 1;//0x02000000;
int din_rcv_cntr = 1;//0x02000000;
clock_gettime(CLOCK_MONOTONIC, &start_time);
#if !defined(STREAM_IN_ENABLE)
if(1) {
while(!f_out) {}
} else
#endif
while (err == X502_ERR_OK && !f_out) {
int32_t rcv_size;
uint32_t adc_size, din_size;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
int i;
struct timespec cur_time;
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
//printf("rcv_size=%d\n", rcv_size);
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=%ld wrds/sec adc_cntr=%x din_cntr=%x\n", (g_rcv_cnt) / (cur_time.tv_sec - start_time.tv_sec), rcv_cntr, din_rcv_cntr);
start_time.tv_sec = cur_time.tv_sec;
g_rcv_cnt = 0;
}
for (i = 0; i < rcv_size; i++) {
// тест с заглушкой DOUT -> DIN
t_stream_in_wrd_type type = STREAM_IN_WRD_TYPE(rcv_buf[i]);
/* проверяем - это данные от АЦП или цифровых входов */
#define INC_VAL 1
#define ADC_WRD_MASK 0xFFFFFF
if (g_test_mode == TEST_ADC_CNTR_FLAG) {
if (rcv_buf[i] != din_rcv_cntr)
{
printf("DIN %x[%i] %x expected\n", rcv_buf[i], i, din_rcv_cntr);
din_rcv_cntr = rcv_buf[i];
error = 1;
}
din_rcv_cntr += INC_VAL;
} else
if (rcv_buf[i] == X502_STREAM_IN_MSG_OVERFLOW) {
printf("overflow msg received!\n");
}
#if 1
else
if (type == STREAM_IN_WRD_ADC) {
if ((rcv_buf[i] & ADC_WRD_MASK) != (rcv_cntr & WRD_MASK ))
{
printf("ADC %x[%i] %x expected\n", rcv_buf[i], i, rcv_cntr);
rcv_cntr = rcv_buf[i];
error = 1;
}
rcv_cntr += INC_VAL;
} else
if (type == STREAM_IN_WRD_DIN) {
if ((rcv_buf[i] & WRD_MASK)!= (din_rcv_cntr & WRD_MASK))
{
printf("DIN %x[%i] %x expected\n", rcv_buf[i], i, din_rcv_cntr);
din_rcv_cntr = rcv_buf[i];
error = 1;
}
din_rcv_cntr += INC_VAL;
} else {
printf("unknown wrd %x[%i]\n", rcv_buf[i], i);
}
#endif
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#endif
}
}
int main(int argc, char** argv) {
t_x502_hnd hnd;
int32_t err = X502_ERR_OK;
#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
hnd = select_dev_from_list(argc, argv, 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd == NULL) {
return -1;
}
/* настраиваем параметры модуля */
err = f_setup_params(hnd);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
return -1;
}
#define E502_REGS_ARM_DCI_TEST_MODE 0x10C
g_test_mode = TEST_MODE;
// включаем режим когда по DCI должен передаваться счетчик начиная с 1
X502_FpgaRegWrite(hnd, E502_REGS_ARM_DCI_TEST_MODE, g_test_mode);
fprintf(stderr, "TEST_MODE = %x\n", g_test_mode);
X502_FpgaRegWrite(hnd, E502_REGS_IOHARD_GO_SYNC_IO, 0);
X502_FpgaRegWrite(hnd, E502_REGS_BF_CTL, X502_REGBIT_BF_CTL_BF_RESET_Msk);
#if defined(ENABLE_DOUT) || defined(ENABLE_DAC1) || defined(ENABLE_DAC2)
#ifdef _WIN32
HANDLE thread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
while(stream_ingibit_cntr > 0);
Sleep(2);
#else
pthread_t threadId;
// Create a thread that will function threadFunc()
err = pthread_create(&threadId, NULL, &threadFunc, hnd);
while(stream_ingibit_cntr > 0);
sleep(2);
#endif
#endif
/* запуск синхронного ввода-вывода */
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);
recv_proc(hnd);
#if defined(ENABLE_DOUT) || defined(ENABLE_DAC1) || defined(ENABLE_DAC2)
#ifdef _WIN32
//TODO: pthread_join
#else
pthread_join(threadId, NULL);
#endif
#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");
}
}
// выключаем режим когда по DCI должен передаваться счетчик начиная с 1
X502_FpgaRegWrite(hnd, E502_REGS_ARM_DCI_TEST_MODE, 0);
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
return err;
}

View File

@ -0,0 +1,41 @@
#ifdef _WIN32
#include <windows.h>
#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 <time.h>
#ifdef _WIN32
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));
}

View File

@ -0,0 +1,15 @@
#ifndef __TIMESPEC_FUNCS_H__
#define __TIMESPEC_FUNCS_H__
#ifdef _WIN32
#define CLOCK_MONOTONIC 1
int clock_gettime(int a, struct timespec *spec);
#endif //_WIN32
void timespec_diff(struct timespec *a, struct timespec *b, struct timespec *result);
double timespec_to_double(struct timespec *ts);
#endif //__TIMESPEC_FUNCS_H__

View File

@ -0,0 +1,34 @@
# Данный файл описывает проект для системы сборки 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 e16_dac_shift_test)
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})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api l502api e502api)
if(CMAKE_COMPILER_IS_GNUCC)
target_link_libraries(${PROJECT} m)
endif(CMAKE_COMPILER_IS_GNUCC)

View File

@ -0,0 +1,458 @@
/* Данный пример демонстрирует возможность установки циклического сигнала на
вывод в модуль 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 ADC_FREQ 2000000
#define ADC_LCH_CNT 1
#define READ_BLOCK_SIZE 4096*66*3
#define READ_TIMEOUT 2000
#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
uint16_t random_hex[] = {
0x93f8,
0x05f4,
0x9bf6,
0x7ffe,
0x161e,
0xe7ba,
0xf1af,
0x1e0f,
0x5ec0,
0xc8ff,
0x55e2,
0x9df0,
0x6a6c,
0xa649,
0x1ade,
0x1b24,
0x343d,
0x7b6b,
0x76b9,
0xc8fc,
0x2e3a,
0x24d9,
0xf189,
0xf1d1,
0xff71,
0xe23c,
0xa77f,
0x4d8e,
0x2858,
0xa96d,
0xf289,
0x7337,
0x640b,
0x57e9,
0x39ce,
0xdbd9,
0xb832,
0x315d,
0x441c,
0x863e,
0xf7b9,
0x8ecf,
0x1010,
0x88da,
0xeb76,
0x9302,
0xc160,
0x7238,
0xdda0,
0x4f94
};
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
а 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 uint32_t f_channels[] = {1};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[] = {X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[] = {X502_ADC_RANGE_10, X502_ADC_RANGE_10, X502_ADC_RANGE_02};
/* генерация пилы на весь период */
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);
}
static double f_gen_meander(uint32_t cntr, uint32_t total_size) {
return cntr < total_size/2 ? 5 : -1;
}
/* генерация меандра на всех выходах путем выдачи в первой половине на выходы 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[] = {
{1000, X502_DAC_RANGE, f_gen_saw, 0, NULL, NULL}, /* пила на одном канале с частотой 250?? Гц */
{2000, 2.5, f_gen_meander, 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;
}
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;
err = X502_SetAdcFreq(hnd, &f_adc, NULL);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n", f_adc);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
}
#define VAL_TOLERANCE 0.01
#define LEN_TOLERANCE 10
int f_test_length(const double *data, const size_t size, const int print){
uint32_t len = 0;
uint32_t old_len = 0;
uint32_t count = 0;
for (uint32_t i = 0; i < size - 1; i++){
if( abs(data[i] - data[i + 1]) > VAL_TOLERANCE) {
if(print){
printf("Front: %d, Length: %d\n", count, len);
}
if ((count > 1) && (abs(old_len - len) > LEN_TOLERANCE) ){
return 1;
}
i++;
count++;
old_len = len;
len = 0;
} else {
len++;
}
}
return 0;
}
int main(int argc, char **argv) {
int32_t err = 0;
uint32_t ver;
t_x502_hnd hnd = NULL;
int flag_verbose = 0;
int flag_exit_on_err = 1;
int32_t rcv_size;
uint32_t adc_size;
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
#ifdef _WIN32
/* устанавливаем локаль, чтобы можно было выводить по-русски в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
for (int i = 0; i < argc; i++){
if (!strcmp(argv[i], "verbose")){
flag_verbose = 1;
}
if(!strcmp(argv[i], "continue-on-err")){
flag_exit_on_err = 0;
}
}
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = select_dev_from_list(argc, argv, 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* Разрешаем dac1 на вывод and enable adc input */
err = X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DAC1);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка разрешения потоков (%d): %s!", err,
X502_GetErrorString(err));
} else {
err = f_setup_params(hnd);
if (err != X502_ERR_OK){
fprintf(stderr, "Ошибка настройки модуля: %s!\n", 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;
uint32_t err_cnt = 0;
/* Цикл ввода команд */
for (int block = 0; (err == X502_ERR_OK); block++) {
X502_AsyncOutDig(hnd, random_hex[block % sizeof(random_hex)], 0);
// printf("0x%x\n", random_hex[block % sizeof(random_hex)]);
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));
}
if (rcv_size > 0) {
uint32_t first_lch;
/* получаем номер логического канала, которому соответствует первый отсчет АЦП в массиве */
X502_GetNextExpectedLchNum(hnd, &first_lch);
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT, adc_data, &adc_size, NULL, NULL);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
} else {
uint32_t lch;
printf("Блок %3d. Обработано данных АЦП =%d\n", block, adc_size);
int ret = f_test_length(adc_data, adc_size, flag_verbose);
if (ret) {
err_cnt++;
printf("Cycle shifted %d times!\n", err_cnt);
if (flag_exit_on_err) {
err = 1;
}
}
// for (uint32_t i = 0; i < adc_size; i++){
// printf("%6.4f\n", adc_data[i]);
// }
printf("\n");
fflush(stdout);
}
}
}
X502_StreamsStop(hnd);
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}

View File

@ -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 e16_dac_shift_test

View File

@ -0,0 +1,34 @@
# Данный файл описывает проект для системы сборки 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 e16_overflow_test)
project(${PROJECT} C)
if(MSVC)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE,5.01")
endif(MSVC)
set(SOURCES main.c ../common/dev_funcs.c ../common/timespec_funcs.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
#include_directories(${LTEST_SOURCE_DIR}/../)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api l502api e502api)

View File

@ -0,0 +1,568 @@
#include "l502api.h"
#include "e502api.h"
#include "dev_funcs.h"
#include "../../devs/e502/e502_fpga_regs.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 "timespec_funcs.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "x502api_private.h"
#include "../../devs/e502/e502_cm4_defs.h"
#define STREAM_IN_WRD_TYPE(wrd) wrd & 0x80000000 ? STREAM_IN_WRD_ADC : \
(wrd & 0xFF000000) == 0x0 ? STREAM_IN_WRD_DIN : \
((wrd & 0xFF000000)>>24) == 0x01 ? STREAM_IN_WRD_MSG : STREAM_IN_WRD_USR
/* признак необходимости завершить сбор данных */
static volatile int f_out = 0;
/* количество используемых логических каналов */
#define ADC_LCH_CNT 3
/* частота сбора АЦП в Гц*/
//#define ADC_FREQ 2000000
#define ADC_FREQ 400000
/* частота кадров (на логический канал). При ADC_FREQ/ADC_LCH_CNT - межкадровой задержки нет */
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIGIN_FREQ 20000
#define DIGOUT_FREQ 400000
//#define ENABLE_DAC1
//#define ENABLE_DAC2
#define E16_REG_TEST_ADC_CNTR_BIT 0
#define E16_REG_TEST_WR_DISABLE_BIT 6
#define E16_REG_TEST_RING_MODE_BIT 5
#define DIN_WRD_MASK 0xffff
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*66*3
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 500
uint32_t tstCntr = 0x7788;
uint32_t tstCntr24 = 0x7788;
int dac2_once = 1;
typedef struct {
t_x502_hnd hnd;
// частота дискретизации АЦП
double adc_freq;
bool ring_mode;
bool verbose;
bool status_mode;
bool is_e502;
double digout_freq;
double digin_freq;
int streams_en;
} t_test_par;
#ifdef _WIN32
DWORD WINAPI ThreadFunc(void *arg)
#else
void * threadFunc(void *arg)
#endif
{
t_test_par *par = (t_test_par*)arg;
int32_t g_snd_cnt = 0;
static uint32_t snd_buf[READ_BLOCK_SIZE];
struct timespec start_time;
struct timespec cur_time;
struct timespec spent_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
while(!f_out) {
int32_t snd_cnt = 0;
uint32_t to_send = READ_BLOCK_SIZE;
uint32_t *to_send_ptr = snd_buf;
for (int i = 0; i < READ_BLOCK_SIZE; ) {
snd_buf[i] = tstCntr24 & 0xffff;
i++;
#ifdef ENABLE_DAC1
snd_buf[i] = (tstCntr & 0xffff) | X502_STREAM_OUT_WORD_TYPE_DAC1;
i++;
#endif
#ifdef ENABLE_DAC2
snd_buf[i] = (tstCntr & 0xffff) | X502_STREAM_OUT_WORD_TYPE_DAC2;
i++;
#endif
tstCntr++;
tstCntr24++;
}
while (to_send && !f_out) {
snd_cnt = X502_Send(par->hnd, to_send_ptr, to_send, READ_TIMEOUT);
if (snd_cnt < 0 || f_out) {
printf("thread exiting X502_Send err=%d\n", snd_cnt);
return snd_cnt;
}
to_send -= snd_cnt;
to_send_ptr += snd_cnt;
}
g_snd_cnt += READ_BLOCK_SIZE;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5)
{
timespec_diff(&cur_time, &start_time, &spent_time);
printf("cnt=%d sec=%f snd speed=%f wrds/sec\n", g_snd_cnt, timespec_to_double(&spent_time), g_snd_cnt / timespec_to_double(&spent_time));
start_time = cur_time;
g_snd_cnt = 0;
}
}
return 0;
}
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0,4,6};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_ZERO, 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};
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
/* настройка параметров модуля */
int32_t f_setup_params(t_test_par *par) {
int32_t err = X502_ERR_OK, i;
int ch_cnt = 1;//ADC_LCH_CNT;
X502_SetSyncMode(par->hnd, X502_SYNC_INTERNAL);
//X502_SetSyncMode(par->hnd, X502_SYNC_DI_SYN1_FALL);
X502_StreamsStop(par->hnd);
X502_StreamsDisable(par->hnd, X502_STREAM_ALL_IN | X502_STREAM_ALL_OUT);
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(par->hnd, ch_cnt);
for (i=0; (i < ch_cnt) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(par->hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
err = X502_SetAdcFreq(par->hnd, &par->adc_freq, NULL);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(par->hnd, &par->digin_freq);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота цифрового ввода = %0.0f\n",
par->adc_freq, par->digin_freq);
}
}
err = X502_SetOutFreq(par->hnd, &par->digout_freq);
printf("X502_SetOutFreq err=%d dout_freq = %.1f\n", err, par->digout_freq);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
err = X502_StreamsEnable(par->hnd, par->streams_en);
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(par->hnd, 0);
return err;
}
void recv_proc(t_test_par *par) {
struct timespec start_time;
int32_t err = X502_ERR_OK;
int32_t g_rcv_cnt = 0;
int cntr = 0;
int rcv_cntr = 1;//0x02000000;
int last_good_rcv_cntr = 1;//0x02000000;
int din_rcv_cntr = 1;//0x02000000;
int din_error_cntr = 0;
uint32_t ADC_WRD_MASK = 0xFFFFFF;
if (par->ring_mode) {
// если включен режим E16_REG_TEST_RING_MODE_BIT то проверяем только 16 бит
// 32бит 31бит - из потока ЦАП переходят 18 и 17 бит потока АЦП при включенном ring mode
ADC_WRD_MASK = 0xFFFF;
}
clock_gettime(CLOCK_MONOTONIC, &start_time);
if ((par->streams_en & (X502_STREAM_ADC | X502_STREAM_DIN)) == 0) {
while(!f_out) {}
} else
while (err == X502_ERR_OK && !f_out) {
int32_t rcv_size;
uint32_t adc_size, din_size;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
int i;
struct timespec cur_time;
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(par->hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
if (rcv_size < 0) {
fprintf(stderr, "Recv(%d) = %d\n", READ_BLOCK_SIZE, rcv_size);
break;
}
g_rcv_cnt += rcv_size;
int error = 0;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5 && par->verbose) {
printf("rcv speed=%ld wrds/sec adc_cntr=%x din_cntr=%x din_error_cntr=%d\n", (g_rcv_cnt) / (cur_time.tv_sec - start_time.tv_sec), rcv_cntr, din_rcv_cntr, din_error_cntr);
start_time.tv_sec = cur_time.tv_sec;
g_rcv_cnt = 0;
}
for (i = 0; i < rcv_size; i++) {
// тест с заглушкой DOUT -> DIN
t_stream_in_wrd_type type = STREAM_IN_WRD_TYPE(rcv_buf[i]);
/* проверяем - это данные от АЦП или цифровых входов */
#define INC_VAL 1
if (rcv_buf[i] == X502_STREAM_IN_MSG_OVERFLOW) {
if (rcv_buf[i] == rcv_cntr) {
// в E502 и E16 есть различие в режиме E16_REG_TEST_ADC_CNTR_BIT
// в E502 сырой счетчик 32 бит
// в E16 счетчик 24 бит, и чередование признака каналов какой был задан
rcv_cntr += INC_VAL;
} else {
printf("overflow msg received!\n");
}
}
else
if (par->is_e502 || type == STREAM_IN_WRD_ADC) {
if ((rcv_buf[i] & ADC_WRD_MASK) != (rcv_cntr & ADC_WRD_MASK ))
{
printf("ADC %x[%i] %x expected\n", rcv_buf[i], i, rcv_cntr);
printf("diff %d\n", (rcv_buf[i] & ADC_WRD_MASK) - (rcv_cntr & ADC_WRD_MASK));
rcv_cntr = rcv_buf[i];
error = 1;
}
rcv_cntr += INC_VAL;
} else
if (type == STREAM_IN_WRD_DIN) {
if ((rcv_buf[i] & DIN_WRD_MASK)!= (din_rcv_cntr & DIN_WRD_MASK))
{
if (!din_error_cntr) {
printf("DIN %x[%i] %x expected\n", rcv_buf[i], i, din_rcv_cntr);
printf("diff %d\n", (rcv_buf[i] & DIN_WRD_MASK) - (din_rcv_cntr & DIN_WRD_MASK));
}
din_rcv_cntr = rcv_buf[i];
din_error_cntr++;
} else {
if (din_error_cntr) {
printf("DIN error cntr: %d, rcv_val = %x\n", din_error_cntr, rcv_buf[i]);
printf("din_cntr - last_good = %d\n", (rcv_buf[i] & DIN_WRD_MASK) - (last_good_rcv_cntr & DIN_WRD_MASK));
}
last_good_rcv_cntr = rcv_buf[i];
din_error_cntr = 0;
}
din_rcv_cntr += INC_VAL;
} else {
if ((rcv_buf[i] & ADC_WRD_MASK) != (rcv_cntr & ADC_WRD_MASK ))
{
printf("unknown wrd %x[%i] %x expected\n", rcv_buf[i], i, rcv_cntr);
rcv_cntr = rcv_buf[i];
}
rcv_cntr += INC_VAL;
}
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#endif
}
}
#define ADC_FREQ_KEY "adc_freq"
#define RING_MODE_KEY "ring"
#define DIGOUT_FREQ_KEY "digout_freq"
#define DIGIN_FREQ_KEY "digin_freq"
#define VERBOSE_KEY "verbose"
void print_usage(char** argv) {
fprintf(stderr, "Опции:\n");
fprintf(stderr, " " ADC_FREQ_KEY ":частота АЦП в Гц, если не задано - выключен\n");
fprintf(stderr, " " DIGOUT_FREQ_KEY ":частота цифрового вывода Гц, если не задано - выключен\n");
fprintf(stderr, " " DIGIN_FREQ_KEY ":частота цифрового ввода Гц, если не задано - выключен\n");
fprintf(stderr, " " RING_MODE_KEY "\tкольцевой тест: ЦАП -> АЦП, иначе тестовый счетчик по каналу АЦП\n");
fprintf(stderr, " " VERBOSE_KEY "\tвыводить скорость\n");
fprintf(stderr, "\nПример: использовать E16 по адресу 192.168.12.152 и установить частоту сбора 1000000 Гц:\n");
fprintf(stderr, " %s E16:192.168.12.152 " ADC_FREQ_KEY ":1000000\n", argv[0]);
exit(0);
}
void parse_test_params(int argc, char** argv, t_test_par *par) {
int i;
par->adc_freq = ADC_FREQ;
par->ring_mode = false;
par->digout_freq = DIGOUT_FREQ;
par->digin_freq = DIGIN_FREQ;
par->verbose = false;
par->streams_en = 0;
par->status_mode = false;
for (i=1; (int)i < argc; i++) {
if (sscanf(argv[i], ADC_FREQ_KEY":%lf", &par->adc_freq) == 1) {
par->streams_en |= X502_STREAM_ADC;
} else
if (sscanf(argv[i], DIGOUT_FREQ_KEY":%lf", &par->digout_freq) == 1) {
par->streams_en |= X502_STREAM_ALL_OUT;
} else
if (sscanf(argv[i], DIGIN_FREQ_KEY":%lf", &par->digin_freq) == 1) {
par->streams_en |= X502_STREAM_DIN;
} else
if (strcmp(argv[i], RING_MODE_KEY) == 0) {
par->ring_mode = true;
continue;
} else
if (strcmp(argv[i], VERBOSE_KEY) == 0) {
par->verbose = true;
} else
if (strcmp("/?", argv[i]) == 0) {
print_usage(argv);
} else
if (strcmp("--help", argv[i]) == 0) {
print_usage(argv);
} else
if (strcmp("status", argv[i]) == 0) {
par->status_mode = true;
}
}
if (par->ring_mode) {
// если кольцевой тест, то включаем поток на вывод
par->streams_en |= X502_STREAM_ALL_OUT | X502_STREAM_ADC;
}
}
int e502_lpc_tst_start(t_x502_hnd hnd, uint16_t test, uint16_t flags) {
int err = E502_CortexExecCmd(hnd, E502_CM4_CMD_TEST_START,
test | ((uint32_t)flags << 16),
NULL, 0, NULL, 0, 0, NULL);
return err ;
}
int e502_lpc_tst_stop(t_x502_hnd hnd) {
int err = E502_CortexExecCmd(hnd, E502_CM4_CMD_TEST_STOP,
0, NULL, 0, NULL, 0, 0, NULL);
return err;
}
#define E502_REGS_ARM_DCI_TEST_MODE 0x10C
t_x502_info dev_info;
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
#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
#ifdef _WIN32
HANDLE thread;
#else
pthread_t thread;
#endif
t_test_par par;
parse_test_params(argc, argv, &par);
// HACK:
// сбрасываем флаг X502_DEVFLAGS_FPGA_LOADED,
// таким образом никаких манипуляций с регистрами не происходит
// и мы не нарушаем работу с уже запущенным потоком в другом экземпляре процесса
par.hnd = select_dev_from_list(argc, argv, par.status_mode ? X502_DEVFLAGS_FPGA_LOADED : 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (par.hnd == NULL) {
return -1;
}
err = X502_GetDevInfo(par.hnd, &dev_info);
par.is_e502 = strcmp(dev_info.name, "E502") ? false: true;
printf("is_e502=%d\n", par.is_e502);
if (!err && par.status_mode) {
// Специальный режим:
// по usb проверяем исчерпание буфера на вывод и переполнение буфера на ввода
// при этом поток идет по ethernet, через другой экземпляр данной утилиты (надо запустить отдельно и указать IP адрес!)
uint32_t status;
struct timespec start_time;
struct timespec cur_time;
struct timespec spent_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
while (!f_out) {
err = X502_OutGetStatusFlags(par.hnd, &status);
if (err) {
fprintf(stderr, "X502_OutGetStatusFlags error: %s\n", X502_GetErrorString(err));
break;
}
clock_gettime(CLOCK_MONOTONIC, &cur_time);
timespec_diff(&cur_time, &start_time, &spent_time);
if (status & X502_OUT_STATUS_FLAG_BUF_WAS_EMPTY) {
fprintf(stderr, "%f sec: BUF_WAS_EMPTY\n", timespec_to_double(&spent_time));
}
#ifdef _WIN32
Sleep(10);
#else
sleep(10);
#endif
}
goto close_module;
}
if (!par.streams_en) {
fprintf(stderr, "Потоки на ввод или вывод не включены!\n");
print_usage(argv);
return -1;
}
/* настраиваем параметры модуля */
if (err == X502_ERR_OK) {
err = f_setup_params(&par);
}
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
return -1;
}
if (par.ring_mode) {
// такого режима для E502 нет!
// вместо данных АЦП получаем данные которые выслали на DOUT
err = X502_FpgaRegWrite(par.hnd, E502_REGS_ARM_DCI_TEST_MODE, (1 << E16_REG_TEST_RING_MODE_BIT));
} else {
// вместо данных АЦП получаем счетчик
err = X502_FpgaRegWrite(par.hnd, E502_REGS_ARM_DCI_TEST_MODE, (1 << E16_REG_TEST_ADC_CNTR_BIT));
}
//err = e502_lpc_tst_start(par.hnd, E502_CM4_TEST_DCI_CNTR, 0);
if (err) {
return err;
}
X502_FpgaRegWrite(par.hnd, E502_REGS_IOHARD_GO_SYNC_IO, 0);
X502_FpgaRegWrite(par.hnd, E502_REGS_BF_CTL, X502_REGBIT_BF_CTL_BF_RESET_Msk);
if (par.streams_en & X502_STREAM_ALL_OUT) {
#ifdef _WIN32
thread = CreateThread(NULL, 0, ThreadFunc, &par, 0, NULL);
#else
// Create a thread that will function threadFunc()
err = pthread_create(&thread, NULL, threadFunc, &par);
#endif
{
uint32_t status = 0;
do {
err = X502_OutGetStatusFlags(par.hnd, &status);
} while (!f_out && err == X502_ERR_OK && (status & X502_OUT_STATUS_FLAG_BUF_IS_EMPTY));
}
}
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(par.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);
recv_proc(&par);
if (par.streams_en & X502_STREAM_ALL_OUT) {
#ifdef _WIN32
WaitForSingleObject(thread, INFINITE);
#else
pthread_join(thread, NULL);
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(par.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");
}
}
close_module:
// выключаем режим когда по DCI должен передаваться счетчик начиная с 1
X502_FpgaRegWrite(par.hnd, E502_REGS_ARM_DCI_TEST_MODE, 0);
/* закрываем связь с модулем */
X502_Close(par.hnd);
/* освобождаем описатель */
X502_Free(par.hnd);
return err;
}

View File

@ -0,0 +1,30 @@
# Данный файл описывает проект для системы сборки 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})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api e502api)

View File

@ -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

View File

@ -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="<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
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="<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
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>

View File

@ -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;
}

View File

@ -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

View File

@ -0,0 +1,30 @@
# Данный файл описывает проект для системы сборки 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})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api l502api e502api)

View File

@ -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;
}

View File

@ -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 fw_update)
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)

View File

@ -0,0 +1,293 @@
#include "l502api.h"
#include "e502api.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 "x502api_private.h"
/* признак необходимости завершить сбор данных */
static int f_out = 0;
t_x502_hnd g_hnd = NULL;
#define TCP_CONNECTION_TOUT 5000
#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) && (err != X502_ERR_FPGA_NOT_LOADED) && (err != X502_ERR_REF_FREQ_NOT_LOCKED)) {
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;
}
#ifndef _WIN32
#include <sys/stat.h> // stat
#include <stdbool.h> // bool type
#include <errno.h>
int update_firmware(char** args) {
int32_t err = X502_ERR_OK;
struct stat statbuf;
if ((stat(args[0], &statbuf)) != 0) {
err = errno;
fprintf(stderr, "Error (%d): file (%s) not found!\n", err, args[0]);
return err;
}
err = E502_SwitchToBootloader(g_hnd);
if (err != X502_ERR_OK) {
fprintf(stderr, "E502_SwitchToBootloader err=%d\n", err);
return err;
}
X502_Close(g_hnd);
/* освобождаем описатель */
X502_Free(g_hnd);
//char *args[] = { "./lboot", "-v", "-d", "E502", "usb", "--hash", "--con-time=5000", "/home/ruslan/vbox_share/e502-riscv.bin", NULL };
//-r" << "--recovery" << "--hash" << "--con-time=5000" << "--devname=E502
err = execve(args[0], args, NULL);
if (err == -1) {
err = errno;
fprintf(stderr, "execve error=%d\n", err);
}
return err;
}
#else
#define update_firmware(...) 0
#endif
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
if (argc < 2) {
fprintf(stderr, "Insufficient arguments\n");
return -2;
}
#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);
}
}
err = update_firmware(argv + 1);
if (err) {
return err;
}
/* закрываем связь с модулем */
X502_Close(g_hnd);
/* освобождаем описатель */
X502_Free(g_hnd);
}
return err;
}

View File

@ -0,0 +1,34 @@
# Данный файл описывает проект для системы сборки 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})
install(TARGETS ${PROJECT} DESTINATION .)
target_link_libraries(${PROJECT} x502api l502api e502api)
if(CMAKE_COMPILER_IS_GNUCC)
target_link_libraries(${PROJECT} m)
endif(CMAKE_COMPILER_IS_GNUCC)

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
а 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;
}

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