Michael Yu / Mbed 2 deprecated ECE4180_Space_Mouse_Receive

Dependencies:   USBDevice mbed

Committer:
myu429
Date:
Mon May 01 01:43:02 2017 +0000
Revision:
0:f2035b8df504
V1.0 Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
myu429 0:f2035b8df504 1 #include "mbed.h"
myu429 0:f2035b8df504 2 #include "USBMouseKeyboard.h"
myu429 0:f2035b8df504 3
myu429 0:f2035b8df504 4 USBMouseKeyboard key_mouse;
myu429 0:f2035b8df504 5
myu429 0:f2035b8df504 6 Serial rf_receive(p28, p27);
myu429 0:f2035b8df504 7
myu429 0:f2035b8df504 8 void processButtons(short b);
myu429 0:f2035b8df504 9
myu429 0:f2035b8df504 10 /*
myu429 0:f2035b8df504 11 * parse incoming message data into X, Y, and buttons
myu429 0:f2035b8df504 12 * move cursor by X, Y
myu429 0:f2035b8df504 13 * pass buttons along to handler
myu429 0:f2035b8df504 14 */
myu429 0:f2035b8df504 15 void processMessage(char* msg)
myu429 0:f2035b8df504 16 {
myu429 0:f2035b8df504 17 short x = msg[1] | (msg[2] << 8);
myu429 0:f2035b8df504 18 short y = msg[3] | (msg[4] << 8);
myu429 0:f2035b8df504 19 short button = msg[5] | (msg[6] << 8);
myu429 0:f2035b8df504 20 processButtons(button);
myu429 0:f2035b8df504 21 if (button != 0x00) {
myu429 0:f2035b8df504 22 // pc.printf("rcvd button: %4x \r\n\r\n", button);
myu429 0:f2035b8df504 23 }
myu429 0:f2035b8df504 24 key_mouse.move(x, y);
myu429 0:f2035b8df504 25 }
myu429 0:f2035b8df504 26
myu429 0:f2035b8df504 27
myu429 0:f2035b8df504 28 /*
myu429 0:f2035b8df504 29 * process incoming button data, each bit corresponds to a single button
myu429 0:f2035b8df504 30 * allows for multiple button presses froma single message
myu429 0:f2035b8df504 31 */
myu429 0:f2035b8df504 32 void processButtons(short b)
myu429 0:f2035b8df504 33 {
myu429 0:f2035b8df504 34 // button 1
myu429 0:f2035b8df504 35 if (((b >> 1) & 0x01) != 0) {
myu429 0:f2035b8df504 36 // left click
myu429 0:f2035b8df504 37 key_mouse.click(MOUSE_LEFT);
myu429 0:f2035b8df504 38 }
myu429 0:f2035b8df504 39 // button 2
myu429 0:f2035b8df504 40 if (((b >> 2) & 0x01) != 0) {
myu429 0:f2035b8df504 41 // Middle click
myu429 0:f2035b8df504 42 key_mouse.click(MOUSE_MIDDLE);
myu429 0:f2035b8df504 43 }
myu429 0:f2035b8df504 44 // button 3
myu429 0:f2035b8df504 45 if (((b >> 3) & 0x01) != 0) {
myu429 0:f2035b8df504 46 // right click
myu429 0:f2035b8df504 47 key_mouse.click(MOUSE_RIGHT);
myu429 0:f2035b8df504 48 }
myu429 0:f2035b8df504 49 // button 5
myu429 0:f2035b8df504 50 if (((b >> 5) & 0x01) != 0) {
myu429 0:f2035b8df504 51 // volume up
myu429 0:f2035b8df504 52 key_mouse.mediaControl(KEY_VOLUME_UP);
myu429 0:f2035b8df504 53 }
myu429 0:f2035b8df504 54 // button 6
myu429 0:f2035b8df504 55 if (((b >> 6) & 0x01) != 0) {
myu429 0:f2035b8df504 56 // scroll up
myu429 0:f2035b8df504 57 key_mouse.scroll(-1);
myu429 0:f2035b8df504 58 }
myu429 0:f2035b8df504 59 // button 7
myu429 0:f2035b8df504 60 if (((b >> 7) & 0x01) != 0) {
myu429 0:f2035b8df504 61 // fwd
myu429 0:f2035b8df504 62 key_mouse.keyCode(RIGHT_ARROW, KEY_ALT);
myu429 0:f2035b8df504 63 }
myu429 0:f2035b8df504 64 // button 9
myu429 0:f2035b8df504 65 if (((b >> 9) & 0x01) != 0) {
myu429 0:f2035b8df504 66 // volume down
myu429 0:f2035b8df504 67 key_mouse.mediaControl(KEY_VOLUME_DOWN);
myu429 0:f2035b8df504 68 }
myu429 0:f2035b8df504 69 // button 10
myu429 0:f2035b8df504 70 if (((b >> 10) & 0x01) != 0) {
myu429 0:f2035b8df504 71 // scroll down
myu429 0:f2035b8df504 72 key_mouse.scroll(1);
myu429 0:f2035b8df504 73
myu429 0:f2035b8df504 74 }
myu429 0:f2035b8df504 75 // button 11
myu429 0:f2035b8df504 76 if (((b >> 11) & 0x01) != 0) {
myu429 0:f2035b8df504 77 // back
myu429 0:f2035b8df504 78 key_mouse.keyCode(LEFT_ARROW, KEY_ALT);
myu429 0:f2035b8df504 79 }
myu429 0:f2035b8df504 80 }
myu429 0:f2035b8df504 81
myu429 0:f2035b8df504 82
myu429 0:f2035b8df504 83 /*
myu429 0:f2035b8df504 84 * read in bytes when available from the RF receiver
myu429 0:f2035b8df504 85 * read in bytes while looking for start character and validating checksum
myu429 0:f2035b8df504 86 */
myu429 0:f2035b8df504 87 int main()
myu429 0:f2035b8df504 88 {
myu429 0:f2035b8df504 89
myu429 0:f2035b8df504 90 rf_receive.baud(4800);
myu429 0:f2035b8df504 91 int curByte = 0;
myu429 0:f2035b8df504 92 char received[8];
myu429 0:f2035b8df504 93 char checksum= 0;
myu429 0:f2035b8df504 94 while(1) {
myu429 0:f2035b8df504 95 // check if data available for reading
myu429 0:f2035b8df504 96 if (rf_receive.readable()) {
myu429 0:f2035b8df504 97
myu429 0:f2035b8df504 98 // read in byte into incoming message array
myu429 0:f2035b8df504 99 received[curByte] = rf_receive.getc();
myu429 0:f2035b8df504 100 // if this is the first byte in the message
myu429 0:f2035b8df504 101 if (curByte == 0) {
myu429 0:f2035b8df504 102 // check if it is the start character, if not, keep overwiting 1st byte
myu429 0:f2035b8df504 103 if (received[curByte] == 0x55) {
myu429 0:f2035b8df504 104 // if so update checksum and increment message data pointer
myu429 0:f2035b8df504 105 checksum += received[curByte];
myu429 0:f2035b8df504 106 curByte++;
myu429 0:f2035b8df504 107 }
myu429 0:f2035b8df504 108 // if received valid start char, read in 6 data bytes, calculating checksum
myu429 0:f2035b8df504 109 } else if (curByte <= 6) {
myu429 0:f2035b8df504 110 checksum += received[curByte];
myu429 0:f2035b8df504 111 curByte++;
myu429 0:f2035b8df504 112 } else { // else check if calculated checksum matches incoming checksum
myu429 0:f2035b8df504 113 if (checksum == received[curByte]) {
myu429 0:f2035b8df504 114 // if valid message, process data
myu429 0:f2035b8df504 115 processMessage(received);
myu429 0:f2035b8df504 116 }
myu429 0:f2035b8df504 117 // reset for next message regardless
myu429 0:f2035b8df504 118 curByte = 0;
myu429 0:f2035b8df504 119 checksum = 0;
myu429 0:f2035b8df504 120 }
myu429 0:f2035b8df504 121 }
myu429 0:f2035b8df504 122 }
myu429 0:f2035b8df504 123 }