Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Komponente Android Daten USB senden/empfangen (https://www.delphipraxis.net/187843-komponente-android-daten-usb-senden-empfangen.html)

wschrabi 23. Mär 2016 08:36

AW: Komponente Android Daten USB senden/empfangen
 
Zitat:

Zitat von DonAlfredo (Beitrag 1333606)
Yep. It will need (a lot) more work to implement reports.
And if that is the case, you will have to have a little patience.
Sorry for that. I will report back.

thanks don, I am not soo sophisticated than you are, and now it is clear that I need not to break my minds.
But generally, it could be implementated with Android API to make REPORTs, right?
If so, I need someone how makes it. :oops:

Moreover, I have done the firmware for my device. Its like a mouse. Maybe it is easier to change the
mouse firmware (which is not interruped) into a HID with interupes.
Do you know what I have generally to change ? The mouse firmware I have done step by step according a how-to manual. It transfers only 12 BYTES when I hit one DIP switch.

In My WIN Prg I poll by getting reports the device and get the 12 Bytes which are interpreted than.

If it would be done by interuppes, I just could use the OnData Handler and it would be quite easy with
the JVCL Lib.

Thanks for help
Walter

wschrabi 23. Mär 2016 08:38

AW: Komponente Android Daten USB senden/empfangen
 
Zitat:

Zitat von DonAlfredo (Beitrag 1333620)
I just had a quick look on how to send/get a report.
You need to do a controltransfer.
I you look at: function TJvHidDevice.GetDeviceString(Idx: Byte): string;
You will find an example on how to do a controltransfer.
It could give you a start.

thanks , that is a help. I will investigate.
I would be thankful if I can ask you (many) more.
thanks

PS: One more question:
Would this be a way to make the prg debugable?
My Device is connected to the ANdroid usb OTG. So I can not debug via Delphi and the device is connected.
So My idea:
Wo make the same way with WIN API with the control transfer, as my device can be connected to WINDOWS and so
I can debug the prg too.
When It works on win I copy it to my Android program.
Would this a way to start the investigation?

I tried: But I do not get an aquivalent function in the WIN API (Hid.dll) for
Code:
 FUsbDeviceConnection.controlTransfer
.
How can I make a controltransfer with win api wihtout using the ready made GEt_Report.
Any ideas?

Thanks

DonAlfredo 23. Mär 2016 09:09

AW: Komponente Android Daten USB senden/empfangen
 
Ok.
I have added a quick and dirty feature report (see GitHub).
Not tested. Just use it as a start. Adapt for your needs.
Now I have to go back to normal business.

wschrabi 23. Mär 2016 09:40

AW: Komponente Android Daten USB senden/empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
I have tried it this way.
Code:
function TJvHidDevice.GetFeatureReport: string;
const
  STD_USB_REQUEST_RECIPIENT = $01; // Interface
  STD_USB_REQUEST_GET_REPORT = $01; //HID GET_REPORT
  STD_USB_REQUEST_SET_REPORT = $09; //HID SET_REPORT
  LIBUSB_FEATURE_REPORT = $0301; //Feature report ($0300), ID = 1 ($01)
  LIBUSB_FEATURE_REPORT_LENGTH = $FF;

  (* my try
  //STD_USB_REQUEST_GET_DESCRIPTOR = $06;
  STD_USB_REQUEST_GET_REPORT = $01;
  STD_USB_REQUEST_TYPE_GET_REPORT = $A1;  
  STD_USB_REQUEST_VALUE_GET_REPORT = $100;  
  LIBUSB_DT_STRING = $03;
  *)
 
var
  i,rdo:integer;
  buffer : TJavaArray<Byte>;
  S : String;
begin

  if Openfile then
  begin

    buffer := TJavaArray<Byte>.Create(255);

    rdo := FUsbDeviceConnection.controlTransfer(
           (TJUsbConstantsUSB_DIR_IN OR TJUsbConstantsUSB_TYPE_CLASS OR STD_USB_REQUEST_RECIPIENT),
           STD_USB_REQUEST_GET_REPORT,
           LIBUSB_FEATURE_REPORT,
           0,
           buffer,
           LIBUSB_FEATURE_REPORT_LENGTH,
           2000);
    (* my try
    rdo := FUsbDeviceConnection.controlTransfer(
           STD_USB_REQUEST_TYPE_GET_REPORT,
           STD_USB_REQUEST_GET_REPORT,
           STD_USB_REQUEST_VALUE_GET_REPORT,  
           0,
           buffer,
           $0B,
           0);
    *)
           

    if rdo<0 then
    begin
      buffer.Free;
      result:='';
      exit;
    end;

    if rdo>255 then rdo:=255;

    S:='';
    for i:=0 to rdo do
    begin
      S:=S+Char(buffer.Items[i]);
    end;
    result:=S;
    buffer.Free;
  end
  else result:='';
end;
Accoring to my sniffer snappshot of my working windows prg.
(See attached screeshoot)

wschrabi 23. Mär 2016 09:41

AW: Komponente Android Daten USB senden/empfangen
 
Zitat:

Zitat von DonAlfredo (Beitrag 1333623)
Ok.
I have added a quick and dirty feature report (see GitHub).
Not tested. Just use it as a start. Adapt for your needs.
Now I have to go back to normal business.

Thanks, I will try your solution:

The ShardeActivity... is not recognized in your file.

In the new Github file, you forgot this file in the uses clauses.
Code:
  FMX.Helpers.Android

wschrabi 23. Mär 2016 10:49

AW: Komponente Android Daten USB senden/empfangen
 
Dear Don,
one furhter question:

My Firmware has no Serial Number. COuld this be a problem, that I can not open a file.
As If OpenFile is always false.

I can re_flash my firmware with a serial number, but how can I enumerate the usb device
without one.

Thanks
walter

DonAlfredo 23. Mär 2016 12:43

AW: Komponente Android Daten USB senden/empfangen
 
I think you are referring to usb.pas ?!

If so, this usb.pas is tailor made for my application.

It is a measurement system with sometimes over 25 mcu's. All connected by USB.
All mcu's have a serial, so that the app can distinguisch them.
On initial connect, a serial is generated by the main system, and stored in firmware of the mcu.

If you do not connect multiple identical USB HID devices onto a single system, then you do not need the whole serial selection protocol.

Just use:
Code:
HidCtl.OnArrival:= DeviceArrival;
HidCtl.OnRemoval:= DeviceRemoval;
Also adjust
Code:
TReport = packed record
  ReportID: byte;
  Data:   array [0..15] of byte; // adjust 15 to fit your datapacket lenghth (often 64 bits so 63 is a good guess!!)
end;

wschrabi 23. Mär 2016 12:50

AW: Komponente Android Daten USB senden/empfangen
 
Zitat:

Zitat von DonAlfredo (Beitrag 1333652)
On initial connect, a serial is generated by the main system, and stored in firmware of the mcu.

If you do not connect multiple identical USB HID devices onto a single system, then you do not need the whole serial selection protocol.

Just use:
Code:
HidCtl.OnArrival:= DeviceArrival;
HidCtl.OnRemoval:= DeviceRemoval;
Also adjust
Code:
TReport = packed record
  ReportID: byte;
  Data:   array [0..15] of byte; // adjust 15 to fit your datapacket lenghth (often 64 bits so 63 is a good guess!!)
end;

thanks Don, I only have one USB Device, but no EP-OUT defined in the Firmware, so writing a serial to the device is not possible.
I have only one IN EP, like a mouse.

BTW: For what is that:
{.$define WITHPERMISSION}

I see that you use this here:
Code:
...
    {$ifdef WITHPERMISSION}
    FPermissionIntent : JPendingIntent;
    {$endif}
...
        {$ifdef WITHPERMISSION}
        FMyController.UsbManager.requestPermission(FUsbDevice,FMyController.PermissionIntent);
        {$endif}
Do I need that on my Tablet?

One more I think to change:
I have a NON INterupted HID Device and in your code there is:
Code:
 // Get HID endpoint 1
      if FUsbInterface.getEndpointCount>1 then
      begin
        FUsbEP := FUsbInterface.getEndpoint(1);
        if FUsbEP.getType=TJUsbConstantsUSB_ENDPOINT_XFER_INT then
        begin
          if FUsbEP.getDirection = TJUsbConstantsUSB_DIR_OUT then
          begin
            FEpOut := FUsbEP;
          end
          else if FUsbEP.getDirection = TJUsbConstantsUSB_DIR_IN then
          begin
            FEpIn := FUsbEP;
          end;
        end;
      end;
I think the TJUsbConstantsUSB_ENDPOINT_XFER_INT must also change. RIght?

Thank you very much!

DonAlfredo 23. Mär 2016 15:02

AW: Komponente Android Daten USB senden/empfangen
 
I think you do not need the permission part.
As long as you apply the device filter (device_filter.xml ; with your values).

AFAIK, you do not use the interrupt endpoints, so they are not important for your programme.

wschrabi 23. Mär 2016 17:26

AW: Komponente Android Daten USB senden/empfangen
 
Alfred, yes that was an issue, I need the permission define.
Now I can get my 12 Bytes from the Device by GET_REPORT Request.
Thank you very very much for your help.
Best regards
:-D Walter


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Seite 3 von 4     123 4      

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