Nathan Yonkee / Mbed OS DotStarWall

Dependencies:   DotStarStrips

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 
00004 RawSerial  dev(PA_9, PA_10);
00005 SPI spiOne(PB_5, PB_4, PB_3);
00006 SPI spiTwo(PA_7, PA_6, PA_5);
00007 const int nLedsA = 455;
00008 const int nLedsB = 455;
00009 enum Init {brightness = 4, frequency = 500000, red = 35, green = 3, blue = 0, baud = 9600};
00010 
00011 class DotStar {
00012     SPI* const spi_;
00013     const int ledNum_;
00014     int brightness_;
00015     int colors_[3];
00016   public:
00017     enum { red = 0, green = 1, blue = 2 };
00018     enum { redIndex = 2, greenIndex = 3, blueIndex = 4 };
00019     enum {off = 0, dim = 8, half = 16, brightest = 31};
00020     enum {pause = 100, sleep = 2000};
00021     enum cmdType : char {
00022         setColor = '!',
00023         onOff = 'o',
00024         switchStrip = 's'
00025     };
00026     void set_color(const int color, const int val);
00027     void set_leds();
00028     DotStar(SPI* const spi, const int nLeds);
00029     void set_brightness(const int brightness);
00030 };
00031 
00032 struct RedGreenBlue {
00033     int red, green, blue;
00034 };
00035 
00036 class DotStarPair {
00037     DotStar* left;
00038     DotStar* right;
00039   public:
00040     DotStarPair(DotStar* l, DotStar* r);
00041     void set_brightness(const int brightness);
00042     void set_rgb(const RedGreenBlue& rgb);
00043 };
00044 
00045 DotStarPair::DotStarPair(DotStar* l, DotStar* r) : left(l), right(r) {}
00046 
00047 void DotStarPair::set_brightness(const int brightness) {
00048     left->set_brightness(brightness);
00049     left->set_leds();
00050     right->set_brightness(brightness);
00051     right->set_leds();
00052 };
00053 
00054 void DotStarPair::set_rgb(const RedGreenBlue& rgb) {
00055     left->set_color(DotStar::blue, rgb.blue);
00056     left->set_color(DotStar::red, rgb.red);
00057     left->set_color(DotStar::green, rgb.green);
00058     left->set_leds();
00059     right->set_color(DotStar::blue, rgb.blue);
00060     right->set_color(DotStar::red, rgb.red);
00061     right->set_color(DotStar::green, rgb.green);
00062     right->set_leds();
00063 };
00064 
00065 DotStar::DotStar(SPI* const spi, const int nLeds) : spi_(spi), ledNum_(nLeds),
00066     brightness_(Init::brightness) {
00067     spi_->frequency(Init::frequency);
00068     colors_[DotStar::red] = Init::red;
00069     colors_[DotStar::blue] = Init::blue;
00070     colors_[DotStar::green] = Init::green;
00071     set_leds();
00072 }
00073 
00074 
00075 void DotStar::set_leds() {
00076     const int brightnessFrame = (7<<5)|brightness_;
00077     const int blueFrame = (colors_[DotStar::blue] ) & 0xff;
00078     const int greenFrame = (colors_[DotStar::green]) & 0xff;
00079     const int redFrame = colors_[DotStar::red] & 0xff;
00080     int i;
00081     Thread::wait(DotStar::pause);
00082     for (i = 4; i --> 0; spi_->write(0)) { } // start frame
00083     for (i = 0; i < ledNum_ ; ++i) {
00084         spi_->write(brightnessFrame); // led frame
00085         spi_->write(blueFrame); // B
00086         spi_->write(greenFrame); // G
00087         spi_->write(redFrame); // R
00088     }
00089     for (i = 4; i --> 0; spi_->write(1)) { } // end frame
00090 }
00091 
00092 void DotStar::set_brightness(const int brightness) {
00093     brightness_ = brightness;
00094 }
00095 
00096 void DotStar::set_color(const int c, const int val) {
00097     colors_[c] = val;
00098 };
00099 
00100 DotStar dotStarA(&spiOne, nLedsA);
00101 DotStar dotStarB(&spiTwo, nLedsB);
00102 
00103 DotStarPair strips(&dotStarA, &dotStarB);
00104 
00105 int main() {
00106     dev.baud(Init::baud);
00107     for (int i = 1; i < DotStar::brightest; i += 4) {
00108         strips.set_brightness(i);
00109     }
00110     bool sleeping = false;
00111 #define STR_BUFF_SIZE_VAR 6
00112     char bleCmdString[STR_BUFF_SIZE_VAR] = {};
00113     for (; ; ) {
00114         for (int i = 0; i < STR_BUFF_SIZE_VAR; i++) {
00115             bleCmdString[i] = 0;
00116         }
00117         dev.putc('a');
00118         strips.set_brightness(DotStar::half);
00119         int i = 0;
00120         int j = 0;
00121         while (i < STR_BUFF_SIZE_VAR) {
00122             while(dev.readable()) {
00123                 bleCmdString[i] = dev.getc();
00124                 ++i;
00125             }
00126             if(j++ > 30000000) break;
00127         }
00128         /* strips.set_brightness(DotStar::dim); */
00129         auto cmdPrefix = bleCmdString[0];
00130         if (cmdPrefix == DotStar::cmdType::setColor) {
00131             RedGreenBlue rgb;
00132             rgb.red = (int)(bleCmdString[DotStar::redIndex]);
00133             rgb.green = (int)(bleCmdString[DotStar::greenIndex]);
00134             rgb.blue = (int)(bleCmdString[DotStar::blueIndex]);
00135             strips.set_rgb(rgb);
00136             /* strips.set_brightness(DotStar::half); */
00137             /* Thread::wait(DotStar::sleep); */
00138         } else if (cmdPrefix == DotStar::cmdType::onOff) {
00139             sleeping = true;
00140             strips.set_brightness(DotStar::dim);
00141             Thread::wait(DotStar::pause);
00142         }
00143         while (sleeping) {
00144             strips.set_brightness(DotStar::off);
00145             Thread::wait(DotStar::sleep);
00146             while (dev.readable()) {
00147                 if (dev.getc() == DotStar::cmdType::onOff) {
00148                     sleeping = false;
00149                     strips.set_brightness(DotStar::dim);
00150                     Thread::wait(DotStar::pause);
00151                 }
00152             }
00153         }
00154     }
00155 
00156 }