-
Notifications
You must be signed in to change notification settings - Fork 0
/
scheduler.cpp
100 lines (83 loc) · 1.94 KB
/
scheduler.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
#include "scheduler.h"
Scheduler::Scheduler(){
ck = new ClockRTC(0x68);
}
void Scheduler::add(sched* ptr){
if(tab == NULL){
tab = ptr;
tab->next = NULL;
return;
}
sched* tmp = tab;
sched* tmp_save = tab;
while(tmp != NULL){
tmp_save = tmp;
tmp = (sched*)tmp->next;
}
tmp_save->next = ptr;
ptr->next = NULL;
}
sched* Scheduler::getEntryByPin(int pin){
sched* tmp = tab;
while(tmp != NULL){
if(tmp->pin == pin){
return tmp;
}else{
tmp = (sched*)tmp->next;
}
}
return NULL;
}
void Scheduler::setSchedule(int pin, Date event, uint32_t duration){
pinMode(pin, OUTPUT);
sched* tmp = getEntryByPin(pin);
if(tmp == NULL){
tmp = new sched;
tmp->pin = pin;
add(tmp);
}
// event.type = TIME;
tmp->type = true;
tmp->event = event;
tmp->duration = duration;
tmp->next = NULL;
}
void Scheduler::setSchedule(int pin, uint32_t repeat, uint32_t duration){
pinMode(pin, OUTPUT);
sched* tmp = getEntryByPin(pin);
if(tmp == NULL){
tmp = new sched;
tmp->pin = pin;
add(tmp);
}
tmp->type = false;
tmp->repeat = repeat;
tmp->duration = duration;
tmp->next = NULL;
}
void Scheduler::run(){
Date now = ck->getTime();
/*for testing Light effect in accelerate*/
//date now = ck->getStubTime();
Serial.print("Scheduler time ");
Serial.print(now.h);
Serial.print(":");
Serial.println(now.mn);
sched* tmp = tab;
while(tmp != NULL){
if(tmp->type){
if((now >= tmp->event)&&(now <= tmp->event + tmp-> duration)){
digitalWrite(tmp->pin, HIGH);
}else{
digitalWrite(tmp->pin, LOW);
}
}else{
if((now.mn % tmp->repeat >= 0)&&(now.mn % tmp->repeat <= tmp->duration)){
digitalWrite(tmp->pin, HIGH);
}else{
digitalWrite(tmp->pin, LOW);
}
}
tmp = (sched*)tmp->next;
}
}