1
1
#include < array>
2
+ #include < atomic>
2
3
#include < cstdint>
3
4
#include < mutex>
4
5
5
6
#include " BufferedSerial.h"
6
- #include " EventFlags.h"
7
- #include " ThisThread.h"
8
- #include " Thread.h"
7
+ #include " events/EventQueue.h"
8
+ #include " events/Event.h"
9
9
10
- #include " umiusi/defered_delay.hpp"
11
10
#include " umiusi/inputs.hpp"
12
11
#include " umiusi/outputs.hpp"
13
12
14
13
using namespace std ::chrono_literals;
15
14
16
15
int main () {
17
- constexpr size_t INPUTS_THREAD_STACK_SIZE = 1024 ;
18
- constexpr size_t SETUP_THREAD_STACK_SIZE = 512 ;
16
+ constexpr std::size_t EQUEUE_BUFFER_SIZE = 32 * EVENTS_EVENT_SIZE;
17
+
18
+ unsigned char equeue_buffer[EQUEUE_BUFFER_SIZE] = {};
19
19
20
20
CachedInputs inputs{};
21
21
OutputMachine output{};
22
22
mbed::BufferedSerial pc (USBTX, USBRX);
23
+ std::atomic_bool received_order;
24
+ pc.set_blocking (false );
25
+ inputs.read ();
23
26
24
- rtos::EventFlags trigger_setup{};
25
- unsigned char setup_thread_stack[SETUP_THREAD_STACK_SIZE] = {};
26
- unsigned char inputs_thread_stack[INPUTS_THREAD_STACK_SIZE] = {};
27
-
28
- rtos::Thread setup_thread (
29
- osPriorityBelowNormal, SETUP_THREAD_STACK_SIZE, setup_thread_stack
30
- );
31
- rtos::Thread inputs_thread (
32
- osPriorityBelowNormal, INPUTS_THREAD_STACK_SIZE, inputs_thread_stack
33
- );
34
-
35
- // TODO: handle osStatus
36
- setup_thread.start ([&output, &trigger_setup]() {
37
- while (true ) {
38
- trigger_setup.wait_any (1 , osWaitForever, false );
39
- output.initialize ();
40
- trigger_setup.clear ();
41
- }
42
- });
43
- osStatus inputs_thread_status = inputs_thread.start ([&inputs]() {
44
- while (true ) {
45
- inputs.read ();
46
- rtos::ThisThread::sleep_for (10ms);
27
+ events::EventQueue equeue (EQUEUE_BUFFER_SIZE, equeue_buffer);
28
+ auto initialize_event = equeue.event (mbed::callback ([&output, &equeue]() {
29
+ if (output.state () != State::INITIALIZING) {
30
+ output.initialize_with_equeue (equeue);
47
31
}
48
- });
49
- if (inputs_thread_status != osOK) {
50
- // 本来ここに入ることはあってはならないが、一応書いておく
51
- // スレッドを開始することができなかったので、入力が読み取られなくなる
52
- // そのため、一度だけ値を読んでおくことにする
53
- // 得られる値を見て実行状況を判断すること
54
- inputs.read ();
55
- }
56
- while (true ) {
57
- DeferedDelay _delay (10ms);
58
- pc.sync ();
59
- uint8_t header = 0 ;
60
- // TODO: timeout
61
- ssize_t read = pc.read (&header, 1 );
62
- if (read < 1 ) {
63
- continue ;
64
- }
65
- // なぜかこれがないと動かない
66
- rtos::ThisThread::sleep_for (20ms);
32
+ }));
33
+ auto suspend_event = equeue.event (mbed::callback ([&output]() {
34
+ output.suspend ();
35
+ }));
36
+
37
+ const auto process_order = [&pc, &inputs, &output, &initialize_event, &suspend_event](std::uint8_t header) {
67
38
switch (header) {
68
39
case 0 : {
69
40
// write
@@ -74,7 +45,7 @@ int main() {
74
45
// bldc
75
46
uint16_t pulsewidth_us_lsb = static_cast <uint16_t >(buffer[i * 2 + 0 ]);
76
47
uint16_t pulsewidth_us_msb = static_cast <uint16_t >(buffer[i * 2 + 1 ]);
77
- pulsewidths_us[i].first = (pulsewidth_us_lsb << 0 )
48
+ pulsewidths_us[i].first = (pulsewidth_us_lsb << 0 )
78
49
| (pulsewidth_us_msb << 8 );
79
50
// servo
80
51
pulsewidth_us_lsb
@@ -99,18 +70,41 @@ int main() {
99
70
case 0xFE : {
100
71
// (re)start
101
72
if (output.state () == State::INITIALIZING) {
102
- continue ;
73
+ return ;
103
74
}
104
- trigger_setup. set ( 1 );
75
+ initialize_event. call ( );
105
76
} break ;
106
77
case 0xFF :
107
78
// suspend
108
- output. suspend ();
79
+ suspend_event. call ();
109
80
break ;
110
81
default :
111
82
// unexpected
112
- continue ;
83
+ return ;
113
84
}
114
- }
85
+ };
86
+ equeue.call_every (10ms, [&equeue, &pc, &received_order, &process_order]() {
87
+ std::uint8_t header = 0 ;
88
+ ssize_t res = pc.read (&header, 1 );
89
+ if (res < 1 ) {
90
+ return ;
91
+ }
92
+ received_order.store (true , std::memory_order_release);
93
+ equeue.call (process_order, header);
94
+ });
95
+
96
+ equeue.call_every (10ms, [&inputs]() {
97
+ inputs.read ();
98
+ });
99
+
100
+ equeue.call_every (1s, [&received_order, &suspend_event]() {
101
+ const bool received = received_order.load (std::memory_order_acquire);
102
+ received_order.store (false , std::memory_order_release);
103
+ if (!received) {
104
+ suspend_event.call ();
105
+ }
106
+ });
107
+
108
+ equeue.dispatch_forever ();
115
109
return 0 ;
116
110
}
0 commit comments