From 3598ad6613132508e7021715298456ed8d9698a0 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 21 Sep 2012 17:24:48 +0200 Subject: [PATCH] Added MouseController class + example --- .../sam/libraries/USBHost/MouseController.cpp | 96 +++++++++++++++++++ .../sam/libraries/USBHost/MouseController.h | 61 ++++++++++++ .../MouseController/MouseController.ino | 51 ++++++++++ .../MouseControllerAdvanced.ino} | 2 + 4 files changed, 210 insertions(+) create mode 100644 hardware/arduino/sam/libraries/USBHost/MouseController.cpp create mode 100644 hardware/arduino/sam/libraries/USBHost/MouseController.h create mode 100644 hardware/arduino/sam/libraries/USBHost/examples/MouseController/MouseController.ino rename hardware/arduino/sam/libraries/USBHost/examples/{MouseControllerHID/MouseControllerHID.ino => MouseControllerAdvanced/MouseControllerAdvanced.ino} (94%) diff --git a/hardware/arduino/sam/libraries/USBHost/MouseController.cpp b/hardware/arduino/sam/libraries/USBHost/MouseController.cpp new file mode 100644 index 000000000..7beb6fe61 --- /dev/null +++ b/hardware/arduino/sam/libraries/USBHost/MouseController.cpp @@ -0,0 +1,96 @@ +/* + Copyright (c) 2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +extern "C" { +void __mouseControllerEmptyCallback() { } +} + +void mouseClicked() __attribute__ ((weak, alias("__mouseControllerEmptyCallback"))); +void mouseDragged() __attribute__ ((weak, alias("__mouseControllerEmptyCallback"))); +void mouseMoved() __attribute__ ((weak, alias("__mouseControllerEmptyCallback"))); +void mousePressed() __attribute__ ((weak, alias("__mouseControllerEmptyCallback"))); +void mouseReleased() __attribute__ ((weak, alias("__mouseControllerEmptyCallback"))); + +int mouseX = 0; +int mouseY = 0; +MouseButton mouseButton; +bool mouseButtonPressed = false; + +void MouseController::OnMouseMove(MOUSEINFO *mi) { + mouseX += mi->dX; + mouseY += mi->dY; + if (mouseX < 0) + mouseX = 0; + if (mouseX > maxX) + mouseX = maxX; + if (mouseY < 0) + mouseY = 0; + if (mouseY > maxY) + mouseY = maxY; + if (mouseButtonPressed) + mouseDragged(); + else + mouseMoved(); +} + +void MouseController::OnLeftButtonUp(MOUSEINFO *mi) { + buttons--; + mouseButtonPressed = (buttons > 0); + mouseButton = LEFT_BUTTON; + mouseReleased(); + mouseClicked(); +} + +void MouseController::OnLeftButtonDown(MOUSEINFO *mi) { + buttons++; + mouseButtonPressed = (buttons > 0); + mouseButton = LEFT_BUTTON; + mousePressed(); +} + +void MouseController::OnMiddleButtonUp(MOUSEINFO *mi) { + buttons--; + mouseButtonPressed = (buttons > 0); + mouseButton = MIDDLE_BUTTON; + mouseReleased(); + mouseClicked(); +} + +void MouseController::OnMiddleButtonDown(MOUSEINFO *mi) { + buttons++; + mouseButtonPressed = (buttons > 0); + mouseButton = MIDDLE_BUTTON; + mousePressed(); +} + +void MouseController::OnRightButtonUp(MOUSEINFO *mi) { + buttons--; + mouseButtonPressed = (buttons > 0); + mouseButton = RIGHT_BUTTON; + mouseReleased(); + mouseClicked(); +} + +void MouseController::OnRightButtonDown(MOUSEINFO *mi) { + buttons++; + mouseButtonPressed = (buttons > 0); + mouseButton = RIGHT_BUTTON; + mousePressed(); +} diff --git a/hardware/arduino/sam/libraries/USBHost/MouseController.h b/hardware/arduino/sam/libraries/USBHost/MouseController.h new file mode 100644 index 000000000..a42fd3461 --- /dev/null +++ b/hardware/arduino/sam/libraries/USBHost/MouseController.h @@ -0,0 +1,61 @@ +/* + Copyright (c) 2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef MOUSE_CONTROLLER_H +#define MOUSE_CONTROLLER_H + +#include + +enum MouseButton { + LEFT_BUTTON, + MIDDLE_BUTTON, + RIGHT_BUTTON +}; + +extern int mouseX; +extern int mouseY; +extern MouseButton mouseButton; +extern bool mouseButtonPressed; + +class MouseController : public MouseReportParser +{ +public: + MouseController(USBHost &usb) : hostMouse(&usb), maxX(640), maxY(480), buttons(0) { + hostMouse.SetReportParser(0, this); + }; + + void setMaxX(int mx) { maxX = mx; }; + void setMaxY(int my) { maxY = my; }; + +protected: + virtual void OnMouseMove(MOUSEINFO *mi); + virtual void OnLeftButtonUp(MOUSEINFO *mi); + virtual void OnLeftButtonDown(MOUSEINFO *mi); + virtual void OnMiddleButtonUp(MOUSEINFO *mi); + virtual void OnMiddleButtonDown(MOUSEINFO *mi); + virtual void OnRightButtonUp(MOUSEINFO *mi); + virtual void OnRightButtonDown(MOUSEINFO *mi); + +private: + HIDBoot hostMouse; + int maxX; + int maxY; + int buttons; +}; + +#endif diff --git a/hardware/arduino/sam/libraries/USBHost/examples/MouseController/MouseController.ino b/hardware/arduino/sam/libraries/USBHost/examples/MouseController/MouseController.ino new file mode 100644 index 000000000..95f6ac979 --- /dev/null +++ b/hardware/arduino/sam/libraries/USBHost/examples/MouseController/MouseController.ino @@ -0,0 +1,51 @@ + +// Require mouse control library +#include + +// Initialize USB Controller +USBHost usb; + +// Attach mouse controller to USB +MouseController mouse(usb); + +// This function intercepts mouse movements +void mouseMoved() { + Serial1.print("Moving mouse: "); + Serial1.print(mouseX); + Serial1.print(", "); + Serial1.println(mouseY); +} + +// This function intercepts mouse movements when a button is pressed +void mouseDragged() { + Serial1.print("DRAG: "); + Serial1.print(mouseX); + Serial1.print(", "); + Serial1.println(mouseY); +} + +// This function intercepts mouse button press +void mousePressed() { + Serial1.print("Pressed: "); + Serial1.println(mouseButton); +} + +// This function intercepts mouse button release +void mouseReleased() { + Serial1.print("Released: "); + Serial1.println(mouseButton); +} + +void setup() +{ + Serial1.begin(115200); + Serial1.println("Program started"); + delay(200); +} + +void loop() +{ + // Process USB tasks + usb.Task(); +} + diff --git a/hardware/arduino/sam/libraries/USBHost/examples/MouseControllerHID/MouseControllerHID.ino b/hardware/arduino/sam/libraries/USBHost/examples/MouseControllerAdvanced/MouseControllerAdvanced.ino similarity index 94% rename from hardware/arduino/sam/libraries/USBHost/examples/MouseControllerHID/MouseControllerHID.ino rename to hardware/arduino/sam/libraries/USBHost/examples/MouseControllerAdvanced/MouseControllerAdvanced.ino index 4415c51fc..4dfaa4bfd 100644 --- a/hardware/arduino/sam/libraries/USBHost/examples/MouseControllerHID/MouseControllerHID.ino +++ b/hardware/arduino/sam/libraries/USBHost/examples/MouseControllerAdvanced/MouseControllerAdvanced.ino @@ -1,3 +1,5 @@ +// This sketch demonstrate how to use low-level drivers (only for advanced users). + #include class MouseRptParser : public MouseReportParser