Arduino DLNA Server
Loading...
Searching...
No Matches
Scheduler.h
Go to the documentation of this file.
1#pragma once
2
3#include "Arduino.h" // for millis
6#include "dlna/Schedule.h"
7
8namespace tiny_dlna {
9
15class Scheduler {
16 public:
18 void add(Schedule* schedule) {
19 schedule->active = true;
20 if (schedule->report_ip) {
21 DlnaLogger.log(DlnaLogLevel::Info, "Schedule %s from %s",
22 schedule->name(), schedule->address.toString());
23 } else {
24 DlnaLogger.log(DlnaLogLevel::Info, "Schedule %s", schedule->name());
25 }
26 queue.push_back(schedule);
27 }
28
30 int execute(IUDPService& udp) {
31 // DlnaLogger.log(DlnaLogLevel::Debug, "Scheduler::execute");
32 bool is_cleanup = false;
33 int processed = 0;
34 for (auto& p_s : queue) {
35 if (p_s == nullptr) continue;
36 Schedule& s = *p_s;
37 if (millis() >= s.time) {
38 // handle end time: if expired set inactive
39 if (s.end_time != 0ul && millis() > s.end_time) {
40 s.active = false;
41 }
42 // process active schedules
43 if (s.active) {
44 DlnaLogger.log(DlnaLogLevel::Debug,
45 "Scheduler::execute %s: Executing", s.name());
46
47 s.process(udp);
48 processed++;
49 // reschedule if necessary
50 if (s.repeat_ms > 0) {
51 s.time = millis() + s.repeat_ms;
52 } else {
53 s.active = false;
54 is_cleanup = true;
55 }
56 } else {
57 DlnaLogger.log(DlnaLogLevel::Debug, "Scheduler::execute %s: Inactive",
58 s.name());
59 is_cleanup = true;
60 }
61 }
62 }
63
64 cleanup();
65 return processed;
66 }
67
70 for (auto& p_s : queue) {
71 if (p_s == nullptr) continue;
72 Schedule& s = *p_s;
73 if (s.active && StrView(s.name()).equals("MSearch")) return true;
74 }
75 return false;
76 }
77
79 int size() { return queue.size(); }
80
81 void setActive(bool flag) { is_active = flag; }
82
83 bool isActive() { return is_active; }
84
85 protected:
87 bool is_active = true;
88
89 void cleanup() {
90 DlnaLogger.log(DlnaLogLevel::Debug, "Scheduler::cleanup: for %d items",
91 queue.size());
92 for (auto it = queue.begin(); it != queue.end(); ++it) {
93 auto p_rule = *it;
94 if (p_rule == nullptr) continue;
95 if (!(p_rule)->active) {
96 DlnaLogger.log(DlnaLogLevel::Debug, "Scheduler::cleanup queue: %s",
97 p_rule->name());
98 // remove schedule from collection using iterator overload
99 queue.erase(it);
100 // delete schedule
101 delete p_rule;
102 break;
103 }
104 }
105 }
106};
107
108} // namespace tiny_dlna
Abstract Interface for UDP API.
Definition: IUDPService.h:33
Scheduler which processes all due Schedules (to send out UDP replies)
Definition: Scheduler.h:15
bool is_active
Definition: Scheduler.h:87
int execute(IUDPService &udp)
Execute all due schedules.
Definition: Scheduler.h:30
void setActive(bool flag)
Definition: Scheduler.h:81
bool isActive()
Definition: Scheduler.h:83
void cleanup()
Definition: Scheduler.h:89
int size()
Number of queued schedules.
Definition: Scheduler.h:79
bool isMSearchActive()
Returns true if there is any active schedule with name "MSearch".
Definition: Scheduler.h:69
Vector< Schedule * > queue
Definition: Scheduler.h:86
void add(Schedule *schedule)
Add a schedule to the scheduler.
Definition: Scheduler.h:18
A simple wrapper to provide string functions on char*. If the underlying char* is a const we do not a...
Definition: StrView.h:18
virtual bool equals(const char *str)
checks if the string equals indicated parameter string
Definition: StrView.h:177
Lightweight wrapper around std::vector with Arduino-friendly helpers and a pluggable allocator.
Definition: Vector.h:39
Definition: Allocator.h:13
const char * toString()
Definition: IPAddressAndPort.h:26
An individual Schedule (to send out UDP messages)
Definition: Schedule.h:18
uint64_t end_time
Definition: Schedule.h:25
IPAddressAndPort address
Definition: Schedule.h:29
bool active
Definition: Schedule.h:27
bool report_ip
Definition: Schedule.h:31
virtual const char * name()
Definition: Schedule.h:35
virtual bool process(IUDPService &udp)
Definition: Schedule.h:33
uint64_t time
Definition: Schedule.h:21
uint32_t repeat_ms
Definition: Schedule.h:23