]> rtime.felk.cvut.cz Git - tiny-bt.git/blobdiff - src/hcidriver.c
part of master l2cap functions was implemented. Master initiate connection. Next...
[tiny-bt.git] / src / hcidriver.c
index 1dfa3c4e85bb04a58e1c5dbc1af8597d5557a058..8f74f41feab853370c442b796730f4fb484ee3af 100644 (file)
 
 
 /************************** 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;
@@ -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;j<p_req->retcmdp_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;j<count;j++){
-                                       if(compare_bda(p_actual,(p_req->p_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;j<count;j++){
+                                               if(compare_bda(p_actual,(bt_address *)(p_req->p_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;
-
                }