FreeCalypso > hg > fc-tourmaline
comparison src/cs/services/atp/atp_gsm_bt_api.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /******************************************************************************* | |
2 * | |
3 * File Name : atp_gsm_bt_api.c | |
4 * | |
5 * This file handles all the interface between GSM AT command handler or Data handler | |
6 * and the BT protocol stack. It has 2 main functions: | |
7 * - get the events coming from Bluetooth ATP in direction of GSM, analyse them and | |
8 * call the proper function of atp_gsm_gsm_api.c | |
9 * - offer function to GSM so that GSM can use services of the BT PS | |
10 * | |
11 * | |
12 * Version number : 0.1 Date : 10-Jully-2000 | |
13 * | |
14 * History : 0.1 - Created by E. Baissus | |
15 * | |
16 * Author : Eric Baissus : e-baissus@ti.com | |
17 * | |
18 * (C) Copyright 2000 by Texas Instruments Incorporated | |
19 *****************************************************************************/ | |
20 | |
21 #include "rv/rv_general.h" | |
22 #include "rvf/rvf_api.h" | |
23 #include "atp/atp_api.h" | |
24 #include "atp/atp_config.h" | |
25 #include "atp/atp_messages.h" | |
26 #include "atp/atp_gsm_bt_api.h" | |
27 #include "atp/atp_gsm_gsm_api.h" | |
28 #include "atp/atp_config.h" | |
29 #include "atp/bti_at.h" | |
30 #include "atp/atp_i.h" | |
31 #include "rvm/rvm_use_id_list.h" | |
32 | |
33 #include <string.h> | |
34 | |
35 /* Internal definitions */ | |
36 | |
37 | |
38 | |
39 typedef enum | |
40 { | |
41 ATP_ACTIVE , // Data exchange in the BT/GSM adapter is on going | |
42 ATP_NOT_ACTIVE // Data exchange in the BT/GSM adapter is not on going | |
43 } T_ATP_DATA_ACTIVITY; | |
44 | |
45 typedef enum | |
46 { | |
47 CMD_PENDING, // GSM should be processing a command from BT | |
48 CMD_NOT_PENDING // GSM can handle a new command issued by BT | |
49 } T_ATP_GSM_CMD_STATUS; | |
50 | |
51 typedef struct | |
52 { | |
53 UINT32 gsm_tx_data_left; // Number of data left to transmit to ATP | |
54 T_ATP_DATA_ACTIVITY atp_tx_data_activity; // Indicates if data exchange is on going from BT to GSM | |
55 T_ATP_GSM_CMD_STATUS cmd_status; | |
56 UINT32 bt_max_payload; | |
57 UINT16 tx_head_size; | |
58 UINT16 tx_trail_size; | |
59 } T_ATP_GSM_PORT_STRUCT; | |
60 | |
61 | |
62 /* Definition used only in this file */ | |
63 typedef enum | |
64 { | |
65 ATP_GSM_OPEN_PORT_PENDING, // The adaptor is processing an open port | |
66 ATP_GSM_OPEN_PORT_NOT_PENDING // The adaptor is not processing an open port | |
67 } T_ATP_GSM_OPEN_PORT_PENDING; | |
68 | |
69 | |
70 | |
71 | |
72 /* Local variable */ | |
73 static T_ATP_SW_ENTITY_ID atp_gsm_sw_id; /* Any entity needs to register to ATP and then get an id This id will be identify GSM for ATP */ | |
74 static T_ATP_PORT_NB initiator_port_nb; /* Port number used by the SWE requesting a new port to GSM */ | |
75 static T_ATP_SW_ENTITY_ID initiator_id; /* Initiator ID of the SWE requesting to open a port with GSM */ | |
76 static T_ATP_GSM_OPEN_PORT_PENDING open_port_pending; /* Value can be : PORT_PENDING or PORT_NOT_PENDING | |
77 A port is said to be in PORT_PENDING when a new port | |
78 has been requested but this new port is not yet created | |
79 Only one port at a time can be in PORT_PENDING state | |
80 If open_port_pending is in PORT_PENDING state, then no | |
81 new port request is processed | |
82 */ | |
83 static UINT8 current_nb_port; // Indicate number of port actually activated | |
84 static T_ATP_GSM_PORT_STRUCT * port_array[ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM]; | |
85 static UINT32 temp_bt_max_payload; // USed to store BT MFS before the port is actually open | |
86 | |
87 /* Function definition */ | |
88 static T_RV_RET atp_gsm_init_port(T_ATP_GSM_PORT_STRUCT * port_p); | |
89 static T_RV_RET atp_gsm_init_if(void); | |
90 static T_RV_RET atp_gsm_get_new_port_nb(UINT8 * port_nb); | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 /****************************************************************************** | |
97 * Function name: atp_gsm_bt_event_handle | |
98 * | |
99 * Description : Main function used to split the events coming from ATP | |
100 * and call proper function of GSM side (see atp_gsm_gsm_api.c) | |
101 * | |
102 * | |
103 * Parameters : * ATP message | |
104 * | |
105 * Return : No return | |
106 * | |
107 * | |
108 * History : 0.1 (10-Jully-2000) | |
109 * | |
110 ******************************************************************************/ | |
111 void atp_gsm_bt_event_handle(void * message_p) | |
112 { | |
113 | |
114 T_RV_RET error = RV_OK; | |
115 T_BTI_PORT_NB port_nb = 0xFF; | |
116 | |
117 | |
118 | |
119 switch(((T_ATP_MESSAGE *) message_p)->msg_id) | |
120 { | |
121 case ATP_OPEN_PORT_IND : | |
122 { | |
123 T_BTI_BT_PORT_INFO bt_port_info; | |
124 rvf_send_trace("ATP/GSM : Received a ATP_OPEN_PORT_IND from ATP ",50, | |
125 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
126 | |
127 // Store initiator parameters | |
128 initiator_port_nb=(( T_ATP_OPEN_PORT_IND *) message_p)->initiator_port_nb; | |
129 initiator_id = (( T_ATP_OPEN_PORT_IND *) message_p)->initiator_id; | |
130 | |
131 if ((open_port_pending == ATP_GSM_OPEN_PORT_PENDING) || (atp_gsm_get_new_port_nb(&port_nb)!= RV_OK)) | |
132 { | |
133 // A port opening is pending : refuse to open a new port | |
134 T_ATP_PORT_INFO dummy_port_info; | |
135 T_ATP_NO_COPY_INFO dummy_no_copy_info; | |
136 | |
137 rvf_send_trace("ATP/GSM : Failed to open a port : port opening was pending or max number of port has been reached",97, | |
138 NULL_PARAM,RV_TRACE_LEVEL_WARNING,ATP_USE_ID); | |
139 | |
140 /* Initialise to avoid warning */ | |
141 memset(&dummy_port_info,0,sizeof(dummy_port_info)); | |
142 memset(&dummy_no_copy_info,0,sizeof(dummy_no_copy_info)); | |
143 | |
144 // Send a negative response to ATP | |
145 atp_open_port_rsp((( T_ATP_OPEN_PORT_IND *) message_p)->initiator_id,initiator_port_nb,atp_gsm_sw_id,0, | |
146 dummy_port_info,dummy_no_copy_info,NULL,OPEN_PORT_NOK); | |
147 rvf_free_buf( (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p ); | |
148 error=RV_NOT_SUPPORTED; | |
149 } | |
150 | |
151 // Send open port indication to GSM | |
152 /////////////// Need to update data packet size | |
153 bt_port_info.optimal_bt_max_packet_size = ((T_ATP_CUSTOM_TO_GSM_INFO *) (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p)->bt_max_payload; // DO NOT CARE ... | |
154 temp_bt_max_payload = bt_port_info.optimal_bt_max_packet_size; // Store temporaly the MFS | |
155 open_port_pending=ATP_GSM_OPEN_PORT_PENDING; // Now , an open port is pending | |
156 bti_at_open_port_ind(port_nb,bt_port_info); | |
157 rvf_free_buf( (( T_ATP_OPEN_PORT_IND *) message_p)->custom_info_p ); | |
158 break; | |
159 }; | |
160 | |
161 | |
162 case ATP_PORT_CLOSED : | |
163 { // A close_port has been issue on BT side | |
164 rvf_send_trace("ATP/GSM : Received a ATP_PORT_CLOSED from ATP ",50, | |
165 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
166 | |
167 // Send close port indication to GSM | |
168 bti_at_close_port_ind((T_BTI_PORT_NB) ((T_ATP_PORT_CLOSED *) message_p)->port_nb); | |
169 break; | |
170 }; | |
171 | |
172 | |
173 case ATP_TXT_CMD_RDY : | |
174 { // A command in text format has been issued by BT side | |
175 rvf_send_trace("ATP/GSM : Received a ATP_TXT_CMD_RDY from ATP",45, | |
176 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
177 | |
178 if (((T_ATP_TXT_CMD_RDY *) message_p)->cmd_type == CMD_ABORT) | |
179 { | |
180 rvf_send_trace("ATP/GSM : An abort command is requested by ATP ",47, | |
181 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
182 port_array[((T_ATP_TXT_CMD_RDY *)message_p)->port_nb]->cmd_status = CMD_NOT_PENDING; | |
183 bti_at_abort_ind((T_BTI_PORT_NB) ((T_ATP_TXT_CMD_RDY *) message_p)->port_nb); | |
184 } | |
185 else | |
186 { | |
187 rvf_send_trace( ((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p, | |
188 (UINT8) strlen(((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p), | |
189 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
190 port_array[((T_ATP_TXT_CMD_RDY *)message_p)->port_nb]->cmd_status = CMD_PENDING; | |
191 bti_at_cmd_ind((T_BTI_PORT_NB) ((T_ATP_TXT_CMD_RDY *) message_p)->port_nb, | |
192 (char *) ((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p); | |
193 } | |
194 | |
195 atp_free_buffer(((T_ATP_TXT_CMD_RDY *) message_p)->txt_cmd_p); | |
196 break; | |
197 }; | |
198 | |
199 case ATP_CMD_RDY : | |
200 { // A command in binary format has been issued by BT side | |
201 // This command is ignored since binary format not supported by GSM | |
202 rvf_send_trace("ATP/GSM : Ignored a ATP_CMD_RDY from ATP",40, | |
203 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID); | |
204 | |
205 atp_free_buffer(((T_ATP_CMD_RDY *) message_p)->cmd_info_p); | |
206 | |
207 break; | |
208 }; | |
209 | |
210 | |
211 case ATP_NO_COPY_DATA_RDY : | |
212 { // BT side issued a no copy format buffer to GSM | |
213 // This command is ignored and warning is raised | |
214 rvf_send_trace("ATP/GSM : Ignored a ATP_NO_COPY_DATA_RDY from ATP ",50, | |
215 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID); | |
216 | |
217 atp_free_buffer(((T_ATP_NO_COPY_DATA_RDY *) message_p)->atp_buffer_p); | |
218 | |
219 break; | |
220 }; | |
221 | |
222 | |
223 | |
224 case ATP_DATA_RDY : | |
225 { // BT side has sent data to GSM | |
226 rvf_send_trace("ATP/GSM : Received a ATP_DATA_RDY from ATP . Nb of data = ",58, | |
227 (UINT32) ((T_ATP_DATA_RDY *)message_p)->nb_bytes,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
228 | |
229 /* If GSM is not currently handling data exchange, call bti_data_rdy */ | |
230 if (port_array[((T_ATP_DATA_RDY *)message_p)->port_nb]->atp_tx_data_activity == ATP_NOT_ACTIVE) | |
231 { | |
232 port_array[((T_ATP_DATA_RDY *)message_p)->port_nb]->atp_tx_data_activity = | |
233 ATP_ACTIVE; | |
234 | |
235 rvf_send_trace("ATP/GSM : bti_data_ready_ind has been called by BT . Nb_Bytes = ",65, | |
236 (UINT32) ((T_ATP_DATA_RDY *)message_p)->nb_bytes ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
237 | |
238 bti_data_ready_ind((T_BTI_PORT_NB) ((T_ATP_DATA_RDY *)message_p)->port_nb, | |
239 (unsigned long) ((T_ATP_DATA_RDY *)message_p)->nb_bytes); | |
240 | |
241 } | |
242 else | |
243 { | |
244 UINT8 * dummy_data_buffer = NULL; | |
245 UINT32 data_left,data_read; | |
246 | |
247 ATP_SEND_TRACE("ATP/GSM : Wait before sending data to GSM since GSM is already fetching data", | |
248 RV_TRACE_LEVEL_DEBUG_LOW); | |
249 | |
250 atp_get_data(atp_gsm_sw_id,((T_ATP_DATA_RDY *)message_p)->port_nb,(UINT8 *) dummy_data_buffer, | |
251 (UINT32) 0,&data_read,&data_left); | |
252 | |
253 rvf_send_trace("ATP/GSM : Total number of data to fetch for GSM = ",51, | |
254 (UINT32) data_left,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
255 } | |
256 | |
257 break; | |
258 }; | |
259 | |
260 | |
261 | |
262 case ATP_PORT_MODE_CHANGED : | |
263 { // BT side has issue a port mode changed (Data or Command) | |
264 rvf_send_trace("ATP/GSM : Received a ATP_PORT_MODE_CHANGED from ATP",51, | |
265 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
266 | |
267 if( ((T_ATP_PORT_MODE_CHANGED *) message_p)->mode == ATP_PORT_DATA_MODE) | |
268 { | |
269 ATP_SEND_TRACE("ATP/GSM: switch to data mode",RV_TRACE_LEVEL_DEBUG_LOW); | |
270 ATP_SEND_TRACE("ATP/GSM: BT calls bti_data_ready_cnf in order to accept data from GSM",RV_TRACE_LEVEL_DEBUG_LOW); | |
271 bti_data_ready_cnf((T_BTI_PORT_NB) ((T_ATP_PORT_MODE_CHANGED *) message_p)->port_nb); | |
272 } | |
273 else | |
274 { | |
275 ATP_SEND_TRACE("ATP/GSM: port has been switched to command mode by BT",RV_TRACE_LEVEL_DEBUG_LOW); | |
276 } | |
277 | |
278 break; | |
279 }; | |
280 | |
281 | |
282 case ATP_SIGNAL_CHANGED : | |
283 { // BT side has issued a signal change | |
284 rvf_send_trace("ATP/GSM : Received a ATP_SIGNAL_CHANGED from ATP",48, | |
285 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
286 | |
287 if ( ( (((T_ATP_SIGNAL_CHANGED *) message_p)->mask) & ATP_TX_FLOW_UNMASK) != 0) | |
288 { | |
289 // change on TX flow | |
290 if( ( (((T_ATP_SIGNAL_CHANGED *) message_p)->mask) & | |
291 (((T_ATP_SIGNAL_CHANGED *) message_p)->signal) ) == ATP_TX_FLOW_OFF) | |
292 { | |
293 // BT side has switch TX GSM flow to OFF | |
294 rvf_send_trace("ATP/GSM : ATP requested TX GSM Flow to be OFF",45, | |
295 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
296 } | |
297 else | |
298 { | |
299 // BT side has switch TX GSM flow to ON | |
300 rvf_send_trace("ATP/GSM : ATP requested TX GSM Flow to be ON",44, | |
301 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
302 | |
303 if (port_array[((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb]->gsm_tx_data_left != 0) | |
304 { | |
305 // Retry to send data to ATP | |
306 bti_data_ready_req( (T_BTI_PORT_NB) ((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb, | |
307 port_array[((T_ATP_SIGNAL_CHANGED *) message_p)->port_nb]->gsm_tx_data_left); | |
308 } | |
309 } | |
310 break; | |
311 } | |
312 | |
313 ////////////////////////////////////// | |
314 // Otherwise, ignore the signal change | |
315 /////////////////////TO BE UPDATED !!! ///////////////// | |
316 rvf_send_trace("ATP/GSM : Signal change has been ignored ",41, | |
317 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
318 | |
319 break; | |
320 }; | |
321 | |
322 | |
323 default: | |
324 { | |
325 rvf_send_trace("ATP/GSM : Unknown message received from ATP by ATP_GSM => ignored ",66, | |
326 NULL_PARAM,RV_TRACE_LEVEL_WARNING,ATP_USE_ID); | |
327 break; | |
328 }; | |
329 } | |
330 | |
331 /* Release ATP message buffer */ | |
332 atp_free_message(message_p); | |
333 | |
334 } | |
335 | |
336 | |
337 | |
338 | |
339 /****************************************************************************** | |
340 * Function name: bti_at_init_req | |
341 * | |
342 * Description : This function is called by GSM to initialise GSM with ATP | |
343 * | |
344 * | |
345 * Parameters : None | |
346 * | |
347 * Return : BTI_AT_OK or BTI_AT_INTERNAL_ERR | |
348 * | |
349 * History : 0.1 (10-Jully-2000) | |
350 * : 0.2 (02-Jan-2001) | |
351 ******************************************************************************/ | |
352 void bti_at_init_req(void) | |
353 { | |
354 T_ATP_ENTITY_MODE mode; | |
355 T_ATP_SW_ENTITY_NAME name; | |
356 T_ATP_CALLBACK return_path; | |
357 | |
358 ATP_SEND_TRACE("ATP/GSM : bti_at_init_req has been called by GSM . ", | |
359 RV_TRACE_LEVEL_DEBUG_LOW); | |
360 | |
361 /* Static variable initialisation */ | |
362 atp_gsm_init_if(); | |
363 | |
364 /* Register GSM to ATP */ | |
365 strcpy((char *) name,ATP_GSM_NAME); | |
366 return_path.callback_func = atp_gsm_bt_event_handle; | |
367 return_path.addr_id = RVF_INVALID_ADDR_ID; | |
368 | |
369 mode.cmd_mode=TXT_MODE; | |
370 mode.cp_mode=COPY_ON; | |
371 mode.cmd_support_mode=CMD_SUPPORT_ON; | |
372 | |
373 if(atp_reg(name,return_path,mode,&atp_gsm_sw_id)!=RV_OK) | |
374 { | |
375 rvf_send_trace("ATP_GSM: GSM entity registration failed ",39, NULL_PARAM , | |
376 RV_TRACE_LEVEL_WARNING,ATP_USE_ID); | |
377 bti_at_init_cnf(BTI_NAK); // Failed registration | |
378 } | |
379 else | |
380 { | |
381 ATP_SEND_TRACE ("ATP/GSM: GSM entity registration succeeded ",RV_TRACE_LEVEL_DEBUG_LOW); | |
382 bti_at_init_cnf(BTI_ACK); // Succeeded registration | |
383 } | |
384 } | |
385 | |
386 | |
387 | |
388 | |
389 /****************************************************************************** | |
390 * Function name: bti_at_deinit_ind | |
391 * | |
392 * Description : This function is called by GSM (?) to de-initialise GSM from ATP | |
393 * | |
394 * | |
395 * Parameters : None | |
396 * | |
397 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED | |
398 * | |
399 * | |
400 * History : 0.1 (10-Jully-2000) | |
401 * | |
402 ******************************************************************************/ | |
403 void bti_at_deinit_req(void) | |
404 { | |
405 ATP_SEND_TRACE ("ATP_GSM: bti_at_deinit_req has been called by GSM ",RV_TRACE_LEVEL_DEBUG_LOW); | |
406 atp_dereg(atp_gsm_sw_id); | |
407 } | |
408 | |
409 | |
410 | |
411 /****************************************************************************** | |
412 * Function name: bti_at_deinit_res | |
413 * | |
414 * Description : This function is called by GSM to de-initialise GSM from ATP | |
415 * | |
416 * | |
417 * Parameters : None | |
418 * | |
419 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED | |
420 * | |
421 * | |
422 * History : 0.1 (10-Jully-2000) | |
423 * | |
424 ******************************************************************************/ | |
425 void bti_at_deinit_res(void) | |
426 { | |
427 // DUMMY FUNCTION | |
428 } | |
429 | |
430 | |
431 | |
432 /****************************************************************************** | |
433 * Function name: bti_at_open_port_res | |
434 * | |
435 * Description : This function is called by GSM to accept or refuse | |
436 * an open port request issued by BT side | |
437 * | |
438 * | |
439 * | |
440 * | |
441 * History : 0.1 (10-Jully-2000) | |
442 * : 0.2 (02-Jan-2001) | |
443 ******************************************************************************/ | |
444 void bti_at_open_port_res(T_BTI_PORT_NB gsm_port_nb, | |
445 T_BTI_GSM_PORT_INFO gsm_port_info, | |
446 T_BTI_ACK ack) | |
447 { | |
448 | |
449 T_ATP_PORT_INFO port_info ; | |
450 T_ATP_NO_COPY_INFO no_copy_info ; | |
451 T_RV_RET return_status; | |
452 T_ATP_CUSTOM_FROM_GSM_INFO * custom_gsm_info_p; | |
453 T_ATP_OTHER_PORT_END_INFO other_end_info; | |
454 | |
455 rvf_send_trace("ATP/GSM : bti_at_open_port_res has been called by GSM . Flag = ",43, | |
456 (UINT32) ack,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
457 rvf_send_trace("ATP/GSM : gsm_port_nb = ",24, | |
458 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
459 rvf_send_trace("ATP/GSM : GSM indication for MFS = ",35, | |
460 (UINT32) gsm_port_info.optimal_gsm_max_packet_size, | |
461 RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
462 | |
463 /* Get information on the other end port */ | |
464 if (atp_get_info_on_port_end(initiator_id,(T_ATP_PORT_NB) initiator_port_nb, | |
465 &other_end_info) != RV_OK) | |
466 { | |
467 ATP_SEND_TRACE("ATP : Failed to get information on other end port ", | |
468 RV_TRACE_LEVEL_WARNING); | |
469 no_copy_info.tx_head_size = 0; | |
470 no_copy_info.tx_trail_size = 0; | |
471 } | |
472 else | |
473 { | |
474 no_copy_info.tx_head_size = other_end_info.no_copy_info.rx_head_size; | |
475 no_copy_info.tx_trail_size = other_end_info.no_copy_info.rx_trail_size; | |
476 } | |
477 | |
478 | |
479 /* Initialise port information */ | |
480 no_copy_info.rx_head_mode = RX_HEADER_OFF; // COPY ON mode in RX | |
481 no_copy_info.tx_head_mode = TX_HEADER_OFF; // COPY OFF mode in TX for optimization | |
482 | |
483 | |
484 // no_copy_info.tx_head_mode = TX_HEADER_ON; // COPY OFF mode in TX for optimization | |
485 ////////// SHOULD BE REMOVED IN CASE GSM SEND DATA WITH HEADER AND TRAILER BIT ////// | |
486 no_copy_info.tx_head_size = 0; | |
487 no_copy_info.tx_trail_size = 0; | |
488 | |
489 no_copy_info.rx_mb = RVF_INVALID_MB_ID; | |
490 no_copy_info.tx_mb = RVF_INVALID_MB_ID; | |
491 no_copy_info.packet_mode = NORMAL_PACKET; /* No L2CAP packet... */ | |
492 | |
493 port_info.dce_mask[0]=0x0000; // Do not care, GSM is not in DCE_ON mode | |
494 port_info.ring_type=ATP_NO_RING_TYPE; | |
495 port_info.signal_mask=ATP_TX_FLOW_UNMASK; | |
496 | |
497 /* Store custom info from GSM */ | |
498 atp_get_buffer(sizeof(T_ATP_CUSTOM_FROM_GSM_INFO),(void **) &custom_gsm_info_p); | |
499 custom_gsm_info_p->custom_type = ATP_FROM_GSM_INFO; | |
500 custom_gsm_info_p ->optimal_gsm_max_packet_size = gsm_port_info.optimal_gsm_max_packet_size; | |
501 | |
502 if (ack == BTI_ACK) | |
503 { | |
504 ATP_SEND_TRACE("ATP/GSM : GSM accepted to open a port ", RV_TRACE_LEVEL_DEBUG_LOW); | |
505 // Initialise a new port | |
506 atp_get_buffer(sizeof(T_ATP_GSM_PORT_STRUCT),(void **) &(port_array[gsm_port_nb])); | |
507 | |
508 atp_gsm_init_port(port_array[gsm_port_nb]); | |
509 port_array[gsm_port_nb]->tx_head_size = no_copy_info.tx_head_size; | |
510 port_array[gsm_port_nb]->tx_trail_size = no_copy_info.tx_trail_size; | |
511 | |
512 return_status = atp_open_port_rsp( initiator_id, | |
513 (T_ATP_PORT_NB) initiator_port_nb, | |
514 atp_gsm_sw_id, | |
515 (T_ATP_PORT_NB) gsm_port_nb, | |
516 port_info, | |
517 no_copy_info, | |
518 (T_ATP_CUSTOM_INFO *) custom_gsm_info_p, | |
519 OPEN_PORT_OK); | |
520 } | |
521 else | |
522 { | |
523 rvf_send_trace("ATP/GSM : GSM refused the open port ",36, | |
524 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
525 | |
526 return_status = atp_open_port_rsp( initiator_id, | |
527 (T_ATP_PORT_NB) initiator_port_nb, | |
528 atp_gsm_sw_id, | |
529 (T_ATP_PORT_NB) gsm_port_nb, | |
530 port_info, | |
531 no_copy_info, | |
532 NULL, | |
533 OPEN_PORT_NOK); | |
534 } | |
535 | |
536 if(return_status != RV_OK) | |
537 { | |
538 rvf_send_trace("ATP/GSM : Failed to open a port ",33, | |
539 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID); | |
540 } | |
541 | |
542 open_port_pending = ATP_GSM_OPEN_PORT_NOT_PENDING; | |
543 } | |
544 | |
545 | |
546 | |
547 | |
548 /****************************************************************************** | |
549 * Function name: bti_at_close_port_res | |
550 * | |
551 * Description : Not used by BT PS - Port is always closed | |
552 * | |
553 * Parameters : | |
554 * | |
555 * Return : BTI_AT_OK | |
556 * | |
557 * History : 0.1 (10-Jully-2000) | |
558 * | |
559 ******************************************************************************/ | |
560 void bti_at_close_port_res(T_BTI_PORT_NB gsm_port_nb) | |
561 { | |
562 rvf_send_trace("ATP/GSM : bti_at_close_port_res has been called by GSM . Port nb = ",67, | |
563 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
564 | |
565 /* Memory Deallocation */ | |
566 rvf_free_buf(port_array[gsm_port_nb]); | |
567 port_array[gsm_port_nb]=NULL; | |
568 } | |
569 | |
570 | |
571 | |
572 /****************************************************************************** | |
573 * Function name: bti_at_cmd_res | |
574 * | |
575 * Description : This function is called by GSM to provide result to BT | |
576 * | |
577 * Parameters : gsm_port_nb = number of the gsm port | |
578 * cmd = command in text format | |
579 * | |
580 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED | |
581 * | |
582 * | |
583 * History : 0.1 (10-Jully-2000) | |
584 * | |
585 ******************************************************************************/ | |
586 void bti_at_cmd_res(T_BTI_PORT_NB gsm_port_nb, | |
587 char * cmd) | |
588 { | |
589 T_ATP_TXT_CMD txt_buffer_p; | |
590 | |
591 ATP_SEND_TRACE ("ATP/GSM : bti_at_cmd_res has been called by GSM . Result is : ", | |
592 RV_TRACE_LEVEL_DEBUG_LOW); | |
593 rvf_send_trace(cmd,(UINT8) strlen(cmd), | |
594 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
595 | |
596 /* Create a BTF buffer and copy command into. The command must be 0-terminated */ | |
597 atp_get_buffer(strlen(cmd) + 0x00000001,(void **) &txt_buffer_p); | |
598 strcpy(txt_buffer_p,cmd); | |
599 | |
600 port_array[gsm_port_nb]->cmd_status = CMD_NOT_PENDING; | |
601 if (atp_send_txt_cmd(atp_gsm_sw_id,(T_ATP_PORT_NB) gsm_port_nb, | |
602 RESULT_CODE,(T_ATP_TXT_CMD) txt_buffer_p) != RV_OK) | |
603 { | |
604 rvf_send_trace("ATP/GSM : Error when sending a command to ATP ",46, | |
605 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID); | |
606 } | |
607 } | |
608 | |
609 | |
610 /****************************************************************************** | |
611 * Function name: bti_at_cmd_req | |
612 * | |
613 * Description : This function is called by GSM to provide preliminary result to BT | |
614 * The end of the result will be issed via bti_at_cmd_res | |
615 * | |
616 * Parameters : gsm_port_nb = number of the gsm port | |
617 * cmd = command in text format | |
618 * | |
619 * Return : BTI_AT_OK or BTI_AT_NOT_SUPPORTED | |
620 * | |
621 * | |
622 * History : 0.1 (10-Jully-2000) | |
623 * | |
624 ******************************************************************************/ | |
625 void bti_at_cmd_req(T_BTI_PORT_NB gsm_port_nb, | |
626 char * cmd) | |
627 { | |
628 | |
629 T_ATP_CMD_TYPE cmd_type; | |
630 T_ATP_TXT_CMD txt_buffer_p; | |
631 ATP_SEND_TRACE("ATP/GSM : bti_at_cmd_req has been called by GSM. Code is : ", | |
632 RV_TRACE_LEVEL_DEBUG_LOW); | |
633 rvf_send_trace(cmd,(UINT8) strlen(cmd), | |
634 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
635 | |
636 /* Create a BTF buffer and copy command into. The command must be 0-terminated */ | |
637 atp_get_buffer(strlen(cmd) + 0x00000001,(void **) &txt_buffer_p); | |
638 strcpy(txt_buffer_p,cmd); | |
639 | |
640 if (port_array[gsm_port_nb]->cmd_status == CMD_PENDING) | |
641 { | |
642 cmd_type = PRELIMINARY_RESULT_CODE; | |
643 } | |
644 else | |
645 { | |
646 cmd_type = UNSOLICITED_RESULT; | |
647 } | |
648 | |
649 if (atp_send_txt_cmd(atp_gsm_sw_id,(T_ATP_PORT_NB) gsm_port_nb,cmd_type, | |
650 (T_ATP_TXT_CMD) txt_buffer_p) != RV_OK) | |
651 { | |
652 rvf_send_trace("ATP/GSM : Error when sending a command to ATP ",46, | |
653 NULL_PARAM,RV_TRACE_LEVEL_WARNING, ATP_USE_ID); | |
654 } | |
655 | |
656 bti_at_cmd_cnf(gsm_port_nb); // Accept new results | |
657 } | |
658 | |
659 | |
660 | |
661 /****************************************************************************** | |
662 * Function name: bti_at_abort_res | |
663 * | |
664 * Description : This function is called by GSM to comfirm a command abort | |
665 * NOT USED BY ATP YET | |
666 * | |
667 * Parameters : gsm_port_nb = number of the gsm port | |
668 * | |
669 * Return : BTI_AT_NOT_SUPPORTED | |
670 * | |
671 * | |
672 * History : 0.1 (10-Jully-2000) | |
673 * | |
674 ******************************************************************************/ | |
675 void bti_at_abort_res(T_BTI_PORT_NB gsm_port_nb) | |
676 { | |
677 rvf_send_trace("ATP/GSM : bti_at_abort_res has been called by GSM . Ignored . Port nb = ",72, | |
678 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
679 | |
680 // Not implemented yet . Maybe usefull to send a commande back to indicate the abortion has succeede (or failed ...) | |
681 } | |
682 | |
683 | |
684 /****************************************************************************** | |
685 * Function name: bti_data_ready_req | |
686 * | |
687 * Description : This function is called by GSM to indicate that data are | |
688 * available for BT PS. | |
689 * | |
690 * | |
691 * Parameters : gsm_port_nb = number of the gsm port | |
692 * nb_bytes_available = number of bytes of data available | |
693 * | |
694 * Return : None | |
695 * | |
696 * History : 0.1 (10-Jully-2000) | |
697 * 0.2 (01-Jan-2001) | |
698 * | |
699 ******************************************************************************/ | |
700 void bti_data_ready_req (T_BTI_PORT_NB gsm_port_nb, | |
701 unsigned long nb_bytes_available) | |
702 { | |
703 UINT32 nb_bytes_left,nb_bytes_to_transmit; | |
704 UINT8 * data_buffer_p; | |
705 | |
706 rvf_send_trace("ATP/GSM : data_ready_req has been called by GSM . Nb Bytes = ",61, | |
707 (UINT32) nb_bytes_available,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
708 | |
709 rvf_send_trace("ATP/GSM : Port Number used by GSM = ",37, | |
710 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
711 | |
712 if (nb_bytes_available !=0) | |
713 { | |
714 | |
715 nb_bytes_left= nb_bytes_available; // number of byte to transmit in this function | |
716 | |
717 while(nb_bytes_left > 0) | |
718 { | |
719 if (nb_bytes_left > port_array[gsm_port_nb]->bt_max_payload) // Bigger than allowed MFS | |
720 { | |
721 nb_bytes_to_transmit = port_array[gsm_port_nb]->bt_max_payload; | |
722 } | |
723 else | |
724 { | |
725 nb_bytes_to_transmit = nb_bytes_left; | |
726 } | |
727 | |
728 | |
729 /* This code is removed because of an issue with header and trailer size | |
730 /* It is temporary remplaced by setting to 0 header and trailer */ | |
731 /* atp_buffer_size = nb_bytes_to_transmit + port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size+ | |
732 // port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_trail_size; | |
733 // | |
734 // rvf_send_trace("ATP/GSM : Buffer_size to send to ATP = ",40, | |
735 // (UINT32) atp_buffer_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
736 // | |
737 // rvf_send_trace("ATP/GSM : tx_header size = ",27, | |
738 // (UINT32) port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
739 // | |
740 // rvf_send_trace("ATP/GSM : tx_trail size = ",27, | |
741 // (UINT32) port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_trail_size,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
742 | |
743 | |
744 if (atp_get_buffer_from_tx_mb(atp_gsm_sw_id,gsm_port_nb,atp_buffer_size, | |
745 (void **) &data_buffer_p) == RV_OK) | |
746 { | |
747 /* Copy GSM data | |
748 rvf_send_trace("ATP/GSM : BT calls bti_get_gsm_data and request nb Bytes = ",59, | |
749 (UINT32) nb_bytes_to_transmit,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
750 | |
751 bti_get_gsm_data(gsm_port_nb,(char *) &(data_buffer_p[port_array[(T_ATP_PORT_NB) gsm_port_nb]->tx_head_size]),nb_bytes_to_transmit); | |
752 atp_no_copy_send_data(atp_gsm_sw_id,gsm_port_nb,data_buffer_p,nb_bytes_to_transmit); | |
753 nb_bytes_left -= nb_bytes_to_transmit; | |
754 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left; | |
755 } | |
756 else | |
757 { | |
758 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left; | |
759 nb_bytes_left = 0; // Flow control has been activated : wait for FLOW ON flag | |
760 } */ | |
761 | |
762 ///////// START REPLACEMENT CODE //////////////// | |
763 | |
764 | |
765 if (atp_get_buffer_from_tx_mb(atp_gsm_sw_id,gsm_port_nb,nb_bytes_to_transmit, | |
766 (void **) &data_buffer_p) == RV_OK) | |
767 { | |
768 /* Copy GSM data */ | |
769 rvf_send_trace("ATP/GSM : BT calls bti_get_gsm_data and request nb Bytes = ",59, | |
770 (UINT32) nb_bytes_to_transmit,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
771 | |
772 bti_get_gsm_data(gsm_port_nb,(char *) (data_buffer_p),nb_bytes_to_transmit); | |
773 atp_no_copy_send_data(atp_gsm_sw_id,gsm_port_nb,data_buffer_p,nb_bytes_to_transmit); | |
774 nb_bytes_left -= nb_bytes_to_transmit; | |
775 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left; | |
776 } | |
777 else | |
778 { | |
779 port_array[gsm_port_nb]->gsm_tx_data_left = nb_bytes_left; | |
780 nb_bytes_left = 0; // Flow control has been activated : wait for FLOW ON flag | |
781 } | |
782 | |
783 // for (i=0;i<nb_bytes_to_transmit;i++) | |
784 // { | |
785 // rvf_send_trace("ATP/GSM : byte received from GSM = ", | |
786 // 36, (UINT32) (data_buffer_p[i]) ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
787 // } | |
788 | |
789 } | |
790 ///////// END REPLACEMENT CODE //////////////// | |
791 | |
792 | |
793 if (port_array[gsm_port_nb]->gsm_tx_data_left == 0) | |
794 { | |
795 ATP_SEND_TRACE("ATP/GSM: BT got all the data from GSM . BT calls bti_data_ready_cnf ",RV_TRACE_LEVEL_DEBUG_LOW); | |
796 bti_data_ready_cnf(gsm_port_nb); // Acknowledge data copy to GSM | |
797 } | |
798 } | |
799 } | |
800 | |
801 | |
802 | |
803 | |
804 | |
805 | |
806 /****************************************************************************** | |
807 * Function name: bti_get_bt_data | |
808 * | |
809 * Description : This function is called by GSM to get data from BT side . | |
810 * Copy is processed by BT side | |
811 * | |
812 * Parameters : gsm_port_nb = number of the gsm port | |
813 * data_buffer = pointer on a buffer in which data can be copied | |
814 * nb_bytes_to_copy = number of bytes to copy into data_buffer | |
815 * | |
816 * Return : None | |
817 * | |
818 * | |
819 * History : 0.1 (10-Jully-2000) | |
820 * 0.2 (01-Jan-2001) | |
821 * | |
822 ******************************************************************************/ | |
823 void bti_get_bt_data (T_BTI_PORT_NB gsm_port_nb, | |
824 char * data_buffer, | |
825 unsigned long nb_bytes_to_copy) | |
826 { | |
827 UINT32 data_left,data_read; | |
828 | |
829 | |
830 rvf_send_trace("ATP/GSM : bti_get_bt_data has been called by GSM . Requested nb of data = ", | |
831 74, (UINT32) nb_bytes_to_copy ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
832 | |
833 if ( (atp_get_data(atp_gsm_sw_id,gsm_port_nb,(UINT8 *) data_buffer, | |
834 (UINT32) nb_bytes_to_copy,&data_read,&data_left) != RV_OK) || | |
835 (data_read != (UINT32) nb_bytes_to_copy)) | |
836 { | |
837 ATP_SEND_TRACE("ATP/GSM : Could not get data from BT for GSM",RV_TRACE_LEVEL_ERROR); | |
838 } | |
839 | |
840 // for (i=0;i<nb_bytes_to_copy;i++) | |
841 // { | |
842 // rvf_send_trace("ATP/GSM : byte sent to GSM = ", | |
843 // 29, (UINT32) (data_buffer[i]) ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
844 // } | |
845 | |
846 } | |
847 | |
848 | |
849 /****************************************************************************** | |
850 * Function name: bti_data_ready_res | |
851 * | |
852 * Description : This function is called by GSM to indicate that it can receive | |
853 * new data from BT PS | |
854 * | |
855 * | |
856 * Parameters : gsm_port_nb = number of the gsm port | |
857 * | |
858 * Return : None | |
859 * | |
860 * History : 0.1 (10-Jully-2000) | |
861 * 0.2 (01-Jan-2001) | |
862 * | |
863 ******************************************************************************/ | |
864 void bti_data_ready_res (T_BTI_PORT_NB gsm_port_nb) | |
865 { | |
866 UINT8 * dummy_data_buffer = NULL; | |
867 UINT32 data_left,data_read; | |
868 | |
869 rvf_send_trace("ATP/GSM : bti_data_ready_res has been called by GSM ",52, | |
870 NULL_PARAM,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
871 | |
872 rvf_send_trace("ATP/GSM : port_number = ",25, | |
873 (UINT32) gsm_port_nb,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
874 | |
875 /* Use the function atp_get_data to check if there are still data to transmit */ | |
876 if (atp_get_data(atp_gsm_sw_id,gsm_port_nb,(UINT8 *) dummy_data_buffer, | |
877 (UINT32) 0,&data_read,&data_left) != RV_OK) | |
878 { | |
879 ATP_SEND_TRACE("ATP/GSM : Could not get number of data to read from BT to GSM ",RV_TRACE_LEVEL_ERROR); | |
880 } | |
881 else | |
882 { | |
883 rvf_send_trace("ATP/GSM : data_left = ",22, | |
884 (UINT32) data_left,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
885 | |
886 | |
887 if (data_left != 0) | |
888 { | |
889 rvf_send_trace("ATP/GSM : bti_data_ready_ind has been called by BT . Nb_Bytes = ",65, | |
890 (UINT32) data_left ,RV_TRACE_LEVEL_DEBUG_LOW, ATP_USE_ID); | |
891 | |
892 bti_data_ready_ind(gsm_port_nb,(unsigned long) data_left); | |
893 } | |
894 else | |
895 { | |
896 port_array[gsm_port_nb]->atp_tx_data_activity = | |
897 ATP_NOT_ACTIVE; | |
898 ATP_SEND_TRACE("ATP/GSM : ATP is ready to send new data to GSM ." | |
899 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
900 | |
901 } | |
902 } | |
903 } | |
904 | |
905 | |
906 /****************************************************************************** | |
907 * Function name: atp_gsm_init_if | |
908 * | |
909 * Description : This function initialise the GSM/BT adaptor | |
910 * | |
911 * | |
912 * | |
913 * | |
914 * Return : RV_OK | |
915 * | |
916 * History : 0.1 (10-Jully-2000) | |
917 * | |
918 ******************************************************************************/ | |
919 T_RV_RET atp_gsm_init_if(void) | |
920 { | |
921 UINT8 i; | |
922 | |
923 open_port_pending = ATP_GSM_OPEN_PORT_NOT_PENDING; | |
924 atp_gsm_sw_id = ATP_INVALID_SWE_ID; | |
925 initiator_id = ATP_INVALID_SWE_ID; | |
926 initiator_port_nb = (T_ATP_PORT_NB) 0xFF; | |
927 current_nb_port = 0; | |
928 for (i=0;i<ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM;i++) | |
929 { | |
930 port_array[i]=NULL; | |
931 } | |
932 | |
933 return RV_OK; | |
934 } | |
935 | |
936 | |
937 | |
938 /****************************************************************************** | |
939 * Function name: bti_at_signal_change_req | |
940 * | |
941 * Description : This function is called by GSM to provide a new signal line status | |
942 * to BT | |
943 * | |
944 * | |
945 * Parameters : gsm_port_nb = number of the gsm port | |
946 * dce_signal = signal value | |
947 * ring_type_1 = voice, data or fax | |
948 * ring_type_2 = not used | |
949 * | |
950 * Return : None | |
951 * | |
952 * History : 0.1 (01-Jan-2001) | |
953 * | |
954 ******************************************************************************/ | |
955 void bti_at_signal_change_req (T_BTI_PORT_NB gsm_port_nb, | |
956 T_BTI_AT_DCE_SIGNAL dce_signal, | |
957 T_BTI_AT_RING_TYPE ring_type_1, | |
958 T_BTI_AT_RING_TYPE ring_type_2) | |
959 { | |
960 T_ATP_PORT_SIGNAL old_signal,new_signal = 0; | |
961 T_ATP_SIGNAL_CHANGE_MASK mask = 0 ; | |
962 | |
963 ATP_SEND_TRACE("ATP/GSM : bti_at_signal_change_req has been called by GSM ", | |
964 RV_TRACE_LEVEL_DEBUG_LOW); | |
965 | |
966 atp_get_signal(atp_gsm_sw_id,gsm_port_nb,&old_signal); | |
967 | |
968 if ( (dce_signal & BTI_AT_RING_MASK) == BTI_AT_RING_ON) // RING is ON | |
969 { | |
970 if ( (old_signal & ATP_RI_UNMASK) == ATP_RI_0) // RING is ON and was previously OFF | |
971 { | |
972 T_ATP_RING_TYPE atp_ring_type; | |
973 T_ATP_SW_NB sender_sw_nb; | |
974 T_ATP_PORT_STRUCT * port_p; | |
975 | |
976 switch (ring_type_1) | |
977 { | |
978 | |
979 /* Transparent data */ | |
980 case BTI_AT_RING_Async: | |
981 { | |
982 atp_ring_type = ATP_DATA_RING_TYPE; | |
983 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Transparent data) " | |
984 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
985 break; | |
986 } | |
987 | |
988 /* Non transparent data */ | |
989 case BTI_AT_RING_RelAsync: | |
990 { | |
991 atp_ring_type = ATP_DATA_RING_TYPE; | |
992 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Non-transparent data) " | |
993 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
994 break; | |
995 } | |
996 | |
997 /* Fax */ | |
998 case BTI_AT_RING_Fax: | |
999 { | |
1000 atp_ring_type = ATP_FAX_RING_TYPE; | |
1001 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Fax) " | |
1002 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1003 break; | |
1004 } | |
1005 | |
1006 /* Voice */ | |
1007 case BTI_AT_RING_Voice: | |
1008 { | |
1009 atp_ring_type = ATP_VOICE_RING_TYPE; | |
1010 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Voice) " | |
1011 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1012 break; | |
1013 } | |
1014 | |
1015 /* Not used */ | |
1016 default: | |
1017 { | |
1018 atp_ring_type = ATP_NO_RING_TYPE; | |
1019 ATP_SEND_TRACE("ATP/GSM : RING_OFF -> RING_ON (Meaningless) " | |
1020 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1021 break; | |
1022 } | |
1023 } // End of switch | |
1024 | |
1025 /* Get the pointer on the port structure */ | |
1026 if(atp_get_port(atp_gsm_sw_id,gsm_port_nb,&port_p,&sender_sw_nb) != RV_OK) | |
1027 { | |
1028 atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_SIGNAL,ATP_PARAM_ERROR,NULL); | |
1029 return; /* This port does not exist */ | |
1030 } | |
1031 if (atp_ring_type & port_p->port_info[(~sender_sw_nb)].ring_type) | |
1032 { | |
1033 new_signal |= ATP_RI_1; | |
1034 mask |= ATP_RI_UNMASK; | |
1035 } | |
1036 } | |
1037 } | |
1038 else | |
1039 { | |
1040 if ( (old_signal & ATP_RI_UNMASK) == ATP_RI_1) // RING is OFF and was previously ON | |
1041 { | |
1042 T_ATP_RING_TYPE atp_ring_type; | |
1043 T_ATP_SW_NB sender_sw_nb; | |
1044 T_ATP_PORT_STRUCT * port_p; | |
1045 | |
1046 switch (ring_type_1) | |
1047 { | |
1048 /* Transparent data */ | |
1049 case BTI_AT_RING_Async: | |
1050 { | |
1051 atp_ring_type = ATP_DATA_RING_TYPE; | |
1052 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Transparent data) " | |
1053 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1054 break; | |
1055 } | |
1056 | |
1057 /* Non transparent data */ | |
1058 case BTI_AT_RING_RelAsync: | |
1059 { | |
1060 atp_ring_type = ATP_DATA_RING_TYPE; | |
1061 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Non-transparent data) " | |
1062 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1063 break; | |
1064 } | |
1065 | |
1066 /* Fax */ | |
1067 case BTI_AT_RING_Fax: | |
1068 { | |
1069 atp_ring_type = ATP_FAX_RING_TYPE; | |
1070 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Fax) " | |
1071 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1072 break; | |
1073 } | |
1074 | |
1075 /* Voice */ | |
1076 case BTI_AT_RING_Voice: | |
1077 { | |
1078 atp_ring_type = ATP_VOICE_RING_TYPE; | |
1079 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Voice) " | |
1080 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1081 break; | |
1082 } | |
1083 | |
1084 /* Not used */ | |
1085 default: | |
1086 { | |
1087 atp_ring_type = ATP_NO_RING_TYPE; | |
1088 ATP_SEND_TRACE("ATP/GSM : RING_ON -> RING_OFF (Meaningless) " | |
1089 ,RV_TRACE_LEVEL_DEBUG_LOW); | |
1090 break; | |
1091 } | |
1092 } // End of switch | |
1093 | |
1094 | |
1095 /* Get the pointer on the port structure */ | |
1096 if(atp_get_port(atp_gsm_sw_id,gsm_port_nb,&port_p,&sender_sw_nb) != RV_OK) | |
1097 { | |
1098 atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_SIGNAL,ATP_PARAM_ERROR,NULL); | |
1099 return; /* This port does not exist */ | |
1100 } | |
1101 | |
1102 if (atp_ring_type & port_p->port_info[(~sender_sw_nb)].ring_type) | |
1103 { | |
1104 new_signal |= ATP_RI_0; | |
1105 mask |= ATP_RI_UNMASK; | |
1106 } | |
1107 | |
1108 | |
1109 } | |
1110 } | |
1111 | |
1112 if ( (dce_signal & BTI_AT_DCD_MASK) == BTI_AT_DCD_ON) // DCD is ON | |
1113 { | |
1114 if ( (old_signal & ATP_DCD_UNMASK) == ATP_DCD_0) // DCD is ON and was previously OFF | |
1115 { | |
1116 new_signal |= ATP_DCD_1; | |
1117 mask |= ATP_DCD_UNMASK; | |
1118 ATP_SEND_TRACE("ATP/GSM : DCD_OFF -> DCD_ON ", | |
1119 RV_TRACE_LEVEL_DEBUG_LOW); | |
1120 } | |
1121 } | |
1122 else | |
1123 { | |
1124 if ( (old_signal & ATP_DCD_UNMASK) == ATP_DCD_1) // DCD is OFF and was previously ON | |
1125 { | |
1126 new_signal |= ATP_DCD_0; | |
1127 mask |= ATP_DCD_UNMASK; | |
1128 ATP_SEND_TRACE("ATP/GSM : DCD_ON -> DCD_OFF ", | |
1129 RV_TRACE_LEVEL_DEBUG_LOW); | |
1130 } | |
1131 } | |
1132 if (mask != 0x00) | |
1133 { | |
1134 atp_set_signal(atp_gsm_sw_id,gsm_port_nb,new_signal,mask); | |
1135 } | |
1136 } | |
1137 | |
1138 | |
1139 | |
1140 /****************************************************************************** | |
1141 * Function name: atp_gsm_init_port | |
1142 * | |
1143 * Description : This function initialise the variable related to a port | |
1144 * | |
1145 * | |
1146 * | |
1147 * | |
1148 * Return : RV_OK | |
1149 * | |
1150 * History : 0.1 (10-Jully-2000) | |
1151 * | |
1152 ******************************************************************************/ | |
1153 T_RV_RET atp_gsm_init_port(T_ATP_GSM_PORT_STRUCT * port_p) | |
1154 { | |
1155 port_p->cmd_status = CMD_NOT_PENDING; | |
1156 port_p->gsm_tx_data_left = 0; | |
1157 port_p->atp_tx_data_activity = ATP_NOT_ACTIVE; | |
1158 port_p->bt_max_payload = temp_bt_max_payload; | |
1159 return RV_OK; | |
1160 } | |
1161 | |
1162 | |
1163 /****************************************************************************** | |
1164 * Function name: atp_gsm_get_new_port_nb | |
1165 * | |
1166 * Description : Provide a new available port number if possible. Otherwise, return | |
1167 * error | |
1168 * | |
1169 * | |
1170 * | |
1171 * Return : RV_OK | |
1172 * | |
1173 * History : 0.1 (10-Jully-2000) | |
1174 * | |
1175 ******************************************************************************/ | |
1176 T_RV_RET atp_gsm_get_new_port_nb(UINT8 * port_nb) | |
1177 { | |
1178 UINT8 i; | |
1179 | |
1180 for(i=0;i<ATP_MAX_NB_OF_PORT_SUPPORTED_BY_GSM;i++) | |
1181 { | |
1182 if (port_array[i] == NULL) | |
1183 { | |
1184 *port_nb = i; | |
1185 return RV_OK; | |
1186 } | |
1187 } | |
1188 *port_nb = 0xFF; | |
1189 return RV_NOT_SUPPORTED; | |
1190 } |