-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dispatcher.cpp
137 lines (107 loc) · 2.89 KB
/
Dispatcher.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "Dispatcher.h"
//Magic timing library stuff
#include <SoftTimer.h>
#include <DelayRun.h>
#include <Debouncer.h>
#include <Bounce2.h>
#include <MY17_Can_Library.h>
#include "Lcd_Controller.h"
#include "Led_Controller.h"
#include "Buzzer.h"
#include "Page_Manager.h"
#include "Button_Listener.h"
static bool begun;
void dispatchPointer(Task*);
Task dispatchTask(0, dispatchPointer);
void displayPointer(Task*);
Task displayTask(50, displayPointer);
void sendHeartbeat(Task*);
Task heartbeatTask(1000, sendHeartbeat);
void Dispatcher::begin() {
// Idempotent
if(begun) {
return;
}
begun = true;
// Start serial bus
Serial.begin(115200);
// Initialize CAN controller
Can_Init(500000);
// Initialize buzzer
Buzzer::begin();
// Initialize button listener
Button_Listener::begin();
// Initialize LED controller
Led_Controller::begin();
// Initialize LCD screen
Lcd_Controller::begin();
// Initialize pages
Page_Manager::begin();
Serial.println("Dash Initialized");
SoftTimer.add(&dispatchTask);
SoftTimer.add(&heartbeatTask);
SoftTimer.add(&displayTask);
}
void Dispatcher::processCanInputs() {
Can_MsgID_T type = Can_MsgType();
Page_Manager::process_can_heartbeat(type);
Page_Manager::process_msg(type);
}
void Dispatcher::processButtonInputs() {
Button_Action_T button_action = Button_Listener::update();
Button_T button = button_action.button;
Action_T action = button_action.action;
if (button == DASH_LEFT_BUTTON || button == DASH_RIGHT_BUTTON) {
// Dash buttons are delegated to page manager
Page_Manager::process_action(button_action);
}
Can_Dash_Request_T msg;
msg.type = CAN_DASH_REQUEST_NO_REQUEST;
if (button == RTD_BUTTON) {
if (action == TAP) {
Serial.println("DISABLE");
msg.type = CAN_DASH_REQUEST_RTD_DISABLE;
} else if (action == HOLD) {
Serial.println("ENABLE");
msg.type = CAN_DASH_REQUEST_RTD_ENABLE;
}
}
if (button == STEERING_RIGHT_BUTTON) {
if (action == TOUCH) {
msg.type = CAN_DASH_REQUEST_ACTIVE_AERO_ENABLE;
Serial.println("ACTIVE AERO ENABLE");
}
if (action == RELEASE) {
msg.type = CAN_DASH_REQUEST_ACTIVE_AERO_DISABLE;
Serial.println("ACTIVE AERO DISABLE");
}
}
// TODO re-enable when we fix steering wheel
// if (button == STEERING_LEFT_BUTTON) {
// if (action == TAP) {
// msg.type = CAN_DASH_REQUEST_DATA_FLAG;
// Serial.println("DATA FLAG");
// }
// }
if (msg.type != CAN_DASH_REQUEST_NO_REQUEST) {
Can_Dash_Request_Write(&msg);
}
}
void Dispatcher::displayPages(){
Page_Manager::display();
}
void Dispatcher::dispatch() {
processCanInputs();
processButtonInputs();
}
void dispatchPointer(Task*) {
Dispatcher::dispatch();
}
void displayPointer(Task*) {
Dispatcher::displayPages();
}
void sendHeartbeat(Task*) {
Can_Dash_Heartbeat_T msg;
msg.ok = true;
Can_Dash_Heartbeat_Write(&msg);
}