Pagina 2 di 2

Re: Guida al Minimus AVR / KADE

Inviato: 09/08/2014, 10:40
da Cia91
Stamattina ho provato a compilare il firmare manualmente.

Segnalo che prima di lanciare il make va modificato il file main.c alla riga 99:

Codice: Seleziona tutto

//flash them leds
#include "../shared/disco.c"
modificato in:

Codice: Seleziona tutto

//flash them leds
//include "../shared/disco.c"
In questo modo il file disco.c non sarà piu necessario, se non fate cosi da errore perchè il file non c'è.

Re: Guida al Minimus AVR / KADE

Inviato: 09/08/2014, 11:11
da Cia91
Chiedo aiuto agli esperti di C... Vorrei fare in modo che premendo un tasto il minimus mandi una serie di tasti. Questo perchè ho un gioco dove mi farebbe comodo scrivere in chat una certa sequenza di lettere per lanciare dei comandi utili.

Nel file main.c ho modificato la riga:

Codice: Seleziona tutto

if(!(c & 0x20)) { keyboard_keys[keycount++] = KEY_B, KEY_A; } //PIN B9
Mettendo direttamente li il comando KEY_B bypasso il file mappings.c
In questo esempio io vglio che alla pressione di quel tasto lui stampi BA, e invece continua imperterrito a stampare solo B. Ho provato con KEY_B, KEY_A; , poi con KEY_B; KEY_A;, ma non funziona.

Ho provato a disattivare anche il debounce commentando la riga _delay_ms(2); ma niente.

Ho notato che il software inserisce il mio "tasto" nella variabile keyboard_keys ,e poi lancia la funzione usb_keyboard_send(); che riporto:

Codice: Seleziona tutto

// send the contents of keyboard_keys and keyboard_modifier_keys
int8_t usb_keyboard_send(void)
{
  uint8_t i, intr_state, timeout;

  if(!usb_configuration) return -1;
  intr_state = SREG;
  cli();
  UENUM = KEYBOARD_ENDPOINT;
  timeout = UDFNUML + 50;
  while(1) {
    // are we ready to transmit?
    if(UEINTX & (1<<RWAL)) break;
    SREG = intr_state;
    // has the USB gone offline?
    if(!usb_configuration) return -1;
    // have we waited too long?
    if(UDFNUML == timeout) return -1;
    // get ready to try checking again
    intr_state = SREG;
    cli();
    UENUM = KEYBOARD_ENDPOINT;
  }
  UEDATX = keyboard_modifier_keys;
  UEDATX = 0;
  for(i = 0; i < sizeof(keyboard_keys); i++) {
    UEDATX = keyboard_keys[i];
  }
  UEINTX = 0x3A;
  keyboard_idle_count = 0;
  SREG = intr_state;
  return 0;
}
Ecco questa funzione non riesco molto a capirla, perchè a questo punto penso potrei modificare direttamente questa per fargli mandare la sequenza che voglio, ma non mi raccapacito di quale sia il comando che effettivamente "invia" al pc la roba.

Re: Guida al Minimus AVR / KADE

Inviato: 09/08/2014, 11:52
da motoschifo
Cia91 ha scritto:Nel file main.c ho modificato la riga:

Codice: Seleziona tutto

if(!(c & 0x20)) { keyboard_keys[keycount++] = KEY_B, KEY_A; } //PIN B9
Cerco di aiutarti ma vado un po' di fretta quindi spero di non scrivere cavolate... poi in serata rileggo tutto il thread, eventualmente puoi inviarmi i file in mp se sei comodo e ci metti un minuto.

Se il tuo intento è aggiungere un tasto nella coda (array keyboard_keys), allora ti basta mettere le due istruzioni una dopo l'altra:

Codice: Seleziona tutto

if(!(c & 0x20)) { keyboard_keys[keycount++] = KEY_B; keyboard_keys[keycount++] = KEY_A; } //PIN B9
L'array contiene quindi due valori anzichè uno e quindi verrà processato successivamente dalla funzione usb_keyboard_send (sempre che la dimensione dell'array lo consenta, non so cosa c'è prima di quell'istruzione).
Non so se così funziona oppure bisogna mettere a corredo altri codici di controllo, dipende tutto da cosa combina poi con UEDATX.

Re: Guida al Minimus AVR / KADE

Inviato: 09/08/2014, 14:41
da Cia91
Grande, funziona!! <-thumbup->