Browse Source

Add different fade on and off times. Compensate for change mid cycle. Inadvertently fix bug where multiplier was wrong way round.

Robert Marshall 5 years ago
parent
commit
75b6b600a6
2 changed files with 31 additions and 17 deletions
  1. 26 12
      Receiver/src/LED.cpp
  2. 5 5
      Receiver/src/main.cpp

+ 26 - 12
Receiver/src/LED.cpp

@@ -5,42 +5,56 @@
 class LED{
 	unsigned int _pin;
 	bool _on;
-	unsigned long _fadeDuration, _fadeStart, _fadeEnd;
+	unsigned long _fadeDurationOn, _fadeDurationOff, _fadeStart, _fadeEnd;
+
+	unsigned long getFadeDuration(){
+		return _on ? _fadeDurationOn : _fadeDurationOff;
+	}
 
 	unsigned long getRemainingFadeTime(){
 		unsigned long now = millis();
-		return _fadeEnd >= now ? constrain(_fadeEnd - now, 0, _fadeDuration) : 0;
+		return _fadeEnd >= now ? constrain(_fadeEnd - now, 0, getFadeDuration()) : 0;
 	}
 
 	float getMultiplier() {
-		float value = getRemainingFadeTime() / (float)_fadeDuration;
+		float value = getRemainingFadeTime() / (float)getFadeDuration();
+		return 1.0f - value;
+	}
+
+	float getOutputMultiplier(){
+		float value = getMultiplier();
 		return _on ? value : 1.0f - value;
 	}
 
-	void resetTimers(){
+	void reset(bool on){
+		float oldMultiplier = getMultiplier();
+		_on = on;
 		_fadeStart = millis();
-		_fadeEnd = (_fadeStart + _fadeDuration) - getRemainingFadeTime();
+		_fadeEnd = _fadeStart + (getFadeDuration() * oldMultiplier);
 	}
 
 public:
-	LED(unsigned int pin, unsigned long fadeDuration){
+	LED(unsigned int pin, unsigned long fadeDurationOn, unsigned long fadeDurationOff){
 		_pin = pin;
 		pinMode(pin, OUTPUT);
-		_fadeDuration = fadeDuration;
+		_fadeDurationOn = fadeDurationOn;
+		_fadeDurationOff = fadeDurationOff;
 	}
 
 	void on(){
-		resetTimers();
-		_on = true;
+		reset(true);
 	}
 
 	void off(){
-		resetTimers();
-		_on = false;
+		reset(false);
+	}
+
+	void toggle(){
+		reset(!_on);
 	}
 
 	void loop(){
-		float multiplier = getMultiplier();
+		float multiplier = getOutputMultiplier();
 		analogWrite(_pin, PWMRANGE * multiplier);
 	}
 };

+ 5 - 5
Receiver/src/main.cpp

@@ -4,9 +4,8 @@
 
 void messageCallback(char *message);
 Receiver _receiver(2, &messageCallback, 9);
-LED _led(11, 1000);
+LED _led(5, 2000, 1000);
 
-bool on = false;
 unsigned long lastSwitch = 0;
 
 bool validateMessage(char* message){
@@ -29,12 +28,13 @@ void setup(){
 	Serial.println("Starting...");
 	_receiver.setup();
 	Serial.println("Started");
+	_led.off();
+	lastSwitch = millis();
 }
 
 void loop(){
-	if (millis()-lastSwitch>=2000){
-		on = !on;
-		on ? _led.on() : _led.off();
+	if (millis() - lastSwitch >= 500) {
+		_led.toggle();
 		lastSwitch = millis();
 	}
 	//_receiver.loop();