/******************************************************************************* * Function Name: SimulateCyclingPower() ******************************************************************************** * * Summary: * This function measures the die temperature and sends it to the client. * *******************************************************************************/ void SimulateCyclingPower(void) { CYBLE_API_RESULT_T apiResult = CYBLE_ERROR_OK; if(CyBle_GattGetBusyStatus() == CYBLE_STACK_STATE_FREE) { uint8 powerMeasureData[CYBLE_GATT_DEFAULT_MTU - 3]; uint8 length = 0; /* Prepare data array */ CyBle_Set16ByPtr(powerMeasureData, (CYBLE_CPS_CPM_TORQUE_PRESENT_BIT | CYBLE_CPS_CPM_TORQUE_SOURCE_BIT | CYBLE_CPS_CPM_WHEEL_BIT | CYBLE_CPS_CPM_ENERGY_BIT) & powerMeasure.flags); length += sizeof(powerMeasure.flags); CyBle_Set16ByPtr(powerMeasureData + length, powerMeasure.instantaneousPower); length += sizeof(powerMeasure.instantaneousPower); if((CYBLE_CPS_CPM_TORQUE_PRESENT_BIT & powerMeasure.flags) != 0u) { CyBle_Set16ByPtr(powerMeasureData + length, powerMeasure.accumulatedTorque); length += sizeof(uint16); CyBle_Set16ByPtr(powerMeasureData + length, (uint16)powerMeasure.cumulativeWheelRevolutions); CyBle_Set16ByPtr(powerMeasureData + length+2, (uint16)(powerMeasure.cumulativeWheelRevolutions >> 16u)); length += sizeof(powerMeasure.cumulativeWheelRevolutions); CyBle_Set16ByPtr(powerMeasureData + length, powerMeasure.lastWheelEventTime); length += sizeof(powerMeasure.lastWheelEventTime); }
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 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; } } } }