manually merged with ARM version
This commit is contained in:
18
x502api-1.1.34/examples/CppBuilder/x502_general/readme.txt
Normal file
18
x502api-1.1.34/examples/CppBuilder/x502_general/readme.txt
Normal 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>).
|
||||
526
x502api-1.1.34/examples/CppBuilder/x502_general/unit.cpp
Normal file
526
x502api-1.1.34/examples/CppBuilder/x502_general/unit.cpp
Normal 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;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
669
x502api-1.1.34/examples/CppBuilder/x502_general/unit.dfm
Normal file
669
x502api-1.1.34/examples/CppBuilder/x502_general/unit.dfm
Normal 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
|
||||
122
x502api-1.1.34/examples/CppBuilder/x502_general/unit.h
Normal file
122
x502api-1.1.34/examples/CppBuilder/x502_general/unit.h
Normal 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
|
||||
146
x502api-1.1.34/examples/CppBuilder/x502_general/x502_example.bpr
Normal file
146
x502api-1.1.34/examples/CppBuilder/x502_general/x502_example.bpr
Normal 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=""C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib"
|
||||
"C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" "C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib""/>
|
||||
<LIBRARIES value=""/>
|
||||
<SPARELIBS value="vcl.lib rtl.lib"/>
|
||||
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
|
||||
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
|
||||
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
|
||||
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
|
||||
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
|
||||
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
|
||||
indy.bpi bcb2kaxserver.bpi"/>
|
||||
<PATHCPP value=".;"/>
|
||||
<PATHPAS value=".;"/>
|
||||
<PATHRC value=".;"/>
|
||||
<PATHASM value=".;"/>
|
||||
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
|
||||
<RELEASELIBPATH value="$(BCB)\lib\release"/>
|
||||
<LINKER value="ilink32"/>
|
||||
<USERDEFINES value="_DEBUG"/>
|
||||
<SYSDEFINES value="_RTLDLL;NO_STRICT;USEPACKAGES"/>
|
||||
<MAINSOURCE value="x502_example.cpp"/>
|
||||
<INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl;"C:\Program Files (x86)\L-Card\lpcie\include""/>
|
||||
<LIBPATH value=""C:\Program Files (x86)\Borland\CBuilder6\Projects";$(BCB)\lib\obj;$(BCB)\lib"/>
|
||||
<WARNINGS value="-w-par"/>
|
||||
<OTHERFILES value=""/>
|
||||
</MACROS>
|
||||
<OPTIONS>
|
||||
<IDLCFLAGS value="-I$(BCB)\include -I$(BCB)\include\vcl
|
||||
-I"C:\Program Files (x86)\L-Card\lpcie\include" -src_suffix cpp -D_DEBUG
|
||||
-boa"/>
|
||||
<CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
|
||||
-tW -tWM"/>
|
||||
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
|
||||
<RFLAGS value=""/>
|
||||
<AFLAGS value="/mx /w2 /zd"/>
|
||||
<LFLAGS value="-D"" -aa -Tpe -x -Gn -v"/>
|
||||
<OTHERFILES value=""/>
|
||||
</OPTIONS>
|
||||
<LINKER>
|
||||
<ALLOBJ value="c0w32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/>
|
||||
<ALLRES value="$(RESFILES)"/>
|
||||
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/>
|
||||
<OTHERFILES value=""/>
|
||||
</LINKER>
|
||||
<FILELIST>
|
||||
<FILE FILENAME="x502_example.res" FORMNAME="" UNITNAME="x502_example.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="x502_example.cpp" FORMNAME="" UNITNAME="x502_example" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="unit.cpp" FORMNAME="Form1" UNITNAME="unit" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="x502_thread.cpp" FORMNAME="" UNITNAME="x502_thread" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" FORMNAME="" UNITNAME="e502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" FORMNAME="" UNITNAME="l502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" FORMNAME="" UNITNAME="x502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||
</FILELIST>
|
||||
<BUILDTOOLS>
|
||||
</BUILDTOOLS>
|
||||
|
||||
<IDEOPTIONS>
|
||||
[Version Info]
|
||||
IncludeVerInfo=0
|
||||
AutoIncBuild=0
|
||||
MajorVer=1
|
||||
MinorVer=0
|
||||
Release=0
|
||||
Build=0
|
||||
Debug=0
|
||||
PreRelease=0
|
||||
Special=0
|
||||
Private=0
|
||||
DLL=0
|
||||
Locale=1049
|
||||
CodePage=1251
|
||||
|
||||
[Version Info Keys]
|
||||
CompanyName=
|
||||
FileDescription=
|
||||
FileVersion=1.0.0.0
|
||||
InternalName=
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
OriginalFilename=
|
||||
ProductName=
|
||||
ProductVersion=1.0.0.0
|
||||
Comments=
|
||||
|
||||
[Excluded Packages]
|
||||
c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl=Borland Integrated Translation Environment
|
||||
|
||||
[HistoryLists\hlIncludePath]
|
||||
Count=5
|
||||
Item0=$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include
|
||||
Item1=C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include
|
||||
Item2=C:\Program Files (x86)\Borland\CBuilder6\Projects;
|
||||
Item3=$(BCB)\include;$(BCB)\include\vcl;
|
||||
Item4=$(BCB)\include;$(BCB)\include\vcl
|
||||
|
||||
[HistoryLists\hlLibraryPath]
|
||||
Count=2
|
||||
Item0=C:\Program Files (x86)\Borland\CBuilder6\Projects
|
||||
Item1=$(BCB)\lib\obj;$(BCB)\lib
|
||||
|
||||
[HistoryLists\hlDebugSourcePath]
|
||||
Count=1
|
||||
Item0=$(BCB)\source\vcl
|
||||
|
||||
[HistoryLists\hlConditionals]
|
||||
Count=1
|
||||
Item0=_DEBUG
|
||||
|
||||
[Debugging]
|
||||
DebugSourceDirs=$(BCB)\source\vcl
|
||||
|
||||
[Parameters]
|
||||
RunParams=
|
||||
Launcher=
|
||||
UseLauncher=0
|
||||
DebugCWD=
|
||||
HostApplication=
|
||||
RemoteHost=
|
||||
RemotePath=
|
||||
RemoteLauncher=
|
||||
RemoteCWD=
|
||||
RemoteDebug=0
|
||||
|
||||
[Compiler]
|
||||
ShowInfoMsgs=0
|
||||
LinkDebugVcl=0
|
||||
LinkCGLIB=0
|
||||
|
||||
[CORBA]
|
||||
AddServerUnit=1
|
||||
AddClientUnit=1
|
||||
PrecompiledHeaders=1
|
||||
</IDEOPTIONS>
|
||||
</PROJECT>
|
||||
@ -0,0 +1,294 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{52F5121E-CB05-4B98-8B26-2A5FA28782E4}</ProjectGuid>
|
||||
<ProjectType>CppVCLApplication</ProjectType>
|
||||
<MainSource>x502_example.cpp</MainSource>
|
||||
<Base>True</Base>
|
||||
<Config Condition="'$(Config)'==''">Debug</Config>
|
||||
<TargetedPlatforms>1</TargetedPlatforms>
|
||||
<AppType>Application</AppType>
|
||||
<FrameworkType>VCL</FrameworkType>
|
||||
<ProjectVersion>15.4</ProjectVersion>
|
||||
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
||||
<Base_Win32>true</Base_Win32>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
|
||||
<Base_Win64>true</Base_Win64>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
||||
<Cfg_1_Win32>true</Cfg_1_Win32>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
|
||||
<Cfg_1_Win64>true</Cfg_1_Win64>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
|
||||
<Cfg_2_Win32>true</Cfg_2_Win32>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
|
||||
<Cfg_2_Win64>true</Cfg_2_Win64>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base)'!=''">
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
||||
<SanitizedProjectName>x502_example</SanitizedProjectName>
|
||||
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
|
||||
<VerInfo_Locale>1049</VerInfo_Locale>
|
||||
<AllPackageLibs>vcl.lib;rtl.lib</AllPackageLibs>
|
||||
<DCC_UnitSearchPath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
|
||||
<FinalOutputDir>.</FinalOutputDir>
|
||||
<TASM_AdditionalSwitches> /w2</TASM_AdditionalSwitches>
|
||||
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
||||
<BRCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BRCC_IncludePath)</BRCC_IncludePath>
|
||||
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
||||
<DCC_AdditionalSwitches> -M</DCC_AdditionalSwitches>
|
||||
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
||||
<UsePackages>true</UsePackages>
|
||||
<ILINK_AppType>Windows</ILINK_AppType>
|
||||
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
||||
<DCC_IncludePath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_IncludePath)</DCC_IncludePath>
|
||||
<BCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BCC_IncludePath)</BCC_IncludePath>
|
||||
<TASM_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(TASM_IncludePath)</TASM_IncludePath>
|
||||
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
||||
<DynamicRTL>true</DynamicRTL>
|
||||
<ILINK_LibraryPath>C:\Program Files (x86)\Borland\CBuilder6\Projects;$(BDS)\lib\obj;$(BDS)\lib;$(BDS)\lib\psdk;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||
<BCC_GenerateWindowsApp>true</BCC_GenerateWindowsApp>
|
||||
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
||||
<BCC_PCHCache>true</BCC_PCHCache>
|
||||
<PackageImports>vcl.bpi;rtl.bpi;dbrtl.bpi;adortl.bpi;vcldb.bpi;vclx.bpi;bdertl.bpi;vcldbx.bpi;ibxpress.bpi;dsnap.bpi;dsnap.bpi;dsnapcon.bpi;teeui.bpi;teedb.bpi;tee.bpi;dss.bpi;dsnapcon.bpi;bcbsmp.bpi;vclie.bpi;xmlrtl.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;inetdb.bpi;webdsnap.bpi;bcbie.bpi;websnap.bpi;soaprtl.bpi;dbexpress.bpi;dbxcds.bpi;indycore.bpi;indysystem.bpi;bcboffice2k.bpi;$(PackageImports)</PackageImports>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
||||
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve</BCC_UserSuppliedOptions>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
||||
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
|
||||
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||
<OutputExt>.exe</OutputExt>
|
||||
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
|
||||
<ILINK_LibraryPath>C:\Program Files (x86)\L-Card\lpcie\lib\borland\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win64)'!=''">
|
||||
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
|
||||
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
|
||||
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||
<IntermediateOutputDir>Debug_Build</IntermediateOutputDir>
|
||||
<DCC_AdditionalSwitches> -M -V</DCC_AdditionalSwitches>
|
||||
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
||||
<TASM_Debugging>Full</TASM_Debugging>
|
||||
<DCC_Define>DEBUG;$(DCC_Define);$(DCC_Define)</DCC_Define>
|
||||
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
||||
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -k</BCC_UserSuppliedOptions>
|
||||
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
|
||||
<LinkPackageImports>vcl.bpi;rtl.bpi</LinkPackageImports>
|
||||
<OutputExt>exe</OutputExt>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<ILINK_LibraryPath>$(BDS)\lib\win32\release\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
|
||||
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||
<BCC_OptimizationLevel>Level2</BCC_OptimizationLevel>
|
||||
<DCC_AdditionalSwitches> -M -$O+</DCC_AdditionalSwitches>
|
||||
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||
<TASM_Debugging>None</TASM_Debugging>
|
||||
<IntermediateOutputDir>Release_Build</IntermediateOutputDir>
|
||||
<BCC_InlineFunctionExpansion>true</BCC_InlineFunctionExpansion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
|
||||
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
|
||||
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -r</BCC_UserSuppliedOptions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
|
||||
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<CppCompile Include="unit.cpp">
|
||||
<BuildOrder>8</BuildOrder>
|
||||
<Form>Form1</Form>
|
||||
<DependentOn>unit.h</DependentOn>
|
||||
<BuildOrder>6</BuildOrder>
|
||||
</CppCompile>
|
||||
<CppCompile Include="x502_example.cpp">
|
||||
<BuildOrder>5</BuildOrder>
|
||||
<BuildOrder>5</BuildOrder>
|
||||
</CppCompile>
|
||||
<ResFiles Include="x502_example.res">
|
||||
<BuildOrder>2</BuildOrder>
|
||||
<BuildOrder>4</BuildOrder>
|
||||
</ResFiles>
|
||||
<CppCompile Include="x502_thread.cpp">
|
||||
<BuildOrder>11</BuildOrder>
|
||||
<BuildOrder>3</BuildOrder>
|
||||
</CppCompile>
|
||||
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" Condition="'$(Platform)'=='Win32'">
|
||||
<BuildOrder>4</BuildOrder>
|
||||
<IgnorePath>true</IgnorePath>
|
||||
</LibFiles>
|
||||
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" Condition="'$(Platform)'=='Win32'">
|
||||
<BuildOrder>5</BuildOrder>
|
||||
<IgnorePath>true</IgnorePath>
|
||||
</LibFiles>
|
||||
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" Condition="'$(Platform)'=='Win32'">
|
||||
<BuildOrder>6</BuildOrder>
|
||||
<IgnorePath>true</IgnorePath>
|
||||
</LibFiles>
|
||||
<FormResources Include="unit.dfm"/>
|
||||
<BuildConfiguration Include="Release">
|
||||
<Key>Cfg_2</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Debug">
|
||||
<Key>Cfg_1</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
</ItemGroup>
|
||||
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets"/>
|
||||
<ProjectExtensions>
|
||||
<Borland.Personality>CPlusPlusBuilder.Personality.12</Borland.Personality>
|
||||
<Borland.ProjectType>CppVCLApplication</Borland.ProjectType>
|
||||
<BorlandProject>
|
||||
<CPlusPlusBuilder.Personality>
|
||||
<VersionInfo>
|
||||
<VersionInfo Name="IncludeVerInfo">0</VersionInfo>
|
||||
<VersionInfo Name="AutoIncBuild">0</VersionInfo>
|
||||
<VersionInfo Name="MajorVer">1</VersionInfo>
|
||||
<VersionInfo Name="MinorVer">0</VersionInfo>
|
||||
<VersionInfo Name="Release">0</VersionInfo>
|
||||
<VersionInfo Name="Build">0</VersionInfo>
|
||||
<VersionInfo Name="Debug">0</VersionInfo>
|
||||
<VersionInfo Name="PreRelease">0</VersionInfo>
|
||||
<VersionInfo Name="Special">0</VersionInfo>
|
||||
<VersionInfo Name="Private">0</VersionInfo>
|
||||
<VersionInfo Name="DLL">0</VersionInfo>
|
||||
<VersionInfo Name="Locale">1049</VersionInfo>
|
||||
<VersionInfo Name="CodePage">1251</VersionInfo>
|
||||
</VersionInfo>
|
||||
<VersionInfoKeys>
|
||||
<VersionInfoKeys Name="CompanyName"/>
|
||||
<VersionInfoKeys Name="FileDescription"/>
|
||||
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="InternalName"/>
|
||||
<VersionInfoKeys Name="LegalCopyright"/>
|
||||
<VersionInfoKeys Name="LegalTrademarks"/>
|
||||
<VersionInfoKeys Name="OriginalFilename"/>
|
||||
<VersionInfoKeys Name="ProductName"/>
|
||||
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="Comments"/>
|
||||
</VersionInfoKeys>
|
||||
<ExcludedPackages>
|
||||
<ExcludedPackages Name="c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl">Borland Integrated Translation Environment</ExcludedPackages>
|
||||
</ExcludedPackages>
|
||||
<HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Count">5</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Item0">$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Item1">C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Item2">C:\Program Files (x86)\Borland\CBuilder6\Projects;</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Item3">$(BCB)\include;$(BCB)\include\vcl;</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlIncludePath Name="Item4">$(BCB)\include;$(BCB)\include\vcl</HistoryLists_hlIncludePath>
|
||||
</HistoryLists_hlIncludePath>
|
||||
<HistoryLists_hlLibraryPath>
|
||||
<HistoryLists_hlLibraryPath Name="Count">2</HistoryLists_hlLibraryPath>
|
||||
<HistoryLists_hlLibraryPath Name="Item0">C:\Program Files (x86)\Borland\CBuilder6\Projects</HistoryLists_hlLibraryPath>
|
||||
<HistoryLists_hlLibraryPath Name="Item1">$(BCB)\lib\obj;$(BCB)\lib</HistoryLists_hlLibraryPath>
|
||||
</HistoryLists_hlLibraryPath>
|
||||
<HistoryLists_hlDebugSourcePath>
|
||||
<HistoryLists_hlDebugSourcePath Name="Count">1</HistoryLists_hlDebugSourcePath>
|
||||
<HistoryLists_hlDebugSourcePath Name="Item0">$(BCB)\source\vcl</HistoryLists_hlDebugSourcePath>
|
||||
</HistoryLists_hlDebugSourcePath>
|
||||
<HistoryLists_hlConditionals>
|
||||
<HistoryLists_hlConditionals Name="Count">1</HistoryLists_hlConditionals>
|
||||
<HistoryLists_hlConditionals Name="Item0">_DEBUG</HistoryLists_hlConditionals>
|
||||
</HistoryLists_hlConditionals>
|
||||
<Debugging>
|
||||
<Debugging Name="DebugSourceDirs">$(BCB)\source\vcl</Debugging>
|
||||
</Debugging>
|
||||
<Parameters>
|
||||
<Parameters Name="RunParams"/>
|
||||
<Parameters Name="Launcher"/>
|
||||
<Parameters Name="UseLauncher">0</Parameters>
|
||||
<Parameters Name="DebugCWD"/>
|
||||
<Parameters Name="HostApplication"/>
|
||||
<Parameters Name="RemoteHost"/>
|
||||
<Parameters Name="RemotePath"/>
|
||||
<Parameters Name="RemoteLauncher"/>
|
||||
<Parameters Name="RemoteCWD"/>
|
||||
<Parameters Name="RemoteDebug">0</Parameters>
|
||||
</Parameters>
|
||||
<Compiler>
|
||||
<Compiler Name="ShowInfoMsgs">0</Compiler>
|
||||
<Compiler Name="LinkDebugVcl">0</Compiler>
|
||||
<Compiler Name="LinkCGLIB">0</Compiler>
|
||||
</Compiler>
|
||||
<CORBA>
|
||||
<CORBA Name="AddServerUnit">1</CORBA>
|
||||
<CORBA Name="AddClientUnit">1</CORBA>
|
||||
<CORBA Name="PrecompiledHeaders">1</CORBA>
|
||||
</CORBA>
|
||||
<ProjectProperties>
|
||||
<ProjectProperties Name="AutoShowDeps">False</ProjectProperties>
|
||||
<ProjectProperties Name="ManagePaths">True</ProjectProperties>
|
||||
<ProjectProperties Name="VerifyPackages">True</ProjectProperties>
|
||||
<ProjectProperties Name="IndexFiles">False</ProjectProperties>
|
||||
</ProjectProperties>
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k200.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp200.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k200.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dclofficexp200.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
<Source>
|
||||
<Source Name="MainSource">x502_example.cpp</Source>
|
||||
</Source>
|
||||
</CPlusPlusBuilder.Personality>
|
||||
<Platforms>
|
||||
<Platform value="Win32">True</Platform>
|
||||
<Platform value="Win64">False</Platform>
|
||||
</Platforms>
|
||||
</BorlandProject>
|
||||
<ProjectFileVersion>12</ProjectFileVersion>
|
||||
</ProjectExtensions>
|
||||
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Cpp.Targets')"/>
|
||||
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
|
||||
</Project>
|
||||
@ -0,0 +1,40 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
USEFORM("unit.cpp", Form1);
|
||||
//---------------------------------------------------------------------------
|
||||
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
|
||||
{
|
||||
try
|
||||
{
|
||||
Application->Initialize();
|
||||
Application->CreateForm(__classid(TForm1), &Form1);
|
||||
Application->Run();
|
||||
}
|
||||
catch (Exception &exception)
|
||||
{
|
||||
Application->ShowException(&exception);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
try
|
||||
{
|
||||
throw Exception("");
|
||||
}
|
||||
catch (Exception &exception)
|
||||
{
|
||||
Application->ShowException(&exception);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
BIN
x502api-1.1.34/examples/CppBuilder/x502_general/x502_example.res
Normal file
BIN
x502api-1.1.34/examples/CppBuilder/x502_general/x502_example.res
Normal file
Binary file not shown.
100
x502api-1.1.34/examples/CppBuilder/x502_general/x502_thread.cpp
Normal file
100
x502api-1.1.34/examples/CppBuilder/x502_general/x502_thread.cpp
Normal 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;
|
||||
}
|
||||
@ -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
|
||||
681
x502api-1.1.34/examples/Delphi/x502_general/MainUnit.dfm
Normal file
681
x502api-1.1.34/examples/Delphi/x502_general/MainUnit.dfm
Normal 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
|
||||
712
x502api-1.1.34/examples/Delphi/x502_general/MainUnit.pas
Normal file
712
x502api-1.1.34/examples/Delphi/x502_general/MainUnit.pas
Normal 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.
|
||||
@ -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.
|
||||
24
x502api-1.1.34/examples/Delphi/x502_general/readme.txt
Normal file
24
x502api-1.1.34/examples/Delphi/x502_general/readme.txt
Normal 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>).
|
||||
141
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dof
Normal file
141
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dof
Normal 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\
|
||||
14
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dpr
Normal file
14
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dpr
Normal 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.
|
||||
119
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dproj
Normal file
119
x502api-1.1.34/examples/Delphi/x502_general/x502_example.dproj
Normal 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>
|
||||
BIN
x502api-1.1.34/examples/Delphi/x502_general/x502_example.res
Normal file
BIN
x502api-1.1.34/examples/Delphi/x502_general/x502_example.res
Normal file
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 766 B |
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/lcm.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/lcm.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_close.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_close.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_gen_signal.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_gen_signal.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_open.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_open.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_out.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_out.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_out_cfg.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_out_cfg.vi
Normal file
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_stop.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/10.0/x502_stop.vi
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/lcm.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/lcm.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_close.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_close.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_gen_signal.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_gen_signal.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_open.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_open.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_out.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_out.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_out_cfg.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_out_cfg.vi
Normal file
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_stop.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/8.0/x502_stop.vi
Normal file
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/generate_sin_point.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/generate_sin_point.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/lcm.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/lcm.vi
Normal file
Binary file not shown.
18
x502api-1.1.34/examples/LabView/x502_out/readme.txt
Normal file
18
x502api-1.1.34/examples/LabView/x502_out/readme.txt
Normal 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)
|
||||
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_close.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_close.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_gen_signal.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_gen_signal.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_open.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_open.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_out.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_out.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_out_cfg.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_out_cfg.vi
Normal file
Binary file not shown.
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_stop.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_out/x502_stop.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_recv/10.0/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/10.0/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_recv/10.0/x502_recv.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/10.0/x502_recv.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_recv/8.0/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/8.0/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_recv/8.0/x502_recv.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/8.0/x502_recv.vi
Normal file
Binary file not shown.
9
x502api-1.1.34/examples/LabView/x502_recv/readme.txt
Normal file
9
x502api-1.1.34/examples/LabView/x502_recv/readme.txt
Normal 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)
|
||||
BIN
x502api-1.1.34/examples/LabView/x502_recv/x502_err_sub.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/x502_err_sub.vi
Normal file
Binary file not shown.
BIN
x502api-1.1.34/examples/LabView/x502_recv/x502_recv.vi
Normal file
BIN
x502api-1.1.34/examples/LabView/x502_recv/x502_recv.vi
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,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.
|
||||
Binary file not shown.
Binary file not shown.
11
x502api-1.1.34/examples/c/CMakeLists.txt
Normal file
11
x502api-1.1.34/examples/c/CMakeLists.txt
Normal 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)
|
||||
274
x502api-1.1.34/examples/c/common/dev_funcs.c
Normal file
274
x502api-1.1.34/examples/c/common/dev_funcs.c
Normal 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, ð_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;
|
||||
}
|
||||
|
||||
8
x502api-1.1.34/examples/c/common/dev_funcs.h
Normal file
8
x502api-1.1.34/examples/c/common/dev_funcs.h
Normal 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__
|
||||
41
x502api-1.1.34/examples/c/common/timespec_funcs.c
Normal file
41
x502api-1.1.34/examples/c/common/timespec_funcs.c
Normal 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));
|
||||
}
|
||||
15
x502api-1.1.34/examples/c/common/timespec_funcs.h
Normal file
15
x502api-1.1.34/examples/c/common/timespec_funcs.h
Normal 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__
|
||||
30
x502api-1.1.34/examples/c/e16_dac_cntr_test/CMakeLists.txt
Normal file
30
x502api-1.1.34/examples/c/e16_dac_cntr_test/CMakeLists.txt
Normal 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)
|
||||
230
x502api-1.1.34/examples/c/e16_dac_cntr_test/dev_funcs.c
Normal file
230
x502api-1.1.34/examples/c/e16_dac_cntr_test/dev_funcs.c
Normal 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;
|
||||
}
|
||||
|
||||
489
x502api-1.1.34/examples/c/e16_dac_cntr_test/main.c
Normal file
489
x502api-1.1.34/examples/c/e16_dac_cntr_test/main.c
Normal 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;
|
||||
}
|
||||
41
x502api-1.1.34/examples/c/e16_dac_cntr_test/timespec_funcs.c
Normal file
41
x502api-1.1.34/examples/c/e16_dac_cntr_test/timespec_funcs.c
Normal 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));
|
||||
}
|
||||
15
x502api-1.1.34/examples/c/e16_dac_cntr_test/timespec_funcs.h
Normal file
15
x502api-1.1.34/examples/c/e16_dac_cntr_test/timespec_funcs.h
Normal 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__
|
||||
34
x502api-1.1.34/examples/c/e16_dac_shift_test/CMakeLists.txt
Normal file
34
x502api-1.1.34/examples/c/e16_dac_shift_test/CMakeLists.txt
Normal 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)
|
||||
458
x502api-1.1.34/examples/c/e16_dac_shift_test/main.c
Normal file
458
x502api-1.1.34/examples/c/e16_dac_shift_test/main.c
Normal 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
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
48
x502api-1.1.34/examples/c/e16_dac_shift_test/makefile
Normal file
48
x502api-1.1.34/examples/c/e16_dac_shift_test/makefile
Normal 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
|
||||
34
x502api-1.1.34/examples/c/e16_overflow_test/CMakeLists.txt
Normal file
34
x502api-1.1.34/examples/c/e16_overflow_test/CMakeLists.txt
Normal 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)
|
||||
568
x502api-1.1.34/examples/c/e16_overflow_test/main.c
Normal file
568
x502api-1.1.34/examples/c/e16_overflow_test/main.c
Normal 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;
|
||||
}
|
||||
30
x502api-1.1.34/examples/c/e502_eth_svc_browse/CMakeLists.txt
Normal file
30
x502api-1.1.34/examples/c/e502_eth_svc_browse/CMakeLists.txt
Normal 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)
|
||||
@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||
# Visual C++ Express 2008
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e502_eth_svc_browse", "e502_eth_svc_browse.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@ -0,0 +1,199 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Name="e502_eth_svc_browse"
|
||||
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
|
||||
RootNamespace="e502_eth_svc_browse"
|
||||
Keyword="Win32Proj"
|
||||
TargetFrameworkVersion="196613"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="x502api.lib e502api.lib"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="x502api.lib e502api.lib"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="<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>
|
||||
205
x502api-1.1.34/examples/c/e502_eth_svc_browse/main.c
Normal file
205
x502api-1.1.34/examples/c/e502_eth_svc_browse/main.c
Normal 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;
|
||||
}
|
||||
48
x502api-1.1.34/examples/c/e502_eth_svc_browse/makefile
Normal file
48
x502api-1.1.34/examples/c/e502_eth_svc_browse/makefile
Normal 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
|
||||
@ -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)
|
||||
681
x502api-1.1.34/examples/c/e502_timestamp_stream/main.c
Normal file
681
x502api-1.1.34/examples/c/e502_timestamp_stream/main.c
Normal 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;
|
||||
}
|
||||
29
x502api-1.1.34/examples/c/fw_update/CMakeLists.txt
Normal file
29
x502api-1.1.34/examples/c/fw_update/CMakeLists.txt
Normal 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)
|
||||
293
x502api-1.1.34/examples/c/fw_update/main.c
Normal file
293
x502api-1.1.34/examples/c/fw_update/main.c
Normal 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;
|
||||
}
|
||||
34
x502api-1.1.34/examples/c/x502_cycle_out/CMakeLists.txt
Normal file
34
x502api-1.1.34/examples/c/x502_cycle_out/CMakeLists.txt
Normal 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)
|
||||
296
x502api-1.1.34/examples/c/x502_cycle_out/main.c
Normal file
296
x502api-1.1.34/examples/c/x502_cycle_out/main.c
Normal file
@ -0,0 +1,296 @@
|
||||
/* Данный пример демонстрирует возможность установки циклического сигнала на
|
||||
вывод в модуль E16 / E502 / L502 (ввод не используется вообще).
|
||||
|
||||
В примере определена таблица сигналов, которая задает несколько
|
||||
комбинаций сигналов для примера. Каждый сигнал задается количеством точек
|
||||
на период (общее значение для всех трех сигналов), амплитудой для ЦАП'ов и
|
||||
функцией для генерации очередного отсчета по его номеру и полному размеру.
|
||||
|
||||
Пользовтель может ввести номер сигнала, которых он хочет выставить и нажать Enter - и этот
|
||||
сигнал будет выставлен на выходе.
|
||||
|
||||
Смена сигнала происходит по концу периода предыдущего.
|
||||
Надо также помнить, что хотя мы можем загружать новый сигнал на фоне вывода
|
||||
предыдущего, однако сразу после выполнения L502_OutCycleSetup() до того
|
||||
времени как реально произойдет смена старого сигнала на новый нельзя
|
||||
начинать загружать еще один новый сигнал.
|
||||
|
||||
|
||||
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
|
||||
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
|
||||
в коментариях в соответствующих файлах).
|
||||
|
||||
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
|
||||
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
|
||||
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
|
||||
на тот, где у вас лежат заголовочный файл l502api.h и измените путь к библиотекам
|
||||
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
|
||||
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
|
||||
|
||||
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
|
||||
то для корректного отображения русских букв в программе нужно изменить кодировку
|
||||
или указать сохранение с сигнатурой кодировки для UTF-8:
|
||||
выберите Файл (File) -> Доболнительные параметры сохранения (Advanced Save Options)...
|
||||
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
|
||||
и сохраните изменения в файле.
|
||||
*/
|
||||
|
||||
#include "l502api.h"
|
||||
#include "e502api.h"
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "dev_funcs.h"
|
||||
|
||||
#define TCP_CONNECTION_TOUT 5000
|
||||
#define OUT_SIGNAL_SIZE 2000
|
||||
#define OUT_BLOCK_SIZE 256
|
||||
#define SEND_TOUT 500
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
typedef double (*f_gen_sig_word)(uint32_t cntr, uint32_t total_size, double amp);
|
||||
typedef uint32_t (*f_gen_dout_word)(uint32_t cntr, uint32_t total_size);
|
||||
/* структура, задающая сигналы на 2-х каналах ЦАП и/или1
|
||||
1на DOUT */
|
||||
typedef struct {
|
||||
uint32_t size; /* количество точек в сигнале */
|
||||
double amp_dac1; /* амплитуда сигнала для ЦАП1 */
|
||||
f_gen_sig_word gen_func_dac1; /* функция для генерации отсчета для ЦАП1 */
|
||||
double amp_dac2; /* амплитуда сигнала для ЦАП2 */
|
||||
f_gen_sig_word gen_func_dac2; /* функция для генерации отсчета для ЦАП2 */
|
||||
f_gen_dout_word gen_dout; /* функция для генерации слова на цифровой вывод */
|
||||
} t_sig_struct;
|
||||
|
||||
|
||||
/* генерация пилы на весь период */
|
||||
static double f_gen_saw(uint32_t cntr, uint32_t total_size, double amp) {
|
||||
return amp*( (int32_t)(cntr%total_size)-(int32_t)total_size/2)/(total_size/2);
|
||||
}
|
||||
|
||||
/* генерация синуса на весь период */
|
||||
static double f_gen_sin(uint32_t cntr, uint32_t total_size, double amp) {
|
||||
return amp*sin(2*M_PI*cntr/total_size);
|
||||
}
|
||||
|
||||
/* генерация тестового честчика */
|
||||
static double f_gen_cntr(uint32_t cntr, uint32_t total_size, double amp) {
|
||||
return cntr + 0x123;
|
||||
}
|
||||
|
||||
/* генерация синуса с периодом в два раза меньше периоду определяемому размером буфера */
|
||||
static double f_gen_sin2(uint32_t cntr, uint32_t total_size, double amp) {
|
||||
return amp*sin(2*2*M_PI*cntr/total_size);
|
||||
}
|
||||
|
||||
/* генерация меандра на всех выходах путем выдачи в первой половине на выходы 0xAA, а на второй 0x55 */
|
||||
static uint32_t f_gen_dout_meander(uint32_t cntr, uint32_t total_size) {
|
||||
return cntr < total_size/2 ? 0xAA : 0x55;
|
||||
}
|
||||
|
||||
/* генерация счетчика на цифроых выхоах*/
|
||||
static uint32_t f_gen_dout_cntr(uint32_t cntr, uint32_t total_size) {
|
||||
return cntr;
|
||||
}
|
||||
|
||||
|
||||
/* таблица, задающая сигналы для выдачи на вход */
|
||||
/* для модуля E16 частота выходного сигнала будет в 2 раза меньше, т.к. частота ЦАП 500КГц протип 1МГц у E502 */
|
||||
static t_sig_struct f_sig_tbl[] = {
|
||||
{100000, X502_DAC_RANGE, f_gen_saw, 0, NULL, NULL}, /* пила на одном канале с частотой 10 Гц */
|
||||
{2000, X502_DAC_RANGE, f_gen_sin, 0, NULL, NULL}, /* синусоидальный сигнал на одном канале с частотой 500 Гц */
|
||||
{100, X502_DAC_RANGE/2, f_gen_sin, X502_DAC_RANGE, f_gen_saw, NULL}, /* синус ампл. 2.5 и пила по 10 КГц */
|
||||
{50, 0, NULL, X502_DAC_RANGE, f_gen_sin, f_gen_dout_cntr}, /* синус только на втором канале с частотой 20 КГц */
|
||||
{2550, 1.5, f_gen_sin, 2.5, f_gen_sin2, f_gen_dout_meander}, /* на втором канале синус с частотой в 2 раза больше. меандр на цифровых линиях */
|
||||
};
|
||||
|
||||
|
||||
/* Запись в буфер драйвера блока данных от сигнала
|
||||
cntr - номер отчета, соответствующего первому отсчету блока
|
||||
size - количество отсчетов на канал (т.е. записывается ch_cnt*size отсчетов)
|
||||
sig - номер сигнала
|
||||
ch_cnt - кол-во используемых каналов (это кол-во можно определить по f_sig_tbl[sig],
|
||||
но так как мы его уже определили, то передаем сюда, чтобы опять не определять */
|
||||
static int32_t f_load_block(t_x502_hnd hnd, uint32_t cntr, uint32_t size, uint32_t sig, uint32_t ch_cnt) {
|
||||
static double dac_data1[OUT_BLOCK_SIZE], dac_data2[OUT_BLOCK_SIZE];
|
||||
static uint32_t dout_data[OUT_BLOCK_SIZE];
|
||||
/* массив слов на запись в модуль - содержит смешенные подготовленные данные
|
||||
для всех каналов (максимум для 3-х - 2 ЦАП + DOUT) */
|
||||
static uint32_t sbuf[3*OUT_BLOCK_SIZE];
|
||||
uint32_t i;
|
||||
int32_t err = 0;
|
||||
|
||||
/* заполняем массив на вывод */
|
||||
for (i=0; i < size; i++) {
|
||||
if (f_sig_tbl[sig].gen_func_dac1 != NULL) {
|
||||
dac_data1[i] = f_sig_tbl[sig].gen_func_dac1(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac1);
|
||||
}
|
||||
if (f_sig_tbl[sig].gen_func_dac2 != NULL) {
|
||||
dac_data2[i] = f_sig_tbl[sig].gen_func_dac2(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac2);
|
||||
}
|
||||
if (f_sig_tbl[sig].gen_dout != NULL) {
|
||||
dout_data[i] = f_sig_tbl[sig].gen_dout(cntr+i, f_sig_tbl[sig].size);
|
||||
}
|
||||
}
|
||||
|
||||
/* Если нужная функция определена, значит мы испоьлзуем этот канал, и
|
||||
* подаем на вход сформированный массив. Иначе - канал не используется
|
||||
* и передаем на вход NULL */
|
||||
err = X502_PrepareData(hnd,
|
||||
f_sig_tbl[sig].gen_func_dac1 ? dac_data1 : NULL,
|
||||
f_sig_tbl[sig].gen_func_dac2 ? dac_data2 : NULL,
|
||||
f_sig_tbl[sig].gen_dout ? dout_data : NULL,
|
||||
size, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR,
|
||||
sbuf);
|
||||
if (err != X502_ERR_OK) {
|
||||
fprintf(stderr, "Ошибка подкотовки данных на передачу: %s\n",
|
||||
X502_GetErrorString(err));
|
||||
} else {
|
||||
/* посылаем данные */
|
||||
int32_t snd_cnt = X502_Send(hnd, sbuf, size*ch_cnt, SEND_TOUT);
|
||||
if (snd_cnt < 0) {
|
||||
err = snd_cnt;
|
||||
fprintf(stderr, "Ошибка передачи данных: %s\n", X502_GetErrorString(err));
|
||||
} else if ((uint32_t)snd_cnt != size*ch_cnt) {
|
||||
/* так как мы шлем всегда не больше чем готово, то должны
|
||||
всегда передать все */
|
||||
fprintf(stderr, "Переданно недостаточно данных: передавали = %d, передано = %d\n",
|
||||
size*ch_cnt, snd_cnt);
|
||||
err = X502_ERR_SEND_INSUFFICIENT_WORDS;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int32_t f_load_cycle_signal(t_x502_hnd hnd, int sig) {
|
||||
int32_t err = 0;
|
||||
uint32_t cntr = 0;
|
||||
uint32_t ch_cnt=0;
|
||||
|
||||
/* определяем, сколько каналов используем */
|
||||
if (f_sig_tbl[sig].gen_func_dac1)
|
||||
ch_cnt++;
|
||||
if (f_sig_tbl[sig].gen_func_dac2)
|
||||
ch_cnt++;
|
||||
if (f_sig_tbl[sig].gen_dout)
|
||||
ch_cnt++;
|
||||
|
||||
|
||||
/* задаем размер буфера под все каналы! */
|
||||
err = X502_OutCycleLoadStart(hnd, f_sig_tbl[sig].size*ch_cnt);
|
||||
if (err != X502_ERR_OK)
|
||||
fprintf(stderr, "Ошибка старта загрузки данных: %s!", X502_GetErrorString(err));
|
||||
|
||||
/* в примере показано, что загружать можно поблочно, чтобы не выделять
|
||||
* большой размер памяти на весь сигнал в программе. Но можно записать
|
||||
* весь сигнал и за один L502_Send() */
|
||||
while ((cntr != f_sig_tbl[sig].size) && (err == X502_ERR_OK)) {
|
||||
uint32_t block_size = OUT_BLOCK_SIZE;
|
||||
/* последний блок может быть меньшего размера, если размер буфера не кратен
|
||||
* блоку */
|
||||
if (block_size >(f_sig_tbl[sig].size-cntr))
|
||||
block_size=f_sig_tbl[sig].size-cntr;
|
||||
|
||||
err = f_load_block(hnd, cntr, block_size, sig, ch_cnt);
|
||||
if (!err)
|
||||
cntr+=block_size;
|
||||
}
|
||||
|
||||
/* делаем активным загруженный сигнал */
|
||||
if (err == X502_ERR_OK) {
|
||||
err = X502_OutCycleSetup(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
|
||||
if (err != X502_ERR_OK)
|
||||
fprintf(stderr, "Ошибка установки циклического сигнала: %s!", X502_GetErrorString(err));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int32_t err = 0;
|
||||
uint32_t ver;
|
||||
t_x502_hnd hnd = NULL;
|
||||
|
||||
#ifdef _WIN32
|
||||
/* устанавливаем локаль, чтобы можно было выводить по-русски в CP1251 без перевода в OEM */
|
||||
setlocale(LC_CTYPE, "");
|
||||
#endif
|
||||
|
||||
/********** Получение списка устройств и выбор, с каким будем работать ******************/
|
||||
hnd = select_dev_from_list(argc, argv, 0);
|
||||
|
||||
/********************************** Работа с модулем **************************/
|
||||
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
|
||||
if (hnd != NULL) {
|
||||
/* Разрешаем все каналы на вывод (в этом примере мы не будем
|
||||
использовать асинхронный вывод), а какие каналы реально будут
|
||||
использованы определяем когда подаем данные в L502_PrepareData */
|
||||
err = X502_StreamsEnable(hnd, X502_STREAM_ALL_OUT);
|
||||
if (err != X502_ERR_OK) {
|
||||
fprintf(stderr, "Ошибка разрешения потоков (%d): %s!", err,
|
||||
X502_GetErrorString(err));
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
/* если хотим, то можем загрузить синхнал до разрешения
|
||||
* синхронного ввода. Тогда мы могли бы его запустить, наприемер,
|
||||
всесте с АЦП по L502_StreamsStart() */
|
||||
err = f_load_cycle_signal(hnd, 1);
|
||||
|
||||
/* разрешаем синхронный ввод. В принципе можно его разрешить только
|
||||
* после загрузки первого синала в нашем примере. Но данный пример
|
||||
* показывает что мы можем сделать это и до выставления сигнала,
|
||||
* например если захотим запустить ввод АЦП до того как будет нужно
|
||||
* подать циклический сигнал на вывод */
|
||||
if (err == X502_ERR_OK)
|
||||
err = X502_StreamsStart(hnd);
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
int exit = 0;
|
||||
|
||||
printf("Введите одно из следующего:\n");
|
||||
printf(" число от 1 до %d - установить сигнал с указанным номером\n",
|
||||
(int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])));
|
||||
printf(" s или stop - останов генерации сигнала\n");
|
||||
printf(" e или exit - выход из программы\n");
|
||||
|
||||
/* Цикл ввода команд */
|
||||
while (!err && !exit) {
|
||||
char cmd[512];
|
||||
printf(">");
|
||||
fflush(stdout);
|
||||
scanf("%s", cmd);
|
||||
if (!strcmp(cmd, "exit") || !strcmp(cmd,"e")) {
|
||||
exit=1;
|
||||
} else if (!strcmp(cmd, "stop")||!strcmp(cmd,"s")) {
|
||||
err = X502_OutCycleStop(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
|
||||
if (err != X502_ERR_OK) {
|
||||
fprintf(stderr, "Ошибка останова циклического сигнала (%d): %s\n",
|
||||
err, X502_GetErrorString(err));
|
||||
}
|
||||
} else {
|
||||
int sig = atoi(cmd);
|
||||
if ((sig <= 0) || (sig > (int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])))) {
|
||||
fprintf(stderr, "Неверный номер сигнала или неизвестная команда\n");
|
||||
} else {
|
||||
err = f_load_cycle_signal(hnd, sig-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
X502_StreamsStop(hnd);
|
||||
}
|
||||
}
|
||||
|
||||
/* закрываем связь с модулем */
|
||||
X502_Close(hnd);
|
||||
/* освобождаем описатель */
|
||||
X502_Free(hnd);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user