diff src/aci2/aci/aci_bat_dti.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_bat_dti.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,683 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-F&D (8411)
+|  Modul   :  ACI_BAT
++-----------------------------------------------------------------------------
+|  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 BAT wrapper modul is ...
+| 
++----------------------------------------------------------------------------- 
+*/ 
+ 
+#include "aci_all.h"     /* includes prim.h, which includes p_bat.h */ 
+#include "aci_cmh.h"     /* prototypes of sAT_,qAT_,tAT_    */ 
+#include "ati_cmd.h"
+#include "aci_cmd.h"
+#include "dti.h"      /* functionality of the dti library */
+#include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ 
+#include "aci_bat.h"
+#include "cmh_dti.h"
+#include "dti_conn_mng.h"
+#include "dti_cntrl_mng.h"
+#include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ 
+#include "aci_bat_err.h" /*prototypes of err functions for BAT*/
+
+
+/*==== VARIABLE====================================================*/
+
+static const T_CAP_NAME aci_bat_cap_name[] =
+{
+  {"CMD",         DEV_CPBLTY_CMD        },
+  {"SER",         DEV_CPBLTY_SER        },
+  {"PKT",         DEV_CPBLTY_PKT        },
+  {"CMD,SER",     DEV_CPBLTY_CMD_SER    },
+  {"CMD,PKT",     DEV_CPBLTY_CMD_PKT    },
+  {"PKT,SER",     DEV_CPBLTY_PKT_SER    },
+  {"CMD,PKT,SER", DEV_CPBLTY_CMD_PKT_SER},
+  {"",            DEV_CPBLTY_NONE}
+};
+
+/*==============================================================*/
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)                MODULE  :                  |
+| STATE   : code                          ROUTINE :  map_dti_cpblty  |
++--------------------------------------------------------------------+
+
+  PURPOSE : help function to map the capability values of 
+            DTI_CPBLTY_xxx to enum value of T_CAP_ID.
+            With the enum value we get the capability string in ati_cap_name[]
+            For DTI_CPBLTY_xxx see SAP document AAA.doc chapter Capability
+            Dor T_CAP_ID see cmh_dti.h
+*/
+LOCAL T_CAP_ID aci_bat_map_dti_cpblty (UBYTE dti_cpblty)
+{
+  switch (dti_cpblty)
+  {
+    case (DTI_CPBLTY_NO):
+      return (DEV_CPBLTY_NONE);
+
+    case (DTI_CPBLTY_CMD):
+      return (DEV_CPBLTY_CMD);
+
+    case (DTI_CPBLTY_SER):
+      return (DEV_CPBLTY_SER);
+
+    case (DTI_CPBLTY_PKT):
+      return (DEV_CPBLTY_PKT);
+
+    case (DTI_CPBLTY_CMD + DTI_CPBLTY_SER):
+      return (DEV_CPBLTY_CMD_SER);
+
+    case (DTI_CPBLTY_CMD + DTI_CPBLTY_PKT):
+      return (DEV_CPBLTY_CMD_PKT);
+
+    case (DTI_CPBLTY_PKT + DTI_CPBLTY_SER):
+      return (DEV_CPBLTY_PKT_SER);
+
+    case (DTI_CPBLTY_CMD + DTI_CPBLTY_PKT + DTI_CPBLTY_SER):
+      return (DEV_CPBLTY_CMD_PKT_SER);
+
+    default:
+    {
+      TRACE_EVENT_P1("aci_bat_map_dti_cpblty():[ERR] unknown capability value = %d",dti_cpblty);
+      return (DEV_CPBLTY_NONE);
+    }
+  }
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentDATA     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentDATA     (T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                            T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  CHAR          des_dev_name[MAX_SMS_ADDR_DIG];  /* destination device name       */
+  CHAR          src_dev_name[MAX_SMS_ADDR_DIG];  /* source device name            */
+  CHAR          dev_cap[MAX_SMS_ADDR_DIG];       /* device capability             */
+  CHAR*         p_des_dev_name;
+  CHAR*         p_src_dev_name;
+  CHAR*         p_dev_cap;
+  UBYTE         red_mode   ;                     /* redirection mode              */
+  UBYTE         cid        = BAT_PARAMETER_NOT_PRESENT;   /* context cid                   */
+  U8            des_dev_no ;                              /* destination device number     */
+  SHORT         des_sub_no = BAT_PARAMETER_NOT_PRESENT;   /* destination sub number        */
+  U8            src_dev_no ;                              /* source device number          */
+  SHORT         src_sub_no = BAT_PARAMETER_NOT_PRESENT; /* source sub number             */
+  
+  TRACE_FUNCTION ("sBAT_PercentDATA()");
+  
+  red_mode = cmd->params.ptr_set_percent_data->mode;
+  des_dev_no = cmd->params.ptr_set_percent_data->des_dev_no;
+  des_sub_no = cmd->params.ptr_set_percent_data->des_sub_no;
+  src_dev_no = cmd->params.ptr_set_percent_data->src_dev_no;
+  src_sub_no = cmd->params.ptr_set_percent_data->src_sub_no;
+  cid        = cmd->params.ptr_set_percent_data->cid;
+ 
+  src_dev_name[0]='\0';
+  des_dev_name[0]='\0';
+  dev_cap[0]='\0';
+  p_des_dev_name = des_dev_name;
+  p_src_dev_name = src_dev_name;
+  p_dev_cap = dev_cap;
+  
+  switch(cmd->params.ptr_set_percent_data->des_dev_name)
+  {
+    case (BAT_DEV_NAME_UART):
+    {
+      p_des_dev_name = "UART";
+      break;
+    }
+    case (BAT_DEV_NAME_RIV):
+    {
+      p_des_dev_name = "RIV";
+      break;
+    }
+    case (BAT_DEV_NAME_PKTIO):
+    {
+      p_des_dev_name = "PKTIO";
+      break;
+    }
+    case (BAT_DEV_NAME_PSI):
+    {
+      p_des_dev_name = "PSI";
+      break;
+    }  
+  }
+  
+  switch(cmd->params.ptr_set_percent_data->src_dev_name)
+  {
+    case (BAT_DEV_NAME_UART):
+    {
+      p_src_dev_name = "UART";
+      break;
+    }
+    case (BAT_DEV_NAME_RIV):
+    {
+      p_src_dev_name = "RIV";
+      break;
+    }
+    case (BAT_DEV_NAME_PKTIO):
+    {
+      p_src_dev_name = "PKTIO";
+      break;
+    }
+    case (BAT_DEV_NAME_PSI):
+    {
+      p_src_dev_name = "PSI";
+      break;
+    }  
+  }
+
+  switch(cmd->params.ptr_set_percent_data->capability)
+  {
+    case(BAT_CAP_CMD):
+    {
+      p_dev_cap = "CMD";
+      break;
+    }
+    case(BAT_CAP_SER):
+    {
+      p_dev_cap = "SER";
+      break;
+    }
+    case(BAT_CAP_CMD + BAT_CAP_SER ):
+    {
+      p_dev_cap = "CMD,SER";
+      break;
+    }
+    case(BAT_CAP_PKT):
+    {
+      p_dev_cap = "PKT";
+      break;
+    }
+    case(BAT_CAP_CMD + BAT_CAP_PKT):
+    {
+      p_dev_cap = "CMD_PKT";
+      break;
+    }
+    case(BAT_CAP_SER + BAT_CAP_PKT):
+    {
+      p_dev_cap = "SER_PKT";
+      break;
+    }
+    case(BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT):
+    {
+      p_dev_cap = "CMD_SER_PKT";
+      break;
+    }
+  }
+  ret = sAT_PercentDATA ((T_ACI_CMD_SRC)src_infos_psi->srcId, red_mode,
+                         p_des_dev_name, des_dev_no, (UBYTE)des_sub_no, p_dev_cap,
+                         p_src_dev_name, src_dev_no, (UBYTE)src_sub_no, cid);
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentDATA     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentDATA     (T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                            T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  UBYTE         mode ;
+  UBYTE         cid  = BAT_PDP_CID_NOT_PRESENT;
+  T_DINF_PARAM  des_param;      /* des_dev_name, des_dev_no, des_sub_no, des_cap */
+  T_DINF_PARAM  src_param;      /* src_dev_name, src_dev_no, src_sub_no, pdp_cid */
+  T_CAP_ID      capability = DEV_CPBLTY_NONE;
+  T_BAT_cmd_response resp;
+  T_BAT_res_que_percent_data que_data_buffer;
+  
+  TRACE_FUNCTION ("qBAT_PercentDATA()");
+  resp.ctrl_response = BAT_RES_QUE_PERCENT_DATA; 
+  resp.response.ptr_que_percent_data = &que_data_buffer;
+  
+  des_param.dev_id     = NOT_PRESENT_8BIT; /* in case of there is no redirection at all */
+  des_param.capability = 0xAA;             /* init with a value which makes never sense */
+  while ((ret = qAT_PercentDATA (src_infos_psi->srcId, &mode, &cid, &des_param, &src_param)) EQ ACI_BAT_CMPL)
+  {
+    T_DTI_ENTITY_ID des_id = dti_entity_name[des_param.dev_id].id;
+    T_DTI_ENTITY_ID src_id = dti_entity_name[src_param.dev_id].id;
+    
+    capability         = aci_bat_map_dti_cpblty (des_param.capability);
+    /*
+     * unfortunately in custom.h for PKTIO is defined "PKT" (Frame handles up to 4 chars only)
+     * but for the device name we want to emit "PKTIO" to distinguish from capability "PKT"
+     */
+        
+#ifdef GPRS
+    if (des_param.dev_id EQ DTI_ENTITY_PKTIO)
+    {
+      des_id = DTI_ENTITY_PKTIO;
+    }
+
+    if (src_param.dev_id EQ DTI_ENTITY_PKTIO)
+    {
+      src_id = DTI_ENTITY_PKTIO;
+    }
+#endif
+
+    switch(des_id)
+    {
+      case (DTI_ENTITY_UART):
+      {
+        resp.response.ptr_que_percent_data->des_dev_name = BAT_DEV_NAME_UART;
+        break;
+      }
+#ifdef GPRS
+      case (DTI_ENTITY_PKTIO):
+      {
+        resp.response.ptr_que_percent_data->des_dev_name = BAT_DEV_NAME_PKTIO;
+        break;
+      }
+#endif
+      case (DTI_ENTITY_PSI):
+      {
+        resp.response.ptr_que_percent_data->des_dev_name = BAT_DEV_NAME_PSI;
+        break;
+      }
+      default:
+      {
+        TRACE_ERROR("ERROR: Undefined dev name type encoutered");
+        break;
+      }  
+    }
+    switch(src_id)
+    {
+      case (DTI_ENTITY_UART):
+      {
+        resp.response.ptr_que_percent_data->src_dev_name = BAT_DEV_NAME_UART;
+        break;
+      }
+#ifdef GPRS
+      case (DTI_ENTITY_PKTIO):
+      {
+        resp.response.ptr_que_percent_data->src_dev_name = BAT_DEV_NAME_PKTIO;
+        break;
+      }
+#endif
+      case (DTI_ENTITY_PSI):
+      {
+        resp.response.ptr_que_percent_data->src_dev_name = BAT_DEV_NAME_PSI;
+        break;
+      }
+      default:
+      {
+        TRACE_ERROR("ERROR: Undefined dev name type encoutered");
+        break;
+      }  
+    } 
+    switch(aci_bat_cap_name[capability].id)
+    {
+      case (DEV_CPBLTY_CMD):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_CMD;
+        break;
+      }
+      case (DEV_CPBLTY_SER):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_SER;
+        break;
+      }
+      case (DEV_CPBLTY_CMD_SER):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_CMD + BAT_CAP_SER;
+        break;
+      }
+      case (DEV_CPBLTY_PKT):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_PKT;
+        break;
+      }
+      case (DEV_CPBLTY_CMD_PKT):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_CMD + BAT_CAP_PKT;
+        break;
+      }
+      case (DEV_CPBLTY_PKT_SER):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_SER + BAT_CAP_PKT;
+        break;
+      }
+      case (DEV_CPBLTY_CMD_PKT_SER):
+      {
+        resp.response.ptr_que_percent_data->capability = BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT;
+        break;
+      }
+    }
+    resp.response.ptr_que_percent_data->des_dev_no = des_param.dev_no;
+    resp.response.ptr_que_percent_data->des_sub_no = des_param.sub_no;
+    resp.response.ptr_que_percent_data->src_dev_no = src_param.dev_no;
+    resp.response.ptr_que_percent_data->src_sub_no = src_param.sub_no;
+    resp.response.ptr_que_percent_data->cid  = cid;
+    resp.response.ptr_que_percent_data->mode = mode;
+
+    aci_bat_send(src_infos_psi,&resp);
+  }
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentDINF     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentDINF     (T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                            T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  UBYTE         mode         ;    /* DINF  */
+  T_DINF_PARAM  device_para;
+  T_CAP_ID      capability   = DEV_CPBLTY_NONE;
+  T_CAP_ID      cur_cap      = DEV_CPBLTY_NONE;
+  T_BAT_cmd_response resp;
+  T_BAT_res_set_percent_dinf que_dinf_buffer;
+  
+  TRACE_FUNCTION ("sBAT_PercentDINF()");
+  
+  mode = cmd->params.ptr_set_percent_dinf->mode;
+  resp.ctrl_response = BAT_RES_SET_PERCENT_DINF;
+  resp.response.ptr_set_percent_dinf = &que_dinf_buffer;
+  
+  switch(mode)
+  {
+    case (BAT_P_DINF_MODE_CURRENT):
+    {
+      /*
+       * we want to get the piece of information, which belongs to the srcId
+       */
+      ret = sAT_PercentDINF (src_infos_psi->srcId, mode, &device_para);
+      if ((ret EQ ACI_BAT_CMPL) AND (device_para.src_id EQ src_infos_psi->srcId))
+      {
+        capability = aci_bat_map_dti_cpblty (device_para.capability);
+        cur_cap    = aci_bat_map_dti_cpblty (device_para.cur_cap);
+        resp.response.ptr_set_percent_dinf->dev_no = device_para.dev_no;
+        resp.response.ptr_set_percent_dinf->sub_no = device_para.sub_no;
+        resp.response.ptr_set_percent_dinf->src_id = mode;
+        
+        switch(dti_entity_name[device_para.dev_id].id)
+        {
+          case (DTI_ENTITY_UART):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_UART;
+            break;
+          }
+#ifdef GPRS
+          case (DTI_ENTITY_PKTIO):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_PKTIO;
+            break;
+          }
+#endif
+          case (DTI_ENTITY_PSI):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_PSI;
+            break;
+          }
+          default:
+          {
+            TRACE_ERROR("ERROR: Undefined dev name type encoutered");
+            break;
+          }  
+        }
+        switch(aci_bat_cap_name[cur_cap].id)
+        {
+          case (DEV_CPBLTY_CMD):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD;
+            break;
+          }
+          case (DEV_CPBLTY_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+        }
+        switch(aci_bat_cap_name[capability].id)
+        {
+          case (DEV_CPBLTY_CMD):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD;
+            break;
+          }
+          case (DEV_CPBLTY_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+        }
+
+      aci_bat_send(src_infos_psi,&resp);
+      return (ACI_BAT_CMPL);
+      }
+      else
+      {
+        break; /* an error */
+      }
+    }
+    case (BAT_P_DINF_MODE_ALL):
+    {
+      device_para.capability = 0xAA; /* init with a value which makes never sense, but is valuable for debug */
+      /*
+       * we want to get the pieces of information to all devices
+       */
+      while ((ret = sAT_PercentDINF (src_infos_psi->srcId, mode, &device_para)) EQ ACI_BAT_CMPL)
+      {
+        if (device_para.src_id EQ src_infos_psi->srcId)
+        {
+          mode = BAT_P_DINF_MODE_CURRENT ; /* this is the current channel, so temporarily set mode */
+        }
+        else
+        {
+          mode = BAT_P_DINF_MODE_ALL; /* other channel */
+        }
+
+        capability = aci_bat_map_dti_cpblty (device_para.capability);
+        cur_cap    = aci_bat_map_dti_cpblty (device_para.cur_cap);
+
+        resp.response.ptr_set_percent_dinf->dev_no = device_para.dev_no;
+        resp.response.ptr_set_percent_dinf->sub_no = device_para.sub_no;
+        resp.response.ptr_set_percent_dinf->src_id = mode;
+        
+        switch(dti_entity_name[device_para.dev_id].id)
+        {
+          case (DTI_ENTITY_UART):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_UART;
+            break;
+          }
+#ifdef GPRS
+          case (DTI_ENTITY_PKTIO):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_PKTIO;
+            break;
+          }
+#endif
+          case (DTI_ENTITY_PSI):
+          {
+            resp.response.ptr_set_percent_dinf->dev_name = BAT_DEV_NAME_PSI;
+            break;
+          }
+          default:
+          {
+            TRACE_ERROR("ERROR: Undefined dev name type encoutered");
+            break;
+          }  
+        }
+        switch(aci_bat_cap_name[cur_cap].id)
+        {
+          case (DEV_CPBLTY_CMD):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD;
+            break;
+          }
+          case (DEV_CPBLTY_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cur_cap = BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+        }
+        switch(aci_bat_cap_name[capability].id)
+        {
+          case (DEV_CPBLTY_CMD):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD;
+            break;
+          }
+          case (DEV_CPBLTY_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_SER;
+            break;
+          }
+          case (DEV_CPBLTY_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+          case (DEV_CPBLTY_CMD_PKT_SER):
+          {
+            resp.response.ptr_set_percent_dinf->cap = BAT_CAP_CMD + BAT_CAP_SER + BAT_CAP_PKT;
+            break;
+          }
+        }
+        aci_bat_send(src_infos_psi,&resp);
+        mode = SHOW_ALL_CHAN_INF; /* reset to show all channels */
+      }
+      /*
+       * when sAT_PercentDINF reached the end it returns with AT_FAIL, but check capability as sentinel
+       */
+      if (device_para.capability EQ DEV_CPBLTY_NONE)
+      {
+        /* 
+         * DEV_CPBLTY_NONE is the sentinel, that there are no further devices 
+         */
+        return (ACI_BAT_CMPL);
+      }
+      break; /* an error */
+    }
+    default:
+    {
+      break; /* an error */
+    }
+  } 
+  return (ACI_BAT_FAIL);
+ }
+