X-Git-Url: https://rtime.felk.cvut.cz/gitweb/tiny-bt.git/blobdiff_plain/d160ab14e3ebb70e5423201ba22734d42f7ce005..9c8b02b8df6d9aba40d3947e07cde65a94fe8b0a:/src/hcidriver.c diff --git a/src/hcidriver.c b/src/hcidriver.c index 1dfa3c4..109e852 100644 --- a/src/hcidriver.c +++ b/src/hcidriver.c @@ -12,34 +12,28 @@ /************************** hci command functions**************************/ -int call_hci_inquiry_cmd(int dd, bt_address *p_addressarray,int timeout){ +int call_hci_inquiry_cmd(int dd, void *p_addressarray,__u16 *p_ocf_ogf){ inquiry_cp cmdp,*p_cmdp=&cmdp; hci_request req,*p_req=&req; - //hci_inquiry_complete_ev com_ev,*p_com_ev=&com_ev; - __u16 OCF_OGF,*p_OCF_OGF=&OCF_OGF; - p_cmdp->lap[0]=0x33; p_cmdp->lap[1]=0x8b; p_cmdp->lap[2]=0x9e; - p_cmdp->length=5; - p_cmdp->num_rsp=5; + p_cmdp->length=INQ_TIME_14s40; + p_cmdp->num_rsp=NUM_RSP_20; memset(p_req,0,sizeof(req)); - assemble_ocf_ogf(0x01,0x01,p_OCF_OGF); - p_req->p_OCF_OGF=p_OCF_OGF; + p_req->p_OCF_OGF=p_ocf_ogf; p_req->p_retcmdp=p_addressarray; p_req->p_cmdp=p_cmdp; - p_req->retcmdp_len=INQUIRY_INFO_SIZE; + p_req->retcmdp_len=0; p_req->cmdp_len=INQUIRY_CP_SIZE; - p_req->event=EVT_INQUIRY_RESULT; + p_req->event=EVT_INQUIRY_COMPLETE; - if(hci_send_request(dd,p_req,timeout)<0) + if(hci_send_request(dd,p_req,INQ_TIME_4s24*1280)<0) return -1; -// if(p_com_ev->status) -// return -1; - - - return 0; + + + return p_req->retcmdp_len; } // fill up the input parameter address pointer by one address int call_hci_read_bd_addr_cmd(int dd,bt_address *p_address,__u16 *p_ocf_ogf){ @@ -53,7 +47,7 @@ int call_hci_read_bd_addr_cmd(int dd,bt_address *p_address,__u16 *p_ocf_ogf){ p_req->cmdp_len=0; p_req->event=EVT_CMD_COMPLETE; - if(hci_send_request(dd,p_req,1000)<0) + if(hci_send_request(dd,p_req,2000)<0) return -1; if(p_cmdp->status) return -1; @@ -82,11 +76,11 @@ int call_hci_read_local_name_cmd(int dd, void *p_name,__u16 *p_ocf_ogf){ } -int call_hci_create_connection_cmd(int dd, bt_address *p_address, int timeout){ +int call_hci_create_connection_cmd(int dd, bt_address *p_address, __u16 *p_ocf_ogf){ create_conn_cp cmdp,*p_cmdp=&cmdp; hci_request req,*p_req=&req; - __u16 OCF_OGF,*p_OCF_OGF=&OCF_OGF; - + evt_conn_complete cc_evp,*p_cc_evp=&cc_evp; + p_cmdp->bdaddr=*p_address; p_cmdp->pkt_type=0x0010; p_cmdp->pscan_rep_mode=0x01; @@ -94,18 +88,18 @@ int call_hci_create_connection_cmd(int dd, bt_address *p_address, int timeout){ p_cmdp->clock_offset=0xf000; p_cmdp->role_switch=0x00; memset(p_req,0,sizeof(req)); - assemble_ocf_ogf(0x05,0x01,p_OCF_OGF); - p_req->p_OCF_OGF=p_OCF_OGF; + p_req->p_OCF_OGF=p_ocf_ogf; p_req->p_cmdp=p_cmdp; p_req->cmdp_len=CREATE_CONN_CP_SIZE; + p_req->p_retcmdp=p_cc_evp; + p_req->retcmdp_len=EVT_CONN_COMPLETE_SIZE; p_req->event=EVT_CONN_COMPLETE; - if(hci_send_request(dd,p_req,timeout)<0) + if(hci_send_request(dd,p_req,2000)<0) return -1; - //if(p_com_ev->status) - // return -1; - - return 0; + + return p_cc_evp->handle; + } @@ -138,9 +132,7 @@ int hci_close_dev(int dd){ } int hci_send_command(int dd, hci_request *p_req){ - __u8 array[p_req->cmdp_len+4]; //type + OCF+OGF+plen - //__u16 correct_opcode,*p_cor_opcode=&correct_opcode; - //correct_opcode=swap_2_bytes(*(p_req->p_OCF_OGF)); + __u8 array[p_req->cmdp_len+4]; int ii; array[0]=0x01; memcpy(&array[1],p_req->p_OCF_OGF,2); @@ -170,10 +162,7 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ socklen_t len; hci_event_hdr *p_hdr; struct hci_filter nf, of; - int try_count, sign=0;; - - - + int try_count; len = sizeof(of); if(getsockopt(dd, SOL_HCI, HCI_FILTER, &of, &len)<0){ @@ -184,6 +173,7 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ hci_filter_clear(&nf); hci_filter_set_ptype(HCI_EVENT_PKT, &nf); hci_filter_set_event(EVT_CMD_STATUS, &nf); + hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &nf); hci_filter_set_event(p_req->event, &nf); hci_filter_set_opcode(*(p_req->p_OCF_OGF), &nf); @@ -197,15 +187,17 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ goto fail; } - try_count= 10; + try_count= 30; while(try_count--){ + int sign=0; printf("try %d \n",try_count); evt_cmd_complete *cc; evt_cmd_status *cs; evt_remote_name_req_complete *rnrc; remote_name_req_cp *cpar; inquiry_info_with_rssi *p_res_ev; + bt_address *p_actual; if(timeout){ struct pollfd p; @@ -235,7 +227,7 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ while((len=read(dd, recbuf, sizeof(recbuf)))<0){ if(errno == EAGAIN || errno == EINTR) continue; - perror("Problem with cmd sending"); + perror("Problem with cmd reading"); goto fail; } printf("Count of received bytes %d \n ",len); @@ -275,18 +267,7 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len); printf("retcmdp lenght: %d \n",p_req->retcmdp_len); goto succes; - // __u8 first,*p_first; - // p_first=&first; - // for(j=0;jretcmdp_len;j++){ - // memcpy(p_first,p_req->p_retcmdp+j,1); - // printf("%d. byte is: %X \n",j,first); - // printf(" %X",*((unsigned int *)p_req->p_retcmdp+j)); - //printf("address of p_req: %d \n",p_req); - //printf("address of p_req: %d \n",p_req->p_retcmdp); - // } - // printf("Ok\n"); - - + case EVT_REMOTE_NAME_REQ_COMPLETE: if(p_hdr->evt != p_req->event) break; @@ -300,44 +281,58 @@ int hci_send_request(int dd, hci_request *p_req,int timeout){ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len); goto succes; - case EVT_INQUIRY_RESULT: - printf("bingo inquiry result event \n"); - break; - //goto succes; - -/* case EVT_INQUIRY_RESULT_WITH_RSSI: + case EVT_INQUIRY_RESULT_WITH_RSSI: printf("bingo inquiry result RSSI event \n"); + p_recbuf = recbuf + (1 + HCI_EVENT_HDR_SIZE + 1);// one byte set forward p_res_ev = (void *) p_recbuf; - p_actual = &(p_res_ev->ba_array); - for(j=0;jp_retcmdp+(j*sizeof(bt_address)))) == 1){ - sign=1; - } //im looking for all array members an compare with actual address - } - if(!sign){ // if in array address doesnt exist i will add it to array - *(bt_address*)(p_req->p_retcmdp+(count*sizeof(bt_address)))= *p_actual; - count++; - } - if(count==0){ + p_actual = &(p_res_ev->bdaddr); + //todo:involve signal strength + if(count==0){ //array is empty *(bt_address*)(p_req->p_retcmdp)= *p_actual; count++; } + else{ + for(j=0;jp_retcmdp+(j*sizeof(bt_address)))) == 1){ + sign=1; + } //im looking for all array members an compare with actual address + } + if(!sign){ // if in array address doesnt exist i will add it to array + *(bt_address*)(p_req->p_retcmdp+(count*sizeof(bt_address)))= *p_actual; + count++; + } + } //printf("type %2.2X \n",((hci_inquiry_result_RSSI_ev *)p_req->p_retcmdp)->RSSI_array); break; //goto succes; -*/ + case EVT_INQUIRY_COMPLETE: + if(p_hdr->evt != p_req->event) + break; + if(*p_recbuf != 0) + goto fail; printf("bingo inquiry complete event \n"); + p_req->retcmdp_len=count; //count of diferent remote decices + goto succes; - - default: if(p_hdr->evt != p_req->event) + case EVT_CONN_COMPLETE: + if(p_hdr->evt != p_req->event) + break; + if(*p_recbuf != 0) + goto fail; + printf("bingo two devices were connected"); + p_req->retcmdp_len = min(len, p_req->retcmdp_len); + memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len); + goto succes; + + default: + if(p_hdr->evt != p_req->event) break; p_req->retcmdp_len = min(len, p_req->retcmdp_len); memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len); goto succes; - }