comparison src/cs/services/atp/atp_cmd.c @ 0:b6a5e36de839

src/cs: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:39:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:b6a5e36de839
1 /********************************************************************************
2 *
3 * File Name : atp_cmd.c
4 *
5 * Functions handling the command translation between txt and command
6 * (and vice-versa)
7 *
8 * (C) Texas Instruments, all rights reserved
9 *
10 * Version number : 0.1 - 03-03-2000
11 *
12 * History : 0.1 - Created by E. Baissus
13 * 0.2 - Reviewed : More generic AT commands handling and
14 * copy optimization (especially on L2CAP
15 * buffers)
16 * 0.3 - '+CME ERROR' and '+CMS ERROR' support
17 *
18 * Author : Eric Baissus : e-baissus@ti.com
19 *
20 * (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved
21 *
22 ********************************************************************************/
23 #include "rv/rv_general.h"
24 #include "rvf/rvf_api.h"
25 #include "atp/atp_api.h"
26 #include "atp/atp_i.h"
27 #include "atp/atp_config.h"
28 #include "atp/atp_cmd.h"
29 #include "rvm/rvm_use_id_list.h"
30 #include <string.h>
31
32 #ifdef BLUETOOTH
33 #include "l2cap_data_hdlr.h" /* For L2CAP data handling. */
34 #endif
35
36 /********************************************************************************
37 * Function name : dtoa
38 *
39 * Description : Convert the digits of the given decimal value to a character
40 * string
41 *
42 * Parameters : decimal = decimal value to be converted
43 * ascii_p = string result
44 *
45 * Return : Digit number
46 *
47 * Note : digit and remainder declared as volatile to avoid bugs due to
48 * optimization.
49 *
50 * History : 0.1 (25-August-2000) - Created
51 *
52 *********************************************************************************/
53 UINT8 dtoa (UINT16 decimal,
54 T_ATP_TXT_CMD ascii_p)
55 {
56 /* Declare local variables. */
57 T_ATP_TXT_CMD str_p = ascii_p;
58 volatile UINT8 digit = 0x00;
59 volatile UINT16 remainder = decimal;
60
61 /***************************** dtoa function begins *****************************/
62
63 /* Check to see if the string result is non-null. */
64 if (str_p == NULL)
65 {
66 return (0x00);
67 }
68
69 /* Convert the fifth digit: remainder = [65535,9999[. */
70 for (digit = 0x00;
71 remainder > 9999;
72 remainder -= 10000,
73 digit++)
74 {
75 }
76 if (digit > 0x00)
77 {
78 *str_p++ = (INT8) ('0' + digit);
79 }
80
81 /* Convert the fourth digit: remainder = [9xxx,999[. */
82 for (digit = 0x00;
83 remainder > 999;
84 remainder -= 1000,
85 digit++)
86 {
87 }
88 if ((digit > 0x00) || (str_p != ascii_p))
89 {
90 *str_p++ = (INT8) ('0' + digit);
91 }
92
93 /* Convert the third digit: remainder = [9xx,99[. */
94 for (digit = 0x00;
95 remainder > 99;
96 remainder -= 100,
97 digit++)
98 {
99 }
100 if ((digit > 0x00) || (str_p != ascii_p))
101 {
102 *str_p++ = (INT8) ('0' + digit);
103 }
104
105 /* Convert the second digit: remainder = [9x,9[. */
106 for (digit = 0x00;
107 remainder > 9;
108 remainder -= 10,
109 digit++)
110 {
111 }
112 if ((digit > 0x00) || (str_p != ascii_p))
113 {
114 *str_p++ = (INT8) ('0' + digit);
115 }
116
117 /* Convert the last digit: remainder = [9,0]. */
118 *str_p++ = (INT8) ('0' + remainder);
119
120 /* Return the length of the string. */
121 return ((UINT8) (str_p - ascii_p));
122
123 } /**************************** End of dtoa function ****************************/
124
125
126 /********************************************************************************
127 * Function name : atp_cmd_init_dce_info
128 *
129 * Description : Initialize the whole of the information stored in the 'DCE
130 * information' structure
131 *
132 * Parameter : dce_info_p = pointer on the DCE information
133 *
134 * Return : RV_OK
135 *
136 * History : 0.1 (28-August-2000) - Created
137 *
138 *********************************************************************************/
139 T_ATP_RET atp_cmd_init_dce_info (T_ATP_DCE_INFO *dce_info_p)
140 {
141 /* Declare a local variable. */
142 UINT8 count = 0;
143
144 /********************* atp_cmd_init_dce_info function begins ********************/
145
146 rvf_send_trace ("ATP : DCE information initialized ",
147 34,
148 NULL_PARAM,
149 RV_TRACE_LEVEL_DEBUG_LOW,
150 ATP_USE_ID);
151
152 /* Define the default command line termination character (See ITU-T */
153 /* Recommendation V.250 ter page 21). */
154 dce_info_p->cr_character = ATP_CR_CHARACTER;
155
156 /* Define the default response formatting character (See ITU-T */
157 /* Recommendation V.250 ter page 22). */
158 dce_info_p->lf_character = ATP_LF_CHARACTER;
159
160 /* Define the default command line editing character (See ITU-T */
161 /* Recommendation V.250 ter page 22). */
162 dce_info_p->bs_character = ATP_BS_CHARACTER;
163
164 /* Define the escape sequence (See ITU-T Recommendation V.250 ter page 24). */
165 memcpy ((void *) (dce_info_p->escape_sequence),
166 ATP_ESCAPE_SEQUENCE,
167 MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE);
168
169 /* Define the command echo (See ITU-T Recommendation V.250 ter page 23). */
170 dce_info_p->echo_mode = ECHO_OFF;
171
172 /* Define the result code suppression (See ITU-T Recommendation V.250 ter */
173 /* page 23). */
174 dce_info_p->result_code_mode = RESULT_CODE_ON;
175
176 /* Define the DCE response format (See ITU-T Recommendation V.250 ter page */
177 /* 24). */
178 dce_info_p->verbose_mode = ATP_VERBOSE_1;
179
180 /* Initialize the masks associated with the commands executed by the ATP. */
181 memset ((void *) (dce_info_p->dce_mask),
182 0x00,
183 sizeof (T_ATP_DCE_MASK));
184
185 /* Initialize pointers on temporary buffers containing the escape sequence. */
186 for (count = 0;
187 count < MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE;
188 count++)
189 {
190
191 /* Initialize the pointer on a temporary data buffer containing part of */
192 /* the assumed escape sequence. */
193 dce_info_p->escape_sequence_tmp_buffer_p[count] = NULL;
194
195 /* Initialize the number of data included in buffer hereinabove. */
196 dce_info_p->length_of_escape_sequence_tmp_buffer_p[count] = 0;
197 }
198 dce_info_p->nb_plus_received = 0;
199 return (RV_OK);
200
201 } /******************** End of atp_cmd_init_dce_info function *******************/
202
203
204 /********************************************************************************
205 * Function name : atp_get_custom_info_from_txt
206 *
207 * Description : Etract custom information from a text string
208 *
209 * Parameters : text_pp = string containing the command (0-terminated)
210 * cmd_format = related structure
211 * mb_id = memory bank used to get the custom command information
212 * buffer
213 * termination_char = termination character ('\x00' or <CR>)
214 *
215 * Return : cmd_info_pp and RV_OK if the command is found,
216 * RV_NOT_SUPPORTED
217 *
218 * Note : Space characters are ignored and may be used freely for formatting
219 * purposes, unless they are embedded in numeric or string constants
220 * (See ITU-T Recommendation V.250 ter sections 5.4.2.1 or 5.4.2.2 on
221 * pages 6 and 7). The DCE shall be capable of accepting at least 40
222 * characters in the body.
223 *
224 * History : 0.1 (29-August-2000) - Created
225 *
226 *********************************************************************************/
227 T_ATP_RET atp_get_custom_info_from_txt (T_ATP_TXT_CMD *text_pp,
228 T_ATP_CMD_FORMAT cmd_format,
229 T_RVF_MB_ID mb_id,
230 T_ATP_CMD **cmd_info_pp,
231 const char termination_char)
232 {
233
234 /***************** atp_get_custom_info_from_txt function begins *****************/
235
236 switch (cmd_format)
237 {
238
239 /* Basic syntax command does not expect any <number>. */
240 case ATP_NO_PARAM:
241 {
242 *cmd_info_pp = NULL;
243 return (RV_OK);
244 }
245
246 /* Basic syntax command. */
247 case ATP_BASIC_PARAM:
248 {
249
250 /* Allocate memory in order to store the <number> associated */
251 /* with basic syntax commands. If insufficient resources */
252 /* available, then report an internal memory error and abort. */
253 if (rvf_get_buf (mb_id, \
254 sizeof (T_ATP_BASIC_CMD), \
255 (void **) cmd_info_pp) == RVF_RED)
256 {
257 atp_error (ATP_ERROR_TX_MB_RED);
258 return (RV_MEMORY_ERR);
259 }
260
261 /* Get the <number> of the basic syntax command (See ITU-T */
262 /* Recommendation V.250 ter page 5). */
263 memset ((void *) (*cmd_info_pp),
264 0x00,
265 sizeof (T_ATP_BASIC_CMD));
266 ATP_GET_NUMBER (*text_pp,
267 &((*((T_ATP_BASIC_CMD **) cmd_info_pp))->number),
268 '0');
269 return (RV_OK);
270 }
271
272 /* Dial. */
273 case ATP_DIAL_PARAM:
274 {
275
276 /* Allocate memory in order to store the <dial_string> */
277 /* associated with the dial. If insufficient resources */
278 /* available, then report an internal memory error and abort. */
279 if (rvf_get_buf (mb_id, \
280 sizeof (T_ATP_DIAL), \
281 (void **) cmd_info_pp) == RVF_RED)
282 {
283 atp_error (ATP_ERROR_TX_MB_RED);
284 return (RV_MEMORY_ERR);
285 }
286
287 /* Get the <dial_string> of the dial (See ITU-T Recommendation */
288 /* V.250 ter page 31). All characters appearing on the same */
289 /* command line after D are considered part of the call */
290 /* addressing information to be signalled to the network, or */
291 /* modifiers used to control the signalling process, up to a */
292 /* semicolon character or the end of the command line. If the */
293 /* <dial_string> is terminated by a semicolon, the DCE does not */
294 /* start the call origination procedure, but instead returns to */
295 /* command state after completion of the signalling of call */
296 /* addressing information to the network. */
297 memset ((void *) (*cmd_info_pp),
298 0x00,
299 sizeof (T_ATP_DIAL));
300 ATP_GET_DIAL_STRING (*text_pp,
301 (*((T_ATP_DIAL **) cmd_info_pp))->dial_string_p,
302 &((*((T_ATP_DIAL **) cmd_info_pp))->dial_string_length),
303 &((*((T_ATP_DIAL **) cmd_info_pp))->call_type),
304 termination_char);
305 return (RV_OK);
306 }
307
308 /* S-parameter. */
309 case ATP_S_PARAM:
310 {
311
312 /* Allocate memory in order to store the <value> associated */
313 /* with S-parameters. If insufficient resources available, then */
314 /* report an internal memory error and abort. */
315 if (rvf_get_buf (mb_id, \
316 sizeof (T_ATP_S_PARAM), \
317 (void **) cmd_info_pp) == RVF_RED)
318 {
319 atp_error (ATP_ERROR_TX_MB_RED);
320 return (RV_MEMORY_ERR);
321 }
322
323 /* Get the characters that immediately follow */
324 /* <parameter_number>. "=" is used to set the indicated */
325 /* S-parameter to a new value (See ITU-T Recommendation V.250 */
326 /* ter page 5). Note that if no value is given, the S-parameter */
327 /* specified may be set to 0, or an ERROR result code issued */
328 /* and the stored value left unchanged. "?" is used to read the */
329 /* current value of the indicated S-parameter (See ITU-T */
330 /* Recommendation V.250 ter page 5). */
331 memset ((void *) (*cmd_info_pp),
332 0x00,
333 sizeof (T_ATP_S_PARAM));
334 ATP_GET_PARAMETER_VALUE (*text_pp,
335 &((*((T_ATP_S_PARAM **) cmd_info_pp))->s_operator),
336 &((*((T_ATP_S_PARAM **) cmd_info_pp))->value));
337 return (RV_OK);
338 }
339
340 /* Extended syntax command does not expect any <value>. */
341 case ATP_NO_EXTENDED_PARAM:
342 {
343
344 /* Allocate memory in order to store the <value> associated */
345 /* with extended syntax commands. If insufficient resources */
346 /* available, then report an internal memory error and abort. */
347 if (rvf_get_buf (mb_id, \
348 sizeof (T_ATP_NO_SUBPARAMETER), \
349 (void **) cmd_info_pp) == RVF_RED)
350 {
351 atp_error (ATP_ERROR_TX_MB_RED);
352 return (RV_MEMORY_ERR);
353 }
354
355 /* Get the characters that immediately follow <name>. "=?" is */
356 /* used to test whether the extended syntax command is */
357 /* implemented in the DCE (See ITU-T Recommendation V.250 ter */
358 /* page 9). */
359 memset ((void *) (*cmd_info_pp),
360 0x00,
361 sizeof (T_ATP_NO_SUBPARAMETER));
362 ATP_GET_OPERATOR (*text_pp,
363 &((*((T_ATP_NO_SUBPARAMETER **) cmd_info_pp))->extended_operator));
364 return (RV_OK);
365 }
366
367 /* Extended syntax command whose subparameter is a numeric constant. */
368 case ATP_SINGLE_EXTENDED_PARAM:
369 {
370
371 /* Allocate memory in order to store the <value> associated */
372 /* with extended syntax commands. If insufficient resources */
373 /* available, then report an internal memory error and abort. */
374 if (rvf_get_buf (mb_id, \
375 sizeof (T_ATP_SINGLE_SUBPARAMETER), \
376 (void **) cmd_info_pp) == RVF_RED)
377 {
378 atp_error (ATP_ERROR_TX_MB_RED);
379 return (RV_MEMORY_ERR);
380 }
381
382 /* Get the characters that immediately follow <name>. "=" is */
383 /* used to set the indicated extended syntax command to a new */
384 /* value (See ITU-T Recommendation V.250 ter page 8). Note that */
385 /* if no value is given, the extended syntax command specified */
386 /* may be set to 0. "?" is used to read the current value of */
387 /* the indicated extended syntax command (See ITU-T */
388 /* Recommendation V.250 ter page 9). "=?" is used to test */
389 /* whether the extended syntax command is implemented in the */
390 /* DCE. */
391 memset ((void *) (*cmd_info_pp),
392 0x00,
393 sizeof (T_ATP_SINGLE_SUBPARAMETER));
394 ATP_GET_VALUE (*text_pp,
395 &((*((T_ATP_SINGLE_SUBPARAMETER **) cmd_info_pp))->extended_operator),
396 &((*((T_ATP_SINGLE_SUBPARAMETER **) cmd_info_pp))->value),
397 termination_char);
398 return (RV_OK);
399 }
400
401 /* Keypad control command. */
402 case ATP_PLUS_CKPD_PARAM:
403 {
404
405 /* Allocate memory in order to store the <keys>,<time> and */
406 /* <pause> associated with +CKPD extended syntax command. If */
407 /* insufficient resources available, then report an internal */
408 /* memory error and abort. */
409 if (rvf_get_buf (mb_id, \
410 sizeof (T_ATP_PLUS_CKPD), \
411 (void **) cmd_info_pp) == RVF_RED)
412 {
413 atp_error (ATP_ERROR_TX_MB_RED);
414 return (RV_MEMORY_ERR);
415 }
416
417 /* Get the <keys>,<time> and <pause> of the keypad control */
418 /* command. Note that <keys> shall consist of a string constant */
419 /* and <time> and <pause> shall consist of numeric constants in */
420 /* tenths of a second (See ETS 300 916 (GSM 07.07) Version */
421 /* 5.8.1 page 62). "=?" is used to test whether the extended */
422 /* syntax command is implemented in the DCE. */
423 memset ((void *) (*cmd_info_pp),
424 0x00,
425 sizeof (T_ATP_PLUS_CKPD));
426 ATP_GET_CKPD_PARAM (*text_pp,
427 (*((T_ATP_PLUS_CKPD **) cmd_info_pp)),
428 termination_char);
429 return (RV_OK);
430 }
431
432 /* AT command undefined or not supported for now. */
433 default:
434 {
435 break;
436 }
437 }
438 return (RV_NOT_SUPPORTED);
439
440 } /**************** End of atp_get_custom_info_from_txt function ****************/
441
442
443 /********************************************************************************
444 * Function name : atp_translate_raw_data_to_cmd
445 *
446 * Description : Translate raw data into an interpreted command
447 *
448 * Parameters : dce_info_p = pointer on the port structure
449 * text_p = raw data containing the command (0-terminated)
450 * cmd_type = command type of the text
451 * cmd_type_p = type of the interpreted command
452 * cmd_nb_p = binary related code of the interpreted command
453 * skip_prefix = indicate whether the prefix shall be skipped in
454 * order to proceed the translation
455 * mb_id = memory bank used to get the custom command information
456 * buffer
457 * cmd_info_pp = pointer on the custom command information structure
458 *
459 * Return : RV_OK,
460 * RV_NOT_SUPPORTED if the command is not recognized,
461 * RV_INVALID_PARAMETER
462 *
463 * Note : A command line is made up of three elements: the prefix, the body,
464 * and the termination character. The command line prefix consists of
465 * the characters "AT" or "at", or, to repeat the execution of the
466 * previous command line, the characters "A/" or "a/". The body is
467 * made up of individual commands. Space characters are ignored and
468 * may be used freely for formatting purposes, unless they are embedded
469 * in numeric or string constants (See ITU-T Recommendation V.250 ter
470 * sections 5.4.2.1 or 5.4.2.2 on pages 6 and 7). The termination
471 * character may not appear in the body. The DCE shall be capable of
472 * accepting at least 40 characters in the body. Note that the
473 * termination character may be selected by a user option (parameter
474 * S3), the default being CR.
475 *
476 * History : 0.1 (25-August-2000) - Created
477 *
478 *********************************************************************************/
479 T_ATP_RET atp_translate_raw_data_to_cmd (T_ATP_PORT_STRUCT *port_p,
480 T_ATP_TXT_CMD *text_pp,
481 T_ATP_CMD_TYPE cmd_type,
482 T_ATP_CMD_TYPE *cmd_type_p,
483 T_ATP_CMD_NB *cmd_nb_p,
484 T_RVF_MB_ID mb_id,
485 T_ATP_CMD **cmd_info_pp)
486 {
487 /* Declare a local variable. */
488 BOOLEAN equal = FALSE;
489
490 /***************** atp_translate_raw_data_to_cmd function begins ****************/
491
492 /* Check to see if the text command line is valid. */
493 if ((text_pp == NULL) || (*text_pp == NULL))
494 {
495 return (RV_INVALID_PARAMETER);
496 }
497
498 /* Initialize information for AT commands do not expect any number or */
499 /* value. */
500 *cmd_info_pp = NULL;
501
502 /* DTE command lines (See ITU-T Recommendation V.250 ter page 4). By the */
503 /* way, note that the prefix consists of the characters "AT" or "at". */
504 if ((cmd_type == UNKNOWN) || (cmd_type == AT_CMD))
505 {
506
507 /* Declare a local block variable. */
508 UINT8 prefix_len = 0x00;
509
510 /* Check to see whether the prefix shall be skipped in order to proceed */
511 /* the translation. */
512 if ((port_p == NULL) || ((port_p->cmd_info).status == NOT_STARTED))
513 {
514 prefix_len = ATP_AT_PREFIX_LEN;
515 }
516
517 /* If the prefix is either "AT" or "at", then the DCE shall proceed the */
518 /* command line body (See ITU-T Recommendation V.250 ter page 4). */
519 ATP_MEM_I_CMP (ATP_AT_PREFIX,
520 *text_pp,
521 prefix_len,
522 &equal);
523 if (equal == TRUE)
524 {
525
526 /* Declare local block variables. */
527 const char *cmd_p = NULL;
528 UINT8 cmd_len = 0x00;
529
530 for (*cmd_nb_p = 0x00, \
531 *cmd_type_p = AT_CMD, \
532 equal = FALSE, \
533 *text_pp += prefix_len;
534 *cmd_nb_p < ATP_MAX_NB_OF_AT_COMMANDS;
535 (*cmd_nb_p)++)
536 {
537
538 /* If needed, skip this empty entry. */
539 if (ATP_AT_INFO[*cmd_nb_p][ATP_AT_PARAM_COLUMN] == ATP_CMD_NOT_DEFINED)
540 {
541 continue;
542 }
543
544 /* Get the length of the remainder. */
545 cmd_len = (UINT8) (ATP_AT_INFO[*cmd_nb_p + 0x01][ATP_AT_OFFSET_COLUMN] - ATP_AT_INFO[*cmd_nb_p][ATP_AT_OFFSET_COLUMN]);
546 cmd_p = &(ATP_AT_TXT_TABLE[ATP_AT_INFO[*cmd_nb_p][ATP_AT_OFFSET_COLUMN]]);
547 ATP_MEM_SP_I_CMP (cmd_p,
548 *text_pp,
549 &cmd_len,
550 &equal);
551
552 /* If both AT commands match, then get the custom information. */
553 if (equal == TRUE)
554 {
555 rvf_send_trace ("ATP : Translate an AT command from text to command ",
556 51,
557 NULL_PARAM,
558 RV_TRACE_LEVEL_DEBUG_LOW,
559 ATP_USE_ID);
560 *text_pp += cmd_len;
561 (void) atp_get_custom_info_from_txt (text_pp,
562 ATP_AT_INFO[*cmd_nb_p][ATP_AT_PARAM_COLUMN],
563 mb_id,
564 cmd_info_pp,
565 (const char) ((port_p == NULL) ? ('\x00') : ((port_p->dce_info_p)->cr_character)));
566 return (RV_OK);
567 }
568 }
569 return (RV_NOT_SUPPORTED);
570 }
571 }
572
573 /* DCE responses (See ITU-T Recommendation V.250 ter page 10). */
574 if ((cmd_type == UNKNOWN) || (cmd_type == RESULT_CODE) || \
575 (cmd_type == UNSOLICITED_RESULT))
576 {
577
578 /* Declare local block variables. */
579 const char *result_code_p = NULL;
580 UINT8 header_len = 0x00;
581 UINT8 result_code_len = 0x00;
582
583 /* If verbose responses are enabled, check to see whether leading <CR> */
584 /* and <LF> characters shall be skipped in order to proceed the */
585 /* translation. */
586 if ((port_p != NULL) && ((port_p->dce_info_p)->verbose_mode == ATP_VERBOSE_1))
587 {
588 equal = TRUE;
589 equal &= ((*text_pp)[0x00] == (port_p->dce_info_p)->cr_character);
590 equal &= ((*text_pp)[0x01] == (port_p->dce_info_p)->lf_character);
591
592 /* If leading characters do not match <CR><LF> headers of */
593 /* information responses, then abort (See ETS 300 916 (GSM 07.07) */
594 /* Version 4.1 page 13). */
595 if (equal == FALSE)
596 {
597 *cmd_type_p = UNKNOWN;
598 return (RV_NOT_SUPPORTED);
599 }
600 header_len = ATP_RESULT_CODE_HEADER_LEN;
601 }
602 for (*cmd_nb_p = 0x00, \
603 *cmd_type_p = RESULT_CODE, \
604 *text_pp += header_len;
605 *cmd_nb_p < ATP_MAX_NB_OF_RESULT_CODES;
606 (*cmd_nb_p)++)
607 {
608
609 /* If needed, skip this empty entry. */
610 if (ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_PARAM_COLUMN] == ATP_RESULT_CODE_NOT_DEFINED)
611 {
612 continue;
613 }
614
615 /* If verbose responses are disabled, then get the length of the */
616 /* result code from the dedicated list. */
617 if ((port_p != NULL) && ((port_p->dce_info_p)->verbose_mode == ATP_VERBOSE_0))
618 {
619 result_code_len = (UINT8) (ATP_RESULT_CODE_INFO[*cmd_nb_p + 0x01][ATP_RESULT_OFFSET_V0_COLUMN] - ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_OFFSET_V0_COLUMN]);
620 result_code_p = &(ATP_RESULT_CODE_TXT_TABLE_V0[ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_OFFSET_V0_COLUMN]]);
621 }
622 else
623 {
624 result_code_len = (UINT8) (ATP_RESULT_CODE_INFO[*cmd_nb_p + 0x01][ATP_RESULT_OFFSET_V1_COLUMN] - ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_OFFSET_V1_COLUMN]);
625 result_code_p = &(ATP_RESULT_CODE_TXT_TABLE_V1[ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_OFFSET_V1_COLUMN]]);
626 }
627 ATP_MEM_I_CMP (result_code_p,
628 *text_pp,
629 result_code_len,
630 &equal);
631 if (equal == FALSE)
632 {
633 continue;
634 }
635 rvf_send_trace ("ATP : Translate a result from text to command ",
636 46,
637 NULL_PARAM,
638 RV_TRACE_LEVEL_DEBUG_LOW,
639 ATP_USE_ID);
640 *text_pp += result_code_len;
641 switch (ATP_RESULT_CODE_INFO[*cmd_nb_p][ATP_RESULT_PARAM_COLUMN])
642 {
643
644 /* Extended syntax result code. */
645 case ATP_EXTENDED_RESULT_CODE:
646 {
647
648 /* Allocate memory in order to store the <value> */
649 /* associated with extended syntax result codes. If */
650 /* insufficient resources available, then report an */
651 /* internal memory error and abort. */
652 if (rvf_get_buf (mb_id, \
653 sizeof (T_ATP_SINGLE_RESULT_CODE_VALUE), \
654 (void **) cmd_info_pp) == RVF_RED)
655 {
656 atp_error (ATP_ERROR_TX_MB_RED);
657 return (RV_MEMORY_ERR);
658 }
659
660 /* Get the value associated with the extended result */
661 /* codes (See Headset Specification, Section 4.7.3). */
662 memset ((void *) (*cmd_info_pp),
663 0x00,
664 sizeof (T_ATP_SINGLE_RESULT_CODE_VALUE));
665 ATP_GET_RESULT_CODE_VALUE (*text_pp,
666 &((*((T_ATP_SINGLE_RESULT_CODE_VALUE **) cmd_info_pp))->value));
667 break;
668 }
669
670 /* +CME ERROR: <error> and +CMS ERROR: <error> result codes. */
671 case ATP_PLUS_ERROR_RESULT_CODE:
672 {
673
674 /* Allocate memory in order to store the <error> */
675 /* associated with +CME ERROR or +CMS ERROR result */
676 /* codes. If insufficient resources available, then */
677 /* report an internal memory error and abort. */
678 if (rvf_get_buf (mb_id, \
679 sizeof (T_ATP_PLUS_ERROR_RESULT_CODE), \
680 (void **) cmd_info_pp) == RVF_RED)
681 {
682 atp_error (ATP_ERROR_TX_MB_RED);
683 return (RV_MEMORY_ERR);
684 }
685
686 /* Get the <error> associated with the +CME ERROR or */
687 /* +CMS ERROR result codes. */
688 memset ((void *) (*cmd_info_pp),
689 0x00,
690 sizeof (T_ATP_PLUS_ERROR_RESULT_CODE));
691 ATP_PLUS_ERROR_STRING (*text_pp,
692 ((T_ATP_PLUS_ERROR_RESULT_CODE *) (*cmd_info_pp))->error_p,
693 &(((T_ATP_PLUS_ERROR_RESULT_CODE *) (*cmd_info_pp))->error_length),
694 '\x00');
695 break;
696 }
697 default:
698 {
699
700 /* Check to see if any text is associated with the */
701 /* CONNECT result code. */
702 if (*cmd_nb_p == ATP_CONNECT_NB)
703 {
704
705 /* Declare a local block variable. */
706 UINT16 connect_text = 0x0000;
707
708 /* Get the <text> associated with the CONNECT */
709 /* result codes (See ITU-T Recommendation V.250 ter */
710 /* page 11). */
711 ATP_GET_CONNECT_TXT (*text_pp,
712 &connect_text);
713
714 /* If no <text> is associated with the CONNECT */
715 /* result code, then abort. */
716 if (connect_text == 0x0000)
717 {
718 break;
719 }
720
721 /* Otherwise, allocate memory in order to store the */
722 /* <text> associated with the CONNECT result code. */
723 /* If insufficient resources available, then report */
724 /* an internal memory error and abort. */
725 if (rvf_get_buf (mb_id, \
726 sizeof (T_ATP_CONNECT_TXT_PARAM), \
727 (void **) cmd_info_pp) == RVF_RED)
728 {
729 atp_error (ATP_ERROR_TX_MB_RED);
730 return (RV_MEMORY_ERR);
731 }
732
733 /* Return the <text> associated with the CONNECT */
734 /* result code. */
735 (*((T_ATP_CONNECT_TXT_PARAM **) cmd_info_pp))->value = connect_text;
736 *cmd_nb_p = ATP_CONNECT_TXT_NB;
737 }
738 break;
739 }
740 }
741 return (RV_OK);
742 }
743 }
744 *cmd_type_p = UNKNOWN;
745 return (RV_NOT_SUPPORTED);
746
747 } /**************** End of atp_translate_raw_data_to_cmd function ***************/
748
749
750 /********************************************************************************
751 * Function name : atp_translate_txt_to_cmd
752 *
753 * Description : Translate a text string into an interpreted command
754 *
755 * Parameters : text_p = text string containing the command (0-terminated)
756 * cmd_type = command type of the text
757 * cmd_type_p = type of the interpreted command
758 * cmd_nb_p = binary related code of the interpreted command
759 * mb_id = memory bank used to get the custom command information
760 * buffer
761 * cmd_info_pp = pointer on the custom command information structure
762 *
763 * Return : RV_OK,
764 * RV_NOT_SUPPORTED if the command is not recognized,
765 * RV_INVALID_PARAMETER
766 *
767 * History : 0.1 (25-August-2000) - Created
768 *
769 *********************************************************************************/
770 T_ATP_RET atp_translate_txt_to_cmd (T_ATP_TXT_CMD text_p,
771 T_ATP_CMD_TYPE cmd_type,
772 T_ATP_CMD_TYPE *cmd_type_p,
773 T_ATP_CMD_NB *cmd_nb_p,
774 T_RVF_MB_ID mb_id,
775 T_ATP_CMD **cmd_info_pp)
776 {
777 /* Declare a local variable. */
778 T_ATP_RET ret_status = RV_OK;
779
780 /******************* atp_translate_txt_to_cmd function begins *******************/
781
782 ret_status = atp_translate_raw_data_to_cmd (NULL,
783 &text_p,
784 cmd_type,
785 cmd_type_p,
786 cmd_nb_p,
787 mb_id,
788 cmd_info_pp);
789 return (ret_status);
790
791 } /****************** End of atp_translate_txt_to_cmd function ******************/
792
793
794 /********************************************************************************
795 * Function name : atp_interpret_raw_data
796 *
797 * Description : Fetch and interpret (if applicable and DCE mode) a new command
798 * from the raw data buffer stored available in port_structure
799 *
800 * Parameters : port_p = pointer on the port structure
801 * mb_id = memory bank which the text buffer should be counted on
802 * cmd_type_p = found command type (if UNKNOWN, should check text
803 * field)
804 * cmd_nb_p = found command number
805 * cmd_info_p = pointer on the custom command information structure
806 * text_pp = result of interpretation: contain next command to be
807 * sent by ATP in text format (0-terminated) or NULL if
808 * no command to be sent
809 * text_length_p = length of the text command, '\x00' not included
810 *
811 * Return : RV_MEMORY_ERR in case 'memory bank' get RED,
812 * RV_NOT_SUPPORTED if the buffer does not contain proper data,
813 * RV_OK otherwise
814 *
815 * Note : The first data that should be checked are:
816 * (port_p->cmd_info).cmd_txt_p[(port_p->cmd_info).next_position]
817 * if (port_p->cmd_info).status = NOT_STARTED, an 'AT' should be
818 * found
819 * if the function has processed all the chain, it should set state
820 * to FINISHED
821 * (port_p->cmd_info).next_position must be updated by the function
822 *
823 * History : 0.1 (25-August-2000) - Created
824 *
825 *********************************************************************************/
826 T_ATP_RET atp_interpret_raw_data (T_ATP_PORT_STRUCT *port_p,
827 T_RVF_MB_ID mb_id,
828 T_ATP_CMD_TYPE *cmd_type_p,
829 T_ATP_CMD_NB *cmd_nb_p,
830 T_ATP_CMD **cmd_info_pp,
831 T_ATP_TXT_CMD *text_pp,
832 UINT16 *text_length_p)
833 {
834 /* Declare local variables. */
835 T_ATP_RET ret_status = RV_OK;
836 T_ATP_TXT_CMD text_p = NULL;
837
838 /******************** atp_interpret_raw_data function begins ********************/
839
840 rvf_send_trace ("ATP : Interpret raw data ",
841 25,
842 NULL_PARAM,
843 RV_TRACE_LEVEL_DEBUG_LOW,
844 ATP_USE_ID);
845
846 *text_pp = NULL;
847
848 /* Interpret all AT commands or result codes. */
849 while (((port_p->cmd_info).status == NOT_STARTED) || \
850 (((port_p->cmd_info).status == ON_GOING) && \
851 ((port_p->cmd_info).cmd_txt_p[(port_p->cmd_info).next_position] != (port_p->dce_info_p)->cr_character) && \
852 ((port_p->cmd_info).next_position < (port_p->cmd_info).cmd_txt_length)))
853 {
854 text_p = &((port_p->cmd_info).cmd_txt_p[(port_p->cmd_info).next_position]);
855 ret_status = atp_translate_raw_data_to_cmd (port_p,
856 &text_p,
857 UNKNOWN,
858 cmd_type_p,
859 cmd_nb_p,
860 mb_id,
861 cmd_info_pp);
862
863 /* If any memory error occurred, then abort. */
864 if (ret_status == RV_MEMORY_ERR)
865 {
866 return (RV_MEMORY_ERR);
867 }
868
869 /* Backup the next character to be interpreted. */
870 (port_p->cmd_info).status = ON_GOING;
871 (port_p->cmd_info).next_position = (UINT16) (text_p - (port_p->cmd_info).cmd_txt_p);
872
873 /* Intrepret the extracted command. */
874 switch (*cmd_type_p)
875 {
876
877 /* Interpret the extracted AT command. */
878 case AT_CMD:
879 {
880
881 /* Interpret AT commands only if ATP is acting as a DCE. */
882 if (port_p->port_config != DCE_CONFIG)
883 {
884 break;
885 }
886
887 /* Set the result of interpretation to NULL. */
888 *text_pp = NULL;
889 switch (*cmd_nb_p)
890 {
891
892 /* Answer. Note that any additional commands that */
893 /* appear after A on the same command line are ignored */
894 /* (See ITU-T Recommendation V.250 ter page 35). */
895 case ATP_ATA_NB:
896
897 /* Dial. Note that all characters appearing on the same */
898 /* command line after D are considered part of the call */
899 /* addressing information to be signalled to the */
900 /* network, or modifiers used to control the signalling */
901 /* process, up to a semicolon character or the end of */
902 /* the command line (See ITU-T Recommendation V.250 ter */
903 /* page 31). Note also that the ITU-T Recommendation */
904 /* V.250 ter does not describe DCE behaviour in some */
905 /* situations. Thus, additional characters that appear */
906 /* on the same command line after a semicolon that */
907 /* terminates dial string are either ignored or */
908 /* processed as commands (See ITU-T Recommendation */
909 /* V.250 ter page 14). In our implementation, such */
910 /* additional characters are ignored. */
911 case ATP_ATD_NB:
912
913 /* Reset to default configuration. Note that any */
914 /* additional commands that appear on the same command */
915 /* line after Z are ignored (See ITU-T Recommendation */
916 /* V.250 ter page 15). */
917 case ATP_ATZ_NB:
918 {
919 (port_p->cmd_info).next_position = (port_p->cmd_info).cmd_txt_length;
920 break;
921 }
922
923 /* Command echo. */
924 case ATP_ATE_NB:
925 {
926
927 /* Check to see if the specified value is valid */
928 /* (See ITU-T Recommendation V.250 ter page */
929 /* 23). */
930 if (((*((T_ATP_ATE_PARAM **) cmd_info_pp))->number != ECHO_OFF) && \
931 ((*((T_ATP_ATE_PARAM **) cmd_info_pp))->number != ECHO_ON))
932 {
933 rvf_send_trace ("ATP : Command echo value invalid ",
934 33,
935 NULL_PARAM,
936 RV_TRACE_LEVEL_WARNING,
937 ATP_USE_ID);
938 rvf_free_buf (*cmd_info_pp);
939 *cmd_info_pp = NULL;
940 return (RV_NOT_SUPPORTED);
941 }
942 rvf_send_trace ("ATP : Command echo updated ",
943 27,
944 NULL_PARAM,
945 RV_TRACE_LEVEL_DEBUG_LOW,
946 ATP_USE_ID);
947 (port_p->dce_info_p)->echo_mode = (*((T_ATP_ATE_PARAM **) cmd_info_pp))->number;
948 *cmd_type_p = UNKNOWN;
949 rvf_free_buf (*cmd_info_pp);
950 *cmd_info_pp = NULL;
951
952 /* Interpret the next AT command or result code */
953 /* to come. */
954 continue;
955 }
956
957 /* Result code suppression. */
958 case ATP_ATQ_NB:
959 {
960
961 /* Check to see if the specified value is valid */
962 /* (See ITU-T Recommendation V.250 ter page */
963 /* 23). */
964 if (((*((T_ATP_ATQ_PARAM **) cmd_info_pp))->number != RESULT_CODE_ON) && \
965 ((*((T_ATP_ATQ_PARAM **) cmd_info_pp))->number != RESULT_CODE_OFF))
966 {
967 rvf_send_trace ("ATP : Result code suppression value invalid ",
968 44,
969 NULL_PARAM,
970 RV_TRACE_LEVEL_WARNING,
971 ATP_USE_ID);
972 rvf_free_buf (*cmd_info_pp);
973 *cmd_info_pp = NULL;
974 return (RV_NOT_SUPPORTED);
975 }
976 rvf_send_trace ("ATP : Result code suppression updated ",
977 38,
978 NULL_PARAM,
979 RV_TRACE_LEVEL_DEBUG_LOW,
980 ATP_USE_ID);
981 (port_p->dce_info_p)->result_code_mode = (*((T_ATP_ATQ_PARAM **) cmd_info_pp))->number;
982 *cmd_type_p = UNKNOWN;
983 rvf_free_buf (*cmd_info_pp);
984 *cmd_info_pp = NULL;
985
986 /* Interpret the next AT command or result code */
987 /* to come. */
988 continue;
989 }
990
991 /* DCE response format. */
992 case ATP_ATV_NB:
993 {
994
995 /* Check to see if the specified value is valid */
996 /* (See ITU-T Recommendation V.250 ter page */
997 /* 24). */
998 if (((*((T_ATP_ATV_PARAM **) cmd_info_pp))->number != ATP_VERBOSE_0) && \
999 ((*((T_ATP_ATV_PARAM **) cmd_info_pp))->number != ATP_VERBOSE_1))
1000 {
1001 rvf_send_trace ("ATP : DCE response format value invalid ",
1002 40,
1003 NULL_PARAM,
1004 RV_TRACE_LEVEL_WARNING,
1005 ATP_USE_ID);
1006 rvf_free_buf (*cmd_info_pp);
1007 *cmd_info_pp = NULL;
1008 return (RV_NOT_SUPPORTED);
1009 }
1010 rvf_send_trace ("ATP : DCE response format updated ",
1011 34,
1012 NULL_PARAM,
1013 RV_TRACE_LEVEL_DEBUG_LOW,
1014 ATP_USE_ID);
1015 (port_p->dce_info_p)->verbose_mode = (*((T_ATP_ATV_PARAM **) cmd_info_pp))->number;
1016 *cmd_type_p = UNKNOWN;
1017 rvf_free_buf (*cmd_info_pp);
1018 *cmd_info_pp = NULL;
1019
1020 /* Interpret the next AT command or result code */
1021 /* to come. */
1022 continue;
1023 }
1024
1025 /* Command line termination character. */
1026 case ATP_ATS3_NB:
1027 {
1028
1029 /* Check to see if the specified value is valid */
1030 /* (See ITU-T Recommendation V.250 ter pages 21 */
1031 /* and 22). */
1032 if ((((*((T_ATP_ATS3_PARAM **) cmd_info_pp))->s_operator != READ_S_PARAM) && \
1033 ((*((T_ATP_ATS3_PARAM **) cmd_info_pp))->s_operator != SET_S_PARAM)) || \
1034 ((*((T_ATP_ATS3_PARAM **) cmd_info_pp))->value > 0x007F))
1035 {
1036 rvf_send_trace ("ATP : Command line termination character invalid ",
1037 49,
1038 NULL_PARAM,
1039 RV_TRACE_LEVEL_WARNING,
1040 ATP_USE_ID);
1041 rvf_free_buf (*cmd_info_pp);
1042 *cmd_info_pp = NULL;
1043 return (RV_NOT_SUPPORTED);
1044 }
1045 rvf_send_trace ("ATP : Command line termination character updated ",
1046 49,
1047 NULL_PARAM,
1048 RV_TRACE_LEVEL_DEBUG_LOW,
1049 ATP_USE_ID);
1050
1051 /* Check to see if the S-parameter is requested */
1052 /* to be set to a new value. */
1053 if ((*((T_ATP_ATS3_PARAM **) cmd_info_pp))->s_operator == SET_S_PARAM)
1054 {
1055 (port_p->dce_info_p)->cr_character = (char) ((*((T_ATP_ATS3_PARAM **) cmd_info_pp))->value);
1056 *cmd_type_p = UNKNOWN;
1057 rvf_free_buf (*cmd_info_pp);
1058 *cmd_info_pp = NULL;
1059
1060 /* Interpret the next AT command or result */
1061 /* code to come. */
1062 continue;
1063 }
1064 break;
1065 }
1066
1067 /* Response formatting character. */
1068 case ATP_ATS4_NB:
1069 {
1070
1071 /* Check to see if the specified value is valid */
1072 /* (See ITU-T Recommendation V.250 ter page */
1073 /* 22). */
1074 if ((((*((T_ATP_ATS4_PARAM **) cmd_info_pp))->s_operator != READ_S_PARAM) && \
1075 ((*((T_ATP_ATS4_PARAM **) cmd_info_pp))->s_operator != SET_S_PARAM)) || \
1076 ((*((T_ATP_ATS4_PARAM **) cmd_info_pp))->value > 0x007F))
1077 {
1078 rvf_send_trace ("ATP : Response formatting character invalid ",
1079 44,
1080 NULL_PARAM,
1081 RV_TRACE_LEVEL_WARNING,
1082 ATP_USE_ID);
1083 rvf_free_buf (*cmd_info_pp);
1084 *cmd_info_pp = NULL;
1085 return (RV_NOT_SUPPORTED);
1086 }
1087 rvf_send_trace ("ATP : Response formatting character updated ",
1088 44,
1089 NULL_PARAM,
1090 RV_TRACE_LEVEL_DEBUG_LOW,
1091 ATP_USE_ID);
1092
1093 /* Check to see if the S-parameter is requested */
1094 /* to be set to a new value. */
1095 if ((*((T_ATP_ATS4_PARAM **) cmd_info_pp))->s_operator == SET_S_PARAM)
1096 {
1097 (port_p->dce_info_p)->lf_character = (char) ((*((T_ATP_ATS4_PARAM **) cmd_info_pp))->value);
1098 *cmd_type_p = UNKNOWN;
1099 rvf_free_buf (*cmd_info_pp);
1100 *cmd_info_pp = NULL;
1101
1102 /* Interpret the next AT command or result */
1103 /* code to come. */
1104 continue;
1105 }
1106 break;
1107 }
1108
1109 /* Command line editing character. */
1110 case ATP_ATS5_NB:
1111 {
1112
1113 /* Check to see if the specified value is valid */
1114 /* (See ITU-T Recommendation V.250 ter page */
1115 /* 22). */
1116 if ((((*((T_ATP_ATS5_PARAM **) cmd_info_pp))->s_operator != READ_S_PARAM) && \
1117 ((*((T_ATP_ATS5_PARAM **) cmd_info_pp))->s_operator != SET_S_PARAM)) || \
1118 ((*((T_ATP_ATS5_PARAM **) cmd_info_pp))->value > 0x007F))
1119 {
1120 rvf_send_trace ("ATP : Command line editing character invalid ",
1121 45,
1122 NULL_PARAM,
1123 RV_TRACE_LEVEL_WARNING,
1124 ATP_USE_ID);
1125 rvf_free_buf (*cmd_info_pp);
1126 *cmd_info_pp = NULL;
1127 return (RV_NOT_SUPPORTED);
1128 }
1129 rvf_send_trace ("ATP : Command line editing character updated ",
1130 45,
1131 NULL_PARAM,
1132 RV_TRACE_LEVEL_DEBUG_LOW,
1133 ATP_USE_ID);
1134
1135 /* Check to see if the S-parameter is requested */
1136 /* to be set to a new value. */
1137 if ((*((T_ATP_ATS5_PARAM **) cmd_info_pp))->s_operator == SET_S_PARAM)
1138 {
1139 (port_p->dce_info_p)->bs_character = (char) ((*((T_ATP_ATS5_PARAM **) cmd_info_pp))->value);
1140 *cmd_type_p = UNKNOWN;
1141 rvf_free_buf (*cmd_info_pp);
1142 *cmd_info_pp = NULL;
1143
1144 /* Interpret the next AT command or result */
1145 /* code to come. */
1146 continue;
1147 }
1148 break;
1149 }
1150
1151 /* AT command not recognized. */
1152 case ATP_MAX_NB_OF_AT_COMMANDS:
1153 {
1154
1155 /* Get the length of the AT command to be */
1156 /* returned, '\x00' not included. */
1157 ATP_GET_UNKNOWN_AT_CMD_LEN (text_p,
1158 text_length_p,
1159 (port_p->dce_info_p)->cr_character);
1160
1161 /* Allocate memory in order to return the AT */
1162 /* command ('\x00' included). Note that the */
1163 /* prefix must be taken into account. If */
1164 /* insufficient resources available, then */
1165 /* report an internal memory error and abort. */
1166 if (rvf_get_buf (mb_id, \
1167 ATP_AT_PREFIX_LEN + *text_length_p + 0x0001, \
1168 (void **) text_pp) == RVF_RED)
1169 {
1170 atp_error (ATP_ERROR_TX_MB_RED);
1171 ret_status = RV_MEMORY_ERR;
1172 break;
1173 }
1174
1175 /* Copy the prefix into the buffer (See ITU-T */
1176 /* Recommendation V.250 ter page 4). */
1177 memcpy ((void *) *text_pp,
1178 ATP_AT_PREFIX,
1179 ATP_AT_PREFIX_LEN);
1180
1181 /* Then, copy the command line body into the */
1182 /* buffer. */
1183 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1184 (void *) text_p,
1185 *text_length_p);
1186 (*text_pp)[*text_length_p + ATP_AT_PREFIX_LEN] = '\x00';
1187 text_p += *text_length_p;
1188 break;
1189 }
1190
1191 /* Other recognized AT commands. */
1192 default:
1193 {
1194 break;
1195 }
1196 }
1197
1198 /* If the extracted AT command is an extended syntax */
1199 /* command, then update the position of the next character */
1200 /* to be interpreted. */
1201 switch (ATP_AT_INFO[*cmd_nb_p][ATP_AT_PARAM_COLUMN])
1202 {
1203
1204 /* AT command undefined or not supported for now. */
1205 case ATP_CMD_NOT_DEFINED:
1206
1207 /* Extended syntax command does not expect any <value>. */
1208 case ATP_NO_EXTENDED_PARAM:
1209
1210 /* Extended syntax command whose subparameter is a */
1211 /* numeric constant. */
1212 case ATP_SINGLE_EXTENDED_PARAM:
1213
1214 /* Keypad control command. */
1215 case ATP_PLUS_CKPD_PARAM:
1216 {
1217 text_p += ((*text_p == (port_p->dce_info_p)->cr_character) ? (0x0000) : (0x0001));
1218 (port_p->cmd_info).next_position = (UINT16) (text_p - (port_p->cmd_info).cmd_txt_p);
1219 }
1220 default:
1221 {
1222 break;
1223 }
1224 }
1225 break;
1226 }
1227
1228 /* Return raw data as received. */
1229 case UNKNOWN:
1230 {
1231
1232 /* Get the length of raw data to be returned, '\x00' not */
1233 /* included. */
1234 ATP_GET_UNKNOWN_CMD_LEN (text_p,
1235 text_length_p,
1236 (port_p->dce_info_p)->cr_character);
1237
1238 /* Allocate memory in order to return raw data ('\x00' */
1239 /* included). If insufficient resources available, then */
1240 /* report an internal memory error and abort. */
1241 if (rvf_get_buf (mb_id, \
1242 *text_length_p + 0x0001, \
1243 (void **) text_pp) == RVF_RED)
1244 {
1245 atp_error (ATP_ERROR_TX_MB_RED);
1246 ret_status = RV_MEMORY_ERR;
1247 break;
1248 }
1249
1250 /* Copy raw data into the buffer. */
1251 memcpy ((void *) *text_pp,
1252 (void *) text_p,
1253 *text_length_p);
1254 (*text_pp)[*text_length_p] = '\x00';
1255 text_p += *text_length_p;
1256
1257 /* Backup the next character to be interpreted. */
1258 (port_p->cmd_info).next_position = (UINT16) (text_p - (port_p->cmd_info).cmd_txt_p);
1259 break;
1260 }
1261
1262 /* Else, result codes not supported. */
1263 case RESULT_CODE:
1264 case UNSOLICITED_RESULT:
1265 default:
1266 {
1267 break;
1268 }
1269 }
1270 break;
1271 }
1272
1273 /* Then, check to see whether the interpretation is over. */
1274 if (((port_p->cmd_info).cmd_txt_p[(port_p->cmd_info).next_position] == (port_p->dce_info_p)->cr_character) || \
1275 ((port_p->cmd_info).next_position >= (port_p->cmd_info).cmd_txt_length))
1276 {
1277 (port_p->cmd_info).status = FINISHED;
1278 }
1279 return (RV_OK);
1280
1281 } /******************* End of atp_interpret_raw_data function *******************/
1282
1283
1284 /********************************************************************************
1285 * Function name : atp_translate_cmd_to_txt
1286 *
1287 * Description : Translate a command in interpreted format to text format. Buffer
1288 * containing the command is assumed to be BTF buffer and is freed
1289 * by this function. Text buffer is a BTF buffer
1290 *
1291 * Parameters : cmd_type = type of the command (AT_CMD, RESULT_CODE and
1292 * UNSOLICITED_RESULT)
1293 * cmd_nb = binary related code
1294 * cmd_info_p = pointer on the custom command information structure
1295 * mb_id = memory bank used to get the text buffer
1296 * text_pp = pointer on the text chain (0-terminated)
1297 * text_length_p = length of the text chain, '\x00' not included
1298 *
1299 * Return : RV_OK,
1300 * RV_NOT_SUPPORTED if the command is not recognized
1301 *
1302 * History : 0.1 (25-August-2000) - Created
1303 *
1304 *********************************************************************************/
1305 T_ATP_RET atp_translate_cmd_to_txt (T_ATP_CMD_TYPE cmd_type,
1306 T_ATP_CMD_NB cmd_nb,
1307 T_ATP_CMD *cmd_info_p,
1308 T_RVF_MB_ID mb_id,
1309 T_ATP_TXT_CMD *text_pp,
1310 UINT16 *text_length_p)
1311 {
1312 /* Declare local variables. */
1313 const char *table = NULL;
1314 UINT16 offset = 0x0000;
1315 T_ATP_RET ret_status = RV_OK;
1316
1317 /******************* atp_translate_cmd_to_txt function begins *******************/
1318
1319 switch (cmd_type)
1320 {
1321
1322 /* Translate AT commands into text. */
1323 case AT_CMD:
1324 {
1325 rvf_send_trace ("ATP : Translate an AT command into text ",
1326 40,
1327 NULL_PARAM,
1328 RV_TRACE_LEVEL_DEBUG_LOW,
1329 ATP_USE_ID);
1330 table = ATP_AT_TXT_TABLE;
1331
1332 /* Get the related offset. */
1333 offset = ATP_AT_INFO[cmd_nb][ATP_AT_OFFSET_COLUMN];
1334
1335 /* Get the length of the AT command. */
1336 *text_length_p = (UINT16) (ATP_AT_PREFIX_LEN + \
1337 ATP_AT_INFO[cmd_nb + 0x01][ATP_AT_OFFSET_COLUMN] - ATP_AT_INFO[cmd_nb][ATP_AT_OFFSET_COLUMN]);
1338
1339 /* Get the related structure. */
1340 switch (ATP_AT_INFO[cmd_nb][ATP_AT_PARAM_COLUMN])
1341 {
1342
1343 /* Basic syntax command does not expect any <number>. */
1344 case ATP_NO_PARAM:
1345 {
1346
1347 /* Create a buffer and copy text string into it */
1348 /* ('\x00' included). If insufficient resources */
1349 /* available, then report an internal memory error */
1350 /* and abort. */
1351 if (rvf_get_buf (mb_id, \
1352 *text_length_p + 0x0001, \
1353 (void **) text_pp) == RVF_RED)
1354 {
1355 atp_error (ATP_ERROR_TX_MB_RED);
1356 ret_status = RV_MEMORY_ERR;
1357 break;
1358 }
1359
1360 /* Copy the command line prefix into the buffer. */
1361 memcpy ((void *) (*text_pp),
1362 ATP_AT_PREFIX,
1363 ATP_AT_PREFIX_LEN);
1364
1365 /* Copy the text into the buffer. */
1366 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1367 (void *) &(table[offset]),
1368 *text_length_p - ATP_AT_PREFIX_LEN);
1369 (*text_pp)[*text_length_p] = '\x00';
1370 break;
1371 }
1372
1373 /* Basic syntax command. */
1374 case ATP_BASIC_PARAM:
1375 {
1376
1377 /* Declare a local block variable. */
1378 T_ATP_BASIC_CMD *basic_cmd_param_p = (T_ATP_BASIC_CMD *) cmd_info_p;
1379
1380 /* Create a buffer and copy text string into it */
1381 /* ('\x00' included). If insufficient resources */
1382 /* available, then report an internal memory error */
1383 /* and abort. */
1384 if (rvf_get_buf (mb_id, \
1385 *text_length_p + MAX_BASIC_CMD_PARAM_LEN + 0x0001, \
1386 (void **) text_pp) == RVF_RED)
1387 {
1388 atp_error (ATP_ERROR_TX_MB_RED);
1389 ret_status = RV_MEMORY_ERR;
1390 break;
1391 }
1392
1393 /* Copy the command line prefix into the buffer. */
1394 memcpy ((void *) (*text_pp),
1395 ATP_AT_PREFIX,
1396 ATP_AT_PREFIX_LEN);
1397
1398 /* Copy the text into the buffer. */
1399 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1400 (void *) &(table[offset]),
1401 *text_length_p - ATP_AT_PREFIX_LEN);
1402
1403 /* If needed, copy the buffer describing the */
1404 /* command in interpreted format and free it. */
1405 if (basic_cmd_param_p != NULL)
1406 {
1407 *text_length_p = (UINT16) (*text_length_p + \
1408 dtoa (basic_cmd_param_p->number,
1409 &((*text_pp)[*text_length_p])));
1410 }
1411 (*text_pp)[*text_length_p] = '\x00';
1412 break;
1413 }
1414
1415 /* Dial. */
1416 case ATP_DIAL_PARAM:
1417 {
1418
1419 /* Declare local block variables. */
1420 UINT8 dial_param_length = 0x00;
1421 UINT8 dial_semicolon = DATA_CALL;
1422 T_ATP_DIAL *dial_param_p = (T_ATP_DIAL *) cmd_info_p;
1423
1424 /* If needed, take the buffer describing the */
1425 /* command in interpreted format into account. */
1426 if (dial_param_p != NULL)
1427 {
1428 dial_param_length = dial_param_p->dial_string_length;
1429 dial_semicolon = (UINT8) (dial_param_p->call_type);
1430 }
1431
1432 /* Create a buffer and copy text string into it */
1433 /* ('\x00' included). If insufficient resources */
1434 /* available, then report an internal memory error */
1435 /* and abort. */
1436 if (rvf_get_buf (mb_id, \
1437 *text_length_p + dial_param_length + dial_semicolon + 0x0001, \
1438 (void **) text_pp) == RVF_RED)
1439 {
1440 atp_error (ATP_ERROR_TX_MB_RED);
1441 ret_status = RV_MEMORY_ERR;
1442 break;
1443 }
1444
1445 /* Copy the command line prefix into the buffer. */
1446 memcpy ((void *) (*text_pp),
1447 ATP_AT_PREFIX,
1448 ATP_AT_PREFIX_LEN);
1449
1450 /* Copy the text into the buffer. */
1451 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1452 (void *) &(table[offset]),
1453 *text_length_p - ATP_AT_PREFIX_LEN);
1454
1455 /* If needed, copy the buffer describing the */
1456 /* command in interpreted format and free it. */
1457 if (dial_param_p != NULL)
1458 {
1459 memcpy ((void *) &((*text_pp)[*text_length_p]),
1460 (void *) (dial_param_p->dial_string_p),
1461 dial_param_length);
1462 if (dial_semicolon == VOICE_CALL)
1463 {
1464 (*text_pp)[*text_length_p + dial_param_length] = ';';
1465 }
1466 *text_length_p = (UINT16) (*text_length_p + \
1467 dial_param_length + dial_semicolon);
1468 }
1469 (*text_pp)[*text_length_p] = '\x00';
1470 break;
1471 }
1472
1473 /* S-parameter. */
1474 case ATP_S_PARAM:
1475 {
1476
1477 /* Declare a local block variable. */
1478 T_ATP_S_PARAM *s_param_p = (T_ATP_S_PARAM *) cmd_info_p;
1479
1480 /* Create a buffer and copy text string into it */
1481 /* ('\x00' included). If insufficient resources */
1482 /* available, then report an internal memory error */
1483 /* and abort. */
1484 if (rvf_get_buf (mb_id, \
1485 *text_length_p + MAX_S_PARAM_LEN + 0x0001,
1486 (void **) text_pp) == RVF_RED)
1487 {
1488 atp_error (ATP_ERROR_TX_MB_RED);
1489 ret_status = RV_MEMORY_ERR;
1490 break;
1491 }
1492
1493 /* Copy the command line prefix into the buffer. */
1494 memcpy ((void *) (*text_pp),
1495 ATP_AT_PREFIX,
1496 ATP_AT_PREFIX_LEN);
1497
1498 /* Copy the text into the buffer. */
1499 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1500 (void *) &(table[offset]),
1501 *text_length_p - ATP_AT_PREFIX_LEN);
1502
1503 /* If needed, copy the buffer describing the */
1504 /* command in interpreted format and free it. */
1505 if (s_param_p == NULL)
1506 {
1507 (*text_pp)[*text_length_p] = '\x00';
1508 break;
1509 }
1510 switch (s_param_p->s_operator)
1511 {
1512
1513 /* Parameter read command syntax. */
1514 case READ_S_PARAM:
1515 {
1516 (*text_pp)[(*text_length_p)++] = '?';
1517 (*text_pp)[*text_length_p] = '\x00';
1518 break;
1519 }
1520
1521 /* Parameter set command syntax. */
1522 case SET_S_PARAM:
1523 {
1524 (*text_pp)[(*text_length_p)++] = '=';
1525 *text_length_p = (UINT16) (*text_length_p + \
1526 dtoa (s_param_p->value,
1527 &((*text_pp)[*text_length_p])));
1528 (*text_pp)[*text_length_p] = '\x00';
1529 break;
1530 }
1531 default:
1532 {
1533 rvf_free_buf (*text_pp);
1534 *text_pp = NULL;
1535 ret_status = RV_NOT_SUPPORTED;
1536 break;
1537 }
1538 }
1539 break;
1540 }
1541
1542 /* Extended syntax command does not expect any <value>. */
1543 case ATP_NO_EXTENDED_PARAM:
1544 {
1545
1546 /* Declare a local block variable. */
1547 T_ATP_NO_SUBPARAMETER *extended_cmd_param_p = (T_ATP_NO_SUBPARAMETER *) cmd_info_p;
1548
1549 /* Create a buffer and copy text string into it */
1550 /* ('\x00' included). If insufficient resources */
1551 /* available, then report an internal memory error */
1552 /* and abort. */
1553 if (rvf_get_buf (mb_id, \
1554 *text_length_p + MAX_NO_SUBPARAMETER_LEN + 0x0001, \
1555 (void **) text_pp) == RVF_RED)
1556 {
1557 atp_error (ATP_ERROR_TX_MB_RED);
1558 ret_status = RV_MEMORY_ERR;
1559 break;
1560 }
1561
1562 /* Copy the command line prefix into the buffer. */
1563 memcpy ((void *) (*text_pp),
1564 ATP_AT_PREFIX,
1565 ATP_AT_PREFIX_LEN);
1566
1567 /* Copy the text into the buffer. */
1568 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1569 (void *) &(table[offset]),
1570 *text_length_p - ATP_AT_PREFIX_LEN);
1571
1572 /* If needed, copy the buffer describing the */
1573 /* command in interpreted format and free it. */
1574 if (extended_cmd_param_p == NULL)
1575 {
1576 (*text_pp)[*text_length_p] = '\x00';
1577 break;
1578 }
1579 switch (extended_cmd_param_p->extended_operator)
1580 {
1581
1582 /* No subparameter. */
1583 case NO_SUBPARAMETER:
1584 {
1585 (*text_pp)[*text_length_p] = '\x00';
1586 break;
1587 }
1588
1589 /* Action test command syntax. */
1590 case TEST_EXTENDED_CMD:
1591 {
1592 (*text_pp)[(*text_length_p)++] = '=';
1593 (*text_pp)[(*text_length_p)++] = '?';
1594 (*text_pp)[*text_length_p] = '\x00';
1595 break;
1596 }
1597 default:
1598 {
1599 rvf_free_buf (*text_pp);
1600 *text_pp = NULL;
1601 ret_status = RV_NOT_SUPPORTED;
1602 break;
1603 }
1604 }
1605 break;
1606 }
1607
1608 /* Extended syntax command whose subparameter is a numeric */
1609 /* constant. */
1610 case ATP_SINGLE_EXTENDED_PARAM:
1611 {
1612
1613 /* Declare a local block variable. */
1614 T_ATP_SINGLE_SUBPARAMETER *extended_cmd_param_p = (T_ATP_SINGLE_SUBPARAMETER *) cmd_info_p;
1615
1616 /* Create a buffer and copy text string into it */
1617 /* ('\x00' included). If insufficient resources */
1618 /* available, then report an internal memory error */
1619 /* and abort. */
1620 if (rvf_get_buf (mb_id, \
1621 *text_length_p + MAX_SINGLE_SUBPARAMETER_LEN + 0x0001, \
1622 (void **) text_pp) == RVF_RED)
1623 {
1624 atp_error (ATP_ERROR_TX_MB_RED);
1625 ret_status = RV_MEMORY_ERR;
1626 break;
1627 }
1628
1629 /* Copy the command line prefix into the buffer. */
1630 memcpy ((void *) (*text_pp),
1631 ATP_AT_PREFIX,
1632 ATP_AT_PREFIX_LEN);
1633
1634 /* Copy the text into the buffer. */
1635 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1636 (void *) &(table[offset]),
1637 *text_length_p - ATP_AT_PREFIX_LEN);
1638
1639 /* If needed, copy the buffer describing the */
1640 /* command in interpreted format and free it. */
1641 if (extended_cmd_param_p == NULL)
1642 {
1643 (*text_pp)[*text_length_p] = '\x00';
1644 break;
1645 }
1646 switch (extended_cmd_param_p->extended_operator)
1647 {
1648
1649 /* No subparameter. */
1650 case NO_SUBPARAMETER:
1651 {
1652 (*text_pp)[*text_length_p] = '\x00';
1653 break;
1654 }
1655
1656 /* Action test command syntax. */
1657 case TEST_EXTENDED_CMD:
1658 {
1659 (*text_pp)[(*text_length_p)++] = '=';
1660 }
1661
1662 /* Parameter read command syntax. */
1663 case READ_EXTENDED_CMD:
1664 {
1665 (*text_pp)[(*text_length_p)++] = '?';
1666 (*text_pp)[*text_length_p] = '\x00';
1667 break;
1668 }
1669
1670 /* Parameter set command syntax. */
1671 case SET_EXTENDED_CMD:
1672 {
1673 (*text_pp)[(*text_length_p)++] = '=';
1674 *text_length_p = (UINT16) (*text_length_p + \
1675 dtoa (extended_cmd_param_p->value,
1676 &((*text_pp)[*text_length_p])));
1677 (*text_pp)[*text_length_p] = '\x00';
1678 break;
1679 }
1680 default:
1681 {
1682 rvf_free_buf (*text_pp);
1683 *text_pp = NULL;
1684 ret_status = RV_NOT_SUPPORTED;
1685 break;
1686 }
1687 }
1688 break;
1689 }
1690
1691 /* Keypad control command. Note that <keys> is a string of */
1692 /* characters representing keys (See See ETS 300 916 (GSM */
1693 /* 07.07) Version 5.8.1 page 62). Colon character followed */
1694 /* by one character can be used to indicate a manufacturer */
1695 /* specific key not listed here. All characters from a */
1696 /* semicolon character to the next single semicolon */
1697 /* character are treated as alpha entries and are not */
1698 /* converted to key equivalents. All semicolon characters */
1699 /* inside alpha entries should be duplicated in the DTE. */
1700 /* Pause characters "W" and "w" can be used to pause */
1701 /* between key pressings for a time specified by <pause>. */
1702 case ATP_PLUS_CKPD_PARAM:
1703 {
1704
1705 /* Declare local block variables. */
1706 UINT8 nb_keypressed = 0x00;
1707 T_ATP_PLUS_CKPD *ckpd_param_p = (T_ATP_PLUS_CKPD *) cmd_info_p;
1708
1709 /* Create a buffer and copy text string into it */
1710 /* ('\x00' included). If insufficient resources */
1711 /* available, then report an internal memory error */
1712 /* and abort. */
1713 if (rvf_get_buf (mb_id, \
1714 *text_length_p + MAX_CKPD_PARAM_LEN + 0x0001, \
1715 (void **) text_pp) == RVF_RED)
1716 {
1717 atp_error (ATP_ERROR_TX_MB_RED);
1718 ret_status = RV_MEMORY_ERR;
1719 break;
1720 }
1721
1722 /* Copy the command line prefix into the buffer. */
1723 memcpy ((void *) (*text_pp),
1724 ATP_AT_PREFIX,
1725 ATP_AT_PREFIX_LEN);
1726
1727 /* Copy the text into the buffer. */
1728 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1729 (void *) &(table[offset]),
1730 *text_length_p - ATP_AT_PREFIX_LEN);
1731
1732 /* If needed, copy the buffer describing the */
1733 /* command in interpreted format and free it. */
1734 if (ckpd_param_p == NULL)
1735 {
1736 (*text_pp)[*text_length_p] = '\x00';
1737 break;
1738 }
1739 switch (ckpd_param_p->extended_operator)
1740 {
1741
1742 /* Action test command syntax. */
1743 case TEST_EXTENDED_CMD:
1744 {
1745 (*text_pp)[(*text_length_p)++] = '=';
1746 (*text_pp)[(*text_length_p)++] = '?';
1747 (*text_pp)[*text_length_p] = '\x00';
1748 break;
1749 }
1750
1751 /* Parameter set command syntax. */
1752 case SET_EXTENDED_CMD:
1753 {
1754 (*text_pp)[(*text_length_p)++] = '=';
1755 (*text_pp)[(*text_length_p)++] = '"';
1756
1757 /* Store each keypressed into the */
1758 /* buffer. */
1759 for (nb_keypressed = 0x00;
1760 nb_keypressed < ckpd_param_p->nb_keys;
1761 nb_keypressed++)
1762 {
1763 (*text_pp)[(*text_length_p)++] = ';';
1764 *text_length_p = (UINT16) (*text_length_p + \
1765 dtoa (ckpd_param_p->keys[nb_keypressed],
1766 &((*text_pp)[*text_length_p])));
1767 (*text_pp)[(*text_length_p)++] = ';';
1768 }
1769 (*text_pp)[(*text_length_p)++] = '"';
1770
1771 /* Store <time> subparameter into the */
1772 /* buffer. */
1773 (*text_pp)[(*text_length_p)++] = ',';
1774 if ((ckpd_param_p->pause != DEFAULT_TIME) || \
1775 (ckpd_param_p->pause != TIME_DO_NOT_CARE))
1776 {
1777 *text_length_p = (UINT16) (*text_length_p + \
1778 dtoa (ckpd_param_p->time,
1779 &((*text_pp)[*text_length_p])));
1780 }
1781
1782 /* Store <pause> subparameter into the */
1783 /* buffer. */
1784 (*text_pp)[(*text_length_p)++] = ',';
1785 if ((ckpd_param_p->pause != DEFAULT_PAUSE) || \
1786 (ckpd_param_p->pause != PAUSE_DO_NOT_CARE))
1787 {
1788 *text_length_p = (UINT16) (*text_length_p + \
1789 dtoa (ckpd_param_p->pause,
1790 &((*text_pp)[*text_length_p])));
1791 }
1792 (*text_pp)[*text_length_p] = '\x00';
1793 break;
1794 }
1795 default:
1796 {
1797 rvf_free_buf (*text_pp);
1798 *text_pp = NULL;
1799 ret_status = RV_NOT_SUPPORTED;
1800 break;
1801 }
1802 }
1803 break;
1804 }
1805 default:
1806 {
1807 rvf_send_trace ("ATP : Received an unknown command ",
1808 34,
1809 NULL_PARAM,
1810 RV_TRACE_LEVEL_WARNING,
1811 ATP_USE_ID);
1812 *text_pp = NULL;
1813 ret_status = RV_NOT_SUPPORTED;
1814 break;
1815 }
1816 }
1817 break;
1818 }
1819
1820 /* Translate DCE responses into text (See ITU-T Recommendation V.250 */
1821 /* ter page 10). */
1822 case RESULT_CODE:
1823 case UNSOLICITED_RESULT:
1824 {
1825 rvf_send_trace ("ATP : Translate a result into text ",
1826 35,
1827 NULL_PARAM,
1828 RV_TRACE_LEVEL_DEBUG_LOW,
1829 ATP_USE_ID);
1830 table = ATP_RESULT_CODE_TXT_TABLE_V1;
1831
1832 /* Get the related offset. */
1833 offset = ATP_RESULT_CODE_INFO[cmd_nb][ATP_RESULT_OFFSET_V1_COLUMN];
1834
1835 /* Get the length of the result code. */
1836 *text_length_p = (UINT16) (ATP_RESULT_CODE_INFO[cmd_nb + 0x01][ATP_RESULT_OFFSET_V1_COLUMN] - ATP_RESULT_CODE_INFO[cmd_nb][ATP_RESULT_OFFSET_V1_COLUMN]);
1837
1838 /* Get the related structure. */
1839 switch (ATP_RESULT_CODE_INFO[cmd_nb][ATP_RESULT_PARAM_COLUMN])
1840 {
1841
1842 /* Basic syntax result code. */
1843 case ATP_BASIC_RESULT_CODE:
1844 {
1845
1846 /* Create a buffer and copy text string into it */
1847 /* ('\x00' included). If insufficient resources */
1848 /* available, then report an internal memory error */
1849 /* and abort. */
1850 if (rvf_get_buf (mb_id, \
1851 *text_length_p + 0x0001, \
1852 (void **) text_pp) == RVF_RED)
1853 {
1854 atp_error (ATP_ERROR_TX_MB_RED);
1855 ret_status = RV_MEMORY_ERR;
1856 break;
1857 }
1858
1859 /* Copy text into the buffer. */
1860 memcpy ((void *) (*text_pp),
1861 (void *) &(table[offset]),
1862 *text_length_p);
1863 (*text_pp)[*text_length_p] = '\x00';
1864 break;
1865 }
1866
1867 /* Extended syntax result code. */
1868 case ATP_EXTENDED_RESULT_CODE:
1869 {
1870
1871 /* Declare a local block variable. */
1872 T_ATP_SINGLE_RESULT_CODE_VALUE *result_code_param_p = (T_ATP_SINGLE_RESULT_CODE_VALUE *) cmd_info_p;
1873
1874 /* Create a buffer and copy text string into it */
1875 /* ('=' and '\x00' included). If insufficient */
1876 /* resources available, then report an internal */
1877 /* memory error and abort. */
1878 if (rvf_get_buf (mb_id, \
1879 *text_length_p + MAX_SINGLE_RESULT_CODE_VALUE_LEN + 0x0002, \
1880 (void **) text_pp) == RVF_RED)
1881 {
1882 atp_error (ATP_ERROR_TX_MB_RED);
1883 ret_status = RV_MEMORY_ERR;
1884 break;
1885 }
1886
1887 /* Copy text into the buffer. */
1888 memcpy ((void *) (*text_pp),
1889 (void *) &(table[offset]),
1890 *text_length_p);
1891
1892 /* If needed, copy the buffer describing the */
1893 /* command in interpreted format and free it. */
1894 if (result_code_param_p != NULL)
1895 {
1896 (*text_pp)[(*text_length_p)++] = '=';
1897 *text_length_p = (UINT16) (*text_length_p + \
1898 dtoa (result_code_param_p->value,
1899 &((*text_pp)[*text_length_p])));
1900 }
1901 (*text_pp)[*text_length_p] = '\x00';
1902 break;
1903 }
1904
1905 /* CONNECT <text> result code. */
1906 case ATP_CONNECT_TXT_PARAM:
1907 {
1908
1909 /* Declare a local block variable. */
1910 T_ATP_CONNECT_TXT_PARAM *connect_txt_param_p = (T_ATP_CONNECT_TXT_PARAM *) cmd_info_p;
1911
1912 /* Create a buffer and copy text string into it */
1913 /* (' ' and '\x00' included). If insufficient */
1914 /* resources available, then report an internal */
1915 /* memory error and abort. */
1916 if (rvf_get_buf (mb_id, \
1917 *text_length_p + MAX_CONNECT_TXT_LEN + 0x0002, \
1918 (void **) text_pp) == RVF_RED)
1919 {
1920 atp_error (ATP_ERROR_TX_MB_RED);
1921 ret_status = RV_MEMORY_ERR;
1922 break;
1923 }
1924
1925 /* Copy text into the buffer. */
1926 memcpy ((void *) (*text_pp),
1927 (void *) &(table[offset]),
1928 *text_length_p);
1929
1930 /* If needed, copy the buffer describing the */
1931 /* command in interpreted format and free it. */
1932 if (connect_txt_param_p != NULL)
1933 {
1934 (*text_pp)[(*text_length_p)++] = ' ';
1935 *text_length_p = (UINT16) (*text_length_p + \
1936 dtoa (connect_txt_param_p->value,
1937 &((*text_pp)[*text_length_p])));
1938 }
1939 (*text_pp)[*text_length_p] = '\x00';
1940 break;
1941 }
1942
1943 /* +CME ERROR: <error> and +CMS ERROR: <error> result */
1944 /* codes. */
1945 case ATP_PLUS_ERROR_RESULT_CODE:
1946 {
1947
1948 /* Declare local block variables. */
1949 UINT8 error_length = 0x00;
1950 T_ATP_PLUS_ERROR_RESULT_CODE *plus_error_result_code_p = cmd_info_p;
1951
1952 /* If needed, take the buffer describing the */
1953 /* command in interpreted format into account. */
1954 if (plus_error_result_code_p != NULL)
1955 {
1956 error_length = plus_error_result_code_p->error_length;
1957 }
1958
1959 /* Create a buffer and copy text string into it */
1960 /* (' ' and '\x00' included). If insufficient */
1961 /* resources available, then report an internal */
1962 /* memory error and abort. */
1963 if (rvf_get_buf (mb_id, \
1964 *text_length_p + error_length + 0x0002, \
1965 (void **) text_pp) == RVF_RED)
1966 {
1967 atp_error (ATP_ERROR_TX_MB_RED);
1968 ret_status = RV_MEMORY_ERR;
1969 break;
1970 }
1971
1972 /* Copy the command line prefix into the buffer. */
1973 memcpy ((void *) (*text_pp),
1974 ATP_AT_PREFIX,
1975 ATP_AT_PREFIX_LEN);
1976
1977 /* Copy the text into the buffer. */
1978 memcpy ((void *) &((*text_pp)[ATP_AT_PREFIX_LEN]),
1979 (void *) &(table[offset]),
1980 *text_length_p - ATP_AT_PREFIX_LEN);
1981
1982 /* If needed, copy the buffer describing the */
1983 /* command in interpreted format and free it. */
1984 if (plus_error_result_code_p != NULL)
1985 {
1986 (*text_pp)[(*text_length_p)++] = ' ';
1987 memcpy ((void *) &((*text_pp)[*text_length_p]),
1988 (void *) (plus_error_result_code_p->error_p),
1989 error_length);
1990 *text_length_p = (UINT16) (*text_length_p + \
1991 error_length);
1992 }
1993 (*text_pp)[*text_length_p] = '\x00';
1994 break;
1995 }
1996 default:
1997 {
1998 rvf_send_trace ("ATP : Received an unknown command ",
1999 34,
2000 NULL_PARAM,
2001 RV_TRACE_LEVEL_WARNING,
2002 ATP_USE_ID);
2003 *text_pp = NULL;
2004 ret_status = RV_NOT_SUPPORTED;
2005 break;
2006 }
2007 }
2008 break;
2009 }
2010 default:
2011 {
2012 rvf_send_trace ("ATP : Received an unknown command ",
2013 34,
2014 NULL_PARAM,
2015 RV_TRACE_LEVEL_WARNING,
2016 ATP_USE_ID);
2017 *text_pp = NULL;
2018 ret_status = RV_NOT_SUPPORTED;
2019 break;
2020 }
2021 }
2022
2023 /* If needed, free the buffer describing the command in interpreted format. */
2024 if (cmd_info_p != NULL)
2025 {
2026 rvf_free_buf (cmd_info_p);
2027 cmd_info_p = NULL;
2028 }
2029 return (ret_status);
2030
2031 } /****************** End of atp_translate_cmd_to_txt function ******************/
2032
2033
2034 /********************************************************************************
2035 * Function name : atp_copy_buffer
2036 *
2037 * Description : Copy 'data size' bytes of 'in buffer' to 'out buffer'
2038 *
2039 * Parameters : in_buffer_p = buffer to copy from
2040 * out_buffer_p = new buffer
2041 * data_size = number of bytes to be copied
2042 *
2043 * Return : RV_OK
2044 *
2045 * History : 0.1 (05-May-2000) - Created
2046 *
2047 *********************************************************************************/
2048 T_ATP_RET atp_copy_buffer (UINT8 *in_buffer_p,
2049 UINT8 *out_buffer_p,
2050 UINT32 data_size)
2051 {
2052
2053 /************************ atp_copy_buffer function begins ***********************/
2054
2055 memcpy ((void *) out_buffer_p,
2056 (void *) in_buffer_p,
2057 data_size);
2058 return (RV_OK);
2059
2060 } /*********************** End of atp_copy_buffer function **********************/
2061
2062
2063 /********************************************************************************
2064 * Function name : atp_create_data_buffer_from_cmd
2065 *
2066 * Description : create a data buffer based on port features and on the command
2067 * which is interpreted or in text format
2068 *
2069 * Parameters : cmd_mode = interpreted or text
2070 * header = header size
2071 * trailer = trailer size
2072 * dce_info_p = pointer on the DCE information
2073 * mb_id = memory bank used to get the data buffer
2074 * cmd_type = type of the command
2075 * cmd_nb = related binary code of the command (not used if TXT
2076 * format)
2077 * text_p = pointer on the text string (0-terminated) (not used
2078 * if INTERPRETED format)
2079 * cmd_info_p = pointer on the custom command information structure
2080 * (not used if TXT format)
2081 * buffer_pp = pointer on the data buffer generated by the function
2082 * length_p = length of the data buffer
2083 *
2084 * Return : RV_OK,
2085 * RV_NOT_SUPPORTED if the command is not recognized
2086 *
2087 * History : 0.1 (01-March-2000) - Created
2088 *
2089 *********************************************************************************/
2090 T_ATP_RET atp_create_data_buffer_from_cmd (T_ATP_CMD_MODE cmd_mode,
2091 UINT16 header,
2092 UINT16 trailer,
2093 T_ATP_DCE_INFO *dce_info_p,
2094 T_RVF_MB_ID mb_id,
2095 T_ATP_CMD_TYPE cmd_type,
2096 T_ATP_CMD_NB cmd_nb,
2097 T_ATP_TXT_CMD text_p,
2098 T_ATP_CMD *cmd_info_p,
2099 T_ATP_BUFFER *buffer_pp,
2100 UINT16 *length_p)
2101 {
2102 /* Declare local variables. */
2103 UINT16 txt_length = 0x0000;
2104 T_ATP_BUFFER atp_buffer_p = NULL;
2105 T_ATP_TXT_CMD text_cmd_p = NULL;
2106
2107 /**************** atp_create_data_buffer_from_cmd function begins ***************/
2108
2109 /* Need to have the command type provided. */
2110 if (cmd_type == UNKNOWN)
2111 {
2112 return (RV_NOT_SUPPORTED);
2113 }
2114
2115 /* Get text version of the AT command and point on it via text_cmd_p. If */
2116 /* the command has been provided already in text format, then... */
2117 if (cmd_mode == TXT_MODE)
2118 {
2119 text_cmd_p = text_p;
2120
2121 /* The length does not include '\x00'. */
2122 txt_length = (UINT16) (strlen (text_cmd_p));
2123 }
2124 else
2125 {
2126
2127 /* Declare a local block variable. */
2128 T_ATP_RET ret_status = RV_OK;
2129
2130 /* Translate the command into text. */
2131 ret_status = atp_translate_cmd_to_txt (cmd_type,
2132 cmd_nb,
2133 cmd_info_p,
2134 mb_id,
2135 &text_cmd_p,
2136 &txt_length);
2137
2138 /* If any error occurred, then abort. */
2139 if (ret_status != RV_OK)
2140 {
2141 return (RV_NOT_SUPPORTED);
2142 }
2143 }
2144
2145 /* Create real buffer to send for a AT Command. */
2146 switch (dce_info_p->verbose_mode)
2147 {
2148
2149 /* Verbose responses enabled. */
2150 case ATP_VERBOSE_0:
2151 {
2152 switch (cmd_type)
2153 {
2154
2155 /* DCE responses (See ITU-T Recommendation V.250 ter page */
2156 /* 10). */
2157 case RESULT_CODE:
2158 case UNSOLICITED_RESULT:
2159 {
2160 *length_p = (UINT16) (trailer + header + 0x0002);
2161
2162 /* Create buffer and copy text string into it. If */
2163 /* insufficient resources available, then report an */
2164 /* internal memory error and abort. */
2165 if (rvf_get_buf (mb_id, \
2166 *length_p, \
2167 (void **) buffer_pp) == RVF_RED)
2168 {
2169 *length_p = 0x0000;
2170 atp_error (ATP_ERROR_TX_MB_RED);
2171 return (RV_MEMORY_ERR);
2172 }
2173 atp_buffer_p = *buffer_pp;
2174
2175 /* Add code. */
2176 atp_buffer_p[header] = (char) (cmd_nb + '0');
2177
2178 /* Add special characters. */
2179 atp_buffer_p[header + 0x0001] = dce_info_p->cr_character;
2180
2181 /* Release text buffer. */
2182 rvf_free_buf (text_cmd_p);
2183 return (RV_OK);
2184 }
2185 case PRELIMINARY_RESULT_CODE:
2186 {
2187
2188 /* Add 2 special characters <CR> and <LF>. */
2189 *length_p = (UINT16) (trailer + header + txt_length + 0x0002);
2190
2191 /* Create buffer and copy text string into it. If */
2192 /* insufficient resources available, then report an */
2193 /* internal memory error and abort. */
2194 if (rvf_get_buf (mb_id, \
2195 *length_p, \
2196 (void **) buffer_pp) == RVF_RED)
2197 {
2198 *length_p = 0x0000;
2199 atp_error (ATP_ERROR_TX_MB_RED);
2200 return (RV_MEMORY_ERR);
2201 }
2202 atp_buffer_p = *buffer_pp;
2203
2204 /* Copy text into the buffer. */
2205 memcpy ((void *) (atp_buffer_p + header),
2206 (void *) text_cmd_p,
2207 txt_length);
2208
2209 /* Add special characters. */
2210 atp_buffer_p[header + txt_length] = dce_info_p->cr_character;
2211 atp_buffer_p[header + txt_length + 0x0001] = dce_info_p->lf_character;
2212
2213 /* Release text buffer. */
2214 rvf_free_buf (text_cmd_p);
2215 return (RV_OK);
2216 }
2217 default:
2218 {
2219 break;
2220 }
2221 }
2222 }
2223
2224 /* Verbose responses disabled. */
2225 case ATP_VERBOSE_1:
2226 {
2227 switch (cmd_type)
2228 {
2229
2230 /* DTE command lines (See ITU-T Recommendation V.250 ter */
2231 /* page 4). */
2232 case AT_CMD:
2233 {
2234
2235 /* The buffer contains AT command and <CR> */
2236 /* character. */
2237 *length_p = (UINT16) (trailer + header + txt_length + 0x0001);
2238
2239 /* Create buffer and copy text string into it. If */
2240 /* insufficient resources available, then report an */
2241 /* internal memory error and abort. */
2242 if (rvf_get_buf (mb_id, \
2243 *length_p, \
2244 (void **) buffer_pp) == RVF_RED)
2245 {
2246 *length_p = 0x0000;
2247 atp_error (ATP_ERROR_TX_MB_RED);
2248 return (RV_MEMORY_ERR);
2249 }
2250 atp_buffer_p = *buffer_pp;
2251
2252 /* Copy text into the buffer. */
2253 memcpy ((void *) (atp_buffer_p + header),
2254 (void *) text_cmd_p,
2255 txt_length);
2256
2257 /* Add special characters. */
2258 atp_buffer_p[header + txt_length] = dce_info_p->cr_character;
2259
2260 /* Release text buffer. */
2261 rvf_free_buf (text_cmd_p);
2262 return (RV_OK);
2263 }
2264
2265 /* DCE responses (See ITU-T Recommendation V.250 ter page */
2266 /* 10). */
2267 case RESULT_CODE:
2268 case UNSOLICITED_RESULT:
2269 case PRELIMINARY_RESULT_CODE:
2270 {
2271
2272 /* Add 4 special characters <CR> and <LF> (twice). */
2273 *length_p = (UINT16) (trailer + header + txt_length + 0x0004);
2274
2275 /* Create buffer and copy text string into it. If */
2276 /* insufficient resources available, then report an */
2277 /* internal memory error and abort. */
2278 if (rvf_get_buf (mb_id, \
2279 *length_p, \
2280 (void **) buffer_pp) == RVF_RED)
2281 {
2282 *length_p = 0x0000;
2283 atp_error (ATP_ERROR_TX_MB_RED);
2284 return (RV_MEMORY_ERR);
2285 }
2286 atp_buffer_p = *buffer_pp;
2287
2288 /* Copy text into the buffer. */
2289 memcpy ((void *) (atp_buffer_p + header + 0x0002),
2290 (void *) text_cmd_p,
2291 txt_length);
2292
2293 /* Add special characters. */
2294 atp_buffer_p[header] = dce_info_p->cr_character;
2295 atp_buffer_p[header + 0x0001] = dce_info_p->lf_character;
2296 atp_buffer_p[header + txt_length + 0x0002] = dce_info_p->cr_character;
2297 atp_buffer_p[header + txt_length + 0x0003] = dce_info_p->lf_character;
2298
2299 /* Release text buffer. */
2300 rvf_free_buf (text_cmd_p);
2301 return (RV_OK);
2302 }
2303 default:
2304 {
2305 rvf_send_trace ("ATP : Tried to create a buffer for an unknown command ",
2306 54,
2307 NULL_PARAM,
2308 RV_TRACE_LEVEL_WARNING,
2309 ATP_USE_ID);
2310 *length_p = 0x0000;
2311 *buffer_pp = NULL;
2312 break;
2313 }
2314 }
2315 break;
2316 }
2317 default:
2318 {
2319 rvf_send_trace ("ATP : Verbose mode invalid ",
2320 27,
2321 NULL_PARAM,
2322 RV_TRACE_LEVEL_WARNING,
2323 ATP_USE_ID);
2324 *length_p = 0x0000;
2325 *buffer_pp = NULL;
2326 break;
2327 }
2328 }
2329 return (RV_NOT_SUPPORTED);
2330
2331 } /*************** End of atp_create_data_buffer_from_cmd function **************/
2332
2333
2334 /********************************************************************************
2335 * Function name : atp_copy_buffer_from_l2cap
2336 *
2337 * Description : Check the text command
2338 *
2339 * Parameters : l2cap_buffer_p = type is L2CAP_ACL_DATA
2340 * copy_buffer_p = pointer on the buffer to copy data in
2341 * buffer_length = data length to read
2342 *
2343 * Return : RV_OK if it fits
2344 *
2345 * Note : l2cap_buffer_p is not freed by this function !
2346 *
2347 * History : 0.1 (21-March-2000) - Created
2348 *
2349 *********************************************************************************/
2350 T_ATP_RET atp_copy_buffer_from_l2cap (void *l2cap_buffer_p,
2351 void *copy_buffer_p,
2352 UINT32 buffer_length,
2353 UINT32 offset)
2354 {
2355
2356 #ifdef BLUETOOTH
2357
2358 /* Declare local variables. */
2359 UINT16 nb_byte = 0x0000;
2360 T_RECV_DATA_ADDR acl_data_p = {NULL, \
2361 NULL};
2362
2363 /****************** atp_copy_buffer_from_l2cap function begins ******************/
2364
2365 rvf_send_trace ("ATP : Translate L2CAP buffer into a ATP buffer ",
2366 47,
2367 NULL_PARAM,
2368 RV_TRACE_LEVEL_DEBUG_LOW,
2369 ATP_USE_ID);
2370 l2cap_read_next_uint ((T_L2CAP_ACL_DATA *) l2cap_buffer_p,
2371 sizeof (UINT8),
2372 ((UINT8 *) copy_buffer_p),
2373 &acl_data_p,
2374 (UINT8) offset);
2375 for (nb_byte = 1;
2376 nb_byte < buffer_length;
2377 nb_byte++)
2378 {
2379 l2cap_read_next_uint ((T_L2CAP_ACL_DATA *) l2cap_buffer_p,
2380 sizeof (UINT8),
2381 ((UINT8 *) copy_buffer_p) + nb_byte,
2382 &acl_data_p,
2383 0x0000);
2384 }
2385 return (RV_OK);
2386 #else
2387 rvf_send_trace ("ATP : Tried to read buffer in L2CAP format whereas Bluetooth is not enabled ",
2388 76,
2389 NULL_PARAM,
2390 RV_TRACE_LEVEL_WARNING,
2391 ATP_USE_ID);
2392 return (RV_NOT_SUPPORTED);
2393 #endif
2394
2395 } /***************** End of atp_copy_buffer_from_l2cap function *****************/
2396
2397
2398 /********************************************************************************
2399 * Function name : atp_free_l2cap_buffer
2400 *
2401 * Description : Release a L2CAP buffer
2402 *
2403 * Parameter : l2cap_buffer_p = type is L2CAP_ACL_DATA
2404 *
2405 * Return : RV_OK if free is OK
2406 *
2407 * History : 0.1 (19-Dec-2001) - Created
2408 *
2409 *********************************************************************************/
2410 T_ATP_RET atp_free_l2cap_buffer (UINT8 *atp_buffer_p)
2411 {
2412
2413 /********************* atp_free_l2cap_buffer function begins ********************/
2414
2415 #ifdef BLUETOOTH
2416 return ((T_ATP_RET) (l2cap_free_data ((T_L2CAP_ACL_DATA *) atp_buffer_p)));
2417 #else
2418 rvf_send_trace ("ATP : Tried to read buffer in L2CAP format whereas Bluetooth is not enabled ",
2419 76,
2420 NULL_PARAM,
2421 RV_TRACE_LEVEL_WARNING,
2422 ATP_USE_ID);
2423 return (RV_NOT_SUPPORTED);
2424 #endif
2425
2426 } /******************** End of atp_free_l2cap_buffer function *******************/
2427
2428
2429 /********************************************************************************
2430 * Function name : atp_escape_sequence_process
2431 *
2432 * Description : This function is used to detect the escape sequence in the data
2433 * flow. This function should not be called if the port is not
2434 * configured in DCE mode. The escape sequence should start in a new
2435 * packet and the last character of the exit sequence should be the
2436 * last character of a packet. Note that each data buffer checked
2437 * that may be part of the escape sequence is temporarily stored so
2438 * that it can be sent to the SWE later on in case it was the escape
2439 * sequence.
2440 *
2441 * Parameters : port_p = structure of the port
2442 * atp_buffer_p = pointer on the buffer received by ATP (can be a
2443 * NORMAL data packet or a SEGMENTED data packet)
2444 * data_length = number of payload data in the packet pointed by
2445 * atp_buffer_p
2446 * packet_mode = indicates the mode of the data packet (NORMAL or
2447 * SEGMENTED)
2448 *
2449 * Return : ATP_ESCAPE_SEQUENCE_SUCCESS,
2450 * ATP_ESCAPE_SEQUENCE_FAILED otherwise
2451 *
2452 * History : 0.1 (06-Feb-2001) - Created
2453 *
2454 *********************************************************************************/
2455 T_ATP_ESCAPE_SEQUENCE_STATUS atp_escape_sequence_process (T_ATP_PORT_STRUCT *port_p,
2456 UINT8 *atp_buffer_p,
2457 UINT32 data_length,
2458 T_ATP_PACKET_MODE packet_mode)
2459 {
2460 /* Declare local variables. */
2461 UINT8 count = 0;
2462 UINT8 data_sequence[MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE];
2463
2464 /****************** atp_escape_sequence_process function begins *****************/
2465
2466 /* Check the sequence. Indeed, there are data after the last character of */
2467 /* the escape sequence. */
2468 if (((port_p->dce_info_p)->nb_plus_received + data_length) > MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE)
2469 {
2470 return (ATP_ESCAPE_SEQUENCE_FAILED);
2471 }
2472
2473 /* Get data from the buffer. */
2474 if (packet_mode == SEGMENTED_PACKET)
2475 {
2476 atp_copy_buffer_from_l2cap (atp_buffer_p,
2477 data_sequence,
2478 data_length,
2479 0);
2480 }
2481 else
2482 {
2483 memcpy (data_sequence,
2484 atp_buffer_p,
2485 data_length);
2486 }
2487
2488 /* Check every character. */
2489 for (count = 0;
2490 count < data_length;
2491 count++)
2492 {
2493 if (data_sequence[count] != (port_p->dce_info_p)->escape_sequence[count + (port_p->dce_info_p)->nb_plus_received])
2494 {
2495 return (ATP_ESCAPE_SEQUENCE_FAILED);
2496 }
2497 }
2498
2499 /* Keep temporarily the pointer on the buffer. */
2500 for (count = 0;
2501 (port_p->dce_info_p)->escape_sequence_tmp_buffer_p[count] != NULL;
2502 count++);
2503 (port_p->dce_info_p)->escape_sequence_tmp_buffer_p[count] = atp_buffer_p;
2504 (port_p->dce_info_p)->length_of_escape_sequence_tmp_buffer_p[count] = (UINT8) data_length;
2505 if (((port_p->dce_info_p)->nb_plus_received + data_length) != MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE)
2506 {
2507 (port_p->dce_info_p)->nb_plus_received = (UINT8) ((port_p->dce_info_p)->nb_plus_received + data_length);
2508 return (ATP_ESCAPE_SEQUENCE_WAIT);
2509 }
2510
2511 /* Otherwise, all characters have been found. */
2512 return (ATP_ESCAPE_SEQUENCE_SUCCESS);
2513
2514 } /***************** End of atp_escape_sequence_process function ****************/
2515
2516
2517 /********************************************************************************
2518 * Function name : atp_pipe_extra_character
2519 *
2520 * Description : This function is called when it has been found that the escape
2521 * sequence search has failed and when other SWE is in copy mode.
2522 * In this case, data that has been received and that have not been
2523 * sent to the other SWE because we thought they may contain the
2524 * escape sequence must finally be sent.
2525 * For this reason, all the buffer to sent has been previously stored
2526 * in a temporary buffer called dce_info_p->escape_sequence_tmp_buffer_p.
2527 * This function pipes all this buffer into the data pipe of the SWE.
2528 * Note that such a complex mechanism is essentially due to the fact
2529 * that we may have to deal with L2CAP packet (SEGMENTED_MODE).
2530 *
2531 * Parameters : port_p = pointer on the port structure
2532 * other_port_info_p = pointer on the port information structure of
2533 * the SWE which will receive the data.
2534 *
2535 * Return : RV_OK
2536 *
2537 * History : 0.1 (01-March-2000) - Created
2538 *
2539 *********************************************************************************/
2540 T_ATP_RET atp_pipe_extra_character (T_ATP_PORT_STRUCT *port_p,
2541 T_ATP_PORT_END_STRUCT *other_port_info_p)
2542 {
2543 /* Declare local variables. */
2544 UINT8 count = 0;
2545 UINT8 nb_packet = 0;
2546 T_ATP_RX_PACKET *rx_packet_p = NULL;
2547
2548 /******************* atp_pipe_extra_character function begins *******************/
2549
2550 for (nb_packet = 0;
2551 ((port_p->dce_info_p)->escape_sequence_tmp_buffer_p[nb_packet] != NULL) && \
2552 (nb_packet < MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE);
2553 nb_packet++);
2554 for (count = 0; count < nb_packet; count++)
2555 {
2556 if (rvf_get_buf (other_port_info_p->rx_mb, \
2557 sizeof (T_ATP_RX_PACKET), \
2558 (void **) &rx_packet_p) == RVF_RED)
2559 {
2560 atp_error_switch (ATP_ERROR_FAILED_TO_SEND_DATA,
2561 ATP_MEMORY_ERROR,NULL);
2562 return (RV_MEMORY_ERR);
2563 }
2564 rx_packet_p->first_byte = 0;
2565 rx_packet_p->last_byte = ((port_p->dce_info_p)->length_of_escape_sequence_tmp_buffer_p[count]) - 1;
2566 rx_packet_p->atp_buffer_p = (port_p->dce_info_p)->escape_sequence_tmp_buffer_p[count];
2567 rx_packet_p->next_byte_to_read = rx_packet_p->first_byte;
2568 rvf_enqueue (&(other_port_info_p->rx_queue),
2569 rx_packet_p);
2570 other_port_info_p->rx_data_left += (port_p->dce_info_p)->length_of_escape_sequence_tmp_buffer_p[count];
2571 }
2572 return (RV_OK);
2573
2574 } /****************** End of atp_pipe_extra_character function ******************/
2575
2576
2577 /********************************************************************************
2578 * Function name : atp_reset_escape_sequence
2579 *
2580 * Description : This function resets all internal values used by the algorithm
2581 * of escape sequence search (information stored in the dce_info_p
2582 * structure)
2583 *
2584 * Parameter : port_p = pointer on the port structure
2585 *
2586 * Return : RV_OK
2587 *
2588 * History : 0.1 (01-March-2000) - Created
2589 *
2590 *********************************************************************************/
2591 T_ATP_RET atp_reset_escape_sequence (T_ATP_PORT_STRUCT *port_p)
2592 {
2593 /* Declare local variables. */
2594 UINT8 count = 0;
2595 UINT8 *buffer_p = NULL;
2596
2597 /******************* atp_reset_escape_sequence function begins ******************/
2598
2599 (port_p->dce_info_p)->nb_plus_received = 0;
2600
2601 /* Clear pointers on temporary buffer containing potentially escape */
2602 /* sequence. */
2603 for (count = 0;
2604 count < MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE;
2605 count++)
2606 {
2607 if ((buffer_p = (port_p->dce_info_p)->escape_sequence_tmp_buffer_p[count]) != NULL)
2608 {
2609
2610 #ifdef BLUETOOTH
2611
2612 /* Check if the buffer has been issued by SPP. Not very clean way to */
2613 /* check what is the packet mode. */
2614 if ((strcmp ((char *) atp_sw_entity_table_p[(port_p->port_info[0]).sw_id]->sw_entity_name, \
2615 ATP_SPP_NAME) == 0) || \
2616 (strcmp ((char *) atp_sw_entity_table_p[(port_p->port_info[1]).sw_id]->sw_entity_name, \
2617 ATP_SPP_NAME) == 0))
2618 {
2619
2620 /* Mode is SEGMENTED PACKET. */
2621 l2cap_free_data ((T_L2CAP_ACL_DATA *) buffer_p);
2622 }
2623 else
2624 {
2625
2626 /* Mode is NORMAL_PACKET. */
2627 rvf_free_buf (buffer_p);
2628 }
2629 #else
2630 rvf_free_buf (buffer_p);
2631 #endif
2632 (port_p->dce_info_p)->escape_sequence_tmp_buffer_p[count] = NULL;
2633 (port_p->dce_info_p)->length_of_escape_sequence_tmp_buffer_p[count] = 0;
2634 }
2635 }
2636 return (RV_OK);
2637
2638 } /****************** End of atp_reset_escape_sequence function ******************/