CheckOutByCallback(IOWIIC, @FindIOWComplex)

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
HappyAura
Posts: 68
Joined: Sun Feb 27, 2005 2:13 pm

CheckOutByCallback(IOWIIC, @FindIOWComplex)

Post by HappyAura »

Hallo,
ich hab eine Frage zum Umgang mit dem IOW24 und Delphi

Leider scheitert bei mir der Versuch, die procedure HidCtlDeviceChange(Sender: TObject); aus der IOW IIC Demo in mein Programm zu übernehmen. Plug und Unplug werden erkannt, aber leider ist es mir danach nicht möglich, auf meine I2C bausteine zuzugreifen.

So sieht bei mir das Auslesen des I2C Bausteines aus:

Code: Select all

     FillChar(Report, SizeOf(Report), 0);
      Report.ReportID := $02; // ReportID IIC write request
      Report.Bytes[0] := $82; // 2 bytes with IIC Start and Stop
      Report.Bytes[1] := $90; //  addresse byte = ADR 0, write
      Report.Bytes[2] := $00 or (i-1);
      IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
      // swallow ACK report
      IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));

      if (Report.Bytes[0]<>2) then
        showmessage('I2C Baustein nicht erreicht bytes[0]: 0x' + inttohex(Report.Bytes[0],2));
fehlermeldung:
"I2C Baustein nicht erreicht bytes[0]: 0x82"


Folgende Procedure wird OnDevicechange ausgeführt (nur geringfügig zum Original aus dem SDK geändert):

Code: Select all

procedure TForm1.HidCtlDeviceChange(Sender: TObject);
var
  I: Integer;
  Report : IOWKIT_SPECIAL_REPORT;
//  Report: TIICReport;
  BytesWritten: DWORD;

  // all IOWarriors have IIC
  function FindIOWComplex(HidDev: TJvHidDevice): Boolean; stdcall;
  begin
    // IO-Warrior special mode interface match criteria
    Result := (HidDev.Attributes.VendorID = cCodeMercsVID) and
      (HidDev.Attributes.ProductID = cIOW24PID)
      and
      (HidDev.Caps.OutputReportByteLength = 8);
  end;

begin
showmessage('HidCtlDeviceChange');
if assigned (iowiic) then
showmessage('assigned iss er');
  // free IOW object if it has been unplugged
  if Assigned(IOWIIC) and not IOWIIC.IsPluggedIn then
  begin
    showmessage('assígned aber nicht plugged in');
    // disable reader timer
    Timer1.Enabled := False;
    showmessage('Timer gestopt,  IOW wurde gerade abgezogen angeschlossen');
    FreeAndNil(IOWIIC);
    exit;
  end;
  // search for an IOW if not already found
  if not Assigned(IOWIIC) then
    IOWIIC := IowKitOpenDevice;
    if Assigned(IOWIIC) then
    begin
    showmessage('assigned is er, checkout by callback erfolgreich');
      // IOW found, enable IIC
      FillChar(Report, SizeOf(Report), 0);
      Report.ReportID := $01;
      Report.Bytes[0] := $01; // enable IIC
      IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
      // enable reader timer
      showmessage('Timer gestartet, IOW wurde angeschlossen');
      Timer1.Enabled := True;
    end
    else
//      for I := Low(Values) to High(Values) do
// no IOW, show bogus value
//        Values[I].Caption := '?,?? V';
end;

eine Initialisierung mit dem folgenden quelltext, dafür aber ohne ausgeführte procedure OnDeviceChange führt zu keiner fehlermeldung, ich erhalte ordnungsgemäße werte von meinem I2C Baustein.

Code: Select all

  IOWIIC := IowKitOpenDevice;
  if Assigned(IOWIIC) then
  begin
    // IOW found, enable IIC
    FillChar(Report, SizeOf(Report), 0);
    Report.ReportID := $01;
    Report.Bytes[0] := $01; // enable IIC
    IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
    Timer1.Enabled := true;
  end
  else begin
         showmessage('IOWarrior nicht angeschlossen, es finden keine Messungen statt´');
        end;

kann mir da jemand weiterhelfen? hat es evtl mit dem CheckOutByCallback(IOWIIC, @FindIOWComplex) zu tun?
Vielen Dank,
Gruß Martin.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Welcher IIC-Chip haengt denn dran? Natuerlich muss man die Werte im Report an den IIC-Chip anpassen.
HappyAura
Posts: 68
Joined: Sun Feb 27, 2005 2:13 pm

Post by HappyAura »

Im moment hängt der PCF8591 dran.Die Werte im report beim Auslesen hab ich angepasst, das auslesen funktioniert auch, wenn ich statt der "onDeviceChange" Prozedur (2ter codeausschnitt) eine initialisierung (onFormCreate) mit dem dritten Codeausschnitt durchführe. Aber so kann ich natürlich kein Plug/unplug feststellen.

ich seh gerade, dass ich hier ncoh eine ältere version des HIDCtrlDeviceChange gepostet hatte, deswegen hier noch einmal die aktuelle version:

Code: Select all

procedure TForm1.HidCtlDeviceChange(Sender: TObject);
var
  I: Integer;
  BytesWritten: DWORD;
  Report : IOWKIT_SPECIAL_REPORT;

  // all IOWarriors have IIC
  function FindIOWComplex(HidDev: TJvHidDevice): Boolean; stdcall;
  begin
    // IO-Warrior special mode interface match criteria
    Result := (HidDev.Attributes.VendorID = cCodeMercsVID) and
      (HidDev.Attributes.ProductID = cIOW24PID)
        and
      (HidDev.Caps.OutputReportByteLength = 8);
  end;

begin
  // free IOW object if it has been unplugged
  if Assigned(IOWIIC) and not IOWIIC.IsPluggedIn then
  begin
    // disable reader timer
    Timer1.Enabled := False;
    showmessage ('unplug IOW');
    FreeAndNil(IOWIIC);
  end;
  // search for an IOW if not already found
  if not Assigned(IOWIIC) then
    if HidCtl.CheckOutByCallback(IOWIIC, @FindIOWComplex) then
    begin
      // IOW found, enable IIC
      FillChar(Report, SizeOf(Report), 0);
      Report.ReportID := $01;
      Report.Bytes[0] := $01; // enable IIC
      IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
      // enable reader timer
      Timer1.Enabled := True;
      showmessage ('plug IOW');

    end;
//else zweig abgeschnitten
end;

sonst noch Ideen?
der Fehlerreport 0x82 bedeutet doch, dass beim zweiten Byte kein Acknowledge gesendet wurde, oder?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Was soll denn der Unsinn HID-Komponente und IOWKIT API zu mischen? Das kann doch nicht funktionieren.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

HappyAura wrote:der Fehlerreport 0x82 bedeutet doch, dass beim zweiten Byte kein Acknowledge gesendet wurde, oder?
Ja, also mochte der Chip irgendwas nicht an den gesendeten Daten.

Hm, Report.Bytes[0] := $82 warum nur Start und kein Stop?
HappyAura
Posts: 68
Joined: Sun Feb 27, 2005 2:13 pm

Post by HappyAura »

robert wrote:Was soll denn der Unsinn HID-Komponente und IOWKIT API zu mischen? Das kann doch nicht funktionieren.
da muß ich mir wohl noch mal genau anschauen, was woher kam. Ist es denn möglich, mit der IOWKIT Api ein plug/unplug zu registrieren und darauf zu reagieren?

Bis jetzt hatte ich noch icht gesehen, dass die Beispile aus dem IOWKit teilweise auf der HDI Komponente aufbauen und teilweise auf der IOWKit Api.
Guido wrote:Hm, Report.Bytes[0] := $82 warum nur Start und kein Stop?
es wird anschließend ein restart(also noch ein start) gesendet, so daß mir daten vom PCF 8591 gesendet werden. Der Kommentar daneben ist allerdings ein wenig vewirrend, ist wohl beim copy Paste hängen geblieben.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Wozu schreibe ich eigentlich Dokumentation?
HappyAura
Posts: 68
Joined: Sun Feb 27, 2005 2:13 pm

Post by HappyAura »

dann bleibt mir nur, komplett auf die HID Komponente umzuschwenken, wenn mich das plug/unplug interessiert? zumindest konnte ich keine möglichkeit über die api finden.
oder gibt es einen anderen weg für mich?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Die HID-Komponente ist der richtige Weg. Beim Schreiben des IOWKIT 2.0 API stoerst du gerade.
Post Reply