static void parse_sense_key_specific(unsigned char *sks, sense_info_t *info) { info->sense_key_specific_valid = sks[0] & 0x80; if (info->sense_key_specific_valid) { uint32_t sense_key_specific = get_uint24(sks, 0) & 0x007FFFFF; switch (info->sense_key) { case SENSE_KEY_ILLEGAL_REQUEST: info->sense_key_specific.illegal_request.command_error = sense_key_specific & 0x400000; info->sense_key_specific.illegal_request.bit_pointer_valid = sense_key_specific & 0x080000; info->sense_key_specific.illegal_request.bit_pointer = (sense_key_specific & 0x070000) >> 16; info->sense_key_specific.illegal_request.command_error = sense_key_specific & 0xFFFF; break; case SENSE_KEY_HARDWARE_ERROR: case SENSE_KEY_MEDIUM_ERROR: case SENSE_KEY_RECOVERED_ERROR: info->sense_key_specific.hardware_medium_recovered_error.actual_retry_count = sense_key_specific & 0xFFFF; break; case SENSE_KEY_NOT_READY: case SENSE_KEY_NO_SENSE: info->sense_key_specific.not_ready.progress = ((double)(sense_key_specific & 0xFFFF))/65536.0; break; case SENSE_KEY_COPY_ABORTED: info->sense_key_specific.copy_aborted.segment_descriptor = sense_key_specific & 0x200000; info->sense_key_specific.copy_aborted.bit_pointer_valid = sense_key_specific & 0x080000; info->sense_key_specific.copy_aborted.bit_pointer = (sense_key_specific & 0x070000) >> 16; info->sense_key_specific.copy_aborted.field_pointer = sense_key_specific & 0xFFFF; break; case SENSE_KEY_UNIT_ATTENTION: info->sense_key_specific.unit_attention.overflow = sense_key_specific & 0x010000; break; default: info->sense_key_specific_valid = false; break; } }
uint24 HCI_WRITE_CURRENT_IAC_LAP_T_PDU::get_iac_lap(uint8 index) const { return get_uint24(HCI_WRITE_CURRENT_IAC_LAP_T_pduSize + index*3) ; }
BluetoothDeviceAddress HCIPDU::get_BluetoothDeviceAddress(uint16 offset) const { return BluetoothDeviceAddress ( get_uint16 ( offset + 4 ), get_uint8 ( offset + 3 ), get_uint24 ( offset ) ) ; }