]> rtime.felk.cvut.cz Git - tiny-bt.git/blobdiff - src/hil2cap.c
part of master l2cap functions was implemented. Master initiate connection. Next...
[tiny-bt.git] / src / hil2cap.c
index 8162cc9b77d7d13e51399d6bea1f3a81e8c46d9f..02a4a44ee33515186fe979f801302e239351a271 100644 (file)
@@ -25,21 +25,17 @@ int global_index;
 
 
 
-int create_master_connection(struct hci_dev_info *master){//establish connection and send a coutn of bytes every x second
+int create_master_connection(connection_hci *p_connection){//establish connection and send a coutn of bytes every x second
         //array of open request which are in waiting state for appropriate event or answer
-       connection_hci connection,*p_connection=&connection;
        p_connection->con_id=0;
        p_connection->con_state=DISCONNECTED;
        
+       p_connection->socket_fd=hci_open_device(p_connection->master.dev_id);
+       if(l2cap_call_cmd(CREATE_CONNECTION_CMD_OP,p_connection->socket_fd,p_connection)<0){
+               printf("connection problem \n");
+               return -1;
+       }       
        
-       while(1){
-               if(!p_connection->con_state){ //there is no connection, create it
-                               
-               }
-
-
-
-       }
        
        return 0;
 }
@@ -76,6 +72,7 @@ int show_all_local_dev(struct hci_dev_info *master){ // and choose a master devi
                                printf("Error in call hci bd addr cmd \n");
                                return -1;
                        }
+                       //hci_close_dev(dev_array[i].dev_id);
                }
                *master = dev_array[0]; //I will take a first dev like a master
                
@@ -88,18 +85,31 @@ int show_all_local_dev(struct hci_dev_info *master){ // and choose a master devi
                
 }
 
+int show_all_remote_dev(struct hci_dev_info *p_master, bt_address *p_remadrar, int *p_remd_count){
+       int dd=hci_open_device(p_master->dev_id);
+       
+       if((*p_remd_count=l2cap_call_cmd(INQUIRY_CMD_OP, dd, p_remadrar))< 0){
+                               printf("Error in call inquiry command \n");
+                               return -1;
+                       }
+       return 0;
+
+}
+
 int l2cap_call_cmd(__u16 ocf_ogf,int dd, void *p_param){
        cmd_state_request new_req,*p_new_req=&new_req;
        __u16 sw_opcode;
-       sw_opcode=swap_2_bytes(ocf_ogf);        
+       int remd_count;
+       sw_opcode=swap_2_bytes(ocf_ogf);
+       p_new_req->actual_status=ESTABLISHED;
+       p_new_req->id=cmd_req_id++;
+       p_new_req->req_opcode = ocf_ogf;        
+       
        switch(ocf_ogf){
        
-       case READ_BD_ADDR_CMD_OP:{
-               p_new_req->actual_status=ESTABLISHED;
-               p_new_req->id=cmd_req_id++;
-               p_new_req->req_opcode = ocf_ogf;
+       case READ_BD_ADDR_CMD_OP:
                p_new_req->evt_code = EVT_CMD_COMPLETE;
-               p_new_req->p_serv_rutine=rutine_catch_bd_addr;
+               p_new_req->p_serv_rutine=NULL;
 
                if(req_fcn_add(p_new_req)<0){
                        printf("Mistake with req array adding \n ");
@@ -113,14 +123,9 @@ int l2cap_call_cmd(__u16 ocf_ogf,int dd, void *p_param){
                req_fcn_remove();
                return 0;
                
-       
-       }
-       case READ_LOCAL_NAME_CMD_OP:{
-               p_new_req->actual_status=ESTABLISHED;
-               p_new_req->id=cmd_req_id++;
-               p_new_req->req_opcode = ocf_ogf;
+       case READ_LOCAL_NAME_CMD_OP:
                p_new_req->evt_code = EVT_CMD_COMPLETE;
-               p_new_req->p_serv_rutine=rutine_catch_bd_addr;
+               p_new_req->p_serv_rutine=NULL;
 
                if(req_fcn_add(p_new_req)<0){
                        printf("Mistake with req array adding \n ");
@@ -132,7 +137,38 @@ int l2cap_call_cmd(__u16 ocf_ogf,int dd, void *p_param){
                }
                req_fcn_remove();
                return 0;
-       }
+       
+       case INQUIRY_CMD_OP:
+               
+               p_new_req->evt_code = EVT_INQUIRY_COMPLETE;
+               p_new_req->p_serv_rutine=NULL;
+               
+               if(req_fcn_add(p_new_req)<0){
+                       printf("Mistake with req array adding \n ");
+                       return -1;
+               }
+               if((remd_count=call_hci_inquiry_cmd(dd,p_param,&sw_opcode)) < 0){
+                       printf("Mistake with inquiry cmd \n ");
+                       return -1;
+               }
+               req_fcn_remove();
+               return remd_count;
+       
+       case CREATE_CONNECTION_CMD_OP:
+               p_new_req->evt_code = EVT_CONN_COMPLETE;
+               p_new_req->p_serv_rutine=NULL;
+               
+               if(req_fcn_add(p_new_req)<0){
+                       printf("Mistake with req array adding \n ");
+                       return -1;
+               }
+               if((((connection_hci *)p_param)->handle=call_hci_create_connection_cmd(dd, &(((connection_hci *)p_param)->slave.bdaddr), &sw_opcode)) < 0){
+                       printf("Mistake with inquiry cmd \n ");
+                       return -1;
+               }
+               ((connection_hci *)p_param)->con_state=CONNECTED;
+               req_fcn_remove();
+               return 0;
        }
        
        return 0;
@@ -177,6 +213,10 @@ return (void*)0;
 
 int main(void){
        struct hci_dev_info master,*p_master=&master;
+       bt_address remote_bd_addr_array[HCI_MAX_DEV];
+       memset(remote_bd_addr_array,0,(sizeof(bt_address)*HCI_MAX_DEV));
+       connection_hci connection,*p_connection=&connection;
+       int remd_count,i;
        cmd_req_id=0;
        global_index=0;
        memset(array_req,0,(sizeof(cmd_state_request)*MAX_CMD_STATE_REQUEST));
@@ -184,22 +224,22 @@ int main(void){
                printf("error no dev \n");
                return -1;
        }
+       if(show_all_remote_dev(p_master, remote_bd_addr_array, &remd_count)<0){
+               printf("error no remote dev \n");
+               return -1;
+       }
+       printf("All remote devices:\n");
+       for(i=0;i<remd_count;i++){
+               printba(&remote_bd_addr_array[i]);
+       }
+       p_connection->master=master;
+       p_connection->slave.bdaddr=remote_bd_addr_array[0];
        
-       
-       
-       
+       if(create_master_connection(p_connection)<0){
+               printf("connection error");
+               return -1;
+       }
+
 return 0;
 }
 
-
-//void call_hci_send_data(unsigned short con_handle, __u8 pb_flag, __u8 b_flag, unsigned short data_lenght)
-
-//void call_hci_create_connection(bt_address *dev_adress,unsigned short pkt_type,__u8 sc_mod){//
-
-//}
-
-//Socket functions
-/* */
-       
-       
-