IOW 40 16 x 8 Tastermatrix

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
rolf55
Posts: 21
Joined: Tue May 16, 2006 2:15 pm
Location: Berlin
Contact:

IOW 40 16 x 8 Tastermatrix

Post by rolf55 »

Hallo,
Ich möchte eine 16 x 8 Tastermatrix porgamieren.
Ich habe die Version1.0.3 des IOW40.
Irgendwie bekomme ich es aber nicht hin.

Code: Select all

Public Class Form1
      Public Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        ' ---------------------------------iow initialisieren-----------------------------
        ' Alle IOW öffnen
        iowHandles(0) = IowKitOpenDevice()
        ' wenn fehler
        If iowHandles(0) = 0 Then
            ' Beenden und Fehler anzeigen
            MsgBox("Can not open IOW device!", 0, "Error")
            End
        End If
        ' Wieviele IOW gibt es im System?
        numIows = IowKitGetNumDevs()
        ' verpasse jedem IOW ein Handle
        For I = 2 To numIows
            iowHandles(I - 1) = IowKitGetDeviceHandle(I)
        Next I
        'Serialnummern der IOW auslesen und anzeigen
        I = IowKitGetSerialNumber(iowHandles(0), S(0))
        TextBox1.Text = System.Text.UnicodeEncoding.Unicode.GetString(S)
        TextBox1.Text = "FMC   " & TextBox1.Text
        TextBox1.Refresh()
        Dim initdata(7) As Byte
        'Tastenmatrix einschalten 8 x 16
        initdata(0) = &H18
        initdata(1) = &H2
        res = IowKitWrite(iowHandles(0), IOW_PIPE_SPECIAL_MODE, initdata(0), 8)
        Timer1.Enabled = True
       
    End Sub

    
        '######################    HAUPTSCHLEIFE  #############################################################
    Public Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        TextBox2.Text = "Timer läuft!"
        TextBox2.BackColor = Color.ForestGreen
        schalter_einlesen() 'von IOW

    End Sub
    
    '##############################################tasten un schalter  einlesen#########################
    Private Sub schalter_einlesen()
        Dim data0(8) As Byte
        Dim data1(8) As Byte
        Dim data2(8) As Byte
        Dim data3(8) As Byte
        Dim res As Long
        Dim ii, ak As Integer
        ii = 0
        ak = 0

        res = IowKitReadNonBlocking(iowHandles(0), IOW_PIPE_SPECIAL_MODE, data0(0), 8)
        If data0(0) = &H1A Then ' Taste oder Schalter wurde verändert, dann ins Array einlesen, sonst überspringen
            For ak = 1 To 8 '1-8
                Taste(ii) = Ist_Bit_Gesetzt(data0(1), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '9-16
                Taste(ii) = Ist_Bit_Gesetzt(data0(2), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '17-24
                Taste(ii) = Ist_Bit_Gesetzt(data0(3), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '25-32
                Taste(ii) = Ist_Bit_Gesetzt(data0(4), ak)
                ii = ii + 1
            Next ak
            res = IowKitReadNonBlocking(iowHandles(0), IOW_PIPE_SPECIAL_MODE, data1(0), 8)

            For ak = 1 To 8 '33-40
                Taste(ii) = Ist_Bit_Gesetzt(data1(1), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '41-48
                Taste(ii) = Ist_Bit_Gesetzt(data1(2), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '49-56
                Taste(ii) = Ist_Bit_Gesetzt(data1(3), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '57-64
                Taste(ii) = Ist_Bit_Gesetzt(data1(4), ak)
                ii = ii + 1
            Next ak
        End If
        '-----------------------------------------------------------------------------------------------------------------
        ii = 65
        res = IowKitReadNonBlocking(iowHandles(0), IOW_PIPE_SPECIAL_MODE, data2(0), 8)
        If data2(0) = &H1C Then
            For ak = 1 To 8 '65-72
                Taste(ii) = Ist_Bit_Gesetzt(data2(1), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '73-80
                Taste(ii) = Ist_Bit_Gesetzt(data2(2), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '81-88
                Taste(ii) = Ist_Bit_Gesetzt(data2(3), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '89-96
                Taste(ii) = Ist_Bit_Gesetzt(data2(4), ak)
                ii = ii + 1
            Next ak
            res = IowKitReadNonBlocking(iowHandles(0), IOW_PIPE_SPECIAL_MODE, data3(0), 8)
            For ak = 1 To 8 '97-104
                Taste(ii) = Ist_Bit_Gesetzt(data3(1), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '105-112
                Taste(ii) = Ist_Bit_Gesetzt(data3(2), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '113-120
                Taste(ii) = Ist_Bit_Gesetzt(data3(3), ak)
                ii = ii + 1
            Next ak
            For ak = 1 To 8 '121-128
                Taste(ii) = Ist_Bit_Gesetzt(data3(4), ak)
                ii = ii + 1
            Next ak
        End If

        Dim nummer As Long
        For nummer = 0 To 255
            If Taste(nummer) = True Then
                LabArray(nummer).BackColor = Color.Red
            Else
                LabArray(nummer).BackColor = Color.Green
            End If
        Next
        
    End Sub


    Public Function Ist_Bit_Gesetzt(ByVal value As Integer, ByVal bitNumber As Integer) As Boolean
        Dim mask As Integer = 1 << bitNumber
        Return (value And mask)
    End Function
    Public Sub Setze_Bit(ByRef value As Integer, ByVal bitNumber As Integer)
        Dim mask As Integer = 1 << bitNumber
        value = value Or mask
    End Sub
    Public Sub Lösche_Bit(ByRef value As Integer, ByVal bitNumber As Integer)
        Dim mask As Integer = 1 << bitNumber
        value = value And Not mask
    End Sub
    Function bcd2dec(bcd As Byte) As String

        bcd2dec = (bcd And &HF0) / &H10 * 10 + (bcd And &HF)

    End Function

End Class
Ich erhalte immer nur die erste 8x8 Matrix angezeigt. Irgend was stimmt mit meinem Code nicht.
Kann jemand bitte helfen?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by Guido Körber »

Wenn ich den Code richtig interpretiere, dann werden die Reports in einer bestimmten Reihenfolge erwartet?

Keine gute Idee das voraus zu setzen. Der IOW40 sendet die Reports in absteigender Reihenfolge.
rolf55
Posts: 21
Joined: Tue May 16, 2006 2:15 pm
Location: Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by rolf55 »

Im Grunde ist der Code ein Polling über den Timer.
Es wird nur nach geschaut ob irgend wo, nach einem $1A, bzw $1C ein Bit gesetzt ist oder nicht.
Die Reihenfolge ist nur programmseitg um den gefundenen Tasten Nummern zu zu ordnen. Damit ich sie später mit "If taste(x) = true then" auswerten kann.
Es sind 3 16 x 8 und 4 8 x8 Tastenfelder im Projekt. (Flugsimulator)
Es funktioniert wie gesagt alles, nur werden im 16x8 die ersten 64 Taster angezeigt in der Rest nicht. Ich hab da irgend einen Denkfehler.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by Guido Körber »

IowKitReadNonBlocking liefert nicht notwendigerweise Daten zurück. Wenn keine da sind, kommt 0 als Resultat zurück. Das wird aber hier nicht abgefragt.
rolf55
Posts: 21
Joined: Tue May 16, 2006 2:15 pm
Location: Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by rolf55 »

Ich frage mit
If data2(0) = &H1C Then
...........

D.H , wenn der report &H1c erscheint, müsen auch Bits vorhanden, (Schalter), oder verändert (Taster), sein.
Wenn ich &H1A abfrage, stimmt alles. Frage ich nach &H1C, bekomme ich keine Antwort.
Ich weiß, das es an meinem Code, und nicht am IOW liegt.
Ich komme einfach nicht weiter.
Es soll so funktionieren, wie im " All in ONE", da funktioniert ja alles, also habe ich auch keine Verdratungsfehler drin.
Ich komme einfach nicht weiter.
Die gesamte Auswertung der 8x8 Felder klappt, auch die Auswertung der LED anzeigen, immerhin 1060 LED aus 4 IOW.
Nur ...wie gesagt 16 x 8 klappt nicht.
rolf55
Posts: 21
Joined: Tue May 16, 2006 2:15 pm
Location: Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by rolf55 »

Um Fragen vorzubeugen 1060 LED sind wirklich notwendig um die 7-Segment Anzeigen zu bedienen, und davon gibt es im Cockpit zahlreiche.
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by Christoph Jung »

Stimmen denn die ReportIDs von denen gelesen wird? Ich sehe hier nur &H1A und &H1C
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by Guido Körber »

Das war was ich meinte. Der IO-Warrior sendet die Reports mit den IDs $19, $1A, $1B, $1C für die Tastenmatrix. Die Anwendung hat keinen Einfluss darauf in welcher Reihenfolge und wann diese Reports kommen.

Das virliegende Programm macht die Annahme, dass der Report $1A direkt nach dem Report $1B kommt und bereits da ist, wenn das zweite mal IowKitReadNonBlocking aufgerufen wird. Da weder die Abfrage erfolgt, ob neue Daten angekommen sind, noch ob es der Report mit der richtigen ID ist, wird hier mit sehr hoher Wahrschenlichkeit noch mal der Report $1C ausgewertet.

Das Gleiche gilt für die Reports $19/$1A.
rolf55
Posts: 21
Joined: Tue May 16, 2006 2:15 pm
Location: Berlin
Contact:

Re: IOW 40 16 x 8 Tastermatrix

Post by rolf55 »

Danke für die Antwort. Ich probiere weiter.
Post Reply