Revision 408a606c
| inc/urt_core.h | ||
|---|---|---|
| 40 | 40 |
/* DATA STRUCTURES AND TYPES */ |
| 41 | 41 |
/******************************************************************************/ |
| 42 | 42 |
|
| 43 |
/** |
|
| 44 |
* @brief core |
|
| 45 |
*/ |
|
| 46 |
typedef struct urt_core |
|
| 47 |
{
|
|
| 48 |
urt_node_t* _nodes; |
|
| 49 |
urt_osEventSource_t* _evtSource; |
|
| 50 |
urt_osMutex_t _lock; |
|
| 51 |
urt_status_t _status; |
|
| 52 |
#if (URT_CFG_PUBSUB_ENABLED) |
|
| 53 |
urt_topic_t* _topics; |
|
| 54 |
#endif /* URT_CFG_PUBSUB_ENABLED */ |
|
| 55 |
#if (URT_CFG_RPC_ENABLED) |
|
| 56 |
urt_service_t* _services; |
|
| 57 |
#endif /* URT_CFG_RPC_ENABLED */ |
|
| 58 |
}urt_core_t; |
|
| 59 |
|
|
| 60 |
static urt_core_t core; |
|
| 61 |
|
|
| 62 | 43 |
/******************************************************************************/ |
| 63 | 44 |
/* MACROS */ |
| 64 | 45 |
/******************************************************************************/ |
| ... | ... | |
| 73 | 54 |
|
| 74 | 55 |
void urtCoreInit(void); |
| 75 | 56 |
urt_status_t urtCoreGetStatus(void); |
| 57 |
urt_osMutex_t urtCoreGetMutex(void); |
|
| 58 |
urt_osEventSource_t* urtCoreGetEvtSource(void); |
|
| 59 |
urt_node_t* urtCoreGetNodes(void); |
|
| 76 | 60 |
void urtCoreStartNodes(void); |
| 77 | 61 |
urt_status_t urtCoreSynchronizeNodes(urt_node_t* node); |
| 78 | 62 |
urt_status_t urtCoreStopNodes(urt_status_t reason); |
| src/urt_core.c | ||
|---|---|---|
| 33 | 33 |
/* LOCAL TYPES */ |
| 34 | 34 |
/******************************************************************************/ |
| 35 | 35 |
|
| 36 |
/** |
|
| 37 |
* @brief core |
|
| 38 |
*/ |
|
| 39 |
typedef struct urt_core |
|
| 40 |
{
|
|
| 41 |
urt_node_t* _nodes; |
|
| 42 |
urt_osEventSource_t* _evtSource; |
|
| 43 |
urt_osMutex_t _lock; |
|
| 44 |
urt_status_t _status; |
|
| 45 |
#if (URT_CFG_PUBSUB_ENABLED) |
|
| 46 |
urt_topic_t* _topics; |
|
| 47 |
#endif /* URT_CFG_PUBSUB_ENABLED */ |
|
| 48 |
#if (URT_CFG_RPC_ENABLED) |
|
| 49 |
urt_service_t* _services; |
|
| 50 |
#endif /* URT_CFG_RPC_ENABLED */ |
|
| 51 |
}urt_core_t; |
|
| 52 |
|
|
| 53 |
static urt_core_t core; |
|
| 54 |
|
|
| 36 | 55 |
/******************************************************************************/ |
| 37 | 56 |
/* LOCAL VARIABLES */ |
| 38 | 57 |
/******************************************************************************/ |
| ... | ... | |
| 74 | 93 |
} |
| 75 | 94 |
|
| 76 | 95 |
/** |
| 96 |
* @brief Get Core mutex. |
|
| 97 |
* |
|
| 98 |
* @return Current system mutex. |
|
| 99 |
*/ |
|
| 100 |
urt_osMutex_t urtCoreGetMutex(void) |
|
| 101 |
{
|
|
| 102 |
return core._lock; |
|
| 103 |
} |
|
| 104 |
|
|
| 105 |
/** |
|
| 106 |
* @brief Get Core event source. |
|
| 107 |
* |
|
| 108 |
* @return Current system event source. |
|
| 109 |
*/ |
|
| 110 |
urt_osEventSource_t* urtCoreGetEvtSource(void) |
|
| 111 |
{
|
|
| 112 |
return core._evtSource; |
|
| 113 |
} |
|
| 114 |
|
|
| 115 |
urt_node_t* urtCoreGetNodes(void) |
|
| 116 |
{
|
|
| 117 |
return core._nodes; |
|
| 118 |
} |
|
| 119 |
|
|
| 120 |
/** |
|
| 77 | 121 |
* @brief Start threads of all nodes of the Core. |
| 78 | 122 |
*/ |
| 79 | 123 |
void urtCoreStartNodes(void) |
| src/urt_node.c | ||
|---|---|---|
| 52 | 52 |
{
|
| 53 | 53 |
urt_osEventMask_t mask; |
| 54 | 54 |
urt_osEventFlags_t flag; //TODO: flag from core here |
| 55 |
urtEventRegister(core._evtSource, &localNode.listener, mask, flag);
|
|
| 55 |
urtEventRegister(urtCoreGetEvtSource(), &localNode.listener, mask, flag);
|
|
| 56 | 56 |
if (localNode.setupcallback != NULL) |
| 57 | 57 |
{
|
| 58 | 58 |
mask = localNode.setupcallback(&localNode, arg); |
| ... | ... | |
| 66 | 66 |
mask = 0xFFFFFFFF; |
| 67 | 67 |
} |
| 68 | 68 |
|
| 69 |
if (core._status == URT_STATUS_OK)
|
|
| 69 |
if (urtCoreGetStatus() == URT_STATUS_OK)
|
|
| 70 | 70 |
{
|
| 71 | 71 |
urtCoreSynchronizeNodes(&localNode); |
| 72 | 72 |
} |
| ... | ... | |
| 92 | 92 |
{
|
| 93 | 93 |
localNode.shutdowncallback(&localNode, urtCoreGetStatus(), arg); |
| 94 | 94 |
} |
| 95 |
urtEventUnregister(core._evtSource, &localNode.listener);
|
|
| 95 |
urtEventUnregister(urtCoreGetEvtSource(), &localNode.listener);
|
|
| 96 | 96 |
urt_osThread_t* threadToTerminate = localNode.thread; |
| 97 | 97 |
urt_osThread_t* threadToTerminateChild; |
| 98 | 98 |
while (threadToTerminate != NULL) |
| ... | ... | |
| 150 | 150 |
#if (URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING) |
| 151 | 151 |
node->loops = 0; |
| 152 | 152 |
#endif /* URT_CFG_PUBSUB_PROFILING || URT_CFG_RPC_PROFILING */ |
| 153 |
urtMutexLock(&core._lock); |
|
| 154 |
node->next = core._nodes; |
|
| 155 |
core._nodes = node; |
|
| 156 |
urtMutexUnlock(&core._lock); |
|
| 153 |
urt_osMutex_t mutexTemp = urtCoreGetMutex(); |
|
| 154 |
urtMutexLock(&mutexTemp); |
|
| 155 |
node->next = urtCoreGetNodes(); |
|
| 156 |
urt_node_t* nodeCore = urtCoreGetNodes(); |
|
| 157 |
nodeCore = node; |
|
| 158 |
urtMutexUnlock(&mutexTemp); |
|
| 157 | 159 |
localNode = *node; |
| 158 | 160 |
return; |
| 159 | 161 |
} |
Also available in: Unified diff