Create TactilityFreertos subproject (#440)
This commit is contained in:
committed by
GitHub
parent
a4dc633063
commit
7283920def
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
#include "Dispatcher.h"
|
||||
#include "Thread.h"
|
||||
|
||||
namespace tt {
|
||||
|
||||
/** Starts a Thread to process dispatched messages */
|
||||
class DispatcherThread final {
|
||||
|
||||
Dispatcher dispatcher;
|
||||
std::unique_ptr<Thread> thread;
|
||||
bool interruptThread = true;
|
||||
|
||||
int32_t threadMain() {
|
||||
do {
|
||||
/**
|
||||
* If this value is too high (e.g. 1 second) then the dispatcher destroys too slowly when the simulator exits.
|
||||
* This causes the problems with other services doing an update (e.g. Statusbar) and calling into destroyed mutex in the global scope.
|
||||
*/
|
||||
dispatcher.consume(100 / portTICK_PERIOD_MS);
|
||||
} while (!interruptThread);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
explicit DispatcherThread(const std::string& threadName, size_t threadStackSize = 4096) {
|
||||
thread = std::make_unique<Thread>(
|
||||
threadName,
|
||||
threadStackSize,
|
||||
[this] {
|
||||
return threadMain();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
~DispatcherThread() {
|
||||
if (thread->getState() != Thread::State::Stopped) {
|
||||
stop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch a message.
|
||||
*/
|
||||
bool dispatch(const Dispatcher::Function& function, TickType_t timeout = kernel::MAX_TICKS) {
|
||||
return dispatcher.dispatch(function, timeout);
|
||||
}
|
||||
|
||||
/** Start the thread (blocking). */
|
||||
void start() {
|
||||
interruptThread = false;
|
||||
thread->start();
|
||||
}
|
||||
|
||||
/** Stop the thread (blocking). */
|
||||
void stop() {
|
||||
interruptThread = true;
|
||||
thread->join();
|
||||
}
|
||||
|
||||
/** @return true of the thread is started */
|
||||
bool isStarted() const { return thread != nullptr && !interruptThread; }
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user