Newer
Older
#ifndef BEHAVIOUR_h
#define BEHAVIOUR_h
class Behaviour {
protected:
boolean _interruptable = true;
boolean _temp = false;
boolean _priority = false;
boolean _running = false;
String _name = "name";
public:
Behaviour(String name) : _name(name) {};
~Behaviour() {};
//Can this behaviour be interruped
virtual boolean is_interruptable() { return _interruptable; };
//Can this behaviour be run quickly without stopping what's going on (e.g. comms, debug)
virtual boolean is_temp() { return _temp; };
//Should this behaviour override others
virtual boolean is_priority() {return _priority;};
//Is the behaviour running
virtual boolean is_running() {return _running;};
//What's the name of this behaviour
virtual String name() {return _name; };
//What arguments does the behaviour take? Override this to document your behaviour
virtual char* args() {return "(no args)"; };
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//Start the behaviour, with arguments (don't know why this can't be virtual?)
virtual String start(String args) {Serial.println("Base start called <"+args+">");};
//Update the behaviour periodically
virtual void update() {};
//Start the behaviour, with arguments (don't know why this can't be virtual?)
virtual void stop() { _running = false; };
};
/*
* Example way to make a simple behaviour
*/
class TestBehaviour : public Behaviour {
public:
TestBehaviour(String n) : Behaviour(n) {}
String start(String args) {
return "Test behaviour " + _name + " with (" + args + ")";
}
};
class BehaviourTable {
Behaviour* behaviours[40];
public:
int num = 0;
BehaviourTable() {
}
void add(Behaviour *b) {
behaviours[num] = b;
num++;
}
Behaviour* get(String n) {
for( int i = 0; i < num; i++ ) {
if( behaviours[i]->name() == n) { return behaviours[i]; }
}
return nullptr;
}
Behaviour* get_by_num(int n) {
return behaviours[n];
}
int get_num_behaviours() {
return num;
}