diff src/aci2/aci/aci_aci.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aci2/aci/aci_aci.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,671 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  GSM-F&D (8411)
+|  Modul   :  ACI
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose :  This Modul holds the main functions
+|             for the AT Command Interpreter
++-----------------------------------------------------------------------------
+*/
+
+#ifndef ACI_ACI_C
+#define ACI_ACI_C
+
+#include "aci_all.h"
+
+#include "aci_cmh.h"
+#ifdef _SIMULATION_
+#include "dti.h"
+#include "dti_conn_mng.h"
+
+#ifdef UART
+#include "psa_uart.h"
+#endif
+
+#ifdef FF_PSI
+#include "psa_psi.h"
+#endif /*FF_PSI*/
+#include "ati_src_tst.h"
+#endif
+
+#ifdef FAX_AND_DATA
+#include "aci_fd.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+
+#include "psa.h"
+#include "psa_cc.h"
+#include "cmh.h"
+#include "cmh_cc.h"
+#include "aci_lst.h"
+#include "ati_cmd.h"
+#include "ati_ext_mech.h"
+
+#ifdef FF_ATI
+#include "aci_io.h"
+#endif
+
+#ifdef FAX_AND_DATA
+#include "psa_ra.h"
+#include "cmh_ra.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+#ifdef BT_ADAPTER
+#include "dti.h"
+
+#include "bti.h"
+#include "bti_int.h"
+#include "bti_aci.h"
+#include "ati_src_bt.h"
+#endif
+
+
+#ifdef FF_ATI_BAT
+#include "p_bat.h"
+#include "aci_bat.h"
+#ifdef _SIMULATION_
+#include "line_edit.h"
+#include "ati_bat.h"
+#endif
+#endif
+
+
+/*===== EXPORT =====================================================*/
+/*===== PRIVATE ====================================================*/
+
+/*===== VARIABLES ==================================================*/
+T_ACI_CMD_MODE _mode=CMD_MODE_NONE;
+UBYTE srcId_cb;
+GLOBAL BOOL _g_ati_trc_enabled = FALSE;
+
+/* 0 (CMD_SRC_LCL) are reserved */
+GLOBAL USHORT used_sources = 1;
+
+/*===== EXTERNALS ==================================================*/
+EXTERN T_ACI_LIST    *ati_src_list;
+
+/*===== FUNCTIONS ==================================================*/
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_cmd_req    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle ACI command request primitive. The original comment
+	    said "It is only a signal and must not be freed by PFREE",
+	    but it appears to have been wrong even before we touched
+	    this code.
+
+  FreeCalypso change: this primitive (not signal!) was originally used
+  for by TI's _SIMULATION_ environment (the code in ati_src_tst.c,
+  removed in the TCS3.2 version we got), but we have repurposed it
+  for our AT-over-RVTMUX implementation in ati_src_rvt.c.
+
+*/
+
+GLOBAL void aci_aci_cmd_req (T_ACI_CMD_REQ *cmd)
+{
+  TRACE_FUNCTION("aci_aci_cmd_req()");
+
+#ifdef FF_ATI
+  if ( cmd->cmd_len < MAX_TRC_LEN )
+  {
+    cmd->cmd_seq[cmd->cmd_len] = '\0';
+    TRACE_EVENT_P1 ("%s", cmd->cmd_seq);
+  }
+
+#if defined _SIMULATION_ AND defined DTI
+  if (cmd->cmd_src >= CMD_SRC_EXT AND cmd->cmd_src <= MAX_TST_SRC)
+  {
+#ifdef FF_ATI_BAT
+    U8 src_id = tst_src_id[cmd->cmd_src - 1];
+#endif
+    ati_src_tst_proc_cmd (cmd);
+#ifdef FF_ATI_BAT
+    if (aci_cmd_src_mode_get(src_id) EQ CMD_MODE_BAT) /* simulation with BAT library */
+    {
+      T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, src_id, search_ati_src_id);
+      T_ACI_DTI_PRC_PSI *src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId);
+      while (ledit_ctrl(src_params->src_id,LEDIT_CTRL_MORE_CMDS, NULL) EQ LEDIT_CMPL)
+      {
+        ati_bat_response_simulation(&(src_infos_psi->res)); /* intermediate response */
+      }
+      if (src_params->cmd_state NEQ CMD_IDLE)
+      {
+        if (src_infos_psi->res.response AND (src_params->curAtCmd NEQ AT_CMD_CMGS))
+        {
+          ati_bat_response_simulation(&(src_infos_psi->res)); /* final response */
+          Perform_ati_bat_maint(src_id);
+        }
+        src_infos_psi->bat_client[src_infos_psi->active_client].curCmd = (T_BAT_ctrl_params)-1;
+      }
+    }
+#endif /* FF_ATI_BAT */
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("aci_aci_cmd_req(): [WRN] srcId=%d, but must be 0x01 or 0x02", cmd->cmd_src);
+  }
+#elif 1 //CONFIG_AT_RVTMUX
+
+  ati_src_rvt_proc_cmd (cmd);
+
+#endif	/* old _SIMULATION_ vs FreeCalypso AT-over-RVTMUX */
+#endif	/* FF_ATI */
+
+  PFREE (cmd);
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_cmd_req    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle ACI command request primitive. It is only a
+            signal and must not be freed by PFREE.
+
+*/
+#ifdef BT_ADAPTER
+GLOBAL void aci_aci_cmd_req_bt (T_ACI_CMD_REQ_BT *cmd)
+{
+  TRACE_FUNCTION("aci_aci_cmd_req_bt()");
+
+#ifdef FF_ATI
+  if ( cmd->cmd_len <= 80 )
+  {
+    if( !strchr((char *)cmd->cmd_seq,'%'))
+      TRACE_EVENT ((char *)cmd->cmd_seq);
+  }
+
+  if (cmd->cmd_src EQ CMD_SRC_EXT)
+  {
+  ati_src_bt_proc_cmd(cmd);
+  }
+
+#endif
+  PFREE(cmd);
+}
+#endif /* BT_ADAPTER */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_abort_req  |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci data mode abort request
+
+*/
+
+GLOBAL void aci_aci_abort_req (T_ACI_ABORT_REQ *aci_abort_req)
+{
+  EXTERN void aciAbort (UBYTE srcId);
+
+  UBYTE srcId;
+
+  TRACE_FUNCTION ("aci_aci_abort_req()");
+
+  srcId = aci_abort_req->cmd_src;
+
+#ifdef DTI
+#ifdef _SIMULATION_
+  if (srcId >= CMD_SRC_EXT && srcId <= MAX_TST_SRC)
+  {
+    ati_src_tst_abort(srcId);
+    return;
+  }
+#endif /* _SIMULATION_ */
+#endif /* DTI */
+
+  if (aci_abort_req->cause EQ ABT_ABORT_CMD)
+    aciAbort (srcId);
+
+#ifdef FAX_AND_DATA
+  if (aci_abort_req->cause EQ ABT_ABORT_DATA)
+    cmhRA_Escape ();
+#endif
+
+#ifdef BT_ADAPTER
+  btiaci_at_abort_res(srcId);
+#endif /* BT_ADAPTER */
+
+  PFREE (aci_abort_req);
+
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_abort_req  |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci (data mode) abort request for BT
+
+*/
+#ifdef BT_ADAPTER
+GLOBAL void aci_aci_abort_req_bt (T_ACI_ABORT_REQ_BT *aci_abort_req)
+{
+/*  EXTERN void aciAbort (UBYTE srcId);*/
+
+  UBYTE srcId;
+
+  TRACE_FUNCTION ("aci_aci_abort_req_bt()");
+
+  srcId = aci_abort_req->src_id;
+
+  if (aci_abort_req->cause EQ ABT_ABORT_CMD)
+    aciAbort (srcId);
+
+#ifdef FAX_AND_DATA
+  if (aci_abort_req->cause EQ ABT_ABORT_DATA)
+    cmhRA_Escape ();
+#endif
+
+  btiaci_at_abort_res(get_port_by_srcID(srcId));
+
+
+  PFREE (aci_abort_req);
+
+}
+#endif /* BT_ADAPTER */
+
+#ifdef FF_ATI
+
+GLOBAL UBYTE aci_init (T_ATI_SRC_TYPE src_type)
+{
+  int   i;
+  UBYTE tst_src;
+
+  TRACE_FUNCTION ("aci_init ()");
+
+#ifdef _SIMULATION_
+  if (src_type EQ ATI_SRC_TYPE_TST)
+  {
+    for (i = (CMD_SRC_MAX-1); i >= 0; i--)
+    {
+      tst_src = (0x01 << i) & used_sources;
+      if (!tst_src)
+        break;
+    }
+    if (tst_src)
+    {
+      return (0);
+    }
+
+    used_sources |= (0x01 << i);
+    return (UBYTE) (i);
+  }
+#endif
+
+  for (i = 0; i < CMD_SRC_MAX; i++)
+  {
+    tst_src = (0x01 << i) & used_sources;
+    if (!tst_src)
+      break;
+  }
+  if (tst_src)
+  {
+    TRACE_EVENT_P1("No more sources available ! used_sources: %04X", used_sources);
+    return (0);
+  }
+  used_sources |= (0x01 << i);
+
+  if (src_type EQ ATI_SRC_TYPE_BLUETOOTH)
+  {
+    used_sources |= (0x01 << (i + 8));
+  }
+
+  TRACE_EVENT_P2("New source %d ! used_sources: %04X", i, used_sources);
+  return (i);
+}
+
+#endif /* FF_ATI */
+
+GLOBAL void aci_finit (UBYTE src_id)
+{
+  UBYTE tst_src;
+
+  TRACE_FUNCTION ("aci_finit ()");
+
+  tst_src = 0x01 << src_id;
+  if (!(used_sources & tst_src))
+  {
+    TRACE_EVENT ("[ERR] aci_finit(): invalid source");
+    return;
+  }
+  used_sources = used_sources & ~tst_src;
+
+  /* for BT */
+  tst_src = 0x01 << (src_id + 8);
+  used_sources = used_sources & ~tst_src;
+}
+
+
+#ifdef BT_ADAPTER
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_cmd_res    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_cmd_res
+
+*/
+
+GLOBAL void aci_aci_cmd_res (T_ACI_CMD_RES *aci_cmd_res)
+{
+  TRACE_FUNCTION ("aci_aci_cmd_res()");
+
+  /*
+  This is currently just ignored !
+  Actually ACI_CMD_RES is an acknowledgement for ACI_CMD_IND. It should
+  be used to determine if an ACI_CMD_IND may be sent. After sending one
+  ACI_CMD_IND should wait for ACI_CMD_RES before another ACI_CMD_IND may
+  be sent. This behaviour shall be implemented later.
+  */
+  PFREE (aci_cmd_res);
+
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_cmd_res    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_cmd_res_bt
+
+*/
+
+GLOBAL void aci_aci_cmd_res_bt (T_ACI_CMD_RES_BT *aci_cmd_res)
+{
+
+  ULONG port_nb;
+  T_ATI_BT_OUTPUT *cur_cmd;
+
+  TRACE_FUNCTION ("aci_aci_cmd_res()");
+
+  /*
+  This is currently just ignored !
+  Actually ACI_CMD_RES is an acknowledgement for ACI_CMD_IND. It should
+  be used to determine if an ACI_CMD_IND may be sent. After sending one
+  ACI_CMD_IND should wait for ACI_CMD_RES before another ACI_CMD_IND may
+  be sent. This behaviour shall be implemented later.
+  */
+
+  port_nb = get_port_by_srcID(aci_cmd_res->src_id);
+  PFREE (aci_cmd_res);
+
+  if (bti_port_table[port_nb].atqueue EQ NULL)
+  {
+    bti_port_table[port_nb].at_flow_on = TRUE;
+    TRACE_EVENT("BTA queue empty");
+    return;
+  }
+
+  cur_cmd = bti_port_table[port_nb].atqueue;
+
+  if (cur_cmd->output_type & ATI_BT_CONFIRM_COMMAND)
+  {
+    TRACE_EVENT("BTA confirm in queue");
+    bti_port_table[port_nb].atqueue = cur_cmd->next;
+
+    btiaci_at_cmd_res(port_nb, (char *)(cur_cmd->output));
+    MFREE(cur_cmd);
+
+    if (bti_port_table[port_nb].atqueue EQ NULL)
+    {
+      TRACE_EVENT("BTA queue empty");
+      bti_port_table[port_nb].at_flow_on = TRUE;
+      return;
+    }
+    else
+    {
+      cur_cmd = bti_port_table[port_nb].atqueue;
+    }
+  }
+
+  if ((cur_cmd->output_type & ATI_BT_NORMAL_COMMAND) ||
+      (cur_cmd->output_type & ATI_BT_INDICATION_COMMAND))
+  {
+    TRACE_EVENT("BTA command in queue");
+    bti_port_table[port_nb].at_flow_on = FALSE;
+
+    bti_port_table[port_nb].atqueue = cur_cmd->next;
+
+    TRACE_EVENT_P1("sending %s", cur_cmd->output);
+    btiaci_at_cmd_req(port_nb, (char *)(cur_cmd->output));
+    MFREE(cur_cmd);
+
+#ifdef _SIMULATION_
+    cur_cmd = bti_port_table[port_nb].atqueue;
+    while (cur_cmd->next NEQ NULL) /* search end of queue */
+    {
+      TRACE_EVENT_P1("in queue: %s", cur_cmd->output); /* just for debugging */
+      cur_cmd = cur_cmd->next;
+    }
+#endif
+
+  }
+  return;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_init_res   |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_init_res
+
+*/
+
+GLOBAL void aci_aci_init_res (T_ACI_INIT_RES *aci_init_res)
+{
+  TRACE_FUNCTION ("aci_aci_init_res()");
+
+  PFREE (aci_init_res);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_deinit_req |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_deinit_req
+
+*/
+
+GLOBAL void aci_aci_deinit_req (T_ACI_DEINIT_REQ *aci_deinit_req)
+{
+  TRACE_FUNCTION ("aci_aci_deinit_req()");
+
+  io_closePort(0);
+
+  btiaci_at_deinit_res();
+
+  PFREE (aci_deinit_req);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_open_port_req|
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_open_port_req
+
+*/
+
+GLOBAL void aci_aci_open_port_req (T_ACI_OPEN_PORT_REQ *aci_open_port_req)
+{
+  ULONG port;
+  T_BTI_ACK result;
+
+  TRACE_FUNCTION ("aci_aci_open_port_req()");
+
+  port = aci_open_port_req->port_nb;
+
+  result = io_openPort(port);
+
+  PFREE (aci_open_port_req);
+
+  btiaci_at_open_port_res(port, result);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_close_port_req|
++--------------------------------------------------------------------+
+
+  PURPOSE : handle aci_close_port_req
+
+*/
+
+GLOBAL void aci_aci_close_port_req (T_ACI_CLOSE_PORT_REQ *aci_close_port_req)
+{
+  ULONG port;
+
+  TRACE_FUNCTION ("aci_aci_close_port_req()");
+
+  port = aci_close_port_req->port_nb;
+
+  io_closePort(port);
+
+  PFREE (aci_close_port_req);
+
+  btiaci_at_close_port_res(port);
+}
+
+#endif /* BT_ADAPTER */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_trc_ind    |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function call is only relevant for the acia_adater. The acia_adapter
+  sends for every AT-cmd a psignal to aci  (task switch).
+
+*/
+#ifdef FF_MMI_RIV
+
+EXTERN void acia_callback_for_ACI (void *AT_command_ptr);
+
+GLOBAL void aci_aci_riv_cmd_req (T_ACI_RIV_CMD_REQ *cmd_ptr)
+{
+  TRACE_FUNCTION ("aci_aci_riv_cmd_req()");
+
+acia_callback_for_ACI ((void *)cmd_ptr); 
+}
+#endif /* FF_MMI_RIV */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_trc_ind    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle ACI trace indication primitive.
+
+*/
+
+GLOBAL void aci_aci_trc_ind (T_ACI_TRC_IND *trc_ind)
+{
+  T_ATI_SRC_PARAMS *src_params;
+
+  TRACE_FUNCTION("aci_aci_trc_ind()");
+
+  if (!_g_ati_trc_enabled)
+  {
+    PFREE (trc_ind);
+    return;
+  }
+
+  trc_ind->trc_buf[MAX_TRC_LEN-1] = '\0';
+
+#ifdef FF_ATI
+  if ( trc_ind->trc_len >= MAX_TRC_LEN )
+  {
+    UBYTE c;
+    c = trc_ind->trc_buf[MAX_TRC_LEN-1];
+    trc_ind->trc_buf[MAX_TRC_LEN-1] = '\0';
+    TRACE_EVENT_P1 ("%s", trc_ind->trc_buf);
+    trc_ind->trc_buf[MAX_TRC_LEN-1] = c;
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("%s", trc_ind->trc_buf);
+  }
+#endif  /* FF_ATI */
+
+  /* check if the src is valid */
+  src_params = find_element (ati_src_list, trc_ind->cmd_src, search_ati_src_id);
+#ifdef FF_PSI
+  if ((src_params EQ NULL) OR ((src_params->src_type NEQ ATI_SRC_TYPE_UART) AND 
+                        (src_params->src_type NEQ ATI_SRC_TYPE_PSI)))
+#else
+  if ((src_params EQ NULL) OR (src_params->src_type NEQ ATI_SRC_TYPE_UART))
+#endif /*FF_PSI*/
+  {
+    src_params = get_next_element (ati_src_list, NULL);/* first element */
+    while (src_params NEQ NULL)
+    {
+#ifdef FF_PSI
+      if (src_params->src_type EQ ATI_SRC_TYPE_UART OR src_params->src_type EQ ATI_SRC_TYPE_PSI)
+#else
+      if (src_params->src_type EQ ATI_SRC_TYPE_UART)
+#endif /*FF_PSI*/
+      {
+        break;
+      }
+      src_params = get_next_element (ati_src_list, src_params);
+    }
+  }
+
+  if (src_params NEQ NULL)
+  {
+    io_sendIndication(src_params->src_id, (CHAR *)trc_ind->trc_buf, ATI_FORCED_OUTPUT);
+  }
+
+  PFREE (trc_ind);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI                |
+| STATE   : code                        ROUTINE : aci_aci_ext_ind    |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle ACI extension signal indication primitive.
+
+*/
+
+GLOBAL void aci_aci_ext_ind (T_ACI_EXT_IND *aci_ext_ind)
+{
+  TRACE_FUNCTION ("aci_aci_ext_ind()");
+  rEXT_Signal (aci_ext_ind);
+  PFREE (aci_ext_ind);
+}
+
+
+
+#endif /* ACI_ACI_C */