diff g23m/condat/ms/src/aci/ati_io.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/ati_io.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,533 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-F&D (8411)
+|  Modul   :  ATI
++----------------------------------------------------------------------------- 
+|  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 :  
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef ATI_IO_C
+#define ATI_IO_C
+
+#undef DUMMY_ATI_STRINGS
+
+#include "aci_all.h"
+#include "aci.h"
+#ifdef UART
+#include "dti.h"      /* functionality of the dti library */
+#endif
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_io.h"
+#include "aci_cmd.h"
+#include "l4_tim.h"
+
+#include "aci_lst.h"
+
+#ifdef UART
+#include "dti_conn_mng.h"
+#include "psa_uart.h"
+#include "cmh_uart.h"
+#endif
+
+#include "ati_io.h"
+#include "aci_mem.h"
+#include "aci_fd.h"
+#include "psa.h"
+#include "cmh.h"
+
+#include "cmh_cc.h"
+#include "psa_cc.h"
+
+#include "ati_int.h"
+
+#if !defined (STRACE_LEN)
+  #define STRACE_LEN 80
+#endif
+
+#define LIST_MAX_LENGTH 30
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : io_SendMessage     |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void io_sendMessage(UBYTE srcId, CHAR *msg,
+                           T_ATI_OUTPUT_TYPE output_type)
+{
+  T_ATI_SRC_PARAMS *src_params;
+
+  src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_sendMessage: srcId=%d not found", srcId);
+    return;
+  }
+  if (IS_INDICATION_OUTPUT (output_type))
+  {
+    io_sendIndication(srcId, msg, output_type);
+    return;
+  }
+  else if (!IS_ECHO_OUTPUT ( output_type))   /* ECHO_OUTPUT must not be terminated      */
+  {                                          /*  with CRLF, see definition in ati_cmh.h */
+    output_type |= ATI_END_CRLF_OUTPUT;
+  }
+
+  if (src_params->result_cb NEQ NULL)
+  {
+    src_params->result_cb (srcId, output_type,
+                           (UBYTE*)msg, (USHORT)strlen (msg));
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_sendMessage: no result callback srcId=%d",
+                    srcId);
+
+    if ( (strlen (msg)) >= STRACE_LEN )
+    {
+      /* terminate traced string if too long */
+      msg[STRACE_LEN-1] = '\0';
+    }
+
+    TRACE_EVENT_P1 ("%s", msg);
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : io_SendMessageEx   |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL BOOL check_should_buffer_ind(T_ATI_SRC_PARAMS *src_params)
+{  
+
+  switch(src_params->buff_uns_mode)
+  {
+  case(NO_BUFF):
+    break;
+
+  case(BUFF_TYPING):
+    if(src_params->cmd_state EQ CMD_TYPING)
+    {
+      TRACE_EVENT("check_should_buffer_ind(): cmd_state EQ CMD_TYPING");
+      return(TRUE);
+    }   
+    break;
+
+  case(BUFF_RUNNING):
+    if(src_params->cmd_state NEQ CMD_IDLE )
+    {
+      TRACE_EVENT("check_should_buffer_ind(): cmd_state NEQ CMD_IDLE");
+      return(TRUE);
+    } 
+    break;
+  }
+  return(FALSE); 
+}
+
+LOCAL void buffer_indication( T_ATI_SRC_PARAMS *src_params, 
+                              CHAR *msg, 
+                              T_ATI_OUTPUT_TYPE output_type )
+{
+  T_ATI_INDIC_BUFF *buff_indic_elem;
+  CHAR *output;
+
+  if(src_params->indication_buffer EQ NULL)
+  {
+    src_params->indication_buffer = new_list ();
+  }
+  
+  ACI_MALLOC(output, (USHORT)(strlen(msg)+1));
+  memcpy(output, msg, (USHORT)(strlen(msg)+1));
+
+  ACI_MALLOC( buff_indic_elem, sizeof(T_ATI_INDIC_BUFF) );
+  buff_indic_elem->output = output;
+  buff_indic_elem->output_type = output_type;
+  /* if list count is the maximum then the available elements are reused*/
+  if(get_list_count(src_params->indication_buffer) >= LIST_MAX_LENGTH)
+  {
+    insert_shift_list(src_params->indication_buffer, buff_indic_elem);
+  }
+  else
+  {
+    insert_list( src_params->indication_buffer, buff_indic_elem);
+  }
+
+  if ( (strlen (msg)) >= STRACE_LEN )
+  {
+    /* terminate traced string if too long */
+    msg[STRACE_LEN-1] = '\0';
+  }
+
+  TRACE_EVENT_P2("buffering on src %d: %s", src_params->src_id, msg);
+}
+
+GLOBAL void io_sendMessageEx (UBYTE srcId, CHAR *msg,
+                             T_ATI_OUTPUT_TYPE output_type)
+{
+  T_ATI_SRC_PARAMS *src_params;
+
+  src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_sendMessageEx: srcId=%d not found", srcId);
+    return;
+  }
+
+  /*
+   *  ATQ suppesses intermidiate, final and unsolicited result codes.
+   *  Only information text in responce to commands is not affected.
+   */
+  if(IS_CONFIRM_OUTPUT(output_type))
+  {
+    io_setCommandState(src_params, ATI_LINE_STATE_END);
+  }
+  
+  if (ati_user_output_cfg[srcId].atQ)
+  {
+    if(! IS_NORMAL_OUTPUT(output_type) AND ! IS_ECHO_OUTPUT(output_type))
+    {
+      return;
+    }
+  }
+  
+if ( IS_INDICATION_OUTPUT (output_type)
+    AND check_should_buffer_ind(src_params) )
+  {
+    buffer_indication( src_params, msg, output_type );
+    return;
+  }
+
+  if (src_params->result_cb NEQ NULL)
+  {
+    src_params->result_cb (srcId, output_type,
+                           (UBYTE*)msg, (USHORT)strlen (msg));
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_sendMessageEx: no result callback srcId=%d",
+                    srcId);
+
+    if ( (strlen (msg)) >= STRACE_LEN )
+    {
+      /* terminate traced string if too long */
+      msg[STRACE_LEN-1] = '\0';
+    }
+
+    TRACE_EVENT_P1 ("%s", msg);
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : io_SendIndication  |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void io_sendIndication(UBYTE srcId, CHAR *msg,
+                              T_ATI_OUTPUT_TYPE output_type)
+{
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+    
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_sendIndication: srcId=%d not found", srcId);
+    return;
+  }
+
+  /*
+   *  ATQ suppesses intermidiate, final and unsolicited result codes.
+   *  Only information text in responce to commands is not affected.
+   */
+  if (ati_user_output_cfg[srcId].atQ)
+  {
+    return;
+  }
+
+  output_type |= ATI_INDICATION_OUTPUT | 
+                 ATI_BEGIN_CRLF_OUTPUT | 
+                 ATI_END_CRLF_OUTPUT;
+
+  if ( check_should_buffer_ind(src_params) )
+  {
+    buffer_indication( src_params, msg, output_type );
+    return;
+  }
+  if (src_params->result_cb NEQ NULL)
+  {
+    src_params->result_cb (srcId, output_type,
+                           (UBYTE*)msg, (USHORT)strlen (msg));
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_sendIndication: no result callback srcId=%d",
+                    srcId);
+
+    if ( (strlen (msg)) >= STRACE_LEN )
+    {
+      /* terminate traced string if too long */
+      msg[STRACE_LEN-1] = '\0';
+    }
+
+    TRACE_EVENT_P1 ("%s", msg);
+  }
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : io_sendConfirm     |
++--------------------------------------------------------------------+
+
+  PURPOSE : output to AT interface
+*/
+
+GLOBAL void send_buffered_indication( T_ATI_SRC_PARAMS *src_params )
+{
+  BOOL            go_on = TRUE;
+  T_ATI_INDIC_BUFF *indic = src_params->indication_buffer; /* to be sure it's not NULL */
+
+  TRACE_EVENT_P1("send buffered indications for source: %d", src_params->src_id);
+  while( go_on )
+  {
+    indic = remove_first_element( src_params->indication_buffer ); 
+
+    if( indic NEQ NULL )
+    {
+      io_sendIndication( src_params->src_id,
+                         indic->output,
+                         indic->output_type );
+      ACI_MFREE( indic->output );
+      ACI_MFREE( indic );    
+    }
+    else
+    {
+      ACI_MFREE( src_params->indication_buffer );
+      src_params->indication_buffer = NULL;
+      go_on = FALSE;
+    }
+  }
+}
+                                       
+GLOBAL void io_sendConfirm(UBYTE srcId, CHAR *msg,
+                           T_ATI_OUTPUT_TYPE output_type)
+{
+  BOOL is_CONNECT = FALSE;
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  TRACE_FUNCTION("io_sendConfirm()");
+
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_sendConfirm: srcId=%d not found", srcId);
+    return;
+  }
+
+  if (BITFIELD_CHECK (output_type, ATI_CONNECT_OUTPUT))
+  {
+    is_CONNECT = TRUE;
+    BITFIELD_CLEAR (output_type, ATI_CONNECT_OUTPUT);
+  }
+
+  output_type |= ATI_CONFIRM_OUTPUT    | 
+                 ATI_BEGIN_CRLF_OUTPUT | 
+                 ATI_END_CRLF_OUTPUT;
+
+  if (src_params->result_cb NEQ NULL)
+  {
+    /*
+     *  ATQ suppesses intermidiate, final and unsolicited result codes.
+     *  Only information text in responce to commands is not affected.
+     */
+    if (ati_user_output_cfg[srcId].atQ EQ 0)
+    {
+      src_params->result_cb (srcId, output_type,
+                             (UBYTE*)msg, (USHORT)strlen (msg));
+    }
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_sendConfirm: no result callback srcId=%d",
+                    srcId);
+
+    if ( (strlen (msg)) >= STRACE_LEN )
+    {
+      /* terminate traced string if too long */
+      msg[STRACE_LEN-1] = '\0';
+    }
+
+    TRACE_EVENT_P1 ("%s", msg);
+  }
+
+  io_setCommandState(src_params, ATI_LINE_STATE_END);
+  trace_cmd_state(src_params->src_id, src_params->cmd_state, CMD_IDLE);
+  src_params->cmd_state = CMD_IDLE;
+
+  if ((src_params->indication_buffer NEQ NULL) /* send buffered indications */
+    AND (is_CONNECT EQ FALSE))                  /* but for data call not yet --> when back in CMD mode */
+  {
+    send_buffered_indication( src_params );
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_DTIS                |
+|                                 ROUTINE : io_sendChar             |
++-------------------------------------------------------------------+
+
+  PURPOSE : send one character through DTI
+*/
+
+GLOBAL void io_sendChar (CHAR out, UBYTE srcId)
+{
+  T_ATI_SRC_PARAMS *src_params;
+
+  src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_sendChar: srcId=%d not found", srcId);
+    return;
+  }
+  if (src_params->result_cb NEQ NULL)
+  {
+    src_params->result_cb (srcId, ATI_ECHO_OUTPUT, (UBYTE*)&out, 1);
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_sendChar: no result callback srcId=%d",
+                    srcId);
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_URT            |
+| STATE   : code                        ROUTINE : io_setRngInd       |
++--------------------------------------------------------------------+
+
+  PURPOSE: sets the V.24 ring indicator line
+
+*/
+GLOBAL void io_setRngInd (T_IO_RING_STAT state, T_ACI_CRING_TYP bt1, T_ACI_CRING_TYP bt2)
+{
+  T_ATI_SRC_PARAMS *src_params;
+  T_IO_RING_PARAMS ring_params;
+
+  src_params = get_next_element (ati_src_list, NULL);
+  while (src_params NEQ NULL)
+  {
+    if (src_params->line_state_cb NEQ NULL)
+    {
+      ring_params.ring_stat = state;
+      ring_params.b_cap_1 = bt1;
+      ring_params.b_cap_2 = bt2;
+
+      src_params->line_state_cb (src_params->src_id, 
+                                 ATI_LINE_STATE_RNG, 
+                                 (ULONG)&ring_params);
+    }
+    src_params = get_next_element (ati_src_list, src_params);
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_URT            |
+| STATE   : code                        ROUTINE : io_setDCD          |
++--------------------------------------------------------------------+
+
+  PURPOSE: sets the V.24 data carrier detect line
+
+*/
+#ifdef UART
+GLOBAL void io_setDCD (T_ACI_CMD_SRC src_id, T_IO_DCD_STAT state)
+{
+  T_ATI_SRC_PARAMS *src_params;
+  T_ACI_DCD_MOD     ATandC_setting;
+  
+  TRACE_FUNCTION("io_setDCD()");
+
+  src_params = find_element (ati_src_list, (UBYTE)src_id, search_ati_src_id);
+  if (src_params EQ NULL)
+  {
+    TRACE_EVENT_P1 ("[ERR] io_setDCD: srcId=%d not found", src_id);
+    return;
+  }
+  
+  qAT_AndC(src_id, &ATandC_setting);
+                                    
+  /* don't set DCD off if DCD shall be allways on */
+  if( (ATandC_setting EQ DCD_ALWAYS_ON) AND
+      (state EQ IO_DCD_OFF ) )
+  {
+    TRACE_EVENT ("[DBG] io_setDCD: DCD_ALWAYS_ON");
+    return;
+  }
+
+  if (src_params->line_state_cb NEQ NULL)
+  {
+    src_params->line_state_cb ((UBYTE)src_id, ATI_LINE_STATE_DCD, (ULONG)state);
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_setDCD: no callback for srcId=%d", src_id);
+  }
+}
+#endif /* UART */
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_URT            |
+| STATE   : code                        ROUTINE : io_setCommandState |
++--------------------------------------------------------------------+
+
+  PURPOSE: sets the command state to start or end
+
+*/
+#define UNUSED_ULONG_PARAMETER (ULONG) 0L
+
+GLOBAL void io_setCommandState(T_ATI_SRC_PARAMS *src_params, T_ATI_LINE_STATE_TYPE line_state_type)
+{
+
+  TRACE_FUNCTION("io_setCommandState()");
+
+  if (src_params->line_state_cb NEQ NULL)
+  {
+    src_params->line_state_cb (src_params->src_id, line_state_type, UNUSED_ULONG_PARAMETER);
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("[WRN] io_setCommandState: no callback for srcId=%d",
+                    src_params->src_id);
+  }
+}
+
+#endif /* ATI_IO_C */
+