Mausbewegung (ehem:USB-Schnittstelle)

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Martin66119 »

Einen schönen guten Tag!

Da ich nicht recht versiert im programmieren bin, hoffe ich dass ich hier Hilfe finde.

Kann mir jemand mal ein Beispiel geben, wie man Daten von einem USB-Port einlesen kann. Z.B. An einer USB-Schnittstelle ist eine Maus angeschlossen und nun möchte ich wissen wie man die Impulse zählen kann, wenn man die Maus bewegt.

Danke für eure Hilfe.

Martin

Topic korrigiert, siehe unten - Kaeru fecit
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: USB-Schnittstelle

Beitrag von DarkDragon »

Das ist leider nicht so einfach. Was verstehst du denn unter Impulse?! Zwischen dem Prozessor und dem USB Port steht meistens ein UART o.ä. und die Originalimpulse gehen verloren auf dem Weg zum Prozessor. Das einzige was du machen kannst sind die HID Deskriptoren auslesen, aber selbst das ist mehr als aufwändig und mit PureBasic kaum möglich, da man dazu einen USB Treiber zwischenrein stellen müsste.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: USB-Schnittstelle

Beitrag von WPö »

Habe kein Beispiel zur Hand und wie man direkt von USB liest, weiß ich auch nicht. Derzeit kann ich Dir nur ein paar Infos drumherum geben.

Vielleicht hilft Dir, daß seit den Zeiten der Seriell-Mäuse keine Impulse mehr übertragen werden, sondern Datenpakete, die die Anzahl der vertikalen und horizontalen Impulse enthalten. Das wird durch das BIOS 75-120 mal pro Sekunde abgefragt. Ein Datenprotokoll, das in P/S-2 verwendet wird und evtl. auch noch in USB, ist hier zu finden: http://www.computer-engineering.org/ps2mouse/.

Wenn es sich um eine andere Übertragung handeln sollte, etwa irgendwelche Werte per Seriell-zu-USB-Umsetzer, wird PC-intern die Verbindung mit einer emulierten Seriell-Verbindung hergestellt. Somit kannste einen Datentransfer mit dem Mikrokontroller machen, wie ich bei einem Mini-Digital-Oszilloskop mit µC.

Sag bitte Bescheid, ob das etwas weiterhalf.

Grüße - WPo
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: USB-Schnittstelle

Beitrag von Martin66119 »

Hallo und einen schönen guten Tag!

Bin leider heute erst dazugekommen im Forum nachzuschauen. Folgendes wollte ich machen.

Im "Hardware-Forum" ist ein Thema eingestellt bei dem es um die Messung einer Wegstrecke mit der Mouse geht.

Nundachte ich, dass es in PB eine Funktion oder auch einen "recht einfachen Code" gibt, mit dem man die Bewegung der Mouse (z.B. wie viel cm wurde die Mouse über das Mousepad" bewegt) ermitteln kann.

Grüße
Martin
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: USB-Schnittstelle

Beitrag von Kaeru Gaman »

der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.

ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus,
weil der sozusagen automatisch X = X - DeltaX : IF X < 0 : X = 0 macht.


du siehst, da auf USB zugreifen zu wollen bist du komplett aufm falschen Dampfer, hättest gleich nach Mausbewegung fragen können.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Martin66119 »

Einen schönen guten Morgen!

An die Funktion MouseX hatte ich gedacht. Damit kann man aber doch nur die Mousebewegung ermitteln solange die Mouse auf dem Bildschirm ist. Wenn ich aber z.B. ein Stück Papier unbekannter Länge (z.B. 150cm) unter der Mouse hindurchziehe möchte ich aber gerne die Länge der Papiers ermitteln. Das Ergebnis sollte also 150cm sein.


Gruß
Martin
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: USB-Schnittstelle

Beitrag von Kaeru Gaman »

Kaeru Gaman hat geschrieben:der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.

ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus
bitte lesen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

Ich glaube, dass das nicht das Problem lösen wird. Wenn ich es richtig verstehe, willst Du deine Maus als "Maßband" missbrauchen?!!? Du willst Deine Maus über ein Holzbrett ziehen können und die Software soll Dir die Länge des Brettes ausgeben? Eine lustige Idee. Wenn ich es richtig sehe, dann wirst Du hier mit MouseDeltaX() aber nicht weiterkommen, da hier ja nur die Pixel ausgegeben werden. Das ist aber eine relative Größe, denn wie groß ist ein Pixel? Das hängt schließlich von der Lochmaske des Bildschirms und der verwendeten Auflösung ab. Ich habe auch noch nie mit MouseDeltaX() gearbeitet. Ich wollte das mal testen, nun läuft der Mist aber nicht. Was hab ich denn falsch gemacht?

Code: Alles auswählen

; INITIALISIERUNG

InitSprite()
InitMouse()

; HAUPTPROGRAMM

OpenScreen(1024,768,32,"Test")
StartTime=ElapsedMilliseconds()+1000
Debug ExamineMouse()

Repeat
NowTime = ElapsedMilliseconds()
If NowTime >= StartTime
 ClearScreen(0)
 pixel=MouseDeltaX()
 StartTime = ElapsedMilliseconds()+1000
 z=z+1
 StartDrawing(ScreenOutput())
 BackColor(0)
 FrontColor($ffffff)
 DrawText(0,0,"Maus wurde in der letzen Sekunde um " + Str(pixel) + " Pixel bewegt.")
 DrawText(0,30,"MouseX= " + Str(MouseX()))
 DrawText(0,50,"MouseY= " + Str(MouseY()))
StopDrawing()
FlipBuffers()
Debug ExamineMouse()
EndIf

Until z=10
ExamineMouse() gibt nur beim ersten Aufruf 1 aus, sonst 0...
(Win 11 64-bit, PB 6.04 und 6.10)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

warum debuggst du den Rückgabewert von ExamineMouse?
außerdem muss das bei jedem Schleifendurchlauf aufgerufen werden, das aktualisiert die werte.
wieso debuggst du überhaupt was während eines Fullscreens?
... war das das erste mal dass du überhaupt was mit der Screen Mouse machst?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

Ich musste feststellen, dass ich MouseDeltaX() nicht auslesen konnte (immer 0). Ich habe zuerst mit einem Fenster und einer Console, die die Daten ausgeben sollte, gearbeitet. Dann dachte ich, dass es wohl nur mit dem aktiven Screen geht, deshalb der OpenScreen(). Ich habe ExamineMouse() debugged, um zu sehen, ob 0 oder 1. Und schließlich ist das doch auch der Fehler. Wieso muss ich ExamineMouse() bei jedem Schleifendurchlauf aufrufen? Außerdem möchte ich doch die "Pixelstrecke" auslesen, die innerhalb von einer Sekunde verschoben wurde...
Wovon ist denn ExamineMouse() abhängig? Tatsächlich: Wenn ist den Befehl in die Schleife schreibe, dann funktioniert es, aber warum nur dann?
(Win 11 64-bit, PB 6.04 und 6.10)
Antworten