The firmware of fav-button which distributed at Comike86.

Dependencies:   M0_EEPROM_test USBDevice mbed

Fork of USBMouseKeyboard_HelloWorld by Samuel Mokrani

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?

UserRevisionLine numberNew 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 }