view src/g23m-aci/aci/conc_sms.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  $Workfile::
|  Modul   :  CONC_SMS
+----------------------------------------------------------------------------- 
|  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 :  SMS Concatenation Handler
+----------------------------------------------------------------------------- 
*/ 



#ifndef CONC_SMS_H
#define CONC_SMS_H

/* for target tests of Conc. SMS define _CONC_TESTING_ */
/*#ifndef _CONC_TESTING_
#define _CONC_TESTING_
#endif*/


/*==== CONSTANTS ==================================================*/

#define SMS_IEI_CONC_8BIT  0x00
#define SMS_IEI_CONC_16BIT 0x08


#define L_UNCOMP_8BIT_DATA 140
#define L_UNCOMP_7BIT_DATA 160
#define L_UNCOMP_8BIT_DATA_CONC 134
#define L_UNCOMP_7BIT_DATA_CONC 153

/* only for test purposes */
#define L_UNCOMP_8BIT_DATA_TST 14
#define L_UNCOMP_7BIT_DATA_TST 16
#define L_UNCOMP_8BIT_DATA_CONC_TST 13
#define L_UNCOMP_7BIT_DATA_CONC_TST 15

#define COMMAND_TYPE_DELETE 0x02

#define CONC_MAX_SEGS 10 /* maximum number of segment in one conc. SMS */

/* max number of conc. SMs in segment buffer and assembly buffer */
#define MAX_BUF_ELEMS 5

/* max number of conc. SMs in concatenation buf */
#define MAX_CONC_BUF_ELEMS 30


#define CONC_UDH_LEN 6

#define MAX_SEG_TOTAL 120

/* detection modes for SMS_getSMSType */
#define MODE1 1
#define MODE2 2
#define MODE3 3


/*==== TYPES ======================================================*/

#define SET_CONC \
  {concShrdPrm.isConcatenated = TRUE;}

#define UNSET_CONC \
  {concShrdPrm.isConcatenated = FALSE;}

#define ISSET_CONC \
  (concShrdPrm.isConcatenated EQ TRUE)


#ifdef _CONC_TESTING_
#define SET_OWNBUF_CONC \
  if (concShrdPrm.isConcatenated) ownBuf = CMD_SRC_LCL;
#else
#define SET_OWNBUF_CONC
#endif


typedef enum              /* for init functions */
{
  CONC_ERROR       = -1,       /* concatenation error */
  CONC_NOT_NEEDED,             /* no concatenation needed */
  CONC_NEEDED                  /* concatenation needed */
} T_CONC_INIT_RETURN;


typedef enum              /* for collect function */
{
  CONC_ERR_UNKN,               /* concatenation error unknown */
  CONC_ERR_BUF_FULL,           /* buffer full */
  CONC_CONTINUED,              /* concatenation continued */
  CONC_COMPLETED               /* concatenation completed */
} T_CONC_ASSEMBLY_RETURN;


typedef enum
{
  UNKNOWN = -1,
  NORMAL,
  CONCATE,
  VOICEMAIL,
  NORMAL_IND_CSMS
} T_SMS_TYPE;


typedef struct            /* data buffer for Assembly of Concat. SMS */
{
  UBYTE  in_use;
  USHORT ref_num;
  CHAR   address[MAX_SMS_ADDR_DIG+1];
  UBYTE  next_exp_num;
  UBYTE  segs_left;
  UBYTE  seg_count;
  T_SM_DATA_EXT data;
}
T_SM_ASSEMBLY;

typedef struct            /* segment buffer for Concat. SMS */
{
  UBYTE  in_use;
  USHORT ref_num;
  CHAR   address[MAX_SMS_ADDR_DIG+1];
  T_ACI_LIST *list;
}
T_SEG_BUF;

typedef struct            /* one segment buffer element for Concat. SMS */
{
  UBYTE seq_num;
  UBYTE rec_num;
  UBYTE status;           /* in CMH format */
  T_SM_DATA_EXT data;
}
T_SEG_BUF_ELEM;

typedef struct            /* concatenated buffer for Concat. SMS */
{
  UBYTE  in_use;
  USHORT ref_num;
  CHAR   address[MAX_SMS_ADDR_DIG+1];
  UBYTE  max_num;
  T_ACI_LIST *list;
}
T_CONC_BUF;

typedef struct            /* one concatenated buffer element for Concat. SMS */
{
  UBYTE seq_num;
  UBYTE rec_num;
  UBYTE status;           /* in CMH format */
  UBYTE mem;
}
T_CONC_BUF_ELEM;


typedef struct
{
  CHAR       da[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_da;
  T_ACI_TOA  toda;
  T_ACI_TOA  *p_toda;
  T_ACI_LIST *currConcBufListElem; /* current element in concatenated buffer */
  UBYTE      skipStoSent;
} T_CONC_CMSS;

typedef struct
{
  CHAR       da[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_da;
  T_ACI_TOA  toda;
  T_ACI_TOA  *p_toda;
  T_SM_DATA_EXT data;
  USHORT     offset;      /* byte offset in a conc. SM */
  CHAR       sca[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_sca;
  T_ACI_TOA  tosca;
  T_ACI_TOA  *p_tosca;
  SHORT      isReply;
  USHORT     sent_bytes;
} T_CONC_CMGS;

typedef struct
{
  UBYTE      command_count;
  UBYTE      fo;
  UBYTE      ct;
  UBYTE      pid;
  CHAR       da[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_da;
  T_ACI_TOA  toda;
  T_ACI_TOA  *p_toda;
  T_SM_DATA_EXT data;       /* user data */
} T_CONC_CMGC;

typedef struct
{
  UBYTE      rdMode;
  T_ACI_LIST *currConcBufListElem; /* current element in concatenated buffer */
} T_CONC_CMGR;

typedef struct
{
  CHAR       da[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_da;
  T_ACI_TOA  toda;
  T_ACI_TOA  *p_toda;
  UBYTE      stat;
  UBYTE      msg_ref;
  T_SM_DATA_EXT data;       /* user data */
  USHORT     offset;      /* byte offset in a conc. SM */
  CHAR       sca[MAX_SMS_ADDR_DIG+1];
  CHAR       *p_sca;
  T_ACI_TOA  tosca;
  T_ACI_TOA  *p_tosca;
  SHORT      isReply;
  USHORT     sent_bytes;
} T_CONC_CMGW;

typedef struct
{
  USHORT     ref_num;              /* ref. number of the current conc. buffer */
  CHAR       *address;
  UBYTE      error_count;
  T_ACI_LIST *currConcBufListElem; /* current element in concatenated buffer */
} T_CONC_CMGD;





typedef struct            /* Shared Parameter for Concat. SMS */
{
  UBYTE      max_sms_len; /* max. length of one SM segment */
  UBYTE      srcId;       /* current source ID */
  UBYTE      first_mr;    /* message ref. of the first sent segment */
  UBYTE      sentSegs;    /* number of successfully sent segments,for "+CMGC"*/
  UBYTE      isConcatenated;
  UBYTE      concTesting;
  UBYTE      l_uncomp8bit_data;
  UBYTE      l_uncomp7bit_data;
  UBYTE      l_uncomp8bit_data_conc;
  UBYTE      l_uncomp7bit_data_conc;
  UBYTE      mem_store;
  UBYTE      elem_count;  /* total number of CSMS segments */

  struct
  {
    UBYTE      ref_num;     /* conc. SM reference number */
    UBYTE      max_num;     /* max. number of SMs in one conc. message */
    UBYTE      seq_num;     /* sequence number of the current SM */
  } udh;

  struct 
  {
  USHORT RefNum;
  UBYTE MaxNum;
  UBYTE SeqNum[CONC_MAX_SEGS];
  UBYTE RecNum[CONC_MAX_SEGS];
  UBYTE MemType[CONC_MAX_SEGS]; 
  BOOL Conc_Full;
  UBYTE Numsegs; 
  } full;

  union
  {
    T_CONC_CMSS concCMSS;
    T_CONC_CMGS concCMGS;
    T_CONC_CMGC concCMGC;
    T_CONC_CMGR concCMGR;
    T_CONC_CMGW concCMGW;
    T_CONC_CMGD concCMGD;
  } specPrm;
}
T_CONC_SHRD_PRM;


#ifdef TI_PS_FF_CONC_SMS
/****************************** FUNCTIONS ********************************/


/* Init Functions */

EXTERN T_CONC_INIT_RETURN concSMS_initSendFromMem ( T_ACI_CMD_SRC srcId,
                                               UBYTE         *index,
                                               CHAR*         da,
                                               T_ACI_TOA*    toda );

EXTERN T_CONC_INIT_RETURN concSMS_initReadFromMem ( T_ACI_CMD_SRC  srcId,
                                               UBYTE          index,
                                               T_ACI_SMS_READ rdMode );

EXTERN T_CONC_INIT_RETURN concSMS_initDeleteFromMem ( T_ACI_CMD_SRC  srcId,
                                                 UBYTE          index );

EXTERN T_CONC_INIT_RETURN concSMS_initSend     ( T_ACI_SM_DATA*  tar_data,
                                            T_ACI_UDH_DATA* udh,
                                            T_ACI_CMD_SRC   srcId,
                                            CHAR*           da,
                                            T_ACI_TOA*      toda,
                                            T_SM_DATA_EXT*  src_data,
                                            CHAR*           sca,
                                            T_ACI_TOA*      tosca,
                                            SHORT           isReply,
                                            UBYTE           alphabet );

EXTERN T_CONC_INIT_RETURN concSMS_initStoreInMem (  T_ACI_SM_DATA* tar_data,
                                               T_ACI_UDH_DATA* udh,
                                               T_ACI_CMD_SRC  srcId,
                                               SHORT          index,
                                               CHAR*          address,
                                               T_ACI_TOA*     toa,
                                               T_ACI_SMS_STAT stat,
                                               UBYTE          msg_ref,
                                               T_SM_DATA_EXT* src_data,
                                               CHAR*          sca,
                                               T_ACI_TOA*     tosca,
                                               SHORT          isReply,
                                               UBYTE          alphabet );

EXTERN T_CONC_INIT_RETURN concSMS_initCommand ( T_ACI_CMD_SRC   srcId,
                                           SHORT           fo,
                                           SHORT           ct,
                                           SHORT           pid,
                                           SHORT           mn,
                                           CHAR*           da,
                                           T_ACI_TOA*      toda,
                                           T_ACI_CMD_DATA* data );



/* Callback Functions */

EXTERN void rConcSMS_PlusCMSS  (UBYTE mr, UBYTE numSeg);

EXTERN void rConcSMS_PlusCMGS  (UBYTE mr, UBYTE numSeg);

EXTERN void rConcSMS_PlusCMGR  (T_ACI_CMGL_SM*  sm,
                                T_ACI_CMGR_CBM* cbm);

EXTERN void rConcSMS_PlusCMGW  (UBYTE index, UBYTE numSeg, UBYTE mem);

EXTERN void rConcSMS_PlusCMGD  ();

EXTERN void rConcSMS_PlusCMGC  (UBYTE mr);

EXTERN void rConcSMS_PercentCMGMDU  (void);

/* Error Callback Functions */

EXTERN void rConcSMS_PlusCMS_CMSS (T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err,
                                   T_EXT_CMS_ERROR *conc_error);

EXTERN void rConcSMS_PlusCMS_CMGS (T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err,
                                   T_EXT_CMS_ERROR *conc_error);

EXTERN void rConcSMS_PlusCMS_CMGW (T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err,
                                   T_EXT_CMS_ERROR *conc_error);

EXTERN void rConcSMS_PlusCMS_CMGD (T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err,
                                   T_EXT_CMS_ERROR *conc_error);
#endif /* TI_PS_FF_CONC_SMS */


EXTERN void concSMS_Init();

EXTERN void concSMS_clearIncompleteMsg();

EXTERN void concSMS_delAllIncompleteMsg();

EXTERN void concSMS_AddtoconcBuff();

EXTERN T_SMS_TYPE SMS_getSMSType ( T_ACI_UDH_DATA* udh, char *address, UBYTE detMode);

EXTERN UBYTE concSMS_GetFirstIndex ( USHORT msg_ref, CHAR* address );

/* provide mem_type as well */
EXTERN T_CONC_BUF_ELEM *concSMS_GetFirstIndex_ext ( USHORT msg_ref, CHAR* address );

EXTERN USHORT concSMS_GetMsgRef ( T_ACI_CMGL_SM  *sm );

EXTERN T_CONC_ASSEMBLY_RETURN concSMS_Collect ( T_SM_DATA_EXT *data_conc,
                                               T_ACI_CMGL_SM  *sm,
                                               UBYTE          isStored,
                                               T_ACI_SMS_STOR mem );

#ifdef TI_PS_FF_CONC_SMS
EXTERN void rConcSMS_PercentCMGR  (T_ACI_CMGL_SM*  sm,
                                   T_ACI_CMGR_CBM* cbm);
#endif /* TI_PS_FF_CONC_SMS */



#ifdef CONC_SMS_C

GLOBAL T_CONC_SHRD_PRM      concShrdPrm;
#else

EXTERN T_CONC_SHRD_PRM      concShrdPrm;
#endif /* CONC_SMS_C */

EXTERN void concSMS_DeleteConcList();
EXTERN BOOL concSMS_concBufferAvail();

#endif