/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_getTaskState ( xme_core_component_t componentId, xme_core_component_functionId_t functionId, xme_core_exec_functionState_t* taskState ) { xme_core_exec_taskDescriptor_t* task = NULL; xme_status_t status; XME_CHECK_MSG(XME_STATUS_SUCCESS == (status = xme_core_exec_descriptorTable_getTaskDescriptor(componentId, functionId, &task)), status, XME_LOG_WARNING, MODULE_ACRONYM "error getting task descriptor for [%d|%d]\n", componentId, functionId); XME_CHECK(NULL != task, XME_STATUS_INTERNAL_ERROR); /* todo Is locking while reading such a thing necessary? */ xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); *taskState = task->state; xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); return XME_STATUS_SUCCESS; }
void xme_core_exec_lockMutex ( const char* ID, xme_hal_sync_criticalSectionHandle_t handle, xme_core_component_t componentId, xme_core_component_functionId_t functionId ) { #ifdef LOCKLOGGING XME_LOG(XME_LOG_DEBUG, MODULE_ACRONYM "%3d %s waiting [%d|%d]\n", handle, ID, componentId, functionId); #else XME_UNUSED_PARAMETER(ID); XME_UNUSED_PARAMETER(componentId); XME_UNUSED_PARAMETER(functionId); #endif xme_hal_sync_enterCriticalSection(handle); #ifdef LOCKLOGGING XME_LOG(XME_LOG_DEBUG, MODULE_ACRONYM "%3d %s entered [%d|%d]\n", handle, ID, componentId, functionId); #endif }
/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_dispatcher_setRunnable ( xme_core_component_t componentId, xme_core_component_functionId_t functionId, xme_hal_sched_taskHandle_t handle ) { xme_core_exec_taskDescriptor_t* taskRecord; xme_status_t status; /* We only deal with an initialized component */ if (!xme_core_exec_isInitialized()) return XME_STATUS_UNEXPECTED; XME_CHECK(XME_STATUS_SUCCESS == (status=xme_core_exec_descriptorTable_getTaskDescriptor(componentId, functionId, &taskRecord)), status); xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); taskRecord->handle = handle; xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); return XME_STATUS_SUCCESS; }
xme_status_t xme_hal_graphviz_generateImage ( const char* dotFilePath, const char* pngFilePath ) { FILE *fp; graph_t *graph; fopen_s(&fp, dotFilePath, "r"); XME_CHECK(fp != NULL, XME_STATUS_INTERNAL_ERROR); xme_hal_sync_enterCriticalSection(xme_hal_graphviz_mutex); graph = agread_usergets(fp, fgets); gvLayout(xme_hal_graphviz_gvc, graph, "dot"); gvRenderFilename(xme_hal_graphviz_gvc, graph, "png", pngFilePath); gvFreeLayout(xme_hal_graphviz_gvc, graph); agclose(graph); xme_hal_sync_leaveCriticalSection(xme_hal_graphviz_mutex); fclose(fp); return XME_STATUS_SUCCESS; }
/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_descriptorTable_fini( void ) { xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); XME_HAL_TABLE_FINI(taskDescriptorsTable); xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); if(XME_STATUS_SUCCESS != xme_hal_sync_destroyCriticalSection(taskDescriptorsMutex)) XME_LOG(XME_LOG_ERROR, MODULE_ACRONYM "could not destroy task descriptor table mutex!\n"); return XME_STATUS_SUCCESS; }
/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_descriptorTable_getTaskDescriptor ( xme_core_component_t componentId, xme_core_component_functionId_t functionId, xme_core_exec_taskDescriptor_t** taskDesc ) { xme_core_exec_taskDescriptor_t* schedRecord = NULL; bool found=false; /* We only deal with an initialized component */ if (!xme_core_exec_isInitialized()) return XME_STATUS_UNEXPECTED; XME_LOG(XME_LOG_DEBUG, MODULE_ACRONYM "getTaskDescriptor(): (%d:%d)\n", componentId, functionId); xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); { XME_HAL_TABLE_ITERATE_BEGIN(taskDescriptorsTable, uint32_t, i, xme_core_exec_taskDescriptor_t, schedRecord1); { if((schedRecord1->wrapper->componentId == componentId) && (schedRecord1->wrapper->functionId == functionId)) { schedRecord=schedRecord1; found=true; break; } } XME_HAL_TABLE_ITERATE_END(); } xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); XME_LOG(XME_LOG_DEBUG, MODULE_ACRONYM "/getTaskDescriptor(): (%d:%d)\n", componentId, functionId); if(found) { *taskDesc = schedRecord; return XME_STATUS_SUCCESS; } else { XME_LOG(XME_LOG_VERBOSE, MODULE_ACRONYM "[%d|%d] not found in task table!\n", componentId, functionId); *taskDesc = NULL; return XME_STATUS_NOT_FOUND; } }
/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_descriptorTable_init( void ) { /* Initialize a critical section to control the access to the task list */ taskDescriptorsMutex = xme_hal_sync_createCriticalSection(); XME_CHECK( XME_HAL_SYNC_INVALID_CRITICAL_SECTION_HANDLE != taskDescriptorsMutex, XME_STATUS_INTERNAL_ERROR); xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); XME_HAL_TABLE_INIT(taskDescriptorsTable); xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); return XME_STATUS_SUCCESS; }
/*--------------------------------------------------------------------------*/ static xme_status_t xme_core_exec_dispatcher_addNewTaskDescriptor ( xme_core_exec_taskDescriptor_t** record1 ) { xme_core_exec_taskDescriptor_t* rec1 = NULL; xme_hal_table_rowHandle_t handle; XME_LOG(XME_LOG_DEBUG, MODULE_ACRONYM "> dispatcher_createTaskRecord()\n"); xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); { handle = XME_HAL_TABLE_ADD_ITEM(taskDescriptorsTable); XME_CHECK_REC(XME_HAL_TABLE_INVALID_ROW_HANDLE != handle, XME_STATUS_INTERNAL_ERROR, { xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); });
/*--------------------------------------------------------------------------*/ xme_status_t xme_core_exec_setTaskState ( xme_core_component_t componentId, xme_core_component_functionId_t functionId, xme_core_exec_functionState_t newTaskState ) { xme_core_exec_taskDescriptor_t* task = NULL; XME_CHECK_MSG(XME_STATUS_SUCCESS == xme_core_exec_descriptorTable_getTaskDescriptor(componentId, functionId, &task), XME_STATUS_INTERNAL_ERROR, XME_LOG_WARNING, MODULE_ACRONYM "error getting task descriptor for [%d|%d]\n", componentId, functionId); XME_CHECK(NULL != task, XME_STATUS_INTERNAL_ERROR); xme_hal_sync_enterCriticalSection(taskDescriptorsMutex); task->state = newTaskState; xme_hal_sync_leaveCriticalSection(taskDescriptorsMutex); return XME_STATUS_SUCCESS; }
void userInputTask(void* userData) { char inputBuffer[100]; char cmdBuffer[CMD_BUFFER_SIZE]; command_t* command = (command_t*)xme_hal_mem_alloc(sizeof(command_t)); XME_UNUSED_PARAMETER(userData); XME_LOG ( XME_LOG_ALWAYS, "\nEnter command (to print help type \"help\" without quotes):\n>" ); XME_CHECK ( inputBuffer == fgets(inputBuffer, sizeof(inputBuffer), stdin), XME_CHECK_RVAL_VOID ); #ifdef _MSC_VER (void)sscanf_s(inputBuffer, "%" CMD_STRLEN_STRING "s", cmdBuffer, CMD_BUFFER_SIZE); #else (void)sscanf(inputBuffer, "%" CMD_STRLEN_STRING "s", cmdBuffer); #endif tolowerString(cmdBuffer, cmdBuffer, CMD_BUFFER_SIZE); // TODO: // - Allow nodeName instead of nodeID (add "subscriberNode" 4099) // - Allow componentTypeName instead of componentType (add 2 "subscriber") if (0 == strcmp(cmdBuffer, BUILD_STRING)) { xme_core_node_nodeId_t nodeID; xme_core_componentType_t componentType; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, BUILD_STRING " %d %d", &nodeID, &componentType); #else (void)sscanf(inputBuffer, BUILD_STRING " %d %d", (int*)&nodeID, (int*)&componentType); #endif xme_core_nodeMgr_compRep_cancelBuild(builder); builder = xme_core_nodeMgr_compRep_createBuilder(nodeID, componentType); return; } else if (0 == strcmp(cmdBuffer, SET_QUEUE_SIZE_STRING)) { uint32_t portTypeID; uint32_t queueSize; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, SET_QUEUE_SIZE_STRING " %" PRIu32 " %" PRIu32, &portTypeID, &queueSize); #else (void)sscanf(inputBuffer, SET_QUEUE_SIZE_STRING " %" PRIu32 " %" PRIu32, &portTypeID, &queueSize); #endif XME_CHECK_MSG(queueSize <= UCHAR_MAX, XME_CHECK_RVAL_VOID, XME_LOG_ERROR, "Maximum queue size is 255.\n"); xme_core_nodeMgr_compRep_builderSetQueueSize(builder, portTypeID, (uint8_t)queueSize); return; } else if (0 == strcmp(cmdBuffer, SET_EXECUTION_PERIOD_STRING)) { uint32_t functionTypeID; xme_hal_time_timeInterval_t execPeriod; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, SET_EXECUTION_PERIOD_STRING " %" PRIu32 " %" PRIu64, &functionTypeID, (uint64_t*)&execPeriod); #else (void)sscanf(inputBuffer, SET_EXECUTION_PERIOD_STRING " %" PRIu32 " %" PRIu64, &functionTypeID, (uint64_t*)&execPeriod); #endif xme_core_nodeMgr_compRep_builderSetExecutionPeriod(builder, functionTypeID, execPeriod); return; } else if (0 == strcmp(cmdBuffer, SET_INITIALIZATION_STRING_STRING)) { char* initializationString; size_t len = xme_hal_safeString_strnlen(inputBuffer, sizeof(inputBuffer)); if (inputBuffer[len-1] == '\n') { inputBuffer[len-1] = 0; } initializationString = &inputBuffer[strlen(SET_INITIALIZATION_STRING_STRING)+1]; xme_core_nodeMgr_compRep_builderSetInitializationString(builder, initializationString); return; } else if (0 == strcmp(cmdBuffer, COMMIT_STRING)) { xme_status_t status; xme_core_nodeMgr_compRep_componentHandle_t componentHandle; status = xme_core_nodeMgr_compRep_build(builder, &componentHandle); builder = NULL; XME_CHECK_MSG(XME_STATUS_SUCCESS == status, XME_CHECK_RVAL_VOID, XME_LOG_ERROR, "Command could not be executed.\n"); command->commandType = ADD; command->commandData.addComponent.componentHandle = componentHandle; } else if (0 == strcmp(cmdBuffer, ADD_STRING)) { xme_status_t status; xme_core_node_nodeId_t nodeID; xme_core_componentType_t componentType; xme_core_nodeMgr_compRep_componentBuilder_t* addBuilder = NULL; xme_core_nodeMgr_compRep_componentHandle_t componentHandle; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, ADD_STRING " %d %d", &nodeID, &componentType); #else (void)sscanf(inputBuffer, ADD_STRING " %d %d", (int*)&nodeID, (int*)&componentType); #endif addBuilder = xme_core_nodeMgr_compRep_createBuilder(nodeID, componentType); XME_CHECK(NULL != addBuilder, XME_CHECK_RVAL_VOID); status = xme_core_nodeMgr_compRep_build(addBuilder, &componentHandle); XME_CHECK_MSG(XME_STATUS_SUCCESS == status, XME_CHECK_RVAL_VOID, XME_LOG_ERROR, "Command could not be executed.\n"); command->commandType = ADD; command->commandData.addComponent.componentHandle = componentHandle; } else if (0 == strcmp(cmdBuffer, REMOVE_STRING)) { command->commandType = REMOVE; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, REMOVE_STRING " %d %d", (int*)&command->commandData.removeComponent.nodeID, &command->commandData.removeComponent.componentID); #else (void)sscanf(inputBuffer, REMOVE_STRING " %d %d", (int*)&command->commandData.removeComponent.nodeID, &command->commandData.removeComponent.componentID); #endif } else if (0 == strcmp(cmdBuffer, REMOVE2_STRING)) // equivalent alternative for REMOVE_STRING { command->commandType = REMOVE; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, REMOVE2_STRING " %d %d", (int*)&command->commandData.removeComponent.nodeID, &command->commandData.removeComponent.componentID); #else (void)sscanf(inputBuffer, REMOVE2_STRING " %d %d", (int*)&command->commandData.removeComponent.nodeID, &command->commandData.removeComponent.componentID); #endif } else if (0 == strcmp(cmdBuffer, LOGOUT_STRING)) { command->commandType = LOGOUT; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, LOGOUT_STRING " %d", (int*)&command->commandData.logout.nodeID); #else (void)sscanf(inputBuffer, LOGOUT_STRING " %d", (int*)&command->commandData.logout.nodeID); #endif } else if (0 == strcmp(cmdBuffer, LIST_STRING)) { // TODO: Upper case LIST will not work here. More robust parsing needed. #ifdef _MSC_VER (void)sscanf_s(inputBuffer, LIST_STRING " %" CMD_STRLEN_STRING "s", cmdBuffer, CMD_BUFFER_SIZE); #else (void)sscanf(inputBuffer, LIST_STRING " %" CMD_STRLEN_STRING "s", cmdBuffer); #endif tolowerString(cmdBuffer, cmdBuffer, CMD_BUFFER_SIZE); if (0 == strcmp(cmdBuffer, LIST_TYPES_STRING)) { xme_core_manifestRepository_iterator_t iter; xme_core_componentManifest_t* compManifest; iter = xme_core_manifestRepository_initIterator(); XME_LOG(XME_LOG_ALWAYS, "\nContent of manifest repository of this node:\n"); XME_LOG(XME_LOG_ALWAYS, " component type name | component type ID\n"); XME_LOG(XME_LOG_ALWAYS, "---------------------------------|------------------\n"); while (xme_core_manifestRepository_hasNext(iter)) { compManifest = xme_core_manifestRepository_next(&iter); XME_LOG(XME_LOG_NOTE, "%32s | %5d\n", compManifest->name, compManifest->componentType); } xme_core_manifestRepository_finiIterator(iter); return; } else if (0 == strcmp(cmdBuffer, LIST_NODES_STRING)) { // Print list of all nodes in the system char nodeNameBuffer[20]; xme_core_directory_nodeRegistryController_nodeIDIterator_t nodeIDIterator; XME_LOG(XME_LOG_ALWAYS, "\nThe following nodes are registered in the system:\n"); XME_LOG(XME_LOG_ALWAYS, " node name | node ID\n"); XME_LOG(XME_LOG_ALWAYS, "---------------------|--------\n"); xme_core_directory_nodeRegistryController_initNodeIDIterator(&nodeIDIterator); while (xme_core_directory_nodeRegistryController_hasNextNodeID(&nodeIDIterator)) { xme_core_node_nodeId_t nodeID; nodeID = xme_core_directory_nodeRegistryController_nextNodeID(&nodeIDIterator); xme_core_directory_nodeRegistryController_getNodeName(nodeID, nodeNameBuffer, sizeof(nodeNameBuffer)); XME_LOG(XME_LOG_NOTE, "%20s | %2d\n", nodeNameBuffer, nodeID); } xme_core_directory_nodeRegistryController_finiNodeIDIterator(&nodeIDIterator); return; } else if (0 == strcmp(cmdBuffer, LIST_COMPONENTS_STRING)) { // Print list of all components in the system bool verbose = false; char nodeNameBuffer[20]; char portBuffer[6]; char functionBuffer[30]; #ifdef _MSC_VER (void)sscanf_s(inputBuffer, LIST_STRING " " LIST_COMPONENTS_STRING " %" CMD_STRLEN_STRING "s", cmdBuffer, CMD_BUFFER_SIZE); #else (void)sscanf(inputBuffer, LIST_STRING " " LIST_COMPONENTS_STRING " %" CMD_STRLEN_STRING "s", cmdBuffer); #endif if (0 == strcmp(cmdBuffer, LIST_COMPONENTS_VERBOSE_STRING)) { verbose = true; } XME_LOG(XME_LOG_ALWAYS, "\nThe following components are registered in the system:\n"); if (verbose) { XME_LOG(XME_LOG_ALWAYS, " | comp. | | port: | function:\n"); XME_LOG(XME_LOG_ALWAYS, " node name (ID) | ID | comp. type name (ID) | queue | exec.period\n"); XME_LOG(XME_LOG_ALWAYS, "----------------------|-------|---------------------------|-------|------------\n"); } else { XME_LOG(XME_LOG_ALWAYS, " | comp. |\n"); XME_LOG(XME_LOG_ALWAYS, " node name (ID) | ID | comp. type name (ID)\n"); XME_LOG(XME_LOG_ALWAYS, "----------------------|-------|--------------------------\n"); } xme_core_nodeMgr_compRep_componentIteratorInit(); while (xme_core_nodeMgr_compRep_componentIteratorHasNext()) { xme_core_node_nodeId_t nodeID; xme_core_component_t componentID; xme_core_componentType_t componentType; xme_core_componentManifest_t manifest; xme_core_nodeMgr_compRep_componentHandle_t componentHandle; xme_core_nodeMgr_compRep_portHandle_t portHandle; xme_core_nodeMgr_compRep_functionHandle_t functionHandle; uint16_t i = 0u; componentHandle = xme_core_nodeMgr_compRep_componentIteratorNext(); nodeID = xme_core_nodeMgr_compRep_getNodeID(componentHandle); componentID = xme_core_nodeMgr_compRep_getComponentID(componentHandle); componentType = xme_core_nodeMgr_compRep_getComponentType(componentHandle); xme_core_manifestRepository_findComponentManifest(componentType, &manifest); xme_core_directory_nodeRegistryController_getNodeName(nodeID, nodeNameBuffer, sizeof(nodeNameBuffer)); if (verbose) { XME_LOG(XME_LOG_NOTE, "%16s (%2d) | %5d | %17s (%5d) | |\n", nodeNameBuffer, nodeID, componentID, manifest.name, componentType); } else { XME_LOG(XME_LOG_NOTE, "%16s (%2d) | %5d | %17s (%5d)\n", nodeNameBuffer, nodeID, componentID, manifest.name, componentType); } if (verbose) { i = 0u; do { uint16_t queueSize; xme_hal_time_timeInterval_t execPeriod; portHandle = xme_core_nodeMgr_compRep_getPort(componentHandle, i); if (XME_CORE_NODEMGR_COMPREP_INVALID_HANDLE != portHandle) { queueSize = xme_core_nodeMgr_compRep_getQueueSize(portHandle); xme_hal_safeString_snprintf(portBuffer, sizeof(portBuffer), "%2d:%2" PRIu16, i, queueSize); } else { xme_hal_safeString_snprintf(portBuffer, sizeof(portBuffer), " "); } functionHandle = xme_core_nodeMgr_compRep_getFunction(componentHandle, i); if (XME_CORE_NODEMGR_COMPREP_INVALID_HANDLE != functionHandle) { execPeriod = xme_core_nodeMgr_compRep_getExecutionPeriod(portHandle); if (0ull == execPeriod || 1000000ull < execPeriod) { execPeriod = execPeriod / 1000000ull; xme_hal_safeString_snprintf(functionBuffer, sizeof(functionBuffer), "%2d:%2" PRIu64 "ms", i, execPeriod); } else { xme_hal_safeString_snprintf(functionBuffer, sizeof(functionBuffer), "%2d:%2" PRIu64 "ns", i, execPeriod); } } else { xme_hal_safeString_snprintf(functionBuffer, sizeof(functionBuffer), " "); } XME_LOG(XME_LOG_NOTE, " | | | %s | %s\n", portBuffer, functionBuffer); i++; } while (XME_CORE_NODEMGR_COMPREP_INVALID_HANDLE != portHandle && XME_CORE_NODEMGR_COMPREP_INVALID_HANDLE != functionHandle); } } xme_core_nodeMgr_compRep_componentIteratorFini(); return; } else { XME_LOG(XME_LOG_ERROR, "Unknown command. Enter help to print available commands."); return; } } else if (0 == strcmp(cmdBuffer, HELP_STRING)) { XME_LOG ( XME_LOG_ALWAYS, "Enter one of the following commands:\n" "COMMAND [PARAMS...] DESCRIPTION\n" "add <nodeID> <componentType> Adds a new component of the given component type\n" " to the given node.\n" "rem <nodeID> <componentID> Removes the given component instance from the\n" " given node.\n" "logout <nodeID> Trigger logout of the given node.\n" "list nodes Prints list of all nodes.\n" "list components Prints list of all components.\n" "list components verbose Prints list of all components with verbose\n" " information.\n" "list types Prints list of all component types.\n" "\n" "Advanced options for building a component:\n" "build <nodeID> <componentType> Like \"add\", but the component is not immediately\n" " added. Use the following functions to further\n" " refine the component definition.\n" "setqs <portTypeID> <queueSize> Set queue size of the given port to the given\n" " value.\n" "setep <functTypeID> <timeInNs> Set execution period of the given function to\n" " the given time value in nanoseconds.\n" "setis <initializationString> Set the initialization string for the new\n" "commit component. Finally add the constructed component.\n" ); return; } else { XME_LOG(XME_LOG_ERROR, "Unknown command. Enter help to print available commands."); return; } xme_hal_sync_enterCriticalSection(commandQueueMutex); xme_hal_singlyLinkedList_addItem(&commandQueue, command); xme_hal_sync_leaveCriticalSection(commandQueueMutex); }
void configuratorExtension_adv_pnpControlUI_pnpControlUIFunction_step ( configuratorExtension_adv_pnpControlUI_pnpControlUIComponent_config_t* const componentConfig ) { { // PROTECTED REGION ID(CONFIGURATOREXTENSION_ADV_PNPCONTROLUI_PNPCONTROLUIFUNCTION_STEP_C) ENABLED START command_t* command = NULL; xme_status_t status; XME_UNUSED_PARAMETER(componentConfig); xme_hal_sync_enterCriticalSection(commandQueueMutex); { if (xme_hal_singlyLinkedList_getItemCount(&commandQueue) > 0) { command = (command_t*) xme_hal_singlyLinkedList_itemFromIndex(&commandQueue, (xme_hal_linkedList_index_t) 0); (void) xme_hal_singlyLinkedList_removeItem(&commandQueue, (void*) command, false); } } xme_hal_sync_leaveCriticalSection(commandQueueMutex); if (NULL != command) { switch (command->commandType) { case ADD: { status = xme_core_pnp_pnpManager_plugInNewComponent(command->commandData.addComponent.componentHandle); if (XME_STATUS_SUCCESS != status) { XME_LOG(XME_LOG_ERROR, "Command could not be executed.\n"); } } break; case REMOVE: { status = xme_core_pnp_pnpManager_unannounceComponentOnNode ( command->commandData.removeComponent.nodeID, command->commandData.removeComponent.componentID ); if (XME_STATUS_SUCCESS != status) { XME_LOG(XME_LOG_ERROR, "Command could not be executed.\n"); } } break; case LOGOUT: { status = xme_core_pnp_pnpManager_unannounceNode ( command->commandData.logout.nodeID ); if (XME_STATUS_SUCCESS != status) { XME_LOG(XME_LOG_ERROR, "Command could not be executed.\n"); } } break; default: XME_LOG(XME_LOG_ERROR, "Error in command structure. Unknown command type: %d\n", command->commandType); } // Always free command xme_hal_mem_free(command); } // PROTECTED REGION END } { // PROTECTED REGION ID(CONFIGURATOREXTENSION_ADV_PNPCONTROLUI_PNPCONTROLUIFUNCTION_STEP_2_C) ENABLED START // Nothing to do here // PROTECTED REGION END } }