comparison gsm-fw/g23m-aci/aci/aci_aci.c @ 775:eedbf248bac0

gsm-fw/g23m-aci subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 12 Oct 2014 01:45:14 +0000
parents
children 286567fb2ab8
comparison
equal deleted inserted replaced
774:40a721fd9854 775:eedbf248bac0
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : ACI
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This Modul holds the main functions
18 | for the AT Command Interpreter
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef ACI_ACI_C
23 #define ACI_ACI_C
24
25 #include "aci_all.h"
26
27 #include "aci_cmh.h"
28 #ifdef _SIMULATION_
29 #include "dti.h"
30 #include "dti_conn_mng.h"
31
32 #ifdef UART
33 #include "psa_uart.h"
34 #endif
35
36 #ifdef FF_PSI
37 #include "psa_psi.h"
38 #endif /*FF_PSI*/
39 #include "ati_src_tst.h"
40 #endif
41
42 #ifdef FAX_AND_DATA
43 #include "aci_fd.h"
44 #endif /* of #ifdef FAX_AND_DATA */
45
46
47 #include "psa.h"
48 #include "psa_cc.h"
49 #include "cmh.h"
50 #include "cmh_cc.h"
51 #include "aci_lst.h"
52 #include "ati_cmd.h"
53 #include "ati_ext_mech.h"
54
55 #ifdef FF_ATI
56 #include "aci_io.h"
57 #endif
58
59 #ifdef FAX_AND_DATA
60 #include "psa_ra.h"
61 #include "cmh_ra.h"
62 #endif /* of #ifdef FAX_AND_DATA */
63
64 #ifdef BT_ADAPTER
65 #include "dti.h"
66
67 #include "bti.h"
68 #include "bti_int.h"
69 #include "bti_aci.h"
70 #include "ati_src_bt.h"
71 #endif
72
73
74 #ifdef FF_ATI_BAT
75 #include "p_bat.h"
76 #include "aci_bat.h"
77 #ifdef _SIMULATION_
78 #include "line_edit.h"
79 #include "ati_bat.h"
80 #endif
81 #endif
82
83
84 /*===== EXPORT =====================================================*/
85 /*===== PRIVATE ====================================================*/
86
87 /*===== VARIABLES ==================================================*/
88 T_ACI_CMD_MODE _mode=CMD_MODE_NONE;
89 UBYTE srcId_cb;
90 GLOBAL BOOL _g_ati_trc_enabled = FALSE;
91
92 /* 0 (CMD_SRC_LCL) are reserved */
93 GLOBAL USHORT used_sources = 1;
94
95 /*===== EXTERNALS ==================================================*/
96 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
97 EXTERN T_ACI_LIST *ati_src_list;
98 #endif
99
100 /*===== FUNCTIONS ==================================================*/
101
102 /*
103 +--------------------------------------------------------------------+
104 | PROJECT : GSM-F&D (8411) MODULE : ACI |
105 | STATE : code ROUTINE : aci_aci_cmd_req |
106 +--------------------------------------------------------------------+
107
108 PURPOSE : handle ACI command request primitive. It is only a
109 signal and must not be freed by PFREE.
110
111 */
112
113 GLOBAL void aci_aci_cmd_req (T_ACI_CMD_REQ *cmd)
114 {
115 TRACE_FUNCTION("aci_aci_cmd_req()");
116
117 #ifdef FF_ATI
118 if ( cmd->cmd_len < MAX_TRC_LEN )
119 {
120 cmd->cmd_seq[cmd->cmd_len] = '\0';
121 TRACE_EVENT_P1 ("%s", cmd->cmd_seq);
122 }
123 #ifdef DTI
124 #ifdef _SIMULATION_
125 if (cmd->cmd_src >= CMD_SRC_EXT AND cmd->cmd_src <= MAX_TST_SRC)
126 {
127 #ifdef FF_ATI_BAT
128 U8 src_id = tst_src_id[cmd->cmd_src - 1];
129 #endif
130 ati_src_tst_proc_cmd (cmd);
131 #ifdef FF_ATI_BAT
132 if (aci_cmd_src_mode_get(src_id) EQ CMD_MODE_BAT) /* simulation with BAT library */
133 {
134 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, src_id, search_ati_src_id);
135 T_ACI_DTI_PRC_PSI *src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId);
136 while (ledit_ctrl(src_params->src_id,LEDIT_CTRL_MORE_CMDS, NULL) EQ LEDIT_CMPL)
137 {
138 ati_bat_response_simulation(&(src_infos_psi->res)); /* intermediate response */
139 }
140 if (src_params->cmd_state NEQ CMD_IDLE)
141 {
142 if (src_infos_psi->res.response AND (src_params->curAtCmd NEQ AT_CMD_CMGS))
143 {
144 ati_bat_response_simulation(&(src_infos_psi->res)); /* final response */
145 Perform_ati_bat_maint(src_id);
146 }
147 src_infos_psi->bat_client[src_infos_psi->active_client].curCmd = (T_BAT_ctrl_params)-1;
148 }
149 }
150 #endif /* FF_ATI_BAT */
151 }
152 else
153 {
154 TRACE_EVENT_P1 ("aci_aci_cmd_req(): [WRN] srcId=%d, but must be 0x01 or 0x02", cmd->cmd_src);
155 }
156 #endif /* _SIMULATION_ */
157 #endif /* DTI */
158 #endif
159
160 PFREE (cmd);
161
162 }
163
164 /*
165 +--------------------------------------------------------------------+
166 | PROJECT : GSM-F&D (8411) MODULE : ACI |
167 | STATE : code ROUTINE : aci_aci_cmd_req |
168 +--------------------------------------------------------------------+
169
170 PURPOSE : handle ACI command request primitive. It is only a
171 signal and must not be freed by PFREE.
172
173 */
174 #ifdef BT_ADAPTER
175 GLOBAL void aci_aci_cmd_req_bt (T_ACI_CMD_REQ_BT *cmd)
176 {
177 TRACE_FUNCTION("aci_aci_cmd_req_bt()");
178
179 #ifdef FF_ATI
180 if ( cmd->cmd_len <= 80 )
181 {
182 if( !strchr((char *)cmd->cmd_seq,'%'))
183 TRACE_EVENT ((char *)cmd->cmd_seq);
184 }
185
186 if (cmd->cmd_src EQ CMD_SRC_EXT)
187 {
188 ati_src_bt_proc_cmd(cmd);
189 }
190
191 #endif
192 PFREE(cmd);
193 }
194 #endif /* BT_ADAPTER */
195
196 /*
197 +--------------------------------------------------------------------+
198 | PROJECT : GSM-F&D (8411) MODULE : ACI |
199 | STATE : code ROUTINE : aci_aci_abort_req |
200 +--------------------------------------------------------------------+
201
202 PURPOSE : handle aci data mode abort request
203
204 */
205
206 GLOBAL void aci_aci_abort_req (T_ACI_ABORT_REQ *aci_abort_req)
207 {
208 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
209 EXTERN void aciAbort (UBYTE srcId);
210 #endif
211
212 UBYTE srcId;
213
214 TRACE_FUNCTION ("aci_aci_abort_req()");
215
216 srcId = aci_abort_req->cmd_src;
217
218 #ifdef DTI
219 #ifdef _SIMULATION_
220 if (srcId >= CMD_SRC_EXT AND srcId <= MAX_TST_SRC)
221 {
222 ati_src_tst_abort(srcId);
223 return;
224 }
225 #endif /* _SIMULATION_ */
226 #endif /* DTI */
227
228 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
229 if (aci_abort_req->cause EQ ABT_ABORT_CMD)
230 aciAbort (srcId);
231 #endif
232
233 #ifdef FAX_AND_DATA
234 if (aci_abort_req->cause EQ ABT_ABORT_DATA)
235 cmhRA_Escape ();
236 #endif
237
238 #ifdef BT_ADAPTER
239 btiaci_at_abort_res(srcId);
240 #endif /* BT_ADAPTER */
241
242 PFREE (aci_abort_req);
243
244 }
245
246
247 /*
248 +--------------------------------------------------------------------+
249 | PROJECT : GSM-F&D (8411) MODULE : ACI |
250 | STATE : code ROUTINE : aci_aci_abort_req |
251 +--------------------------------------------------------------------+
252
253 PURPOSE : handle aci (data mode) abort request for BT
254
255 */
256 #ifdef BT_ADAPTER
257 GLOBAL void aci_aci_abort_req_bt (T_ACI_ABORT_REQ_BT *aci_abort_req)
258 {
259 /* EXTERN void aciAbort (UBYTE srcId);*/
260
261 UBYTE srcId;
262
263 TRACE_FUNCTION ("aci_aci_abort_req_bt()");
264
265 srcId = aci_abort_req->src_id;
266
267 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
268 if (aci_abort_req->cause EQ ABT_ABORT_CMD)
269 aciAbort (srcId);
270 #endif
271
272 #ifdef FAX_AND_DATA
273 if (aci_abort_req->cause EQ ABT_ABORT_DATA)
274 cmhRA_Escape ();
275 #endif
276
277 btiaci_at_abort_res(get_port_by_srcID(srcId));
278
279
280 PFREE (aci_abort_req);
281
282 }
283 #endif /* BT_ADAPTER */
284
285 #ifdef FF_ATI
286
287 GLOBAL UBYTE aci_init (T_ATI_SRC_TYPE src_type)
288 {
289 int i;
290 UBYTE tst_src;
291
292 TRACE_FUNCTION ("aci_init ()");
293
294 #ifdef _SIMULATION_
295 if (src_type EQ ATI_SRC_TYPE_TST)
296 {
297 for (i = (CMD_SRC_MAX-1); i >= 0; i--)
298 {
299 tst_src = (0x01 << i) & used_sources;
300 if (!tst_src)
301 break;
302 }
303 if (tst_src)
304 {
305 return (0);
306 }
307
308 used_sources |= (0x01 << i);
309 return (UBYTE) (i);
310 }
311 #endif
312
313 for (i = 0; i < CMD_SRC_MAX; i++)
314 {
315 tst_src = (0x01 << i) & used_sources;
316 if (!tst_src)
317 break;
318 }
319 if (tst_src)
320 {
321 TRACE_EVENT_P1("No more sources available ! used_sources: %04X", used_sources);
322 return (0);
323 }
324 used_sources |= (0x01 << i);
325
326 if (src_type EQ ATI_SRC_TYPE_BLUETOOTH)
327 {
328 used_sources |= (0x01 << (i + 8));
329 }
330
331 TRACE_EVENT_P2("New source %d ! used_sources: %04X", i, used_sources);
332 return (i);
333 }
334
335 #endif /* FF_ATI */
336
337 GLOBAL void aci_finit (UBYTE src_id)
338 {
339 UBYTE tst_src;
340
341 TRACE_FUNCTION ("aci_finit ()");
342
343 tst_src = 0x01 << src_id;
344 if (!(used_sources & tst_src))
345 {
346 TRACE_EVENT ("[ERR] aci_finit(): invalid source");
347 return;
348 }
349 used_sources = used_sources & ~tst_src;
350
351 /* for BT */
352 tst_src = 0x01 << (src_id + 8);
353 used_sources = used_sources & ~tst_src;
354 }
355
356
357 #ifdef BT_ADAPTER
358 /*
359 +--------------------------------------------------------------------+
360 | PROJECT : GSM-F&D (8411) MODULE : ACI |
361 | STATE : code ROUTINE : aci_aci_cmd_res |
362 +--------------------------------------------------------------------+
363
364 PURPOSE : handle aci_cmd_res
365
366 */
367
368 GLOBAL void aci_aci_cmd_res (T_ACI_CMD_RES *aci_cmd_res)
369 {
370 TRACE_FUNCTION ("aci_aci_cmd_res()");
371
372 /*
373 This is currently just ignored !
374 Actually ACI_CMD_RES is an acknowledgement for ACI_CMD_IND. It should
375 be used to determine if an ACI_CMD_IND may be sent. After sending one
376 ACI_CMD_IND should wait for ACI_CMD_RES before another ACI_CMD_IND may
377 be sent. This behaviour shall be implemented later.
378 */
379 PFREE (aci_cmd_res);
380
381 }
382 /*
383 +--------------------------------------------------------------------+
384 | PROJECT : GSM-F&D (8411) MODULE : ACI |
385 | STATE : code ROUTINE : aci_aci_cmd_res |
386 +--------------------------------------------------------------------+
387
388 PURPOSE : handle aci_cmd_res_bt
389
390 */
391
392 GLOBAL void aci_aci_cmd_res_bt (T_ACI_CMD_RES_BT *aci_cmd_res)
393 {
394
395 ULONG port_nb;
396 T_ATI_BT_OUTPUT *cur_cmd;
397
398 TRACE_FUNCTION ("aci_aci_cmd_res()");
399
400 /*
401 This is currently just ignored !
402 Actually ACI_CMD_RES is an acknowledgement for ACI_CMD_IND. It should
403 be used to determine if an ACI_CMD_IND may be sent. After sending one
404 ACI_CMD_IND should wait for ACI_CMD_RES before another ACI_CMD_IND may
405 be sent. This behaviour shall be implemented later.
406 */
407
408 port_nb = get_port_by_srcID(aci_cmd_res->src_id);
409 PFREE (aci_cmd_res);
410
411 if (bti_port_table[port_nb].atqueue EQ NULL)
412 {
413 bti_port_table[port_nb].at_flow_on = TRUE;
414 TRACE_EVENT("BTA queue empty");
415 return;
416 }
417
418 cur_cmd = bti_port_table[port_nb].atqueue;
419
420 if (cur_cmd->output_type & ATI_BT_CONFIRM_COMMAND)
421 {
422 TRACE_EVENT("BTA confirm in queue");
423 bti_port_table[port_nb].atqueue = cur_cmd->next;
424
425 btiaci_at_cmd_res(port_nb, (char *)(cur_cmd->output));
426 MFREE(cur_cmd);
427
428 if (bti_port_table[port_nb].atqueue EQ NULL)
429 {
430 TRACE_EVENT("BTA queue empty");
431 bti_port_table[port_nb].at_flow_on = TRUE;
432 return;
433 }
434 else
435 {
436 cur_cmd = bti_port_table[port_nb].atqueue;
437 }
438 }
439
440 if ((cur_cmd->output_type & ATI_BT_NORMAL_COMMAND) ||
441 (cur_cmd->output_type & ATI_BT_INDICATION_COMMAND))
442 {
443 TRACE_EVENT("BTA command in queue");
444 bti_port_table[port_nb].at_flow_on = FALSE;
445
446 bti_port_table[port_nb].atqueue = cur_cmd->next;
447
448 TRACE_EVENT_P1("sending %s", cur_cmd->output);
449 btiaci_at_cmd_req(port_nb, (char *)(cur_cmd->output));
450 MFREE(cur_cmd);
451
452 #ifdef _SIMULATION_
453 cur_cmd = bti_port_table[port_nb].atqueue;
454 while (cur_cmd->next NEQ NULL) /* search end of queue */
455 {
456 TRACE_EVENT_P1("in queue: %s", cur_cmd->output); /* just for debugging */
457 cur_cmd = cur_cmd->next;
458 }
459 #endif
460
461 }
462 return;
463 }
464
465 /*
466 +--------------------------------------------------------------------+
467 | PROJECT : GSM-F&D (8411) MODULE : ACI |
468 | STATE : code ROUTINE : aci_aci_init_res |
469 +--------------------------------------------------------------------+
470
471 PURPOSE : handle aci_init_res
472
473 */
474
475 GLOBAL void aci_aci_init_res (T_ACI_INIT_RES *aci_init_res)
476 {
477 TRACE_FUNCTION ("aci_aci_init_res()");
478
479 PFREE (aci_init_res);
480 }
481
482 /*
483 +--------------------------------------------------------------------+
484 | PROJECT : GSM-F&D (8411) MODULE : ACI |
485 | STATE : code ROUTINE : aci_aci_deinit_req |
486 +--------------------------------------------------------------------+
487
488 PURPOSE : handle aci_deinit_req
489
490 */
491
492 GLOBAL void aci_aci_deinit_req (T_ACI_DEINIT_REQ *aci_deinit_req)
493 {
494 TRACE_FUNCTION ("aci_aci_deinit_req()");
495
496 io_closePort(0);
497
498 btiaci_at_deinit_res();
499
500 PFREE (aci_deinit_req);
501 }
502
503 /*
504 +--------------------------------------------------------------------+
505 | PROJECT : GSM-F&D (8411) MODULE : ACI |
506 | STATE : code ROUTINE : aci_aci_open_port_req|
507 +--------------------------------------------------------------------+
508
509 PURPOSE : handle aci_open_port_req
510
511 */
512
513 GLOBAL void aci_aci_open_port_req (T_ACI_OPEN_PORT_REQ *aci_open_port_req)
514 {
515 ULONG port;
516 T_BTI_ACK result;
517
518 TRACE_FUNCTION ("aci_aci_open_port_req()");
519
520 port = aci_open_port_req->port_nb;
521
522 result = io_openPort(port);
523
524 PFREE (aci_open_port_req);
525
526 btiaci_at_open_port_res(port, result);
527 }
528
529 /*
530 +--------------------------------------------------------------------+
531 | PROJECT : GSM-F&D (8411) MODULE : ACI |
532 | STATE : code ROUTINE : aci_aci_close_port_req|
533 +--------------------------------------------------------------------+
534
535 PURPOSE : handle aci_close_port_req
536
537 */
538
539 GLOBAL void aci_aci_close_port_req (T_ACI_CLOSE_PORT_REQ *aci_close_port_req)
540 {
541 ULONG port;
542
543 TRACE_FUNCTION ("aci_aci_close_port_req()");
544
545 port = aci_close_port_req->port_nb;
546
547 io_closePort(port);
548
549 PFREE (aci_close_port_req);
550
551 btiaci_at_close_port_res(port);
552 }
553
554 #endif /* BT_ADAPTER */
555
556 /*
557 +--------------------------------------------------------------------+
558 | PROJECT : GSM-F&D (8411) MODULE : ACI |
559 | STATE : code ROUTINE : aci_aci_trc_ind |
560 +--------------------------------------------------------------------+
561
562 PURPOSE : This function call is only relevant for the acia_adater. The acia_adapter
563 sends for every AT-cmd a psignal to aci (task switch).
564
565 */
566 #ifdef FF_MMI_RIV
567
568 EXTERN void acia_callback_for_ACI (void *AT_command_ptr);
569
570 GLOBAL void aci_aci_riv_cmd_req (T_ACI_RIV_CMD_REQ *cmd_ptr)
571 {
572 TRACE_FUNCTION ("aci_aci_riv_cmd_req()");
573
574 acia_callback_for_ACI ((void *)cmd_ptr);
575 }
576 #endif /* FF_MMI_RIV */
577
578 /*
579 +--------------------------------------------------------------------+
580 | PROJECT : GSM-F&D (8411) MODULE : ACI |
581 | STATE : code ROUTINE : aci_aci_trc_ind |
582 +--------------------------------------------------------------------+
583
584 PURPOSE : handle ACI trace indication primitive.
585
586 */
587
588 GLOBAL void aci_aci_trc_ind (T_ACI_TRC_IND *trc_ind)
589 {
590 T_ATI_SRC_PARAMS *src_params;
591
592 TRACE_FUNCTION("aci_aci_trc_ind()");
593
594 if (!_g_ati_trc_enabled)
595 {
596 PFREE (trc_ind);
597 return;
598 }
599
600 trc_ind->trc_buf[MAX_TRC_LEN-1] = '\0';
601
602 #ifdef FF_ATI
603 if ( trc_ind->trc_len >= MAX_TRC_LEN )
604 {
605 UBYTE c;
606 c = trc_ind->trc_buf[MAX_TRC_LEN-1];
607 trc_ind->trc_buf[MAX_TRC_LEN-1] = '\0';
608 TRACE_EVENT_P1 ("%s", trc_ind->trc_buf);
609 trc_ind->trc_buf[MAX_TRC_LEN-1] = c;
610 }
611 else
612 {
613 TRACE_EVENT_P1 ("%s", trc_ind->trc_buf);
614 }
615 #endif /* FF_ATI */
616 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
617 /* check if the src is valid */
618 src_params = find_element (ati_src_list, trc_ind->cmd_src, search_ati_src_id);
619 #ifdef FF_PSI
620 if ((src_params EQ NULL) OR ((src_params->src_type NEQ ATI_SRC_TYPE_UART) AND
621 (src_params->src_type NEQ ATI_SRC_TYPE_PSI)))
622 #else
623 if ((src_params EQ NULL) OR (src_params->src_type NEQ ATI_SRC_TYPE_UART))
624 #endif /*FF_PSI*/
625 {
626 src_params = get_next_element (ati_src_list, NULL);/* first element */
627 while (src_params NEQ NULL)
628 {
629 #ifdef FF_PSI
630 if (src_params->src_type EQ ATI_SRC_TYPE_UART OR src_params->src_type EQ ATI_SRC_TYPE_PSI)
631 #else
632 if (src_params->src_type EQ ATI_SRC_TYPE_UART)
633 #endif /*FF_PSI*/
634 {
635 break;
636 }
637 src_params = get_next_element (ati_src_list, src_params);
638 }
639 }
640
641 if (src_params NEQ NULL)
642 {
643 io_sendIndication(src_params->src_id, (CHAR *)trc_ind->trc_buf, ATI_FORCED_OUTPUT);
644 }
645 #endif /* LOCOSTO_LITE_2_54_COMPILER_ERROR */
646 PFREE (trc_ind);
647 }
648
649
650 /*
651 +--------------------------------------------------------------------+
652 | PROJECT : GSM-F&D (8411) MODULE : ACI |
653 | STATE : code ROUTINE : aci_aci_ext_ind |
654 +--------------------------------------------------------------------+
655
656 PURPOSE : handle ACI extension signal indication primitive.
657
658 */
659
660 GLOBAL void aci_aci_ext_ind (T_ACI_EXT_IND *aci_ext_ind)
661 {
662 TRACE_FUNCTION ("aci_aci_ext_ind()");
663 #ifndef LOCOSTO_LITE_2_54_COMPILER_ERROR
664 rEXT_Signal (aci_ext_ind);
665 #endif
666 PFREE (aci_ext_ind);
667 }
668
669
670
671 #endif /* ACI_ACI_C */