moved libs to the lib directory

This commit is contained in:
2025-11-13 18:40:06 +03:00
parent 4d1f7fdbe9
commit b80ad585da
634 changed files with 3 additions and 2 deletions
+294
View File
@@ -0,0 +1,294 @@
unit e502api;
interface
uses Windows, SysUtils, x502api;
const
{ Ñîáûòèÿ ïîèñêà ñåòåâûõ ñåðâèñîâ }
E502_ETH_SVC_EVENT_NONE = 0; // Íè îäíîãî ñîáûòèÿ íå ïðîèçîøëî
E502_ETH_SVC_EVENT_ADD = 1; // Îáíàðóæåíî ïîÿâëåíèå íîâîãî ñåòåâîãî ñåðâèñà
E502_ETH_SVC_EVENT_REMOVE = 2; // Îáíàðóæåíî èñ÷åçíîâåíèå ðàíåå äîñòóïíîãî ñåòåâîãî ñåðâèñà
E502_ETH_SVC_EVENT_CHANGED = 3; // Èçìåíåíèå ïàðàìåòðîâ ðàíåå îáíàðóæåííîãî ñåòåâîãî ñåðâèñà
// Îïèñàòåëü êîíôèãóðàöèè ñåòåâîãî èíòåðôåéñà.
type st_e502_eth_config_state = record
end;
type t_e502_eth_config_hnd = ^st_e502_eth_config_state;
type t_e502_mac_addr = array[0..X502_MAC_ADDR_SIZE-1] of byte;
// Îïèñàòåëü êîíòåêñòà ïîèñêà óñòðîéñòâ â ñåòè
type st_e502_eth_svc_browse_context = record
end;
type t_e502_eth_svc_browse_hnd = ^st_e502_eth_svc_browse_context;
// Îïèñàòåëü ñåòåâîãî ñåðâèñà
type st_e502_eth_svc_record = record
end;
type t_e502_eth_svc_record_hnd = ^st_e502_eth_svc_record;
//Ïîëó÷åíèå ñïèñêà ñåðèéíûõ íîìåðîâ ìîäóëåé E502, ïîäêëþ÷åííûõ ïî USB
function E502_UsbGetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
function E502_UsbGetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
//Îòêðûòèå ìîäóëÿ E502, ïîäêëþ÷åííîãî ïî USB, ïî åãî ñåðèéíîìó íîìåðó.
function E502_OpenUsb(hnd: t_x502_hnd; serial: string): LongInt; stdcall;
//Îòêðûòèå ìîäóëÿ E502 ïî IP-àäðåñó
function E502_OpenByIpAddr(hnd : t_x502_hnd; ip_addr: LongWord; flags : LongWord; tout: LongWord) : LongInt; stdcall;
//Ïîëó÷èòü ñïèñîê çàïèñåé, ñîîòâåòñòâóþùèõ ïîäêëþ÷åííûì ìîäóëÿì E502
function E502_UsbGetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
function E502_UsbGetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
//Ñîçäàíèå çàïèñè î óñòðîéñòâå ñ óêàçàííûì IP-àäðåñîì
function E502_MakeDevRecordByIpAddr(var devrec: t_x502_devrec; ip_addr: LongWord; flags : LongWord; tout: LongWord) : LongInt; stdcall;
//Óñòàíîâêà TCP-ïîðòà óïðàâëÿþùåãî ñîåäèíåíèÿ äëÿ çàïèñè î óñòðîéñòâå
function E502_EthDevRecordSetCmdPort(var devrec: t_x502_devrec; cmd_port: Word) : LongInt; stdcall;
// Óñòàíîâêà TCP-ïîðòà ñîåäèíåíèÿ ïåðåäà÷è äàííûõ äëÿ çàïèñè î óñòðîéñòâå
function E502_EthDevRecordSetDataPort(var devrec: t_x502_devrec; data_port: Word) : LongInt; stdcall;
//Ñîçäàíèå çàïèñè î óñòðîéñòâå ïî îïèñàòåëþ ñåòåâîãî ñåðâèñà
function E502_MakeDevRecordByEthSvc(var devrec: t_x502_devrec; svc : t_e502_eth_svc_record_hnd; flags : LongWord; tout: LongWord) : LongInt; stdcall;
//Ïîëó÷åíèå òåêóùåãî IP-àäðåñà óñòðîéñòâà
function E502_GetIpAddr(hnd: t_x502_hnd; out ip_addr : LongWord) : LongInt; stdcall;
// Ñîçäàíèå îïèñàòåëÿ êîíôèãóðàöèè ñåòåâîãî èíòåðôåéñà.
function E502_EthConfigCreate() : t_e502_eth_config_hnd; stdcall;
// Îñâîáîæäåíèå îïèñàòåëÿ êîíôèãóðàöèè ñåòåâîãî èíòåðôåéñà.
function E502_EthConfigFree(cfg: t_e502_eth_config_hnd): LongInt; stdcall;
// ×òåíèå òåêóùåé ñåòåâîé êîíôèãóðàöèè èíòåðôåéñà
function E502_EthConfigRead(hnd: t_x502_hnd; cfg: t_e502_eth_config_hnd): LongInt; stdcall;
// Çàïèñü ñåòåâîé êîíôèãóðàöèè èíòåðôåéñà
function E502_EthConfigWrite(hnd: t_x502_hnd; cfg: t_e502_eth_config_hnd; passwd : string): LongInt; stdcall;
// Êîïèðîâàíèå ñîäåðæèìîãî ñåòåâîé êîíôèãóðàöèè èíòåðôåéñà
function E502_EthConfigCopy(src_cfg: t_e502_eth_config_hnd; dst_cfg: t_e502_eth_config_hnd): LongInt; stdcall;
// Îïðåäåëåíèå, ðàçðåøåí ëè èíòåðôåéñ Ethernet
function E502_EthConfigGetEnabled(cfg: t_e502_eth_config_hnd; out en : LongBool): LongInt; stdcall;
// Ðàçðåøåíèå èíòåðôåéñà Ethernet
function E502_EthConfigSetEnabled(cfg: t_e502_eth_config_hnd; en : LongBool): LongInt; stdcall;
// Îïðåäåëåíèå, ðàçðåøåíî ëè àâòîìàòè÷åñêîå ïîëó÷åíèå ïàðàìåòðîâ IP
function E502_EthConfigGetAutoIPEnabled(cfg: t_e502_eth_config_hnd; out en: LongBool): LongInt; stdcall;
// Ðàçðåøåíèå àâòîìàòè÷åñêîãî ïîëó÷åíèÿ ïàðàìåòðîâ IP
function E502_EthConfigSetAutoIPEnabled(cfg: t_e502_eth_config_hnd; en: LongBool): LongInt; stdcall;
// Îïðåäåëåíèå, ðàçðåøåí ëè ïîëüçîâàòåëüñêèé MAC-àäðåñ
function E502_EthConfigGetUserMACEnabled(cfg: t_e502_eth_config_hnd; out en: LongBool): LongInt; stdcall;
// Îïðåäåëåíèå, ðàçðåøåí ëè ïîëüçîâàòåëüñêèé MAC-àäðåñ
function E502_EthConfigSetUserMACEnabled(cfg: t_e502_eth_config_hnd; en : LongBool): LongInt; stdcall;
// Ïîëó÷åíèå óñòàíîâëåííîãî ñòàòè÷åñêîãî IP-àäðåñà
function E502_EthConfigGetIPv4Addr(cfg: t_e502_eth_config_hnd; out ip_addr : LongWord): LongInt; stdcall;
// Óñòàíîâêà ñòàòè÷åñêîãî IP-àäðåñà
function E502_EthConfigSetIPv4Addr(cfg: t_e502_eth_config_hnd; ip_addr: LongWord): LongInt; stdcall;
// Ïîëó÷åíèå óñòàíîâëåííîé ñòàòè÷åñêîé ìàñêè ïîäñåòè
function E502_EthConfigGetIPv4Mask(cfg: t_e502_eth_config_hnd; out mask : LongWord): LongInt; stdcall;
// Óñòàíîâêà ñòàòè÷åñêîé ìàñêè ïîäñåòè
function E502_EthConfigSetIPv4Mask(cfg: t_e502_eth_config_hnd; mask : LongWord): LongInt; stdcall;
// Ïîëó÷åíèå óñòàíîâëåííîãî ñòàòè÷åñêîãî àäðåñà øëþçà
function E502_EthConfigGetIPv4Gate(cfg: t_e502_eth_config_hnd; out gate: LongWord): LongInt; stdcall;
// Óñòàíîâêà ñòàòè÷åñêîãî àäðåñà øëþçà
function E502_EthConfigSetIPv4Gate(cfg: t_e502_eth_config_hnd; gate: LongWord): LongInt; stdcall;
// Ïîëó÷åíèå óñòàíîâëåííîãî ïîëüçîâàòåëüñêîãî MAC-àäðåñà
function E502_EthConfigGetUserMac(cfg: t_e502_eth_config_hnd; mac : t_e502_mac_addr): LongInt; stdcall;
// Óñòàíîâêà ïîëüçîâàòåëüñêîãî MAC-àäðåñà
function E502_EthConfigSetUserMac(cfg: t_e502_eth_config_hnd; mac: t_e502_mac_addr): LongInt; stdcall;
// Ïîëó÷åíèå çàâîäñêîãî MAC-àäðåñà óñòðîéñòâà
function E502_EthConfigGetFactoryMac(cfg: t_e502_eth_config_hnd; mac : t_e502_mac_addr): LongInt; stdcall;
// Ïîëó÷åíèå óñòàíîâëåííîãî èìåíè ýêçåìïëÿðà óñòðîéñòâà
function E502_EthConfigGetInstanceName(cfg: t_e502_eth_config_hnd; out name: string): LongInt; stdcall;
// Óñòàíîâêà èìåíè ýêçåìïëÿðà óñòðîéñòâà
function E502_EthConfigSetInstanceName(cfg: t_e502_eth_config_hnd; const name: string): LongInt; stdcall;
// Óñòàíîâêà íîâîãî ïàðîëÿ äëÿ ñìåíû êîíôèãóðàöèè
function E502_EthConfigSetNewPassword(cfg: t_e502_eth_config_hnd; const new_passwd: string): LongInt; stdcall;
// Ïåðåâîä ìîäóëÿ E502 â ðåæèì çàãðóç÷èêà
function E502_SwitchToBootloader(hnd: t_x502_hnd): LongInt; stdcall;
// Ïåðåçàãðóçêà ïðîøèâêè ÏËÈÑ
function E502_ReloadFPGA(hnd: t_x502_hnd): LongInt; stdcall;
// Ïåðåäà÷à óïðàâëÿþùåé êîìàíäû êîíòðîëëåðó Cortex-M4.
function E502_CortexExecCmd(hnd: t_x502_hnd; cmd_code: LongWord; par: LongWord;
const snd_data : array of byte; snd_size : LongWord;
rcv_data : array of byte; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
// Íà÷àëî ñåàíñà ïîèñêà ìîäóëåé â ëîêàëüíîé ñåòè
function E502_EthSvcBrowseStart(out context : t_e502_eth_svc_browse_hnd; flags : LongWord): LongInt; stdcall;
// Ïîëó÷åíèå èíôîðìàöèè î èçìåíåíèè ïðèñóòñòâèÿ ìîäóëåé â ëîêàëüíîé ñåòè
function E502_EthSvcBrowseGetEvent(context : t_e502_eth_svc_browse_hnd; out svc: t_e502_eth_svc_record_hnd; out event: LongWord; out flags : LongWord; tout : LongWord): LongInt; stdcall;
// Îñòàíîâ ñåàíñà ïîèñêà ìîäóëåé â ëîêàëüíîé ñåòè
function E502_EthSvcBrowseStop(context : t_e502_eth_svc_browse_hnd): LongInt; stdcall;
// Îñâîáîæäåíèå îïèñàòåëÿ ñåòåâîãî ñåðâèñà
function E502_EthSvcRecordFree(svc : t_e502_eth_svc_record_hnd): LongInt; stdcall;
// Ïîëó÷èòü èìÿ ýêçåìïëÿðà ïî îïèñàòåëþ ñåðâèñà
function E502_EthSvcRecordGetInstanceName(svc : t_e502_eth_svc_record_hnd; out name: string): LongInt; stdcall;
// Ïîëó÷èòü ñåðèéíûé íîìåð ìîäóëÿ ïî îïèñàòåëþ ñåòåâîãî ñåðâèñà
function E502_EthSvcRecordGetDevSerial(svc : t_e502_eth_svc_record_hnd; out serial : string): LongInt; stdcall;
// Ïîëó÷èòü IP àäðåñ ñåòåâîãî ñåðâèñà
function E502_EthSvcRecordResolveIPv4Addr(svc : t_e502_eth_svc_record_hnd; out addr :LongWord; tout : LongWord): LongInt; stdcall;
// Ïðîâåðêà, óêàçûâàþò ëè îáà îïèñàòåëÿ íà îäèí ýêçåìïëÿð ñåðâèñà
function E502_EthSvcRecordIsSameInstance(svc1 : t_e502_eth_svc_record_hnd; svc2 : t_e502_eth_svc_record_hnd): LongInt; stdcall;
implementation
function _get_serials( ser_arr: p_x502_serial_array; size:LongWord;
flags:LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'e502api.dll' name 'E502_UsbGetSerialList';
function _get_dev_records_list(out list; size:LongWord;
flags : LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'e502api.dll' name 'E502_UsbGetDevRecordsList';
function _open_usb(hnd: t_x502_hnd; serial: PAnsiChar) : LongInt; stdcall; external 'e502api.dll' name 'E502_OpenUsb';
function E502_OpenByIpAddr(hnd : t_x502_hnd; ip_addr: LongWord; flags : LongWord; tout: LongWord) : LongInt; stdcall; external 'e502api.dll';
function E502_MakeDevRecordByIpAddr(var devrec: t_x502_devrec; ip_addr: LongWord; flags : LongWord; tout: LongWord) : LongInt; stdcall; external 'e502api.dll';
function E502_EthDevRecordSetCmdPort(var devrec: t_x502_devrec; cmd_port: Word) : LongInt; stdcall; external 'e502api.dll';
function E502_EthDevRecordSetDataPort(var devrec: t_x502_devrec; data_port: Word) : LongInt; stdcall; external 'e502api.dll';
function E502_MakeDevRecordByEthSvc(var devrec: t_x502_devrec; svc : t_e502_eth_svc_record_hnd; flags : LongWord; tout: LongWord) : LongInt; stdcall; external 'e502api.dll';
function E502_GetIpAddr(hnd: t_x502_hnd; out ip_addr : LongWord) : LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigCreate() : t_e502_eth_config_hnd; stdcall; external 'e502api.dll';
function E502_EthConfigFree(cfg: t_e502_eth_config_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigRead(hnd: t_x502_hnd; cfg: t_e502_eth_config_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigWrite(hnd: t_x502_hnd; cfg: t_e502_eth_config_hnd; passwd : string): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigCopy(src_cfg: t_e502_eth_config_hnd; dst_cfg: t_e502_eth_config_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetEnabled(cfg: t_e502_eth_config_hnd; out en : LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetEnabled(cfg: t_e502_eth_config_hnd; en : LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetAutoIPEnabled(cfg: t_e502_eth_config_hnd; out en: LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetAutoIPEnabled(cfg: t_e502_eth_config_hnd; en: LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetUserMACEnabled(cfg: t_e502_eth_config_hnd; out en: LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetUserMACEnabled(cfg: t_e502_eth_config_hnd; en : LongBool): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetIPv4Addr(cfg: t_e502_eth_config_hnd; out ip_addr : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetIPv4Addr(cfg: t_e502_eth_config_hnd; ip_addr: LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetIPv4Mask(cfg: t_e502_eth_config_hnd; out mask : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetIPv4Mask(cfg: t_e502_eth_config_hnd; mask : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetIPv4Gate(cfg: t_e502_eth_config_hnd; out gate: LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetIPv4Gate(cfg: t_e502_eth_config_hnd; gate: LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetUserMac(cfg: t_e502_eth_config_hnd; mac : t_e502_mac_addr): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigSetUserMac(cfg: t_e502_eth_config_hnd; mac: t_e502_mac_addr): LongInt; stdcall; external 'e502api.dll';
function E502_EthConfigGetFactoryMac(cfg: t_e502_eth_config_hnd; mac : t_e502_mac_addr): LongInt; stdcall; external 'e502api.dll';
function _eth_config_get_instance_name(cfg: t_e502_eth_config_hnd; name: PAnsiChar): LongInt; stdcall; external 'e502api.dll' name 'E502_EthConfigGetInstanceName';
function _eth_config_set_instance_name(cfg: t_e502_eth_config_hnd; name: PAnsiChar): LongInt; stdcall; external 'e502api.dll' name 'E502_EthConfigSetInstanceName';
function _eth_config_set_new_password(cfg: t_e502_eth_config_hnd; new_passwd: PAnsiChar): LongInt; stdcall; external 'e502api.dll' name 'E502_EthConfigSetNewPassword';
function E502_SwitchToBootloader(hnd: t_x502_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_ReloadFPGA(hnd: t_x502_hnd): LongInt; stdcall; external 'e502api.dll';
function _cortex_exec_cmd(hnd: t_x502_hnd; cmd_code: LongWord; par: LongWord;
const snd_data; snd_size : LongWord;
out rcv_data; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall; external 'e502api.dll' name 'E502_CortexExecCmd';
function E502_EthSvcBrowseStart(out context : t_e502_eth_svc_browse_hnd; flags : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthSvcBrowseGetEvent(context : t_e502_eth_svc_browse_hnd; out svc: t_e502_eth_svc_record_hnd; out event: LongWord; out flags : LongWord; tout : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthSvcBrowseStop(context : t_e502_eth_svc_browse_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_EthSvcRecordFree(svc : t_e502_eth_svc_record_hnd): LongInt; stdcall; external 'e502api.dll';
function _eth_svc_record_get_instance_name(svc : t_e502_eth_svc_record_hnd; name: PAnsiChar): LongInt; stdcall; external 'e502api.dll' name 'E502_EthSvcRecordGetInstanceName';
function _eth_svc_record_get_dev_serial(svc : t_e502_eth_svc_record_hnd; serial : PAnsiChar): LongInt; stdcall; external 'e502api.dll' name 'E502_EthSvcRecordGetDevSerial';
function E502_EthSvcRecordResolveIPv4Addr(svc : t_e502_eth_svc_record_hnd; out addr :LongWord; tout : LongWord): LongInt; stdcall; external 'e502api.dll';
function E502_EthSvcRecordIsSameInstance(svc1 : t_e502_eth_svc_record_hnd; svc2 : t_e502_eth_svc_record_hnd): LongInt; stdcall; external 'e502api.dll';
function E502_UsbGetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
var
ser_arr : p_x502_serial_array;
res, i : LongInt;
begin
if (Length(serials) > 0) then
begin
ser_arr:=GetMemory(Length(serials)*X502_SERIAL_SIZE);
// ïîëó÷àåì êîëè÷åñòâî óñòðîéòâ
res := _get_serials(ser_arr, Length(serials), flags, devcnt);
if res >= 0 then
begin
//ñîõðàíÿåì ïîëó÷åííûå íîìåðà â äèíàìè÷åñêèé ìàññèâ ñòðîê
for i:=0 to res-1 do
serials[i] := string(ser_arr[i]);
end;
//îñâîáîæäàåì ïàìÿòü, âûäåëåííóþ ïîä âðåìåííûé ìàññèâ
FreeMemory(ser_arr);
end
else
begin
res:= _get_serials(nil, 0, flags, devcnt);
end;
E502_UsbGetSerialList:=res;
end;
function E502_UsbGetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
begin
E502_UsbGetSerialList:= E502_UsbGetSerialList(serials, flags, PCardinal(nil)^);
end;
function E502_UsbGetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
begin
E502_UsbGetDevRecordsList := _get_dev_records_list(list, Length(list), flags, devcnt);
end;
function E502_UsbGetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
begin
E502_UsbGetDevRecordsList:= E502_UsbGetDevRecordsList(list, flags, PCardinal(nil)^);
end;
function E502_OpenUsb(hnd: t_x502_hnd; serial: string) : LongInt;
begin
E502_OpenUsb:=_open_usb(hnd, PAnsiChar(AnsiString(serial)));
end;
function E502_EthConfigGetInstanceName(cfg: t_e502_eth_config_hnd; out name: string): LongInt; stdcall;
var
strptr: PAnsiChar;
res: LongInt;
begin
strptr:=GetMemory(X502_INSTANCE_NAME_SIZE);
res:=_eth_config_get_instance_name(cfg, strptr);
if res = X502_ERR_OK then
name:=string(Utf8Decode(strptr));
FreeMemory(strptr);
E502_EthConfigGetInstanceName:= res;
end;
function E502_EthConfigSetInstanceName(cfg: t_e502_eth_config_hnd; const name: string): LongInt; stdcall;
begin
E502_EthConfigSetInstanceName:=_eth_config_set_instance_name(cfg, PAnsiChar(Utf8Encode(AnsiString(name))));
end;
function E502_EthConfigSetNewPassword(cfg: t_e502_eth_config_hnd; const new_passwd: string): LongInt; stdcall;
begin
E502_EthConfigSetNewPassword:=_eth_config_set_new_password(cfg, PAnsiChar(AnsiString(new_passwd)));
end;
function E502_CortexExecCmd(hnd: t_x502_hnd; cmd_code: LongWord; par: LongWord;
const snd_data : array of byte; snd_size : LongWord;
rcv_data : array of byte; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(snd_data)) < snd_size) or
(LongWord(Length(rcv_data)) < rcv_size) then
E502_CortexExecCmd := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
E502_CortexExecCmd:=_cortex_exec_cmd(hnd, cmd_code, par, snd_data, snd_size, rcv_data, rcv_size, tout, recvd_size);
end;
function E502_EthSvcRecordGetInstanceName(svc : t_e502_eth_svc_record_hnd; out name: string): LongInt; stdcall;
var
strptr: PAnsiChar;
res: LongInt;
begin
strptr:=GetMemory(X502_INSTANCE_NAME_SIZE);
res:=_eth_svc_record_get_instance_name(svc, strptr);
if res = X502_ERR_OK then
name:=string(Utf8Decode(strptr));
FreeMemory(strptr);
E502_EthSvcRecordGetInstanceName:= res;
end;
function E502_EthSvcRecordGetDevSerial(svc : t_e502_eth_svc_record_hnd; out serial : string): LongInt; stdcall;
var
strptr: PAnsiChar;
res: LongInt;
begin
strptr:=GetMemory(X502_SERIAL_SIZE);
res:=_eth_svc_record_get_dev_serial(svc, strptr);
if res = X502_ERR_OK then
serial:=string(strptr);
FreeMemory(strptr);
E502_EthSvcRecordGetDevSerial:= res;
end;
end.
+805
View File
@@ -0,0 +1,805 @@
unit l502api;
interface
uses Windows, SysUtils, x502api;
//получение списка серийных номеров
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
//установить связь с модулем по серийному номеру
function L502_Open(hnd: t_x502_hnd; serial: string): LongInt; stdcall;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
{ ----------- типы и функции, оставленные для обратной совместимости ----------}
const
// Максимальное количество логических каналов в таблице
L502_LTABLE_MAX_CH_CNT = 256;
// Количество диапазонов для измерения напряжений
L502_ADC_RANGE_CNT = 6;
// Максимальное значение для аппаратного усреднения по логическому каналу
L502_LCH_AVG_SIZE_MAX = 128;
//Максимальное значения делителя частоты АЦП
L502_ADC_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение делителя частоты синхронного цифрового ввода
L502_DIN_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение межкадровой задержки для АЦП
L502_ADC_INTERFRAME_DELAY_MAX = $1FFFFF;
// Таймаут по умолчанию для выполнения команды к BlackFin
L502_BF_CMD_DEFAULT_TOUT = 500;
// Код АЦП, соответствующий максимальному значению шкалы
L502_ADC_SCALE_CODE_MAX = 6000000;
// Код ЦАП, соответствующий максимальному значению шкалы
L502_DAC_SCALE_CODE_MAX = 30000;
// Максимальное количество символов в строке с названием устройства
L502_DEVNAME_SIZE = X502_DEVNAME_SIZE;
// Максимальное количество символов в строке с серийным номером
L502_SERIAL_SIZE = X502_SERIAL_SIZE;
//Размер пользовательской области Flash-памяти
L502_FLASH_USER_SIZE = $100000;
//Стандартный таймаут на выполнение запроса к BlackFin в мс
L502_BF_REQ_TOUT = 500;
// Диапазон ЦАП в вольтах
L502_DAC_RANGE = 5;
// Количество каналов ЦАП
L502_DAC_CH_CNT = 2;
// слово в потоке, означающее, что произошло переполнение
L502_STREAM_IN_MSG_OVERFLOW = $01010000;
// Максимально возможное значение внешней опорной частоты
L502_EXT_REF_FREQ_MAX = 2000000;
{ ----------------- Коды ошибок библиотеки ---------------------------}
// Функция выполнена без ошибок
L502_ERR_OK = 0;
// В функцию передан недействительный описатель модуля
L502_ERR_INVALID_HANDLE = -1;
// Ошибка выделения памяти
L502_ERR_MEMORY_ALLOC = -2;
// Попытка открыть уже открытое устройство
L502_ERR_ALREADY_OPENED = -3;
// Устройство с заданными параметрами не найдено в системе
L502_ERR_DEVICE_NOT_FOUND = -4;
// Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
L502_ERR_DEVICE_ACCESS_DENIED = -5;
// Ошибка открытия устройства
L502_ERR_DEVICE_OPEN = -6;
// В функцию передан недействительный указатель
L502_ERR_INVALID_POINTER = -7;
// Функция не может быть выполнена при запущенном потоке сбора данных
L502_ERR_STREAM_IS_RUNNING = -8;
// Ошибка чтения данных синхронного ввода
L502_ERR_RECV = -9;
// Ошибка записи данных для синхронного вывода
L502_ERR_SEND = -10;
// Произошло переполнение внутреннего буфера для потока синхронного ввода
L502_ERR_STREAM_OVERFLOW = -11;
// Неизвестное сообщение в потоке синхронного ввода
L502_ERR_UNSUP_STREAM_MSG = -12;
// Ошибка создания системного мьютекса
L502_ERR_MUTEX_CREATE = -13;
// Неверный описатель мьютекса
L502_ERR_MUTEX_INVALID_HANDLE = -14;
// Истекло время ожидания освобождения мьютекса
L502_ERR_MUTEX_LOCK_TOUT = -15;
// Ошибка освобождения мьютекса
L502_ERR_MUTEX_RELEASE = -16;
// Недостаточно системных ресурсов
L502_ERR_INSUFFICIENT_SYSTEM_RESOURCES= -17;
// Данная возможность еще не реализована
L502_ERR_NOT_IMPLEMENTED = -18;
// Недостаточный размер массива
L502_ERR_INSUFFICIENT_ARRAY_SIZE = -19;
// Ошибка чтения регистра FPGA
L502_ERR_FPGA_REG_READ = -20;
// Ошибка записи регистра FPGA
L502_ERR_FPGA_REG_WRITE = -21;
// Сбор данных уже остановлен
L502_ERR_STREAM_IS_NOT_RUNNING = -22;
// Задан неверный размер логической таблицы
L502_ERR_INVALID_LTABLE_SIZE = -102;
// Задан неверный номер логического канала
L502_ERR_INVALID_LCH_NUMBER = -103;
// Неверно задано значение диапазона АЦП
L502_ERR_INVALID_LCH_RANGE = -104;
// Неверно задан режим измерения для логического канала
L502_ERR_INVALID_LCH_MODE = -105;
// Неверно задан номер физического канала при настройке логического
L502_ERR_INVALID_LCH_PHY_NUMBER = -106;
// Неверно задан размер усреднения для логического канала
L502_ERR_INVALID_LCH_AVG_SIZE = -107;
// Неверно задан делитель частоты сбора данных АЦП
L502_ERR_INVALID_ADC_FREQ_DIV = -108;
// Неверно задан делитель частоты синхронного ввода цифровых линий
L502_ERR_INVALID_DIN_FREQ_DIV = -108;
// Неверно задан режим работы модуля L502
L502_ERR_INVALID_MODE = -109;
// Неверный номер канала ЦАП
L502_ERR_INVALID_DAC_CHANNEL = -110;
// Неверный код выбора опорной частоты синхронизации
L502_ERR_INVALID_REF_FREQ = -111;
// Неверно задано значение межкадровой задержки
L502_ERR_INVALID_INTERFRAME_DELAY = -112;
// Неверно задан режим синхронизации
L502_ERR_INVALID_SYNC_MODE = -113;
// Неверно задан номер канала DMA
L502_ERR_INVALID_DMA_CH = -114;
// Ошибка захвата опорной частоты синхронизации
L502_ERR_REF_FREQ_NOT_LOCKED = -131;
// Управляющий запрос к драйверу завершен с ошибкой
L502_ERR_IOCTL_FAILD = -132;
// Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
L502_ERR_IOCTL_TIMEOUT = -133;
// Ошибка получения информации о устройстве от драйвера
L502_ERR_GET_INFO = -134;
// За время ожидания не было считано новое слово с цифровых линий
L502_ERR_DIG_IN_NOT_RDY = -135;
// Принято недостаточно слов от модуля
L502_ERR_RECV_INSUFFICIENT_WORDS = -136;
// Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
L502_ERR_DAC_NOT_PRESENT = -137;
// Неверный номер канала в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_NUM = -140;
// Неверный код диапазона в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_RANGE = -141;
// Задан неверный адрес во Flash-памяти
L502_ERR_FLASH_INVALID_ADDR = -142;
// Задан неверный размер блока данных при работе с Flash-памятью
L502_ERR_FLASH_INVALID_SIZE = -143;
// Истек таймаут ожидания завершения записи во Flash-память
L502_ERR_FLASH_WRITE_TOUT = -144;
// Истек таймаут ожидания завершения стирания блока Flash-памяти
L502_ERR_FLASH_ERASE_TOUT = -145;
// Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
L502_ERR_FLASH_SECTOR_BOUNDARY = -146;
// Не удалось открыть файл прошивки BlackFin
L502_ERR_LDR_FILE_OPEN = -180;
// Ошибка чтения из фала прошивки BlackFin
L502_ERR_LDR_FILE_READ = -181;
// Неверный формат файла прошивки BlackFin
L502_ERR_LDR_FILE_FORMAT = -182;
// Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
L502_ERR_LDR_FILE_UNSUP_FEATURE = -183;
// Неверный стартовый адрес программы в прошивке BlackFin
L502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184;
// Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
L502_ERR_BF_REQ_TIMEOUT = -185;
// Команда для BlackFin все еще находится в процессе обработки
L502_ERR_BF_CMD_IN_PROGRESS = -186;
// Истекло время выполнения управляющей команды процессором BlackFin
L502_ERR_BF_CMD_TIMEOUT = -187;
// Возвращено недостаточно данных в ответ на команду к BlackFin
L502_ERR_BF_CMD_RETURN_INSUF_DATA = -188;
// Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
L502_ERR_BF_LOAD_RDY_TOUT = -189;
// Попытка выполнить операцию для которой нужен сигнальный процессор при
// отсутствии сигнального процессора в модуле
L502_ERR_BF_NOT_PRESENT = -190;
// Неверный адрес памяти BlackFin при записи или чтении по HDMA
L502_ERR_BF_INVALID_ADDR = -191;
// Неверный размер данных, передаваемых с управляющей командой в BlackFin
L502_ERR_BF_INVALID_CMD_DATA_SIZE = -192;
{-------- Флаги, управляющие поиском присутствующих модулей ------}
// Признак, что нужно вернуть серийные номера только тех устройств,
// которые еще не открыты
L502_GETDEVS_FLAGS_ONLY_NOT_OPENED = X502_GETDEVS_FLAGS_ONLY_NOT_OPENED;
{-------- Флаги для управления цифровыми выходами. ---------------}
//Запрещение (перевод в третье состояние) старшей половины цифровых выходов
L502_DIGOUT_WORD_DIS_H = $00020000;
//Запрещение младшей половины цифровых выходов
L502_DIGOUT_WORD_DIS_L = $00010000;
{-------- Константы для выбора опорной частоты -------------------}
L502_REF_FREQ_2000KHZ = 2000000; // частота 2МГц
L502_REF_FREQ_1500KHZ = 1500000; // частота 1.5МГц
{-------- Диапазоны измерения для канала АЦП ----------------------}
L502_ADC_RANGE_10 = 0; // диапазон +/-10V
L502_ADC_RANGE_5 = 1; // диапазон +/-5V
L502_ADC_RANGE_2 = 2; // диапазон +/-2V
L502_ADC_RANGE_1 = 3; // диапазон +/-1V
L502_ADC_RANGE_05 = 4; // диапазон +/-0.5V
L502_ADC_RANGE_02 = 5; // диапазон +/-0.2V
{-------- Режим измерения для логического канала ------------------}
L502_LCH_MODE_COMM = 0; // Измерение напряжения относительно общей земли
L502_LCH_MODE_DIFF = 1; // Дифференциальное измерение напряжения
L502_LCH_MODE_ZERO = 2; // Измерение собственного нуля
{-------- Режимы синхронизации ------------------------------------}
L502_SYNC_INTERNAL = 0; // внутренний сигнал
L502_SYNC_EXTERNAL_MASTER = 1; // от внешнего мастера по разъему синхронизации
L502_SYNC_DI_SYN1_RISE = 2; // по фронту сигнала DI_SYN1
L502_SYNC_DI_SYN2_RISE = 3; // по фронту сигнала DI_SYN2
L502_SYNC_DI_SYN1_FALL = 6; // по спаду сигнала DI_SYN1
L502_SYNC_DI_SYN2_FALL = 7; // по спаду сигнала DI_SYN2
{-------- Флаги, управляющие обработкой принятых данных -------------------}
L502_PROC_FLAGS_VOLT = 1; // Признак, что нужно преобразовать значения
// АЦП в вольты
{-------- Флаги для обозначения синхронных потоков данных -----------------}
L502_STREAM_ADC = $01; //Поток данных от АЦП
L502_STREAM_DIN = $02; // Поток данных с цифровых входов
L502_STREAM_DAC1 = $10; // Поток данных первого канала ЦАП
L502_STREAM_DAC2 = $20; // Поток данных второго канала ЦАП
L502_STREAM_DOUT = $40; // Поток данных на цифровые выводы
// объединение всех флагов, обозначающих потоки данных на ввод
L502_STREAM_ALL_IN = L502_STREAM_ADC or L502_STREAM_DIN;
// объединение всех флагов, обозначающих потоки данных на вывод
L502_STREAM_ALL_OUT = L502_STREAM_DAC1 or L502_STREAM_DAC2 or L502_STREAM_DOUT;
{--- Константы, определяющие тип передаваемого отсчета из ПК в модуль -----}
L502_STREAM_OUT_WORD_TYPE_DOUT = $0; // Цифровой вывод
L502_STREAM_OUT_WORD_TYPE_DAC1 = $40000000; // Код для 1-го канала ЦАП
L502_STREAM_OUT_WORD_TYPE_DAC2 = $80000000; // Код для 2-го канала ЦАП
{------------------ Режим работы модуля L502 ------------------------------}
L502_MODE_FPGA = 0; // Все потоки данных передаются через ПЛИС минуя
// сигнальный процессор BlackFin
L502_MODE_DSP = 1; // Все потоки данных передаются через сигнальный
// процессор, который должен быть загружен
// прошивкой для обработки этих потоков
L502_MODE_DEBUG = 2; // Отладочный режим
{------------------- Номера каналов ЦАП -----------------------------------}
L502_DAC_CH1 = 0; //Первый канал ЦАП
L502_DAC_CH2 = 1; //Второй канал ЦАП
{----------- Флаги, используемые при выводе данных на ЦАП -----------------}
// Указывает, что значение задано в Вольтах и при выводе его нужно
// перевести в коды ЦАП. Если флаг не указан, то считается, что значение
// изначально в кодах
L502_DAC_FLAGS_VOLT = $0001;
// Указывает, что нужно применить калибровочные коэффициенты перед
// выводом значения на ЦАП.
L502_DAC_FLAGS_CALIBR = $0002;
{------------------ Номера каналов DMA ------------------------------------}
L502_DMA_CH_IN = 0; // Общий канал DMA на ввод
L502_DMA_CH_OUT = 1; // Общий канал DMA на вывод
{--- Цифровые линии, на которых можно включить подтягивающие резисторы ----}
L502_PULLUPS_DI_H = $01; // Старшая половина цифровых входов
L502_PULLUPS_DI_L = $02; // Младшая половина цифровых входов
L502_PULLUPS_DI_SYN1 = $04; // Линия SYN1
L502_PULLUPS_DI_SYN2 = $08; // Линия SYN2
{--------------- Флаги, определяющие наличие опций в модуле ---------------}
// Признак наличия двухканального канального ЦАП
L502_DEVFLAGS_DAC_PRESENT = X502_DEVFLAGS_DAC_PRESENT;
// Признак наличия сигнального процессора BlackFin
L502_DEVFLAGS_BF_PRESENT = X502_DEVFLAGS_BF_PRESENT;
// Признак наличия гальваноразвязки
L502_DEVFLAGS_GAL_PRESENT = X502_DEVFLAGS_GAL_PRESENT;
// Признак, что во Flash-памяти присутствует информация о модуле
L502_DEVFLAGS_FLASH_DATA_VALID = $00010000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные
// коэффициенты АЦП
L502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = $00020000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные
// коэффициенты ЦАП
L502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = $00040000;
{----------------Флаги для режима циклического вывода----------------------}
// Флаг указывает, что останов или смена сигнала могут произойти без ожидания
// конца цикла предыдущего сигнала.
L502_OUT_CYCLE_FLAGS_FORCE = $01;
type
// описатель модуля - указатель на непрозрачную структуру
t_l502_hnd = t_x502_hnd;
{ калибровочные коэффициенты диапазона }
t_l502_cbr_coef = record
offs: Double; // смещение нуля
k : Double; // коэффициент шкалы
end;
{ Калибровочные коэффициенты модуля. }
t_l502_cbr = record
//Калибровочные коэффициенты АЦП
adc: array[0..L502_ADC_RANGE_CNT-1] of t_l502_cbr_coef;
res1: array[0..63] of LongWord;
// Калибровочные коэффициенты ЦАП
dac: array[0..L502_DAC_CH_CNT-1] of t_l502_cbr_coef;
res2: array[0..19] of LongWord;
end;
{ Информация о модуле L502.}
t_l502_info = record
name: array[0..L502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства ("L502")
serial: array[0..L502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
devflags: LongWord; // Флаги описывающие наличие в модуле определенных опций
fpga_ver : Word; // Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver : Byte; // Версия ПЛИС, управляющего аналоговой частью
res : array[0..120] of Byte; //резерв
cbr : t_l502_cbr; // Заводские калибровочные коэффициенты (из Flash-памяти)
end;
function L502_Create(): t_l502_hnd; stdcall;
function L502_Free(hnd: t_l502_hnd): LongInt; stdcall;
//разорвать связь с модулем
function L502_Close(hnd: t_l502_hnd): LongInt; stdcall;
//получение информации о модуле
function L502_GetDevInfo(hnd: t_l502_hnd; out info: t_l502_info) : LongInt; stdcall;
// Передача установленных настроек в модуль
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall;
// Установка параметров логического канала
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall;
// Установка количества логических каналов
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall;
// Получение количества логических каналов
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall;
// Установка делителя частоты сбора для АЦП
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall;
// Установка значения межкадровой задержки для АЦП
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного ввода с цифровых линий
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall;
// Установка частоты сбора АЦП
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall;
// Установка частоты синхронного ввода с цифровых входов
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall;
// Получить текущие значения частот сбора АЦП
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall;
// Установка значения опорной частоты синхронизации.
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall;
// Установка режима генерации частоты синхронизации.
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall;
// Установка режима запуска частоты синхронизации.
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall;
// Установить режим работы модуля
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall;
// Получение текущего режима работы модуля.
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall;
// Установить коэффициенты для калибровки значений АЦП.
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов АЦП.
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall;
{----------------------- Функции асинхронного ввода-вывода ------------------}
// Асинхронный вывод данных на канал ЦАП.
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall;
// Асинхронный вывод данных на цифровые выходы.
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall;
// Асинхронный ввод значений с цифровых входов.
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall;
// Асинхронный ввод одного кадра АЦП.
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
{-------------- Функции для работы с синхронным потоковым вводом-выводом ----}
// Разрешение синхронных потоков на ввод/вывод.
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
// Запрещение синхронных потоков на ввод/вывод.
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
// Запуск синхронных потоков ввода/вывода.
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall;
// Останов синхронных потоков ввода/вывода.
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall;
// Проверка, запущен ли поток данных
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall;
// Чтение данных АЦП и цивровых входов из модуля.
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
// Передача потоковых данных ЦАП и цифровых выходов в модуль.
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
// Обработка принятых отсчетов АЦП от модуля.
function L502_ProcessAdcData(hnd: t_l502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
// Обработка принятых от модуля данных.
function L502_ProcessData(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
// Обработка принятых от модуля данных ьзовательскими данными.
function L502_ProcessDataWithUserExt(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
// Подготовка данных для вывода в модуль.
function L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
// Получить количество отсчетов в буфере потока на ввод.
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить размер свободного места в буфере потока на вывод.
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить номер следующего ожидаемого логического канала АЦП для обработки.
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall;
// Начало подготовки вывода синхронных данных
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
// Останов вывода циклического сигнала
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
// Установка размера буфера в драйвере для синхронного ввода или вывода.
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall;
// Установка шага прерывания при передаче потока по DMA.
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall;
{------------ Функции для работы с сигнальным процессором -------------------}
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall;
/// Загрузка прошивки сигнального процессора BlackFin.
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
/// Чтение блока данных из памяти сигнального процессора.
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
/// Запись блока данных в память сигнального процессора.
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
/// Передача управляющей команды сигнальному процессору.
function L502_BfExecCmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
{------------------- Функции для работы с Flash-памятью модуля -------------}
/// Чтение блока данных из Flash-памяти модуля.
function L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
///Запись блока данных во Flash-память модуля.
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
/// Стирание блока во Flash-памяти.
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall;
/// Разрешение записи в пользовательскую область Flash-памяти.
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall;
/// Запрет записи в пользовательскую область Flash-памяти.
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall;
{----------------- Дополнительные вспомогательные функции ------------------}
//Получить версию библиотеки.
function L502_GetDllVersion() : LongWord; stdcall;
// Получить версию драйвера устройства
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall;
// Получение строки об ошибке
function L502_GetErrorString(err: LongInt) : string; stdcall;
// Моргание светодиодом на передней панели.
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall;
// Установка подтягивающих резисторов на входных линиях.
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall;
implementation
function L502_Create() : t_l502_hnd; stdcall; external 'l502api.dll';
function L502_Free(hnd: t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
function _get_serials( ser_arr: p_x502_serial_array; size:LongWord;
flags:LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'l502api.dll' name 'L502_GetSerialList';
function _get_dev_records_list(out list; size:LongWord;
flags : LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'l502api.dll' name 'L502_GetDevRecordsList';
function _open(hnd: t_l502_hnd; serial: PAnsiChar) : LongInt; stdcall; external 'l502api.dll' name 'L502_Open';
function L502_Close(hnd : t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
function L502_GetDevInfo(hnd : t_l502_hnd; out info : t_l502_info) : LongInt; stdcall; external 'l502api.dll';
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall; external 'l502api.dll';
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall; external 'l502api.dll';
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall; external 'l502api.dll';
function _get_adc_frame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data): LongInt; stdcall; external 'l502api.dll' name 'L502_AsyncGetAdcFrame';
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function _recv(hnd: t_l502_hnd; out buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Recv';
function _send(hnd: t_l502_hnd; const buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Send';
function _process_adc_data(hnd: t_l502_hnd; const src; out dest; var size : LongWord;
flags : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessAdcData';
function _process_data(hnd: t_l502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord):LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessData';
function _process_data_usr(hnd: t_l502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord;
out usr_data; var usr_data_size: LongWord):LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessDataWithUserExt';
function _prepare_data(hnd: t_l502_hnd; const dac1, dac2; const digout; size, flags : LongWord;
out out_buf):LongInt; stdcall; external 'l502api.dll' name 'L502_PrepareData';
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall; external 'l502api.dll';
function _bf_load_firm(hnd: t_l502_hnd; filename: PAnsiChar): LongInt; stdcall; external 'l502api.dll' name 'L502_BfLoadFirmware';
function _bf_mem_read(hnd: t_l502_hnd; addr : LongWord; out regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemRead';
function _bf_mem_write(hnd: t_l502_hnd; addr : LongWord; const regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemWrite';
function _bf_exec_cmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
const snd_data; snd_size : LongWord; out rcv_data; rcv_size : LongWord;
tout: LongWord; out recved_size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfExecCmd';
function _flash_read(hnd: t_l502_hnd; addr: LongWord; out data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashRead';
function _flash_write(hnd: t_l502_hnd; addr: LongWord; const data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashWrite';
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_GetDllVersion() : LongWord; stdcall; external 'l502api.dll';
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall; external 'l502api.dll';
function _get_err_str(err : LongInt) : PAnsiChar; stdcall; external 'l502api.dll' name 'L502_GetErrorString';
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall; external 'l502api.dll';
{
function L502_GetSerialList(out serials: t_l502_serial_list; flags: LongWord) : LongInt; overload;
var
ser_arr : p_l502_serial_array;
devcnt: LongWord;
res, i : LongInt;
begin
// получаем количество устройтв
res := _get_serials(nil, 0, flags, devcnt);
if (res >= 0) and (devcnt>0) then
begin
// выделяем память под devcnt серийных номеров
ser_arr:=GetMemory(devcnt*L502_SERIAL_SIZE);
//получаем их список
res:= _get_serials(ser_arr, devcnt, flags, PLongWord(nil)^);
if (res > 0) then
begin
//устанавливаем размер динамического массива
SetLength(serials, res);
//сохраняем полученные номера в динамический массив строк
for i:=0 to res-1 do
serials[i] := string(ser_arr[i]);
end;
//освобождаем память, выделенную под временный массив
FreeMemory(ser_arr);
end;
L502_GetSerialList:= res;
end;
}
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
var
ser_arr : p_x502_serial_array;
res, i : LongInt;
begin
if (Length(serials) > 0) then
begin
ser_arr:=GetMemory(Length(serials)*X502_SERIAL_SIZE);
// получаем количество устройтв
res := _get_serials(ser_arr, Length(serials), flags, devcnt);
if res >= 0 then
begin
//сохраняем полученные номера в динамический массив строк
for i:=0 to res-1 do
serials[i] := string(ser_arr[i]);
end;
//освобождаем память, выделенную под временный массив
FreeMemory(ser_arr);
end
else
begin
res:= _get_serials(nil, 0, flags, devcnt);
end;
L502_GetSerialList:=res;
end;
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
begin
L502_GetSerialList:= L502_GetSerialList(serials, flags, PCardinal(nil)^);
end;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
begin
if (Length(list) > 0) then
begin
L502_GetDevRecordsList := _get_dev_records_list(list, Length(list), flags, devcnt);
end
else
begin
L502_GetDevRecordsList:= _get_dev_records_list(PCardinal(nil)^, 0, flags, devcnt);
end;
end;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
begin
L502_GetDevRecordsList:= L502_GetDevRecordsList(list, flags, PCardinal(nil)^);
end;
function L502_Open(hnd: t_l502_hnd; serial: string) : LongInt;
begin
L502_Open:=_open(hnd, PAnsiChar(AnsiString(serial)));
end;
function L502_GetErrorString(err: LongInt) : string;
begin
L502_GetErrorString:= string(_get_err_str(err));
end;
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
var err: LongInt;
lch_cnt: LongWord;
begin
err:= L502_GetLChannelCount(hnd, lch_cnt);
if err=L502_ERR_OK then
begin
if LongWord(Length(data)) < lch_cnt then
err:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
err:=_get_adc_frame(hnd,flags,tout,data);
end;
L502_AsyncGetAdcFrame:=err;
end;
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
L502_Recv:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_Recv:=_recv(hnd, buf, size, tout);
end;
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
L502_Send:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_Send:=_send(hnd,buf,size,tout);
end;
function L502_ProcessAdcData(hnd: t_l502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
begin
if (LongWord(Length(src)) < size) or (LongWord(Length(dest)) < size) then
L502_ProcessAdcData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_ProcessAdcData:=_process_adc_data(hnd, src, dest, size, flags);
end;
function L502_ProcessData(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) then
L502_ProcessData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_ProcessData:=_process_data(hnd, src, size, flags, adc_data, adc_data_size, din_data, din_data_size);
end;
function L502_ProcessDataWithUserExt(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) or (LongWord(Length(usr_data)) < usr_data_size) then
L502_ProcessDataWithUserExt:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_ProcessDataWithUserExt:=_process_data_usr(hnd, src,size,flags,adc_data,
adc_data_size, din_data, din_data_size, usr_data, usr_data_size);
end;
function L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
begin
L502_PrepareData:=_prepare_data(hnd, dac1, dac2, digout, size, flags, out_buf);
end;
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
begin
L502_BfLoadFirmware:=_bf_load_firm(hnd, PAnsiChar(AnsiString(filename)));
end;
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
L502_BfMemRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfMemRead:=_bf_mem_read(hnd, addr, regs, size);
end;
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
L502_BfMemWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfMemWrite:=_bf_mem_write(hnd, addr, regs, size);
end;
function L502_BfExecCmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(snd_data)) < snd_size) or
(LongWord(Length(rcv_data)) < rcv_size) then
L502_BfExecCmd := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfExecCmd:=_bf_exec_cmd(hnd, cmd_code, par, snd_data, snd_size,
rcv_data, rcv_size, tout, recvd_size);
end;
function L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
L502_FlashRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_FlashRead:=_bf_mem_write(hnd, addr, data, size);
end;
///Запись блока данных во Flash-память модуля.
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
L502_FlashWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_FlashWrite:=_bf_mem_write(hnd, addr, data, size);
end;
end.
+915
View File
@@ -0,0 +1,915 @@
unit x502api;
interface
uses Windows, SysUtils;
const
// Максимальное количество логических каналов в таблице
X502_LTABLE_MAX_CH_CNT = 256;
// Количество диапазонов для измерения напряжений
X502_ADC_RANGE_CNT = 6;
// Количество каналов АЦП в режиме с общей землей
X502_ADC_COMM_CH_CNT = 32;
// Количество каналов АЦП в дифференциальном режиме
X502_ADC_DIFF_CH_CNT = 16;
// Максимальное значение для аппаратного усреднения по логическому каналу
X502_LCH_AVG_SIZE_MAX = 128;
//Максимальное значения делителя частоты АЦП
X502_ADC_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение делителя частоты синхронного цифрового ввода
X502_DIN_FREQ_DIV_MAX = (1024*1024);
// Минимальное значение делителя частоты синхронного вывода
X502_OUT_FREQ_DIV_MIN = 2;
// Максимальное значение делителя частоты синхронного вывода
X502_OUT_FREQ_DIV_MAX = 1024;
// Значение делителя частоты вывода по умолчанию (которое также всегда
// используется в L502 с версией прошивки ПЛИС ниже 0.5)
X502_OUT_FREQ_DIV_DEFAULT = 2;
// Максимальное значение межкадровой задержки для АЦП
X502_ADC_INTERFRAME_DELAY_MAX = $1FFFFF;
// Таймаут по умолчанию для выполнения команды к BlackFin
X502_BF_CMD_DEFAULT_TOUT = 500;
// Код АЦП, соответствующий максимальному значению шкалы
X502_ADC_SCALE_CODE_MAX = 6000000;
// Код ЦАП, соответствующий максимальному значению шкалы
X502_DAC_SCALE_CODE_MAX = 30000;
// Максимальное количество символов в строке с названием устройства
X502_DEVNAME_SIZE = 32;
// Максимальное количество символов в строке с серийным номером
X502_SERIAL_SIZE = 32;
// Максимальное количество символов в строке с описанием подключения
X502_LOCATION_STR_SIZE = 64;
// Размер MAC-адреса для Ethernet интерфейса
X502_MAC_ADDR_SIZE = 6;
// Размер строки с описанием экземпляра устройства
X502_INSTANCE_NAME_SIZE = 64;
// Максимальный размер строки с паролем на настройки
X502_PASSWORD_SIZE = 32;
// Максимально возможное значение внешней опорной частоты
X502_EXT_REF_FREQ_MAX = 1500000;
//Размер пользовательской области Flash-памяти
X502_FLASH_USER_SIZE = $100000;
//Стандартный таймаут на выполнение запроса к BlackFin в мс
X502_BF_REQ_TOUT = 500;
// Диапазон ЦАП в вольтах
X502_DAC_RANGE = 5;
// Количество каналов ЦАП
X502_DAC_CH_CNT = 2;
// Количество цифровых выходов у модуля
X502_DOUT_LINES_CNT = 16;
// слово в потоке, означающее, что произошло переполнение
X502_STREAM_IN_MSG_OVERFLOW = $01010000;
X502_DEVREC_SIGN = $4C524543;
{ ----------------- Коды ошибок библиотеки ---------------------------}
// Функция выполнена без ошибок
X502_ERR_OK = 0;
// В функцию передан недействительный описатель модуля
X502_ERR_INVALID_HANDLE = -1;
// Ошибка выделения памяти
X502_ERR_MEMORY_ALLOC = -2;
// Попытка открыть уже открытое устройство
X502_ERR_ALREADY_OPENED = -3;
// Устройство с заданными параметрами не найдено в системе
X502_ERR_DEVICE_NOT_FOUND = -4;
// Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
X502_ERR_DEVICE_ACCESS_DENIED = -5;
// Ошибка открытия устройства
X502_ERR_DEVICE_OPEN = -6;
// В функцию передан недействительный указатель
X502_ERR_INVALID_POINTER = -7;
// Функция не может быть выполнена при запущенном потоке сбора данных
X502_ERR_STREAM_IS_RUNNING = -8;
// Ошибка чтения данных синхронного ввода
X502_ERR_RECV = -9;
// Ошибка записи данных для синхронного вывода
X502_ERR_SEND = -10;
// Произошло переполнение внутреннего буфера для потока синхронного ввода
X502_ERR_STREAM_OVERFLOW = -11;
// Неизвестное сообщение в потоке синхронного ввода
X502_ERR_UNSUP_STREAM_MSG = -12;
// Ошибка создания системного мьютекса
X502_ERR_MUTEX_CREATE = -13;
// Неверный описатель мьютекса
X502_ERR_MUTEX_INVALID_HANDLE = -14;
// Истекло время ожидания освобождения мьютекса
X502_ERR_MUTEX_LOCK_TOUT = -15;
// Ошибка освобождения мьютекса
X502_ERR_MUTEX_RELEASE = -16;
// Недостаточно системных ресурсов
X502_ERR_INSUFFICIENT_SYSTEM_RESOURCES= -17;
// Данная возможность еще не реализована
X502_ERR_NOT_IMPLEMENTED = -18;
// Недостаточный размер массива
X502_ERR_INSUFFICIENT_ARRAY_SIZE = -19;
// Ошибка чтения регистра FPGA
X502_ERR_FPGA_REG_READ = -20;
// Ошибка записи регистра FPGA
X502_ERR_FPGA_REG_WRITE = -21;
// Сбор данных уже остановлен
X502_ERR_STREAM_IS_NOT_RUNNING = -22;
// Ошибка освобождения интерфейса
X502_ERR_INTERFACE_RELEASE = -23;
// Ошибка запуска потока
X502_ERR_THREAD_START = -24;
// Ошибка останова потока
X502_ERR_THREAD_STOP = -25;
// Устройство было отключено
X502_ERR_DEVICE_DISCONNECTED = -26;
// Неверный размер ответа на управляющий запрос
X502_ERR_IOCTL_INVALID_RESP_SIZE = -27;
// Неверный тип устройства
X502_ERR_INVALID_DEVICE = -28;
// Недействительная запись о устройстве
X502_ERR_INVALID_DEVICE_RECORD = -29;
// Неверный хендл конфигурации модуля
X502_ERR_INVALID_CONFIG_HANDLE = -30;
// Связь с устройством закрыта или не была установлена
X502_ERR_DEVICE_NOT_OPENED = -31;
// Данная операция не доступна для текущего интерфейса связи с устройством
X502_ERR_INVALID_OP_FOR_IFACE = -32;
// Не загружен ПЛИС модуля
X502_ERR_FPGA_NOT_LOADED = -33;
// Неверная конфигурация USB-устройства
X502_ERR_INVALID_USB_CONFIGURATION = -34;
// Задан неверный размер логической таблицы
X502_ERR_INVALID_LTABLE_SIZE = -102;
// Задан неверный номер логического канала
X502_ERR_INVALID_LCH_NUMBER = -103;
// Неверно задано значение диапазона АЦП
X502_ERR_INVALID_LCH_RANGE = -104;
// Неверно задан режим измерения для логического канала
X502_ERR_INVALID_LCH_MODE = -105;
// Неверно задан номер физического канала при настройке логического
X502_ERR_INVALID_LCH_PHY_NUMBER = -106;
// Неверно задан размер усреднения для логического канала
X502_ERR_INVALID_LCH_AVG_SIZE = -107;
// Неверно задан делитель частоты сбора данных АЦП
X502_ERR_INVALID_ADC_FREQ_DIV = -108;
// Неверно задан делитель частоты синхронного ввода цифровых линий
X502_ERR_INVALID_DIN_FREQ_DIV = -109;
// Неверно задан режим работы модуля L502
X502_ERR_INVALID_MODE = -110;
// Неверный номер канала ЦАП
X502_ERR_INVALID_DAC_CHANNEL = -111;
// Неверный код выбора опорной частоты синхронизации
X502_ERR_INVALID_REF_FREQ = -112;
// Неверно задано значение межкадровой задержки
X502_ERR_INVALID_INTERFRAME_DELAY = -113;
// Неверно задан режим синхронизации
X502_ERR_INVALID_SYNC_MODE = -114;
// Неверно задан номер потока данных
X502_ERR_INVALID_STREAM_CH = -115;
// Неверно задан делитель частоты синхронного вывода
X502_ERR_INVALID_OUT_FREQ_DIV = -116;
// Ошибка захвата опорной частоты синхронизации
X502_ERR_REF_FREQ_NOT_LOCKED = -131;
// Управляющий запрос к драйверу завершен с ошибкой
X502_ERR_IOCTL_FAILD = -132;
// Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
X502_ERR_IOCTL_TIMEOUT = -133;
// Ошибка получения информации о устройстве от драйвера
X502_ERR_GET_INFO = -134;
// За время ожидания не было считано новое слово с цифровых линий
X502_ERR_DIG_IN_NOT_RDY = -135;
// Принято недостаточно слов от модуля
X502_ERR_RECV_INSUFFICIENT_WORDS = -136;
// Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
X502_ERR_DAC_NOT_PRESENT = -137;
// Неверный номер канала в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_NUM = -140;
// Неверный код диапазона в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_RANGE = -141;
// Задан неверный адрес во Flash-памяти
X502_ERR_FLASH_INVALID_ADDR = -142;
// Задан неверный размер блока данных при работе с Flash-памятью
X502_ERR_FLASH_INVALID_SIZE = -143;
// Истек таймаут ожидания завершения записи во Flash-память
X502_ERR_FLASH_WRITE_TOUT = -144;
// Истек таймаут ожидания завершения стирания блока Flash-памяти
X502_ERR_FLASH_ERASE_TOUT = -145;
// Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
X502_ERR_FLASH_SECTOR_BOUNDARY = -146;
// Не удалось открыть сокет для соединения
X502_ERR_SOCKET_OPEN = -147;
// Превышено время подключения
X502_ERR_CONNECTION_TOUT = -148;
// Соединение закрыто другой устройством
X502_ERR_CONNECTION_CLOSED_BY_DEV = -149;
// Не удалось установить заданный размер буфера сокета
X502_ERR_SOCKET_SET_BUF_SIZE = -150;
// Соединение для передачи данных не установлено
X502_ERR_NO_DATA_CONNECTION = -151;
// Не удалось дождаться сообщения о завершении потока
X502_ERR_NO_STREAM_END_MSG = -152;
// Соединение было сброшено другой стороной
X502_ERR_CONNECTION_RESET = -153;
// Не удалось найти хост с указанным адресом
X502_ERR_HOST_UNREACHABLE = -154;
// Ошибка установления TCP-соединения
X502_ERR_TCP_CONNECTION_ERROR = -155;
// Не удалось открыть файл прошивки BlackFin
X502_ERR_LDR_FILE_OPEN = -180;
// Ошибка чтения из фала прошивки BlackFin
X502_ERR_LDR_FILE_READ = -181;
// Неверный формат файла прошивки BlackFin
X502_ERR_LDR_FILE_FORMAT = -182;
// Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
X502_ERR_LDR_FILE_UNSUP_FEATURE = -183;
// Неверный стартовый адрес программы в прошивке BlackFin
X502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184;
// Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
X502_ERR_BF_REQ_TIMEOUT = -185;
// Команда для BlackFin все еще находится в процессе обработки
X502_ERR_BF_CMD_IN_PROGRESS = -186;
// Истекло время выполнения управляющей команды процессором BlackFin
X502_ERR_BF_CMD_TIMEOUT = -187;
// Возвращено недостаточно данных в ответ на команду к BlackFin
X502_ERR_BF_CMD_RETURN_INSUF_DATA = -188;
// Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
X502_ERR_BF_LOAD_RDY_TOUT = -189;
// Попытка выполнить операцию для которой нужен сигнальный процессор при
// отсутствии сигнального процессора в модуле
X502_ERR_BF_NOT_PRESENT = -190;
// Неверный адрес памяти BlackFin при записи или чтении по HDMA
X502_ERR_BF_INVALID_ADDR = -191;
// Неверный размер данных, передаваемых с управляющей командой в BlackFin
X502_ERR_BF_INVALID_CMD_DATA_SIZE = -192;
{--------------- Интерфейс соединения с модулем ------------------}
X502_IFACE_UNKNOWN = 0; // Неизвестный интерфейс
X502_IFACE_USB = 1; // Устройство подключено по USB
X502_IFACE_ETH = 2; // Устройство подключено по Ethernet через TCP/IP
X502_IFACE_PCI = 3; // Устройство подключено по PCI/PCIe
{-------- Флаги, управляющие поиском присутствующих модулей ------}
// Признак, что нужно вернуть серийные номера только тех устройств,
// которые еще не открыты
X502_GETDEVS_FLAGS_ONLY_NOT_OPENED = 1;
{-------- Флаги для управления цифровыми выходами. ---------------}
//Запрещение (перевод в третье состояние) старшей половины цифровых выходов
X502_DIGOUT_WORD_DIS_H = $00020000;
//Запрещение младшей половины цифровых выходов
X502_DIGOUT_WORD_DIS_L = $00010000;
{-------- Константы для выбора опорной частоты -------------------}
X502_REF_FREQ_2000KHZ = 2000000; // частота 2МГц
X502_REF_FREQ_1500KHZ = 1500000; // частота 1.5МГц
{-------- Диапазоны измерения для канала АЦП ----------------------}
X502_ADC_RANGE_10 = 0; // диапазон +/-10V
X502_ADC_RANGE_5 = 1; // диапазон +/-5V
X502_ADC_RANGE_2 = 2; // диапазон +/-2V
X502_ADC_RANGE_1 = 3; // диапазон +/-1V
X502_ADC_RANGE_05 = 4; // диапазон +/-0.5V
X502_ADC_RANGE_02 = 5; // диапазон +/-0.2V
{-------- Режим измерения для логического канала ------------------}
X502_LCH_MODE_COMM = 0; // Измерение напряжения относительно общей земли
X502_LCH_MODE_DIFF = 1; // Дифференциальное измерение напряжения
X502_LCH_MODE_ZERO = 2; // Измерение собственного нуля
{-------- Режимы синхронизации ------------------------------------}
X502_SYNC_INTERNAL = 0; // Внутренний сигнал
X502_SYNC_EXTERNAL_MASTER = 1; // От внешнего мастера по разъему межмодульной синхронизации
X502_SYNC_DI_SYN1_RISE = 2; // По фронту сигнала DI_SYN1
X502_SYNC_DI_SYN1_FALL = 3; // По спаду сигнала DI_SYN1
X502_SYNC_DI_SYN2_RISE = 6; // По фронту сигнала DI_SYN2
X502_SYNC_DI_SYN2_FALL = 7; // По спаду сигнала DI_SYN2
{-------- Флаги, управляющие обработкой принятых данных -------------------}
X502_PROC_FLAGS_VOLT = $00000001; // Признак, что нужно преобразовать значения
// АЦП в вольты
X502_PROC_FLAGS_DONT_CHECK_CH = $00010000; // Признак, что не нужно проверять совпадение номеров каналов
{-------- Флаги для обозначения синхронных потоков данных -----------------}
X502_STREAM_ADC = $01; //Поток данных от АЦП
X502_STREAM_DIN = $02; // Поток данных с цифровых входов
X502_STREAM_DAC1 = $10; // Поток данных первого канала ЦАП
X502_STREAM_DAC2 = $20; // Поток данных второго канала ЦАП
X502_STREAM_DOUT = $40; // Поток данных на цифровые выводы
// объединение всех флагов, обозначающих потоки данных на ввод
X502_STREAM_ALL_IN = X502_STREAM_ADC or X502_STREAM_DIN;
// объединение всех флагов, обозначающих потоки данных на вывод
X502_STREAM_ALL_OUT = X502_STREAM_DAC1 or X502_STREAM_DAC2 or X502_STREAM_DOUT;
{--- Константы, определяющие тип передаваемого отсчета из ПК в модуль -----}
X502_STREAM_OUT_WORD_TYPE_DOUT = $0; // Цифровой вывод
X502_STREAM_OUT_WORD_TYPE_DAC1 = $40000000; // Код для 1-го канала ЦАП
X502_STREAM_OUT_WORD_TYPE_DAC2 = $80000000; // Код для 2-го канала ЦАП
{------------------ Режим работы модуля L502 ------------------------------}
X502_MODE_FPGA = 0; // Все потоки данных передаются через ПЛИС минуя
// сигнальный процессор BlackFin
X502_MODE_DSP = 1; // Все потоки данных передаются через сигнальный
// процессор, который должен быть загружен
// прошивкой для обработки этих потоков
X502_MODE_DEBUG = 2; // Отладочный режим
{------------------- Номера каналов ЦАП -----------------------------------}
X502_DAC_CH1 = 0; //Первый канал ЦАП
X502_DAC_CH2 = 1; //Второй канал ЦАП
{----------- Флаги, используемые при выводе данных на ЦАП -----------------}
// Указывает, что значение задано в Вольтах и при выводе его нужно
// перевести в коды ЦАП. Если флаг не указан, то считается, что значение
// изначально в кодах
X502_DAC_FLAGS_VOLT = $0001;
// Указывает, что нужно применить калибровочные коэффициенты перед
// выводом значения на ЦАП.
X502_DAC_FLAGS_CALIBR = $0002;
{---------- Номера каналов для передачи потоков данных --------------------}
X502_STREAM_CH_IN = 0; // Общий канал на ввод
X502_STREAM_CH_OUT = 1; // Общий канал на вывод
{--- Цифровые линии, на которых можно включить подтягивающие резисторы ----}
X502_PULLUPS_DI_H = $01; // Старшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_L = $02; // Младшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_SYN1 = $04; // Линия SYN1
X502_PULLUPS_DI_SYN2 = $08; // Линия SYN2
X502_PULLDOWN_CONV_IN = $10; // Подтяжка к 0 линии межмодульной
// синхронизации CONV_IN (только для E502)
X502_PULLDOWN_START_IN = $20; // Подтяжка к 0 линии межмодульной
// синхронизации START_IN (только для E502)
{--------------- Флаги, определяющие наличие опций в модуле ---------------}
// Признак наличия двухканального канального ЦАП
X502_DEVFLAGS_DAC_PRESENT = $00000001;
// Признак наличия гальваноразвязки
X502_DEVFLAGS_GAL_PRESENT = $00000002;
// Признак наличия сигнального процессора BlackFin
X502_DEVFLAGS_BF_PRESENT = $00000004;
// Признак, что устройство поддерживает интерфейс USB
X502_DEVFLAGS_IFACE_SUPPORT_USB = $00000100;
// Признак, что устройство поддерживает Ethernet
X502_DEVFLAGS_IFACE_SUPPORT_ETH = $00000200;
// Признак, что устройство поддерживает интерфейс PCI/PCI-Express
X502_DEVFLAGS_IFACE_SUPPORT_PCI = $00000400;
// Признак, что устройство выполнено в индустриалном исполнении
X502_DEVFLAGS_INDUSTRIAL = $00008000;
// Признак, что во Flash-памяти присутствует информация о модуле
X502_DEVFLAGS_FLASH_DATA_VALID = $00010000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты АЦП
X502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = $00020000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты ЦАП
X502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = $00040000;
// Признак, что присутствует прошивка ПЛИС и она успешно была загружена
X502_DEVFLAGS_FPGA_LOADED = $00800000;
// Признак, что устройство уже открыто (действителен только внутри t_x502_devrec)
X502_DEVFLAGS_DEVREC_OPENED = $01000000;
{ Тип содержимого строки с расположением устройства }
// В поле расположения устройства не содержится информации
X502_LOCATION_TYPE_NONE = 0;
// В поле расположения устройства содержится строка с адресом устройства
X502_LOCATION_TYPE_ADDR = 1;
// В поле ресположения устройства содержится строка с именем экземпляра
X502_LOCATION_TYPE_INSTANCE_NAME = 2;
{----------------Флаги для режима циклического вывода----------------------}
// Флаг указывает, что останов или смена сигнала могут произойти без ожидания
// конца цикла предыдущего сигнала.
X502_OUT_CYCLE_FLAGS_FORCE = $01;
// Флаг указывает, что функция должна дождаться полной загрузки сигнала
// и установки сигнала на вывод (для X502_OutCycleSetup()) или завершения
// генерации циклического сигнала (для X502_OutCycleStop())
X502_OUT_CYCLE_FLAGS_WAIT_DONE = $02;
{ ----- Коды возможностей модуля, которые могут поддерживаться или нет
в зависимости от типа модуля, версий прошивок и т.п. -------------}
// Поддержка установки делителя частоты вывода, отличного от #X502_OUT_FREQ_DIV_DEFAULT
X502_FEATURE_OUT_FREQ_DIV = 1;
// Возможность чтения флагов состояния вывода с помощью X502_OutGetStatusFlags()
X502_FEATURE_OUT_STATUS_FLAGS = 2;
{ --------------- Флаги состояния для синхронного вывода ------------------}
// Флаг указывает, что в настоящее время буфер в модуле на передачу пуст
X502_OUT_STATUS_FLAG_BUF_IS_EMPTY = $01;
// Флаг указывает, что было опустошение буфера на вывод с начала старта синхронного
// ввода-вывода или с момента последнего чтения статуса с помощью
// X502_OutGetStatusFlags() (в зависимости от того, что было последним)
X502_OUT_STATUS_FLAG_BUF_WAS_EMPTY = $02;
type
st_x502_devrec_inptr = record
end;
t_x502_devrec_inptr_hnd = ^st_x502_devrec_inptr;
// Структура, описывающая устройство, по которой с ним можно установить соединение
t_x502_devrec = record
sign : LongWord; { Признак действительной структуры.
Если запись действительна (соответствует какому-либо устройству),
то должен быть равен #X502_DEVREC_SIGN) }
devname : array [0..X502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства
serial : array [0..X502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
location: array [0..X502_LOCATION_STR_SIZE-1] of AnsiChar; // Описание подключения (если есть)
flags : LongWord; // Флаги из #t_x502_dev_flags, описывающие устройство
iface : Byte; // Интерфейс, по которому подключено устройство
location_type : Byte; // Определяет, что именно сохранено в поле location
res : array [0..122-1] of Byte; // Резерв
internal : t_x502_devrec_inptr_hnd; { Непрозрачный указатель на структуру с
информацией об устройстве для возможности
его открытия. }
end;
// описатель модуля - указатель на непрозрачную структуру
t_x502_hnd = ^st_x502;
st_x502 = record
end;
{ калибровочные коэффициенты диапазона }
t_x502_cbr_coef = record
offs: Double; // смещение нуля
k : Double; // коэффициент шкалы
end;
{ Калибровочные коэффициенты модуля. }
t_x502_cbr = record
//Калибровочные коэффициенты АЦП
adc: array[0..X502_ADC_RANGE_CNT-1] of t_x502_cbr_coef;
res1: array[0..63] of LongWord;
// Калибровочные коэффициенты ЦАП
dac: array[0..X502_DAC_CH_CNT-1] of t_x502_cbr_coef;
res2: array[0..19] of LongWord;
end;
{ Информация о модуле}
t_x502_info = record
name: array[0..X502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства ("L502")
serial: array[0..X502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
devflags: LongWord; // Флаги описывающие наличие в модуле определенных опций
fpga_ver : Word; // Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver : Byte; // Версия ПЛИС, управляющего аналоговой частью
board_rev: Byte; // Ревизия платы
mcu_firmware_ver : LongWord; // Версия прошивки контроллера Cortex-M4. Действительна только для E502
factory_mac : array[0..X502_MAC_ADDR_SIZE-1] of byte; { Заводской MAC-адрес --- действителен только для
устройств с Ethernet-интерфейсом }
res : array[0..110-1] of Byte; //резерв
cbr : t_x502_cbr; // Заводские калибровочные коэффициенты (из Flash-памяти)
end;
type t_x502_serial_array = array[0..0] of array[0..X502_SERIAL_SIZE-1] of AnsiChar;
type p_x502_serial_array = ^t_x502_serial_array;
type t_x502_devrec_array = array[0..0] of t_x502_devrec;
type p_x502_devrec_array = ^t_x502_devrec_array;
function X502_Create(): t_x502_hnd; stdcall;
function X502_Free(hnd: t_x502_hnd): LongInt; stdcall;
function X502_OpenByDevRecord(hnd: t_x502_hnd; var devrec : t_x502_devrec) : LongInt; stdcall;
function X502_FreeDevRecordList(list : array of t_x502_devrec; size : LongWord) : LongInt; stdcall; overload;
function X502_FreeDevRecordList(var rec : t_x502_devrec) : LongInt; stdcall; overload;
function X502_IsOpened(hnd: t_x502_hnd): LongInt; stdcall;
//разорвать связь с модулем
function X502_Close(hnd: t_x502_hnd): LongInt; stdcall;
//получение информации о модуле
function X502_GetDevInfo(hnd: t_x502_hnd; out info: t_x502_info) : LongInt; stdcall;
// Передача установленных настроек в модуль
function X502_Configure(hnd: t_x502_hnd; flags: LongWord): LongInt; stdcall;
// Установка параметров логического канала
function X502_SetLChannel(hnd: t_x502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall;
// Установка количества логических каналов
function X502_SetLChannelCount(hnd: t_x502_hnd; lch_cnt : LongWord): LongInt; stdcall;
// Получение количества логических каналов
function X502_GetLChannelCount(hnd: t_x502_hnd; out lch_cnt: LongWord): LongInt; stdcall;
// Установка делителя частоты сбора для АЦП
function X502_SetAdcFreqDivider(hnd: t_x502_hnd; adc_freq_div : LongWord): LongInt; stdcall;
// Установка значения межкадровой задержки для АЦП
function X502_SetAdcInterframeDelay(hnd: t_x502_hnd; delay : LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного ввода с цифровых линий
function X502_SetDinFreqDivider(hnd: t_x502_hnd; din_freq_div: LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного вывода
function X502_SetOutFreqDivider(hnd: t_x502_hnd; out_freq_div : LongWord): LongInt; stdcall;
// Установка частоты сбора АЦП
function X502_SetAdcFreq(hnd: t_x502_hnd; var f_acq, f_frame: Double): LongInt; stdcall;
// Установка частоты синхронного ввода с цифровых входов
function X502_SetDinFreq(hnd: t_x502_hnd; var f_din: Double): LongInt; stdcall;
// Установка частоты синхронного вывода.
function X502_SetOutFreq(hnd: t_x502_hnd; var f_dout: Double): LongInt; stdcall;
// Получить текущие значения частот сбора АЦП
function X502_GetAdcFreq(hnd: t_x502_hnd; out f_acq, f_frame: Double): LongInt; stdcall;
// Установка значения опорной частоты синхронизации
function X502_SetRefFreq(hnd: t_x502_hnd; freq: LongWord): LongInt; stdcall;
// Установка значения внешней опорной частоты синхронизации
function X502_SetExtRefFreqValue(hnd: t_x502_hnd; freq : Double): LongInt; stdcall;
//Получение значения опорной частоты синхронизации
function X502_GetRefFreqValue(hnd: t_x502_hnd; out freq : Double): LongInt; stdcall;
// Установка режима генерации частоты синхронизации.
function X502_SetSyncMode(hnd: t_x502_hnd; sync_mode: LongWord): LongInt; stdcall;
// Установка режима запуска частоты синхронизации.
function X502_SetSyncStartMode(hnd: t_x502_hnd; sync_start_mode: LongWord): LongInt; stdcall;
// Установить режим работы модуля
function X502_SetMode(hnd: t_x502_hnd; mode: LongWord): LongInt; stdcall;
// Получение текущего режима работы модуля.
function X502_GetMode(hnd: t_x502_hnd; out mode: LongWord): LongInt; stdcall;
// Установить коэффициенты для калибровки значений АЦП.
function X502_SetAdcCoef(hnd: t_x502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов АЦП.
function X502_GetAdcCoef(hnd: t_x502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall;
// Установить коэффициенты для калибровки значений ЦАП.
function X502_SetDacCoef(hnd: t_x502_hnd; ch : LongWord; k, double: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов ЦАП.
function X502_GetDacCoef(hnd: t_x502_hnd; ch : LongWord; out k, double: Double): LongInt; stdcall;
// Рассчет частоты сбора АЦП
function X502_CalcAdcFreq(ref_freq: Double; lch_cnt: LongWord; var f_acq, f_frame: Double; out result_freq_div : LongWord; out result_frame_delay: LongWord): LongInt; stdcall;
// Рассчет частоты синхронного ввода с цифровых входов.
function X502_CalcDinFreq(ref_freq: Double; var f_din : Double; out result_freq_div : LongWord): LongInt; stdcall;
// Рассчет частоты синхронного вывода
function X502_CalcOutFreq(ref_freq: Double; var f_dout : Double; out result_freq_div : LongWord): LongInt; stdcall;
{----------------------- Функции асинхронного ввода-вывода ------------------}
// Асинхронный вывод данных на канал ЦАП.
function X502_AsyncOutDac(hnd: t_x502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall;
// Асинхронный вывод данных на цифровые выходы.
function X502_AsyncOutDig(hnd: t_x502_hnd; val, msk: LongWord): LongInt; stdcall;
// Асинхронный ввод значений с цифровых входов.
function X502_AsyncInDig(hnd: t_x502_hnd; out din: LongWord): LongInt; stdcall;
// Асинхронный ввод одного кадра АЦП.
function X502_AsyncGetAdcFrame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
{-------------- Функции для работы с синхронным потоковым вводом-выводом ----}
// Разрешение синхронных потоков на ввод/вывод.
function X502_StreamsEnable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall;
// Запрещение синхронных потоков на ввод/вывод.
function X502_StreamsDisable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall;
// Получить значение, какие синхронные потоки разрешены.
function X502_GetEnabledStreams(hnd: t_x502_hnd; out streams: LongWord): LongInt; stdcall;
// Запуск синхронных потоков ввода/вывода.
function X502_StreamsStart(hnd: t_x502_hnd): LongInt; stdcall;
// Останов синхронных потоков ввода/вывода.
function X502_StreamsStop(hnd: t_x502_hnd): LongInt; stdcall;
// Проверка, запущен ли поток данных
function X502_IsRunning(hnd: t_x502_hnd): LongInt; stdcall;
// Чтение данных АЦП и цивровых входов из модуля.
function X502_Recv(hnd: t_x502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
// Передача потоковых данных ЦАП и цифровых выходов в модуль.
function X502_Send(hnd: t_x502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
// Обработка принятых отсчетов АЦП от модуля.
function X502_ProcessAdcData(hnd: t_x502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
// Обработка принятых от модуля данных.
function X502_ProcessData(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
// Обработка принятых от модуля данных ьзовательскими данными.
function X502_ProcessDataWithUserExt(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
// Подготовка данных для вывода в модуль.
function X502_PrepareData(hnd: t_x502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
// Получить количество отсчетов в буфере потока на ввод.
function X502_GetRecvReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить размер свободного места в буфере потока на вывод.
function X502_GetSendReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить номер следующего ожидаемого логического канала АЦП для обработки.
function X502_GetNextExpectedLchNum(hnd: t_x502_hnd; out lch: LongWord):LongInt; stdcall;
// Начало подготовки вывода синхронных данных
function X502_PreloadStart(hnd: t_x502_hnd): LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function X502_OutCycleLoadStart(hnd: t_x502_hnd; size: LongWord):LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function X502_OutCycleSetup(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall;
// Останов вывода циклического сигнала
function X502_OutCycleStop(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall;
// Проверка, завершена ли установка или останов циклического сигнала
function X502_OutCycleCheckSetupDone(hnd: t_x502_hnd; out done : LongBool):LongInt; stdcall;
// Чтение флагов статуса вывода
function X502_OutGetStatusFlags(hnd: t_x502_hnd; out status : LongWord): LongInt; stdcall;
// Установка размера буфера для синхронного ввода или вывода.
function X502_SetStreamBufSize(hnd: t_x502_hnd; dma_ch, size: LongWord): LongInt; stdcall;
// Установка шага при передаче потока на ввод или вывод.
function X502_SetStreamStep(hnd: t_x502_hnd; dma_ch, step: LongWord): LongInt; stdcall;
{------------ Функции для работы с сигнальным процессором -------------------}
// Загрузка прошивки сигнального процессора BlackFin.
function X502_BfLoadFirmware(hnd: t_x502_hnd; filename: string): LongInt; stdcall;
// Проверка, загружена ли прошивка BlackFIn
function X502_BfCheckFirmwareIsLoaded(hnd: t_x502_hnd; out version: LongWord): LongInt; stdcall;
/// Чтение блока данных из памяти сигнального процессора.
function X502_BfMemRead(hnd: t_x502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
/// Запись блока данных в память сигнального процессора.
function X502_BfMemWrite(hnd: t_x502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
/// Передача управляющей команды сигнальному процессору.
function X502_BfExecCmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
{------------------- Функции для работы с Flash-памятью модуля -------------}
/// Чтение блока данных из Flash-памяти модуля.
function X502_FlashRead(hnd: t_x502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
///Запись блока данных во Flash-память модуля.
function X502_FlashWrite(hnd: t_x502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
/// Стирание блока во Flash-памяти.
function X502_FlashErase(hnd: t_x502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall;
/// Разрешение записи в пользовательскую область Flash-памяти.
function X502_FlashWriteEnable(hnd: t_x502_hnd): LongInt; stdcall;
/// Запрет записи в пользовательскую область Flash-памяти.
function X502_FlashWriteDisable(hnd: t_x502_hnd): LongInt; stdcall;
{----------------- Дополнительные вспомогательные функции ------------------}
//Получить версию библиотеки.
function X502_GetLibraryVersion() : LongWord; stdcall;
// Получение строки об ошибке
function X502_GetErrorString(err: LongInt) : string; stdcall;
// Моргание светодиодом на передней панели.
function X502_LedBlink(hnd: t_x502_hnd): LongInt; stdcall;
// Установка подтягивающих резисторов на входных линиях.
function X502_SetDigInPullup(hnd: t_x502_hnd; pullups : LongWord): LongInt; stdcall;
// Проверка поддержки модулем заданной возможности
function X502_CheckFeature(hnd: t_x502_hnd; feature : LongWord) : LongInt; stdcall;
implementation
function X502_Create() : t_x502_hnd; stdcall; external 'x502api.dll';
function X502_Free(hnd: t_x502_hnd) : LongInt; stdcall; external 'x502api.dll';
function X502_OpenByDevRecord(hnd: t_x502_hnd; var devrec : t_x502_devrec) : LongInt; stdcall; external 'x502api.dll';
function _free_dev_record_list(var list ; size : LongWord) : LongInt; stdcall; external 'x502api.dll' name 'X502_FreeDevRecordList';
function X502_IsOpened(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_Close(hnd : t_x502_hnd) : LongInt; stdcall; external 'x502api.dll';
function X502_GetDevInfo(hnd : t_x502_hnd; out info : t_x502_info) : LongInt; stdcall; external 'x502api.dll';
function X502_Configure(hnd: t_x502_hnd; flags: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetLChannel(hnd: t_x502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetLChannelCount(hnd: t_x502_hnd; lch_cnt : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetLChannelCount(hnd: t_x502_hnd; out lch_cnt: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcFreqDivider(hnd: t_x502_hnd; adc_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcInterframeDelay(hnd: t_x502_hnd; delay : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetDinFreqDivider(hnd: t_x502_hnd; din_freq_div: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetOutFreqDivider(hnd: t_x502_hnd; out_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcFreq(hnd: t_x502_hnd; var f_acq, f_frame: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetDinFreq(hnd: t_x502_hnd; var f_din: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetOutFreq(hnd: t_x502_hnd; var f_dout: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetAdcFreq(hnd: t_x502_hnd; out f_acq, f_frame: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetRefFreq(hnd: t_x502_hnd; freq: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetExtRefFreqValue(hnd: t_x502_hnd; freq : Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetRefFreqValue(hnd: t_x502_hnd; out freq : Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetSyncMode(hnd: t_x502_hnd; sync_mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetSyncStartMode(hnd: t_x502_hnd; sync_start_mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetMode(hnd: t_x502_hnd; mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetMode(hnd: t_x502_hnd; out mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcCoef(hnd: t_x502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetAdcCoef(hnd: t_x502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetDacCoef(hnd: t_x502_hnd; ch : LongWord; k, double: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetDacCoef(hnd: t_x502_hnd; ch : LongWord; out k, double: Double): LongInt; stdcall; external 'x502api.dll';
function X502_CalcAdcFreq(ref_freq: Double; lch_cnt: LongWord; var f_acq, f_frame: Double; out result_freq_div : LongWord; out result_frame_delay: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CalcDinFreq(ref_freq: Double; var f_din : Double; out result_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CalcOutFreq(ref_freq: Double; var f_dout : Double; out result_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncOutDac(hnd: t_x502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncOutDig(hnd: t_x502_hnd; val, msk: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncInDig(hnd: t_x502_hnd; out din: LongWord): LongInt; stdcall; external 'x502api.dll';
function _get_adc_frame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data): LongInt; stdcall; external 'x502api.dll' name 'X502_AsyncGetAdcFrame';
function X502_StreamsEnable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsDisable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetEnabledStreams(hnd: t_x502_hnd; out streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsStart(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_IsRunning(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsStop(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function _recv(hnd: t_x502_hnd; out buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_Recv';
function _send(hnd: t_x502_hnd; const buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_Send';
function _process_adc_data(hnd: t_x502_hnd; const src; out dest; var size : LongWord;
flags : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessAdcData';
function _process_data(hnd: t_x502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord):LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessData';
function _process_data_usr(hnd: t_x502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord;
out usr_data; var usr_data_size: LongWord):LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessDataWithUserExt';
function _prepare_data(hnd: t_x502_hnd; const dac1, dac2; const digout; size, flags : LongWord;
out out_buf):LongInt; stdcall; external 'x502api.dll' name 'X502_PrepareData';
function X502_GetRecvReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_GetSendReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_GetNextExpectedLchNum(hnd: t_x502_hnd; out lch: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_PreloadStart(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleLoadStart(hnd: t_x502_hnd; size: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleSetup(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleStop(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleCheckSetupDone(hnd: t_x502_hnd; out done : LongBool):LongInt; stdcall; external 'x502api.dll';
function X502_OutGetStatusFlags(hnd: t_x502_hnd; out status : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetStreamBufSize(hnd: t_x502_hnd; dma_ch, size: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetStreamStep(hnd: t_x502_hnd; dma_ch, step: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_BfCheckFirmwareIsLoaded(hnd: t_x502_hnd; out version: LongWord): LongInt; stdcall; external 'x502api.dll';
function _bf_load_firm(hnd: t_x502_hnd; filename: PAnsiChar): LongInt; stdcall; external 'x502api.dll' name 'X502_BfLoadFirmware';
function _bf_mem_read(hnd: t_x502_hnd; addr : LongWord; out regs; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfMemRead';
function _bf_mem_write(hnd: t_x502_hnd; addr : LongWord; const regs; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfMemWrite';
function _bf_exec_cmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data; snd_size : LongWord; out rcv_data; rcv_size : LongWord;
tout: LongWord; out recved_size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfExecCmd';
function _flash_read(hnd: t_x502_hnd; addr: LongWord; out data; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_FlashRead';
function _flash_write(hnd: t_x502_hnd; addr: LongWord; const data; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_FlashWrite';
function X502_FlashErase(hnd: t_x502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_FlashWriteEnable(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_FlashWriteDisable(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_GetLibraryVersion() : LongWord; stdcall; external 'x502api.dll';
function _get_err_str(err : LongInt) : PAnsiChar; stdcall; external 'x502api.dll' name 'X502_GetErrorString';
function X502_LedBlink(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_SetDigInPullup(hnd: t_x502_hnd; pullups : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CheckFeature(hnd: t_x502_hnd; feature : LongWord) : LongInt; stdcall; external 'x502api.dll';
function X502_FreeDevRecordList(list : array of t_x502_devrec; size : LongWord) : LongInt; stdcall; overload;
begin
X502_FreeDevRecordList:=_free_dev_record_list(list, size);
end;
function X502_FreeDevRecordList(var rec : t_x502_devrec) : LongInt; stdcall; overload;
begin
X502_FreeDevRecordList:=_free_dev_record_list(rec, 1);
end;
function X502_GetErrorString(err: LongInt) : string;
begin
X502_GetErrorString:= string(_get_err_str(err));
end;
function X502_AsyncGetAdcFrame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
var err: LongInt;
lch_cnt: LongWord;
begin
err := X502_GetLChannelCount(hnd, lch_cnt);
if err = X502_ERR_OK then
begin
if LongWord(Length(data)) < lch_cnt then
err := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
err := _get_adc_frame(hnd,flags,tout,data);
end;
X502_AsyncGetAdcFrame := err;
end;
function X502_Recv(hnd: t_x502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
X502_Recv := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_Recv := _recv(hnd, buf, size, tout);
end;
function X502_Send(hnd: t_x502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
X502_Send:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_Send:=_send(hnd,buf,size,tout);
end;
function X502_ProcessAdcData(hnd: t_x502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
begin
if (LongWord(Length(src)) < size) or (LongWord(Length(dest)) < size) then
X502_ProcessAdcData:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessAdcData:=_process_adc_data(hnd, src, dest, size, flags);
end;
function X502_ProcessData(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) then
X502_ProcessData:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessData:=_process_data(hnd, src, size, flags, adc_data, adc_data_size, din_data, din_data_size);
end;
function X502_ProcessDataWithUserExt(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) or (LongWord(Length(usr_data)) < usr_data_size) then
X502_ProcessDataWithUserExt:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessDataWithUserExt:=_process_data_usr(hnd, src,size,flags,adc_data,
adc_data_size, din_data, din_data_size, usr_data, usr_data_size);
end;
function X502_PrepareData(hnd: t_x502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
begin
X502_PrepareData:=_prepare_data(hnd, dac1, dac2, digout, size, flags, out_buf);
end;
function X502_BfLoadFirmware(hnd: t_x502_hnd; filename: string): LongInt; stdcall;
begin
X502_BfLoadFirmware:=_bf_load_firm(hnd, PAnsiChar(AnsiString(filename)));
end;
function X502_BfMemRead(hnd: t_x502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
X502_BfMemRead := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfMemRead:=_bf_mem_read(hnd, addr, regs, size);
end;
function X502_BfMemWrite(hnd: t_x502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
X502_BfMemWrite := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfMemWrite:=_bf_mem_write(hnd, addr, regs, size);
end;
function X502_BfExecCmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(snd_data)) < snd_size) or
(LongWord(Length(rcv_data)) < rcv_size) then
X502_BfExecCmd := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfExecCmd:=_bf_exec_cmd(hnd, cmd_code, par, snd_data, snd_size,
rcv_data, rcv_size, tout, recvd_size);
end;
function X502_FlashRead(hnd: t_x502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
X502_FlashRead := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_FlashRead:=_bf_mem_write(hnd, addr, data, size);
end;
///Запись блока данных во Flash-память модуля.
function X502_FlashWrite(hnd: t_x502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
X502_FlashWrite := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_FlashWrite:=_bf_mem_write(hnd, addr, data, size);
end;
end.