示例#1
0
文件: ccm.c 项目: anupam19/XperiaL_FM
/*
    The function needs to do the following:
    - Perform CCM "class" static initialization (if necessary - first time)
    - "Create" the instance (again, if it's the first creation of this instance)
*/
CcmStatus CCM_Create(McpHalChipId chipId, CcmObj **thisObj)
{
    CcmStatus       status;
    CcmImStatus     imStatus;
    ECCM_VAC_Status vacStatus;
    McpConfigParserStatus eConfigParserStatus;
	McpUtf8		scriptPath[MCP_HAL_CONFIG_FS_MAX_PATH_LEN_CHARS *
                           MCP_HAL_CONFIG_MAX_BYTES_IN_UTF8_CHAR] = "";
	
    MCP_FUNC_START("CCM_Create");

    MCP_VERIFY_FATAL((chipId < MCP_HAL_MAX_NUM_OF_CHIPS),
                     CCM_STATUS_INTERNAL_ERROR,
                     (("Invalid Chip Id"), chipId));
    
    if (_CCM_StaticData._ccm_Objs[chipId].refCount == 0)
    {
        _CCM_StaticData._ccm_Objs[chipId].chipId = chipId;
		/* read ini file */
		
        MCP_StrCpyUtf8(scriptPath, (const McpUtf8 *)CCM_VAC_CONFIG_PATH_NAME);
        MCP_StrCatUtf8(scriptPath, (const McpUtf8 *)CCM_VAC_CONFIG_FILE_NAME);

		eConfigParserStatus = MCP_CONFIG_PARSER_Open(scriptPath,
                                                     (McpU8*)CCM_VAC_MEM_CONFIG,
                                                     &(_CCM_StaticData._ccm_Objs[chipId].tConfigParser));
		MCP_VERIFY_ERR ((MCP_CONFIG_PARSER_STATUS_SUCCESS == eConfigParserStatus),
						CCM_VAC_STATUS_FAILURE_UNSPECIFIED,
						("_CCM_VAC_ConfigurationEngine_Create: reading config file failed with status %d",
						 eConfigParserStatus));
		
        imStatus = CCM_IM_Create(chipId, &_CCM_StaticData._ccm_Objs[chipId].imObj,
                                 _CCM_NotifyChipOn, &_CCM_StaticData._ccm_Objs[chipId]);
        MCP_VERIFY_FATAL((imStatus == CCM_IM_STATUS_SUCCESS), CCM_STATUS_INTERNAL_ERROR, ("CCM_IM_Create Failed"));

        CAL_Create (chipId, CCM_IMI_GetBtHciIfObj (_CCM_StaticData._ccm_Objs[chipId].imObj),
                    &(_CCM_StaticData._ccm_Objs[chipId].calObj),&(_CCM_StaticData._ccm_Objs[chipId].tConfigParser));
        /* CAL creation cannot fail */

        vacStatus = CCM_VAC_Create (chipId,
                                    _CCM_StaticData._ccm_Objs[chipId].calObj, 
                                    &(_CCM_StaticData._ccm_Objs[chipId].vacObj),
                                    &(_CCM_StaticData._ccm_Objs[chipId].tConfigParser));
        MCP_VERIFY_FATAL ((CCM_VAC_STATUS_SUCCESS == vacStatus), CCM_STATUS_INTERNAL_ERROR,
                          ("CCM_Create: VAC creation failed with status %d", vacStatus));
    }

    ++_CCM_StaticData._ccm_Objs[chipId].refCount;

    /* Set the instance pointer (out parameter) to be used in external references to this instance */
    *thisObj = &_CCM_StaticData._ccm_Objs[chipId];

    status = CCM_STATUS_SUCCESS;
    
    MCP_FUNC_END();

    return status;
}
void main()
{
    CcmImStatus imStatus;
    CcmImObj    *imObj = NULL;
    
    imStatus = CCM_IM_StaticInit();
    assert(imStatus == CCM_IM_STATUS_SUCCESS);

    imStatus = CCM_IM_Create(MCP_HAL_CHIP_ID_0, &imObj, NULL, NULL);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);

    imStatus = CCM_IM_RegisterStack(imObj, CCM_IM_STACK_ID_BT, CcmImBtCb);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);
    
    VerifyStackState(CCM_IM_STACK_ID_BT, CCM_IM_STACK_STATE_OFF);

    imStatus = CCM_IM_BtOn(imObj);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);

    VerifyStackState(CCM_IM_STACK_ID_BT, CCM_IM_STACK_STATE_ON);

    imStatus = CCM_IM_BtOnAbort(imObj);
    assert(imStatus == CCM_IM_STATUS_IMPROPER_STATE);

    VerifyStackState(CCM_IM_STACK_ID_BT, CCM_IM_STACK_STATE_ON);

    imStatus = CCM_IM_BtOff(imObj);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);

    VerifyStackState(CCM_IM_STACK_ID_BT, CCM_IM_STACK_STATE_OFF);

    imStatus = CCM_IM_DeregisterStack(imObj, CCM_IM_STACK_ID_BT);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);

    imStatus = CCM_IM_Destroy(&imObj);
    assert(imStatus == CCM_IM_STATUS_SUCCESS);
}