INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
15.12.2020, 14:51 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2020 14:55 von Arduino4Fun.)
Beitrag #1
Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Hallo,

habe ein wenig mit der Mouse Library "gespielt" und ich hatte einige komische Effekte. Ein Mouse.move( 100,100 ) hat den Zeiger um 150 Pixel versetzt. Nach und nach habe ich dann das Thema verstanden. Ich verwende ein Monitor mit max. Auflösung 3840x2160 (zeigt auch die Windows Anzeigeeinstellung). Da die Schrift auf dem Monitor zu klein erscheint, habe ich Skalierung auf 150% eingestellt.
A. Damit ist die sichtbare Auflösung tatsächlich nur 2650x1440, habe dies mit einem kleinen Delphi Programm über Mouse.CursorPos.X,Mouse.CursorPos.Y verifiziert
B. Über die Mouse Library erfolgt nun die Skalierung, so dass nicht der übergebene Wert sondern Wert*Skalierung gestellt wird
C. Weiterhin kann die Mouse Library nur relative Position und +/-127 Schritte stellen

Über Suchmaschine habe ich eine absolute Mouse Library gefunden, welche Bildschirmauflösung berücksichtigt und 2 Byte x,y positionieren kann, leider aber nicht relativ.
zu A. Bildschirmauflösung wird als Parameter übergeben
zu B. Es werden dann tatsächlich nur die 100 gestellt
zu C. Absolut und 2 Byte

Kennt jemand eine Mouse Library, welche mit Bildschirmauflösung/Skalierung und Absolut+Relativ umgehen kann? Oder Hinweise geben, wie ich beide Funktionalitäten in einer Lib verbinden kann.

Habe mir die Struktur _hidReportDescriptor angeschaut, werde aber nicht ganz schlau, insbesondere bzgl. 0x81, 0x0x, // INPUT

Gruß Arduino4Fun
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 14:58
Beitrag #2
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Eigentlich brauchst Du Dir doch nur immer die aktuelle Mausposition zu merken und wenn Du relativ positionieren willst, die neue absolute Position aus der alten Position und den Relativwerten zu berechnen. Und dann mit der Absolut-Lib arbeiten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 15:03
Beitrag #3
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Hallo Tommy,

danke für die Antwort. Grundsätzlich ja. Aber es ist schon mühsam, mit max. +/- 127 den Mouse Cursor zuerst in eine definierte Ausgangspostion zu bringen z.B. 0|0 und dann relativ auf eine absolute Position zu bringen und dabei auch noch die eingestellte Skalierung zu berücksichtigen (umrechnen).
Mit absmouse ist die ein einziger Aufruf mit passenden Schritte zur Bildschirmauflösung.
Geht zwar, ist fehlerbehaftet und es geht ja viel einfacher - die Lib zeigt es

Gruß Arduino4Fun
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 15:16
Beitrag #4
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Du hast nicht verstanden, was ich Dir geschrieben habe.

Du arbeitest mit der Absolut-Lib und bewegst im Setup die Maus auf 0,0, damit hast Du altX = 0, altY=0.
Dann willst Du um 500 Punkte nach rechts und 2000 Punkte nach unten, also altX += 500, altY+=200; absolut positionieren auf altX,altY usw.

Wenn Du das geschickt in eine Funktion verpackst, kannst Du beliebig absolute und relative Positionen mischen. Evtl. noch prüfen, dass die Koordinaten nicht negativ oder größer als der Bildschirm werden.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 15:38 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2020 15:38 von Arduino4Fun.)
Beitrag #5
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Hi Tommy,

warum einfach wennn es schrieriger geht Rolleyes

War fokusiert auf Lösung Lib "alt". Mal sehen, was ich mit Mouse Wheel mache ...

Gruß Arduino4Fun
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 15:45
Beitrag #6
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Im Prinzip könntest Du die Methode moveRel(int16_t x, int16_t y) auch in der AbsMouse-Lib ergänzen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 16:04
Beitrag #7
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Mal ungetestet als MyMouse:

MyMouse.h
Code:
#pragma once

// basiert auf https://github.com/jonathanedgecombe/absmouse

#include "HID.h"

#if !defined(_USING_HID)

#warning "AbsMouse not compatible with this device and/or firmware"

#else

#define MOUSE_LEFT 0x01
#define MOUSE_RIGHT 0x02
#define MOUSE_MIDDLE 0x04

class MyMouse_
{
private:
  uint8_t _buttons;
  uint16_t _x;
  uint16_t _y;
  uint32_t _width;
  uint32_t _height;
  bool _autoReport;
  uint16_t oldX = 0;
  uint16_t oldY = 0;

public:
  MyMouse_(void);
  void init(uint16_t width = 32767, uint16_t height = 32767, bool autoReport = true);
  void report(void);
  void move(uint16_t x, uint16_t y);
  void moveRel(int16_t x, int16_t y);
  void press(uint8_t b = MOUSE_LEFT);
  void release(uint8_t b = MOUSE_LEFT);
};
extern MyMouse_ MyMouse;

#endif

MyMouse.cpp
Code:
#include "MyMouse.h"

#if defined(_USING_HID)

static const uint8_t HID_REPORT_DESCRIPTOR[] PROGMEM = {
  0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
  0x09, 0x02,        // Usage (Mouse)
  0xA1, 0x01,        // Collection (Application)
  0x09, 0x01,        //   Usage (Pointer)
  0xA1, 0x00,        //   Collection (Physical)
  0x85, 0x01,        //     Report ID (1)
  0x05, 0x09,        //     Usage Page (Button)
  0x19, 0x01,        //     Usage Minimum (0x01)
  0x29, 0x03,        //     Usage Maximum (0x03)
  0x15, 0x00,        //     Logical Minimum (0)
  0x25, 0x01,        //     Logical Maximum (1)
  0x95, 0x03,        //     Report Count (3)
  0x75, 0x01,        //     Report Size (1)
  0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x95, 0x01,        //     Report Count (1)
  0x75, 0x05,        //     Report Size (5)
  0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
  0x09, 0x30,        //     Usage (X)
  0x09, 0x31,        //     Usage (Y)
  0x16, 0x00, 0x00,  //     Logical Minimum (0)
  0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
  0x36, 0x00, 0x00,  //     Physical Minimum (0)
  0x46, 0xFF, 0x7F,  //     Physical Maximum (32767)
  0x75, 0x10,        //     Report Size (16)
  0x95, 0x02,        //     Report Count (2)
  0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,              //   End Collection
  0xC0               // End Collection
};

MyMouse_::MyMouse_(void) : _buttons(0), _x(0), _y(0)
{
  static HIDSubDescriptor descriptorNode(HID_REPORT_DESCRIPTOR, sizeof(HID_REPORT_DESCRIPTOR));
  HID().AppendDescriptor(&descriptorNode);
}

void MyMouse_::init(uint16_t width, uint16_t height, bool autoReport)
{
  _width = width;
  _height = height;
  _autoReport = autoReport;
}

void MyMouse_::report(void)
{
  uint8_t buffer[5];
  buffer[0] = _buttons;
  buffer[1] = _x & 0xFF;
  buffer[2] = (_x >> 8) & 0xFF;
  buffer[3] = _y & 0xFF;
  buffer[4] = (_y >> 8) & 0xFF;
  HID().SendReport(1, buffer, 5);
}

void MyMouse_::move(uint16_t x, uint16_t y)
{
  oldX = x;
  oldY = y;
  _x = (uint16_t) ((32767l * ((uint32_t) x)) / _width);
  _y = (uint16_t) ((32767l * ((uint32_t) y)) / _height);

  if (_autoReport) {
    report();
  }
}

void MyMouse_::moveRel(int16_t x, int16_t y) {
  uint16_t newX = oldX + x;
  uint16_t newY = oldY + y;
  // Grenzen prüfen
  if (newX < 0) newX = 0;
  if (newY < 0) newY = 0;
  if (newX > _width) newX = _width;
  if (newY > _height) newY = _height;
  move(newX,newY);
}

void MyMouse_::press(uint8_t button)
{
  _buttons |= button;

  if (_autoReport) {
    report();
  }
}

void MyMouse_::release(uint8_t button)
{
  _buttons &= ~button;

  if (_autoReport) {
    report();
  }
}

MyMouse_ MyMouse;

#endif

Beispiel.ino
Code:
#include "MyMouse.h"

void setup() {
  MyMouse.init(1920, 1080);
}

void loop() {
  // do some stuff
  MyMouse.move(500, 200);
  MyMouse.moveRel(200,-100);
  MyMouse.press(MOUSE_LEFT);
  MyMouse.release(MOUSE_LEFT);
  // do some other stuff
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2020, 16:06
Beitrag #8
RE: Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung
Mal ungetestet als MyMouse:

MyMouse.h
Code:
#pragma once

// basiert auf https://github.com/jonathanedgecombe/absmouse

#include "HID.h"

#if !defined(_USING_HID)

#warning "AbsMouse not compatible with this device and/or firmware"

#else

#define MOUSE_LEFT 0x01
#define MOUSE_RIGHT 0x02
#define MOUSE_MIDDLE 0x04

class MyMouse_
{
private:
  uint8_t _buttons;
  uint16_t _x;
  uint16_t _y;
  uint32_t _width;
  uint32_t _height;
  bool _autoReport;
  uint16_t oldX = 0;
  uint16_t oldY = 0;

public:
  MyMouse_(void);
  void init(uint16_t width = 32767, uint16_t height = 32767, bool autoReport = true);
  void report(void);
  void move(uint16_t x, uint16_t y);
  void moveRel(int16_t x, int16_t y);
  void press(uint8_t b = MOUSE_LEFT);
  void release(uint8_t b = MOUSE_LEFT);
};
extern MyMouse_ MyMouse;

#endif

MyMouse.cpp
Code:
#include "MyMouse.h"

#if defined(_USING_HID)

static const uint8_t HID_REPORT_DESCRIPTOR[] PROGMEM = {
  0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
  0x09, 0x02,        // Usage (Mouse)
  0xA1, 0x01,        // Collection (Application)
  0x09, 0x01,        //   Usage (Pointer)
  0xA1, 0x00,        //   Collection (Physical)
  0x85, 0x01,        //     Report ID (1)
  0x05, 0x09,        //     Usage Page (Button)
  0x19, 0x01,        //     Usage Minimum (0x01)
  0x29, 0x03,        //     Usage Maximum (0x03)
  0x15, 0x00,        //     Logical Minimum (0)
  0x25, 0x01,        //     Logical Maximum (1)
  0x95, 0x03,        //     Report Count (3)
  0x75, 0x01,        //     Report Size (1)
  0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x95, 0x01,        //     Report Count (1)
  0x75, 0x05,        //     Report Size (5)
  0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
  0x09, 0x30,        //     Usage (X)
  0x09, 0x31,        //     Usage (Y)
  0x16, 0x00, 0x00,  //     Logical Minimum (0)
  0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
  0x36, 0x00, 0x00,  //     Physical Minimum (0)
  0x46, 0xFF, 0x7F,  //     Physical Maximum (32767)
  0x75, 0x10,        //     Report Size (16)
  0x95, 0x02,        //     Report Count (2)
  0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,              //   End Collection
  0xC0               // End Collection
};

MyMouse_::MyMouse_(void) : _buttons(0), _x(0), _y(0)
{
  static HIDSubDescriptor descriptorNode(HID_REPORT_DESCRIPTOR, sizeof(HID_REPORT_DESCRIPTOR));
  HID().AppendDescriptor(&descriptorNode);
}

void MyMouse_::init(uint16_t width, uint16_t height, bool autoReport)
{
  _width = width;
  _height = height;
  _autoReport = autoReport;
}

void MyMouse_::report(void)
{
  uint8_t buffer[5];
  buffer[0] = _buttons;
  buffer[1] = _x & 0xFF;
  buffer[2] = (_x >> 8) & 0xFF;
  buffer[3] = _y & 0xFF;
  buffer[4] = (_y >> 8) & 0xFF;
  HID().SendReport(1, buffer, 5);
}

void MyMouse_::move(uint16_t x, uint16_t y)
{
  oldX = x;
  oldY = y;
  _x = (uint16_t) ((32767l * ((uint32_t) x)) / _width);
  _y = (uint16_t) ((32767l * ((uint32_t) y)) / _height);

  if (_autoReport) {
    report();
  }
}

void MyMouse_::moveRel(int16_t x, int16_t y) {
  uint16_t newX = oldX + x;
  uint16_t newY = oldY + y;
  // Grenzen prüfen
  if (newX < 0) newX = 0;
  if (newY < 0) newY = 0;
  if (newX > _width) newX = _width;
  if (newY > _height) newY = _height;
  move(newX,newY);
}

void MyMouse_::press(uint8_t button)
{
  _buttons |= button;

  if (_autoReport) {
    report();
  }
}

void MyMouse_::release(uint8_t button)
{
  _buttons &= ~button;

  if (_autoReport) {
    report();
  }
}

MyMouse_ MyMouse;

#endif

Beispiel.ino
Code:
#include "MyMouse.h"

void setup() {
  MyMouse.init(1920, 1080);
}

void loop() {
  // do some stuff
  MyMouse.move(500, 200);
  delay(500);
  MyMouse.moveRel(200,-100);
  MyMouse.press(MOUSE_LEFT);
  MyMouse.release(MOUSE_LEFT);
  // do some other stuff
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  MOBA-Steuerung per Android Merino 20 1.780 27.04.2021 20:03
Letzter Beitrag: Merino
  Problem mit "Keyboard" und "Mouse" LK2567 4 782 03.02.2021 16:11
Letzter Beitrag: MicroBahner
  Thermostat Steuerung für Fußbodenheizung FALLout 16 1.498 24.01.2021 19:53
Letzter Beitrag: Tommy56
Question Steuerung Lineartisch AnS 40 4.877 06.01.2021 11:37
Letzter Beitrag: MicroBahner
  Blaulicht steuerung Alexander307 33 2.947 24.12.2020 15:49
Letzter Beitrag: Tommy56
  Terrarium Steuerung kintaro 13 1.353 12.12.2020 22:55
Letzter Beitrag: hotsystems
  Steuerung meines Gartenweges Iron_Daddy 9 1.636 11.12.2020 15:18
Letzter Beitrag: Bitklopfer
  Aquarium Steuerung sopolka 9 2.635 11.11.2020 20:15
Letzter Beitrag: sopolka
  Mouse.h library Leonardo Schrittmotor 10 1.341 26.10.2020 21:35
Letzter Beitrag: Chopp
  Tag Nacht Steuerung Hühnerstall Klappe Raging Ender 10 1.778 10.09.2020 13:31
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste