Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:ab916b5c1a4d, 2017-08-19 (annotated)
- Committer:
- geekylou
- Date:
- Sat Aug 19 19:48:20 2017 +0000
- Revision:
- 1:ab916b5c1a4d
- Parent:
- 0:d0c521cb6c90
- Child:
- 2:095eb20f0d3b
Add steam controller support.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| geekylou | 0:d0c521cb6c90 | 1 | #include "mbed.h" |
| geekylou | 0:d0c521cb6c90 | 2 | #include "USBHostMSD.h" |
| geekylou | 0:d0c521cb6c90 | 3 | #include "USBHostMouse.h" |
| geekylou | 0:d0c521cb6c90 | 4 | #include "USBHostKeyboard.h" |
| geekylou | 1:ab916b5c1a4d | 5 | #include "USBHostSteamController.h" |
| geekylou | 0:d0c521cb6c90 | 6 | #include "FATFileSystem.h" |
| geekylou | 0:d0c521cb6c90 | 7 | #include <stdlib.h> |
| geekylou | 0:d0c521cb6c90 | 8 | |
| geekylou | 1:ab916b5c1a4d | 9 | int x_cur = 0; |
| geekylou | 1:ab916b5c1a4d | 10 | int y_cur = 0; |
| geekylou | 0:d0c521cb6c90 | 11 | |
| geekylou | 0:d0c521cb6c90 | 12 | DigitalOut led(LED1); |
| geekylou | 0:d0c521cb6c90 | 13 | DigitalOut led2(LED2); |
| geekylou | 0:d0c521cb6c90 | 14 | DigitalOut led3(LED3); |
| geekylou | 0:d0c521cb6c90 | 15 | DigitalOut led4(A0); |
| geekylou | 0:d0c521cb6c90 | 16 | |
| geekylou | 0:d0c521cb6c90 | 17 | |
| geekylou | 1:ab916b5c1a4d | 18 | void onMouseEvent(uint8_t buttons, int16_t x, int16_t y, int8_t z) { |
| geekylou | 0:d0c521cb6c90 | 19 | //printf("buttons: %d, x: %d, y: %d, z: %d\r\n", buttons, x, y, z); |
| geekylou | 0:d0c521cb6c90 | 20 | |
| geekylou | 0:d0c521cb6c90 | 21 | led = buttons & 1; |
| geekylou | 0:d0c521cb6c90 | 22 | led4 = buttons & 0x2; |
| geekylou | 0:d0c521cb6c90 | 23 | |
| geekylou | 0:d0c521cb6c90 | 24 | while (x != 0 || y != 0) |
| geekylou | 0:d0c521cb6c90 | 25 | { |
| geekylou | 0:d0c521cb6c90 | 26 | if (x >0) |
| geekylou | 0:d0c521cb6c90 | 27 | { |
| geekylou | 0:d0c521cb6c90 | 28 | x--; |
| geekylou | 0:d0c521cb6c90 | 29 | x_cur = (x_cur+1) & 3; |
| geekylou | 0:d0c521cb6c90 | 30 | } |
| geekylou | 0:d0c521cb6c90 | 31 | else if (x < 0) |
| geekylou | 0:d0c521cb6c90 | 32 | { |
| geekylou | 0:d0c521cb6c90 | 33 | x++; |
| geekylou | 0:d0c521cb6c90 | 34 | x_cur = (x_cur-1) & 3; |
| geekylou | 0:d0c521cb6c90 | 35 | } |
| geekylou | 0:d0c521cb6c90 | 36 | |
| geekylou | 0:d0c521cb6c90 | 37 | if (y >0) |
| geekylou | 0:d0c521cb6c90 | 38 | { |
| geekylou | 0:d0c521cb6c90 | 39 | y--; |
| geekylou | 0:d0c521cb6c90 | 40 | y_cur = (y_cur+1) & 3; |
| geekylou | 0:d0c521cb6c90 | 41 | } |
| geekylou | 0:d0c521cb6c90 | 42 | else if (y < 0) |
| geekylou | 0:d0c521cb6c90 | 43 | { |
| geekylou | 0:d0c521cb6c90 | 44 | y++; |
| geekylou | 0:d0c521cb6c90 | 45 | y_cur = (y_cur-1) & 3; |
| geekylou | 0:d0c521cb6c90 | 46 | } |
| geekylou | 0:d0c521cb6c90 | 47 | |
| geekylou | 0:d0c521cb6c90 | 48 | //printf("x %d y %d\r\n", x, y); |
| geekylou | 0:d0c521cb6c90 | 49 | |
| geekylou | 0:d0c521cb6c90 | 50 | |
| geekylou | 0:d0c521cb6c90 | 51 | led2 = ((x_cur + 1)/2) & 1; |
| geekylou | 0:d0c521cb6c90 | 52 | led3 = (x_cur/2) & 0x1; |
| geekylou | 0:d0c521cb6c90 | 53 | |
| geekylou | 0:d0c521cb6c90 | 54 | //led = ((y_cur + 1)/2) & 1; |
| geekylou | 0:d0c521cb6c90 | 55 | //led4 = (y_cur/2) & 0x1; |
| geekylou | 0:d0c521cb6c90 | 56 | |
| geekylou | 0:d0c521cb6c90 | 57 | Thread::wait(1); |
| geekylou | 0:d0c521cb6c90 | 58 | } |
| geekylou | 0:d0c521cb6c90 | 59 | } |
| geekylou | 1:ab916b5c1a4d | 60 | |
| geekylou | 1:ab916b5c1a4d | 61 | void onJSEvent(uint32_t buttons, int8_t x, int8_t y, int16_t x_b, int16_t y_b) { |
| geekylou | 1:ab916b5c1a4d | 62 | //printf("buttons: %x, x: %d, y: %d, x_b: %d y_b:%d\r\n", buttons, x, y, x_b, y_b); |
| geekylou | 1:ab916b5c1a4d | 63 | |
| geekylou | 1:ab916b5c1a4d | 64 | led = buttons & 1; |
| geekylou | 1:ab916b5c1a4d | 65 | led4 = buttons & 0x2; |
| geekylou | 1:ab916b5c1a4d | 66 | |
| geekylou | 1:ab916b5c1a4d | 67 | Thread::wait(1); |
| geekylou | 1:ab916b5c1a4d | 68 | } |
| geekylou | 0:d0c521cb6c90 | 69 | |
| geekylou | 0:d0c521cb6c90 | 70 | void mouse_task(void const *) { |
| geekylou | 0:d0c521cb6c90 | 71 | |
| geekylou | 0:d0c521cb6c90 | 72 | USBHostMouse mouse; |
| geekylou | 0:d0c521cb6c90 | 73 | printf("mouse started\n"); |
| geekylou | 0:d0c521cb6c90 | 74 | while(1) { |
| geekylou | 0:d0c521cb6c90 | 75 | |
| geekylou | 0:d0c521cb6c90 | 76 | // try to connect a USB mouse |
| geekylou | 0:d0c521cb6c90 | 77 | while(!mouse.connect()) |
| geekylou | 0:d0c521cb6c90 | 78 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 79 | |
| geekylou | 0:d0c521cb6c90 | 80 | // when connected, attach handler called on mouse event |
| geekylou | 0:d0c521cb6c90 | 81 | mouse.attachEvent(onMouseEvent); |
| geekylou | 0:d0c521cb6c90 | 82 | |
| geekylou | 0:d0c521cb6c90 | 83 | // wait until the mouse is disconnected |
| geekylou | 0:d0c521cb6c90 | 84 | while(mouse.connected()) |
| geekylou | 0:d0c521cb6c90 | 85 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 86 | printf("mouse seen disconnected\n"); |
| geekylou | 0:d0c521cb6c90 | 87 | } |
| geekylou | 0:d0c521cb6c90 | 88 | } |
| geekylou | 0:d0c521cb6c90 | 89 | void onKey(uint8_t key) { |
| geekylou | 0:d0c521cb6c90 | 90 | printf("Key: %c\r\n", key); |
| geekylou | 0:d0c521cb6c90 | 91 | } |
| geekylou | 0:d0c521cb6c90 | 92 | void keyboard_task(void const *) { |
| geekylou | 0:d0c521cb6c90 | 93 | |
| geekylou | 0:d0c521cb6c90 | 94 | USBHostKeyboard keyboard; |
| geekylou | 0:d0c521cb6c90 | 95 | |
| geekylou | 0:d0c521cb6c90 | 96 | while(1) { |
| geekylou | 0:d0c521cb6c90 | 97 | // try to connect a USB keyboard |
| geekylou | 0:d0c521cb6c90 | 98 | while(!keyboard.connect()) |
| geekylou | 0:d0c521cb6c90 | 99 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 100 | |
| geekylou | 0:d0c521cb6c90 | 101 | // when connected, attach handler called on keyboard event |
| geekylou | 0:d0c521cb6c90 | 102 | keyboard.attach(onKey); |
| geekylou | 0:d0c521cb6c90 | 103 | |
| geekylou | 0:d0c521cb6c90 | 104 | // wait until the keyboard is disconnected |
| geekylou | 0:d0c521cb6c90 | 105 | while(keyboard.connected()) |
| geekylou | 0:d0c521cb6c90 | 106 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 107 | } |
| geekylou | 0:d0c521cb6c90 | 108 | } |
| geekylou | 0:d0c521cb6c90 | 109 | |
| geekylou | 1:ab916b5c1a4d | 110 | void steamctrl_task(void const *) { |
| geekylou | 1:ab916b5c1a4d | 111 | |
| geekylou | 1:ab916b5c1a4d | 112 | USBHostSteamController steam_controller; |
| geekylou | 1:ab916b5c1a4d | 113 | |
| geekylou | 1:ab916b5c1a4d | 114 | while(1) { |
| geekylou | 1:ab916b5c1a4d | 115 | // try to connect a USB keyboard |
| geekylou | 1:ab916b5c1a4d | 116 | while(!steam_controller.connect()) |
| geekylou | 1:ab916b5c1a4d | 117 | Thread::wait(500); |
| geekylou | 1:ab916b5c1a4d | 118 | |
| geekylou | 1:ab916b5c1a4d | 119 | // when connected, attach handler called on keyboard event |
| geekylou | 1:ab916b5c1a4d | 120 | steam_controller.attachEvent(onJSEvent); |
| geekylou | 1:ab916b5c1a4d | 121 | |
| geekylou | 1:ab916b5c1a4d | 122 | // wait until the keyboard is disconnected |
| geekylou | 1:ab916b5c1a4d | 123 | while(steam_controller.connected()) |
| geekylou | 1:ab916b5c1a4d | 124 | Thread::wait(500); |
| geekylou | 1:ab916b5c1a4d | 125 | } |
| geekylou | 1:ab916b5c1a4d | 126 | } |
| geekylou | 1:ab916b5c1a4d | 127 | |
| geekylou | 0:d0c521cb6c90 | 128 | |
| geekylou | 0:d0c521cb6c90 | 129 | |
| geekylou | 0:d0c521cb6c90 | 130 | void msd_task(void const *) { |
| geekylou | 0:d0c521cb6c90 | 131 | |
| geekylou | 0:d0c521cb6c90 | 132 | USBHostMSD msd; |
| geekylou | 0:d0c521cb6c90 | 133 | int i = 0; |
| geekylou | 0:d0c521cb6c90 | 134 | FATFileSystem fs("usb"); |
| geekylou | 0:d0c521cb6c90 | 135 | int err; |
| geekylou | 0:d0c521cb6c90 | 136 | printf("wait for usb memory stick insertion\n"); |
| geekylou | 0:d0c521cb6c90 | 137 | while(1) { |
| geekylou | 0:d0c521cb6c90 | 138 | |
| geekylou | 0:d0c521cb6c90 | 139 | // try to connect a MSD device |
| geekylou | 0:d0c521cb6c90 | 140 | while(!msd.connect()) { |
| geekylou | 0:d0c521cb6c90 | 141 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 142 | } |
| geekylou | 0:d0c521cb6c90 | 143 | if (fs.mount(&msd) != 0) continue; |
| geekylou | 0:d0c521cb6c90 | 144 | else |
| geekylou | 0:d0c521cb6c90 | 145 | printf("file system mounted\n"); |
| geekylou | 0:d0c521cb6c90 | 146 | |
| geekylou | 0:d0c521cb6c90 | 147 | if (!msd.connect()) { |
| geekylou | 0:d0c521cb6c90 | 148 | continue; |
| geekylou | 0:d0c521cb6c90 | 149 | } |
| geekylou | 0:d0c521cb6c90 | 150 | |
| geekylou | 0:d0c521cb6c90 | 151 | // in a loop, append a file |
| geekylou | 0:d0c521cb6c90 | 152 | // if the device is disconnected, we try to connect it again |
| geekylou | 0:d0c521cb6c90 | 153 | |
| geekylou | 0:d0c521cb6c90 | 154 | // append a file |
| geekylou | 0:d0c521cb6c90 | 155 | File file; |
| geekylou | 0:d0c521cb6c90 | 156 | err = file.open(&fs, "test1.txt", O_WRONLY | O_CREAT |O_APPEND); |
| geekylou | 0:d0c521cb6c90 | 157 | |
| geekylou | 0:d0c521cb6c90 | 158 | if (err == 0) { |
| geekylou | 0:d0c521cb6c90 | 159 | char tmp[100]; |
| geekylou | 0:d0c521cb6c90 | 160 | sprintf(tmp,"Hello fun USB stick World: %d!\r\n", i++); |
| geekylou | 0:d0c521cb6c90 | 161 | file.write(tmp,strlen(tmp)); |
| geekylou | 0:d0c521cb6c90 | 162 | sprintf(tmp,"Goodbye World!\r\n"); |
| geekylou | 0:d0c521cb6c90 | 163 | file.write(tmp,strlen(tmp)); |
| geekylou | 0:d0c521cb6c90 | 164 | file.close(); |
| geekylou | 0:d0c521cb6c90 | 165 | } else { |
| geekylou | 0:d0c521cb6c90 | 166 | printf("FILE == NULL\r\n"); |
| geekylou | 0:d0c521cb6c90 | 167 | } |
| geekylou | 0:d0c521cb6c90 | 168 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 169 | printf("again\n"); |
| geekylou | 0:d0c521cb6c90 | 170 | // if device disconnected, try to connect again |
| geekylou | 0:d0c521cb6c90 | 171 | while (msd.connected()) { |
| geekylou | 0:d0c521cb6c90 | 172 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 173 | } |
| geekylou | 0:d0c521cb6c90 | 174 | while (fs.unmount() < 0) { |
| geekylou | 0:d0c521cb6c90 | 175 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 176 | printf("unmount\n"); |
| geekylou | 0:d0c521cb6c90 | 177 | } |
| geekylou | 0:d0c521cb6c90 | 178 | } |
| geekylou | 0:d0c521cb6c90 | 179 | } |
| geekylou | 0:d0c521cb6c90 | 180 | |
| geekylou | 0:d0c521cb6c90 | 181 | int main() { |
| geekylou | 0:d0c521cb6c90 | 182 | Thread msdTask(msd_task, NULL, osPriorityNormal, 1024 * 4); |
| geekylou | 0:d0c521cb6c90 | 183 | Thread mouseTask(mouse_task, NULL, osPriorityNormal, 1024* 4); |
| geekylou | 1:ab916b5c1a4d | 184 | Thread steamctrlTask(steamctrl_task, NULL, osPriorityNormal, 1024* 4); |
| geekylou | 1:ab916b5c1a4d | 185 | //Thread keyboardTask(keyboard_task, NULL, osPriorityNormal, 1024 * 4); |
| geekylou | 0:d0c521cb6c90 | 186 | |
| geekylou | 0:d0c521cb6c90 | 187 | int x,y = 0; |
| geekylou | 0:d0c521cb6c90 | 188 | for(y=-10; y<10; y++) |
| geekylou | 0:d0c521cb6c90 | 189 | { |
| geekylou | 0:d0c521cb6c90 | 190 | x = y & 3; |
| geekylou | 0:d0c521cb6c90 | 191 | printf("phase %d[%d] %d\r\n",((x + 1)/2) & 1, x, (x/2) & 0x1 ); |
| geekylou | 0:d0c521cb6c90 | 192 | } |
| geekylou | 0:d0c521cb6c90 | 193 | while(1) { |
| geekylou | 0:d0c521cb6c90 | 194 | //led=!led; |
| geekylou | 0:d0c521cb6c90 | 195 | Thread::wait(500); |
| geekylou | 0:d0c521cb6c90 | 196 | } |
| geekylou | 0:d0c521cb6c90 | 197 | } |