-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfollower.cpp
111 lines (101 loc) · 2.34 KB
/
follower.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
#include "Arduino.h"
#include "follower.h"
#include "setup.h"
void Follower::init()
{
_waitingForOn = 0;
_waitingForOff = 0;
}
Follower::Follower(uint8_t id, uint8_t board, uint8_t relay, uint8_t master, uint16_t delayOn, uint16_t delayOff):Relay(id, NO_NVSLOT, board, relay, FOLLOWER)
{
_master = master;
_delayOn = delayOn;
_delayOff = delayOff;
init();
}
Follower::Follower(uint8_t id, unsigned char *initData): Relay(id,initData)
{
_master = initData[_offset++];
_delayOn = initData[_offset++]<<8;
_delayOn += initData[_offset++];
_delayOff = initData[_offset++]<<8;
_delayOff += initData[_offset++];
init();
}
Follower::~Follower()
{
}
uint8_t Follower::saveConfig(unsigned char *initData)
{
uint8_t offset = Relay::saveConfig(initData);
initData[offset++]=_master;
initData[offset++]=_delayOn>>8;
initData[offset++]=_delayOn&0xff;
initData[offset++]=_delayOff>>8;
initData[offset++]=_delayOff&0xff;
return offset;
}
void Follower::printInfo()
{
Relay::printInfo();
Serial.print(F("\tmaster # "));
Serial.println(_master);
Serial.print(F("\tdelayOn "));
Serial.println(_delayOn);
Serial.print(F("\tdelayOff "));
Serial.println(_delayOff);
}
void Follower::printDefinition(uint8_t first)
{
{
char buffer[40];
sprintf(buffer,"define follower %d %d %d %d %d %d",getId(), getBoard(), getRelay(), _master, _delayOn, _delayOff);
Serial.println(buffer);
}
Device::printDefinition(0);
};
void Follower::notify(uint8_t device, bool on)
{
if(device == _master)
{
if(on)
{
_onRequest = millis();
_waitingForOn = 1;
_waitingForOff = 0;
}
else
{
_offRequest = millis();
_waitingForOff = 1;
_waitingForOn = 0;
}
}
}
void Follower::loop()
{
if(_waitingForOn)
{
if((millis() - _onRequest)/1000 >= _delayOn)
{
_waitingForOn = 0;
setOn(1);
}
}
if(_waitingForOff)
{
if((millis() - _offRequest)/1000 >= _delayOff)
{
_waitingForOff = 0;
setOn(0);
}
}
Relay::loop();
}
bool Follower::isType(enum DeviceType type)
{
if(type == FOLLOWER)
return true;
else
return Relay::isType(type);
}