|
|
@ -16,6 +16,7 @@ char scope[SCOPE_SIZE]; |
|
|
|
|
|
|
|
struct EventSubscription |
|
|
|
{ |
|
|
|
int handle; |
|
|
|
void (*callback)(Event* e); // module, event, param1, param2
|
|
|
|
Task* target; |
|
|
|
byte source_mask = 0; |
|
|
@ -164,20 +165,45 @@ void Kernel::suspend() |
|
|
|
/**
|
|
|
|
* Register a new task in the kernel |
|
|
|
*/ |
|
|
|
void Kernel::registerTask(Task* task) |
|
|
|
int Kernel::registerTask(Task* task) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_TASKS; i++) |
|
|
|
{ |
|
|
|
if (m_task[i] == nullptr) |
|
|
|
{ |
|
|
|
m_task[i] = task; |
|
|
|
task->setId(i); // TODO: real pid
|
|
|
|
return; |
|
|
|
task->setId(m_pid++); // TODO: real pid
|
|
|
|
return i; |
|
|
|
} |
|
|
|
} |
|
|
|
Kernel::panic("Exceeded KERNEL_MAX_TASKS!"); |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel::unregisterTask(int pid) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_TASKS; i++) |
|
|
|
{ |
|
|
|
if (m_task[i] != nullptr && m_task[i]->getId() == pid) |
|
|
|
{ |
|
|
|
delete m_task[i]; |
|
|
|
m_task[i] = nullptr; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool Kernel::isTaskRunning(int pid) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_TASKS; i++) |
|
|
|
{ |
|
|
|
if (m_task[i] != nullptr && m_task[i]->getId() == pid) |
|
|
|
{ |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/**
|
|
|
|
* Register a new module in the kernel |
|
|
|
*/ |
|
|
@ -234,35 +260,49 @@ void Kernel::event(byte source, byte event, byte param1, byte param2) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel::subscribe(void (*callback)(Event* e), byte source_mask, byte event_mask) |
|
|
|
int Kernel::subscribe(void (*callback)(Event* e), byte source_mask, byte event_mask) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_EVENT_SUBSCRIPTIONS; i++) |
|
|
|
{ |
|
|
|
if (m_event_subscription[i] == nullptr) |
|
|
|
{ |
|
|
|
m_event_subscription[i] = new EventSubscription(); |
|
|
|
m_event_subscription[i]->handle = ++m_handle; |
|
|
|
m_event_subscription[i]->callback = callback; |
|
|
|
m_event_subscription[i]->source_mask = source_mask; |
|
|
|
m_event_subscription[i]->event_mask = event_mask; |
|
|
|
return; |
|
|
|
return m_event_subscription[i]->handle; |
|
|
|
} |
|
|
|
} |
|
|
|
Kernel::panic("Exceeded KERNEL_MAX_EVENT_SUBSCRIPTIONS!"); |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel::subscribe(Task* task, byte source_mask, byte event_mask) |
|
|
|
int Kernel::subscribe(Task* task, byte source_mask, byte event_mask) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_EVENT_SUBSCRIPTIONS; i++) |
|
|
|
{ |
|
|
|
if (m_event_subscription[i] == nullptr) |
|
|
|
{ |
|
|
|
m_event_subscription[i] = new EventSubscription(); |
|
|
|
m_event_subscription[i]->handle = ++m_handle; |
|
|
|
m_event_subscription[i]->target = task; |
|
|
|
m_event_subscription[i]->source_mask = source_mask; |
|
|
|
m_event_subscription[i]->event_mask = event_mask; |
|
|
|
return; |
|
|
|
return m_event_subscription[i]->handle; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Kernel::panic("Exceeded KERNEL_MAX_EVENT_SUBSCRIPTIONS!"); |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel::unsubscribe(int handle) |
|
|
|
{ |
|
|
|
for (int i = 0; i < KERNEL_MAX_EVENT_SUBSCRIPTIONS; i++) |
|
|
|
{ |
|
|
|
if (m_event_subscription[i] != nullptr && m_event_subscription[i]->handle == handle) |
|
|
|
{ |
|
|
|
delete m_event_subscription[i]; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |