ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VP_SDK / VP_Api / vp_api_thread_helper.h
1 /**
2  *  \brief    VP Api. Thread utility.
3  *  \brief    These macros are there to help static declaration of threads and their management.
4  *  \author   Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
5  *  \version  1.0
6  *  \date     first release 19/12/2006
7  *  \date     modification  26/03/2007
8  */
9
10 #ifndef _THREAD_HELPER_H_
11 #define _THREAD_HELPER_H_
12
13 #include <VP_Os/vp_os_types.h>
14 #include <VP_Os/vp_os_thread.h>
15
16
17 #ifdef __cplusplus
18 extern "C"
19 {
20 #endif
21
22
23 # define DEFINE_CYG_THREAD void* thread;
24 # define DECLARE_CYG_THREAD 0
25 # define STACK_ALIGNMENT
26
27 #define BEGIN_THREAD_TABLE  \
28   thread_table_entry_t threadTable[] = {
29
30 #define END_THREAD_TABLE    \
31     { 0 }                   \
32   };
33
34 #define THREAD_TABLE_ENTRY(name, priority) \
35   { #name, priority, 0, 0, NO_PARAM, thread_##name, 0, DECLARE_CYG_THREAD },
36
37 #define THREAD_TABLE_ENTRY_STACK(name, priority) \
38   { #name, priority, sizeof stack_##name, stack_##name, NO_PARAM, thread_##name, 0, DECLARE_CYG_THREAD },
39
40 #define THREAD_TABLE_ENTRY_STACK_PARAM(name, priority, params) \
41   { #name, priority, sizeof stack_##name, stack_##name, params, thread_##name, 0, DECLARE_CYG_THREAD },
42
43 #define DEFINE_THREAD_ROUTINE_STACK(name,params,stackSize) \
44   int8_t stack_##name[stackSize] STACK_ALIGNMENT;          \
45   DEFINE_THREAD_ROUTINE(name,params)
46
47 #define PROTO_THREAD_ROUTINE(name,params)    \
48   DEFINE_THREAD_ROUTINE(name,params)
49
50 #define PROTO_THREAD_ROUTINE_STACK(name,params,stackSize)    \
51   extern int8_t stack_##name[stackSize];                     \
52   DEFINE_THREAD_ROUTINE(name,params)
53
54 #define start_all_threads()                 vp_api_start_all_threads_tab(threadTable)
55 #define get_thread_idx(name)                vp_api_get_thread_idx_tab_by_name(threadTable, name)
56 #define start_thread(idx, param)            vp_api_start_thread_tab(threadTable, idx, param)
57 #define join_thread(idx)                    vp_api_join_thread_tab(threadTable, idx)
58 #define change_thread_prio(idx, priority)   vp_api_change_thread_prio_tab(threadTable, idx, priority)
59 #define resume_thread(idx)                  vp_api_resume_thread(threadTable, idx)
60 #define suspend_thread(idx)                 vp_api_suspend_thread(threadTable, idx)
61 #define suspend_all_threads(h)              vp_api_suspend_all_threads_tab(threadTable, h)
62 #define get_thread_handle(idx)              vp_api_get_thread_handle(threadTable, idx)
63
64 #define START_THREAD(name,param) start_thread(get_thread_idx(#name), param)
65
66 #define JOIN_THREAD(name) join_thread(get_thread_idx(#name))
67
68 #define CHANGE_THREAD_PRIO(name, priority) change_thread_prio(get_thread_idx(#name), priority)
69
70 #define GET_THREAD_HANDLE(name) get_thread_handle(get_thread_idx(#name))
71
72 #define RESUME_THREAD(name) resume_thread(get_thread_idx(#name))
73
74 #define SUSPEND_THREAD(name) suspend_thread(get_thread_idx(#name))
75
76 #define NO_PARAM        (0)
77
78 typedef struct
79 {
80   char*           name;
81   int32_t         priority;
82   int32_t         stackSize;
83   int8_t*         stack;
84   THREAD_PARAMS   parameters;
85   THREAD_ROUTINE  routine;
86   THREAD_HANDLE   handle;
87   DEFINE_CYG_THREAD
88 } thread_table_entry_t;
89
90 extern thread_table_entry_t threadTable[];
91
92 C_RESULT  vp_api_start_all_threads_tab(thread_table_entry_t* tab);
93 int32_t   vp_api_get_thread_idx_tab_by_name(thread_table_entry_t* tab, const char* name);
94 int32_t   vp_api_get_thread_idx_tab_by_handle(thread_table_entry_t* tab, THREAD_HANDLE handle, int32_t ret_on_failure);
95 C_RESULT  vp_api_start_thread_tab(thread_table_entry_t* tab, int32_t idx, THREAD_PARAMS parameters);
96 C_RESULT  vp_api_join_thread_tab(thread_table_entry_t* tab, int32_t idx);
97 C_RESULT  vp_api_change_thread_prio_tab(thread_table_entry_t* tab, int32_t idx, int32_t priority);
98 C_RESULT  vp_api_resume_thread(thread_table_entry_t* tab, int32_t idx);
99 C_RESULT  vp_api_suspend_thread(thread_table_entry_t* tab, int32_t idx);
100 THREAD_HANDLE vp_api_get_thread_handle(thread_table_entry_t* tab, int32_t idx);
101
102 // Suspend all threads but the one passed as second parameters (if it's an application thread)
103 C_RESULT  vp_api_suspend_all_threads_tab(thread_table_entry_t* tab, THREAD_HANDLE handle);
104
105 #ifdef __cplusplus
106 }
107 #endif
108
109 #endif // _THREAD_HELPER_H_