From 5f513c4c3471ab509420faf4dbbd55141c19cb71 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 17 Jan 2022 08:25:26 -0600 Subject: [PATCH] updated --- src/extras/Pixel.cpp | 87 ++++++++++++------------------------------- src/extras/Pixel.h | 61 +++++++++++++++--------------- src/extras/extras.ino | 4 +- 3 files changed, 55 insertions(+), 97 deletions(-) diff --git a/src/extras/Pixel.cpp b/src/extras/Pixel.cpp index 5c77b61..d64bde0 100644 --- a/src/extras/Pixel.cpp +++ b/src/extras/Pixel.cpp @@ -3,7 +3,7 @@ /////////////////// -Pixel::Pixel(int pin, uint32_t nPixels){ +Pixel::Pixel(int pin){ rf=new RFControl(pin,false,false); // set clock to 1/80 usec, no default driver setTiming(0.32, 0.88, 0.64, 0.56, 80.0); // set default timing parameters (suitable for most SK68 and WS28 RGB pixels) @@ -11,8 +11,7 @@ Pixel::Pixel(int pin, uint32_t nPixels){ rmt_isr_register(loadData,(void *)this,0,NULL); // set custom interrupt handler rmt_set_tx_thr_intr_en(rf->getChannel(),true,8); // enable threshold interrupt (note end-transmission interrupt automatically enabled by rmt_tx_start) - channelNum=rf->getChannel(); // save integer form of channel number - txEndMask=TxEndMask(channelNum); // create bit mask for end-of-transmission interrupt specific to this channel + txEndMask=TxEndMask(rf->getChannel()); // create bit mask for end-of-transmission interrupt specific to this channel } @@ -27,23 +26,26 @@ void Pixel::setTiming(float high0, float low0, float high1, float low1, uint32_t /////////////////// -void Pixel::setRGB(uint8_t r, uint8_t g, uint8_t b, int nPixels){ +void Pixel::setRGB(uint8_t r, uint8_t g, uint8_t b, uint32_t nPixels){ - if(!*rf) + if(!*rf || nPixels==0) return; - uint32_t *pulses = (uint32_t *) malloc(24*sizeof(uint32_t)); - - loadColor(getColorRGB(r,g,b),pulses); - rf->start(pulses,24,nPixels); // start pulse train and repeat for nPixels - delayMicroseconds(resetTime); - - free(pulses); + uint32_t data=getColorRGB(r,g,b); + setColors(&data,nPixels,false); } /////////////////// -void Pixel::setColors(const uint32_t *data, uint32_t nPixels){ +void Pixel::setHSV(float h, float s, float v, uint32_t nPixels){ + float r,g,b; + LedPin::HSVtoRGB(h,s/100.0,v/100.0,&r,&g,&b); + setRGB(r*255,g*255,b*255,nPixels); +} + +/////////////////// + +void Pixel::setColors(const uint32_t *data, uint32_t nPixels, boolean multiColor){ if(!*rf || nPixels==0) return; @@ -53,58 +55,15 @@ void Pixel::setColors(const uint32_t *data, uint32_t nPixels){ status.iMem=0; status.iBit=24; status.started=true; + this->multiColor=multiColor; -// loadData(); // load first 2 bytes -// loadData(); - - loadData(this); + loadData(this); // load first two bytes of data to get started loadData(this); rmt_tx_start(rf->getChannel(),true); - while(status.started); - - - return; - -// uint32_t *pulses = (uint32_t *) malloc(nTrain*24*sizeof(uint32_t)); -// -// if(!pulses){ -// Serial.printf("*** ERROR: Not enough memory to reserve for %d Pixels per batch transmission\n",nTrain); -// return; -// } -// -// int i,j; -// -// for(i=0;istart(pulses,j*24); -// } -// -// free(pulses); -// delayMicroseconds(resetTime); -} - -/////////////////// - -void Pixel::setHSV(float h, float s, float v, int nPixels){ - float r,g,b; - LedPin::HSVtoRGB(h,s/100.0,v/100.0,&r,&g,&b); - setRGB(r*255,g*255,b*255,nPixels); -} - -/////////////////// - -void Pixel::loadColor(uint32_t c, uint32_t *p){ - - uint32_t count=24; - p+=23; - - while(count--){ - *p--=pattern[c&1]; - c=c>>1; - } + while(status.started); // wait for transmission to be complete + delayMicroseconds(resetTime); // end-of-marker delay } /////////////////// @@ -136,16 +95,16 @@ void Pixel::loadData(void *arg){ RMT.int_clr.val=~0; if(status.nPixels==0){ - RMTMEM.chan[pix->channelNum].data32[status.iMem].val=0; + RMTMEM.chan[pix->rf->getChannel()].data32[status.iMem].val=0; return; } for(int i=0;i<8;i++) - RMTMEM.chan[pix->channelNum].data32[status.iMem++].val=pix->pattern[(*status.data>>(--status.iBit))&1]; + RMTMEM.chan[pix->rf->getChannel()].data32[status.iMem++].val=pix->pattern[(*status.data>>(--status.iBit))&1]; if(status.iBit==0){ status.iBit=24; - status.data++; + status.data+=pix->multiColor; status.nPixels--; } @@ -154,4 +113,4 @@ void Pixel::loadData(void *arg){ /////////////////// -volatile pixel_status_t Pixel::status; +volatile Pixel::pixel_status_t Pixel::status; diff --git a/src/extras/Pixel.h b/src/extras/Pixel.h index df19221..8dbb222 100644 --- a/src/extras/Pixel.h +++ b/src/extras/Pixel.h @@ -8,51 +8,48 @@ #include "RFControl.h" #include "PwmPin.h" -struct pixel_status_t { - int nPixels; - const uint32_t *data; - int iBit; - int iMem; - boolean started; -}; - class Pixel { + + struct pixel_status_t { + int nPixels; + const uint32_t *data; + int iBit; + int iMem; + boolean started; + }; + private: + RFControl *rf; // Pixel utilizes RFControl uint32_t pattern[2]; // storage for zero-bit and one-bit pulses uint32_t resetTime; // minimum time (in usec) between pulse trains - int channelNum; // channel number uint32_t txEndMask; // mask for end-of-transmission interrupt + boolean multiColor; // flag to indicate array contains multiple colors (don't just repeat first color for nPixels) - uint32_t nTrain; // number of Pixels to transmit per pulse train batch - - #if defined(CONFIG_IDF_TARGET_ESP32) - const int memSize=64; - #define TxEndMask(chNum) (1<<(chNum*3)) - #elif defined(CONFIG_IDF_TARGET_ESP32S2) - const int memSize=48; - #define TxEndMask(chNum) (1<<(chNum*3)) - #elif defined(CONFIG_IDF_TARGET_ESP32C3) - const int memSize=48; - #define TxEndMask(chNum) (1<getPin());} // returns pixel pin if valid, else returns -1 static uint32_t getColorRGB(uint8_t r, uint8_t g, uint8_t b); // return pixel Color from RGB values diff --git a/src/extras/extras.ino b/src/extras/extras.ino index 66ccd09..d447e49 100644 --- a/src/extras/extras.ino +++ b/src/extras/extras.ino @@ -95,11 +95,12 @@ void setup() { Serial.println("\n\nHomeSpan Pixel Example\n"); +// Pixel px0(10); Pixel px(1); uint32_t colors[20]; - colors[0]=px.getColorRGB(40,0,0); + colors[0]=px.getColorRGB(0,40,0); colors[1]=px.getColorRGB(40,0,0); colors[2]=px.getColorRGB(40,0,0); colors[3]=px.getColorRGB(40,40,0); @@ -109,6 +110,7 @@ void setup() { colors[7]=px.getColorRGB(0,40,0); px.setColors(colors,8); +// px.setHSV(240,80,40,3); Serial.println("\n\nDone\n\n"); while(1);