Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Android UART EventListener (https://www.delphipraxis.net/196231-android-uart-eventlistener.html)

SvB 3. Mai 2018 08:14

Android UART EventListener
 
Hi @All,

ich habe eine Android UART (Seriell) Anbindung und benötige jetzt den Zugriff auf die Events. Bei den bereitgestellten Java-Classen gibt es einen EventListener, ich weiß jedoch nicht, wie ich das zu Delphi umsetzen soll.
Hier der Code der Java-Klasse
Code:
  JUARTEventClass = interface(JEventObjectClass)
    ['{8CCFB748-D20D-495F-8BFB-88939E567966}']
    {class} function _GetCLEAR_TO_SEND: Integer; cdecl;
    {class} function _GetDATA_AVAILABLE: Integer; cdecl;
    {class} function _GetDATA_CARRIER_DETECT: Integer; cdecl;
    {class} function _GetDATA_SET_READY: Integer; cdecl;
    {class} function _GetINPUT_BUFFER_FULL: Integer; cdecl;
    {class} function _GetN_BYTES_AVAILABLE: Integer; cdecl;
    {class} function _GetOUTPUT_BUFFER_EMPTY: Integer; cdecl;
    {class} function _GetRING_INDICATOR: Integer; cdecl;
    {class} function init(P1: JUART; P2: Integer): JUARTEvent; cdecl;
    {class} property CLEAR_TO_SEND: Integer read _GetCLEAR_TO_SEND;
    {class} property DATA_AVAILABLE: Integer read _GetDATA_AVAILABLE;
    {class} property DATA_CARRIER_DETECT: Integer read _GetDATA_CARRIER_DETECT;
    {class} property DATA_SET_READY: Integer read _GetDATA_SET_READY;
    {class} property INPUT_BUFFER_FULL: Integer read _GetINPUT_BUFFER_FULL;
    {class} property N_BYTES_AVAILABLE: Integer read _GetN_BYTES_AVAILABLE;
    {class} property OUTPUT_BUFFER_EMPTY: Integer read _GetOUTPUT_BUFFER_EMPTY;
    {class} property RING_INDICATOR: Integer read _GetRING_INDICATOR;
  end;

  [JavaSignature('guf/android/hardware/uart/UARTEvent')]
  JUARTEvent = interface(JEventObject)
    ['{CFFDE537-85A0-41E9-BEC4-FEB75219E53B}']
    function getEventType: Integer; cdecl;
    function toString: JString; cdecl;
  end;
  TJUARTEvent = class(TJavaGenericImport<JUARTEventClass, JUARTEvent>) end;

  JEventListenerClass = interface(IJavaClass)
    ['{48BD1D07-BCE3-4F68-982B-617B523C7116}']
  end;

  [JavaSignature('java/util/EventListener')]
  JEventListener = interface(IJavaInstance)
    ['{D9ADB67A-5217-4762-9961-710BF18CAD39}']
  end;
  TJEventListener = class(TJavaGenericImport<JEventListenerClass, JEventListener>) end;

  JUARTEventListenerClass = interface(JEventListenerClass)
    ['{EC9DB672-36FF-40F5-8E3B-5D4C00808A91}']
    {class} procedure onUARTEvent(P1: JUARTEvent); cdecl;//Deprecated
  end;

  [JavaSignature('guf/android/hardware/uart/UARTEventListener')]
  JUARTEventListener = interface(JEventListener)
    ['{E5B94F01-255E-4C05-88A7-F0B0BE1C89CA}']
  end;
  TJUARTEventListener = class(TJavaGenericImport<JUARTEventListenerClass, JUARTEventListener>) end;
und hier der Code aus dem original Beispiel wie das benutzt wird:
Code:
uart = new UART("ttymxc2", UART.BAUD_115200, UART.DATABITS_8, UART.PARITY_NONE, UART.STOPBITS_1);
uart.openPort();
uart.writeString("port #1 opened ...\n\r");
         
uart.addEventListener(this, new UARTEvent(uart, UARTEvent.DATA_AVAILABLE));
Thread.sleep(10*1000);
         
uart.removeEventListener(this);
uart.closePort();
Code:
public void onUARTEvent(UARTEvent uartEvent) {
  switch(uartEvent.getEventType()) {
    case UARTEvent.DATA_AVAILABLE:
      Log.d(TAG, "onUARTEvent: UARTEvent.DATA_AVAILABLE");         
  }
}
Ich benötige das onUARTEvent als Delphi-Event.
Kann mir jemand helfen das umzusetzen oder mir eine Info geben, wo ich dazu etwas finde wie es gemacht wird. Steh total auf dem Schlauch.
Danke

Rollo62 3. Mai 2018 09:53

AW: Android UART EventListener
 
Könnte es sein das hier etwas dabei ist ?

Rollo

TiGü 3. Mai 2018 10:05

AW: Android UART EventListener
 
Hilft dir das weiter?

Delphi-Quellcode:
  JUARTEventListenerClass = interface(JEventListenerClass)
    ['{EC9DB672-36FF-40F5-8E3B-5D4C00808A91}']
    { class } procedure onUARTEvent(P1: JUARTEvent); cdecl; // Deprecated
  end;

  TDeinEreignisHorcher = class(TInterfacedObject, JUARTEventListenerClass)

  public
    procedure onUARTEvent(P1: JUARTEvent); cdecl;

  end;

  { TDeinEreignisHorcher }

procedure TDeinEreignisHorcher.onUARTEvent(P1: JUARTEvent);
var
  EventType: string;
  Event: string;
begin
  EventType := IntToStr(P1.getEventType);

  Event := JStringToString(P1.toString);

  ShowMessage(EventType + ' : ' + Event)
end;

SvB 3. Mai 2018 11:43

AW: Android UART EventListener
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Rollo: die WinSoft Komponenten habe ich, auch im Quellcode. Habe versucht mich daran zu orientieren, klappt aber nicht.

Aktuell habe ich folgende:
Delphi-Quellcode:
  TEventListener = class(TJavaLocal, JUARTEventListener)
  private
    [Weak] FComPort: TCustomComPort;
    FGUFUARTEVENT: JUARTEvent;
  public
    constructor Create(ComPort: TCustomComPort);
    procedure onUARTEvent(FEvents: JUARTEvent); cdecl;
  end;

constructor TEventListener.Create(ComPort: TCustomComPort);
begin
  inherited Create;
  FComPort := ComPort;
end;

procedure TEventListener.onUARTEvent(FEvents: JUARTEvent);
begin
  //ShowMessage('Event');
  if FComPort <> nil then
    //if FEvents.getEventType = TJUARTEvent.JavaClass.DATA_AVAILABLE then
      FComPort.CallRxChar;
end;
Ich weiß jedoch nicht, wie ich folgendes umsetzen muss:
Code:
uart = new UART("ttymxc2", UART.BAUD_115200, UART.DATABITS_8, UART.PARITY_NONE, UART.STOPBITS_1);  // <-- hab ich umgesetzt, funktioniert
uart.openPort();  // <-- hab ich umgesetzt, funktioniert
uart.writeString("port #1 opened ...\n\r");  // <-- hab ich umgesetzt, funktioniert
         
uart.addEventListener(this, new UARTEvent(uart, UARTEvent.DATA_AVAILABLE));  // <-- hier steh ich auf dem Schlauch - was ist "this"
Thread.sleep(10*1000);
         
uart.removeEventListener(this);
uart.closePort();
hab im Anhang mal die komplette Java Testdatei angehängt.

TiGü 3. Mai 2018 12:38

AW: Android UART EventListener
 
Zitat:

// <-- hier steh ich auf dem Schlauch - was ist "this"
In Delphi nennen wir das Self.

An der Stelle musst du die Objekt-Instanz eingeben, die das Interface JUARTEventListener implementiert.
In dem Codebeispiel ist die Erzeugung des UART-Objekts innerhalb des Kontextes des EventListeners.

TiGü 3. Mai 2018 12:40

AW: Android UART EventListener
 
Wenn du den Listener "extern" hast, muss du folglich sowas schreiben:

Delphi-Quellcode:
EventListener := TEventListener.Create;
uart.addEventListener(EventListener, ...);

TurboMagic 13. Mai 2018 13:51

AW: Android UART EventListener
 
Jetzt wäre natürlich interessant zu wissen, ob SvB das damit lösen konnte...

SvB 13. Mai 2018 14:54

AW: Android UART EventListener
 
Leider nein, hab dann erst mal unterbrochen weil ich mich nicht so lange damit aufhalten wollte. Musste erst noch was anderes machen. Ich gehe aber an die Sache noch mal dran.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz