forked from JakeS0ft/USaber
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCrossGuardBlade.cpp
136 lines (110 loc) · 2.64 KB
/
CrossGuardBlade.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
This file is part of the Universal Saber library.
The Universal Saber library is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
The Universal Saber 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with the Universal Saber library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* CrossGuardBlade.cpp
*
* Created on: Mar 11, 2016
* Author: JakeSoft <http://forum.arduino.cc/index.php?topic=261980.0>
*/
#include "blade/CrossGuardBlade.h"
#include <Arduino.h>
CrossGuardBlade::CrossGuardBlade(int aMainPin, int aCrossPin, int aCrossDelay)
//Call superclass constructor
:SingleLedBlade(aMainPin)
{
mCrossPin = aCrossPin;
mCrossPowerLevel = 0;
if(mCrossDelay > 0)
{
mCrossDelay = aCrossDelay;
}
else
{
mCrossDelay = 0;
}
}
CrossGuardBlade::~CrossGuardBlade()
{
Off();
}
void CrossGuardBlade::Init()
{
SingleLedBlade::Init();
pinMode(mCrossPin, OUTPUT);
}
bool CrossGuardBlade::PowerUp(int aRampTime)
{
bool lMainBladeDone = false;
while(!lMainBladeDone)
{
lMainBladeDone = SingleLedBlade::PowerUp(aRampTime - mCrossDelay);
}
mCrossPowerLevel = 255;
PerformIO();
delay(mCrossDelay);
return true;
}
bool CrossGuardBlade::PowerDown(int aRampTime)
{
mCrossPowerLevel = 0;
PerformIO();
return SingleLedBlade::PowerDown(aRampTime);
}
void CrossGuardBlade::ApplyFlicker(int aEffect)
{
SingleLedBlade::ApplyFlicker(aEffect);
//Have the cross-guard copy whatever the main blade is doing
mCrossPowerLevel = mLedPowerLevel;
PerformIO();
}
void CrossGuardBlade::SetChannel(unsigned char aLevel, int aChannel)
{
switch(aChannel)
{
case 0:
SingleLedBlade::SetChannel(aLevel, aChannel);
break;
case 1:
mCrossPowerLevel = aLevel;
break;
default:
//Do nothing
break;
}
}
void CrossGuardBlade::PerformIO()
{
SingleLedBlade::PerformIO();
analogWrite(mCrossPin, mCrossPowerLevel);
}
void CrossGuardBlade::Off()
{
SingleLedBlade::Off();
mCrossPowerLevel = 0;
PerformIO();
}
void CrossGuardBlade::On()
{
SingleLedBlade::On();
mCrossPowerLevel = 255;
PerformIO();
}
BladeMetadata CrossGuardBlade::GetFeatures()
{
//Call superclass to get features
BladeMetadata lFeatures = SingleLedBlade::GetFeatures();
//Override select features
lFeatures.Channels = 2;
return lFeatures;
}