/* 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); }