diff --git a/src/thread.cpp b/src/thread.cpp index e13863d..426f9b0 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -22,20 +22,39 @@ namespace sta TacosThread::TacosThread(const char* name, osPriority_t prio, uint32_t stack_size /* = 0 */, uint32_t cb_size /* = 0 */) : RtosThread(name, prio, stack_size, cb_size), instance_{ NULL }, - attribs_{ .name=name, .cb_size=cb_size, .stack_size=stack_size, .priority=prio }, - running_{false}, -#ifdef STA_TACOS_WATCHDOG_ENABLED - status_{ThreadStatus::STOPPED}, -#endif // STA_TACOS_WATCHDOG_ENABLED -#ifdef STA_CAN_BUS_ENABLE - CAN_queue_{STA_RTOS_CAN_BUS_QUEUE_LENGTH}, - canID_{0}, -#endif // STA_CAN_BUS_ENABLE - terminate_{false}, - previous_tick_{0} + attribs_{ .name = name, .priority = prio }, + running_{false} + {} + + TacosThread::TacosThread() + : RtosThread(RtosHandle(Handle::Deferred(&instance_))), + instance_{ NULL }, + attribs_{ }, + running_{false} + {} + + void TacosThread::entry_point(void* arg) { - STA_ASSERT(stack_size >= 0); - STA_ASSERT(cb_size >= 0); + STA_ASSERT(arg != nullptr); + + TacosThread* instance = reinterpret_cast(arg) ; + instance->loop(); + } + + void TacosThread::start() + { + STA_ASSERT(!isRunning()); + + // If this is the first time starting the thread, it has to be started via rtos first. + if (instance_ == NULL) + { + instance_ = osThreadNew(entry_point, this, &attribs_); + + STA_ASSERT(instance_ != NULL); + } + + // Send a thread start signal. + sysNotify(STA_RTOS_THREAD_FLAG_START); } bool TacosThread::isRunning()