3 /*******************************************************************
\r
6 hci_event_acc.c - Event fce (bth specification) - build event
\r
9 Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com
\r
11 *******************************************************************/
\r
19 #include "hci_event.h"
\r
20 #include "hci_command.h"
\r
23 #include <periph/sci_rs232.h>
\r
25 #include "inline_fce.h"
\r
29 typedef int (*bth_info_fce_def)(uint8_t *bth_p, uint8_t size);
\r
31 bth_info_fce_def bth_info_fce_ogf_01[]={
\r
32 cmd_ev_none, cmd_ev_none,cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none,
\r
33 cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_01x000b, cmd_ev_none, cmd_ev_01x000d, cmd_ev_01x000e,
\r
34 cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none,
\r
35 cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none,
\r
37 #define BTH_OGF_01_FC (sizeof(bth_info_fce_ogf_01)/sizeof(bth_info_fce_ogf_01[0]))
\r
40 bth_info_fce_def bth_info_fce_ogf_02[]={
\r
41 cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none,
\r
42 cmd_ev_none, cmd_ev_02x0009, cmd_ev_none, cmd_ev_none, cmd_ev_02x000C, cmd_ev_02x000D};
\r
43 #define BTH_OGF_02_FC (sizeof(bth_info_fce_ogf_02)/sizeof(bth_info_fce_ogf_02[0]))
\r
46 bth_info_fce_def bth_info_fce_ogf_03[]={
\r
47 cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none,
\r
48 cmd_ev_03x0008, cmd_ev_03x0009, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x000d, cmd_ev_none, cmd_ev_none,
\r
49 cmd_ev_none, cmd_ev_03x0011, cmd_ev_03x0012, cmd_ev_none, cmd_ev_03x0014, cmd_ev_03x0015,
\r
50 cmd_ev_none, cmd_ev_03x0017, cmd_ev_none, cmd_ev_03x0019, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x001d,
\r
51 cmd_ev_none, cmd_ev_03x001f, cmd_ev_none, cmd_ev_03x0021, cmd_ev_none, cmd_ev_03x0023, cmd_ev_none, cmd_ev_03x0025,
\r
52 cmd_ev_none, cmd_ev_03x0027, cmd_ev_03x0028, cmd_ev_03x0029, cmd_ev_none, cmd_ev_03x002b, cmd_ev_none, cmd_ev_03x002d,
\r
53 cmd_ev_03x002e, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x0036,
\r
54 cmd_ev_none, cmd_ev_03x0038, cmd_ev_03x0039, cmd_ev_none, cmd_ev_03x003b,
\r
55 cmd_ev_none, cmd_ev_03x003d};
\r
56 #define BTH_OGF_03_FC (sizeof(bth_info_fce_ogf_03)/sizeof(bth_info_fce_ogf_03[0]))
\r
59 bth_info_fce_def bth_info_fce_ogf_04[]={
\r
60 cmd_ev_none, cmd_ev_04x0001, cmd_ev_none, cmd_ev_04x0003, cmd_ev_none, cmd_ev_04x0005, cmd_ev_none, cmd_ev_04x0007,
\r
61 cmd_ev_none, cmd_ev_04x0009};
\r
62 #define BTH_OGF_04_FC (sizeof(bth_info_fce_ogf_04)/sizeof(bth_info_fce_ogf_04[0]))
\r
66 /*********************************************************************************/
\r
69 0 = OK - prikaz odstranen z fronty
\r
70 -1 = fronta prohledana, ale nebyl tam nalezen hledany OBCOD
\r
71 +num = index overovane polozky v poli "bth_pole_adrr_check_packet" s hledanym obcodem
\r
73 int bth_del_event(uint16_t opcode)
\r
76 uint16_t opcode_pkt;
\r
77 for(i=0;i<LENCOMMAND;i++)
\r
79 if(bth_pole_adrr_check_packet[i]!=NULL)
\r
81 __bthtomc16(&opcode_pkt,((uint8_t*)bth_pole_adrr_check_packet[i]+HCI_PKT_SIZE));
\r
82 if(opcode_pkt==opcode)
\r
89 /****************************************************************************/
\r
90 /*------------------------ JEDNOTLIVE EVENT FUNKCE -------------------------*/
\r
91 /****************************************************************************/
\r
92 /****************************************************************************/
\r
95 1 = polozka nenalezena
\r
96 2 = v potvrzovaci fronte nebyly zadne prikazy k potvrzeni
\r
97 3 = status vykazuje chybu prikazu
\r
99 int bth_evt_none(uint8_t *bth_p, uint8_t size) //fce s neex. indexem evt codu
\r
105 int bth_evt_inquiry_complete(uint8_t *bth_p, uint8_t size) //0x01 - EVT_INQUIRY_COMPLETE
\r
108 return (*((uint8_t*)bth_p));
\r
110 int bth_evt_inquiry_result(uint8_t *bth_p, uint8_t size) //0x02
\r
116 int bth_evt_conn_complete(uint8_t *bth_p, uint8_t size) //0x03
\r
118 bths_connect_bluet *bth_q;
\r
121 for(j=0; j<=8;j++) //8 moznych zarizeni, se kterymi lze komunikovat
\r
123 if(bth_connected[j]==NULL)
\r
126 if(j==9){return (-1);}; //je mozno komunikovat pouze s 8-mi zarizenimi, toto je devate
\r
127 /*uvedu zarizeni do seznamu pripojenych zarizeni*/
\r
128 bth_connected[j]=(bths_connect_bluet*)calloc(1,sizeof(bths_connect_bluet));
\r
129 bth_q=(bths_connect_bluet*)bth_connected[j];
\r
130 /*naplnim strukturu pripojeneho zarizeni informacemi o vzdalenem bth*/
\r
131 memcpy(&(bth_q->bdaddr),(uint8_t*)bth_p+EVT_CONN_COMPLETE____bdaddr,sizeof(bdaddr_t));
\r
132 // store_le16(&(bth_q->handle),(uint16_t)*(uint16_t*)((uint8_t*)bth_p+EVT_CONN_COMPLETE____handle));
\r
133 __bthtomc16((uint8_t*)&(bth_q->handle),((uint8_t*)bth_p+EVT_CONN_COMPLETE____handle));
\r
134 /* sci_rs232_sendch('c',sci_rs232_chan_default); //do PC
\r
135 VypisHexa((void*)&(((bths_connect_bluet*)bth_connected[j])->handle),2);
\r
136 sci_rs232_sendch('c',sci_rs232_chan_default); //do PC*/
\r
138 store16(bth_q->link_type,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____link_type));
\r
139 store16(bth_q->encr_mode,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____encr_mode));
\r
141 bth_cmd_write_link_policy_settings(bth_q->handle,htobs(0x000f)); //odpoved
\r
142 return (*((uint8_t*)bth_p+EVT_CONN_COMPLETE____status));
\r
145 int bth_evt_conn_request(uint8_t *bth_p, uint8_t size) //0x04
\r
148 // evt_conn_request bth_q;
\r
149 /*BD adresa zadajiciho zarizeni*/
\r
150 memcpy(&bdaddr,(uint8_t*)bth_p+EVT_CONN_REQUEST____bdaddr,sizeof(bdaddr_t));
\r
151 // if(bth_seach_bdaddr(&bdaddr,&(bth_accept_bd_addr[0]),1));
\r
152 bth_accept_conn_req_cp(&bdaddr);
\r
158 int bth_evt_disconn_complete(uint8_t *bth_p, uint8_t size) //0x05
\r
161 evt_disconn_complete bth_q;
\r
162 // store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status)));
\r
163 __bthtomc16((uint8_t*)&(bth_q.handle),((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status));
\r
164 i=bth_find_conected_dev(bth_q.handle);
\r
165 free(bth_connected[i]); bth_connected[i]=NULL;
\r
166 // bth_local_info.busy=0;
\r
167 if(*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____reason)==0)
\r
168 return (*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status));
\r
170 return (*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____reason));
\r
173 int bth_evt_auth_complete(uint8_t *bth_p, uint8_t size) //0x06
\r
178 int bth_remote_name_req_complete(uint8_t *bth_p, uint8_t size) //0x07
\r
183 int bth_evt_encrypt_cahnge(uint8_t *bth_p, uint8_t size) //0x08
\r
188 int bth_evt_change_conn_link_key_complete(uint8_t *bth_p, uint8_t size) //0x09
\r
193 int bth_evt_master_link_key_complete(uint8_t *bth_p, uint8_t size) //0x0A
\r
198 int bth_evt_read_remote_features_complete(uint8_t *bth_p, uint8_t size) //0x0B
\r
203 int bth_evt_read_remote_version_complete(uint8_t *bth_p, uint8_t size) //0x0C
\r
208 int bth_evt_qos_setup_complete(uint8_t *bth_p, uint8_t size) //0x0D
\r
213 int bth_evt_cmd_complete(uint8_t *bth_p, uint8_t size) //0x0E
\r
215 evt_cmd_complete bth_q;
\r
216 uint16_t opcode,ogf,ocf;
\r
219 store16(bth_q.ncmd,*((uint8_t*)bth_p+EVT_CMD_COMPLETE____ncmd));
\r
220 // store_le16(&bth_q.opcode,*((uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode)));
\r
221 __bthtomc16(&bth_q.opcode,(((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode)));
\r
222 index=bth_del_event(bth_q.opcode);
\r
229 if(size-EVT_CMD_COMPLETE_SIZE==1) /*jedna se pouze o potvrzeni - status*/
\r
231 if(*((uint8_t*)bth_p+3)==0)
\r
233 free(bth_pole_adrr_check_packet[index]);
\r
234 bth_pole_adrr_check_packet[index]=NULL;
\r
235 bth_local_info.busy=0;
\r
236 return 0; //prikaz probehl bez komplikaci
\r
240 /*status neni OK - nastala chyba - odeslany comand prikaz je stale ve fronte k potvrzeni*/
\r
241 free(bth_pole_adrr_check_packet[index]);
\r
242 bth_pole_adrr_check_packet[index]=NULL;
\r
243 bth_local_info.busy=0;
\r
244 return((int)*((uint8_t*)bth_p+EVT_CMD_COMPLETE_SIZE));
\r
249 /*rozdelim obcode na OGF a OCF a prevedu na jednobytovou promenou*/
\r
250 // store_le16(&opcode,*(uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode));
\r
251 __bthtomc16((uint8_t*)&(opcode),((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode));
\r
253 ogf=(uint8_t)cmd_opcode_ogf(opcode);
\r
254 ocf=(uint8_t)cmd_opcode_ocf(opcode);
\r
259 bth_local_info.busy=0;
\r
260 if(ocf<BTH_OGF_01_FC)
\r
261 return (bth_info_fce_ogf_01[ocf](((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode+2),EVT_CMD_COMPLETE_SIZE));
\r
264 bth_local_info.busy=0;
\r
265 if(ocf<BTH_OGF_02_FC)
\r
266 return (bth_info_fce_ogf_02[ocf](((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode+2),size-EVT_CMD_COMPLETE_SIZE)); //cislo 0x00 je smysleno
\r
269 bth_local_info.busy=0;
\r
270 if(ocf<BTH_OGF_03_FC)
\r
271 return (bth_info_fce_ogf_03[ocf](((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode+2),size-EVT_CMD_COMPLETE_SIZE)); //cislo 0x00 je smysleno
\r
275 bth_local_info.busy=0;
\r
276 if(ocf<BTH_OGF_04_FC)
\r
277 return (bth_info_fce_ogf_04[ocf](((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode+2),size-EVT_CMD_COMPLETE_SIZE)); //cislo 0x00 je smysleno
\r
287 int bth_evt_cmd_status(uint8_t *bth_p, uint8_t size) //0x0F
\r
289 evt_cmd_status bth_q;
\r
290 store16(bth_q.status,*((uint8_t*)bth_p+EVT_CMD_STATUS____status));
\r
291 store16(bth_q.ncmd,*((uint8_t*)bth_p+EVT_CMD_STATUS____ncmd));
\r
292 // store_le16(&bth_q.opcode,*((uint16_t*)((uint8_t*)bth_p+EVT_CMD_STATUS____opcode)));
\r
293 __bthtomc16(&bth_q.opcode,(((uint8_t*)bth_p+EVT_CMD_STATUS____opcode)));
\r
294 // memcpy(&bth_q.opcode,(((uint8_t*)bth_p+EVT_CMD_STATUS____opcode)),2);
\r
298 index=bth_del_event(bth_q.opcode);
\r
301 bth_local_info.busy=0;
\r
306 if(size-EVT_CMD_STATUS_SIZE==0) /*jedna se pouze o potvrzeni - status*/
\r
308 if(bth_q.status==0)
\r
310 free(bth_pole_adrr_check_packet[index]);
\r
311 bth_pole_adrr_check_packet[index]=NULL;
\r
315 /*status neni OK - nastala chyba - odeslany comand prikaz je stale ve fronte k potvrzeni*/
\r
316 free(bth_pole_adrr_check_packet[index]);
\r
317 bth_pole_adrr_check_packet[index]=NULL;
\r
322 /*rozdelim obcode na OGF a OCF a prevedu na jednobytovou promenou*/
\r
323 ogf=(uint8_t)cmd_opcode_ogf((uint16_t)*(uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode));
\r
324 ocf=(uint8_t)cmd_opcode_ocf((uint16_t)*(uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode));
\r
325 /*jedna se o slozitejsi cmd_status, ktery sebou nese i data, nikoliv zaver, dalsi fce jsou deleny podle
\r
326 obcodu. Fce nejsou napsany, je udelany pouze rozcestnik*/
\r
335 bth_local_info.busy=0; //NOTE predelat, neni vzdycky pravda
\r
338 return(bth_q.status);
\r
341 int bth_evt_hardware_error(uint8_t *bth_p, uint8_t size) //0x10
\r
346 int bth_evt_flush_occurred(uint8_t *bth_p, uint8_t size) //0x11
\r
351 int bth_evt_role_cahage(uint8_t *bth_p, uint8_t size) //0x12
\r
356 int bth_evt_num_comp_pkts(uint8_t *bth_p, uint8_t size) //0x13
\r
358 evt_num_comp_pkts bth_q;
\r
359 uint16_t handle,num_pkt;
\r
361 store16(bth_q.num_hndl,*((uint8_t*)bth_p+EVT_NUM_COMP_PKTS____num_hndl));
\r
362 /*prohledam vsechna zarizeni, se kterymi mam uzavrenou komunikaci*/
\r
363 for(j=0; j<(bth_q.num_hndl);j++)
\r
365 __bthtomc16((uint8_t*)&(handle),((uint8_t*)bth_p+1+(j*4)));
\r
367 __bthtomc16((uint8_t*)&(num_pkt),((uint8_t*)bth_p+3+(j*4)));
\r
371 if(bth_connected[i]!=NULL)
\r
373 if(bth_connected[i]->handle==handle)
\r
375 // sci_rs232_sendch(';',sci_rs232_chan_default); //do PC
\r
376 // VypisHexa((void*)&(handle),2);
\r
377 // sci_rs232_sendch(';',sci_rs232_chan_default); //do PC
\r
383 bth_local_info.busy=0;
\r
387 int bth_evt_mode_change(uint8_t *bth_p, uint8_t size) //0x14
\r
392 int bth_evt_return_link_keys(uint8_t *bth_p, uint8_t size) //0x15
\r
397 int bth_evt_pin_code_req(uint8_t *bth_p, uint8_t size) //0x16
\r
402 int bth_evt_link_key_req(uint8_t *bth_p, uint8_t size) //0x17
\r
407 int bth_evt_link_key_notify(uint8_t *bth_p, uint8_t size) //0x18
\r
412 int bth_evt_loopback_command(uint8_t *bth_p, uint8_t size) //0x19
\r
417 int bth_evt_data_buffer_overflow(uint8_t *bth_p, uint8_t size) //0x1A
\r
422 int bth_evt_max_slots_change(uint8_t *bth_p, uint8_t size) //0x1B
\r
424 evt_max_slots_change bth_q;
\r
426 // store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____handle)));
\r
427 __bthtomc16((uint8_t*)&(bth_q.handle),(uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____handle);
\r
429 // store_le16(&bth_q.max_slots,*((uint16_t*)((uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____max_slots)));
\r
430 __bthtomc16((uint8_t*)&(bth_q.max_slots),(uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____max_slots);
\r
432 /*prohledam vsechna zarizeni, se kterymi mam uzavrenou komunikaci*/
\r
435 /* sci_rs232_sendch('j',sci_rs232_chan_default); //do PC
\r
436 VypisHexa((void*)&(((bths_connect_bluet*)bth_connected[i])->handle),2);
\r
437 sci_rs232_sendch('j',sci_rs232_chan_default); //do PC*/
\r
438 if(bth_connected[i]!=NULL)
\r
441 /* sci_rs232_sendch('k',sci_rs232_chan_default); //do PC
\r
442 VypisHexa((void*)&(bth_q.handle),2);
\r
443 sci_rs232_sendch('k',sci_rs232_chan_default); //do PC*/
\r
445 if(bth_connected[i]->handle==bth_q.handle)
\r
448 bth_connected[i]->max_slots=bth_q.max_slots;
\r
456 int bth_evt_read_clock_offset_complete(uint8_t *bth_p, uint8_t size) //0x1C
\r
461 int bth_evt_conn_ptype_changed(uint8_t *bth_p, uint8_t size) //0x1D
\r
463 evt_conn_ptype_changed bth_q;
\r
464 // uint16_t local_ptype;
\r
466 store16(bth_q.status,*((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____status));
\r
467 // store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____handle)));
\r
468 __bthtomc16((uint8_t*)&(bth_q.handle),(uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____handle);
\r
470 // store_le16(&bth_q.ptype,*((uint16_t*)((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____ptype)));
\r
471 __bthtomc16((uint8_t*)&(bth_q.ptype),(uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____ptype);
\r
473 dev_num=bth_find_conected_dev(bth_q.handle);
\r
474 //bth_local_info.pkt_type; - localni info o paketech
\r
475 // Change_Connection_Packet_Type - cmd prikaz, kterym se pripadne daji nastavit svoje packety
\r
478 bth_connected[dev_num]->ptype=bth_q.ptype;
\r
479 return(bth_q.status);
\r
485 int bth_evt_qos_violation(uint8_t *bth_p, uint8_t size) //0x1E
\r
491 int bth_evt_page_scan_mode_change(uint8_t *bth_p, uint8_t size) //0x1F
\r
498 int bth_evt_pscan_rep_mode_change(uint8_t *bth_p, uint8_t size) //0x20
\r
500 evt_pscan_rep_mode_change bth_q;
\r
501 memcpy(&(bth_q.bdaddr),(uint8_t*)bth_p+EVT_PSCAN_REP_MODE_CHANGE____bdaddr,sizeof(bdaddr_t));
\r
502 store16(bth_q.pscan_rep_mode,*((uint8_t*)bth_p+EVT_PSCAN_REP_MODE_CHANGE____pscan_rep_mode));
\r
504 /*prohledam vsechna zarizeni dle BDADDR, se kterymi mam uzavrenou komunikaci -NUTNO DOPSAT NOTE*/
\r
510 int bth_evt_flow_spec_complete(uint8_t *bth_p, uint8_t size) //0x21
\r
515 int bth_evt_inquiry_result_with_rssi(uint8_t *bth_p, uint8_t size) //0x22
\r