Slingshot Controller

Dependencies:   ADXL345 DebounceIn USBDevice mbed

Committer:
Brandon
Date:
Wed Oct 17 16:33:04 2012 +0000
Revision:
1:2721dc2acc2c
Parent:
0:cf17ea89fd09
Updated comments, added names, cleaned old code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Brandon 0:cf17ea89fd09 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
Brandon 0:cf17ea89fd09 2 *
Brandon 0:cf17ea89fd09 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Brandon 0:cf17ea89fd09 4 * and associated documentation files (the "Software"), to deal in the Software without
Brandon 0:cf17ea89fd09 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
Brandon 0:cf17ea89fd09 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Brandon 0:cf17ea89fd09 7 * Software is furnished to do so, subject to the following conditions:
Brandon 0:cf17ea89fd09 8 *
Brandon 0:cf17ea89fd09 9 * The above copyright notice and this permission notice shall be included in all copies or
Brandon 0:cf17ea89fd09 10 * substantial portions of the Software.
Brandon 0:cf17ea89fd09 11 *
Brandon 0:cf17ea89fd09 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Brandon 0:cf17ea89fd09 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Brandon 0:cf17ea89fd09 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Brandon 0:cf17ea89fd09 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Brandon 0:cf17ea89fd09 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Brandon 0:cf17ea89fd09 17 */
Brandon 0:cf17ea89fd09 18
Brandon 0:cf17ea89fd09 19 #ifndef USBMOUSE_H
Brandon 0:cf17ea89fd09 20 #define USBMOUSE_H
Brandon 0:cf17ea89fd09 21
Brandon 0:cf17ea89fd09 22 #include "USBHID.h"
Brandon 0:cf17ea89fd09 23
Brandon 0:cf17ea89fd09 24 #define REPORT_ID_MOUSE 2
Brandon 0:cf17ea89fd09 25
Brandon 0:cf17ea89fd09 26 /* Common usage */
Brandon 0:cf17ea89fd09 27
Brandon 0:cf17ea89fd09 28 enum MOUSE_BUTTON
Brandon 0:cf17ea89fd09 29 {
Brandon 0:cf17ea89fd09 30 MOUSE_LEFT = 1,
Brandon 0:cf17ea89fd09 31 MOUSE_RIGHT = 2,
Brandon 0:cf17ea89fd09 32 MOUSE_MIDDLE = 4,
Brandon 0:cf17ea89fd09 33 };
Brandon 0:cf17ea89fd09 34
Brandon 0:cf17ea89fd09 35 /* X and Y limits */
Brandon 0:cf17ea89fd09 36 /* These values do not directly map to screen pixels */
Brandon 0:cf17ea89fd09 37 /* Zero may be interpreted as meaning 'no movement' */
Brandon 0:cf17ea89fd09 38 #define X_MIN_ABS (1) /*!< Minimum value on x-axis */
Brandon 0:cf17ea89fd09 39 #define Y_MIN_ABS (1) /*!< Minimum value on y-axis */
Brandon 0:cf17ea89fd09 40 #define X_MAX_ABS (0x7fff) /*!< Maximum value on x-axis */
Brandon 0:cf17ea89fd09 41 #define Y_MAX_ABS (0x7fff) /*!< Maximum value on y-axis */
Brandon 0:cf17ea89fd09 42
Brandon 0:cf17ea89fd09 43 #define X_MIN_REL (-127) /*!< The maximum value that we can move to the left on the x-axis */
Brandon 0:cf17ea89fd09 44 #define Y_MIN_REL (-127) /*!< The maximum value that we can move up on the y-axis */
Brandon 0:cf17ea89fd09 45 #define X_MAX_REL (127) /*!< The maximum value that we can move to the right on the x-axis */
Brandon 0:cf17ea89fd09 46 #define Y_MAX_REL (127) /*!< The maximum value that we can move down on the y-axis */
Brandon 0:cf17ea89fd09 47
Brandon 0:cf17ea89fd09 48 enum MOUSE_TYPE
Brandon 0:cf17ea89fd09 49 {
Brandon 0:cf17ea89fd09 50 ABS_MOUSE,
Brandon 0:cf17ea89fd09 51 REL_MOUSE,
Brandon 0:cf17ea89fd09 52 };
Brandon 0:cf17ea89fd09 53
Brandon 0:cf17ea89fd09 54 /**
Brandon 0:cf17ea89fd09 55 *
Brandon 0:cf17ea89fd09 56 * USBMouse example
Brandon 0:cf17ea89fd09 57 * @code
Brandon 0:cf17ea89fd09 58 * #include "mbed.h"
Brandon 0:cf17ea89fd09 59 * #include "USBMouse.h"
Brandon 0:cf17ea89fd09 60 *
Brandon 0:cf17ea89fd09 61 * USBMouse mouse;
Brandon 0:cf17ea89fd09 62 *
Brandon 0:cf17ea89fd09 63 * int main(void)
Brandon 0:cf17ea89fd09 64 * {
Brandon 0:cf17ea89fd09 65 * while (1)
Brandon 0:cf17ea89fd09 66 * {
Brandon 0:cf17ea89fd09 67 * mouse.move(20, 0);
Brandon 0:cf17ea89fd09 68 * wait(0.5);
Brandon 0:cf17ea89fd09 69 * }
Brandon 0:cf17ea89fd09 70 * }
Brandon 0:cf17ea89fd09 71 *
Brandon 0:cf17ea89fd09 72 * @endcode
Brandon 0:cf17ea89fd09 73 *
Brandon 0:cf17ea89fd09 74 *
Brandon 0:cf17ea89fd09 75 * @code
Brandon 0:cf17ea89fd09 76 * #include "mbed.h"
Brandon 0:cf17ea89fd09 77 * #include "USBMouse.h"
Brandon 0:cf17ea89fd09 78 * #include <math.h>
Brandon 0:cf17ea89fd09 79 *
Brandon 0:cf17ea89fd09 80 * USBMouse mouse(ABS_MOUSE);
Brandon 0:cf17ea89fd09 81 *
Brandon 0:cf17ea89fd09 82 * int main(void)
Brandon 0:cf17ea89fd09 83 * {
Brandon 0:cf17ea89fd09 84 * uint16_t x_center = (X_MAX_ABS - X_MIN_ABS)/2;
Brandon 0:cf17ea89fd09 85 * uint16_t y_center = (Y_MAX_ABS - Y_MIN_ABS)/2;
Brandon 0:cf17ea89fd09 86 * uint16_t x_screen = 0;
Brandon 0:cf17ea89fd09 87 * uint16_t y_screen = 0;
Brandon 0:cf17ea89fd09 88 *
Brandon 0:cf17ea89fd09 89 * uint32_t x_origin = x_center;
Brandon 0:cf17ea89fd09 90 * uint32_t y_origin = y_center;
Brandon 0:cf17ea89fd09 91 * uint32_t radius = 5000;
Brandon 0:cf17ea89fd09 92 * uint32_t angle = 0;
Brandon 0:cf17ea89fd09 93 *
Brandon 0:cf17ea89fd09 94 * while (1)
Brandon 0:cf17ea89fd09 95 * {
Brandon 0:cf17ea89fd09 96 * x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;
Brandon 0:cf17ea89fd09 97 * y_screen = y_origin + sin((double)angle*3.14/180.0)*radius;
Brandon 0:cf17ea89fd09 98 *
Brandon 0:cf17ea89fd09 99 * mouse.move(x_screen, y_screen);
Brandon 0:cf17ea89fd09 100 * angle += 3;
Brandon 0:cf17ea89fd09 101 * wait(0.01);
Brandon 0:cf17ea89fd09 102 * }
Brandon 0:cf17ea89fd09 103 * }
Brandon 0:cf17ea89fd09 104 *
Brandon 0:cf17ea89fd09 105 * @endcode
Brandon 0:cf17ea89fd09 106 */
Brandon 0:cf17ea89fd09 107 class USBMouse: public USBHID
Brandon 0:cf17ea89fd09 108 {
Brandon 0:cf17ea89fd09 109 public:
Brandon 0:cf17ea89fd09 110
Brandon 0:cf17ea89fd09 111 /**
Brandon 0:cf17ea89fd09 112 * Constructor
Brandon 0:cf17ea89fd09 113 *
Brandon 0:cf17ea89fd09 114 * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
Brandon 0:cf17ea89fd09 115 * @param vendor_id Your vendor_id (default: 0x1234)
Brandon 0:cf17ea89fd09 116 * @param product_id Your product_id (default: 0x0001)
Brandon 0:cf17ea89fd09 117 * @param product_release Your preoduct_release (default: 0x0001)
Brandon 0:cf17ea89fd09 118 *
Brandon 0:cf17ea89fd09 119 */
Brandon 0:cf17ea89fd09 120 USBMouse(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0001, uint16_t product_release = 0x0001):
Brandon 0:cf17ea89fd09 121 USBHID(0, 0, vendor_id, product_id, product_release, false)
Brandon 0:cf17ea89fd09 122 {
Brandon 0:cf17ea89fd09 123 button = 0;
Brandon 0:cf17ea89fd09 124 this->mouse_type = mouse_type;
Brandon 0:cf17ea89fd09 125 connect();
Brandon 0:cf17ea89fd09 126 };
Brandon 0:cf17ea89fd09 127
Brandon 0:cf17ea89fd09 128 /**
Brandon 0:cf17ea89fd09 129 * Write a state of the mouse
Brandon 0:cf17ea89fd09 130 *
Brandon 0:cf17ea89fd09 131 * @param x x-axis position
Brandon 0:cf17ea89fd09 132 * @param y y-axis position
Brandon 0:cf17ea89fd09 133 * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
Brandon 0:cf17ea89fd09 134 * @param z wheel state (>0 to scroll down, <0 to scroll up)
Brandon 0:cf17ea89fd09 135 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 136 */
Brandon 0:cf17ea89fd09 137 bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
Brandon 0:cf17ea89fd09 138
Brandon 0:cf17ea89fd09 139
Brandon 0:cf17ea89fd09 140 /**
Brandon 0:cf17ea89fd09 141 * Move the cursor to (x, y)
Brandon 0:cf17ea89fd09 142 *
Brandon 0:cf17ea89fd09 143 * @param x-axis position
Brandon 0:cf17ea89fd09 144 * @param y-axis position
Brandon 0:cf17ea89fd09 145 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 146 */
Brandon 0:cf17ea89fd09 147 bool move(int16_t x, int16_t y);
Brandon 0:cf17ea89fd09 148
Brandon 0:cf17ea89fd09 149 /**
Brandon 0:cf17ea89fd09 150 * Press one or several buttons
Brandon 0:cf17ea89fd09 151 *
Brandon 0:cf17ea89fd09 152 * @param button button state (ex: press(MOUSE_LEFT))
Brandon 0:cf17ea89fd09 153 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 154 */
Brandon 0:cf17ea89fd09 155 bool press(uint8_t button);
Brandon 0:cf17ea89fd09 156
Brandon 0:cf17ea89fd09 157 /**
Brandon 0:cf17ea89fd09 158 * Release one or several buttons
Brandon 0:cf17ea89fd09 159 *
Brandon 0:cf17ea89fd09 160 * @param button button state (ex: release(MOUSE_LEFT))
Brandon 0:cf17ea89fd09 161 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 162 */
Brandon 0:cf17ea89fd09 163 bool release(uint8_t button);
Brandon 0:cf17ea89fd09 164
Brandon 0:cf17ea89fd09 165 /**
Brandon 0:cf17ea89fd09 166 * Double click (MOUSE_LEFT)
Brandon 0:cf17ea89fd09 167 *
Brandon 0:cf17ea89fd09 168 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 169 */
Brandon 0:cf17ea89fd09 170 bool doubleClick();
Brandon 0:cf17ea89fd09 171
Brandon 0:cf17ea89fd09 172 /**
Brandon 0:cf17ea89fd09 173 * Click
Brandon 0:cf17ea89fd09 174 *
Brandon 0:cf17ea89fd09 175 * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
Brandon 0:cf17ea89fd09 176 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 177 */
Brandon 0:cf17ea89fd09 178 bool click(uint8_t button);
Brandon 0:cf17ea89fd09 179
Brandon 0:cf17ea89fd09 180 /**
Brandon 0:cf17ea89fd09 181 * Scrolling
Brandon 0:cf17ea89fd09 182 *
Brandon 0:cf17ea89fd09 183 * @param z value of the wheel (>0 to go down, <0 to go up)
Brandon 0:cf17ea89fd09 184 * @returns true if there is no error, false otherwise
Brandon 0:cf17ea89fd09 185 */
Brandon 0:cf17ea89fd09 186 bool scroll(int8_t z);
Brandon 0:cf17ea89fd09 187
Brandon 0:cf17ea89fd09 188 /*
Brandon 0:cf17ea89fd09 189 * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
Brandon 0:cf17ea89fd09 190 *
Brandon 0:cf17ea89fd09 191 * @returns pointer to the report descriptor
Brandon 0:cf17ea89fd09 192 */
Brandon 0:cf17ea89fd09 193 virtual uint8_t * reportDesc();
Brandon 0:cf17ea89fd09 194
Brandon 0:cf17ea89fd09 195 protected:
Brandon 0:cf17ea89fd09 196 /*
Brandon 0:cf17ea89fd09 197 * Get configuration descriptor
Brandon 0:cf17ea89fd09 198 *
Brandon 0:cf17ea89fd09 199 * @returns pointer to the configuration descriptor
Brandon 0:cf17ea89fd09 200 */
Brandon 0:cf17ea89fd09 201 virtual uint8_t * configurationDesc();
Brandon 0:cf17ea89fd09 202
Brandon 0:cf17ea89fd09 203 private:
Brandon 0:cf17ea89fd09 204 MOUSE_TYPE mouse_type;
Brandon 0:cf17ea89fd09 205 uint8_t button;
Brandon 0:cf17ea89fd09 206 bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
Brandon 0:cf17ea89fd09 207 };
Brandon 0:cf17ea89fd09 208
Brandon 0:cf17ea89fd09 209 #endif