Seite 1 von 1

HDI Interface unter Windows auslesen und Daten senden

Verfasst: 28.10.2006 22:31
von mpz
Hallo Leute,

ich habe gerade meine Project mit einem USB-HDI Interface unter Windows abgeschlossen. Mit diesem Quellcode sollte es daher möglich sein auch andere HDI Interface (z.B. X10 Fernsteuerung) auszulesen.

Gruß
MPZ

Code: Alles auswählen

; "USB HID Controll.pb"
; 
; PowerBasic Example um ein HID Gerät anzusteuern.
; funktioniert z.B. mit einem PIC Controller PIC 18F2550 mit USB Schnittstelle
; Wer es wissen will: Der PIC 18F2550 hat z.b. 24x I/O´s und 10x 10bit AD´s
;  
; Version 1.00 by MPZ Okt.2006
; for PB 4.00
; 
; benötigt wird die mcHID.dll von der Firma Mecanique. Die mcHID Library ist 
; Bestandteil der EasyHID Software:
; http://www.mecanique.co.uk/software/EasyHID.zip 
;
; Ein direkter Download der DLL ist über den folgenden Link möglich 
; http://www.docpro.com.br/arquivos/mcHID.zip
; 



Enumeration
  #Window_0
  #Listview_0
  #Text_0
  #Text_1
  #Button_0
  #Button_1
  #Button_2

EndEnumeration


;{/ Globale Variablen
Global pVendorID.l, pProductID.l, pIndex.l, DeviceHandle.l
Global VendorName.s, ProductName.s, GetSerialNumber.s
Global USB_HID.l
Global Dim BufferIn.b(8),Dim BufferOut.b(8)

Global NewList SelectList.s()

#WM_APP = 32768
#WM_HID_EVENT = #WM_APP + 200
#NOTIFY_PLUGGED = 1
#NOTIFY_UNPLUGGED = 2
#NOTIFY_CHANGED = 3
#NOTIFY_READ = 4

#VendorID = 6017    ; Herstellernummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
#ProductID = 2000   ; Produktnummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
                    ; Damit läßt sich der DeviceHandle  eines bestimmten HIDs leicht bestimmen
                    ; DeviceHandle = hidGetHandle(#VendorID, #ProductID) 

VendorName.s = Space(256)
ProductName.s = Space(256) 
GetSerialNumber.s = Space(256)
;}
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 321, 133, 258, 259, "HID Empfang",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ListViewGadget(#Listview_0, 10, 30, 240, 170)
      TextGadget(#Text_0, 10, 8, 240, 20, "Daten empfangen", #PB_Text_Center)
      TextGadget(#Text_1, 10, 203, 240, 14, "Daten senden", #PB_Text_Center)
      ButtonGadget(#Button_0, 10, 220, 60, 30, "Senden 1")
      ButtonGadget(#Button_1, 100, 220, 60, 30, "Senden 2")
      ButtonGadget(#Button_2, 190, 220, 60, 30, "Senden 3")
    EndIf
    ProcedureReturn = 1
  EndIf
EndProcedure
;{/ DLL Datei Aufrufen

Prototype  hidConnect (pHostWin.l); As Boolean
Prototype  hidDisconnect (); As Boolean
Prototype  hidRead (pHandle.l, pData.b); As Boolean
Prototype  hidWrite (pHandle.l, pData.b); As Boolean
Prototype  hidReadEx (pVendorID.l, pProductID.l, pData.b); As Boolean
Prototype  hidWriteEx (pVendorID.l, pProductID.l, ByRef.b); As Boolean
Prototype  hidGetVendorName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetProductName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetSerialNumber (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetVendorID (pHandle.l); As Long
Prototype  hidGetProductID (pHandle.l); As Long
Prototype  hidGetVersion (pHandle.l); As Long
Prototype  hidGetInputReportLength (pHandle.l); As Long
Prototype  hidGetOutputReportLength (pHandle.l); As Long
Prototype  hidGetHandle (pVendoID.l, pProductID.l); As Long
Prototype  hidGetItem (pIndex.l); As Long
Prototype  hidGetItemCount (); As Long
Prototype  hidSetReadNotify (pHandle.l, pValue.b);
Prototype  hidIsReadNotifyEnabled (pHandle.l); As Boolean
Prototype  hidIsAvailable (pVendorID.l, pProductID.l);  As Boolean


Define mcHID_DLL.l = OpenLibrary(#PB_Any, "mcHID.dll") 

If mcHID_DLL 
    Global hidConnect.hidConnect = GetFunction(mcHID_dll,"Connect") ; (ByVal pHostWin As Long) As Boolean
    Global hidDisconnect.hidDisconnect = GetFunction(mcHID_dll,"Disconnect");  () As Boolean
    Global hidRead.hidRead = GetFunction(mcHID_dll,"Read");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidWrite.hidWrite = GetFunction(mcHID_dll,"Write");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidReadEx.hidReadEx = GetFunction(mcHID_dll,"ReadEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidWriteEx.hidWriteEx = GetFunction(mcHID_dll,"WriteEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidGetVendorName.hidGetVendorName = GetFunction(mcHID_dll,"GetVendorName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetProductName.hidGetProductName = GetFunction(mcHID_dll,"GetProductName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetSerialNumber.hidGetSerialNumber = GetFunction(mcHID_dll,"GetSerialNumber");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetVendorID.hidGetVendorID = GetFunction(mcHID_dll,"GetVendorID");  (ByVal pHandle As Long) As Long
    Global hidGetProductid.hidGetProductid = GetFunction(mcHID_dll,"GetProductID");  (ByVal pHandle As Long) As Long
    Global hidGetVersion.hidGetVersion = GetFunction(mcHID_dll,"GetVersion"); (ByVal pHandle As Long) As Long
    Global hidGetInputReportLength.hidGetInputReportLength = GetFunction(mcHID_dll,"GetInputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetOutputReportLength.hidGetOutputReportLength = GetFunction(mcHID_dll,"GetOutputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetHandle.hidGetHandle = GetFunction(mcHID_dll,"GetHandle");  (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
    Global hidGetItem.hidGetItem = GetFunction(mcHID_dll,"GetItem");  (ByVal pIndex As Long) As Long
    Global hidGetItemCount.hidGetItemCount = GetFunction(mcHID_dll,"GetItemCount");  (ByVal pIndex As Long) As Long
    Global hidSetReadNotify.hidSetReadNotify = GetFunction(mcHID_dll,"SetReadNotify"); ByVal pHandle As Long, ByVal pValue As Boolean)
    Global hidIsReadNotifyEnabled.hidIsReadNotifyEnabled = GetFunction(mcHID_dll,"IsReadNotifyEnabled");  (ByVal pHandle As Long) As Boolean
    Global hidIsAvailable.hidIsAvailable = GetFunction(mcHID_dll,"IsAvailable"); (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
Else
    MessageRequester("Fehlermeldung", "Das Programm konnte die mcHID.dll Datei nicht öffnen", #PB_MessageRequester_Ok)
    End
EndIf 
;}

ProcedureDLL mcHID_Free(); DLL freigeben
  If mcHID_DLL
    CloseLibrary(#PB_Any)
  EndIf
  XLTable_DLL = 0
EndProcedure

Procedure Selectrequester (Selectbox.s,Selecttext.s,Mylist.s())

Enumeration 100 ; bei vielen Fenster und Event Wert erhöhen
  #Window_Selectbox
  #Text_Selectbox
  #Listview_Selectbox
  #Button_Selectbox0
  #Button_Selectbox1
EndEnumeration

Return_Selectbox.l = -1 ; Fehlerwert = -1 

If CountList(Mylist()) < 1
   ProcedureReturn = Return_Selectbox
EndIf

If OpenWindow(#Window_Selectbox,0,0, 305, 138, Selectbox.s,  #PB_Window_SystemMenu | #PB_Window_TitleBar| #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Window_Selectbox))
    TextGadget(#Text_Selectbox, 20, 10, 150, 14, Selecttext.s)
    ListViewGadget(#Listview_Selectbox, 10, 30, 210, 100)
    ButtonGadget(#Button_Selectbox0, 230, 70, 70, 23, "Wählen")
    ButtonGadget(#Button_Selectbox1, 230, 107, 70, 23, "Abbrechen")
  EndIf
EndIf

FirstElement(Mylist()) 
For a = 1 To CountList(Mylist())
   AddGadgetItem (#Listview_Selectbox, -1, Mylist())   ; definieren des Listview-Inhalts
   NextElement(Mylist()) 
Next

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  GadgetID = EventGadget() ; Is it a gadget event?
  
  If Event = #PB_Event_Gadget
    If GadgetID = #Button_Selectbox0
       Event = #PB_Event_CloseWindow
       Return_Selectbox = GetGadgetState(#Listview_Selectbox) 
    ElseIf GadgetID = #Button_Selectbox1
       Event = #PB_Event_CloseWindow
    EndIf
  EndIf  
Until Event = #PB_Event_CloseWindow ; End of the event loop
CloseWindow(#Window_Selectbox)
ProcedureReturn = Return_Selectbox
EndProcedure 

;- Window Callback 
Procedure WinProc(hWnd,Msg,wParam,lParam) 
 result = #PB_ProcessPureBasicEvents 
 
 If Msg = #WM_HID_EVENT 
       
       Select wParam
           ; HID device has been plugged message...
        Case #NOTIFY_PLUGGED
           ;HID device has been plugged
           AddGadgetItem(#Listview_0,0, "#NOTIFY_PLUGGED")
        Case #NOTIFY_UNPLUGGED
           ;HID device has been unplugged
           AddGadgetItem(#Listview_0,0, "#NOTIFY_UNPLUGGED")
        Case #NOTIFY_CHANGED
           ;HID device has been changed
           AddGadgetItem(#Listview_0,0, "#NOTIFY_CHANGED")
           If hidGetItemCount() > 0
              ClearList(SelectList()) 
              For a = 0 To hidGetItemCount()
                  Devicetemp.l = hidGetItem(a)
                  hidGetProductName (Devicetemp,ProductName,256)
                  AddElement(SelectList())
                  SelectList() = ProductName
              Next
              USB_HID = Selectrequester ("HID Gerät wählen","HID Geräte:",SelectList())
              If USB_HID > -1
                  DeviceHandle = hidGetItem(USB_HID)
                  hidGetProductName (DeviceHandle.l,ProductName,256)
                  AddGadgetItem(#Listview_0,0, "hidGetProductName = "+ProductName)
                  AddGadgetItem(#Listview_0,0, "hidGetVendorID = "+ Str(hidGetVendorID (DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "hidGetProductID = " + Str(hidGetProductID(DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "Input Datenlänge in Bytes = "+Str(hidGetInputReportLength (DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "Output Datenlänge in Bytes = "+Str(hidGetOutputReportLength (DeviceHandle.l)))
                  hidSetReadNotify (DeviceHandle, #True) ;read event...
              EndIf
          EndIf
         ;DeviceHandle = hidGetHandle(#VendorID, #ProductID)
         ;hidSetReadNotify (DeviceHandle, #True) ! IMPORTANT ! Read works only With this flag
        Case #NOTIFY_READ
           ; READ works only if the hidSetReadNotify flag is set 
           AddGadgetItem(#Listview_0,0, "#NOTIFY_READ")
           If hidRead(DeviceHandle, @BufferIn(0)) 
              AddGadgetItem(#Listview_0,0, "Read: "+Str(BufferIn(0)) +"/"+ Str(BufferIn(1))+"/"+Str(BufferIn(2))+"/"+Str(BufferIn(3))+"/"+Str(BufferIn(4))+"/"+Str(BufferIn(5))+"/"+Str(BufferIn(6))+"/"+Str(BufferIn(7))+"/"+Str(BufferIn(8)))
           Else 
              AddGadgetItem(#Listview_0,0, "Read fehlerhaft!")
           EndIf
        EndSelect
   
   EndIf

  
  ProcedureReturn result 
EndProcedure 

;{/ Main Unit
If Open_Window_0()

hidconnect (WindowID(#Window_0))

SetWindowCallback(@WinProc())

  Repeat
    EventID = WaitWindowEvent()

    Select EventID
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #Button_0
             AddGadgetItem(#Listview_0,0, "Senden 1 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0 ; Muß immer Null sein!
             BufferOut(1) = 1
             BufferOut(2) = 2
             BufferOut(3) = 3
             BufferOut(4) = 4
             BufferOut(5) = 5
             BufferOut(6) = 6
             BufferOut(7) = 7
             BufferOut(8) = 8
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
           Case #Button_1 : AddGadgetItem(#Listview_0,0, "Senden 2 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0; Muß immer Null sein!
             BufferOut(1) = 2
             BufferOut(2) = 3
             BufferOut(3) = 4
             BufferOut(4) = 5
             BufferOut(5) = 6
             BufferOut(6) = 7
             BufferOut(7) = 8
             BufferOut(8) = 9
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
           Case #Button_2 : AddGadgetItem(#Listview_0,0, "Senden 3 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0; Muß immer Null sein!
             BufferOut(1) = 3
             BufferOut(2) = 4
             BufferOut(3) = 5
             BufferOut(4) = 6
             BufferOut(5) = 7
             BufferOut(6) = 8
             BufferOut(7) = 9
             BufferOut(8) = 10
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
         EndSelect
       EndSelect

  Until EventID = #PB_Event_CloseWindow
  hidDisconnect ()
  mcHID_Free()
EndIf
;}

Re: HDI Interface unter Windows auslesen und Daten senden

Verfasst: 05.11.2009 16:25
von mpz
Hi,

Angepasst für Purebasic 4.40 beta5

works with Purebasic 4.40 beta5

Michael

Code: Alles auswählen

; "USB HID Controll.pb"
;
; PowerBasic Example um ein HID Gerät anzusteuern.
; funktioniert z.B. mit einem PIC Controller PIC 18F2550 mit USB Schnittstelle
; Wer es wissen will: Der PIC 18F2550 hat z.b. 24x I/O´s und 10x 10bit AD´s
; 
; Version 1.01 by MPZ Nov.2009
; for PB 4.40 Beta 5
;
; benötigt wird die mcHID.dll von der Firma Mecanique. Die mcHID Library ist
; Bestandteil der EasyHID Software:
; http://www.mecanique.co.uk/software/EasyHID.zip
;
; Ein direkter Download der DLL ist über den folgenden Link möglich
; http://www.docpro.com.br/arquivos/mcHID.zip
;



Enumeration
  #Window_0
  #Listview_0
  #Text_0
  #Text_1
  #Button_0
  #Button_1
  #Button_2

EndEnumeration


;{/ Globale Variablen
Global pVendorID.l, pProductID.l, pIndex.l, DeviceHandle.l
Global VendorName.s, ProductName.s, GetSerialNumber.s
Global USB_HID.l
Global Dim BufferIn.b(8),Dim BufferOut.b(8)
NewList Mylist.s()
Global NewList SelectList.s()

#WM_APP = 32768
#WM_HID_EVENT = #WM_APP + 200
#NOTIFY_PLUGGED = 1
#NOTIFY_UNPLUGGED = 2
#NOTIFY_CHANGED = 3
#NOTIFY_READ = 4

#VendorID = 6017    ; Herstellernummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
#ProductID = 2000   ; Produktnummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
                    ; Damit läßt sich der DeviceHandle  eines bestimmten HIDs leicht bestimmen
                    ; DeviceHandle = hidGetHandle(#VendorID, #ProductID)

VendorName.s = Space(256)
ProductName.s = Space(256)
GetSerialNumber.s = Space(256)
;}
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 321, 133, 258, 259, "HID Empfang",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    ;If CreateGadgetList(WindowID(#Window_0))
      ListViewGadget(#Listview_0, 10, 30, 240, 170)
      TextGadget(#Text_0, 10, 8, 240, 20, "Daten empfangen", #PB_Text_Center)
      TextGadget(#Text_1, 10, 203, 240, 14, "Daten senden", #PB_Text_Center)
      ButtonGadget(#Button_0, 10, 220, 60, 30, "Senden 1")
      ButtonGadget(#Button_1, 100, 220, 60, 30, "Senden 2")
      ButtonGadget(#Button_2, 190, 220, 60, 30, "Senden 3")
    ;EndIf
    ProcedureReturn 1
  EndIf
EndProcedure
;{/ DLL Datei Aufrufen

Prototype  hidConnect (pHostWin.l); As Boolean
Prototype  hidDisconnect (); As Boolean
Prototype  hidRead (pHandle.l, pData.b); As Boolean
Prototype  hidWrite (pHandle.l, pData.b); As Boolean
Prototype  hidReadEx (pVendorID.l, pProductID.l, pData.b); As Boolean
Prototype  hidWriteEx (pVendorID.l, pProductID.l, ByRef.b); As Boolean
Prototype  hidGetVendorName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetProductName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetSerialNumber (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetVendorID (pHandle.l); As Long
Prototype  hidGetProductID (pHandle.l); As Long
Prototype  hidGetVersion (pHandle.l); As Long
Prototype  hidGetInputReportLength (pHandle.l); As Long
Prototype  hidGetOutputReportLength (pHandle.l); As Long
Prototype  hidGetHandle (pVendoID.l, pProductID.l); As Long
Prototype  hidGetItem (pIndex.l); As Long
Prototype  hidGetItemCount (); As Long
Prototype  hidSetReadNotify (pHandle.l, pValue.b);
Prototype  hidIsReadNotifyEnabled (pHandle.l); As Boolean
Prototype  hidIsAvailable (pVendorID.l, pProductID.l);  As Boolean


Define mcHID_DLL.l = OpenLibrary(#PB_Any, "mcHID.dll")

If mcHID_DLL
    Global hidConnect.hidConnect = GetFunction(mcHID_dll,"Connect") ; (ByVal pHostWin As Long) As Boolean
    Global hidDisconnect.hidDisconnect = GetFunction(mcHID_dll,"Disconnect");  () As Boolean
    Global hidRead.hidRead = GetFunction(mcHID_dll,"Read");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidWrite.hidWrite = GetFunction(mcHID_dll,"Write");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidReadEx.hidReadEx = GetFunction(mcHID_dll,"ReadEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidWriteEx.hidWriteEx = GetFunction(mcHID_dll,"WriteEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidGetVendorName.hidGetVendorName = GetFunction(mcHID_dll,"GetVendorName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetProductName.hidGetProductName = GetFunction(mcHID_dll,"GetProductName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetSerialNumber.hidGetSerialNumber = GetFunction(mcHID_dll,"GetSerialNumber");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetVendorID.hidGetVendorID = GetFunction(mcHID_dll,"GetVendorID");  (ByVal pHandle As Long) As Long
    Global hidGetProductid.hidGetProductid = GetFunction(mcHID_dll,"GetProductID");  (ByVal pHandle As Long) As Long
    Global hidGetVersion.hidGetVersion = GetFunction(mcHID_dll,"GetVersion"); (ByVal pHandle As Long) As Long
    Global hidGetInputReportLength.hidGetInputReportLength = GetFunction(mcHID_dll,"GetInputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetOutputReportLength.hidGetOutputReportLength = GetFunction(mcHID_dll,"GetOutputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetHandle.hidGetHandle = GetFunction(mcHID_dll,"GetHandle");  (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
    Global hidGetItem.hidGetItem = GetFunction(mcHID_dll,"GetItem");  (ByVal pIndex As Long) As Long
    Global hidGetItemCount.hidGetItemCount = GetFunction(mcHID_dll,"GetItemCount");  (ByVal pIndex As Long) As Long
    Global hidSetReadNotify.hidSetReadNotify = GetFunction(mcHID_dll,"SetReadNotify"); ByVal pHandle As Long, ByVal pValue As Boolean)
    Global hidIsReadNotifyEnabled.hidIsReadNotifyEnabled = GetFunction(mcHID_dll,"IsReadNotifyEnabled");  (ByVal pHandle As Long) As Boolean
    Global hidIsAvailable.hidIsAvailable = GetFunction(mcHID_dll,"IsAvailable"); (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
Else
    MessageRequester("Fehlermeldung", "Das Programm konnte die mcHID.dll Datei nicht öffnen", #PB_MessageRequester_Ok)
    End
EndIf
;}

ProcedureDLL mcHID_Free(); DLL freigeben
  If mcHID_DLL
    CloseLibrary(#PB_Any)
  EndIf
  XLTable_DLL = 0
EndProcedure

Procedure Selectrequester (Selectbox.s,Selecttext.s, List Mylist.s())

Enumeration 100 ; bei vielen Fenster und Event Wert erhöhen
  #Window_Selectbox
  #Text_Selectbox
  #Listview_Selectbox
  #Button_Selectbox0
  #Button_Selectbox1
EndEnumeration

Return_Selectbox.l = -1 ; Fehlerwert = -1

If ListIndex(Mylist()) < 1
   ProcedureReturn Return_Selectbox
EndIf

If OpenWindow(#Window_Selectbox,0,0, 305, 138, Selectbox.s,  #PB_Window_SystemMenu | #PB_Window_TitleBar| #PB_Window_ScreenCentered)
  ;If CreateGadgetList(WindowID(#Window_Selectbox))
    TextGadget(#Text_Selectbox, 20, 10, 150, 14, Selecttext.s)
    ListViewGadget(#Listview_Selectbox, 10, 30, 210, 100)
    ButtonGadget(#Button_Selectbox0, 230, 70, 70, 23, "Wählen")
    ButtonGadget(#Button_Selectbox1, 230, 107, 70, 23, "Abbrechen")
  ;EndIf
EndIf

FirstElement(Mylist())
For a = 1 To  ListIndex(Mylist())
   AddGadgetItem (#Listview_Selectbox, -1, Mylist())   ; definieren des Listview-Inhalts
   NextElement(Mylist())
Next

Repeat ; Start of the event loop
 
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  GadgetID = EventGadget() ; Is it a gadget event?
 
  If Event = #PB_Event_Gadget
    If GadgetID = #Button_Selectbox0
       Event = #PB_Event_CloseWindow
       Return_Selectbox = GetGadgetState(#Listview_Selectbox)
    ElseIf GadgetID = #Button_Selectbox1
       Event = #PB_Event_CloseWindow
    EndIf
  EndIf 
Until Event = #PB_Event_CloseWindow ; End of the event loop
CloseWindow(#Window_Selectbox)
ProcedureReturn Return_Selectbox
EndProcedure

;- Window Callback
Procedure WinProc(hWnd,Msg,wParam,lParam)
result = #PB_ProcessPureBasicEvents

If Msg = #WM_HID_EVENT
       
       Select wParam
           ; HID device has been plugged message...
        Case #NOTIFY_PLUGGED
           ;HID device has been plugged
           AddGadgetItem(#Listview_0,0, "#NOTIFY_PLUGGED")
        Case #NOTIFY_UNPLUGGED
           ;HID device has been unplugged
           AddGadgetItem(#Listview_0,0, "#NOTIFY_UNPLUGGED")
        Case #NOTIFY_CHANGED
           ;HID device has been changed
           AddGadgetItem(#Listview_0,0, "#NOTIFY_CHANGED")
           If hidGetItemCount() > 0
              ClearList(SelectList())
              For a = 0 To hidGetItemCount()
                  Devicetemp.l = hidGetItem(a)
                  hidGetProductName (Devicetemp,ProductName,256)
                  AddElement(SelectList())
                  SelectList() = ProductName
              Next
              USB_HID = Selectrequester ("HID Gerät wählen","HID Geräte:",SelectList())
              If USB_HID > -1
                  DeviceHandle = hidGetItem(USB_HID)
                  hidGetProductName (DeviceHandle.l,ProductName,256)
                  AddGadgetItem(#Listview_0,0, "hidGetProductName = "+ProductName)
                  AddGadgetItem(#Listview_0,0, "hidGetVendorID = "+ Str(hidGetVendorID (DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "hidGetProductID = " + Str(hidGetProductID(DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "Input Datenlänge in Bytes = "+Str(hidGetInputReportLength (DeviceHandle.l)))
                  AddGadgetItem(#Listview_0,0, "Output Datenlänge in Bytes = "+Str(hidGetOutputReportLength (DeviceHandle.l)))
                  hidSetReadNotify (DeviceHandle, #True) ;read event...
              EndIf
          EndIf
         ;DeviceHandle = hidGetHandle(#VendorID, #ProductID)
         ;hidSetReadNotify (DeviceHandle, #True) ! IMPORTANT ! Read works only With this flag
        Case #NOTIFY_READ
           ; READ works only if the hidSetReadNotify flag is set
           AddGadgetItem(#Listview_0,0, "#NOTIFY_READ")
           If hidRead(DeviceHandle, @BufferIn(0))
              AddGadgetItem(#Listview_0,0, "Read: "+Str(BufferIn(0)) +"/"+ Str(BufferIn(1))+"/"+Str(BufferIn(2))+"/"+Str(BufferIn(3))+"/"+Str(BufferIn(4))+"/"+Str(BufferIn(5))+"/"+Str(BufferIn(6))+"/"+Str(BufferIn(7))+"/"+Str(BufferIn(8)))
           Else
              AddGadgetItem(#Listview_0,0, "Read fehlerhaft!")
           EndIf
        EndSelect
   
   EndIf

 
  ProcedureReturn result
EndProcedure

;{/ Main Unit
If Open_Window_0()

hidconnect (WindowID(#Window_0))

SetWindowCallback(@WinProc())

  Repeat
    EventID = WaitWindowEvent()

    Select EventID
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #Button_0
             AddGadgetItem(#Listview_0,0, "Senden 1 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0 ; Muß immer Null sein!
             BufferOut(1) = 1
             BufferOut(2) = 2
             BufferOut(3) = 3
             BufferOut(4) = 4
             BufferOut(5) = 5
             BufferOut(6) = 6
             BufferOut(7) = 7
             BufferOut(8) = 8
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
           Case #Button_1 : AddGadgetItem(#Listview_0,0, "Senden 2 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0; Muß immer Null sein!
             BufferOut(1) = 2
             BufferOut(2) = 3
             BufferOut(3) = 4
             BufferOut(4) = 5
             BufferOut(5) = 6
             BufferOut(6) = 7
             BufferOut(7) = 8
             BufferOut(8) = 9
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
           Case #Button_2 : AddGadgetItem(#Listview_0,0, "Senden 3 angeklickt!")
             ; Anzahl der BufferOut ist abhängig vom HID Gerät
             BufferOut(0) = 0; Muß immer Null sein!
             BufferOut(1) = 3
             BufferOut(2) = 4
             BufferOut(3) = 5
             BufferOut(4) = 6
             BufferOut(5) = 7
             BufferOut(6) = 8
             BufferOut(7) = 9
             BufferOut(8) = 10
             hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
         EndSelect
       EndSelect

  Until EventID = #PB_Event_CloseWindow
  hidDisconnect ()
  mcHID_Free()
EndIf
;}

Re: HDI Interface unter Windows auslesen und Daten senden

Verfasst: 25.11.2009 19:22
von Helmut
Hallo Michael !

Oder meine Version von deinem HID_Urprogramm: http://www.ip-symcon.de/forum/attachmen ... erface.png
Warum listet das letzte Programm mein HID-Gerät nicht auf?

Code: Alles auswählen

; "MPZ Buggy IO INTERFACE.pb"
;
; PowerBasic Example um ein Formel Flowcode Buggy von www.matrixmultimedia.com als
; I/O Interface anzusteuern. Das Gerät wird auch von Elektor vertrieben
; Der PIC 18F4455 besitzt unter anderem 35x I/O´s und 13x 10bit AD´s
; Dieses Programm wird erweitert und erlaubt derzeit:
;                                         2x digitale Eingänge (Taster)
;                                         8x digitalen Ausgängen 
;                                         1x LDR mit AD Wandlung von 10 bit
;                                         1x MIC mit AD Wandlung von 10 bit
;
;
; PowerBasic Example to use a PIC Formel Flowcode Buggy from www.matrixmultimedia.com as
; I/O interface anzusteuern.
; The PIC 18F4455 has 35x I/O´s and 13x 10bit AD´s
; This Program will updated and has now:
;                          2x digital Inputs
;                          8x digital Outputs 
;                          1x LDR input with 10 bit resulution
;                          1x MIC input with 10 bit resulution
;
; 
; Version 1.00 by MPZ Okt.2007
; for PB 4.10 beta3
;
; benötigt wird die mcHID.dll von der Firma Mecanique. Die mcHID Library ist
; Bestandteil der EasyHID Software:
; You need the mcHID.dll from the company Mecanique. The mcHID Library is included
; in the EasyHID Software:
; http://www.mecanique.co.uk/software/EasyHID.zip
;
; Ein direkter Download der DLL ist über den folgenden Link möglich
; Direct download link
; http://www.docpro.com.br/arquivos/mcHID.zip
;
 
Enumeration
  #Window_0
  #SerienNr
  #Text_Status
  #Text_Status1
  #Text_DIGI_IN
  #Listview_INPUT
  #Text_LDR
  #Analog_LDR
  #Text_MIC
  #Analog_MIC
  #Text_OUT
  #Button_OUT1
  #Button_OUT2
  #Button_OUT3
  #Button_OUT4
  #Button_OUT5
  #Button_OUT6
  #Button_OUT7
  #Button_OUT8
EndEnumeration


; Global

;{/ Globale Variablen
Global pVendorID.l, pProductID.l,pSerialNumber,DeviceHandle.l, ProductName.s
Global USB_HID.l,DIGITAL_OUT.b, Button_1.b, Button_2.b,Flag.b
Global Dim BufferIn.b(12),Dim BufferOut.b(12)

#WM_APP = 32768
#WM_HID_EVENT = #WM_APP + 200
#NOTIFY_PLUGGED = 1
#NOTIFY_UNPLUGGED = 2
#NOTIFY_CHANGED = 3
#NOTIFY_READ = 4

#VendorID = $16D0    ; nee, von helmut, alt: Vendor ID "MPZ USB BUGGY"
#ProductID =$04B6   ; ProductID "MPZ USB BUGGY"
#SerialNumber = $0001
ProductName.s = Space(256)

;}

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 310, 185, 391, 272, "     Helmut's USB - HID - Funk - Interface",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered )
    If CreateGadgetList(WindowID(#Window_0))
     ;SpinGadget(#SerienNr, 10,10 , 40, 20, 20, 255); [, Flags])

      
      TextGadget(#Text_Status, 80, 10, 100, 20, "No Device", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_Status1, 215, 10,100, 20, "No Device", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_DIGI_IN, 30, 40, 330, 15, "Letzer Schaltvorgang :", #PB_Text_Center)
      ListViewGadget(#Listview_INPUT, 30, 56, 330, 50)
      TextGadget(#Text_LDR, 30, 110, 330, 12, "zB. LDR INPUT", #PB_Text_Center)
      ProgressBarGadget(#Analog_LDR, 30, 130, 330, 20, 0, 1024, #PB_ProgressBar_Smooth)
      TextGadget(#Text_MIC, 30, 153, 330, 12, "zB. MIC INPUT", #PB_Text_Center)
      ProgressBarGadget(#Analog_MIC, 30, 170, 330, 20, 0, 1024, #PB_ProgressBar_Smooth)
      TextGadget(#Text_OUT, 20, 200, 350, 20, "DIGITAL OUT 1 - OUT8", #PB_Text_Center)
      ButtonGadget(#Button_OUT1, 20, 220, 40, 30, "Dose1", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT2, 65, 220, 40, 30, "Dose2", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT3, 110, 220, 40, 30, "Dose3", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT4, 155, 220, 40, 30, "Dose4", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT5, 200, 220, 40, 30, "Dose5", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT6, 245, 220, 40, 30, "Dose6", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT7, 290, 220, 40, 30, "Dose7", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT8, 335, 220, 40, 30, "Dose8", #PB_Button_Default | #PB_Button_Toggle)
     EndIf
     ProcedureReturn 1
  EndIf
EndProcedure

;{/ DLL LIB

Prototype  hidConnect (pHostWin.l); As Boolean
Prototype  hidDisconnect (); As Boolean
Prototype  hidRead (pHandle.l, pData.b); As Boolean
Prototype  hidWrite (pHandle.l, pData.b); As Boolean
Prototype  hidReadEx (pVendorID.l, pProductID.l,pData.b); As Boolean
; Prototype  hidReadEx (pVendorID.l, pSerialNumber.l, pData.b); As Boolean
Prototype  hidWriteEx (pVendorID.l, pProductID.l,ByRef.b); As Boolean
Prototype  hidGetVendorName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetProductName (pHandle.l, pText.s, pLen.l); As Long

Prototype  hidGetSerialNumber (pHandle.l, pText.s, pLen.l); As Long

;Prototype  hidGetSerialNumber (pHandle.l);        , pText.s, pLen.l); As Long
Prototype  hidGetVendorID (pHandle.l); As Long
Prototype  hidGetProductID (pHandle.l); As Long
;Prototype  hidGetSerialNumber (pHandle.l); As Long Helmut
Prototype  hidGetVersion (pHandle.l); As Long
Prototype  hidGetInputReportLength (pHandle.l); As Long
Prototype  hidGetOutputReportLength (pHandle.l); As Long
Prototype  hidGetHandle (pVendorID.l,  pProductID.l); As Long
Prototype  hidGetItem (pIndex.l); As Long
Prototype  hidGetItemCount (); As Long
Prototype  hidSetReadNotify (pHandle.l, pValue.b);
Prototype  hidIsReadNotifyEnabled (pHandle.l); As Boolean
Prototype  hidIsAvailable (pVendorID.l, pProductID.l);  As Boolean


Define mcHID_DLL.l = OpenLibrary(#PB_Any, "mcHID.dll")

If mcHID_DLL
    Global hidConnect.hidConnect = GetFunction(mcHID_dll,"Connect") ; (ByVal pHostWin As Long) As Boolean
    Global hidDisconnect.hidDisconnect = GetFunction(mcHID_dll,"Disconnect");  () As Boolean
    Global hidRead.hidRead = GetFunction(mcHID_dll,"Read");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidWrite.hidWrite = GetFunction(mcHID_dll,"Write");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidReadEx.hidReadEx = GetFunction(mcHID_dll,"ReadEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidWriteEx.hidWriteEx = GetFunction(mcHID_dll,"WriteEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidGetVendorName.hidGetVendorName = GetFunction(mcHID_dll,"GetVendorName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetProductName.hidGetProductName = GetFunction(mcHID_dll,"GetProductName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
   
   Global hidGetSerialNumber.hidGetSerialNumber = GetFunction(mcHID_dll,"GetSerialNumber");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    
    Global hidGetVendorID.hidGetVendorID = GetFunction(mcHID_dll,"GetVendorID");  (ByVal pHandle As Long) As Long
    Global hidGetProductid.hidGetProductid = GetFunction(mcHID_dll,"GetProductID");  (ByVal pHandle As Long) As Long
    Global hidGetVersion.hidGetVersion = GetFunction(mcHID_dll,"GetVersion"); (ByVal pHandle As Long) As Long
    Global hidGetInputReportLength.hidGetInputReportLength = GetFunction(mcHID_dll,"GetInputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetOutputReportLength.hidGetOutputReportLength = GetFunction(mcHID_dll,"GetOutputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetHandle.hidGetHandle = GetFunction(mcHID_dll,"GetHandle");  (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
    Global hidGetItem.hidGetItem = GetFunction(mcHID_dll,"GetItem");  (ByVal pIndex As Long) As Long
    Global hidGetItemCount.hidGetItemCount = GetFunction(mcHID_dll,"GetItemCount");  (ByVal pIndex As Long) As Long
    Global hidSetReadNotify.hidSetReadNotify = GetFunction(mcHID_dll,"SetReadNotify"); ByVal pHandle As Long, ByVal pValue As Boolean)
    Global hidIsReadNotifyEnabled.hidIsReadNotifyEnabled = GetFunction(mcHID_dll,"IsReadNotifyEnabled");  (ByVal pHandle As Long) As Boolean
    Global hidIsAvailable.hidIsAvailable = GetFunction(mcHID_dll,"IsAvailable"); (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
Else
    MessageRequester("Fehlermeldung", "Das Programm konnte die mcHID.dll Datei nicht öffnen", #PB_MessageRequester_Ok)
    End
EndIf
;}

ProcedureDLL mcHID_Free(); DLL FREE
  If mcHID_DLL
    CloseLibrary(#PB_Any)
  EndIf
  XLTable_DLL = 0
EndProcedure

;- Window Callback
Procedure WinProc(hWnd,Msg,wParam,lParam)
 result = #PB_ProcessPureBasicEvents
 
 If Msg = #WM_HID_EVENT
       
       Select wParam
           ; HID device has been plugged message...pVendoID.l,
        Case #NOTIFY_PLUGGED        
           DeviceHandle = hidGetHandle(#VendorID, #ProductID)
         
           If DeviceHandle
           If Flag=0 
              hidGetSerialNumber (DeviceHandle.l,ProductName,256)
                      
              SetGadgetText(#Text_Status1, "Nr.: "+ProductName)
              SetGadgetColor(#Text_Status, #PB_Gadget_BackColor, $00FF00)
              SetGadgetColor(#Text_Status1, #PB_Gadget_BackColor, $00FF00)
                  
              hidGetProductName (DeviceHandle.l,ProductName,256)
              SetGadgetText(#Text_Status, ProductName)
              Else 
              Flag=1
                hidGetSerialNumber (DeviceHandle.l,ProductName,256)         
              SetGadgetText(#Text_Status1,"Nr.: "+ProductName )
               SetGadgetText(#Text_DIGI_IN, "Gerät war wohl mal ausgefallen! Zustand eventuell nicht synchron !")
              SetGadgetColor(#Text_Status, #PB_Gadget_BackColor, $00FF00)
              SetGadgetColor(#Text_Status1, #PB_Gadget_BackColor, $0000FF)           
  
              hidGetProductName (DeviceHandle.l,ProductName,256)
              SetGadgetText(#Text_Status, ProductName)
              Flag=0         
           EndIf
           EndIf
        Case #NOTIFY_UNPLUGGED
           ;HID device has unplugged
           DeviceHandle = hidGetHandle(#VendorID, #ProductID)
           If Not DeviceHandle
              SetGadgetText(#Text_Status, "Gerät ist ")
              SetGadgetText(#Text_Status1, "ausgefallen !! ??")
               SetGadgetColor(#Text_Status, #PB_Gadget_BackColor, $0000FF)
              SetGadgetColor(#Text_Status1, #PB_Gadget_BackColor, $0000FF)
              Flag=1
              ;If Flag=1 
              ;SetGadgetText(#Text_Status,"Gerät ausgefallen")
              ;Flag=0 
              ;EndIf
           EndIf
        Case #NOTIFY_CHANGED
           ;HID device has been changed
           If DeviceHandle
              hidSetReadNotify (DeviceHandle, #True) ;read event...
              ;If Flag=1 
              ;SetGadgetText(#Text_Status,"Gerät ausgefallen")
              ;Flag=0 
              ;EndIf
           EndIf
          DeviceHandle = hidGetHandle(#VendorID, #ProductID)
          ;hidSetReadNotify (DeviceHandle, #True) ! IMPORTANT ! Read works only With this flag
        Case #NOTIFY_READ
           ; READ works only if the hidSetReadNotify flag is set
           If hidRead(DeviceHandle, @BufferIn(0))
              ;AddGadgetItem(#Listview_INPUT,0, "Read: "+Str(BufferIn(0)) +"/"+ Str(BufferIn(1))+"/"+Str(BufferIn(2))+"/"+Str(BufferIn(3))+"/"+Str(BufferIn(4))+"/"+Str(BufferIn(5))+"/"+Str(BufferIn(6))+"/"+Str(BufferIn(7))+"/"+Str(BufferIn(8)))

              If BufferIn(3) = 1 ; Taster 1
                 If BufferIn(6) & %01 = 1   
                    If Button_1 = 0
                        AddGadgetItem(#Listview_INPUT,0, "Button 1 at "+FormatDate("%hh:%ii:%ss", Date()))             
                        
                       Button_1 = 1
                    EndIf
                 Else
                    Button_1 = 0     
                 EndIf                   
                 If BufferIn(6) & %10 = 2 ; Taster 2
                    If Button_2 = 0
                       AddGadgetItem(#Listview_INPUT,0, "Button 2 at "+FormatDate("%hh:%ii:%ss", Date()))             
                       Button_2 = 1
                    EndIf
                 Else
                    Button_2 = 0     
                 EndIf
                 ;BufferIn(3)=244
                 AD_Wert = BufferIn(0)*256 ; LDR IN war 3
                 If BufferIn(1) > 0
                    AD_Wert = AD_Wert + BufferIn(4)
                 Else
                    AD_Wert = AD_Wert + 256 + BufferIn(2); war 4
                 EndIf
                 AD_Wert=266
                 SetGadgetState   (#Analog_LDR,1024-AD_Wert)
                 AD_Wert = BufferIn(2)*256 ; MIC IN
                 If BufferIn(3) > 0
                    AD_Wert = AD_Wert + BufferIn(5)
                 Else
                    AD_Wert = AD_Wert + 256 + BufferIn(5)
                 EndIf
                 SetGadgetState   (#Analog_MIC,AD_Wert)
              EndIf 
           Else
              AddGadgetItem(#Listview_INPUT,0, "Read Error!")
           EndIf
        EndSelect
   
   EndIf

 
  ProcedureReturn result
EndProcedure

;{ Mainunit
If Open_Window_0()

hidconnect (WindowID(#Window_0))
SetWindowCallback(@WinProc())

  BufferOut(1) = 31 ; Hauscode
  BufferOut(2) = 1 ; Steckdose
  BufferOut(3) = 0 ; O=Voreinstellung
  BufferOut(4) = 0; war 0, ist jetzt für die Zeit zuständig
  BufferOut(5) = 0 ; Welcher Port
  BufferOut(6) = 0 ; Daten
  BufferOut(7) = 0 ; 0 oder mit Zeit dann 128= Ausgang
  BufferOut(8) = 0 ; Zeitwert
  BufferOut(9) = 125; PWM1
  BufferOut(10) = 125 ; PWM2
  BufferOut(11) = 0 ; welcher anlog oder Tempwert
  BufferOut(12) = 0 ; noch frei ev Zähler
  
  
  
  
  hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

  Repeat
  
  
    EventID = WaitWindowEvent()
    
            
                 
    Select EventID
 
    Case #PB_Event_Gadget
 
      Select EventGadget()
         
      Case #Button_OUT1 ; Erweiterungsport Bit 1
          If GetGadgetState(#Button_OUT1)             
             BufferOut(1)=31
             BufferOut(2)=1 ; BCD codiert Steckdose A
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 1 EIN um "+FormatDate("%hh:%ii:%ss", Date()))
                         
          Else
             BufferOut(1)=31
             BufferOut(2)=1; BCD codiert Steckdose A
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 1 AUS "+FormatDate("%hh:%ii:%ss", Date()))              
          EndIf          
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT2 ; Erweiterungsport Bit 2
  If GetGadgetState(#Button_OUT2)             
             BufferOut(1)=31
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 2 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=31
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 2 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf         
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT3 ; Erweiterungsport Bit 3
          If GetGadgetState(#Button_OUT3)              
             BufferOut(1)=31
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 3 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=31
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 3 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf          
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out
          
          Case #Button_OUT4 ; Erweiterungsport Bit 1
          If GetGadgetState(#Button_OUT4)             
             BufferOut(1)=30; = %00011100
             BufferOut(2)=1 ; BCD codiert Steckdose A
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 4 EIN um "+FormatDate("%hh:%ii:%ss", Date()))              
          Else
             BufferOut(1)=30
             BufferOut(2)=1; BCD codiert Steckdose A
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 4 AUS "+FormatDate("%hh:%ii:%ss", Date()))              
          EndIf          
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT5 ; Erweiterungsport Bit 2
  If GetGadgetState(#Button_OUT5)             
             BufferOut(1)=30
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 5 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=30
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 5 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf         
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT6 ; Erweiterungsport Bit 3
          If GetGadgetState(#Button_OUT6)              
             BufferOut(1)=30
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 6 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=30
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 6 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf          
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out
         

      ;Case #Button_OUT4 ; Erweiterungsport Bit 4
      ;    If GetGadgetState(#Button_OUT4)
        ;     BufferOut(5)=%00000001
         ; hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out   
          ;Else
           ;   BufferOut(5)=%00000000
         ;' EndIf       
          ;hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      ;Case #Button_OUT5 ; Erweiterungsport Bit 5
       ;   If GetGadgetState(#Button_OUT5)
        ;         BufferOut(5)=%00000010
         ; Else
          ;       BufferOut(5)=%00000000
          ;'EndIf
       
          ;hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät

      ;Case #Button_OUT6 ; Erweiterungsport Bit 6
       ;      If GetGadgetState(#Button_OUT6)
        ;         BufferOut(5)=%00000100
         ; Else          
               ; BufferOut(5)=%00000000
                ; BufferOut(12)=%00010000; test geht nicht, da nur 8 Buffer bei MPZ
          ;EndIf
       
 
       Case #Button_OUT7 ; Erweiterungsport Bit 2
  If GetGadgetState(#Button_OUT7)             
             BufferOut(1)=%00011100 ; =28
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 7 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=28
             BufferOut(2)=2; BCD codiert Steckdose B
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 7 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf         
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT8 ; Erweiterungsport Bit 3
          If GetGadgetState(#Button_OUT8)              
             BufferOut(1)=28
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=1
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 8 EIN um "+FormatDate("%hh:%ii:%ss", Date()))   
          Else
             BufferOut(1)=28
             BufferOut(2)=4; BCD codiert Steckdose C
             BufferOut(3)=0
            AddGadgetItem(#Listview_INPUT,0, "Steckdose 8 AUS um "+FormatDate("%hh:%ii:%ss", Date()))   
          EndIf          
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out
         
     
     
     
    EndSelect
    
                   AD_Wert = BufferIn(4)*256 ; 
                 If BufferIn(4) > 0 ; w
                    AD_Wert = AD_Wert + BufferIn(3); 
                 Else
                    
                    AD_Wert = BufferIn(3) ; 
                 EndIf
                 
                 ;AddGadgetItem(#Listview_INPUT,0, "AD-Wert "+Str(AD_Wert))   
                 SetGadgetState   (#Analog_LDR,AD_Wert)
                 AD_Wert = BufferIn(1)*256 ; MIC IN war 6
                 If BufferIn(1) > 0 ; war 6
                    AD_Wert = AD_Wert + BufferIn(2); war 5
                 Else
                    AD_Wert = AD_Wert + BufferIn(2); war 5
                 EndIf
                 SetGadgetState   (#Analog_MIC,AD_Wert)
  
    
    
  EndSelect
  
    
Until EventID = #PB_Event_CloseWindow

  hidDisconnect ()
  mcHID_Free()
EndIf
End
;}
;

Re: HDI Interface unter Windows auslesen und Daten senden

Verfasst: 28.11.2009 02:12
von mpz
Hi Helmut,

ich muss gestehen das ich mich seit 1-2 Jahren nicht mehr damit beschäftigt habe. Ich hatte den Code nur wegen dem englischen Forum mal aktualisiert. Verstehe ich es richtig das Du zwei Geräte anschließt die durch eine "Seriennummer" getrennt sind ?!?

Gruß Michael

Re: HDI Interface unter Windows auslesen und Daten senden

Verfasst: 28.11.2009 02:46
von Helmut
Hallo Michael,
joo, hast es richtig verstanden.

Ich habe einen PIC 18F2550 und einen PIC 18F4550.
Beide Bausteine, je nach PIN-Möglichkeiten, können Baumarkt-Funksteckdosen ansteuern, 2x PWM, Port`s lesen schreiben, (zT. mit Zeitparameter), analoge Kanäle ausgeben, 2 Zähler mit EEpromabspeicherei.
Eigentlich dass, was du auch mal gebastelst hast.
Dann kommt noch Dallas Tempsensoren, und das Ansteuern des FHT8i, ( steuert Funkheizkörperventile von ELV an ).
Diese einzelnen Codes sind fertig, müssen noch in den Ur-Code rein. IR-RC5 uä. will ich noch reinbringen.

Und wenn Das soweit drin ist, will ich noch einen PI-Regler programmieren, dessen Parameter und dessen Ein- und Ausgänge sollen auch noch konfigurierbar sein. Das träume ich aber noch.

Und damit auch mehrere von diesen Bausteinen im PC möglich sind, werden die mit der Ser.-Nr. unterschieden.

Wenn du mal nach "Sixt" hier im Forum suchst, der hat was ähnliches für AVR`s gezaubert.

Gruß nach Berlin :allright:
Helmut