]> rtime.felk.cvut.cz Git - mirosot.git/blob - bluetooth/l2cap.c
b2e294443c8fa20aa31f9d8606d7ba5a5677c039
[mirosot.git] / bluetooth / l2cap.c
1 /*******************************************************************\r
2   bluetooth library\r
3 \r
4   l2cap.c - fce for operation L2CAP protocol (build L2CAP packet)\r
5             and for saving data to data queue\r
6 \r
7   Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com\r
8 \r
9  *******************************************************************/\r
10 \r
11 \r
12 \r
13 #include <string.h>\r
14 #include <stdlib.h>\r
15 #ifdef BTH_LX\r
16 #include <types.h>\r
17 #include <cpu_def.h>\r
18 #include <h8s2638h.h>\r
19 #include <periph/sci_rs232.h>\r
20 #include <system_def.h>\r
21 \r
22 #else\r
23 #include "types.h"\r
24 #endif\r
25 \r
26 #include "hci.h"\r
27 #include "l2cap.h"\r
28 \r
29 #include "inline_fce.h"\r
30 #include "bth_inface.h"\r
31 #include "bth_fce_out.h"\r
32 \r
33 \r
34 /**\r
35  * pointery na funkce, ktere se vykonavaji v zavislosti na parametru\r
36  */\r
37 typedef int (*l2cap_code_fce_def)(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan);\r
38 l2cap_code_fce_def l2cap_code_fce[]={\r
39   l2cap_none,l2cap_cod_command_rej,l2cap_cod_conn_req, l2cap_cod_conn_rsp, l2cap_cod_conf_req, l2cap_cod_conf_rsp,\r
40   l2cap_cod_disconn_req, l2cap_cod_disconn_rsp,   l2cap_cod_echo_req, l2cap_cod_echo_rsp, l2cap_cod_info_req,\r
41   l2cap_cod_info_rsp};\r
42 #define L2CAP_SUM_FC (sizeof(l2cap_code_fce)/sizeof(l2cap_code_fce[0]))\r
43 \r
44 \r
45 /*----------------------- funkce zavisle na code -----------------------------------*/\r
46 \r
47 /**\r
48 * funkce prohledava kanaly pripoj. zazizeni dev_num a hleda zadany kanal\r
49 */\r
50 inline int l2cap_find_dcid(int dcid, int dev_num )\r
51 {\r
52   int i;\r
53   for(i=1;i<L2CAP_NUM_OF_CANAL;i++)\r
54   {\r
55     if(bth_connected[dev_num]->dcid[i]==dcid)\r
56     {\r
57       return(-3);\r
58     };\r
59   };\r
60   return (0);\r
61 };\r
62 \r
63 \r
64 /*------------------------------ pomocne funkce --------------------------------*/\r
65 \r
66 int l2cap_add_to_send_buffer(uint8_t *bth_p)\r
67 {\r
68   if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL)\r
69   {return 1;};\r
70   bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=bth_p;\r
71 \r
72   /*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL)\r
73   se overuje, az pri samotnem ukladani */\r
74   if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;}\r
75   else{ bth_com_buf_info.aktual=0;};\r
76   return 0;\r
77 \r
78 };\r
79 /**\r
80 * neexistujici funkce - nemeli by nikdy nastat \r
81 */\r
82 int l2cap_none(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)\r
83 {\r
84   return (-3);\r
85 };\r
86 \r
87 \r
88 \r
89 /**\r
90  * dekodovani signaling paketu a volani vyse napsanych fci (pointery na fce)\r
91  */\r
92 int l2cap_signaling(uint8_t *bth_p, uint16_t size,int dev_num)\r
93 {\r
94   l2cap_cmd_hdr bth_q;\r
95 \r
96   store16(bth_q.code,*((uint8_t*)bth_p+L2CAP_CMD_HDR____code));\r
97   store16(bth_connected[dev_num]->ident,*((uint8_t*)bth_p+L2CAP_CMD_HDR____ident));\r
98   __bthtomc16((uint8_t*)&(bth_q.len),((uint8_t*)bth_p+L2CAP_CMD_HDR____len));\r
99   \r
100   if(bth_q.code<L2CAP_SUM_FC)\r
101   { /*odskok na obsluznou fci*/\r
102     l2cap_code_fce[bth_q.code]((uint8_t*)bth_p+L2CAP_CMD_HDR_SIZE, bth_q.len,dev_num, 0);\r
103     return 0;\r
104   }\r
105   else {return -1;};\r
106 };\r
107 \r
108 /*----------------------- funkce zavisle na code -----------------------------------*/\r
109 \r
110 /**\r
111  * Command reject\r
112  */\r
113 int l2cap_cod_command_rej(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)      //0x01\r
114 {\r
115   \r
116   return (-3);\r
117 };\r
118 \r
119 /**\r
120  * Connection request\r
121  */\r
122 int l2cap_cod_conn_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x02\r
123 {\r
124   l2cap_conn_req bth_q;\r
125   if(bth_p==NULL)\r
126   {\r
127     /*zde se paket sestavuje - tj. jedna se o zarizeni, ktere chce vytvorit novy kanal*/\r
128 \r
129   }\r
130   else \r
131   {\r
132     /*lokalni zarizeni obdrzelo paket 0x02*/\r
133     __bthtomc16((uint8_t*)&(bth_q.psm),((uint8_t*)bth_p+L2CAP_CONN_REQ____psm));\r
134     __bthtomc16((uint8_t*)&(bth_q.scid),((uint8_t*)bth_p+L2CAP_CONN_REQ____scid));\r
135     /*SCID je v tomto pripade DCID, protoze vysilajici strana si tento kanal zvolila jako SCID. Uloha je brana z\r
136     pohledu daneho zarizeni (ktere paket prijalo) tudiz se jedna o DCID*/\r
137 \r
138     pos_chan=bth_add_chanal_dcid(dev_num, bth_q.scid); //pridam DCID vzdaleneho zarizeni\r
139 \r
140     /*sestavim paket, kterym odpovidam*/\r
141     l2cap_cod_conn_rsp(NULL,0,dev_num,pos_chan);\r
142     bth_local_info.busy=0;\r
143   };\r
144   return (-1);\r
145 };\r
146 \r
147 /**\r
148   Connection response\r
149 */\r
150 int l2cap_cod_conn_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x03\r
151 {\r
152   l2cap_conn_req bth_q;\r
153   uint8_t *bth_r;\r
154   uint16_t result=L2CAP_CR_SUCCESS;\r
155   uint16_t status=0;\r
156   uint8_t *typ_hci_paket;\r
157   hci_acl_hdr *hci_headr;\r
158   l2cap_hdr *l2cap_headr;\r
159   l2cap_cmd_hdr *l2cap_cmd_headr;\r
160   l2cap_conn_rsp *l2cap_conn_response;\r
161   if(bth_p==NULL)\r
162   {\r
163     /*zarizeni obdrzelo od vzdaleneho zarizeni paket 0x03*/\r
164     int hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+L2CAP_CMD_HDR_SIZE+L2CAP_CONN_RSP_SIZE);\r
165     bth_r=malloc(hp_size);\r
166 \r
167     typ_hci_paket=(uint8_t*)bth_r;\r
168     hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE);             //pointer on head\r
169     l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE);   //pointer on parametrs\r
170     l2cap_cmd_headr=(l2cap_cmd_hdr *)(((uint8_t*)l2cap_headr)+L2CAP_HDR_SIZE);\r
171     l2cap_conn_response=(l2cap_conn_rsp *)(((uint8_t*)l2cap_cmd_headr)+L2CAP_CMD_HDR_SIZE);\r
172   /*------*/\r
173     store16(*typ_hci_paket, HCI_ACLDATA_PKT);\r
174     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,(htobs(0x2000)|bth_connected[dev_num]->handle));\r
175     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONN_RSP_SIZE+L2CAP_CMD_HDR_SIZE));\r
176 \r
177     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONN_RSP_SIZE+L2CAP_CMD_HDR_SIZE));\r
178     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001));\r
179     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONN_RSP);\r
180 \r
181 \r
182     if(pos_chan>-1) //kanal daneho zarizeni, jeste neexistuje, tj. zalozim ho\r
183     {\r
184       (bth_connected[dev_num])->scid[pos_chan]=(0x0040+pos_chan+1);\r
185       /*dcin - vzdal. zarizeni, ktere   */\r
186       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____dcid),(0x0040+pos_chan+1));\r
187     }\r
188     else{\r
189       result=htobs(L2CAP_CR_PEND); status=htobs(L2CAP_CS_NO_INFO);\r
190       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____dcid),0);\r
191     };\r
192 \r
193     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),((bths_connect_bluet*)bth_connected[dev_num])->ident);\r
194     store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),L2CAP_CONN_RSP_SIZE);\r
195     store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____scid),((bths_connect_bluet*)bth_connected[dev_num])->dcid[pos_chan]);\r
196 \r
197     if(l2cap_find_dcid(bth_q.scid, dev_num)>=0) //prohledam vsechna DCID (SCID vzdaleneho zarizeni, jeslti uz ho nepouziva)\r
198     {\r
199       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____result),htobs(L2CAP_CR_SUCCESS));\r
200       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____status),htobs(L2CAP_CS_NO_INFO));\r
201     }\r
202     else//zarizeni uz kanal pouziva, tj. odrekni spojeni s prislusnzym chyb. kodem\r
203     {\r
204       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____result),result);\r
205       store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____status),status);\r
206     };\r
207     /*pripravim data do vysilaciho bufferu*/\r
208     return(l2cap_add_to_send_buffer(bth_r));\r
209   }\r
210   else\r
211   {\r
212     /*lok. zarizeni vysila vzdalenemu zarizeni paket 0x03 - zada o kanal*/\r
213   };\r
214   return (-1);\r
215 };\r
216 \r
217 /**\r
218   Configure request\r
219  */\r
220 int l2cap_cod_conf_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x04\r
221 {\r
222   l2cap_conf_req bth_q;\r
223   uint8_t *bth_r;\r
224   uint8_t *typ_hci_paket;\r
225   hci_acl_hdr *hci_headr;\r
226   l2cap_hdr *l2cap_headr;\r
227   l2cap_cmd_hdr *l2cap_cmd_headr;\r
228   l2cap_conf_req *l2cap_conf_request;\r
229 \r
230   if(bth_p==NULL)\r
231   {\r
232   }\r
233   else\r
234   {\r
235     __bthtomc16((uint8_t*)&(bth_q.dcid),((uint8_t*)bth_p+L2CAP_CONF_REQ____dcid));\r
236     __bthtomc16((uint8_t*)&(bth_q.flags),((uint8_t*)bth_p+L2CAP_CONF_REQ____flags));\r
237     //jeste nejaka data .... - v nasem pripade se zadna nezpracovavaji\r
238     /*------*/\r
239     pos_chan=bth_find_chanal_scid(dev_num, bth_q.dcid);\r
240     l2cap_cod_conf_rsp(NULL, 0, dev_num, pos_chan);     //0x05\r
241     \r
242   /***************sestavim paket, kterym posilam responce kod = 0x04 masterovi*************/\r
243   /*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/\r
244     int hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+L2CAP_CMD_HDR_SIZE+L2CAP_CONF_REQ_SIZE);\r
245     bth_r=malloc(hp_size);\r
246 \r
247     typ_hci_paket=(uint8_t*)bth_r;\r
248     hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE);             //pointer on head\r
249     l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE);   //pointer on parametrs\r
250     l2cap_cmd_headr=(l2cap_cmd_hdr *)(((uint8_t*)l2cap_headr)+L2CAP_HDR_SIZE);\r
251     l2cap_conf_request=(l2cap_conf_req *)(((uint8_t*)l2cap_cmd_headr)+L2CAP_CMD_HDR_SIZE);\r
252     /*------*/\r
253 \r
254     store16(*typ_hci_paket, HCI_ACLDATA_PKT);\r
255     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,(htobs(0x2000)|(bth_connected[dev_num])->handle));\r
256     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONF_REQ_SIZE+L2CAP_CMD_HDR_SIZE));\r
257 \r
258     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONF_REQ_SIZE+L2CAP_CMD_HDR_SIZE));\r
259     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001));\r
260 \r
261     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONF_REQ);\r
262     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),(bth_connected[dev_num])->ident);\r
263     store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),htobs(L2CAP_CONF_REQ_SIZE));\r
264 \r
265     store_le16((uint16_t*)((uint8_t*)l2cap_conf_request+L2CAP_CONF_REQ____dcid),(bth_connected[dev_num])->dcid[pos_chan]);\r
266     store_le16((uint16_t*)((uint8_t*)l2cap_conf_request+L2CAP_CONF_REQ____flags),0);\r
267   //posledni polozka jsou data - nebubu posilat v tomto paketu\r
268 \r
269   /******************* umisteni do vysilaciho bufferu **************************/\r
270     l2cap_add_to_send_buffer(bth_r);\r
271     return 0;\r
272   };\r
273   return (-1);\r
274 };\r
275 \r
276 \r
277 /**\r
278   Configure response\r
279  */\r
280 int l2cap_cod_conf_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x05\r
281 {\r
282   l2cap_conf_rsp bth_q;\r
283   uint8_t *bth_r;\r
284   uint8_t *typ_hci_paket;\r
285   hci_acl_hdr *hci_headr;\r
286   l2cap_hdr *l2cap_headr;\r
287   l2cap_cmd_hdr *l2cap_cmd_headr;\r
288   l2cap_conf_rsp *l2cap_conf_response;\r
289 \r
290   if(bth_p==NULL)\r
291   {\r
292   /*sestavim paket, kterym odpovidam*/\r
293   /*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/\r
294     int hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+L2CAP_CMD_HDR_SIZE+L2CAP_CONF_RSP_SIZE);\r
295     bth_r=malloc(hp_size);\r
296 \r
297     typ_hci_paket=(uint8_t*)bth_r;\r
298     hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE);   //pointer on head\r
299     l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE);   //pointer on parametrs\r
300     l2cap_cmd_headr=(l2cap_cmd_hdr *)(((uint8_t*)l2cap_headr)+L2CAP_HDR_SIZE);\r
301     l2cap_conf_response=(l2cap_conf_rsp *)(((uint8_t*)l2cap_cmd_headr)+L2CAP_CMD_HDR_SIZE);\r
302   /*------*/\r
303     store16(*typ_hci_paket, HCI_ACLDATA_PKT);\r
304     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,(htobs(0x2000)|(bth_connected[dev_num])->handle));\r
305     store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONF_RSP_SIZE+L2CAP_CMD_HDR_SIZE));\r
306 \r
307     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONF_RSP_SIZE+L2CAP_CMD_HDR_SIZE));\r
308     store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001));\r
309 \r
310     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONF_RSP);\r
311     (bth_connected[dev_num])->ident++;\r
312     store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),(bth_connected[dev_num])->ident);\r
313     store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),htobs(L2CAP_CONF_RSP_SIZE));\r
314 \r
315     store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____scid),(bth_connected[dev_num])->dcid[pos_chan]);\r
316     store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____flags),0);\r
317     store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____result),0);\r
318   //posledni polozka jsou data - nebubu posilat v tomto paketu\r
319 \r
320 \r
321   /******************* umisteni do vysilaciho bufferu **************************/\r
322     return(l2cap_add_to_send_buffer(bth_r));\r
323   }\r
324   else\r
325   {\r
326     __bthtomc16((uint8_t*)&(bth_q.scid),((uint8_t*)bth_p+L2CAP_CONF_RSP____scid));\r
327     __bthtomc16((uint8_t*)&(bth_q.flags),((uint8_t*)bth_p+L2CAP_CONF_RSP____flags));\r
328     __bthtomc16((uint8_t*)&(bth_q.result),((uint8_t*)bth_p+L2CAP_CONF_RSP____result));\r
329    return (bth_q.result);;\r
330   };\r
331 };\r
332 \r
333 /**\r
334   Disconnection request \r
335  */\r
336 int l2cap_cod_disconn_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)  //0x06\r
337 {\r
338   return (-3);\r
339 };\r
340 \r
341 /**\r
342   Disconnection response\r
343  */\r
344 int l2cap_cod_disconn_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)  //0x07\r
345 {\r
346   return (-3);\r
347 };\r
348 \r
349 \r
350 /**\r
351   Configure response\r
352  */\r
353 int l2cap_cod_echo_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x08\r
354 {\r
355   return (-3);\r
356 };\r
357 \r
358 \r
359 /**\r
360   Echo request\r
361  */\r
362 int l2cap_cod_echo_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x09\r
363 {\r
364   return (-3);\r
365 };\r
366 \r
367 /**\r
368   Echo response\r
369  */\r
370 int l2cap_cod_info_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x0a\r
371 {\r
372   return (-3);\r
373 };\r
374 \r
375 /**\r
376   Information request\r
377  */\r
378 int l2cap_cod_info_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan)     //0x0b\r
379 {\r
380   return (-3);\r
381 };\r
382 \r
383 /*----------------------- send data ----------------------------*/\r
384 \r
385 /**\r
386  * zabali data z dat. zasobniku do peketu a da k odeslani\r
387 */\r
388 int l2cap_send_data(int inx_handle, int inx_chanal)\r
389 \r
390 {\r
391   uint8_t *typ_hci_paket;\r
392   hci_acl_hdr *hci_headr;\r
393   l2cap_hdr *l2cap_headr;\r
394   uint8_t *data;\r
395   uint8_t *bth_r;\r
396   int zn;\r
397   int hp_size,size=0;\r
398   uint16_t handle, chanal;\r
399 \r
400   \r
401   if(bth_connected[inx_handle]==NULL) return (-1);\r
402   if((bth_connected[inx_handle])->dcid[inx_chanal]==0) return (-1);\r
403 \r
404   /*cteni z vysilaciho zasobniku, skusmo 1 znak*/\r
405   zn=bth_inface_t_isr(0);\r
406   if(zn>=0)\r
407   {\r
408     handle = ((bths_connect_bluet*)bth_connected[inx_handle])->handle;\r
409     handle=(handle | htobs(0x2000));\r
410     chanal = (bth_connected[inx_handle])->dcid[inx_chanal];\r
411     \r
412     /*vytvoreni prostoru pro paket + prideleni adres pro jednotlive casti  L2CAP paketu*/\r
413     hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+BTH_INFACE_BUF_LEN);\r
414     bth_r=malloc(hp_size);\r
415     \r
416     typ_hci_paket=bth_r; //pozice v buff, ktera je prirazena paketu\r
417     hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE);             //pointer on head\r
418     l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE);   //pointer on parametrs\r
419     data=((uint8_t*)l2cap_headr+L2CAP_HDR_SIZE); //pointer na data\r
420 \r
421 /*-----------------------------DATA FOR SENDING TO PC --------------------------*/\r
422     *((uint8_t*)data+size)=(uint8_t)zn;\r
423     size++;\r
424     /*cyklicke cteni dalsich znaku a skladani do paketu*/\r
425     while ((zn=bth_inface_t_isr(0))>=0)\r
426     {\r
427       *((uint8_t*)data+size)=(uint8_t)zn;\r
428       size++;\r
429     };\r
430   }\r
431   else {return (0);}; //data nejsou v zasobniku\r
432   \r
433 /*sestavim zbytek paketu, kterym odpovidam tj. naplneni jednotlivych polozek*/\r
434   store16(*typ_hci_paket, HCI_ACLDATA_PKT);\r
435   store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,handle);\r
436   store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,(htobs(L2CAP_CMD_HDR_SIZE)+size));\r
437 \r
438   store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len),size);\r
439   store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),chanal);\r
440   \r
441 //  VypisHexa((void*)typ_hci_paket,16);\r
442 //  bth_local_info.busy=0;\r
443   return(l2cap_add_to_send_buffer(bth_r));\r
444 };\r