USB XMEGA <> Android

pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

USB XMEGA <> Android

 · 
Posted: 02.08.2019 - 09:48  ·  #1
Hallo Leute,

ich bin gerade dabei ein kleines Tool für Android zu erstellen, damit sich unsere Kunden per einstecken in unsere Steuerung einloggen können um Änderungen/Einstellungen durchzuführen.

Hat Jemand von euch schon mal USB auf Android über Delphi programmiert?

Im Moment kann ich bereits auf Tastendruck die angeschlossenen Geräte anschauen, auswählen, die USB-Geräte Infos auslesen und über Endpoints lesen und schreiben.

Leider ist die USB Verwaltung von Android noch etwas verwirrend, meine Steuerung hängt nach dem einstecken an "/dev/bus/usb/001/002".

Jetzt habe ich hier noch 2 Probleme:
1. ControlRequest lesen und schreiben funktioniert leider noch nicht :-(

2. Ich würde gerne die App im Hintergrund laufen lassen, sobald ein USB-Gerät eingesteckt wird, soll die App prüfen ob es eine Steuerung von mir ist und dann dem Login-CMD inkl. Telefonnummer und Nutzername senden (für das Logbuch).

Ziel ist es dann, wenn die App fertig ist:
1. Login und Login halten solange das Smartphone eingesteckt ist
2. Config-Parameter hoch- und runterladen, sowie diese per Mail zu senden / empfangen
3. Firmwareupdates auf unserer Homepage herunterladen und auf die SD-Card der Steuerung zu schreiben.

Durch das Delphi kann man zwar extrem schnell in Delphi Apps schreiben, aber die Struktur der Androidgeräte ist etwas Gewöhnungsbedürftig.

Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: USB XMEGA <> Android

 · 
Posted: 09.08.2019 - 15:59  ·  #2
Für alle die mit Delphi und als Zielsystem Android nutzen wollen und mit dem E-Lab-USB-Treibern arbeiten wollen, kann ich hier dieses einfache Paket von WinSoft empfehlen.

Es ist alles nötige in der API vorhanden, um schnell mit dem XMEGA einen Datenaustausch über USB zu machen:

WINSOFT USB Library for Android

Code
API

TUsbManager = class
  constructor Create;

  property Manager: JUsbManager read;
  property Devices: TArray<TUsbDevice> read;
  property OnDeviceAttached: TUsbDeviceAttachedEvent read write;
  property OnDeviceDetached: TUsbDeviceDetachedEvent read write;
end;

TUsbDevice = class
  function Open: TUsbConnection;
  procedure RequestPermission;

  property &Class: Integer read;
  property ClassName: string read;
  property ConfigurationCount: Integer read;
  property Configuration[Index: Integer]: TUsbConfiguration read;
  property Device: JUsbDevice read;
  property HasPermission: Boolean read;
  property Id: Integer read;
  property InterfaceCount: Integer read;
  property &Interface[Index: Integer]: TUsbInterface read;
  property Manager: TUsbManager read;
  property ManufacturerName: string read;
  property Name: string read;
  property ProductId: Integer read;
  property ProductName: string read;
  property Protocol: Integer read;
  property SerialNumber: string read;
  property Subclass: Integer read;
  property VendorId: Integer read;
  property Version: string read;
end;

TUsbConfiguration = class
  property Id: Integer read;
  property InterfaceCount: Integer read;
  property MaxPower: Integer read;
  property Name: string read;
  property IsRemoteWakeup: Boolean read;
  property IsSelfPowered: Boolean read;
end;

TUsbInterface = class
  property AlternateSetting: Integer read;
  property &Class: Integer read;
  property ClassName: string read;
  property Device: TUsbDevice read;
  property EndpointCount: Integer read;
  property Endpoint[Index: Integer]: TUsbEndpoint read;
  property Id: Integer read;
  property IsHid: Boolean read;
  property &Interface: JUsbInterface read;
  property Name: string read;
  property Protocol: Integer read;
  property Subclass: Integer read;
end;

TUsbEndpoint = class
  property Address: Integer read;
  property Attributes: Integer read;
  property Direction: TEndpointDirection read;
  property Endpoint: JUsbEndpoint read;
  property Interval: Integer read;
  property MaxPacketSize: Integer read;
  property Number: Integer read;
  property &Type: TEndpointType read;
end;

TUsbConnection = class
  function BulkTransfer(Endpoint: TUsbEndpoint; Data: Pointer; Length, Timeout: Integer): Integer;
  function BulkTransfer(Endpoint: TUsbEndpoint; Data: TBytes; Timeout: Integer): Integer;
  function ClaimInterface(&Interface: TUsbInterface; Force: Boolean): Boolean;
  procedure Close;
  function ControlTransfer(RequestType, Request, Value, Index: Integer; Data: TBytes; Timeout: Integer): Integer;
  function ControlTransfer(RequestType, Request, Value, Index: Integer; Data: Pointer; Length: Integer; Timeout: Integer): Integer;
  function GetConfigurationDescriptorRequest(Index, LanguageID: Word; Timeout: Integer): TBytes;
  function GetConfigurationRequest(Timeout: Integer): Byte;
  function GetDescriptorRequest(&Type, Index: Byte; LanguageID: Word; Timeout: Integer): TBytes;
  function GetDeviceDescriptor(LanguageID: Word; Timeout: Integer): TDeviceDescriptor;
  function GetDeviceDescriptorRequest(LanguageID: Word; Timeout: Integer): TBytes;
  function GetLanguageIDs(Timeout: Integer): TLanguageIDs;
  function GetString(Index, LanguageID: Word; Timeout: Integer): string;
  function GetStringDescriptorRequest(Index, LanguageID: Word; Timeout: Integer): TBytes;
  function ReleaseInterface(&Interface: TUsbInterface): Boolean;
  function RequestCancel: Boolean;
  procedure RequestClose;
  procedure RequestCreate(Endpoint: TUsbEndpoint);
  procedure RequestQueueIn(Length: Integer);
  procedure RequestQueueOut(Data: TArray<Byte>);
  function RequestWait(Timeout: Int64 = 0): TArray<Byte>;
  procedure SetConfigurationRequest(Value: Byte; Timeout: Integer);

  property Connection: JUsbDeviceConnection read;
  property FileDescriptor: Integer read;
  property RawDescriptors: TBytes read;
  property Request: JUsbRequest read;
  property Serial: string read;
end;


Thorsten
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: USB XMEGA <> Android

 · 
Posted: 11.08.2019 - 12:38  ·  #3
Hallo Thorsten,

damit ich das richtig verstehe: Es gibt einen Delphi-Compiler für Android? Also um Programme für Android zu schreiben?

Gruss
Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: USB XMEGA <> Android

 · 
Posted: 11.08.2019 - 13:06  ·  #4
Quote by Harry

Hallo Thorsten,

damit ich das richtig verstehe: Es gibt einen Delphi-Compiler für Android? Also um Programme für Android zu schreiben?

Gruss
Harry


Hallo Harry,

ja, das geht bereits ab der XE3. Du stellst einfach das Zielsystem Android ein und für welche Android-Version Du es übersetzen willst. Entweder nutzt Du den Android-Emulator oder Du machst so wie ich es mache. Ich habe ein älteres Smartphone, das ich auf Entwicklermodus und USB-Debugging stelle.
Delphi überträgt dann nach den Übersetzen die APP auf das Smartphone und startet es. DU kannst es auch auf Knopfdruck im Google-Play veröffentlichen. Genauso geht das mit dem IOS.

Es gibt halt einige Beschränkungen bei der Komponentenauswahl.

Ich glaube das kannst Du auch bei der kostenlosen Delphi Community Edition Version 10.3.2 machen.

Thorsten
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   80   94 · Page-Gen-Time: 0.025325s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI