forked from vitotai/BrewPiLess
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAutoCapControl.cpp
More file actions
139 lines (111 loc) · 3.89 KB
/
Copy pathAutoCapControl.cpp
File metadata and controls
139 lines (111 loc) · 3.89 KB
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <FS.h>
#include <ArduinoJson.h>
#include "AutoCapControl.h"
#include "Config.h"
#include "mystrlib.h"
#define MAX_CONFIGDATA_SIZE 256
extern ValueActuator defaultActuator;
Actuator* AutoCapControl::capper = &defaultActuator;
AutoCapControl autoCapControl;
uint8_t AutoCapControl::mode(void)
{
if(AutoCapControl::capper != &defaultActuator)
return _settings->autoCapMode;
return AutoCapModeNone;
}
void AutoCapControl::begin(void)
{
_settings = theSettings.autoCapSettings();
// check config
if (_settings->autoCapMode == AutoCapModeManualClose){
if(AutoCapControl::capper != &defaultActuator)
AutoCapControl::capper->setActive(true);
}else if( _settings->autoCapMode == AutoCapModeManualOpen){
if(AutoCapControl::capper != &defaultActuator)
AutoCapControl::capper->setActive(false);
}
}
void AutoCapControl::saveConfig(void)
{
theSettings.save();
}
void AutoCapControl::capAtTime(uint32_t now)
{
_settings->autoCapMode = AutoCapModeTime;
_settings->condition.targetTime = now;
saveConfig();
}
void AutoCapControl::catOnGravity(float sg)
{
_settings->autoCapMode = AutoCapModeGravity;
_settings->condition.targetGravity = sg;
saveConfig();
}
void AutoCapControl::capManualSet(bool capped)
{
_settings->autoCapMode =capped? AutoCapModeManualClose:AutoCapModeManualOpen;
if(AutoCapControl::capper != &defaultActuator)
capper->setActive(capped);
saveConfig();
}
bool isPhysicalCapOn(void){
if( AutoCapControl::capper == &defaultActuator ) return false;
return AutoCapControl::capper->isActive();
}
void AutoCapControl::setPhysicalCapOn(bool on){
if( AutoCapControl::capper != &defaultActuator ){
if(AutoCapControl::capper->isActive() != on){
DBG_PRINTF("capper CAP:%d\n",on);
AutoCapControl::capper->setActive(on);
}
}
}
bool AutoCapControl::isCapOn(void){
return _capStatus == CapStatusActive;
}
void AutoCapControl::setCapOn(bool on){
if( AutoCapControl::capper != &defaultActuator ){
CapStatus status = on? CapStatusActive:CapStatusInactive;
if(status != _capStatus){
_capStatus =status;
setPhysicalCapOn(on);
}
}
}
// one thing to keep in mind: the actuactor might be assigned after power on
// before the actuactor is assigned, the status is "unknown", and
// the action to check and set capping status should be done.
bool AutoCapControl::autoCapOn(uint32_t current, float gravity)
{
if( AutoCapControl::capper == &defaultActuator ) return false;
if(_settings->autoCapMode == AutoCapModeNone){
// asigned. auto change to open
// not necessary for it is check at first statement
// if( AutoCapControl::capper != &defaultActuator )
_settings->autoCapMode = AutoCapModeManualOpen;
return true;
}else if(_settings->autoCapMode == AutoCapModeManualClose ){
if( _capStatus != CapStatusActive) setCapOn(true);
}else if (_settings->autoCapMode == AutoCapModeManualOpen){
if(_capStatus != CapStatusInactive) setCapOn(false);
}else if(_settings->autoCapMode == AutoCapModeTime){
if(current > _settings->condition.targetTime){
if(_capStatus != CapStatusActive){
DBG_PRINTF("times up, capped. act:%d\n",_capStatus);
setCapOn(true);
return true;
}
}else if(_capStatus != CapStatusInactive)
setCapOn(false);
}else if(_settings->autoCapMode == AutoCapModeGravity){
if((gravity <= _settings->condition.targetGravity)){
if(_capStatus != CapStatusActive){
DBG_PRINTF("gravity meet, capped.\n");
setCapOn(true);
return true;
}
}else if(_capStatus != CapStatusInactive)
setCapOn(false);
}
return false;
}