diff --git a/src/base/module_base.h b/src/base/module_base.h new file mode 100644 index 0000000..5e09d04 --- /dev/null +++ b/src/base/module_base.h @@ -0,0 +1,8 @@ +#pragma once +#include "base/task.h" + +class module_base +{ +public: + virtual int push(const Task& task) = 0; +}; \ No newline at end of file diff --git a/src/base/modules.cpp b/src/base/modules.cpp new file mode 100644 index 0000000..a725334 --- /dev/null +++ b/src/base/modules.cpp @@ -0,0 +1,3 @@ +#include "base/modules.h" + +module_base* modules[MOD_COUNT] = {nullptr}; \ No newline at end of file diff --git a/src/base/modules.h b/src/base/modules.h new file mode 100644 index 0000000..e2cc491 --- /dev/null +++ b/src/base/modules.h @@ -0,0 +1,6 @@ +#pragma once + +#include "base/module_base.h" +#include "base/task.h" + +extern module_base* modules[MOD_COUNT]; \ No newline at end of file diff --git a/src/base/ring_buffer.h b/src/base/ring_buffer.h new file mode 100644 index 0000000..7eee108 --- /dev/null +++ b/src/base/ring_buffer.h @@ -0,0 +1,35 @@ +#pragma once +#include + +template +class ring_buffer { + private: + T _buffer[SIZE]; + volatile uint8_t _head = 0; + volatile uint8_t _tail = 0; + volatile uint8_t _count = 0; + public: + int push(const T& item) { + if (_count == SIZE) { + return 1; + } + + _buffer[_head] = item; + _head = (_head++) % SIZE; + _count++; + return 0; + } + int pop(T& item) { + if (_count == 0) { + return 1; + } + + item = _buffer[_tail]; + _tail = (_tail++) % SIZE; + _count--; + return 0; + } + bool is_empty() const { return _count == 0;} + bool is_full() const { return _count == SIZE;} + uint8_t size() const { return _count;} +}; \ No newline at end of file diff --git a/src/base/router.h b/src/base/router.h new file mode 100644 index 0000000..e164feb --- /dev/null +++ b/src/base/router.h @@ -0,0 +1,24 @@ +#pragma once +#include "base/task.h" +#include "base/module_base.h" +#include "base/modules.h" +namespace router { + int send(const Task& task) { + if (task.target >= MOD_COUNT) { + return 1; + } + + module_base* mod = modules[task.target]; + + if (mod == nullptr) { + return 1; + } + + return mod->push(task); + } + + int send(module_id target, task_type type, uint32_t data=0) { + Task t{target, type, data}; + return send(t); + } +} \ No newline at end of file diff --git a/src/base/task.h b/src/base/task.h new file mode 100644 index 0000000..c562bcc --- /dev/null +++ b/src/base/task.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include + +enum module_id : uint8_t { + MOD_CMD, + MOD_CFG, + MOD_GPS, + MOD_LCD, + MOD_COUNT +}; + +enum task_type : uint8_t { + TASK_NONE, + TASK_DISPLAY_GPS_DEBUG, + TASK_CONFIG_TRACK_DETECT, +}; + +struct Task { + module_id target; + task_type type; + uint32_t data; +}; \ No newline at end of file