Added distance corrected switch time for LEDs.
This commit is contained in:
@@ -29,4 +29,11 @@
|
||||
#define BTN_DOWN_HOLDED -1
|
||||
#define BTN_DOWN_UP_NOT_HOLDED 0
|
||||
|
||||
#define LED_MAX_DISTANCE 1312
|
||||
#define LED_DISTANCE_ARRAY LedDistances [MAX_LED_INDEX + 1] = { 0.0, 0.013, 0.029, 0.049, 0.073, 0.101, 0.135, 0.176, 0.225, 0.285, 0.356, 0.442, 0.546, 0.670, 0.820, 1.0 }
|
||||
|
||||
#define MAX_SWITCH_TIME 15000
|
||||
#define MIN_SWITCH_TIME 500
|
||||
#define DEFAULT_SWITCH_TIME 5000
|
||||
|
||||
#endif
|
||||
@@ -169,7 +169,7 @@ public:
|
||||
{
|
||||
case RunMode::FORWARD: display.setSegments(WORD(F, R, W, D )); break;
|
||||
case RunMode::BACKWARD: display.setSegments(WORD(B, A, C, D )); break;
|
||||
case RunMode::BOTH: display.setSegments(WORD(P, I, N, G )); break;
|
||||
case RunMode::PING_PONG: display.setSegments(WORD(P, I, N, G )); break;
|
||||
case RunMode::RANDOM: display.setSegments(WORD(R, N, D, NONE)); break;
|
||||
}
|
||||
}
|
||||
|
||||
2
Enums.h
2
Enums.h
@@ -15,7 +15,7 @@ enum RunMode
|
||||
{
|
||||
FORWARD = 0,
|
||||
BACKWARD = 1,
|
||||
BOTH = 2,
|
||||
PING_PONG = 2,
|
||||
RANDOM = 3
|
||||
};
|
||||
|
||||
|
||||
11
LEDRunner.h
11
LEDRunner.h
@@ -39,7 +39,8 @@ public:
|
||||
|
||||
m_CurrentTime += _DeltaTime;
|
||||
|
||||
if(m_CurrentTime > Settings::getInstance().SwitchTime)
|
||||
//Settings::getInstance().SwitchTime
|
||||
if(m_CurrentTime > Settings::getInstance().getDistanceCorrectedSwitchTime(m_CurrentLED))
|
||||
{
|
||||
m_CurrentTime = 0;
|
||||
nextLED(Settings::getInstance().RunModeState, 1);
|
||||
@@ -176,7 +177,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_Run = false;
|
||||
bool m_Run = true;
|
||||
unsigned long m_CurrentTime = 0;
|
||||
int m_CurrentLED = 0;
|
||||
int m_CurrentLEDPingPong = 0;
|
||||
@@ -188,9 +189,9 @@ private:
|
||||
{
|
||||
case RunMode::FORWARD: m_CurrentLED = wrapInt(m_CurrentLED + _NextLEDIndexIncrement, MAX_LED_INDEX + 1); break;
|
||||
case RunMode::BACKWARD: m_CurrentLED = wrapInt(m_CurrentLED - _NextLEDIndexIncrement, MAX_LED_INDEX + 1); break;
|
||||
case RunMode::BOTH:
|
||||
m_CurrentLEDPingPong = wrapInt(m_CurrentLEDPingPong + _NextLEDIndexIncrement, (MAX_LED_INDEX + 1) * 2);
|
||||
m_CurrentLED = pingPong(m_CurrentLEDPingPong, MAX_LED_INDEX + 1);
|
||||
case RunMode::PING_PONG:
|
||||
m_CurrentLEDPingPong = wrapInt(m_CurrentLEDPingPong + _NextLEDIndexIncrement, MAX_LED_INDEX * 2);
|
||||
m_CurrentLED = pingPong(m_CurrentLEDPingPong, MAX_LED_INDEX);
|
||||
break;
|
||||
case RunMode::RANDOM: m_CurrentLED = random(0, MAX_LED_INDEX + 1); break;
|
||||
}
|
||||
|
||||
18
Settings.h
18
Settings.h
@@ -7,10 +7,11 @@
|
||||
class Settings
|
||||
{
|
||||
public:
|
||||
enum RunMode RunModeState = RunMode::RANDOM;
|
||||
enum RunMode RunModeState = RunMode::PING_PONG;
|
||||
enum TimeMode TimeModeState = TimeMode::CONST;
|
||||
int SwitchTime = 3000; //In milliseconds
|
||||
int SwitchTime = DEFAULT_SWITCH_TIME; //In milliseconds
|
||||
float Brightness = MAX_BRIGHTNESS / 2;
|
||||
float LED_DISTANCE_ARRAY;
|
||||
|
||||
//=======================================
|
||||
//Singleton. AVOID COPY ASSIGNMENTS
|
||||
@@ -32,14 +33,14 @@ public:
|
||||
|
||||
void setSwitchTime(int _SwitchTime)
|
||||
{
|
||||
if(_SwitchTime > 15000)
|
||||
if(_SwitchTime > MAX_SWITCH_TIME)
|
||||
{
|
||||
SwitchTime = 15000;
|
||||
SwitchTime = MAX_SWITCH_TIME;
|
||||
return;
|
||||
}
|
||||
if(_SwitchTime < 250)
|
||||
if(_SwitchTime < MIN_SWITCH_TIME)
|
||||
{
|
||||
SwitchTime = 250;
|
||||
SwitchTime = MIN_SWITCH_TIME;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -86,6 +87,11 @@ public:
|
||||
return SwitchTime / 10;
|
||||
}
|
||||
|
||||
int getDistanceCorrectedSwitchTime(int _LedIndex)
|
||||
{
|
||||
return (int) (min(max(SwitchTime * LedDistances[_LedIndex], MIN_SWITCH_TIME), MAX_SWITCH_TIME));
|
||||
}
|
||||
|
||||
private:
|
||||
int wrapInt(int _Num, int _Max)
|
||||
{
|
||||
|
||||
26
WrapHelper.h
26
WrapHelper.h
@@ -15,23 +15,23 @@ int wrapInt(int _Num, int _Max)
|
||||
return _Num;
|
||||
}
|
||||
|
||||
//Fix upper bounce (all LEDs are off)
|
||||
int pingPong(int _Num, int _Max)
|
||||
int pingPong(int _Num, int _MaxHalfIndex)
|
||||
{
|
||||
if(_Num < 0)
|
||||
const int maxHalfCount = _MaxHalfIndex + 1;
|
||||
const int maxFullIndex = _MaxHalfIndex * 2;
|
||||
const int maxFullCount = (_MaxHalfIndex + 1) * 2;
|
||||
int numInRange = _Num < 0
|
||||
? _Num % maxFullCount == 0
|
||||
? 0
|
||||
: _Num % maxFullCount + maxFullCount
|
||||
: _Num % maxFullCount;
|
||||
|
||||
if(numInRange > _MaxHalfIndex)
|
||||
{
|
||||
return (_Max + _Num % _Max);
|
||||
}
|
||||
if(_Num > _Max * 2)
|
||||
{
|
||||
return _Num % _Max;
|
||||
}
|
||||
if(_Num > _Max)
|
||||
{
|
||||
return _Max - _Num % _Max;
|
||||
return maxFullIndex - numInRange;
|
||||
}
|
||||
|
||||
return _Num;
|
||||
return numInRange;
|
||||
}
|
||||
|
||||
int wrapInt(int _Num, int _Min, int _Max)
|
||||
|
||||
Reference in New Issue
Block a user