2 * C Implementation: testovaci
7 * Author: root <root@ubuntu>, (C) 2008
9 * Copyright: See COPYING file that comes with this distribution
14 #include <sys/ioctl.h>
18 #include "hcidriver.h"
21 cmd_state_request array_req[MAX_CMD_STATE_REQUEST];
28 int create_master_connection(struct hci_dev_info *master){//establish connection and send a coutn of bytes every x second
29 //array of open request which are in waiting state for appropriate event or answer
30 connection_hci connection,*p_connection=&connection;
31 p_connection->con_id=0;
32 p_connection->con_state=DISCONNECTED;
36 if(!p_connection->con_state){ //there is no connection, create it
47 int show_all_local_dev(struct hci_dev_info *master){ // and choose a master device which will initiate the connection
49 struct hci_dev_list_req dlist,*p_dlist=&dlist;
50 struct hci_dev_req *p_dreq;
52 p_dlist->dev_num=HCI_MAX_DEV;
53 p_dreq=p_dlist->dev_req;
55 if((sock=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI))<0){
59 if((ioctl(sock, HCIGETDEVLIST, (void *) p_dlist))<0){
62 if(p_dlist->dev_num > 0){
63 struct hci_dev_info dev_array[p_dlist->dev_num];
64 for(i=0;i<p_dlist->dev_num;i++){
65 dev_array[i].dev_id=(p_dreq+i)->dev_id;
66 if(ioctl(sock, HCIGETDEVINFO, (void *) &dev_array[i])<0){
70 int dd=hci_open_device(dev_array[i].dev_id);
71 if(l2cap_call_cmd(READ_BD_ADDR_CMD_OP,dd,&dev_array[i].bdaddr)< 0){
72 printf("Error in call hci bd addr cmd \n");
75 if(l2cap_call_cmd(READ_LOCAL_NAME_CMD_OP,dd,&dev_array[i].name)< 0){
76 printf("Error in call hci bd addr cmd \n");
80 *master = dev_array[0]; //I will take a first dev like a master
84 printf("There is no hci device \n");
91 int l2cap_call_cmd(__u16 ocf_ogf,int dd, void *p_param){
92 cmd_state_request new_req,*p_new_req=&new_req;
94 sw_opcode=swap_2_bytes(ocf_ogf);
97 case READ_BD_ADDR_CMD_OP:{
98 p_new_req->actual_status=ESTABLISHED;
99 p_new_req->id=cmd_req_id++;
100 p_new_req->req_opcode = ocf_ogf;
101 p_new_req->evt_code = EVT_CMD_COMPLETE;
102 p_new_req->p_serv_rutine=rutine_catch_bd_addr;
104 if(req_fcn_add(p_new_req)<0){
105 printf("Mistake with req array adding \n ");
109 if(call_hci_read_bd_addr_cmd(dd,(bt_address *)p_param,&sw_opcode)){
110 printf("Mistake with bt addr cmd \n ");
118 case READ_LOCAL_NAME_CMD_OP:{
119 p_new_req->actual_status=ESTABLISHED;
120 p_new_req->id=cmd_req_id++;
121 p_new_req->req_opcode = ocf_ogf;
122 p_new_req->evt_code = EVT_CMD_COMPLETE;
123 p_new_req->p_serv_rutine=rutine_catch_bd_addr;
125 if(req_fcn_add(p_new_req)<0){
126 printf("Mistake with req array adding \n ");
129 if(call_hci_read_local_name_cmd(dd,p_param,&sw_opcode)){
130 printf("Mistake with read local name cmd \n ");
140 /* request array support functions */
141 int req_fcn_add(cmd_state_request *p_req){ //fcn add the request at the end of array or replace the oldest request
143 cmd_state_request the_oldest=array_req[0];
145 for(i=0;i<MAX_CMD_STATE_REQUEST;i++){
146 if((array_req[i].actual_status)==0 || array_req[i].actual_status==3 ){
152 if((array_req[i].id) < the_oldest.id){ //the smallest id (oldest request) will stay here
153 the_oldest = array_req[i];
160 array_req[index]=*p_req;
166 void req_fcn_remove(void){
167 array_req[global_index].actual_status=DONE;
170 /* rutines for each command */
172 void *rutine_catch_bd_addr(void *arg){
179 struct hci_dev_info master,*p_master=&master;
182 memset(array_req,0,(sizeof(cmd_state_request)*MAX_CMD_STATE_REQUEST));
183 if(show_all_local_dev(p_master)<0){
184 printf("error no dev \n");
195 //void call_hci_send_data(unsigned short con_handle, __u8 pb_flag, __u8 b_flag, unsigned short data_lenght)
197 //void call_hci_create_connection(bt_address *dev_adress,unsigned short pkt_type,__u8 sc_mod){//