diff --git a/src/extras/Pixel.cpp b/src/extras/Pixel.cpp index d64bde0..6699b4d 100644 --- a/src/extras/Pixel.cpp +++ b/src/extras/Pixel.cpp @@ -8,11 +8,13 @@ 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) - rmt_isr_register(loadData,(void *)this,0,NULL); // set custom interrupt handler + rmt_isr_register(loadData,NULL,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) txEndMask=TxEndMask(rf->getChannel()); // create bit mask for end-of-transmission interrupt specific to this channel + Serial.printf("%d %d %08X\n",rf->getChannel(),txEndMask,RMT.int_ena.val); + } /////////////////// @@ -55,11 +57,15 @@ void Pixel::setColors(const uint32_t *data, uint32_t nPixels, boolean multiColor status.iMem=0; status.iBit=24; status.started=true; - this->multiColor=multiColor; + status.px=this; + status.multiColor=multiColor; loadData(this); // load first two bytes of data to get started loadData(this); + for(int i=0;imemSize;i++) + Serial.printf("%d %08X\n",i,RMTMEM.chan[rf->getChannel()].data32[i].val); + rmt_tx_start(rf->getChannel(),true); while(status.started); // wait for transmission to be complete @@ -84,9 +90,7 @@ uint32_t Pixel::getColorHSV(float h, float s, float v){ void Pixel::loadData(void *arg){ - Pixel *pix=(Pixel *)arg; - - if(RMT.int_st.val & pix->txEndMask){ + if((RMT.int_st.val & status.px->txEndMask) >0){ RMT.int_clr.val=~0; status.started=false; return; @@ -95,20 +99,20 @@ void Pixel::loadData(void *arg){ RMT.int_clr.val=~0; if(status.nPixels==0){ - RMTMEM.chan[pix->rf->getChannel()].data32[status.iMem].val=0; + RMTMEM.chan[status.px->rf->getChannel()].data32[status.iMem].val=0; return; } for(int i=0;i<8;i++) - RMTMEM.chan[pix->rf->getChannel()].data32[status.iMem++].val=pix->pattern[(*status.data>>(--status.iBit))&1]; + RMTMEM.chan[status.px->rf->getChannel()].data32[status.iMem++].val=status.px->pattern[(*status.data>>(--status.iBit))&1]; if(status.iBit==0){ status.iBit=24; - status.data+=pix->multiColor; + status.data+=status.multiColor; status.nPixels--; } - status.iMem%=pix->memSize; + status.iMem%=status.px->memSize; } /////////////////// diff --git a/src/extras/Pixel.h b/src/extras/Pixel.h index 8dbb222..cdb6d21 100644 --- a/src/extras/Pixel.h +++ b/src/extras/Pixel.h @@ -16,6 +16,8 @@ class Pixel { int iBit; int iMem; boolean started; + Pixel *px; + boolean multiColor; }; private: @@ -23,7 +25,6 @@ class Pixel { uint32_t pattern[2]; // storage for zero-bit and one-bit pulses uint32_t resetTime; // minimum time (in usec) between pulse trains 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) #if defined(CONFIG_IDF_TARGET_ESP32) const int memSize=64; diff --git a/src/extras/extras.ino b/src/extras/extras.ino index d447e49..f5b0f56 100644 --- a/src/extras/extras.ino +++ b/src/extras/extras.ino @@ -95,22 +95,23 @@ void setup() { Serial.println("\n\nHomeSpan Pixel Example\n"); -// Pixel px0(10); + Pixel px0(10); Pixel px(1); + Pixel px1(0); uint32_t colors[20]; - colors[0]=px.getColorRGB(0,40,0); + colors[0]=px.getColorRGB(40,0,0); colors[1]=px.getColorRGB(40,0,0); colors[2]=px.getColorRGB(40,0,0); colors[3]=px.getColorRGB(40,40,0); colors[4]=px.getColorRGB(40,40,0); colors[5]=px.getColorRGB(40,40,0); colors[6]=px.getColorRGB(0,40,0); - colors[7]=px.getColorRGB(0,40,0); + colors[7]=px.getColorRGB(40,0,0); px.setColors(colors,8); -// px.setHSV(240,80,40,3); + px.setHSV(0,100,40,3); Serial.println("\n\nDone\n\n"); while(1);