-
Notifications
You must be signed in to change notification settings - Fork 0
/
Interface.cpp
117 lines (94 loc) · 3.01 KB
/
Interface.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
112
113
114
115
116
/*
* Raspberry PI PowerController (Arduino attiny85)
*
* File: Interface.cpp
* Created on: 16/11/2016
* Author: Vagner Panarello (vpanarello@gmail.com)
*
*
*
* This library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software
* Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser
* General Public License along with this library; if not,
* write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "interface.h"
Interface *Interface::thisInstance = 0;
ISR (PCINT0_vect) {
Interface::pinChangeInterrupt();
}
void Interface::pinChangeInterrupt() {
if (thisInstance) thisInstance->pinChanceIntHandler();
}
Interface::Interface () {
SET_INPUT_PIN(IN_RPI);
SET_INPUT_PIN(IN_SWITCH);
SET_PULLUP_RESISTOR(IN_RPI);
SET_PULLUP_RESISTOR(IN_SWITCH);
POWER_SUPPLY_OFF;
SET_OUTPUT_PIN(OUT_POWER_CONTROL);
RPI_SHUTDOWN_REQUEST_CLEAR;
SET_OUTPUT_PIN(OUT_RPI);
MAP_PIN_CHANGE_INTERRUPT(IN_RPI);
MAP_PIN_CHANGE_INTERRUPT(IN_SWITCH);
ENABLE_PIN_CHANGE_INTERRUPT;
thisInstance = this; // here set an this instance object reference for static member methods
}
// method timeout functionalities
void Interface::containerToCallback(void) {
thisInstance->functionToReturn();
}
void Interface::functionToReturn(void) {
bool turnedOn = IS_MAIN_SWITCH_ON;
bool rpiIsUp = IS_RPI_SYSTEM_UP;
if (turnedOn != this->lastStateSwitch) {
if (IS_MAIN_SWITCH_ON) functionTurnedOn();
else functionTurnedOff();
this->lastStateSwitch = turnedOn;
}
if (rpiIsUp != this->lastStateRpi) {
if (IS_RPI_SYSTEM_UP) rpiGoUp();
else rpiGoDown();
this->lastStateRpi = rpiIsUp;
}
}
void Interface::setCallback(void (*pointerFunction)(void), long _delay) {
this->pointerCallback = pointerFunction;
this->callbackTimeout = millis() + _delay;
}
// CallBack definition methods
void Interface::setFunctionTurnedOff(void (*funcPointer)(void)) {
this->functionTurnedOff = funcPointer;
}
void Interface::setFunctionTurnedOn(void (*funcPointer)(void)) {
this->functionTurnedOn = funcPointer;
}
void Interface::setRpiGoDown(void (*funcPointer)(void)) {
this->rpiGoDown = funcPointer;
}
void Interface::setRpiGoUp(void (*funcPointer)(void)) {
this->rpiGoUp = funcPointer;
}
// other methods
void Interface::pinChanceIntHandler() {
if (!(this->pointerCallback)) this->setCallback(Interface::containerToCallback, DEBOUNCING_TIMEOUT_MS);
}
void Interface::thread() {
if (millis() > this->callbackTimeout && this->pointerCallback) {
this->pointerCallback();
this->pointerCallback = 0;
}
}