main
Default mainpageusb-device-hid-keyboard-projectmain
Description Source Call Graph
Start Line: 654
int main()
{
    unsigned int i;

    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- USB Device HID Keyboard Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

    // If they are present, configure Vbus & Wake-up pins
    PIO_InitializeInterrupts(0);

    WAKEUP_CONFIGURE();

    // Initialize key statuses and configure push buttons
#if defined(at91cap9dk)
    const Pin pinRow0 = PIN_KEYBOARD_ROW0;
    PIO_Configure(&pinRow0, 1);
#endif    
    PIO_Configure(pinsPushButtons, PIO_LISTSIZE(pinsPushButtons));
    memset(keyStatus, 1, NUM_KEYS);

    // Configure LEDs
    LED_Configure(LED_NUMLOCK);

    // HID driver initialization
    HIDDKeyboardDriver_Initialize();

    // connect if needed
    VBUS_CONFIGURE();
    while (USBD_GetState() < USBD_STATE_CONFIGURED);
    
    // Infinite loop
    while (1) {

        unsigned char pressedKeys[NUM_KEYS];
        unsigned char pressedKeysSize = 0;
        unsigned char releasedKeys[NUM_KEYS];
        unsigned char releasedKeysSize = 0;
        
        // Monitor buttons
        for (i=0; i < PIO_LISTSIZE(pinsPushButtons); i++) {
        
            // Check if button state has changed
            unsigned char isButtonPressed = PIO_Get(&(pinsPushButtons[i]));
            if (isButtonPressed != keyStatus[i]) {
        
                // Update button state
                if (!isButtonPressed) {
        
                    // Key has been pressed
                    TRACE_INFO("Key %u has been pressed\n\r", i);
                    keyStatus[i] = 0;
                    pressedKeys[pressedKeysSize] = keyCodes[i];
                    pressedKeysSize++;
                    HIDDKeyboardDriver_RemoteWakeUp();
                }
                else {
        
                    // Key has been released
                    TRACE_INFO("Key %u has been released\n\r", i);
                    keyStatus[i] = 1;
                    releasedKeys[releasedKeysSize] = keyCodes[i];
                    releasedKeysSize++;
                }
            }
        }
        
        // Update key status in the HID driver if necessary
        if ((pressedKeysSize != 0) || (releasedKeysSize != 0)) {
        
            unsigned char status;

            do {
            
                status = HIDDKeyboardDriver_ChangeKeys(pressedKeys,
                                                       pressedKeysSize,
                                                       releasedKeys,
                                                       releasedKeysSize);
            }
            while (status != USBD_STATUS_SUCCESS);
        }

        if( USBState == STATE_SUSPEND ) {
            TRACE_DEBUG("suspend  !\n\r");
            LowPowerMode();
            USBState = STATE_IDLE;
        }
        if( USBState == STATE_RESUME ) {
            // Return in normal MODE
            TRACE_DEBUG("resume !\n\r");
            NormalPowerMode();
            USBState = STATE_IDLE;
        }
    }
}