status_t LocalDevice::SetFriendlyName(BString& name) { int8 btStatus = BT_ERROR; if (fMessenger == NULL) return btStatus; BluetoothCommand<typed_command(hci_write_local_name)> writeName(OGF_CONTROL_BASEBAND, OCF_WRITE_LOCAL_NAME); strcpy(writeName->local_name, name.String()); BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, writeName.Data(), writeName.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_LOCAL_NAME)); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &btStatus); return btStatus; }
status_t LocalDevice::_ReadLinkKeys() { int8 bt_status = BT_ERROR; BluetoothCommand<> LocalFeatures(OGF_CONTROL_BASEBAND, OCF_READ_STORED_LINK_KEY); BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, LocalFeatures.Data(), LocalFeatures.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_STORED_LINK_KEY)); request.AddInt16("eventExpected", HCI_EVENT_RETURN_LINK_KEYS); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &bt_status); return bt_status; }
status_t LocalDevice::SetDeviceClass(DeviceClass deviceClass) { int8 bt_status = BT_ERROR; if (fMessenger == NULL) return bt_status; BluetoothCommand<typed_command(hci_write_dev_class)> setDeviceClass(OGF_CONTROL_BASEBAND, OCF_WRITE_CLASS_OF_DEV); setDeviceClass->dev_class[0] = deviceClass.Record() & 0xFF; setDeviceClass->dev_class[1] = (deviceClass.Record() & 0xFF00) >> 8; setDeviceClass->dev_class[2] = (deviceClass.Record() & 0xFF0000) >> 16; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, setDeviceClass.Data(), setDeviceClass.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_CLASS_OF_DEV)); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &bt_status); return bt_status; }
BString LocalDevice::GetFriendlyName() { if (fMessenger == NULL) return BString("Unknown|Messenger"); size_t size; void* command = buildReadLocalName(&size); if (command == NULL) return BString("Unknown|NoMemory"); BString friendlyname; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, command, size); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_LOCAL_NAME)); if (fMessenger->SendMessage(&request, &reply) == B_OK && reply.FindString("friendlyname", &friendlyname) == B_OK) return friendlyname; return BString("Unknown|ServerFailed"); }
bdaddr_t LocalDevice::GetBluetoothAddress() { if (fMessenger == NULL) return bdaddrUtils::LocalAddress(); size_t size; void* command = buildReadBdAddr(&size); if (command == NULL) return bdaddrUtils::LocalAddress(); const bdaddr_t* bdaddr; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; ssize_t ssize; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, command, size); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_BD_ADDR)); if (fMessenger->SendMessage(&request, &reply) == B_OK && reply.FindData("bdaddr", B_ANY_TYPE, 0, (const void**)&bdaddr, &ssize) == B_OK) return *bdaddr; return bdaddrUtils::LocalAddress(); }
status_t LocalDevice::SetDiscoverable(int mode) { if (fMessenger == NULL) return B_ERROR; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; size_t size; int8 bt_status = BT_ERROR; request.AddInt32("hci_id", fHid); void* command = buildWriteScan(mode, &size); if (command == NULL) { return B_NO_MEMORY; } request.AddData("raw command", B_ANY_TYPE, command, size); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_SCAN_ENABLE)); if (fMessenger->SendMessage(&request, &reply) == B_OK) { if (reply.FindInt8("status", &bt_status ) == B_OK ) { return bt_status; } } return B_ERROR; }
int LocalDevice::GetDiscoverable() { if (fMessenger == NULL) return -1; size_t size; void* command = buildReadScan(&size); if (command == NULL) return -1; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, command, size); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_SCAN_ENABLE)); int8 discoverable; BMessage reply; if (fMessenger->SendMessage(&request, &reply) == B_OK && reply.FindInt8("scan_enable", &discoverable) == B_OK) return discoverable; return -1; }
LocalDevice::LocalDevice(hci_id hid) : BluetoothDevice(), fHid(hid) { fMessenger = _RetrieveBluetoothMessenger(); _ReadBufferSize(); _ReadLocalFeatures(); _ReadLocalVersion(); _ReadTimeouts(); _ReadLinkKeys(); // Uncomment this if you want your device to have a nicer default name // BString name("HaikuBluetooth"); // SetFriendlyName(name); uint32 value; // HARDCODE -> move this to addons if (GetProperty("manufacturer", &value) == B_OK && value == 15) { // Uncomment this out if your Broadcom dongle is not working properly // Reset(); // Perform a reset to Broadcom buggyland // Uncomment this out if your Broadcom dongle has a null bdaddr //#define BT_WRITE_BDADDR_FOR_BCM2035 #ifdef BT_WRITE_BDADDR_FOR_BCM2035 #warning Writting broadcom bdaddr @ init. // try write bdaddr to a bcm2035 -> will be moved to an addon int8 bt_status = BT_ERROR; BluetoothCommand<typed_command(hci_write_bcm2035_bdaddr)> writeAddress(OGF_VENDOR_CMD, OCF_WRITE_BCM2035_BDADDR); BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; writeAddress->bdaddr.b[0] = 0x3C; writeAddress->bdaddr.b[1] = 0x19; writeAddress->bdaddr.b[2] = 0x30; writeAddress->bdaddr.b[3] = 0xC9; writeAddress->bdaddr.b[4] = 0x03; writeAddress->bdaddr.b[5] = 0x00; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, writeAddress.Data(), writeAddress.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_VENDOR_CMD, OCF_WRITE_BCM2035_BDADDR)); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &bt_status); #endif } }
void LocalDeviceImpl::ConnectionRequest(struct hci_ev_conn_request* event, BMessage* request) { size_t size; void* command; TRACE_BT("LocalDeviceImpl: Connection Incoming type %x from %s...\n", event->link_type, bdaddrUtils::ToString(event->bdaddr).String()); // TODO: add a possible request in the queue if (true) { // Check Preferences if we are to accept this connection // Keep ourselves as slave command = buildAcceptConnectionRequest(event->bdaddr, 0x01 , &size); BMessage* newrequest = new BMessage; newrequest->AddInt16("eventExpected", HCI_EVENT_CMD_STATUS); newrequest->AddInt16("opcodeExpected", PACK_OPCODE(OGF_LINK_CONTROL, OCF_ACCEPT_CONN_REQ)); newrequest->AddInt16("eventExpected", HCI_EVENT_CONN_COMPLETE); newrequest->AddInt16("eventExpected", HCI_EVENT_PIN_CODE_REQ); newrequest->AddInt16("eventExpected", HCI_EVENT_ROLE_CHANGE); newrequest->AddInt16("eventExpected", HCI_EVENT_LINK_KEY_NOTIFY); newrequest->AddInt16("eventExpected", HCI_EVENT_PAGE_SCAN_REP_MODE_CHANGE); #if 0 newrequest->AddInt16("eventExpected", HCI_EVENT_MAX_SLOT_CHANGE); newrequest->AddInt16("eventExpected", HCI_EVENT_DISCONNECTION_COMPLETE); #endif AddWantedEvent(newrequest); if ((fHCIDelegate)->IssueCommand(command, size) == B_ERROR) { TRACE_BT("LocalDeviceImpl: Command issued error for Accepting connection\n"); // remove the request? } else { TRACE_BT("LocalDeviceImpl: Command issued for Accepting connection\n"); } } }
status_t LocalDevice::Reset() { int8 bt_status = BT_ERROR; BluetoothCommand<> Reset(OGF_CONTROL_BASEBAND, OCF_RESET); BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, Reset.Data(), Reset.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_RESET)); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &bt_status); return bt_status; }
status_t LocalDevice::_ReadLocalFeatures() { int8 bt_status = BT_ERROR; BluetoothCommand<> LocalFeatures(OGF_INFORMATIONAL_PARAM, OCF_READ_LOCAL_FEATURES); BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, LocalFeatures.Data(), LocalFeatures.Size()); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_LOCAL_FEATURES)); if (fMessenger->SendMessage(&request, &reply) == B_OK) reply.FindInt8("status", &bt_status); return bt_status; }
DeviceClass LocalDevice::GetDeviceClass() { // if (fDeviceClass.IsUnknownDeviceClass()) { if (fMessenger == NULL) return fDeviceClass; size_t size; void* command = buildReadClassOfDevice(&size); if (command == NULL) return fDeviceClass; BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); BMessage reply; const uint8* bufferRecord; ssize_t ssize; request.AddInt32("hci_id", fHid); request.AddData("raw command", B_ANY_TYPE, command, size); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_CLASS_OF_DEV)); if (fMessenger->SendMessage(&request, &reply) == B_OK && reply.FindData("devclass", B_ANY_TYPE, 0, (const void**)&bufferRecord, &ssize) == B_OK) { uint8 record[3] = { bufferRecord[0], bufferRecord[1], bufferRecord[2] }; fDeviceClass.SetRecord(record); } // } return fDeviceClass; }
void LocalDeviceImpl::CommandStatus(struct hci_ev_cmd_status* event, BMessage* request, int32 index) { int16 opcodeExpected; BMessage reply; status_t status; // Handle command complete information request->FindInt16("opcodeExpected", index, &opcodeExpected); if (request->IsSourceWaiting() == false) { TRACE_BT("LocalDeviceImpl: Nobody waiting for the event\n"); } switch (opcodeExpected) { case PACK_OPCODE(OGF_LINK_CONTROL, OCF_INQUIRY): { reply.what = BT_MSG_INQUIRY_STARTED; TRACE_BT("LocalDeviceImpl: Inquiry status %x\n", event->status); reply.AddInt8("status", event->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); ClearWantedEvent(request, HCI_EVENT_CMD_STATUS, PACK_OPCODE(OGF_LINK_CONTROL, OCF_INQUIRY)); } break; case PACK_OPCODE(OGF_LINK_CONTROL, OCF_REMOTE_NAME_REQUEST): case PACK_OPCODE(OGF_LINK_CONTROL, OCF_CREATE_CONN): { if (event->status == BT_OK) { ClearWantedEvent(request, HCI_EVENT_CMD_STATUS, opcodeExpected); } else { TRACE_BT("LocalDeviceImpl: Command Status for remote friendly name %x\n", event->status); reply.AddInt8("status", event->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); ClearWantedEvent(request, HCI_EVENT_CMD_STATUS, opcodeExpected); } } break; /* case PACK_OPCODE(OGF_LINK_CONTROL, OCF_ACCEPT_CONN_REQ): { ClearWantedEvent(request, HCI_EVENT_CMD_STATUS, PACK_OPCODE(OGF_LINK_CONTROL, OCF_ACCEPT_CONN_REQ)); } break; case PACK_OPCODE(OGF_LINK_CONTROL, OCF_REJECT_CONN_REQ): { ClearWantedEvent(request, HCI_EVENT_CMD_STATUS, PACK_OPCODE(OGF_LINK_CONTROL, OCF_REJECT_CONN_REQ)); } break;*/ default: TRACE_BT("LocalDeviceImpl: Command Status not handled\n"); break; } }
void LocalDeviceImpl::CommandComplete(struct hci_ev_cmd_complete* event, BMessage* request, int32 index) { int16 opcodeExpected; BMessage reply; status_t status; // Handle command complete information request->FindInt16("opcodeExpected", index, &opcodeExpected); if (request->IsSourceWaiting() == false) { TRACE_BT("LocalDeviceImpl: Nobody waiting for the event\n"); } switch ((uint16)opcodeExpected) { case PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_LOCAL_VERSION): { struct hci_rp_read_loc_version* version = JumpEventHeader<struct hci_rp_read_loc_version, struct hci_ev_cmd_complete>(event); if (version->status == BT_OK) { if (!IsPropertyAvailable("hci_version")) fProperties->AddInt8("hci_version", version->hci_version); if (!IsPropertyAvailable("hci_revision")) { fProperties->AddInt16("hci_revision", version->hci_revision); } if (!IsPropertyAvailable("lmp_version")) fProperties->AddInt8("lmp_version", version->lmp_version); if (!IsPropertyAvailable("lmp_subversion")) { fProperties->AddInt16("lmp_subversion", version->lmp_subversion); } if (!IsPropertyAvailable("manufacturer")) { fProperties->AddInt16("manufacturer", version->manufacturer); } } TRACE_BT("LocalDeviceImpl: Reply for Local Version %x\n", version->status); reply.AddInt8("status", version->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_PG_TIMEOUT): { struct hci_rp_read_page_timeout* pageTimeout = JumpEventHeader<struct hci_rp_read_page_timeout, struct hci_ev_cmd_complete>(event); if (pageTimeout->status == BT_OK) { fProperties->AddInt16("page_timeout", pageTimeout->page_timeout); TRACE_BT("LocalDeviceImpl: Page Timeout=%x\n", pageTimeout->page_timeout); } reply.AddInt8("status", pageTimeout->status); reply.AddInt32("result", pageTimeout->page_timeout); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_LOCAL_FEATURES): { struct hci_rp_read_loc_features* features = JumpEventHeader<struct hci_rp_read_loc_features, struct hci_ev_cmd_complete>(event); if (features->status == BT_OK) { if (!IsPropertyAvailable("features")) { fProperties->AddData("features", B_ANY_TYPE, &features->features, 8); uint16 packetType = HCI_DM1 | HCI_DH1 | HCI_HV1; bool roleSwitch = (features->features[0] & LMP_RSWITCH) != 0; bool encryptCapable = (features->features[0] & LMP_ENCRYPT) != 0; if (features->features[0] & LMP_3SLOT) packetType |= (HCI_DM3 | HCI_DH3); if (features->features[0] & LMP_5SLOT) packetType |= (HCI_DM5 | HCI_DH5); if (features->features[1] & LMP_HV2) packetType |= (HCI_HV2); if (features->features[1] & LMP_HV3) packetType |= (HCI_HV3); fProperties->AddInt16("packet_type", packetType); fProperties->AddBool("role_switch_capable", roleSwitch); fProperties->AddBool("encrypt_capable", encryptCapable); TRACE_BT("LocalDeviceImpl: Packet type %x role switch %d encrypt %d\n", packetType, roleSwitch, encryptCapable); } } TRACE_BT("LocalDeviceImpl: Reply for Local Features %x\n", features->status); reply.AddInt8("status", features->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_BUFFER_SIZE): { struct hci_rp_read_buffer_size* buffer = JumpEventHeader<struct hci_rp_read_buffer_size, struct hci_ev_cmd_complete>(event); if (buffer->status == BT_OK) { if (!IsPropertyAvailable("acl_mtu")) fProperties->AddInt16("acl_mtu", buffer->acl_mtu); if (!IsPropertyAvailable("sco_mtu")) fProperties->AddInt8("sco_mtu", buffer->sco_mtu); if (!IsPropertyAvailable("acl_max_pkt")) fProperties->AddInt16("acl_max_pkt", buffer->acl_max_pkt); if (!IsPropertyAvailable("sco_max_pkt")) fProperties->AddInt16("sco_max_pkt", buffer->sco_max_pkt); } TRACE_BT("LocalDeviceImpl: Reply for Read Buffer Size %x\n", buffer->status); reply.AddInt8("status", buffer->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); } break; case PACK_OPCODE(OGF_INFORMATIONAL_PARAM, OCF_READ_BD_ADDR): { struct hci_rp_read_bd_addr* readbdaddr = JumpEventHeader<struct hci_rp_read_bd_addr, struct hci_ev_cmd_complete>(event); if (readbdaddr->status == BT_OK) { reply.AddData("bdaddr", B_ANY_TYPE, &readbdaddr->bdaddr, sizeof(bdaddr_t)); } TRACE_BT("LocalDeviceImpl: Read bdaddr status = %x\n", readbdaddr->status); reply.AddInt8("status", readbdaddr->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); } break; case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_CLASS_OF_DEV): { struct hci_read_dev_class_reply* classDev = JumpEventHeader<struct hci_read_dev_class_reply, struct hci_ev_cmd_complete>(event); if (classDev->status == BT_OK) { reply.AddData("devclass", B_ANY_TYPE, &classDev->dev_class, sizeof(classDev->dev_class)); } TRACE_BT("LocalDeviceImpl: Read DeviceClass status = %x DeviceClass = [%x][%x][%x]\n", classDev->status, classDev->dev_class[0], classDev->dev_class[1], classDev->dev_class[2]); reply.AddInt8("status", classDev->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_LOCAL_NAME): { struct hci_rp_read_local_name* readLocalName = JumpEventHeader<struct hci_rp_read_local_name, struct hci_ev_cmd_complete>(event); if (readLocalName->status == BT_OK) { reply.AddString("friendlyname", (const char*)readLocalName->local_name); } TRACE_BT("LocalDeviceImpl: Friendly name status %x\n", readLocalName->status); reply.AddInt8("status", readLocalName->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_LINK_CONTROL, OCF_PIN_CODE_REPLY): { uint8* statusReply = (uint8*)(event + 1); // TODO: This reply has to match the BDADDR of the outgoing message TRACE_BT("LocalDeviceImpl: pincode accept status %x\n", *statusReply); reply.AddInt8("status", *statusReply); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore //ClearWantedEvent(request, HCI_EVENT_CMD_COMPLETE, opcodeExpected); ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_LINK_CONTROL, OCF_PIN_CODE_NEG_REPLY): { uint8* statusReply = (uint8*)(event + 1); // TODO: This reply might match the BDADDR of the outgoing message // => FindPetition should be expanded.... TRACE_BT("LocalDeviceImpl: pincode reject status %x\n", *statusReply); reply.AddInt8("status", *statusReply); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request, HCI_EVENT_CMD_COMPLETE, opcodeExpected); break; } case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_STORED_LINK_KEY): { struct hci_read_stored_link_key_reply* linkKeyRetrieval = JumpEventHeader<struct hci_read_stored_link_key_reply, struct hci_ev_cmd_complete>(event); TRACE_BT("LocalDeviceImpl: Status %s MaxKeys=%d, KeysRead=%d\n", BluetoothError(linkKeyRetrieval->status), linkKeyRetrieval->max_num_keys, linkKeyRetrieval->num_keys_read); reply.AddInt8("status", linkKeyRetrieval->status); status = request->SendReply(&reply); //printf("Sending reply... %ld\n", status); // debug reply.PrintToStream(); ClearWantedEvent(request); break; } case PACK_OPCODE(OGF_LINK_CONTROL, OCF_LINK_KEY_NEG_REPLY): case PACK_OPCODE(OGF_LINK_CONTROL, OCF_LINK_KEY_REPLY): { struct hci_cp_link_key_reply_reply* linkKeyReply = JumpEventHeader<struct hci_cp_link_key_reply_reply, struct hci_ev_cmd_complete>(event); TRACE_BT("LocalDeviceImpl: Status %s addresss=%s\n", BluetoothError(linkKeyReply->status), bdaddrUtils::ToString(linkKeyReply->bdaddr).String()); ClearWantedEvent(request, HCI_EVENT_CMD_COMPLETE, opcodeExpected); break; } case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_READ_SCAN_ENABLE): { struct hci_read_scan_enable* scanEnable = JumpEventHeader<struct hci_read_scan_enable, struct hci_ev_cmd_complete>(event); if (scanEnable->status == BT_OK) { fProperties->AddInt8("scan_enable", scanEnable->enable); TRACE_BT("LocalDeviceImpl: enable = %x\n", scanEnable->enable); } reply.AddInt8("status", scanEnable->status); reply.AddInt8("scan_enable", scanEnable->enable); status = request->SendReply(&reply); printf("Sending reply. scan_enable = %d\n", scanEnable->enable); // debug reply.PrintToStream(); // This request is not gonna be used anymore ClearWantedEvent(request); break; } // place here all CC that just replies a uint8 status case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_RESET): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_SCAN_ENABLE): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_CLASS_OF_DEV): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_PG_TIMEOUT): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_CA_TIMEOUT): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_AUTH_ENABLE): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_LOCAL_NAME): case PACK_OPCODE(OGF_VENDOR_CMD, OCF_WRITE_BCM2035_BDADDR): { reply.AddInt8("status", *(uint8*)(event + 1)); TRACE_BT("LocalDeviceImpl: %s for %s status %x\n", __FUNCTION__, BluetoothCommandOpcode(opcodeExpected), *(uint8*)(event + 1)); status = request->SendReply(&reply); printf("%s: Sending reply write...\n", __func__); if (status < B_OK) printf("%s: Error sending reply write!\n", __func__); ClearWantedEvent(request); break; } default: TRACE_BT("LocalDeviceImpl: Command Complete not handled\n"); break; } }