Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Arduino Programming Mode Selection Help (http://www.chiefdelphi.com/forums/showthread.php?t=106571)

gixxy 21-05-2012 08:38

Arduino Programming Mode Selection Help
 
So I am making an Arduino controlled, cyberpunk-ish, Pulsing LED Gauntlet. Basiclly it will have 4 set of 8 LEDs that are CharliePlexed (Wikipedia Link together.

So most of that is done except selecting which pattern to use. I basically need it to be run in checkTimers() in the code below.

At first I was going to make an array of pointers to the functions and use a short that was sent to the object as the index. However I couldn't get it to work because these are Member functions...

I really DON'T want to make a giant switch case for this when being fast is more important if i can help it, but if that is the only way, just say so.

So here is the C++ header for controlling the strips:
Code:

/*
||
|| @file        CharliePulser.cpp
|| @version        1.0
|| @author        Gus Michel
|| @contact        gus3@michelfamily.org
||
|| @description
|| | Provide an easy way of pulsing and controlling LED arrays that are charlieplexed
|| #
||
|| @license
|| | 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; version
|| | 2.1 of the License.
|| |
|| | 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
|| #
||
*/
#ifndef CHARLIEPULSER_H
#define CHARLIEPULSER_H


#include <math.h>
#include "CharlieLed.h"
#include "Arduino.h"
#include "TimeKeeper.h"


class CharliePulser {
        public:
                    CharliePulser(
                        CharlieLed LEDs[],
                        short numleds,
                        short PINs[],
                        short numpins,
                        unsigned long time
                    );//CONSTRUCTOR
                void setTime(int time);                        //Set Timer between steps
                void checkTimers();                        //Check Timers (for Timeing of LED steps and Pulsing of multipule LEDs)
        private:
                short currentStep;                        //The Current Step in the Mode (to allow for timing)
                short currentLed;                        //The Current LED (for pulsing multipule LEDs back and forth)
               
               
                unsigned long stepTime;                        //The Time per step
                unsigned long ledTime;                        //The Time between rerunning the current LED
                unsigned long modeTime;                        //The Time between rerunning the current step
               
                CharlieLed *leds;                        //Array of CharlieLeds in the CharliePulser
                short numLeds;                                //The Number of LEDs in the array
                short* pins;                                //Array of Pins the Pulser consistes of
                short numPins;                                //The Number of Pins in the Array
                short center;                                //The Center LED
               
                TimeKeeper *modeTimer;                        //Timer for repeating the current step. (repeat constantly)
                TimeKeeper *stepTimer;                        //Timer for Changing the step. (repeat at seprate interval)
                TimeKeeper *ledTimer;                        //Timer for Changing the LED to turn on in the next step. (repeat constantly)
               
                void off();                        //Turn off all LEDs
                void pulseCycle();                //Move the LEDs back and forth in a line
                void pulseForward();                //Move the LEDs forward in a line
                void pulseBackward();                //Move the LEDs backward in a line
                void starCycle();                //Move the LEDs to and fro from the center
                void starIn();                        //Move the LEDs into the center from edges
                void starOut();                        //Move the LEDs out-to the edges from the center
                void crissCross();                //Move the LEDs aross whole array.
               
                void ledChanger();                //Handles Cycling of LEDs when multipule are needed on at once.
                void stepChanger();                //Handles Cycling step of Mode at timed interval
                void light(short led);                //Handles Lighting a specified LED
};
#endif

Here is the CPP file
Code:

#include "CharliePulser.h"

CharliePulser::CharliePulser(
        CharlieLed LEDs[],
        short numleds,
        short PINs[],
        short numpins,
        unsigned long time
    ) {
          leds = (CharlieLed*) calloc(numleds, sizeof(CharlieLed));
        for(short i = 0; i < numleds; i++) {
                leds[i] = LEDs[i];
        }
        numLeds = numleds;
       
        pins = (short*) calloc(numpins, sizeof(short));
        for(short i = 0; i < numpins; i++) {
                pins[i] = PINs[i];
        }
        numPins = numpins;
       
        center = (short) (ceil((double)numLeds/2));
       
        ledTime = (unsigned long) 1;
        modeTime = (unsigned long) 1;
        stepTime = (unsigned long) time;
       
        currentStep = 1;
        currentLed = 0;
       
        ledTimer = new TimeKeeper(ledTime);
        modeTimer = new TimeKeeper(modeTime);
        stepTimer = new TimeKeeper(stepTime);
}

void CharliePulser::checkTimers() {
        if(modeTimer->check()) {
                crissCross();
        }
        if(ledTimer->check()) {
                ledChanger();
        }
        if(stepTimer->check()) {
                stepChanger();
        }
}

void CharliePulser::ledChanger() {
        currentLed++;
        if(currentLed > 1) {
                currentLed = 0;
        }
}

void CharliePulser::stepChanger() {
        currentStep++;
        if(currentStep > numLeds*2) {
                currentStep = 1;
        }
}

void CharliePulser::light(short led) {
        for(short i = 0; i < numPins; i++) {
                pinMode(pins[i], INPUT);
        }
        for(short i = 0; i < numPins; i++) {
                if(leds[led].getVoltagePin() == pins[i]) {
                        pinMode(pins[i], OUTPUT);
                        digitalWrite(pins[i], HIGH);
                } else if(leds[led].getGroundPin() == pins[i]) {
                        pinMode(pins[i], OUTPUT);
                        digitalWrite(pins[i], LOW);
                }
        }
}



//PULSING PATTERNS
void CharliePulser::off() {
        for(short i = 0; i < numPins; i++) {
                pinMode(pins[i], INPUT);
        }
}

void CharliePulser::pulseCycle() {
        if(currentStep <= numLeds) {
                pulseForward();
        } else {
                pulseBackward();
        }
}

void CharliePulser::pulseForward() {
        if(currentStep <= numLeds) {
                light((short) currentStep-1);
        } else {
                light((short) (currentStep-numLeds)-1);
        }
}

void CharliePulser::pulseBackward() {
        if(currentStep <= numLeds) {
                light((short) (numLeds-currentStep));
        } else {
                light((short) (numLeds-(currentStep-numLeds)));
        }
}

void CharliePulser::starCycle() {
        if(currentLed == 0) {
                pulseForward();
        } else {
                pulseBackward();
        }
}

void CharliePulser::starIn() {
        if(currentStep > center) {
                currentStep = 1;
        }
        starCycle();
}

void CharliePulser::starOut() {
        if(currentStep < center || currentStep > center*2) {
                currentStep = center+1;
        }
        starCycle();
}

void CharliePulser::crissCross() {
        if(currentStep*2 == numLeds) {
                currentStep++;
        }
        if((currentStep-numLeds)*2 == numLeds) {
                currentStep++;
        }
        starCycle();
}

Here is the Arduino Sketch
Code:

#include <CharliePulser.h>
#include <CharlieLed.h>
#include <TimeKeeper.h>

unsigned long timer = 100;
short numleds = 8;
short numpins = 4;
short startMode = 0; //OFF

short leftGreenPins[4] = {22, 24, 26, 28};
short leftBluePins[4] = {23, 25, 27, 29};
short rightGreenPins[4] = {30, 32, 34, 36};
short rightBluePins[4] = {31, 33, 35, 37};

CharlieLed leftGreenLeds[12] = {
  CharlieLed(22, 24),
  CharlieLed(24, 22),
  CharlieLed(24, 26),
  CharlieLed(26, 24),
  CharlieLed(26, 28),
  CharlieLed(28, 26),
  CharlieLed(22, 26),
  CharlieLed(26, 22),
  CharlieLed(24, 28),
  CharlieLed(28, 24),
  CharlieLed(22, 28),
  CharlieLed(28, 22)
};
CharlieLed leftBlueLeds[12] = {
  CharlieLed(23, 25),
  CharlieLed(25, 23),
  CharlieLed(25, 27),
  CharlieLed(27, 25),
  CharlieLed(27, 29),
  CharlieLed(29, 27),
  CharlieLed(23, 27),
  CharlieLed(27, 23),
  CharlieLed(25, 29),
  CharlieLed(29, 25),
  CharlieLed(23, 29),
  CharlieLed(29, 23)
};
CharlieLed rightGreenLeds[12] = {
  CharlieLed(30, 32),
  CharlieLed(32, 30),
  CharlieLed(32, 34),
  CharlieLed(34, 32),
  CharlieLed(34, 36),
  CharlieLed(36, 34),
  CharlieLed(30, 34),
  CharlieLed(34, 30),
  CharlieLed(32, 36),
  CharlieLed(36, 32),
  CharlieLed(32, 36),
  CharlieLed(36, 32)
 };
CharlieLed rightBlueLeds[12] = {
  CharlieLed(31, 33),
  CharlieLed(33, 31),
  CharlieLed(33, 35),
  CharlieLed(35, 33),
  CharlieLed(35, 37),
  CharlieLed(37, 35),
  CharlieLed(31, 35),
  CharlieLed(35, 31),
  CharlieLed(33, 37),
  CharlieLed(37, 33),
  CharlieLed(31, 37),
  CharlieLed(37, 31)
 };

CharliePulser* leftGreen;
CharliePulser* leftBlue;
CharliePulser* rightGreen;
CharliePulser* rightBlue;

void setup() {
  leftGreen = new CharliePulser(
    leftGreenLeds,
    numleds,
    leftGreenPins,
    numpins,
    timer
  );
  leftBlue = new CharliePulser(
    leftBlueLeds,
    numleds,
    leftBluePins,
    numpins,
    timer
  );
  rightGreen = new CharliePulser(
    rightGreenLeds,
    numleds,
    rightGreenPins,
    numpins,
    timer
  );
  rightBlue = new CharliePulser(
    rightBlueLeds,
    numleds,
    rightBluePins,
    numpins,
    timer
  );
 
  free(leftGreenPins);
  free(leftBluePins);
  free(rightGreenPins);
  free(rightBluePins);
  free(leftGreenLeds);
  free(leftBlueLeds);
  free(rightGreenLeds);
  free(rightBlueLeds);
}

void loop() {
  leftGreen->checkTimers();
  leftBlue->checkTimers();
  rightGreen->checkTimers();
  rightBlue->checkTimers();
}

TimeKeeper uses the millis() function to check if a specified interval of time has passed, and CharlieLed just keeps track of how the leds are hooked up.

Any and all help is much appreciated.

gixxy 23-05-2012 23:01

Re: Arduino Programming Mode Selection Help
 
Well, I went ahead with the Switch Case and it didn't cause any noticable lag with 8 modes, hopefully it would still be good enough at 32...... but if you come with a better solution, please post it.

Thanks.

DonRotolo 24-05-2012 21:50

Re: Arduino Programming Mode Selection Help
 
Over my head, sorry.

gixxy 24-05-2012 22:31

Re: Arduino Programming Mode Selection Help
 
Quote:

Originally Posted by DonRotolo (Post 1171448)
Over my head, sorry.

Oh well.

Anyway if anyone wants to look at the most recent code for the project, I finally got around to making repos for them:

Gauntlet Sketch
SwitchArray Library
TimeKeeper Library
CharlieLed Library
BatteryMeter Library
CharliePulser Library


All times are GMT -5. The time now is 00:51.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi