FreeCalypso > hg > fc-magnetite
view src/aci2/aci/psa_util.c @ 660:293c7db5f10f
bmi3: fixed the mysterious "mute on first call" bug
When UI-enabled fw boots on a previously blank (no /mmi/* files) FFS
for the first time, the output_volume member of the persistent UI settings
structure was left uninitialized, corresponding to the earpiece volume
being set to mute, which is an invalid setting. Because of other quirks
in the far-from-finished UI code, this volume setting takes effect only
when the first call is answered, producing the odd behaviour seen at the
user level.
The current fix is to set the blank-FFS default for output_volume to
volume level 4, which is the same -6 dB Iota volume as the ACI default.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 14 May 2020 02:50:41 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : PSA_UTIL +----------------------------------------------------------------------------- | 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 module provides utility functions +----------------------------------------------------------------------------- */ #ifndef PSA_UTIL_C #define PSA_UTIL_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "ati_cmd.h" /*==== CONSTANTS ==================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D () MODULE : ATI_RET | | STATE : code ROUTINE : psa_search_SATSrcId| +--------------------------------------------------------------------+ PURPOSE : search SAT Source Id */ /* CLB: can't be returning a UBYTE... Otherwise search_SATSrcId is ALWAYS positive: -1 is 0xFF */ #ifdef FF_SAT_E GLOBAL T_ACI_CMD_SRC psa_search_SATSrcId (void) { T_ACI_CMD_SRC src_id; /* Current command source id. */ TRACE_FUNCTION("psa_search_SATSrcId ()"); #ifdef SIM_TOOLKIT for (src_id = 0; src_id < CMD_SRC_MAX; src_id++) { if (ati_is_src_type((UBYTE) src_id, ATI_SRC_TYPE_SAT)) { return src_id; } } #endif /* SIM_TOOLKIT */ return(CMD_SRC_NONE); } #endif /* FF_SAT_E */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_BCD2String | +--------------------------------------------------------------------+ PURPOSE : Function for converting a buffer that contains unpacked bcd digits of either MCC or MNC into a printable, null terminated C-string. Note: The output buffer "bcd_string" has to have at least the size len + 1, as the "len" is the length of the input "bcd" digits and the terminating '\0' also has to be stored. */ GLOBAL void utl_BCD2String (char *bcd_string, const UBYTE *bcd, USHORT len) { SHORT idx; for (idx = 0; idx < len; idx++) { if (bcd[idx] <= 9) { bcd_string[idx] = bcd[idx] + '0'; } else { bcd_string[idx] = '\0'; return; } } bcd_string[len] = '\0'; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_dialStr2BCD | +--------------------------------------------------------------------+ PURPOSE : Function that cleans all characters in a dialnumber that are not in 0-9,a,b,c,#,*. and converts the valid characters into a BCD number. the function returns the number of BCD digits that are converted. If pBCDBuf is NULL, only the length of the resulting BCD number is evaluated. */ GLOBAL USHORT utl_dialStr2BCD (const char *pDialStr, UBYTE *pBCDBuf, UBYTE maxDigits) { USHORT numBcdDigits = 0, strIdx; UBYTE c; for(strIdx = 0; numBcdDigits < maxDigits AND pDialStr[strIdx] NEQ '\0'; strIdx++) { c = 0xFF; switch (pDialStr[strIdx]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': c = pDialStr[strIdx]-'0'; break; case '*': c = 0x0a; break; case '#': c = 0x0b; break; case 'A': c = 0x0c; break; case 'B': c = 0x0d; break; case 'C': c = 0x0e; break; default: /* Ignore non-matching characters */ break; } if (c NEQ 0xFF) { if (pBCDBuf NEQ NULL) pBCDBuf[numBcdDigits] = c; numBcdDigits++; } } return numBcdDigits; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_BCD2DialStr | +--------------------------------------------------------------------+ PURPOSE : converts a BCD number into a string of ascii digits */ GLOBAL void utl_BCD2DialStr (const UBYTE *pBCD, char *pDSBuf, UBYTE numDigits) { USHORT numBcdDigits = 0, i=0; for( ;numDigits > 0; numDigits--, pBCD++ ) { switch( *pBCD ) { case( 0x00 ): case( 0x01 ): case( 0x02 ): case( 0x03 ): case( 0x04 ): case( 0x05 ): case( 0x06 ): case( 0x07 ): case( 0x08 ): case( 0x09 ): *pDSBuf++ = *pBCD + '0'; break; case( 0x0a ): *pDSBuf++ = '*'; break; case( 0x0b ): *pDSBuf++ = '#'; break; case( 0x0c ): *pDSBuf++ = 'A'; break; case( 0x0d ): *pDSBuf++ = 'B'; break; case( 0x0e ): *pDSBuf++ = 'C'; break; } } *pDSBuf = 0x0; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_cvt7To8 | +-------------------------------------------------------------------+ PURPOSE : This function converts from the 7 bit default alphabet for SMS point-to-point messages to 8 bit alphabet. The function returns the length in bytes of the converted destination string. Note: This function is copied from entity SMS, file sms_tlf.c */ /* PATCH add a parameter to tell the function to begin to expand to 8 bits from a specific bit offset inside the first byte (needed to handle correctly TP-UD headers in SMS) */ GLOBAL UBYTE utl_cvt7To8 (const UBYTE* source, UBYTE source_len, UBYTE* dest, UBYTE bit_offset) /* indicates which bit of the first byte is the boundary of the 7bits source ex: for bit_offset = 3, bits 0-2 (low weight bits) will not be decoded*/ { UBYTE d_mask = 0x01; UBYTE s_mask; UBYTE icnt; UBYTE ocnt; *dest = 0x00; icnt = source_len; if( !icnt ) return( 0 ); ocnt = 0; while (icnt) { s_mask = 0x01; /* PATCH */ if (icnt == source_len) s_mask <<= bit_offset; /* PATCH end */ while (s_mask > 0x00) { if (s_mask & *source) *dest |= d_mask; s_mask <<= 1; d_mask <<= 1; if (d_mask > 0x40) { dest++; ocnt++; d_mask = 0x01; *dest = 0x00; } } source++; icnt--; } return( ocnt ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_cvtPnn7To8 | +-------------------------------------------------------------------+ PURPOSE : This function converts from the 7 bit default alphabet for PNN Operator names to 8 bit alphabet. The function returns the length in bytes of the converted destination string. */ GLOBAL UBYTE utl_cvtPnn7To8 (const UBYTE* source, UBYTE source_len, UBYTE dcs, UBYTE* dest ) { return utl_cvt7To8 (source, (UBYTE)(MINIMUM (MAX_ALPHA_OPER_LEN,(source_len*8-(dcs&0x07)+6)/7) ), dest, 0); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_cvt8To7 | +-------------------------------------------------------------------+ PURPOSE : This function converts from the 8 bit default alphabet for SMS point-to-point messages to 7 bit alphabet. The function returns the length in bytes of the converted destination string. Note: This function is copied from entity SMS, file sms_tlf.c */ GLOBAL UBYTE utl_cvt8To7 ( UBYTE* source, UBYTE source_len, UBYTE* dest, UBYTE bit_offset) { UBYTE d_mask = 0x01; UBYTE s_mask; UBYTE icnt; UBYTE ocnt; *dest = 0x00; icnt = source_len; if( !icnt ) return( 0 ); ocnt = 1; /* PATCH */ if (icnt == source_len) d_mask <<= bit_offset; /* PATCH end */ while (icnt) { s_mask = 0x01; while (s_mask <= 0x40) { if (s_mask & *source) *dest |= d_mask; s_mask <<= 1; d_mask <<= 1; if (d_mask EQ 0x00) { dest++; /* don't increment ocnt if the new octet will not be used */ if ((s_mask < 0x80) OR (icnt NEQ 1)) ocnt++; d_mask = 0x01; *dest = 0x00; } } source++; icnt--; } return( ocnt ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_UTIL | | STATE : code ROUTINE : utl_getAlphabetCb | +--------------------------------------------------------------------+ PURPOSE : This function is used to extract the used alphabet out of the data coding scheme for cell broadcast SMS. */ GLOBAL UBYTE utl_getAlphabetCb ( UBYTE dcs ) { UBYTE alphabet = 0; /* means 7 bit default alphabet */ switch (dcs & 0xF0) { case( 0x10 ): if (dcs EQ 0x11) alphabet = 2; break; case( 0x70 ): case( 0x60 ): case( 0x50 ): case( 0x40 ): alphabet = (dcs & 0x0C) >> 2; break; case( 0xF0 ): alphabet = (dcs & 0x04) >> 2; break; } return alphabet; } /*==== EOF ========================================================*/