void process_inbox(Sup_Pdu_t *inbox) { switch (inbox->command) { case SUP_CMD_KEYDOWN: keyboard_press(inbox->data); case SUP_CMD_KEYUP: keyboard_release(inbox->data); case SUP_CMD_NOOP: DBG_PRINTF("Received NOOP"); default: DBG_PRINTF("Unknown command: %d", inbox->command); } return; uint8_t apiResult; if (CyBle_GattGetBusyStatus() == CYBLE_STACK_STATE_FREE) { apiResult = CyBle_HidssGetCharacteristicValue(CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_PROTOCOL_MODE, sizeof(protocol), &protocol); if(apiResult == CYBLE_ERROR_OK) { if(protocol == CYBLE_HIDS_PROTOCOL_MODE_BOOT) { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_BOOT_KYBRD_IN_REP, KEYBOARD_DATA_SIZE, keyboard_report.raw); } else { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HUMAN_INTERFACE_DEVICE_REPORT_IN, KEYBOARD_DATA_SIZE, keyboard_report.raw); } if(apiResult != CYBLE_ERROR_OK) { DBG_PRINTF("HID notification API Error: %x \r\n", apiResult); } } } }
/******************************************************************************* * Function Name: SimulateKeyboard() ******************************************************************************** * * Summary: * The custom function to simulate Left and Right arrow key pressing * * @return * None * * @param[in] * none * * @par Theory of Operation * keyboard_data[3u] contains the keyboard data. Following a valid key, * zero is sent to indicate key lift. * * @par Notes * None * **//***************************************************************************/ void SimulateKeyboard(void) { static uint8 keyboard_data[KEYBOARD_DATA_SIZE]={0,0,0,0,0,0,0,0}; CYBLE_API_RESULT_T apiResult; if(CyBle_GattGetBusStatus() == CYBLE_STACK_STATE_FREE) { keyboard_data[3u] = SendKeyForDetectedGesture(); apiResult = CyBle_HidssGetCharacteristicValue(CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_PROTOCOL_MODE, sizeof(protocol), &protocol); if(apiResult == CYBLE_ERROR_OK) { /* Send notification only when a valid gesture is detected */ if(0 != keyboard_data[3u]) { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HUMAN_INTERFACE_DEVICE_REPORT_IN, KEYBOARD_DATA_SIZE, keyboard_data); } if(apiResult == CYBLE_ERROR_OK) { keyboard_data[2u] = 0u; /* Set up keyboard data*/ keyboard_data[3u] = 0u; /* Set up keyboard data*/ apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HUMAN_INTERFACE_DEVICE_REPORT_IN, KEYBOARD_DATA_SIZE, keyboard_data); } if(apiResult != CYBLE_ERROR_OK) { keyboardSimulation = DISABLED; } } } }
/******************************************************************************* * Function Name: SimulateKeyboard() ******************************************************************************** * * Summary: * The custom function to simulate CapsLock key pressing * *******************************************************************************/ void SimulateKeyboard(void) { static uint8 keyboard_data[KEYBOARD_DATA_SIZE]={0,0,0,0,0,0,0,0}; CYBLE_API_RESULT_T apiResult; static uint32 keyboardTimer = KEYBOARD_TIMEOUT; static uint8 simKey; static uint8 capsLockPress = 0u; uint8 i; /* Scan SW2 key each connection interval */ if(0u == SW2_Read()) { if(capsLockPress < KEYBOARD_JITTER_SIZE) { capsLockPress++; } else if(capsLockPress == KEYBOARD_JITTER_SIZE) { keyboard_data[2u] = CAPS_LOCK; /* Set up keyboard data */ keyboardTimer = 1u; /* Clear Simulation timer to send data */ capsLockPress++; } else /* Ignore long key pressing */ { } } else { capsLockPress = 0u; } if((CyBle_GattGetBusyStatus() == CYBLE_STACK_STATE_FREE) && (--keyboardTimer == 0u)) { keyboardTimer = KEYBOARD_TIMEOUT; simKey++; if(simKey > SIM_KEY_MAX) { simKey = SIM_KEY_MIN; } keyboard_data[3u] = simKey; apiResult = CyBle_HidssGetCharacteristicValue(CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_PROTOCOL_MODE, sizeof(protocol), &protocol); if(apiResult == CYBLE_ERROR_OK) { DBG_PRINTF("HID notification: "); for(i = 0; i < KEYBOARD_DATA_SIZE; i++) { DBG_PRINTF("%2.2x,", keyboard_data[i]); } DBG_PRINTF("\r\n"); if(protocol == CYBLE_HIDS_PROTOCOL_MODE_BOOT) { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_BOOT_KYBRD_IN_REP, KEYBOARD_DATA_SIZE, keyboard_data); } else { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HUMAN_INTERFACE_DEVICE_REPORT_IN, KEYBOARD_DATA_SIZE, keyboard_data); } if(apiResult == CYBLE_ERROR_OK) { keyboard_data[2u] = 0u; /* Set up keyboard data*/ keyboard_data[3u] = 0u; /* Set up keyboard data*/ if(protocol == CYBLE_HIDS_PROTOCOL_MODE_BOOT) { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HIDS_BOOT_KYBRD_IN_REP, KEYBOARD_DATA_SIZE, keyboard_data); } else { apiResult = CyBle_HidssSendNotification(cyBle_connHandle, CYBLE_HUMAN_INTERFACE_DEVICE_SERVICE_INDEX, CYBLE_HUMAN_INTERFACE_DEVICE_REPORT_IN, KEYBOARD_DATA_SIZE, keyboard_data); } } if(apiResult != CYBLE_ERROR_OK) { DBG_PRINTF("HID notification API Error: %x \r\n", apiResult); keyboardSimulation = DISABLED; } } } }