Line |
Branch |
Decision |
Exec |
Source |
1 |
|
|
|
/** |
2 |
|
|
|
* @file thread_controller.h |
3 |
|
|
|
* |
4 |
|
|
|
* @date Jan 5, 2019 |
5 |
|
|
|
* @author Matthew Kennedy, (c) 2019 |
6 |
|
|
|
*/ |
7 |
|
|
|
|
8 |
|
|
|
#pragma once |
9 |
|
|
|
|
10 |
|
|
|
/** |
11 |
|
|
|
* @brief A base class for a controller that requires its own thread. |
12 |
|
|
|
* |
13 |
|
|
|
* Inherit from ThreadController. Implement ThreadTask with the logic required for your thread. |
14 |
|
|
|
* The template parameter specifies the size of the stack used for the thread. (because we have to |
15 |
|
|
|
* allocate the stack at compile time, it has to be a template parameter instead of a normal parameter) |
16 |
|
|
|
*/ |
17 |
|
|
|
template <int TStackSize> |
18 |
|
|
|
class ThreadController : public chibios_rt::BaseStaticThread<TStackSize> |
19 |
|
|
|
{ |
20 |
|
|
|
private: |
21 |
|
|
|
const tprio_t m_prio; |
22 |
|
|
|
/* TODO: use ref instead of m_started */ |
23 |
|
|
|
bool m_started = false; |
24 |
|
|
|
chibios_rt::ThreadReference ref; |
25 |
|
|
|
|
26 |
|
|
|
protected: |
27 |
|
|
|
// Override this function to implement your controller's thread's behavior. |
28 |
|
|
|
virtual void ThreadTask() = 0; |
29 |
|
|
|
|
30 |
|
|
✗ |
void main() override { |
31 |
|
|
✗ |
this->setName(m_name); |
32 |
|
|
|
|
33 |
|
|
✗ |
ThreadTask(); |
34 |
|
|
✗ |
} |
35 |
|
|
|
|
36 |
|
|
|
const char* const m_name; |
37 |
|
|
|
|
38 |
|
|
|
public: |
39 |
|
|
3 |
ThreadController(const char* name, tprio_t priority) |
40 |
|
|
3 |
: m_prio(priority) |
41 |
|
|
3 |
, m_name(name) |
42 |
|
|
|
{ |
43 |
|
|
3 |
} |
44 |
|
|
|
|
45 |
|
|
|
using chibios_rt::BaseStaticThread<TStackSize>::start; |
46 |
|
|
|
|
47 |
|
|
|
/** |
48 |
|
|
|
* @brief Start the thread. |
49 |
|
|
|
*/ |
50 |
|
|
|
void start() |
51 |
|
|
|
{ |
52 |
|
|
|
if (!m_started) |
53 |
|
|
|
{ |
54 |
|
|
|
m_started = true; |
55 |
|
|
|
ref = chibios_rt::BaseStaticThread<TStackSize>::start(m_prio); |
56 |
|
|
|
} |
57 |
|
|
|
} |
58 |
|
|
|
|
59 |
|
|
|
/** |
60 |
|
|
|
* @brief Request thread termination and waits for termination |
61 |
|
|
|
* |
62 |
|
|
|
* Thread should periadicaly execute something like: |
63 |
|
|
|
* if (chThdShouldTerminateX()) |
64 |
|
|
|
* chThdExit((msg_t)0x0); |
65 |
|
|
|
*/ |
66 |
|
|
|
void stop() |
67 |
|
|
|
{ |
68 |
|
|
|
if (m_started) { |
69 |
|
|
|
/* Asking for thread termination.*/ |
70 |
|
|
|
ref.requestTerminate(); |
71 |
|
|
|
|
72 |
|
|
|
/* Waiting for termination, releasing the reference.*/ |
73 |
|
|
|
ref.wait(); |
74 |
|
|
|
|
75 |
|
|
|
m_started = false; |
76 |
|
|
|
} |
77 |
|
|
|
} |
78 |
|
|
|
}; |
79 |
|
|
|
|