Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 09:44 
Hallo Leute,
ich habe ein Problem mit der Nutzung einer DLL die wohl keine richtigen Einsprungpunkte bietet.
Also von Anfang an:
ich möchte einen USB zu I2C IC von FTDI nutzen, den FT260.
Dazu gibt es eine DLL und für C++ ein paar Beispielcodes, ich nutze aber Delphi 2005.
Im Anhang findet ihr die DLL und die AN dafür.
Ich wollte jetzt einfach mal eine Funktion testen:
die als erstes auch in der Application Note genutzt wird um eine Devicelist zu erstellen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
implementation

{$R *.dfm}
function _FT260_CreateDeviceList: integer; stdcall;
external 'LibFT260.dll'  index 4 ;
procedure TForm1.ExitClick(Sender: TObject);
begin
application.Terminate ;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(inttostr(_FT260_CreateDeviceList));
end;


also beim klicken auf den Button2 wird mir auch ein eZahl wieder gegeben aber sobald ich die Message bestätige, bekomm ich eine Zugriffsverletzung.

Kann mir jemand sagen wie ich das richtig nutzen muss?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 16.08.2017 um 13:01
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 16.08.17 10:14 
Guten Tag daywalker0086,

hast du rein zufällig auch die Header-Datei (LibFT260.h) mit dabei, um ganz sicher zu gehen, wie die Funktion im Original-Code deklariert ist?
Im Handbuch finde ich lediglich eine FT260_CreateDeviceList() Methode mit folgenden Parametern:

ausblenden C++-Quelltext
1:
2:
// Seite 11 ganz unten im Handbuch
FT260_STATUS FT260_CreateDeviceList (LPDWORD lpdwNumDevs)

Ich nehme mal an der Rückgabetyp FT260_STATUS ist ein Integer, also könnte es so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
unit XY;

interface

type
  FT260_STATUS = Byte;  // eventuell abändern, falls das Enum > 255 ist
 
function FT260_CreateDeviceList(var lpdwNumDevs: DWord): FT260_STATUS; stdcall;

implementation
function FT260_CreateDeviceList; external 'LibFT260.dll' name 'FT260_CreateDeviceList';

end.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)


Zuletzt bearbeitet von Frühlingsrolle am Mi 16.08.17 10:36, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18692
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 16.08.17 10:26 
Die Headerdatei liegt oben im Zip. Und da sieht die Funktion auch ganz anders aus als in dem Delphicode oben:
ausblenden C++-Quelltext
1:
LIBFT260_API FT260_STATUS WINAPI FT260_CreateDeviceList(LPDWORD lpdwNumDevs);					

Dass es dann knallt, ist klar...

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
function FT260_CreateDeviceList(lpdwNumDevs: DWord): Integer; stdcall// bzw. FT260_STATUS als Rückgabetyp					
Ich würde sagen das müsste ein var-Parameter sein. LPDWORD ist doch ein Pointer auf ein DWORD.

// EDIT:
Und der Rückgabewert FT260_STATUS ist eine Enumeration.

Für diesen Beitrag haben gedankt: Frühlingsrolle
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 10:51 
Hallo und erstmal vielen Dank für die Antworten.

Leider tut sich noch nix bzw. erhalte immernoch die Exceptions...

Also wenn ich folgendes ändere
ausblenden Delphi-Quelltext
1:
external 'LibFT260.dll'  name 'FT260_CreateDeviceList' ;					

Kommt die Meldung das der Prozedureinsprungpunkt "FT260_CreateDeviceList" nicht gefunden wurde.

Wenn ich das wieder zu index 4 ändere und meinen Buttonaufruf
zu
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button2Click(Sender: TObject);
var
devNum : dword;
begin
devnum:= 0;
showmessage(inttostr(FT260_CreateDeviceList(DWORD(@devnum))));
end;

ändere erhalte ich wieder eine Zahl im Dialog aber danach wieder eine Exception...

Könnt ihr nochmal schauen?
Viele Grüße Christian
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 16.08.17 11:19 
Wenn die Meldung kommt, dass er die Funktion nicht finden kann, dann liegt sie in der DLL so nicht vor. Der index allein ist nicht aussagekräftig und kann irgendeine DLL interne Funktion aufrufen, die genau diesen Wert für den Export zugewiesen bekam. Deckt sich die Deklaration der DLL Funktion rein zufällig mit deiner Funktion, wird auch ein Wert zurückgeliefert, und das ohne Fehlermeldung.
Die Zugriffsverweigerung deutet aber darauf, dass so eine Funktion nicht gegeben ist. Ich schau mir mal die Headerdatei an.

Nachtrag:
Doch, sie liegt so vor. Das kann ich erst am Abend/Nacht testen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 12:19 
Hey Frühlingsrolle,
das wäre super wenn du das testen könntest, heute Abend ist kein Problem oder morgen... :D
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 16.08.17 12:45 
Ich habe mal in die DLL (gezwungenermaßen) "reingeschnuppert" :twisted: und die Funktion unter dem Namen "_FT260_CreateDeviceList@4" bzw. den Index = 3 gefunden. D.h. so sollte es funktionieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// ...
implementation

function FT260_CreateDeviceList; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4';
// oder
//function FT260_CreateDeviceList; external 'LibFT260.dll' index 3;


// Aufruf
var
  numDev: DWord;
begin
  numDev := 0;
  ShowMessage(IntToStr(FT260_CreateDeviceList(numDev)));
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 16:10 
Tut es leider nicht. :cry:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
implementation

{$R *.dfm}

function FT260_CreateDeviceList(var lpdwNumDevs: DWord):integer; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4';

procedure TForm1.ExitClick(Sender: TObject);
begin
application.Terminate ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
devNum : dword;
begin
devnum:= 0;
//D2xxunit.Get_USB_Device_List_Detail(1);
ShowMessage(IntToStr(FT260_CreateDeviceList(devnum)));
end;

end.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 16.08.17 16:15 
Zitat:
Tut es leider nicht. :cry:

... ist eine weniger hilfreiche Fehlerbeschreibung. :nixweiss:

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 16:52 
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Users\c.hohmann\Documents\Borland Studio-Projekte\Messfeld.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x74d8cb49: read of address 0x00000000'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 16.08.17 17:13 
Dafür müsste ich dir auf die Finger klopfen, aber mit dem Schnitzelklopfer :mrgreen:

Mir ist es auf den ersten Blick auch nicht aufgefallen, aber jetzt sehe ich, dass du die Funktion falsch importiert hast. Warum kopierst du den Code nicht einfach (richtig) ?
Nochmal das Ganze:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function FT260_CreateDeviceList(var lpdwNumDevs: DWord): Byte; stdcall;

implementation

function FT260_CreateDeviceList; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4';

// ... ab hier dein Funktionsaufruf

Sicherheitshalber: Falls "0" herauskommt, ist die Funktion geglückt:
AN_395_User_Guide_for_LibFT260.pdf hat folgendes geschrieben:
FT260_OK if successful, otherwise the return value is an error code.


ausblenden LibFT260.h
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
enum FT260_STATUS
{
    FT260_OK,  // = 0
    FT260_INVALID_HANDLE, // = 1 usw
    FT260_DEVICE_NOT_FOUND,
    FT260_DEVICE_NOT_OPENED,
    FT260_DEVICE_OPEN_FAIL,
    FT260_DEVICE_CLOSE_FAIL,
    FT260_INCORRECT_INTERFACE,
    FT260_INCORRECT_CHIP_MODE,
    FT260_DEVICE_MANAGER_ERROR,
    FT260_IO_ERROR,
    FT260_INVALID_PARAMETER,
    FT260_NULL_BUFFER_POINTER,
    FT260_BUFFER_SIZE_ERROR,
    FT260_UART_SET_FAIL,
    FT260_RX_NO_DATA,
    FT260_GPIO_WRONG_DIRECTION,
    FT260_INVALID_DEVICE,
    FT260_OTHER_ERROR
};

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 17.08.17 12:21 
Hallo Frühlingsrolle,
vielen Dank für deine Bemühungen jetzt sieht es schon etwas besser aus.
Jetzt hab ich noch eine Sache, dann belästige ich euch erstmal nicht weiter.
Da ich jetzt weis wie die Funktionen handhaben muss gibts noch eine Ungereimtheit.
Es waren ja Beispielcodes mit C++ dabei, die bin ich jetzt gerade am "Übernehmen" da diese Sachen doch tatsächlich funktionieren :o
ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int main(int argc, char const* argv[])
{
    FT260_HANDLE mhandle1 = INVALID_HANDLE_VALUE;
    FT260_STATUS ftStatus = FT260_OK;
    DWORD devNum = 0;
    FT260_CreateDeviceList(&devNum);

    FT260_Open(0, &mhandle1);

    unsigned char writeData[] = { 0xaa0xbb0x000x010x550x66 };

    ftStatus = FT260_I2CMaster_Init(mhandle1, 100);

Hier geht es um die 2 Funktionen FT260_Open und Master_init.

Bei der Open Funktion wird ja ein Pointer auf das Handle übergeben.
Folgendes habe ich jetzt zusammen gebracht:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
unit Testfeld;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, StdCtrls, Buttons, ColorButton3, JDLed, d2xxunit;

  function FT260_CreateDeviceList(var lpdwNumDevs: DWord): Byte; stdcall;
  function FT260_I2CMaster_Init(var handle: DWORD;kbps: integer): Byte; stdcall;
  function FT260_Open(deviceid: integer;var FT_HANDLE: DWORD): Byte; stdcall;
type
  TForm1 = class(TForm)
  XPManifest1: TXPManifest;
  Exit: TButton;
  Button1: TButton;
  Button2: TButton;
    Memo1: TMemo;
  procedure Button2Click(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  procedure ExitClick(Sender: TObject);
  private
  { Private-Deklarationen }
  public
  { Public-Deklarationen }

  end;

var
  Form1: TForm1;
   chandle:DWORD ;
implementation

{$R *.dfm}

function FT260_CreateDeviceList; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4';
function FT260_I2CMaster_Init; external 'LibFT260.dll' name '_FT260_I2CMaster_Init@8';
function FT260_Open; external 'LibFT260.dll' name '_FT260_Open@8';

procedure TForm1.ExitClick(Sender: TObject);
begin
application.Terminate ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
devNum : dword;
i:integer;
begin
devnum:= 10;
for i:=0 to 12 do
begin
FT260_Open(i,chandle);
memo1.Lines.Add(IntToStr(FT260_I2CMaster_Init(chandle,100)));
//ShowMessage(IntToStr(D2xxunit.Create_USB_Device_List));
//ShowMessage(IntToStr(FT260_CreateDeviceList(devnum)));
end;
end;

end.


Wie muss ich das in der Funktion mit dem Pointer auf dem Handle machen? Sind warscheinlich eher elementare Sachen. Der Pointer ist ja auch nur eine Zahl oder? Ist das Datentyp von chandle so machbar?

Grüße Christian
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18692
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.08.17 16:19 
ausblenden Delphi-Quelltext
1:
FT260_Open(i, @chandle);					

Dass im Beispielcode der Rückgabewert nicht ausgewertet wird, ist ein wenig seltsam. Ich habe jetzt aber auch nicht geschaut was der macht.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 17.08.17 17:23 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
FT260_Open(i, @chandle);					

Dass im Beispielcode der Rückgabewert nicht ausgewertet wird, ist ein wenig seltsam. Ich habe jetzt aber auch nicht geschaut was der macht.


Genau da smit dem @ habe ich auch versucht. aber dann erhalte ich den Fehler Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen. :oops:
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 18.08.17 09:51 
Hier hast du meine Übersetzung der LibFT260.h nach Pascal:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
unit uLibFT260;

{$IFDEF CONDITIONALEXPRESSIONS}
  {$IF CompilerVersion > 13}
    {$DEFINE DELPHI6_UP} // > D5
  {$IFEND}
{$ENDIF}

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

interface

type
  PDWORD = ^DWORD;
  {$EXTERNALSYM PDWORD}
  DWORD = LongWord;
  {$EXTERNALSYM DWORD}
  PFT260_HANDLE = ^FT260_HANDLE;
  FT260_HANDLE = THandle;

type
  {$IFDEF DELPHI6_UP} // > D5
  FT260_STATUS = (
    FT260_OK = 0,
    FT260_INVALID_HANDLE,
    FT260_DEVICE_NOT_FOUND,
    FT260_DEVICE_NOT_OPENED,
    FT260_DEVICE_OPEN_FAIL,
    FT260_DEVICE_CLOSE_FAIL,
    FT260_INCORRECT_INTERFACE,
    FT260_INCORRECT_CHIP_MODE,
    FT260_DEVICE_MANAGER_ERROR,
    FT260_IO_ERROR,
    FT260_INVALID_PARAMETER,
    FT260_NULL_BUFFER_POINTER,
    FT260_BUFFER_SIZE_ERROR,
    FT260_UART_SET_FAIL,
    FT260_RX_NO_DATA,
    FT260_GPIO_WRONG_DIRECTION,
    FT260_INVALID_DEVICE,
    FT260_OTHER_ERROR
  );
  {$ELSE}
  FT260_STATUS = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_GPIO2_Pin = (
    FT260_GPIO2_GPIO    = 0,
    FT260_GPIO2_SUSPOUT = 1,
    FT260_GPIO2_PWREN   = 2,
    FT260_GPIO2_TX_LED  = 4
  );
  {$ELSE}
  FT260_GPIO2_Pin = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_GPIOA_Pin = (
    FT260_GPIOA_GPIO      = 0,
    FT260_GPIOA_TX_ACTIVE = 3,
    FT260_GPIOA_TX_LED    = 4
  );
  {$ELSE}
  FT260_GPIOA_Pin = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_GPIOG_Pin = (
    FT260_GPIOG_GPIO    = 0,
    FT260_GPIOG_PWREN   = 2,
    FT260_GPIOG_RX_LED  = 5,
    FT260_GPIOG_BCD_DET = 6
  );
  {$ELSE}
  FT260_GPIOG_Pin = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Clock_Rate = (
    FT260_SYS_CLK_12M = 0,
    FT260_SYS_CLK_24M,
    FT260_SYS_CLK_48M
  );
  {$ELSE}
  FT260_Clock_Rate = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Interrupt_Trigger_Type = (
    FT260_INTR_RISING_EDGE = 0,
    FT260_INTR_LEVEL_HIGH,
    FT260_INTR_FALLING_EDGE,
    FT260_INTR_LEVEL_LOW
  );
  {$ELSE}
  FT260_Interrupt_Trigger_Type = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Interrupt_Level_Time_Delay = (
    FT260_INTR_DELY_1MS = 1,
    FT260_INTR_DELY_5MS,
    FT260_INTR_DELY_30MS
  );
  {$ELSE}
  FT260_Interrupt_Level_Time_Delay = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Suspend_Out_Polarity = (
    FT260_SUSPEND_OUT_LEVEL_HIGH = 0,
    FT260_SUSPEND_OUT_LEVEL_LOW
  );
  {$ELSE}
  FT260_Suspend_Out_Polarity = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_UART_Mode = (
    FT260_UART_OFF = 0,
    FT260_UART_RTS_CTS_MODE,      // hardware flow control RTS, CTS mode
    FT260_UART_DTR_DSR_MODE,      // hardware flow control DTR, DSR mode
    FT260_UART_XON_XOFF_MODE,     // software flow control mode
    FT260_UART_NO_FLOW_CTRL_MODE  // no flow control mode
  );
  {$ELSE}
  FT260_UART_Mode = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Data_Bit = (
    FT260_DATA_BIT_7 = 7,
    FT260_DATA_BIT_8 = 8
  );
  {$ELSE}
  FT260_Data_Bit = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Stop_Bit = (
    FT260_STOP_BITS_1 = 0,
    FT260_STOP_BITS_2 = 2
  );
  {$ELSE}
  FT260_Stop_Bit = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_Parity = (
    FT260_PARITY_NONE = 0,
    FT260_PARITY_ODD,
    FT260_PARITY_EVEN,
    FT260_PARITY_MARK,
    FT260_PARITY_SPACE
  );
  {$ELSE}
  FT260_Parity = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_RI_Wakeup_Type = (
    FT260_RI_WAKEUP_RISING_EDGE = 0,
    FT260_RI_WAKEUP_FALLING_EDGE
  );
  {$ELSE}
  FT260_RI_Wakeup_Type = Byte;
  {$ENDIF}

  PFT260_GPIO_Report = ^FT260_GPIO_Report;
  FT260_GPIO_Report = record
    value: Word;       // GPIO0~5 values
    dir: Word;         // GPIO0~5 directions
    gpioN_value: Word; // GPIOA~H values
    gpioN_dir: Word;   // GPIOA~H directions
  end;

  {$IFDEF DELPHI6_UP} // > D5
  FT260_GPIO_DIR = (
    FT260_GPIO_IN = 0,
    FT260_GPIO_OUT
  );
  {$ELSE}
  FT260_GPIO_DIR = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_GPIO = (
    FT260_GPIO_0 = $0001,
    FT260_GPIO_1 = $0002,
    FT260_GPIO_2 = $0004,
    FT260_GPIO_3 = $0008,
    FT260_GPIO_4 = $0010,
    FT260_GPIO_5 = $0020,
    FT260_GPIO_A = $0040,
    FT260_GPIO_B = $0080,
    FT260_GPIO_C = $0100,
    FT260_GPIO_D = $0200,
    FT260_GPIO_E = $0400,
    FT260_GPIO_F = $0800,
    FT260_GPIO_G = $1000,
    FT260_GPIO_H = $2000
  );
  {$ELSE}
  FT260_GPIO = Word;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_I2C_FLAG = (
    FT260_I2C_NONE  = 0,
    FT260_I2C_START = 2,
    FT260_I2C_REPEATED_START = 3,
    FT260_I2C_STOP  = 4,
    FT260_I2C_START_AND_STOP = 6
  );
  {$ELSE}
  FT260_I2C_FLAG = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_PARAM_1 = (
    FT260_DS_CTL0 = $50,
    FT260_DS_CTL3 = $51,
    FT260_DS_CTL4 = $52,
    FT260_SR_CTL0 = $53,
    FT260_GPIO_PULL_UP    = $61,
    FT260_GPIO_OPEN_DRAIN = $62,
    FT260_GPIO_PULL_DOWN  = $63,
    FT260_GPIO_GPIO_SLEW_RATE = $65
  );
  {$ELSE}
  FT260_PARAM_1 = Byte;
  {$ENDIF}

  {$IFDEF DELPHI6_UP} // > D5
  FT260_PARAM_2 = (
    FT260_GPIO_GROUP_SUSPEND_0 = $10,  // for gpio 0 ~ gpio 5
    FT260_GPIO_GROUP_SUSPEND_A = $11,  // for gpio A ~ gpio H
    FT260_GPIO_DRIVE_STRENGTH  = $64
  );
  {$ELSE}
  FT260_PARAM_2 = Byte;
  {$ENDIF}

  PUartConfig = ^UartConfig;
  UartConfig = record
    flow_ctrl: Byte;
    baud_rate: DWord;
    data_bit, parity, stop_bit, breaking: Byte;
  end;

const
  LIB_FT_260 = 'LibFT260.dll';


{ DLL Import }

// FT260 General Functions

function FT260_CreateDeviceList(lpdwNumDevs: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_CreateDeviceList@4'overload;
function FT260_CreateDeviceList(var lpdwNumDevs: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_CreateDeviceList@4'overload;
function FT260_GetDevicePath(pDevicePath: PWideChar; bufferLength, deviceIndex: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetDevicePath@12'overload;
function FT260_GetDevicePath(var pDevicePath: WideChar; bufferLength, deviceIndex: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetDevicePath@12'overload;
function FT260_Open(iDevice: Integer; pFt260Handle: PFT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_Open@8'overload;
function FT260_Open(iDevice: Integer; var pFt260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_Open@8'overload;
function FT260_OpenByVidPid(vid, pid: Word; deviceIndex: DWord; pFt260Handle: PFT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByVidPid@16'overload;
function FT260_OpenByVidPid(vid, pid: Word; deviceIndex: DWord; var pFt260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByVidPid@16'overload;
function FT260_OpenByDevicePath(pDevicePath: PWideChar; pFt260Handle: PFT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByDevicePath@8'overload;
function FT260_OpenByDevicePath(pDevicePath: PWideChar; var pFt260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByDevicePath@8'overload;
function FT260_OpenByDevicePath(var pDevicePath: WideChar; pFt260Handle: PFT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByDevicePath@8'overload;
function FT260_OpenByDevicePath(var pDevicePath: WideChar; var pFt260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_OpenByDevicePath@8'overload;
function FT260_Close(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_Close@4';
function FT260_SetClock(ft260Handle: FT260_HANDLE; clk: FT260_Clock_Rate): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetClock@8';
function FT260_SetWakeupInterrupt(ft260Handle: FT260_HANDLE; enable: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetWakeupInterrupt@8';
function FT260_SetInterruptTriggerType(ft260Handle: FT260_HANDLE; typ: FT260_Interrupt_Trigger_Type; delay: FT260_Interrupt_Level_Time_Delay): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetInterruptTriggerType@12';
function FT260_SelectGpio2Function(ft260Handle: FT260_HANDLE; gpio2Function: FT260_GPIO2_Pin): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SelectGpio2Function@8';
function FT260_SelectGpioAFunction(ft260Handle: FT260_HANDLE; gpioAFunction: FT260_GPIOA_Pin): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SelectGpioAFunction@8';
function FT260_SelectGpioGFunction(ft260Handle: FT260_HANDLE; gpioGFunction: FT260_GPIOG_Pin): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SelectGpioGFunction@8';
function FT260_SetSuspendOutPolarity(ft260Handle: FT260_HANDLE; polarity: FT260_Suspend_Out_Polarity): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetSuspendOutPolarity@8';
function FT260_SetParam_U8(ft260Handle: FT260_HANDLE; param: FT260_PARAM_1; value: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetParam_U8@12';
function FT260_SetParam_U16(ft260Handle: FT260_HANDLE; param: FT260_PARAM_2; value: Word): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetParam_U16@12';
function FT260_GetChipVersion(ft260Handle: FT260_HANDLE; lpdwChipVersion: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetChipVersion@8'overload;
function FT260_GetChipVersion(ft260Handle: FT260_HANDLE; var lpdwChipVersion: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetChipVersion@8'overload;
function FT260_GetLibVersion(lpdwLibVersion: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetLibVersion@4'overload;
function FT260_GetLibVersion(var lpdwLibVersion: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetLibVersion@4'overload;
function FT260_EnableI2CPin(ft260Handle: FT260_HANDLE; enable: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_EnableI2CPin@8';
function FT260_SetUartToGPIOPin(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_SetUartToGPIOPin@4';
function FT260_EnableDcdRiPin(ft260Handle: FT260_HANDLE; enable: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_EnableDcdRiPin@8';

// FT260 I2C Functions

function FT260_I2CMaster_Init(ft260Handle: FT260_HANDLE; kbps: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Init@8';
function FT260_I2CMaster_Read(ft260Handle: FT260_HANDLE; deviceAddress: Byte; flag: FT260_I2C_FLAG; lpBuffer: Pointer; dwBytesToRead: DWord; lpdwBytesReturned: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Read@24'overload;
function FT260_I2CMaster_Read(ft260Handle: FT260_HANDLE; deviceAddress: Byte; flag: FT260_I2C_FLAG; lpBuffer: Pointer; dwBytesToRead: DWord; var lpdwBytesReturned: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Read@24'overload;
function FT260_I2CMaster_Write(ft260Handle: FT260_HANDLE; deviceAddress: Byte; flag: FT260_I2C_FLAG; lpBuffer: Pointer; dwBytesToWrite: DWord; lpdwBytesWritten: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Write@24'overload;
function FT260_I2CMaster_Write(ft260Handle: FT260_HANDLE; deviceAddress: Byte; flag: FT260_I2C_FLAG; lpBuffer: Pointer; dwBytesToWrite: DWord; var lpdwBytesWritten: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Write@24'overload;
function FT260_I2CMaster_GetStatus(ft260Handle: FT260_HANDLE; status: PByte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_GetStatus@8'overload;
function FT260_I2CMaster_GetStatus(ft260Handle: FT260_HANDLE; var status: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_GetStatus@8'overload;
function FT260_I2CMaster_Reset(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_I2CMaster_Reset@4';

// FT260 UART Functions

function FT260_UART_Init(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Init@4';
function FT260_UART_SetBaudRate(ft260Handle: FT260_HANDLE; baudRate: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetBaudRate@8';
function FT260_UART_SetFlowControl(ft260Handle: FT260_HANDLE; flowControl: FT260_UART_Mode): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetFlowControl@8';
function FT260_UART_SetDataCharacteristics(ft260Handle: FT260_HANDLE; dataBits: FT260_Data_Bit; stopBits: FT260_Stop_Bit; parity: FT260_Parity): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetDataCharacteristics@16';
function FT260_UART_SetBreakOn(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetBreakOn@4';
function FT260_UART_SetBreakOff(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetBreakOff@4';
function FT260_UART_SetXonXoffChar(ft260Handle: FT260_HANDLE; Xon: Byte; Xoff: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetXonXoffChar@12';
function FT260_UART_GetConfig(ft260Handle: FT260_HANDLE; pUartConfig: PUartConfig): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetConfig@8'overload;
function FT260_UART_GetConfig(ft260Handle: FT260_HANDLE; var pUartConfig: UartConfig): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetConfig@8'overload;
function FT260_UART_GetQueueStatus(ft260Handle: FT260_HANDLE; lpdwAmountInRxQueue: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetQueueStatus@8'overload;
function FT260_UART_GetQueueStatus(ft260Handle: FT260_HANDLE; var lpdwAmountInRxQueue: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetQueueStatus@8'overload;
function FT260_UART_Read(ft260Handle: FT260_HANDLE; lpBuffer: Pointer; dwBufferLength, dwBytesToRead: DWord; lpdwBytesReturned: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Read@20'overload;
function FT260_UART_Read(ft260Handle: FT260_HANDLE; lpBuffer: Pointer; dwBufferLength, dwBytesToRead: DWord; var lpdwBytesReturned: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Read@20'overload;
function FT260_UART_Write(ft260Handle: FT260_HANDLE; lpBuffer: Pointer; dwBufferLength, dwBytesToWrite: DWord; lpdwBytesWritten: PDWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Write@20'overload;
function FT260_UART_Write(ft260Handle: FT260_HANDLE; lpBuffer: Pointer; dwBufferLength, dwBytesToWrite: DWord; var lpdwBytesWritten: DWord): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Write@20'overload;
function FT260_UART_Reset(ft260Handle: FT260_HANDLE): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_Reset@4';
function FT260_UART_GetDcdRiStatus(ft260Handle: FT260_HANDLE; value: PByte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetDcdRiStatus@8'overload;
function FT260_UART_GetDcdRiStatus(ft260Handle: FT260_HANDLE; var value: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_GetDcdRiStatus@8'overload;
function FT260_UART_EnableRiWakeup(ft260Handle: FT260_HANDLE; enable: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_EnableRiWakeup@8';
function FT260_UART_SetRiWakeupConfig(ft260Handle: FT260_HANDLE; typ: FT260_RI_Wakeup_Type): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_UART_SetRiWakeupConfig@8';

// Interrupt is transmitted by UART interface

function FT260_GetInterruptFlag(ft260Handle: FT260_HANDLE; pbFlag: PBoolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetInterruptFlag@8'overload;
function FT260_GetInterruptFlag(ft260Handle: FT260_HANDLE; var pbFlag: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GetInterruptFlag@8'overload;
function FT260_CleanInterruptFlag(ft260Handle: FT260_HANDLE; pbFlag: PBoolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_CleanInterruptFlag@8'overload;
function FT260_CleanInterruptFlag(ft260Handle: FT260_HANDLE; var pbFlag: Boolean): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_CleanInterruptFlag@8'overload;

// FT260 GPIO Functions

function FT260_GPIO_Set(ft260Handle: FT260_HANDLE; report: FT260_GPIO_Report): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Set@12';
function FT260_GPIO_Get(ft260Handle: FT260_HANDLE; report: PFT260_GPIO_Report): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Get@8'overload;
function FT260_GPIO_Get(ft260Handle: FT260_HANDLE; var report: FT260_GPIO_Report): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Get@8'overload;
function FT260_GPIO_SetDir(ft260Handle: FT260_HANDLE; pinNum: Word; dir: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_SetDir@12';
function FT260_GPIO_Read(ft260Handle: FT260_HANDLE; pinNum: Word; pValue: PByte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Read@12'overload;
function FT260_GPIO_Read(ft260Handle: FT260_HANDLE; pinNum: Word; var pValue: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Read@12'overload;
function FT260_GPIO_Write(ft260Handle: FT260_HANDLE; pinNum: Word; value: Byte): FT260_STATUS; stdcallexternal LIB_FT_260 name '_FT260_GPIO_Write@12';


{ Macro }

function I2CM_CONTROLLER_BUSY(status: Byte): Boolean;
function I2CM_DATA_NACK(status: Byte): Boolean;
function I2CM_ADDRESS_NACK(status: Byte): Boolean;
function I2CM_ARB_LOST(status: Byte): Boolean;
function I2CM_IDLE(status: Byte): Boolean;
function I2CM_BUS_BUSY(status: Byte): Boolean;

implementation

{ Macro }

(* I2C Master Controller Status
 *   bit 0 = controller busy: all other status bits invalid
 *   bit 1 = error condition
 *   bit 2 = slave address was not acknowledged during last operation
 *   bit 3 = data not acknowledged during last operation
 *   bit 4 = arbitration lost during last operation
 *   bit 5 = controller idle
 *   bit 6 = bus busy
 *)


// #define I2CM_CONTROLLER_BUSY(status) (((status) & 0x01) != 0)
function I2CM_CONTROLLER_BUSY(status: Byte): Boolean;
begin
  result := (Status and 1) <> 0;
end;

// #define I2CM_DATA_NACK(status)       (((status) & 0x0A) != 0)
function I2CM_DATA_NACK(status: Byte): Boolean;
begin
  result := (Status and $A) <> 0;
end;

// #define I2CM_ADDRESS_NACK(status)    (((status) & 0x06) != 0)
function I2CM_ADDRESS_NACK(status: Byte): Boolean;
begin
  result := (Status and 6) <> 0;
end;

// #define I2CM_ARB_LOST(status)        (((status) & 0x12) != 0)
function I2CM_ARB_LOST(status: Byte): Boolean;
begin
  result := (Status and $12) <> 0;
end;

// #define I2CM_IDLE(status)            (((status) & 0x20) != 0)
function I2CM_IDLE(status: Byte): Boolean;
begin
  result := (Status and $20) <> 0;
end;

// #define I2CM_BUS_BUSY(status)        (((status) & 0x40) != 0)
function I2CM_BUS_BUSY(status: Byte): Boolean;
begin
  result := (Status and $40) <> 0;
end;

end.

Damit solltest du keine Probleme mehr haben, die C++ Beispiele nachzustellen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
uses uLibFT260;

// Aufruf
const
  writeData: array[0..5of Byte = ( $AA$BB01$55$66 );  // muss kein "const" sein - dient der Vereinfachung
var
  mhandle1: FT260_HANDLE;
  ftStatus: FT260_STATUS;
  devNum: DWord;
begin
  FT260_CreateDeviceList(devNum);
  FT260_Open(0, mhandle1);
  ftStatus := FT260_I2CMaster_Init(mhandle1, 100);
  ShowMessage(IntToStr(Byte(ftStatus)));  // gibt bei mir "3" zurück -> FT260_DEVICE_NOT_OPENED,
end;

PS: Die Funktionen haben den Rückgabetyp FT260_STATUS ( = Enumeration). Wenn du nach string konvertieren willst, musst du vorher mit Byte casten: IntToStr(Byte(...));
Wird Delphi5 oder älter verwendet, so ist der Rückgabetyp automatisch ein Byte.

Edit: Die letzten 4 Werte im FT260_GPIO wurden von mir falsch ausgerechnet. In der korrigierten Fassung lauten sie: $400$800$1000$2000 !

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 24.08.17 09:25 
Hallo Frühlingsrolle,
vielen vielen dank für die Arbeit mit der DLL.
Jetzt läuft es :D :idea:
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2245
Erhaltene Danke: 418

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 24.08.17 09:30 
Gern geschehen. Hast du auch die Änderungen vorgenommen die ich nacheditiert habe? Die sind nicht unwichtig.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)