The firmware of fav-button which distributed at Comike86.
Dependencies: M0_EEPROM_test USBDevice mbed
Fork of USBMouseKeyboard_HelloWorld by
main.cpp@7:d637e03e22bb, 2014-08-15 (annotated)
- Committer:
- betaEncoder
- Date:
- Fri Aug 15 14:19:12 2014 +0000
- Revision:
- 7:d637e03e22bb
- Parent:
- 5:656591c7c89f
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
samux | 0:845782b77b0d | 1 | #include "mbed.h" |
betaEncoder | 7:d637e03e22bb | 2 | |
samux | 0:845782b77b0d | 3 | #include "USBMouseKeyboard.h" |
betaEncoder | 7:d637e03e22bb | 4 | #include "IAP.h" |
betaEncoder | 7:d637e03e22bb | 5 | |
betaEncoder | 7:d637e03e22bb | 6 | #define TARGET_ADDRESS (64) |
betaEncoder | 7:d637e03e22bb | 7 | |
betaEncoder | 7:d637e03e22bb | 8 | #define QUEUE_IDLE (0) |
betaEncoder | 7:d637e03e22bb | 9 | #define QUEUE_READ (1) |
betaEncoder | 7:d637e03e22bb | 10 | #define QUEUE_WRITE (2) |
betaEncoder | 7:d637e03e22bb | 11 | #define QUEUE_DUMP (3) |
betaEncoder | 7:d637e03e22bb | 12 | volatile unsigned char queue = QUEUE_IDLE; |
betaEncoder | 7:d637e03e22bb | 13 | volatile unsigned char messageLength = 0; |
betaEncoder | 7:d637e03e22bb | 14 | char buff[64]; |
betaEncoder | 7:d637e03e22bb | 15 | |
betaEncoder | 7:d637e03e22bb | 16 | DigitalOut myled0(P1_15), myled1(P0_23); |
betaEncoder | 7:d637e03e22bb | 17 | DigitalIn sw(P0_21, PullUp); |
betaEncoder | 7:d637e03e22bb | 18 | USBMouseKeyboard key_mouse(REL_MOUSE, 0x1FC9, 0x80BA, 0x0001); |
betaEncoder | 7:d637e03e22bb | 19 | IAP iap; |
betaEncoder | 7:d637e03e22bb | 20 | |
betaEncoder | 7:d637e03e22bb | 21 | typedef struct _hidCommand{ |
betaEncoder | 7:d637e03e22bb | 22 | uint8_t reportSize; |
betaEncoder | 7:d637e03e22bb | 23 | uint8_t reportID; |
betaEncoder | 7:d637e03e22bb | 24 | uint8_t report[8]; |
betaEncoder | 7:d637e03e22bb | 25 | } hidCommand; |
betaEncoder | 7:d637e03e22bb | 26 | |
betaEncoder | 7:d637e03e22bb | 27 | void errorLED() { |
betaEncoder | 7:d637e03e22bb | 28 | while(1) { |
betaEncoder | 7:d637e03e22bb | 29 | myled1 = 0; |
betaEncoder | 7:d637e03e22bb | 30 | wait(0.1); |
betaEncoder | 7:d637e03e22bb | 31 | myled1 = 1; |
betaEncoder | 7:d637e03e22bb | 32 | wait(0.1); |
betaEncoder | 7:d637e03e22bb | 33 | } |
betaEncoder | 7:d637e03e22bb | 34 | } |
betaEncoder | 7:d637e03e22bb | 35 | |
betaEncoder | 7:d637e03e22bb | 36 | void key_pressed(hidCommand *command){ |
betaEncoder | 7:d637e03e22bb | 37 | int i = 0; |
betaEncoder | 7:d637e03e22bb | 38 | while(1){ |
betaEncoder | 7:d637e03e22bb | 39 | if(command[i].reportSize == 0){ |
betaEncoder | 7:d637e03e22bb | 40 | return; |
betaEncoder | 7:d637e03e22bb | 41 | } |
betaEncoder | 7:d637e03e22bb | 42 | |
betaEncoder | 7:d637e03e22bb | 43 | HID_REPORT report; |
betaEncoder | 7:d637e03e22bb | 44 | |
betaEncoder | 7:d637e03e22bb | 45 | report.length = command[i].reportSize+1; |
betaEncoder | 7:d637e03e22bb | 46 | report.data[0] = command[i].reportID; |
betaEncoder | 7:d637e03e22bb | 47 | memcpy(&report.data[1], command[i].report, command[i].reportSize); |
betaEncoder | 7:d637e03e22bb | 48 | key_mouse.send(&report); |
betaEncoder | 7:d637e03e22bb | 49 | |
betaEncoder | 7:d637e03e22bb | 50 | if(report.data[0]==REPORT_ID_KEYBOARD || report.data[0]==REPORT_ID_MOUSE){ |
betaEncoder | 7:d637e03e22bb | 51 | for(int j=0;j<report.length;j++){ |
betaEncoder | 7:d637e03e22bb | 52 | report.data[j+1] = 0; |
betaEncoder | 7:d637e03e22bb | 53 | } |
betaEncoder | 7:d637e03e22bb | 54 | key_mouse.send(&report); |
betaEncoder | 7:d637e03e22bb | 55 | } |
betaEncoder | 7:d637e03e22bb | 56 | |
betaEncoder | 7:d637e03e22bb | 57 | i++; |
betaEncoder | 7:d637e03e22bb | 58 | wait(0.01); |
betaEncoder | 7:d637e03e22bb | 59 | } |
betaEncoder | 7:d637e03e22bb | 60 | } |
betaEncoder | 7:d637e03e22bb | 61 | |
samux | 0:845782b77b0d | 62 | int main(void) { |
betaEncoder | 7:d637e03e22bb | 63 | if( iap.read_eeprom( (char*)TARGET_ADDRESS, &buff[0], 64 ) ) { |
betaEncoder | 7:d637e03e22bb | 64 | errorLED(); |
betaEncoder | 7:d637e03e22bb | 65 | } |
betaEncoder | 7:d637e03e22bb | 66 | |
betaEncoder | 7:d637e03e22bb | 67 | unsigned int cnt = 0, pwm = 0; |
betaEncoder | 7:d637e03e22bb | 68 | const int pwm_resolution = 1023; |
betaEncoder | 7:d637e03e22bb | 69 | unsigned char dir = 1, blink = 0, blink_cnt = 255; |
betaEncoder | 7:d637e03e22bb | 70 | const unsigned char blinc_count = 8; |
betaEncoder | 7:d637e03e22bb | 71 | |
samux | 0:845782b77b0d | 72 | while (1) { |
betaEncoder | 7:d637e03e22bb | 73 | if(cnt==0){ |
betaEncoder | 7:d637e03e22bb | 74 | cnt = pwm_resolution; |
betaEncoder | 7:d637e03e22bb | 75 | }else{ |
betaEncoder | 7:d637e03e22bb | 76 | cnt--; |
betaEncoder | 7:d637e03e22bb | 77 | } |
betaEncoder | 7:d637e03e22bb | 78 | // drive led |
betaEncoder | 7:d637e03e22bb | 79 | if(blink>0){ |
betaEncoder | 7:d637e03e22bb | 80 | // blink section |
betaEncoder | 7:d637e03e22bb | 81 | if( cnt == 0 ){ |
betaEncoder | 7:d637e03e22bb | 82 | blink_cnt--; |
betaEncoder | 7:d637e03e22bb | 83 | if( blink_cnt == 0 ){ |
betaEncoder | 7:d637e03e22bb | 84 | blink_cnt = 255; |
betaEncoder | 7:d637e03e22bb | 85 | blink--; |
betaEncoder | 7:d637e03e22bb | 86 | myled0 = blink & 1; |
betaEncoder | 7:d637e03e22bb | 87 | myled1 = blink & 1; |
betaEncoder | 7:d637e03e22bb | 88 | } |
betaEncoder | 7:d637e03e22bb | 89 | } |
betaEncoder | 7:d637e03e22bb | 90 | }else{ |
betaEncoder | 7:d637e03e22bb | 91 | // dimmer section |
betaEncoder | 7:d637e03e22bb | 92 | if(cnt==0){ |
betaEncoder | 7:d637e03e22bb | 93 | if(dir){ |
betaEncoder | 7:d637e03e22bb | 94 | pwm++; |
betaEncoder | 7:d637e03e22bb | 95 | if(pwm==pwm_resolution){ |
betaEncoder | 7:d637e03e22bb | 96 | dir = 0; |
betaEncoder | 7:d637e03e22bb | 97 | } |
betaEncoder | 7:d637e03e22bb | 98 | }else{ |
betaEncoder | 7:d637e03e22bb | 99 | pwm--; |
betaEncoder | 7:d637e03e22bb | 100 | if(pwm==0){ |
betaEncoder | 7:d637e03e22bb | 101 | dir = 1; |
betaEncoder | 7:d637e03e22bb | 102 | } |
betaEncoder | 7:d637e03e22bb | 103 | } |
betaEncoder | 7:d637e03e22bb | 104 | } |
betaEncoder | 7:d637e03e22bb | 105 | if(cnt<pwm){ |
betaEncoder | 7:d637e03e22bb | 106 | myled0 = 1; |
betaEncoder | 7:d637e03e22bb | 107 | myled1 = 1; |
betaEncoder | 7:d637e03e22bb | 108 | }else{ |
betaEncoder | 7:d637e03e22bb | 109 | myled0 = 0; |
betaEncoder | 7:d637e03e22bb | 110 | myled1 = 0; |
betaEncoder | 7:d637e03e22bb | 111 | } |
betaEncoder | 7:d637e03e22bb | 112 | } |
betaEncoder | 7:d637e03e22bb | 113 | |
betaEncoder | 7:d637e03e22bb | 114 | // sw polling |
betaEncoder | 7:d637e03e22bb | 115 | if(sw==0){ |
betaEncoder | 7:d637e03e22bb | 116 | wait(0.02); |
betaEncoder | 7:d637e03e22bb | 117 | if(sw==0){ |
betaEncoder | 7:d637e03e22bb | 118 | key_pressed((hidCommand*)buff); |
betaEncoder | 7:d637e03e22bb | 119 | myled0 = 1; |
betaEncoder | 7:d637e03e22bb | 120 | myled1 = 1; |
betaEncoder | 7:d637e03e22bb | 121 | while(sw==0); |
betaEncoder | 7:d637e03e22bb | 122 | myled0 = 0; |
betaEncoder | 7:d637e03e22bb | 123 | myled1 = 0; |
betaEncoder | 7:d637e03e22bb | 124 | } |
betaEncoder | 7:d637e03e22bb | 125 | } |
betaEncoder | 7:d637e03e22bb | 126 | |
betaEncoder | 7:d637e03e22bb | 127 | // queue polling |
betaEncoder | 7:d637e03e22bb | 128 | if(queue == QUEUE_READ){ |
betaEncoder | 7:d637e03e22bb | 129 | HID_REPORT report; |
betaEncoder | 7:d637e03e22bb | 130 | report.data[0] = REPORT_ID_UTILITY; |
betaEncoder | 7:d637e03e22bb | 131 | report.data[1] = iap.read_eeprom( (char*)TARGET_ADDRESS, &buff[0], 64 ); |
betaEncoder | 7:d637e03e22bb | 132 | memcpy(&report.data[1], &buff[0], REPORT_PAYLOAD_SIZE); |
betaEncoder | 7:d637e03e22bb | 133 | report.length = REPORT_PAYLOAD_SIZE + 1; |
betaEncoder | 7:d637e03e22bb | 134 | key_mouse.send(&report); |
betaEncoder | 7:d637e03e22bb | 135 | queue = QUEUE_IDLE; |
betaEncoder | 7:d637e03e22bb | 136 | blink = blinc_count; |
betaEncoder | 7:d637e03e22bb | 137 | } else if(queue == QUEUE_WRITE){ |
betaEncoder | 7:d637e03e22bb | 138 | HID_REPORT report; |
betaEncoder | 7:d637e03e22bb | 139 | report.data[0] = REPORT_ID_UTILITY; |
betaEncoder | 7:d637e03e22bb | 140 | report.data[1] = iap.write_eeprom( &buff[0], (char*)TARGET_ADDRESS, 64 ); |
betaEncoder | 7:d637e03e22bb | 141 | for(int i=2;i<REPORT_PAYLOAD_SIZE+1;i++){ |
betaEncoder | 7:d637e03e22bb | 142 | report.data[i] = 0; |
betaEncoder | 7:d637e03e22bb | 143 | } |
betaEncoder | 7:d637e03e22bb | 144 | report.length = REPORT_PAYLOAD_SIZE + 1; |
betaEncoder | 7:d637e03e22bb | 145 | key_mouse.send(&report); |
betaEncoder | 7:d637e03e22bb | 146 | queue = QUEUE_IDLE; |
betaEncoder | 7:d637e03e22bb | 147 | } else if(queue == QUEUE_DUMP){ |
betaEncoder | 7:d637e03e22bb | 148 | HID_REPORT report; |
betaEncoder | 7:d637e03e22bb | 149 | report.data[0] = REPORT_ID_UTILITY; |
betaEncoder | 7:d637e03e22bb | 150 | memcpy(&report.data[1], &buff[0], REPORT_PAYLOAD_SIZE); |
betaEncoder | 7:d637e03e22bb | 151 | report.length = REPORT_PAYLOAD_SIZE + 1; |
betaEncoder | 7:d637e03e22bb | 152 | key_mouse.send(&report); |
betaEncoder | 7:d637e03e22bb | 153 | } |
samux | 0:845782b77b0d | 154 | } |
betaEncoder | 7:d637e03e22bb | 155 | } |
betaEncoder | 7:d637e03e22bb | 156 | |
betaEncoder | 7:d637e03e22bb | 157 | void USBMouseKeyboard::genericHidCallback(uint32_t length, uint8_t *data){ |
betaEncoder | 7:d637e03e22bb | 158 | messageLength = length; |
betaEncoder | 7:d637e03e22bb | 159 | if(data[0] == QUEUE_READ){ |
betaEncoder | 7:d637e03e22bb | 160 | queue = QUEUE_READ; |
betaEncoder | 7:d637e03e22bb | 161 | } else if(data[0] == QUEUE_WRITE) { |
betaEncoder | 7:d637e03e22bb | 162 | memcpy(buff, &data[1], REPORT_PAYLOAD_SIZE-1); |
betaEncoder | 7:d637e03e22bb | 163 | queue = QUEUE_WRITE; |
betaEncoder | 7:d637e03e22bb | 164 | } else if(data[0] == QUEUE_DUMP) { |
betaEncoder | 7:d637e03e22bb | 165 | queue = QUEUE_DUMP; |
betaEncoder | 7:d637e03e22bb | 166 | } |
betaEncoder | 7:d637e03e22bb | 167 | return; |
samux | 5:656591c7c89f | 168 | } |