Added module base for task routing
This commit is contained in:
8
src/base/module_base.h
Normal file
8
src/base/module_base.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "base/task.h"
|
||||||
|
|
||||||
|
class module_base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual int push(const Task& task) = 0;
|
||||||
|
};
|
||||||
3
src/base/modules.cpp
Normal file
3
src/base/modules.cpp
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#include "base/modules.h"
|
||||||
|
|
||||||
|
module_base* modules[MOD_COUNT] = {nullptr};
|
||||||
6
src/base/modules.h
Normal file
6
src/base/modules.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "base/module_base.h"
|
||||||
|
#include "base/task.h"
|
||||||
|
|
||||||
|
extern module_base* modules[MOD_COUNT];
|
||||||
35
src/base/ring_buffer.h
Normal file
35
src/base/ring_buffer.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
template<typename T, uint8_t SIZE>
|
||||||
|
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;}
|
||||||
|
};
|
||||||
24
src/base/router.h
Normal file
24
src/base/router.h
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
23
src/base/task.h
Normal file
23
src/base/task.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user