TEAMUSB_SLAVE

Dependencies:   USBHost mbed

Fork of USBHostKeyboard_HelloWorld by TEAMUSB

main.cpp

Committer:
armdran
Date:
2015-04-07
Revision:
11:e12aae7de530
Parent:
10:54ffd94e075c
Child:
12:d32975c44c98

File content as of revision 11:e12aae7de530:

#include "mbed.h"
#include "USBHostKeyboard.h"
#include "rtos.h"

DigitalOut led(LED1);
SPISlave device(D11, D12, D13, D10);
DigitalOut ir(D9);

uint8_t spi_reply_blocking(uint8_t reply = 0x00, bool sendIr = 0) {
    device.reply(reply);
    if(sendIr == 1) { wait_ms(100); ir = 1; ir = 0;}
    while(!device.receive()) {}
    uint8_t instruction = device.read();
    //printf("    send: %x received: %x\r\n", reply, instruction);
    return instruction;  
}


void onKeyMod(uint8_t key, uint8_t modifier) {
    printf("got key: %x modifier: %x.\r\n", key, modifier);
        
    uint8_t instruction = spi_reply_blocking(key, 1);
    while(instruction != 0xFE) {
        printf("    out of sync.\r\n");
        //instruction = spi_reply_blocking(key, 1);
        return;
    }
        
    //printf("    got instruction FE. key sent\r\n");
    uint8_t ack_key = spi_reply_blocking(modifier);
    if(ack_key != key) 
        printf("    key ack failed (is %x, should be %x)!!!\r\n", ack_key, key);
    else
        printf("    key ack ok\r\n");
        
    //printf("    mod sent.\r\n");
    uint8_t ack_modifier = spi_reply_blocking(); 
    if(ack_modifier != modifier) 
        printf("    mod ack failed(is %x, should be %x)!!!\r\n", ack_modifier, modifier); 
    else
        printf("    mod ack ok\r\n");

}


void keyboard_task(void const *) {
    
    USBHostKeyboard keyboard;
    
    while(1) {
        
        printf("trying to connect\r\n");
        
        // try to connect a USB keyboard
        while(!keyboard.connect()) {
            Thread::wait(500);
        }

        printf("connected\r\n");

        // when connected, attach handler called on keyboard event
        keyboard.attach(onKeyMod);
        
        printf("eventhandler attached\r\n");
        
        // wait until the keyboard is disconnected
        while(keyboard.connected()) {
            USBHost::poll();
        }
            
        printf("disconnected\r\n");
        
    }
}

int main() {
    Thread keyboardTask(keyboard_task, NULL, osPriorityNormal, 256 * 4);
    device.frequency(1000000);
    device.format(8, 1);
    while(1) {}
    
}