#include <Preferences.h>
Preferences prefs;
// ===== PARANCSOK =====
enum CmdType {
CMD_SETPIN,
CMD_WAIT,
CMD_PRINT
};
struct Command {
CmdType type;
int arg1;
int arg2;
char text[32];
};
// ===== TASK =====
struct Task {
uint8_t id;
uint8_t enabled;
uint32_t interval;
uint32_t lastRun;
Command cmds[10];
uint8_t cmdCount;
};
Task tasks[10];
int taskCount = 0;
// ===== TASK FUTTATÓ =====
void runTask(Task &t) {
uint32_t now = millis();
if (now - t.lastRun < t.interval) return;
t.lastRun = now;
for (int i = 0; i < t.cmdCount; i++) {
Command &c = t.cmds[i];
switch (c.type) {
case CMD_SETPIN:
digitalWrite(c.arg1, c.arg2);
break;
case CMD_WAIT:
delay(c.arg1); // később nem blokkolóra cseréljük
break;
case CMD_PRINT:
Serial.println(c.text);
break;
}
}
}
// ===== TASKOK MENTÉSE =====
void saveTasks() {
prefs.begin("taskdb", false);
prefs.putBytes("tasks", tasks, sizeof(tasks));
prefs.putInt("count", taskCount);
prefs.end();
}
// ===== TASKOK BETÖLTÉSE =====
void loadTasks() {
prefs.begin("taskdb", true);
taskCount = prefs.getInt("count", 0);
prefs.getBytes("tasks", tasks, sizeof(tasks));
prefs.end();
}
// ===== TASK HOZZÁADÁSA =====
void addTask(const char* name, uint32_t interval) {
if (taskCount >= 10) return;
Task &t = tasks[taskCount];
t.id = taskCount;
t.enabled = 1;
t.interval = interval;
t.lastRun = 0;
t.cmdCount = 0;
// alap parancs: LED villogtatás
if (strcmp(name, "blink") == 0) {
t.cmds[0] = {CMD_SETPIN, 2, HIGH, ""};
t.cmds[1] = {CMD_WAIT, 100, 0, ""};
t.cmds[2] = {CMD_SETPIN, 2, LOW, ""};
t.cmds[3] = {CMD_WAIT, 100, 0, ""};
t.cmdCount = 4;
}
// alap parancs: PRINT
if (strcmp(name, "print") == 0) {
t.cmds[0] = {CMD_PRINT, 0, 0, "Hello from task"};
t.cmdCount = 1;
}
taskCount++;
saveTasks();
}
// ===== TASK TÖRLÉSE =====
void delTask(int id) {
if (id >= taskCount) return;
for (int i = id; i < taskCount - 1; i++) {
tasks[i] = tasks[i + 1];
}
taskCount--;
saveTasks();
}
// ===== TASK LISTA =====
void listTasks() {
Serial.println("=== TASK LIST ===");
for (int i = 0; i < taskCount; i++) {
Serial.printf("ID %d | interval %u ms | cmds %d\n",
tasks[i].id, tasks[i].interval, tasks[i].cmdCount);
}
}
// ===== PARANCS ÉRTELMEZŐ (CLI) =====
void parseCommand(String cmd) {
cmd.trim();
if (cmd.startsWith("add")) {
String name = cmd.substring(4, cmd.indexOf(" ", 4));
uint32_t interval = cmd.substring(cmd.indexOf(" ", 4) + 1).toInt();
addTask(name.c_str(), interval);
Serial.println("Task added.");
}
else if (cmd.startsWith("del")) {
int id = cmd.substring(4).toInt();
delTask(id);
Serial.println("Task deleted.");
}
else if (cmd.startsWith("list")) {
listTasks();
}
else {
Serial.println("Ismeretlen parancs.");
}
}
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
loadTasks();
Serial.println("CLI ready.");
}
void loop() {
// CLI olvasás
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
parseCommand(cmd);
}
// Task futtatás
for (int i = 0; i < taskCount; i++) {
if (tasks[i].enabled) {
runTask(tasks[i]);
}
}
}