This repository has been archived by the owner on Dec 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTaskManager.cpp
120 lines (103 loc) · 3.03 KB
/
TaskManager.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
/*
TaskManager.cpp
Copyright (C) 2022 shezik
This program is licensed under GNU General Public License version 3, and
is part of project Lorim.
Please refer to Lorim.ino and LICENSE for details.
*/
#include "TaskManager.hpp"
#include "SpicedU8g2.hpp"
#include "TaskGEM.hpp"
#include "TaskChatbox.hpp"
TaskManager::TaskManager(SpicedU8g2 &_u8g2, Kbd_8x5_CH450 &_keyboard, Mailbox &_mailbox)
: u8g2(_u8g2)
, keyboard(_keyboard)
, mailbox(_mailbox)
{
// do nothing
}
TaskManager::~TaskManager() {
deleteCurrentTask(false);
}
void TaskManager::init() {
pinMode(CH450_INT, INPUT);
keyboard.init();
}
void TaskManager::tick() {
int16_t keycode = 0; // pass in 0 if no key is down
static bool processKey = false;
static uint32_t lastMillis = millis();
if (!digitalRead(CH450_INT)) { // active low
keyboard.getKeyData(); // clear CH450 interrupt state
Serial.printf("new key pressed\n"); // debug
lastMillis = millis();
processKey = true;
} else if (processKey) {
if (millis() - lastMillis >= LONG_PRESS_DURATION) {
keycode = -(Kbd_8x5_CH450::toKeycode(keyboard.getKeyData()));
processKey = false;
Serial.printf("long press registered, keycode is %d\n", keycode); // debug
} else {
uint8_t keyData = keyboard.getKeyData();
if (!Kbd_8x5_CH450::toState(keyData)) {
keycode = Kbd_8x5_CH450::toKeycode(keyData);
processKey = false;
Serial.printf("short press registered, keycode is %d\n", keycode); // debug
}
}
}
if (deleteTaskNextTick) {
deleteCurrentTask(false);
deleteTaskNextTick = false;
}
if (launchTaskNextTick) {
launchTask(launchingTask, false);
launchTaskNextTick = false;
}
if (currentTask) {
currentTask->tick(keycode);
} else {
launchTask(ID_DEFAULT, false);
}
}
void TaskManager::launchTask(uint8_t taskID, bool nextTick) { // register new tasks here
if (nextTick) {
launchTaskNextTick = true;
launchingTask = taskID;
return;
}
switch (taskID) {
case ID_TASKGEM:
currentTask = new TaskGEM(*this, u8g2, mailbox);
currentTask->init();
break;
case ID_CHATBOX:
currentTask = new TaskChatbox(*this, u8g2, mailbox);
currentTask->init();
break;
}
}
void TaskManager::deleteCurrentTask(bool nextTick) {
if (nextTick) {
deleteTaskNextTick = true;
return;
}
if (currentTask) {
delete currentTask; currentTask = nullptr;
}
}
uint8_t TaskManager::getCurrentTaskID() {
if (currentTask) {
return currentTask->getTaskID();
}
return ID_NONE;
}
void TaskManager::switchTo(uint8_t taskID, bool nextTick) {
deleteCurrentTask(nextTick);
launchTask(taskID, nextTick);
}
void TaskManager::refreshDisplay() {
if (currentTask) {
currentTask->refreshDisplay();
}
}