Game-Port abfragen über AutoIt?

  • Hallo,

    ich würde gerne den Zustand einer Sicherheitstüre abfragen (offen/geschlossen).

    Da in der Nähe ein PC steht, sieht meine Idee folgendermaßen aus:

    * Montage eines Schalters an der Türe, welcher seriell mit PC verbunden ist
    * AutoIt-Skript 1 (Client) überprüft den Zustand am seriellen Port und gibt ihn
    per Datei oder TCP weiter.
    * AutoIt-Skript 2 (Server) meldet sich, wenn Türe länger als 10 min offen.

    Zwei Wissenslücken müsste ich jedoch noch schließen um dies umzusetzen:
    * Wie frage ich in Autoit einen COM-Port ab bzw. den Zustand des Schalters?
    * Wie bekomme ich den Schalter an den seriellen Port (einfach die Drähtchen hinten rein stecken wird wohl nicht funktionieren, oder? :schild4: )

    Vielen Dank
    Viele Grüße
    Carsten

    Nachtrag:
    Bei meinen Recherchen bin ich auf eine weitere Idee gestoßen: Über den Gameport + AutoIt könnte eine einfache Tastenschaltung Programme steuern (z.B: Winamp - Lied vor/zurück). Wie schön wenn man mit einer Fernbedienung vom Sessel aus den Medienplayer steuern könnte.... ;) Ich gebe gerne weiter wie es funktioniert - wenn ich es weiß....

    2 Mal editiert, zuletzt von Carsten (7. Dezember 2007 um 19:16)

    • Offizieller Beitrag

    Viel kann ich dir nicht helfen.
    Über kommunikationsmöglichkeiten Autoit - Com-Port findest du hier viel Interessantes:
    http://www.autoitscript.com/forum/index.php?showtopic=19769&st=15

    Hier die übliche Beschaltung für RS232:
    Pin Funktion
    1 DCD (Data Carrier Detected - Gerät signalisiert Datenerkennung)
    2 RxD (Receive Data - Ltg. f. eingehende Daten)
    3 TxD (Transmit Data - Ltg. f. ausgehende Daten)
    4 DTR (Data Terminal Ready)
    5 GND (Ground - Signalmasse)
    6 DSR (Dataset Ready - logische 1 von externem Gerät f. Einsatzbereitschaft)
    7 RTS (Ready To Send)
    8 CTS (Clear to Send - wenn auf logisch 1, kann Gerät Daten entgegennehmen)
    9 RI (Ring Indicator - signalisiert Anruf)

  • Vielen Dank
    das ist schon mal ein Anfang.

    Sieht allerdings alles ziemlich kompliziert aus, weil ich mit der COM-Programmierung von AutoIt noch nicht viel gemacht habe.

    Aber ich schaue mir das genauer an - Danke

  • Hallo,
    kann mir jemand sagen wie ich das mit AutoIt realisieren kann? Das erinnert mich an meine Anfangsversuche am PC mit Assembler-Programmierung - so vor ca. 100 Jahren (?!? - fast) .. :)

    Spoiler anzeigen


    Ausgestattet sind PC-Joysticks mit zwei Tasten, die getrennt abgefragt werden können. ..... Für die Abfrage von Joysticks werden keine Software-Treiber benötigt, denn sowohl Hardware- als auch Software-Schnittstelle sind bereits beim Ur-PC definiert worden. Auf Hardware-Seite sind die Ports 200h bis 20Fh für die Joystick-Karte reserviert. Auf diese Ports, die standardisiert belegt sind, greift das BIOS zur Abfrage zurück.

    Position und Tastenstatus ermitteln
    Das BIOS stellt in der Funktion 84h des Interrupts 15h zwei Unterfunktionen 00h und 01h zur Verfügung, mit denen die Joysticks abgefragt werden können. Die Positionsabfrage erfolgt über die Unterfunktion 01h, bei deren Aufruf die Funktionsnummer 84h im AH-Register und die Unterfunktionsnummer 01h im DX-Refister präsent sein muß. danach enthält das CARRY-Flag ein LOW, wenn diese Funktion vom vorhandenen BIOS unterstützt wird, und in den Registern AX und BX bzw. CX und DX stehen die Werte der X-Achse und Y-Achse für Joystick 1 bzw. Joystick 2. Sind diese Werte Null, so ist kein Joystick angeschlossen. Werte ungleich Null repräsentieren jeweils die Stellung des Joysticks bzgl. der entsprechenden Achse. ..... Über die Unterfunktion 00h läßt sich der Tastenstatus abfragen. Auch dies muß ständig passieren, damit jeder Tastendruck durch den Anwender vom Programm registriert wird. Das AL-Register enth„lt nach dem Funktionsaufruf den Tastenstatus: .....

    Auszug von:
    http://www.tu-chemnitz.de/informatik/RA/…r/joystick.html

    Vielen Dank
    Carsten

  • muh_kuh: vielen dank - da sind 2 erfolgsversprechende Möglichkeiten dabei.

    Doch bei beiden habe ich ein weiteres Problem: dll in Autoit

    Da kenne ich mich gar nicht aus. Ich habe mir die AutoIt-Anleitung und andere Skript-Beispiele angeschaut. Aber ich glaube dazu fehlt mir das grundlegende Verständnis.

    Mir das anzueignen ist mir - ehrlich gesagt - zu aufwändig. Ich möchte kleine Hilfsprogramme machen, die den täglichen Ablauf bei uns im Büro verbessern, aber ich will kein Programmierer werden......

    Deshalb meine Frage / Bitte: Wie setze ich diesen Hinweis in AutoIt um?

    Description
    Opens the Game Controllers control panel applet up to the General section.
    In Windows 2000, you may add ',,1' to open to the Advanced Tab.
    In Windows ME, ',,1' to open up to the Controllers ID tab,
    and ',,2' to open to the Voice Chat tab (if installed)

    Syntax
    RunDll32.exe shell32.dll,Control_RunDLL joy.cpl

    Den Anfang in Autoit habe ich schon - aber wie geht es weiter?

    [autoit]

    $result = DllCall("shell32.dll", "int", "Control_RunDLL", "type-1", "param-1")

    [/autoit]


    Vielen Dank
    viele Grüße
    Carsten

  • Hallo,
    ich bin etwas weiter gekommen und wärme daher dieses ältere Thema wieder auf.......

    Im englischen Forum gibt es tatsächlich 2 Game-Port-UDFs, eine funktioniert bei mir:
    http://www.autoitscript.com/forum/index.…94&#entry323294

    Ich habe es mit einem alten Joystick probiert - das AutoIt-Tool zeigt die Werte wunderschön an.
    Um einen Schalter daran zu montieren habe ich das Kabel abgeschnitten (war ein alter.....) und
    die entsprechenden Drähte ermittelt - Schaltererkennung geht nicht mehr.....

    Ich zweifle inzwischen, ob der Gameport für eine Nutzung das Richtige ist.......
    Es ist so:
    4 Drähte sind für die Drehregler (Widerstände), 3 sind für die Schalter (erkennt man gut, wenn man das Ding aufschraubt und schaut wo sie hin führen).
    Aber auch die Drehregler-Kabel müssen angeschlossen werden, damit die Schalterdrähte reagieren.
    Also meine Lösung:
    die 4 Drähte werden alle zusammengeschlossen, d.h. kein Widerstand (Vollausschlag) - aber nicht wichtig.
    Die anderen 3 Drähte geben dann die Schalterstellung mit 0 1 2 3 an (je nachdem welche Drähte zusammengeschaltet werden)
    Das geht wirklich ganz einfach - ohne irgendwelche Technik.
    Aber wenn ich das Kabel aus dem PC ziehe, bleiben die letzten Werte erhalten -
    ob das für einen Schalter ausreicht, der erkennt, ob eine Sicherheitstüre offen ist, ist wohl mehr als fraglich *grins*

    Aber ich habe keine Sicherheitstüre, daher werde ich das ganze mal installieren und kann dann einen Langzeitbericht geben.
    Die Vorversuche heute waren nicht schlecht.

    Viele Grüße
    Carsten

  • Hier noch den Code welchen ich benutzt habe, konnte ihn oben nicht einfügen, weil die Nachricht sonst die erlaubten 10000 Zeichen überschritten hätte.
    (hatte zumindest so eine Fehlermeldung)

    Spoiler anzeigen

    ;____________________________________________________________________
    ; Original program by Ejoc ;
    ; Improved by Adam1213 (autoit 3.2 compatiblity + improved labels ;
    ;____________________________________________________________________

    #include

    ;_________________ SETUP_____________________________________
    Local $joy,$coor,$h,$s,$msg

    $joy = _JoyInit()

    dim $labels_text[8]=['X', 'Y', 'Z', 'R', 'U', 'V', 'POV', 'Buttons']
    dim $labels_no=UBound($labels_text)
    dim $labels[$labels_no]
    dim $labels_value[$labels_no]
    ;__________ CONFIG ____________________________________________
    ;---------- Find the max length of the longest label --------------
    $label_len=0
    for $text in $labels_text
    $len=stringlen($text)
    if $len>$label_len then
    $label_len=$len
    endif
    next
    $label_len*=6
    ;_____________ GUI _______________________________________________
    GUICreate('Joystick Test', 200, 200)
    GUICtrlCreateLabel('Joystick', 40, 20, 100, 20)

    for $i=0 to $labels_no-1
    GuiCtrlCreatelabel($labels_text[$i]&':', 10, 60+$i*12, $label_len, 12)
    $labels[$i]=GuiCtrlCreatelabel('', 10+$label_len, 60+$i*12, 70, 12)
    $labels_value[$i]=''
    next
    GUISetState()
    ;_____________________________________________________________________

    while 1
    $coord=_GetJoy($joy,0)
    for $i=0 to UBound($coord)-1
    if $coord[$i]<>$labels_value[$i] then
    GUICtrlSetData($labels[$i], $coord[$i])
    $labels_value[$i]=$coord[$i]
    endif
    next
    sleep(10)
    $msg =GUIGetMSG()
    if $msg = $GUI_EVENT_CLOSE Then Exitloop
    WEnd

    $lpJoy=0 ; Joyclose

    ;======================================
    ; _JoyInit()
    ;======================================
    Func _JoyInit()
    Local $joy
    Global $JOYINFOEX_struct = "dword[13]"

    $joy=DllStructCreate($JOYINFOEX_struct)
    if @error Then Return 0
    DllStructSetData($joy, 1, DllStructGetSize($joy), 1);dwSize = sizeof(struct)
    DllStructSetData($joy, 1, 255, 2) ;dwFlags = GetAll
    return $joy
    EndFunc

    ;======================================
    ; _GetJoy($lpJoy,$iJoy)
    ; $lpJoy Return from _JoyInit()
    ; $iJoy Joystick # 0-15
    ; Return Array containing X-Pos, Y-Pos, Z-Pos, R-Pos, U-Pos, V-Pos,POV
    ; Buttons down
    ;
    ; *POV This is a digital game pad, not analog joystick
    ; 65535 = Not pressed
    ; 0 = U
    ; 4500 = UR
    ; 9000 = R
    ; Goes around clockwise increasing 4500 for each position
    ;======================================
    Func _GetJoy($lpJoy,$iJoy)
    Local $coor,$ret

    Dim $coor[8]
    DllCall("Winmm.dll","int","joyGetPosEx", _
    "int",$iJoy, _
    "ptr",DllStructGetPtr($lpJoy))

    if Not @error Then
    $coor[0] = DllStructGetData($lpJoy,1,3)
    $coor[1] = DllStructGetData($lpJoy,1,4)
    $coor[2] = DllStructGetData($lpJoy,1,5)
    $coor[3] = DllStructGetData($lpJoy,1,6)
    $coor[4] = DllStructGetData($lpJoy,1,7)
    $coor[5] = DllStructGetData($lpJoy,1,8)
    $coor[6] = DllStructGetData($lpJoy,1,11)
    $coor[7] = DllStructGetData($lpJoy,1,9)
    EndIf

    return $coor
    EndFunc

    Edit peethebee: Limit auf 100.000 Zeichen gesetzt.

    Einmal editiert, zuletzt von peethebee (7. Dezember 2007 um 19:19)