USB IO module

Dependencies:   USBDevice mbed

Committer:
BPPearson
Date:
Tue Jan 05 16:45:45 2016 +0000
Revision:
0:08e9f3bccfda
USB IO module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BPPearson 0:08e9f3bccfda 1 #include "mbed.h"
BPPearson 0:08e9f3bccfda 2 #include "watchdog.h"
BPPearson 0:08e9f3bccfda 3 #include "USBHID.h"
BPPearson 0:08e9f3bccfda 4 #include "ByteOperations.h"
BPPearson 0:08e9f3bccfda 5 #include "USBHIDProtocol.h"
BPPearson 0:08e9f3bccfda 6
BPPearson 0:08e9f3bccfda 7 #define VERSION 0x01
BPPearson 0:08e9f3bccfda 8
BPPearson 0:08e9f3bccfda 9
BPPearson 0:08e9f3bccfda 10 // define all I/O
BPPearson 0:08e9f3bccfda 11 DigitalOut led1(LED1);
BPPearson 0:08e9f3bccfda 12 DigitalOut led2(LED2);
BPPearson 0:08e9f3bccfda 13 DigitalOut led3(LED3);
BPPearson 0:08e9f3bccfda 14 DigitalOut led4(LED4);
BPPearson 0:08e9f3bccfda 15 DigitalIn digIn1(p6);
BPPearson 0:08e9f3bccfda 16 DigitalIn digIn2(p7);
BPPearson 0:08e9f3bccfda 17 DigitalIn digIn3(p8);
BPPearson 0:08e9f3bccfda 18 DigitalIn digIn4(p9);
BPPearson 0:08e9f3bccfda 19 DigitalIn digIn5(p10);
BPPearson 0:08e9f3bccfda 20 DigitalIn digIn6(p11);
BPPearson 0:08e9f3bccfda 21 DigitalIn digIn7(p12);
BPPearson 0:08e9f3bccfda 22 DigitalIn digIn8(p13);
BPPearson 0:08e9f3bccfda 23 //DigitalIn digIn9(p13);
BPPearson 0:08e9f3bccfda 24 //DigitalIn digIn10(p14);
BPPearson 0:08e9f3bccfda 25 DigitalOut digOut1(p21);
BPPearson 0:08e9f3bccfda 26 DigitalOut digOut2(p22);
BPPearson 0:08e9f3bccfda 27 DigitalOut digOut3(p23);
BPPearson 0:08e9f3bccfda 28 DigitalOut digOut4(p24);
BPPearson 0:08e9f3bccfda 29 DigitalOut digOut5(p25);
BPPearson 0:08e9f3bccfda 30 DigitalOut digOut6(p26);
BPPearson 0:08e9f3bccfda 31 DigitalOut digOut7(p27);
BPPearson 0:08e9f3bccfda 32 DigitalOut digOut8(p28);
BPPearson 0:08e9f3bccfda 33 AnalogIn anIn1(p16);
BPPearson 0:08e9f3bccfda 34 AnalogIn anIn2(p17);
BPPearson 0:08e9f3bccfda 35 AnalogIn anIn3(p19);
BPPearson 0:08e9f3bccfda 36 AnalogIn anIn4(p20);
BPPearson 0:08e9f3bccfda 37 AnalogOut anOut(p18);
BPPearson 0:08e9f3bccfda 38
BPPearson 0:08e9f3bccfda 39 //Serial pc(USBTX, USBRX);
BPPearson 0:08e9f3bccfda 40
BPPearson 0:08e9f3bccfda 41 USBHID *hid;
BPPearson 0:08e9f3bccfda 42 HID_REPORT send_report __attribute__((aligned (4))); // Aligned for fast access
BPPearson 0:08e9f3bccfda 43 HID_REPORT recv_report __attribute__((aligned (4))); // Aligned for fast access
BPPearson 0:08e9f3bccfda 44
BPPearson 0:08e9f3bccfda 45
BPPearson 0:08e9f3bccfda 46 /**
BPPearson 0:08e9f3bccfda 47 * @brief Clear buffer contents
BPPearson 0:08e9f3bccfda 48 * @note Requires 4 byte alignement of data
BPPearson 0:08e9f3bccfda 49 * @param[in] c Pointer to @p HID_REPORT.
BPPearson 0:08e9f3bccfda 50 */
BPPearson 0:08e9f3bccfda 51 void empty_report(HID_REPORT *data){
BPPearson 0:08e9f3bccfda 52 register uint32_t *p = (uint32_t *)data->data;
BPPearson 0:08e9f3bccfda 53 for( register int i=0; i<((sizeof(HID_REPORT)-1)/4); i++ ){
BPPearson 0:08e9f3bccfda 54 *p = 0xFFFFFFFF;
BPPearson 0:08e9f3bccfda 55 p++;
BPPearson 0:08e9f3bccfda 56 }
BPPearson 0:08e9f3bccfda 57 }
BPPearson 0:08e9f3bccfda 58
BPPearson 0:08e9f3bccfda 59
BPPearson 0:08e9f3bccfda 60 int main(void)
BPPearson 0:08e9f3bccfda 61 {
BPPearson 0:08e9f3bccfda 62 uint16_t channel;
BPPearson 0:08e9f3bccfda 63 uint16_t value;
BPPearson 0:08e9f3bccfda 64
BPPearson 0:08e9f3bccfda 65 // USB Initialize
BPPearson 0:08e9f3bccfda 66 static USBHID hid_object(64, 64);
BPPearson 0:08e9f3bccfda 67 hid = &hid_object;
BPPearson 0:08e9f3bccfda 68 send_report.length = 64;
BPPearson 0:08e9f3bccfda 69
BPPearson 0:08e9f3bccfda 70 //pc.printf("Start of main\n");
BPPearson 0:08e9f3bccfda 71
BPPearson 0:08e9f3bccfda 72 // Ready
BPPearson 0:08e9f3bccfda 73 while(1){
BPPearson 0:08e9f3bccfda 74 // insert idle time, since we cant be running USB stuff all the time
BPPearson 0:08e9f3bccfda 75 wait_us(5000);
BPPearson 0:08e9f3bccfda 76
BPPearson 0:08e9f3bccfda 77 //try to read a msg
BPPearson 0:08e9f3bccfda 78 if(hid->readNB(&recv_report)){
BPPearson 0:08e9f3bccfda 79 // Data packet received, start parsing
BPPearson 0:08e9f3bccfda 80 int irx=0;
BPPearson 0:08e9f3bccfda 81 int itx=0;
BPPearson 0:08e9f3bccfda 82
BPPearson 0:08e9f3bccfda 83 send_report.data[itx++] = recv_report.data[0];
BPPearson 0:08e9f3bccfda 84
BPPearson 0:08e9f3bccfda 85 switch ( recv_report.data[irx++] ){
BPPearson 0:08e9f3bccfda 86 case CMD_SYS_CHECK :
BPPearson 0:08e9f3bccfda 87 send_report.data[itx++] = VERSION;
BPPearson 0:08e9f3bccfda 88 break;
BPPearson 0:08e9f3bccfda 89
BPPearson 0:08e9f3bccfda 90 case CMD_SYS_RESET :
BPPearson 0:08e9f3bccfda 91 // Soft reset
BPPearson 0:08e9f3bccfda 92 empty_report(&recv_report);
BPPearson 0:08e9f3bccfda 93 break;
BPPearson 0:08e9f3bccfda 94
BPPearson 0:08e9f3bccfda 95 case CMD_LED_OFF :
BPPearson 0:08e9f3bccfda 96 // CMD_LED_OFF Args, byte led 1..4
BPPearson 0:08e9f3bccfda 97 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 98 switch (channel){
BPPearson 0:08e9f3bccfda 99 case 1:
BPPearson 0:08e9f3bccfda 100 led1 = 1; // inverted led
BPPearson 0:08e9f3bccfda 101 break;
BPPearson 0:08e9f3bccfda 102 case 2:
BPPearson 0:08e9f3bccfda 103 led2 = 1; // inverted led
BPPearson 0:08e9f3bccfda 104 break;
BPPearson 0:08e9f3bccfda 105 case 3:
BPPearson 0:08e9f3bccfda 106 led3 = 0; // inverted led
BPPearson 0:08e9f3bccfda 107 break;
BPPearson 0:08e9f3bccfda 108 case 4:
BPPearson 0:08e9f3bccfda 109 led4 = 0; // inverted led
BPPearson 0:08e9f3bccfda 110 break;
BPPearson 0:08e9f3bccfda 111 default:
BPPearson 0:08e9f3bccfda 112 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 113 }
BPPearson 0:08e9f3bccfda 114 break;
BPPearson 0:08e9f3bccfda 115
BPPearson 0:08e9f3bccfda 116 case CMD_LED_ON :
BPPearson 0:08e9f3bccfda 117 // CMD_LED_ON Args, byte led 1..4
BPPearson 0:08e9f3bccfda 118 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 119 switch (channel){
BPPearson 0:08e9f3bccfda 120 case 1:
BPPearson 0:08e9f3bccfda 121 led1 = 0; // inverted led
BPPearson 0:08e9f3bccfda 122 break;
BPPearson 0:08e9f3bccfda 123 case 2:
BPPearson 0:08e9f3bccfda 124 led2 = 0; // inverted led
BPPearson 0:08e9f3bccfda 125 break;
BPPearson 0:08e9f3bccfda 126 case 3:
BPPearson 0:08e9f3bccfda 127 led3 = 1; // inverted led
BPPearson 0:08e9f3bccfda 128 break;
BPPearson 0:08e9f3bccfda 129 case 4:
BPPearson 0:08e9f3bccfda 130 led4 = 1; // inverted led
BPPearson 0:08e9f3bccfda 131 break;
BPPearson 0:08e9f3bccfda 132 default:
BPPearson 0:08e9f3bccfda 133 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 134 }
BPPearson 0:08e9f3bccfda 135 break;
BPPearson 0:08e9f3bccfda 136
BPPearson 0:08e9f3bccfda 137 case CMD_READ_DIG_INPUT :
BPPearson 0:08e9f3bccfda 138 // CMD_READ_DIG_INPUT Args, byte channel, return int
BPPearson 0:08e9f3bccfda 139 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 140 value = 0;
BPPearson 0:08e9f3bccfda 141 switch (channel){
BPPearson 0:08e9f3bccfda 142 case 1:
BPPearson 0:08e9f3bccfda 143 value = digIn1.read();
BPPearson 0:08e9f3bccfda 144 break;
BPPearson 0:08e9f3bccfda 145 case 2:
BPPearson 0:08e9f3bccfda 146 value = digIn2.read();
BPPearson 0:08e9f3bccfda 147 break;
BPPearson 0:08e9f3bccfda 148 case 3:
BPPearson 0:08e9f3bccfda 149 value = digIn3.read();
BPPearson 0:08e9f3bccfda 150 break;
BPPearson 0:08e9f3bccfda 151 case 4:
BPPearson 0:08e9f3bccfda 152 value = digIn4.read();
BPPearson 0:08e9f3bccfda 153 break;
BPPearson 0:08e9f3bccfda 154 case 5:
BPPearson 0:08e9f3bccfda 155 value = digIn5.read();
BPPearson 0:08e9f3bccfda 156 break;
BPPearson 0:08e9f3bccfda 157 case 6:
BPPearson 0:08e9f3bccfda 158 value = digIn6.read();
BPPearson 0:08e9f3bccfda 159 break;
BPPearson 0:08e9f3bccfda 160 case 7:
BPPearson 0:08e9f3bccfda 161 value = digIn7.read();
BPPearson 0:08e9f3bccfda 162 break;
BPPearson 0:08e9f3bccfda 163 case 8:
BPPearson 0:08e9f3bccfda 164 value = digIn8.read();
BPPearson 0:08e9f3bccfda 165 break;
BPPearson 0:08e9f3bccfda 166 default:
BPPearson 0:08e9f3bccfda 167 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 168 }
BPPearson 0:08e9f3bccfda 169 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 170 break;
BPPearson 0:08e9f3bccfda 171
BPPearson 0:08e9f3bccfda 172 case CMD_READ_ALL_DIG_INPUTS :
BPPearson 0:08e9f3bccfda 173 // CMD_READ_ALL_DIG_INPUTS No args, return int
BPPearson 0:08e9f3bccfda 174 value = 0;
BPPearson 0:08e9f3bccfda 175 value = digIn1.read();
BPPearson 0:08e9f3bccfda 176 value |= ((digIn2.read() & 1) << 1);
BPPearson 0:08e9f3bccfda 177 value |= ((digIn3.read() & 1) << 2);
BPPearson 0:08e9f3bccfda 178 value |= ((digIn4.read() & 1) << 3);
BPPearson 0:08e9f3bccfda 179 value |= ((digIn5.read() & 1) << 4);
BPPearson 0:08e9f3bccfda 180 value |= ((digIn6.read() & 1) << 5);
BPPearson 0:08e9f3bccfda 181 value |= ((digIn7.read() & 1) << 6);
BPPearson 0:08e9f3bccfda 182 value |= ((digIn8.read() & 1) << 7);
BPPearson 0:08e9f3bccfda 183 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 184 break;
BPPearson 0:08e9f3bccfda 185
BPPearson 0:08e9f3bccfda 186 case CMD_READ_DIG_OUTPUT :
BPPearson 0:08e9f3bccfda 187 // CMD_READ_DIG_OUTPUT Args, byte channel, return int
BPPearson 0:08e9f3bccfda 188 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 189 value = 0;
BPPearson 0:08e9f3bccfda 190 switch (channel){
BPPearson 0:08e9f3bccfda 191 case 1:
BPPearson 0:08e9f3bccfda 192 value = digOut1.read();
BPPearson 0:08e9f3bccfda 193 break;
BPPearson 0:08e9f3bccfda 194 case 2:
BPPearson 0:08e9f3bccfda 195 value = digOut2.read();
BPPearson 0:08e9f3bccfda 196 break;
BPPearson 0:08e9f3bccfda 197 case 3:
BPPearson 0:08e9f3bccfda 198 value = digOut3.read();
BPPearson 0:08e9f3bccfda 199 break;
BPPearson 0:08e9f3bccfda 200 case 4:
BPPearson 0:08e9f3bccfda 201 value = digOut4.read();
BPPearson 0:08e9f3bccfda 202 break;
BPPearson 0:08e9f3bccfda 203 case 5:
BPPearson 0:08e9f3bccfda 204 value = digOut5.read();
BPPearson 0:08e9f3bccfda 205 break;
BPPearson 0:08e9f3bccfda 206 case 6:
BPPearson 0:08e9f3bccfda 207 value = digOut6.read();
BPPearson 0:08e9f3bccfda 208 break;
BPPearson 0:08e9f3bccfda 209 case 7:
BPPearson 0:08e9f3bccfda 210 value = digOut7.read();
BPPearson 0:08e9f3bccfda 211 break;
BPPearson 0:08e9f3bccfda 212 case 8:
BPPearson 0:08e9f3bccfda 213 value = digOut8.read();
BPPearson 0:08e9f3bccfda 214 break;
BPPearson 0:08e9f3bccfda 215 default:
BPPearson 0:08e9f3bccfda 216 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 217 }
BPPearson 0:08e9f3bccfda 218 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 219 break;
BPPearson 0:08e9f3bccfda 220
BPPearson 0:08e9f3bccfda 221 case CMD_READ_ALL_DIG_OUTPUTS :
BPPearson 0:08e9f3bccfda 222 // CMD_READ_ALL_DIG_OUTPUTS No args, return int
BPPearson 0:08e9f3bccfda 223 value = 0;
BPPearson 0:08e9f3bccfda 224 value = digOut1.read();
BPPearson 0:08e9f3bccfda 225 value |= ((digOut2.read() & 1) << 1);
BPPearson 0:08e9f3bccfda 226 value |= ((digOut3.read() & 1) << 2);
BPPearson 0:08e9f3bccfda 227 value |= ((digOut4.read() & 1) << 3);
BPPearson 0:08e9f3bccfda 228 value |= ((digOut5.read() & 1) << 4);
BPPearson 0:08e9f3bccfda 229 value |= ((digOut6.read() & 1) << 5);
BPPearson 0:08e9f3bccfda 230 value |= ((digOut7.read() & 1) << 6);
BPPearson 0:08e9f3bccfda 231 value |= ((digOut8.read() & 1) << 7);
BPPearson 0:08e9f3bccfda 232 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 233 break;
BPPearson 0:08e9f3bccfda 234
BPPearson 0:08e9f3bccfda 235 case CMD_WRITE_DIG_OUTPUT :
BPPearson 0:08e9f3bccfda 236 // CMD_WRITE_DIG_OUTPUT Args, byte channel, int value
BPPearson 0:08e9f3bccfda 237 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 238 value = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 239 switch (channel){
BPPearson 0:08e9f3bccfda 240 case 1:
BPPearson 0:08e9f3bccfda 241 digOut1.write(!(value & 1));
BPPearson 0:08e9f3bccfda 242 break;
BPPearson 0:08e9f3bccfda 243 case 2:
BPPearson 0:08e9f3bccfda 244 digOut2.write(!(value & 1));
BPPearson 0:08e9f3bccfda 245 break;
BPPearson 0:08e9f3bccfda 246 case 3:
BPPearson 0:08e9f3bccfda 247 digOut3.write(value & 1);
BPPearson 0:08e9f3bccfda 248 break;
BPPearson 0:08e9f3bccfda 249 case 4:
BPPearson 0:08e9f3bccfda 250 digOut4.write(value & 1);
BPPearson 0:08e9f3bccfda 251 break;
BPPearson 0:08e9f3bccfda 252 case 5:
BPPearson 0:08e9f3bccfda 253 digOut5.write(value & 1);
BPPearson 0:08e9f3bccfda 254 break;
BPPearson 0:08e9f3bccfda 255 case 6:
BPPearson 0:08e9f3bccfda 256 digOut6.write(value & 1);
BPPearson 0:08e9f3bccfda 257 break;
BPPearson 0:08e9f3bccfda 258 case 7:
BPPearson 0:08e9f3bccfda 259 digOut7.write(value & 1);
BPPearson 0:08e9f3bccfda 260 break;
BPPearson 0:08e9f3bccfda 261 case 8:
BPPearson 0:08e9f3bccfda 262 digOut8.write(value & 1);
BPPearson 0:08e9f3bccfda 263 break;
BPPearson 0:08e9f3bccfda 264 default:
BPPearson 0:08e9f3bccfda 265 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 266 }
BPPearson 0:08e9f3bccfda 267 break;
BPPearson 0:08e9f3bccfda 268
BPPearson 0:08e9f3bccfda 269 case CMD_WRITE_ALL_DIG_OUTPUTS :
BPPearson 0:08e9f3bccfda 270 // CMD_WRIE_ALL_DIG_OUTPUTS Args, byte output value
BPPearson 0:08e9f3bccfda 271 uint16_t value = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 272 digOut1.write(value & 1);
BPPearson 0:08e9f3bccfda 273 digOut2.write((value >> 1) & 1);
BPPearson 0:08e9f3bccfda 274 digOut3.write((value >> 2) & 1);
BPPearson 0:08e9f3bccfda 275 digOut4.write((value >> 3) & 1);
BPPearson 0:08e9f3bccfda 276 digOut5.write((value >> 4) & 1);
BPPearson 0:08e9f3bccfda 277 digOut6.write((value >> 5) & 1);
BPPearson 0:08e9f3bccfda 278 digOut7.write((value >> 6) & 1);
BPPearson 0:08e9f3bccfda 279 digOut8.write((value >> 7) & 1);
BPPearson 0:08e9f3bccfda 280 break;
BPPearson 0:08e9f3bccfda 281
BPPearson 0:08e9f3bccfda 282 case CMD_READ_ANALOG_INPUT :
BPPearson 0:08e9f3bccfda 283 // CMD_READ_ANALOG_INPUT Args, byte channel, return int
BPPearson 0:08e9f3bccfda 284 channel = recv_report.data[irx++];
BPPearson 0:08e9f3bccfda 285 //pc.printf("Channel %d\n", channel);
BPPearson 0:08e9f3bccfda 286 switch (channel){
BPPearson 0:08e9f3bccfda 287 case 1:
BPPearson 0:08e9f3bccfda 288 uint16_t value = anIn1.read_u16();
BPPearson 0:08e9f3bccfda 289 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 290 //pc.printf("Value %d\n", value );
BPPearson 0:08e9f3bccfda 291 break;
BPPearson 0:08e9f3bccfda 292 case 2:
BPPearson 0:08e9f3bccfda 293 value = anIn2.read_u16();
BPPearson 0:08e9f3bccfda 294 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 295 break;
BPPearson 0:08e9f3bccfda 296 case 3:
BPPearson 0:08e9f3bccfda 297 value = anIn3.read_u16();
BPPearson 0:08e9f3bccfda 298 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 299 break;
BPPearson 0:08e9f3bccfda 300 case 4:
BPPearson 0:08e9f3bccfda 301 value = anIn4.read_u16();
BPPearson 0:08e9f3bccfda 302 write_16_to_8(&itx, send_report.data, value);
BPPearson 0:08e9f3bccfda 303 break;
BPPearson 0:08e9f3bccfda 304 default:
BPPearson 0:08e9f3bccfda 305 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 306 }
BPPearson 0:08e9f3bccfda 307 break;
BPPearson 0:08e9f3bccfda 308
BPPearson 0:08e9f3bccfda 309 case CMD_WRITE_ANALOG_OUTPUT :
BPPearson 0:08e9f3bccfda 310 // CMD_WRITE_ANALOG_OUTPUT Args, int value
BPPearson 0:08e9f3bccfda 311 value = read_8_to_16(&irx, recv_report.data);
BPPearson 0:08e9f3bccfda 312 anOut.write_u16(value);
BPPearson 0:08e9f3bccfda 313 break;
BPPearson 0:08e9f3bccfda 314
BPPearson 0:08e9f3bccfda 315 case 0xEE : {
BPPearson 0:08e9f3bccfda 316 hid->sendNB(&send_report);
BPPearson 0:08e9f3bccfda 317 WatchDog_us bello(100);
BPPearson 0:08e9f3bccfda 318 }
BPPearson 0:08e9f3bccfda 319 break;
BPPearson 0:08e9f3bccfda 320
BPPearson 0:08e9f3bccfda 321 default:
BPPearson 0:08e9f3bccfda 322 send_report.data[0] = 0xFF; //Failure
BPPearson 0:08e9f3bccfda 323 break;
BPPearson 0:08e9f3bccfda 324 } // Switch
BPPearson 0:08e9f3bccfda 325 // Return command + optional new args
BPPearson 0:08e9f3bccfda 326 hid->send(&send_report);
BPPearson 0:08e9f3bccfda 327 // 0xFF unused bytes
BPPearson 0:08e9f3bccfda 328 empty_report(&recv_report);
BPPearson 0:08e9f3bccfda 329 empty_report(&send_report);
BPPearson 0:08e9f3bccfda 330 } // if packet
BPPearson 0:08e9f3bccfda 331 } // While
BPPearson 0:08e9f3bccfda 332 }
BPPearson 0:08e9f3bccfda 333