Import libhid

Codes specifiques à Linux
Scrat
Messages : 86
Inscription : sam. 15/mars/2008 16:00

Import libhid

Message par Scrat »

Bonjour,

J'essaye d'importer la libhid pour causer avec un perif Hid-usb mais je seche.
(http://libhid.alioth.debian.org/doc/)

le bout de code

Code : Tout sélectionner

Enumeration
  #HID_RET_SUCCESS =0	
  #HID_RET_INVALID_PARAMETER 	=1
  #HID_RET_NOT_INITIALISED 	=2
  #HID_RET_ALREADY_INITIALISED=3 	
  #HID_RET_FAIL_FIND_BUSSES 	=4
  #HID_RET_FAIL_FIND_DEVICES 	=5
  #HID_RET_FAIL_OPEN_DEVICE 	=6
  #HID_RET_DEVICE_NOT_FOUND 	=7
  #HID_RET_DEVICE_NOT_OPENED 	=8
  #HID_RET_DEVICE_ALREADY_OPENED =9	
  #HID_RET_FAIL_CLOSE_DEVICE =10
  #HID_RET_FAIL_CLAIM_IFACE 	=11
  #HID_RET_FAIL_DETACH_DRIVER 	=12
  #HID_RET_NOT_HID_DEVICE 	=13
  #HID_RET_HID_DESC_SHORT 	=14
  #HID_RET_REPORT_DESC_SHORT 	=15
  #HID_RET_REPORT_DESC_LONG 	=16
  #HID_RET_FAIL_ALLOC 	=17
  #HID_RET_OUT_OF_SPACE 	=18
  #HID_RET_FAIL_SET_REPORT 	=19
  #HID_RET_FAIL_GET_REPORT 	=20
  #HID_RET_FAIL_INT_READ 	=21
  #HID_RET_NOT_FOUND 	=22
  #HID_RET_TIMEOUT 	=23
EndEnumeration

Structure THIDInterfaceMatcher
  vendor_id.u
  product_id.u
EndStructure


Structure THidNode
  UPage.i
  Usage.i
EndStructure

Structure THidPath
  Size.c
  Node.THidNode[10]
EndStructure

Structure THidData
  Value.l
  Path.THIDPath
  ReportID.c
  Offset.c
  Size.c
  Type.c
  Attribute.c
  Unit.l
  UnitExp.c
  LogMin.l
  LogMax.l
  PhyMin.l
  PhyMax.l
EndStructure


Structure THidParser
  ReportDesc.c[6144]
  ReportDescSize.i
  Pos.i
  Item.c
  Value.l
  Dat.THidData
  OffsetTab.c[900]
  ReportCount.c
  Count.c
  UPage.i
  UsageTab.THidNode[50]
  UsageSize.c
  nObject.c
  nReport.c
EndStructure


Structure THIDInterface
  dev_handle.l
  device.l
  Iface.i
  id.c[32]
  hid_data.THidData
  hid_parser.THidParser
EndStructure



ImportC "/usr/lib/libhid.so"
  hid_init()
  hid_cleanup()
  hid_new_HIDInterface()
  hid_force_open (HIDInterface, iface,HIDInterfaceMatcher,Retries)
  hid_open(HIDInterface, iface,HIDInterfaceMatcher)
  hid_interrupt_read(HIDinterface,Adr,buf,len,f)
  hid_close(HIDInterface)
EndImport

Dim buf.c(15)

Matcher.THIDInterfaceMatcher
Matcher\vendor_id=$20FF
Matcher\product_id=$0100

*Matcher=@Matcher

Debug hid_init(); ok return 0

H=hid_new_HIDInterface(); semble  ok retourne un handle
*H.THIDInterface=@H

Debug *H\device

Debug hid_force_open(*H,1,*Matcher,3); retourne 9 ==> #HID_RET_DEVICE_ALREADY_OPENED

Debug hid_interrupt_read(*H,$82,@buf(),15,0);retourne 21 ==> #HID_RET_FAIL_INT_READ


L'install de la lib et le perif sont fonctionnel car tout fonctionne avec un exemple realisé en python via python-hid

J'ai déja un problème pour déclarer un tableau statique à 2 dimensions dans une structure
j'ai essayé OffsetTab.c[300,3] , OffsetTab.c[300][3] mais pb n'en veut pas et je ne trouve rien dans la doc

Ensuite je doit merder sur le typage, bref je galère

Si quelqu'un a une idée il est le bien venu

Merci
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Import libhid

Message par Progi1984 »

As tu essayé "OffsetTab.c(300,3)" ?
Scrat
Messages : 86
Inscription : sam. 15/mars/2008 16:00

Re: Import libhid

Message par Scrat »

merci de ta reponse

J'ai déja essayé mais c'est dans une structure et pb veux pas

a+
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Import libhid

Message par G-Rom »

j'ai essayé OffsetTab.c[300,3] , OffsetTab.c[300][3] mais pb n'en veut pas et je ne trouve rien dans la doc
Ecrit simplement OffsetTab[900] ( 300*3 )

Code : Tout sélectionner

Macro CharSize
1  
EndMacro

Macro FloatSize
4 
EndMacro


Structure MyStruct
  Witdh.i
  STATIC_TAB_CHAR.c[900]
  STATIC_TAB_FLOAT.f[900]
EndStructure


Macro CHAR_PutInTab(struct,x,y,value)
  ; 2D to 1D 
  struct\STATIC_TAB_CHAR [ ( x * CharSize ) + struct\Witdh * ( y * CharSize) ] = value
EndMacro

Macro CHAR_GetInTab(struct,x,y)
  ; 2D to 1D 
  ; ( x * CharSize ) + struct\Witdh * ( y * CharSize)
  struct\STATIC_TAB_CHAR [ ( x * CharSize ) + struct\Witdh * ( y * CharSize) ]
EndMacro

Test.Mystruct
Test\Witdh = 3


CHAR_PutInTab(Test,57,28,253)
Debug CHAR_GetInTab(Test,57,28)
Scrat
Messages : 86
Inscription : sam. 15/mars/2008 16:00

Re: Import libhid

Message par Scrat »

@G-Rom
c'est ce que j'avais mis dans le code posté :wink:

Bon en fait le probleme vienst d'un bug dans le firmware du periph HID

Voila un code vite fait qui fonctionne pour lire un spacepoint fusion (IMU 9DOF)
Si vous voulez un periph sympa pour piloter vos jeux ou autre robot ........

Code : Tout sélectionner

ImportC "/usr/lib/libhid.so"
  hid_init()
  hid_cleanup()
  hid_new_HIDInterface()
  hid_force_open (HIDInterface, iface,HIDInterfaceMatcher,Retries)
  hid_interrupt_read(HIDinterface,Adr,buf,len,f)
  hid_close(HIDInterface)
EndImport


#HID_RET_SUCCESS =0	
#HID_RET_INVALID_PARAMETER 	=1
#HID_RET_NOT_INITIALISED 	=2
#HID_RET_ALREADY_INITIALISED=3 	
#HID_RET_FAIL_FIND_BUSSES 	=4
#HID_RET_FAIL_FIND_DEVICES 	=5
#HID_RET_FAIL_OPEN_DEVICE 	=6
#HID_RET_DEVICE_NOT_FOUND 	=7
#HID_RET_DEVICE_NOT_OPENED 	=8
#HID_RET_DEVICE_ALREADY_OPENED =9	
#HID_RET_FAIL_CLOSE_DEVICE =10
#HID_RET_FAIL_CLAIM_IFACE 	=11
#HID_RET_FAIL_DETACH_DRIVER 	=12
#HID_RET_NOT_HID_DEVICE 	=13
#HID_RET_HID_DESC_SHORT 	=14
#HID_RET_REPORT_DESC_SHORT 	=15
#HID_RET_REPORT_DESC_LONG 	=16
#HID_RET_FAIL_ALLOC 	=17
#HID_RET_OUT_OF_SPACE 	=18
#HID_RET_FAIL_SET_REPORT 	=19
#HID_RET_FAIL_GET_REPORT 	=20
#HID_RET_FAIL_INT_READ 	=21
#HID_RET_NOT_FOUND 	=22
#HID_RET_TIMEOUT 	=23


Structure THIDInterfaceMatcher
  vendor_id.u
  product_id.u
  custom_matcher.l
  custom_data.l
  lon.l
EndStructure



; buffer de reception
Dim InData.c(14) 

Dim Buttons.i(1)
Dim RawAxes.i(7)
Dim Acc_Scaled.d(3)
Dim Q_Scaled.d(3)
PI2.d=180/#PI


Matcher.THIDInterfaceMatcher
Matcher\vendor_id=$20FF; Vendor ID retourné par lsusb
Matcher\product_id=$0100; Product ID retourné par lsusb
Matcher\custom_matcher=#Null
Matcher\custom_data=#Null
Matcher\lon=0


If hid_init()=#HID_RET_SUCCESS
  *h=hid_new_HIDInterface()
  If *h
    ;ouverture en forcant la liberation par le kernel
    ;contournement du bug du firmware PNI
    R=hid_force_open(*h,1,@Matcher,3)
    If R<> #HID_RET_SUCCESS
      R= hid_force_open(*h,0,@Matcher,3)
    EndIf
    If R<>#HID_RET_SUCCESS:End:EndIf
    
    Repeat
      ;lecture du point de terminaison $82 (acceleration + quaternion) ou $81 pour les raw data
      If hid_interrupt_read(*h,$82,@InData(),15,0)=#HID_RET_SUCCESS
        
        ByteIndex=0
        For i = 0 To 6
          RawAxes(i) = InData(ByteIndex) + 256*InData(ByteIndex+1)
          ByteIndex+2
        Next i
        
        Buttons(0) = InData(ByteIndex)&1
        Buttons(1) = (Indata(ByteIndex)>>1)&1
        RawAxes(7) = (Indata(ByteIndex)>>4)&$f
        
        ;Accelero
        ;Valeurs de 16bit centrées sur 32768
        ;acc_scaled = 6*(acc_received - 32768)/32768;
        For i=0 To 2
          Acc_Scaled(i) = 6*(RawAxes(i)-32768) / 32768;
        Next i
        
        ;Quaternion
        ;Valeurs de 16bit centrées sur 32768
        ;q_scaled = 3.0518e-005*(qraw - 32768)
        For i=0 To 3
          Q_Scaled(i) = (3.0518e-005)*(RawAxes(3+i)-32768)
        Next i	
        
        
        sqx.d=Q_Scaled(0)*Q_Scaled(0)
        sqy.d=Q_Scaled(1)*Q_Scaled(1)
        sqz.d=Q_Scaled(2)*Q_Scaled(2)
        sqw.d=Q_Scaled(3)*Q_Scaled(3)
        
        Yaw.d=PI2*ATan2(2.0 * (Q_Scaled(0)*Q_Scaled(1) + Q_Scaled(2)*Q_Scaled(3)),(sqx - sqy - sqz + sqw))
        PrePitch.d=-2.0 * (Q_Scaled(0)*Q_Scaled(2) - Q_Scaled(1)*Q_Scaled(3))
        If PrePitch>1
          PrePitch=1
        ElseIf PrePitch<-1
          PrePitch=-1
        EndIf
        Pitch.d=PI2*ASin(PrePitch)
        
        Roll.d=PI2*ATan2(2.0 * (q_scaled(1)*q_scaled(2) + q_scaled(0)*q_scaled(3)),(-sqx - sqy + sqz + sqw))          
        
        Debug yaw
        Debug pitch
        Debug roll
        
        delay(20)
        
      EndIf
    ForEver
  EndIf
  
EndIf

A+
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Import libhid

Message par G-Rom »

@G-Rom
c'est ce que j'avais mis dans le code posté :wink:
:oops:

J'ai même pas regardé :D
Répondre