⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data.cpp

📁 ril source code for Windows CE
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

data.cpp

Abstract:


Notes:


--*/


#include "precomp.h"

//
// Connection speeds
//
const DWORD g_rgdwConnSpeeds[] =
{
    0xFFFFFFFF,     // RIL_SPEED_UNKNOWN
    0,      // RIL_SPEED_AUTO
    1,      // RIL_SPEED_300_V21
    65,     // RIL_SPEED_300_V110
    2,      // RIL_SPEED_1200_V22
    3,      // RIL_SPEED_1200_75_V23
    66,     // RIL_SPEED_1200_V110
    34,     // RIL_SPEED_1200_V120
    4,      // RIL_SPEED_2400_V22BIS
    5,      // RIL_SPEED_2400_V26TER
    68,     // RIL_SPEED_2400_V110
    36,     // RIL_SPEED_2400_V120
    6,      // RIL_SPEED_4800_V32
    70,     // RIL_SPEED_4800_V110
    38,     // RIL_SPEED_4800_V120
    7,      // RIL_SPEED_9600_V32
    12,     // RIL_SPEED_9600_V34
    71,     // RIL_SPEED_9600_V110
    39,     // RIL_SPEED_9600_V120
    14,     // RIL_SPEED_14400_V34
    75,     // RIL_SPEED_14400_V110
    43,     // RIL_SPEED_14400_V120
    15,     // RIL_SPEED_19200_V34
    79,     // RIL_SPEED_19200_V110
    47,     // RIL_SPEED_19200_V120
    16,     // RIL_SPEED_28800_V34
    80,     // RIL_SPEED_28800_V110
    48,     // RIL_SPEED_28800_V120
    81,     // RIL_SPEED_38400_V110
    49,     // RIL_SPEED_38400_V120
    82,     // RIL_SPEED_48000_V110
    50,     // RIL_SPEED_48000_V120
    83,     // RIL_SPEED_56000_V110
    51,     // RIL_SPEED_56000_V120
    115,    // RIL_SPEED_56000_TRANSP
    116,    // RIL_SPEED_64000_TRANSP
    120,    // RIL_SPEED_32000_PIAFS32K
    121,    // RIL_SPEED_64000_PIAFS64K
    130,    // RIL_SPEED_28800_MULTIMEDIA
    131,    // RIL_SPEED_32000_MULTIMEDIA
    132,    // RIL_SPEED_33600_MULTIMEDIA
    133,    // RIL_SPEED_56000_MULTIMEDIA
    134,    // RIL_SPEED_64000_MULTIMEDIA
};
const size_t ConnSpeedsEcount = sizeof(g_rgdwConnSpeeds) / sizeof(*g_rgdwConnSpeeds);

//
// HSCSD channel codings
//
const DWORD g_rgdwHSCSDCodings[] =
{
    RIL_HSCSDCODING_4800_FULLRATE,      // 1 = 2^0
    0,                                  // 2 = 2^1
    RIL_HSCSDCODING_9600_FULLRATE,      // 4 = 2^2
    RIL_HSCSDCODING_14400_FULLRATE,     // 8 = 2^3
};
const size_t HscsdCodingsEcount = sizeof(g_rgdwHSCSDCodings) / sizeof(*g_rgdwHSCSDCodings);

const DWORD g_rgdwHSCSDAirRates[] =
{
    0,      // RIL_HSCSDAIURATE_UNKNOWN
    1,      // RIL_HSCSDAIURATE_9600
    2,      // RIL_HSCSDAIURATE_14400
    3,      // RIL_HSCSDAIURATE_19200
    4,      // RIL_HSCSDAIURATE_28800
    5,      // RIL_HSCSDAIURATE_38400
    6,      // RIL_HSCSDAIURATE_43200
    7,      // RIL_HSCSDAIURATE_57600
};
const size_t HscsdAirRatesEcount = sizeof(g_rgdwHSCSDAirRates) / sizeof(*g_rgdwHSCSDAirRates);

//
// Bearer service names
//
static const DWORD g_rgdwBearerSvcNames[] =
{
    0xFFFFFFFF,     // RIL_BSVCNAME_UNKNOWN
    0,      // RIL_BSVCNAME_DATACIRCUIT_ASYNC_UDI_MODEM
    1,      // RIL_BSVCNAME_DATACIRCUIT_SYNC_UDI_MODEM
    2,      // RIL_BSVCNAME_PADACCESS_ASYNC_UDI
    3,      // RIL_BSVCNAME_PACKETACCESS_SYNC_UDI
    4,      // RIL_BSVCNAME_DATACIRCUIT_ASYNC_RDI
    5,      // RIL_BSVCNAME_DATACIRCUIT_SYNC_RDI
    6,      // RIL_BSVCNAME_PADACCESS_ASYNC_RDI
    7,      // RIL_BSVCNAME_PACKETACCESS_SYNC_RDI
};
#define NUM_BEARERSVCNAMES  (sizeof(g_rgdwBearerSvcNames) / sizeof(DWORD))


//
// Bearer service connection elements
//
static const DWORD g_rgdwBearerSvcConnElems[] =
{
    0xFFFFFFFF,     // RIL_BSVCCE_UNKNOWN
    0,      // RIL_BSVCCE_TRANSPARENT
    1,      // RIL_BSVCCE_NONTRANSPARENT
    2,      // RIL_BSVCCE_BOTH_TRANSPARENT
    3,      // RIL_BSVCCE_BOTH_NONTRANSPARENT
};
#define NUM_BEARERSVCCONNELEMS  (sizeof(g_rgdwBearerSvcConnElems) / sizeof(DWORD))


static const LISTVALUEMAP g_DataCompDirection[] =
{
    {0, RIL_DATACOMPDIR_NONE},
    {1, RIL_DATACOMPDIR_TRANSMIT},
    {2, RIL_DATACOMPDIR_RECEIVE},
    {3, RIL_DATACOMPDIR_BOTH},
};
#define NUM_DATACOMPDIRECTION (sizeof(g_DataCompDirection) / sizeof(LISTVALUEMAP))

static const LISTVALUEMAP g_DataCompNegotiation[] =
{
    {0, RIL_DATACOMP_OPTIONAL},
    {1, RIL_DATACOMP_REQUIRED},
};
#define NUM_DATACOMPNEGOTIATION (sizeof(g_DataCompNegotiation) / sizeof(LISTVALUEMAP))



//
// Error correction values: Original Request
//
static const LISTVALUEMAP g_ErrorCorrectionOrigRqst[] =
{
    {0, RIL_ECMODE_DIRECT},
    {1, RIL_ECMODE_BUFFERED},
    {2, RIL_ECMODE_NODETECT},
    {3, RIL_ECMODE_DETECT},
    {4, RIL_ECMODE_ALTERNATIVE},
};
#define NUM_ERRORCORRECTIONORIGRQST (sizeof(g_ErrorCorrectionOrigRqst) / sizeof(LISTVALUEMAP))

//
// Error correction values: Original Fallback
//
static const LISTVALUEMAP g_ErrorCorrectionOrigFbk[] =
{
    {0, RIL_ECMODE_OPTIONAL_USEBUFFERED},
    {1, RIL_ECMODE_OPTIONAL_USEDIRECT},
    {2, RIL_ECMODE_REQUIRED},
    {3, RIL_ECMODE_REQUIRED_LAPMONLY},
    {4, RIL_ECMODE_REQUIRED_ALTERNATIVEONLY},
};
#define NUM_ERRORCORRECTIONORIGFBK (sizeof(g_ErrorCorrectionOrigFbk) / sizeof(LISTVALUEMAP))

//
// Error correction values: Original Fallback
//
static const LISTVALUEMAP g_ErrorCorrectionAnsFbk[] =
{
    {0, RIL_ECMODE_DIRECT},
    {1, RIL_ECMODE_BUFFERED},
    {2, RIL_ECMODE_OPTIONAL_USEBUFFERED},
    {3, RIL_ECMODE_OPTIONAL_USEDIRECT},
    {4, RIL_ECMODE_REQUIRED},
    {5, RIL_ECMODE_REQUIRED_LAPMONLY},
    {6, RIL_ECMODE_REQUIRED_ALTERNATIVEONLY},
};
#define NUM_ERRORCORRECTIONANSFBK (sizeof(g_ErrorCorrectionAnsFbk) / sizeof(LISTVALUEMAP))

//
//
//
static HRESULT ParseGetHSCSDOptions(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetHSCSDOptions);
    UINT nValue;
    UINT i;
    RILHSCSDINFO* prhscsdi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    prhscsdi = (RILHSCSDINFO*)AllocBlob(sizeof(RILHSCSDINFO));
    if (!prhscsdi)
    {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prhscsdi, 0x00, sizeof(RILHSCSDINFO));
    prhscsdi->cbSize = sizeof(RILHSCSDINFO);


    // Parse "<prefix>+CHST: <rx_timeslots>"
    if (!ParseRspPrefix(szRsp, szRsp)                  ||
        !MatchStringBeginning(szRsp, "+CHST: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prhscsdi->dwTranspRxTimeslots = nValue;
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_TRANSPRXTIMESLOTS;

    // Parse ",<codings><postfix>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)   ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    // Set all required channel coding bits
    if (!nValue)
    {
        prhscsdi->dwTranspChannelCodings = RIL_HSCSDCODING_ALL;
    }
    else
    {
        for (i = 0 ; i < NUM_HSCSDCODINGS; i++)
        {
            if (nValue & (0x01 << i))
            {
                prhscsdi->dwTranspChannelCodings |= g_rgdwHSCSDCodings[i];
            }
        }
    }
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_TRANSPCHANNELCODINGS;


    // Parse "<prefix>+CHSN: <aiur>"
    if (!ParseRspPrefix(szRsp, szRsp)                  ||
        !MatchStringBeginning(szRsp, "+CHSN: ", szRsp) ||
        !ParseUIntAndVerifyAbove(szRsp, TRUE, 8, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0; i < NUM_HSCSDAIRRATES; i++)
    {
        if (nValue == g_rgdwHSCSDAirRates[i])
        {
            prhscsdi->dwAirInterfaceUserRate = i;
            break;
        }
    }
    if (NUM_HSCSDAIRRATES == i)
    {
        // We couldn't match the response with anything
        prhscsdi->dwAirInterfaceUserRate = RIL_HSCSDAIURATE_UNKNOWN;
    }
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_AIRINTERFACEUSERRATE;

    // Parse ",<rx_timeslots>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prhscsdi->dwNonTranspRxTimeslots = nValue;
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_NONTRANSPRXTIMESLOTS;

    // Parse ",<top_rx_timeslots>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prhscsdi->dwRxTimeslotsLimit = (nValue ? nValue : RIL_HSCSDTIMESLOTSLIMIT_NONE);
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_RXTIMESLOTSLIMIT;

    // Parse ",<codings><postfix>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)   ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    // Set all required channel coding bits
    if (!nValue)
    {
        prhscsdi->dwNonTranspChannelCodings = RIL_HSCSDCODING_ALL;
    }
    else
    {
        for (i = 0 ; i < NUM_HSCSDCODINGS; i++)
        {
            if (nValue & (0x01 << i))
            {
                prhscsdi->dwNonTranspChannelCodings |= g_rgdwHSCSDCodings[i];
            }
        }
    }
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_NONTRANSPCHANNELCODINGS;


    // Parse "+<prefix>CHSU: <mode><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                           ||
        !MatchStringBeginning(szRsp, "+CHSU: ", szRsp)          ||
        !ParseUIntAndVerifyAbove(szRsp, TRUE, 2, nValue, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prhscsdi->fAutoSvcLevelUpgrading = !!nValue;
    prhscsdi->dwParams |= RIL_PARAM_HSCSDI_AUTOSVCLEVELUPGRADING;


    pBlob = (void*)prhscsdi;
    cbBlob = sizeof(RILHSCSDINFO);

    Error:
    if (FAILED(hr))
    {
        FreeBlob(prhscsdi);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetHSCSDOptions(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetHSCSDOptions);

    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle)
    {
        hr = E_FAIL;
        goto Error;
    }

    if (!QueueCmd(pHandle, "AT+CHST?;+CHSN?;+CHSU?\r", CMDOPT_NONE, APIID_GETHSCSDOPTIONS, ParseGetHSCSDOptions,
                  NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:

    return hr;
}


//
//
//
HRESULT RILDrv_SetHSCSDOptions(DWORD dwParam, const RILHSCSDINFO* lpHscsdInfo)
{
    FUNCTION_TRACE(RILDrv_SetHSCSDOptions);

    char szCmd[MAX_PATH];
    LPSTR szWalk = szCmd;
    UINT nValue;
    UINT i;
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !lpHscsdInfo)
    {
        hr = E_FAIL;
        goto Error;
    }



    // Add "AT+CHST="
    (void)strncpyz(szWalk, "AT+CHST=", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<rx_timeslots>"
    if (lpHscsdInfo->dwParams & RIL_PARAM_HSCSDI_TRANSPRXTIMESLOTS)
    {
        if (RIL_HSCSDTIMESLOTS_DEFAULT == lpHscsdInfo->dwTranspRxTimeslots)
        {
            nValue = 0;
        }
        else
        {
            nValue = lpHscsdInfo->dwTranspRxTimeslots;
        }

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", nValue);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }

    // Add ","
    (void)strncpyz(szWalk, ",", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<codings>"
    if (lpHscsdInfo->dwParams & RIL_PARAM_HSCSDI_TRANSPCHANNELCODINGS)
    {
        nValue = 0;
        if (RIL_HSCSDCODING_ALL != lpHscsdInfo->dwTranspChannelCodings)
        {
            for (i = 0 ; i < NUM_HSCSDCODINGS; i++)
            {
                if (lpHscsdInfo->dwTranspChannelCodings & g_rgdwHSCSDCodings[i])
                {
                    nValue += (0x01 << i);
                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -