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