Sources d'Avr Hid Usb
Il faut la lib UsbKeyboard en plus de celui ci, mais c'est la que tout se passe
/*** Definition de la correspondance touche/code usb (cf usb.org) ***/
/*** Definition des pins de branchement des touches sur l'arduino ***/
/*** Correspondance touche physique / touche envoyé ***/
// Minimum 2: 1 pour "modifiers" + 1 pour la touche
/*** Descripteur HID (cf http://www.usb.org/developers/hidpage/) ***/
PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, BUFFER_SIZE-1, // REPORT_COUNT (simultaneous keystrokess)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
};
// Tableau qui contient les touches enfoncées
byte keystrokes[(BUFFER_SIZE-1)];
// Tableau qui contient les touches enfoncées précédemment
byte previouskeystrokes[(BUFFER_SIZE-1)];
uchar key, lastKey = 0, keyDidChange = 0;
uchar idleCounter = 0;
boolean key_pressed=false;
static uchar idleRate; // in 4 ms units
// Buffer des touches à envoyer
static uchar reportBuffer[BUFFER_SIZE];
// fonction utile pour avr-usb
extern "C"{
// USB_PUBLIC uchar usbFunctionSetup
uchar {
usbRequest_t *rq = (usbRequest_t *)((void *)data);
usbMsgPtr = reportBuffer;
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){
/* class request type */
if(rq->bRequest == USBRQ_HID_GET_REPORT){
/* wValue: ReportType (highbyte), ReportID (lowbyte) */
/* we only have one report type, so don't look at wValue */
// TODO: Ensure it's okay not to return anything here?
return 0;
}else if(rq->bRequest == USBRQ_HID_GET_IDLE){
// usbMsgPtr = &idleRate;
// return 1;
return 0;
}else if(rq->bRequest == USBRQ_HID_SET_IDLE){
idleRate = rq->wValue.bytes[1];
}
}else{
/* no vendor specific requests implemented */
}
return 0;
}
} // extern "C"
void {
// Reset des ports usb
PORTD = 0;
DDRD |= ~USBMASK;
usbInit();
sei(); // activation des interruptions
memset(reportBuffer, 0, sizeof(reportBuffer));
usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
// input des boutons, les boutons sont a l'etat haut par defaut, il faut les mettres a la masse pour les actives
pinMode(BTN1, INPUT);
digitalWrite(BTN1, HIGH);
pinMode(BTN2, INPUT);
digitalWrite(BTN2, HIGH);
pinMode(BTN3, INPUT);
digitalWrite(BTN3, HIGH);
pinMode(BTN4, INPUT);
digitalWrite(BTN4, HIGH);
pinMode(BTN5, INPUT);
digitalWrite(BTN5, HIGH);
pinMode(BTN6, INPUT);
digitalWrite(BTN6, HIGH);
}
// lit les touches et met les key dans le tableau keystrokes
static void {
// reset du tableau des touches
memset(keystrokes, 0, sizeof(keystrokes));
int pos=0;
if == 0) {
keystrokes[pos]=BTN_KEY_1;
pos++;
}
if == 0) {
keystrokes[pos]=BTN_KEY_2;
pos++;
}
if == 0) {
keystrokes[pos]=BTN_KEY_3;
pos++;
}
if == 0) {
keystrokes[pos]=BTN_KEY_4;
pos++;
}
if == 0) {
keystrokes[pos]=BTN_KEY_5;
pos++;
}
if == 0) {
keystrokes[pos]=BTN_KEY_6;
pos++;
}
}
// Envoyer le tableau des touches si il a ete modifie
static void {
// verifier la taille du nouveau tableau et de l'ancien
if ==sizeof(previouskeystrokes)) {
boolean identique=true;
for ;i++) {
if {
identique=false;
}
}
if {
// le tableau est inchange, ne rien envoyer
return;
}
}
// reocpier le tableau actuel dans la mémoire pour la comparaison boucle suivante
memset(previouskeystrokes, 0, sizeof(previouskeystrokes));
for ;i++) {
previouskeystrokes[i]=keystrokes[i];
}
// Construction du tableau à envoyer
memset(reportBuffer, 0, sizeof(reportBuffer));
reportBuffer[0] = 0;
int pos=1;
for ;i++) {
if {
reportBuffer[pos]=keystrokes[i];
pos++;
}
}
// Attente de 22ms (voir pourquoi)
delay(22);
// Envoi du tableau des touches
usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
}
void {
// Synchro avec l'usb ?
usbPoll();
// Construction du tableau des touches utilisées
lectureTouche();
// Envoi du résultat
envoyerTouche();
}