- #include "ws281x.h"
 
- #include "delay.h"
 
- #include "timer.h"
 
 
 
- u16 pixelBuffer[PIXEL_NUM + RESET_NUM][24] = {0};
 
 
- void ws281x_show(void)
 
- {               
 
-      DMA_SetCurrDataCounter(DMA1_Channel5,(PIXEL_NUM + RESET_NUM)* 24 );
 
-                                        
 
-             DMA_Cmd(DMA1_Channel5, ENABLE);
 
-      TIM_Cmd(TIM4, ENABLE);
 
-                                 
 
 
-             while(DMA_GetFlagStatus(DMA1_FLAG_TC5) !=SET);
 
-      DMA_Cmd(DMA1_Channel5, DISABLE );
 
-      DMA_ClearFlag(DMA1_FLAG_TC5);
 
-      TIM_Cmd(TIM4, DISABLE);                                                        
 
- }
 
 
- void ws281x_closeAll(void)
 
- {
 
-      uint16_t i;
 
-      uint8_t j;  
 
-      for(i = 0; i < PIXEL_NUM; i++)
 
-      {
 
-          for(j = 0; j < 24; j++)
 
-          {
 
-               pixelBuffer[i][j] = WS_LOW;
 
-          }
 
-      }
 
-                                         ws281x_show();
 
- }
 
 
- uint32_t ws281x_color(uint8_t red, uint8_t green, uint8_t blue)
 
- {
 
-      return ((green << 16) | (red << 8) | blue);
 
- }
 
 
 
- void ws281x_setPixelColor(uint16_t n ,uint32_t GRBcolor)
 
- {
 
-      uint8_t i;
 
-                                         if(n < PIXEL_NUM)
 
-      {
 
-           for(i = 0; i < 24; i++)
 
-           {                                                                        
 
-                                                                                      pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
 
-           }
 
-      }               
 
- }
 
 
 
 
- /**********************************************************************************************************/
 
- // level
 
- //  8               08   09
 
- //  7            07         10
 
- //  6          06             11
 
- //  5         05               12
 
- //  4         04               13
 
- //  3          03             14
 
- //  2            02         15
 
- //  1               01  16
 
- //  0 off            
 
- void ws281x_setPixelColor_ringleds(uint16_t n ,uint32_t GRBcolor)            //PIXEL_NUM:12/16/2*n Ring leds
 
- {
 
-        uint8_t i,k,p;
 
-                                                         
 
-                                                         for(i = 0; i < 24; i++)
 
-                                                  {                        
 
-                                                                                                         for(k = 0;(k < n) && (n <= (PIXEL_NUM / 2));k++)
 
-                                                                                                         {
 
-                                                                                                              pixelBuffer[k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
 
-                                                                                                              pixelBuffer[(PIXEL_NUM - 1) - k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;                                                                                                
 
-                                                                                                         }
 
-                                                                                                         for(p = n;(p < ( PIXEL_NUM - n)) && (n <= (PIXEL_NUM / 2)) ;p++)
 
-                                                                                                         {
 
-                                                                                                              pixelBuffer[p][i]  =   WS_LOW;                                                                                                                                                                                                                                 
 
-                                                                                                         }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
-                                                         }
 
- }
 
 
 
- //  fill the dots one by one with a color on left and right sides at the same time
 
- void ws281x_colorWipe_lr( uint32_t c, uint8_t num)
 
- {
 
-     uint16_t i;
 
-                                 if(num > PIXEL_NUM / 2)
 
-                                 {
 
-                                      num = PIXEL_NUM / 2;
 
-                                 }
 
-     for(i = 0; i < (num + 1); i++)         //
 
-                   {                                                
 
-                                                                 ws281x_setPixelColor_ringleds(i ,c);
 
-                       ws281x_show();
 
-         //delay_ms(wait);          //>        0.05ms                                will should be using timer               
 
-     }
 
- }
 
 
 
- //Freq rising or falling lights
 
- void ws281x_colorWipe_freq(uint8_t type)
 
- {        
 
-                                                                                                                
 
-                  switch(type)
 
-                                                                                 {
 
-                                                                                        case 1:
 
-                         ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
 
-                                                                                                                                                                                                 break;
 
-                                                                                               case 2:
 
-                         ws281x_colorWipe_lr(ws281x_color(0, 50, 0), ws281x_freq_num); // green
 
-                                                                                                                                                                                                 break;                                                                                                                                                               
 
-                                                                                                                                         case 3:
 
-                         ws281x_colorWipe_lr(ws281x_color(0, 0, 50), ws281x_freq_num); // Blue
 
-                                                                                                                                                                                                 break;               
 
-                                                                                                                                         case 4:
 
-                         ws281x_colorWipe_lr(ws281x_color(50, 50, 50), ws281x_freq_num); // white
 
-                                                                                                                                                                                                 break;               
 
-                                                                                                                                                                                        
 
-                                                                                                                                 default:
 
-                         ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
 
-                                                                                                                                                                                                 break;                                       
 
-                                                                                 }                                                                                   
 
- }
 
 
 
 
 
- /***************************************************************************************************/
 
- uint32_t ws281x_colorTran(uint8_t tran,uint8_t color_mode)  //The colour is a transition r/g/b back to r/g/b(color_mode:Red1,Green2,Blue3). space 3
 
- {
 
-      tran = 255 - tran;
 
-      if(tran < 85)
 
-                                         {
 
-                                              switch(color_mode)
 
-                                                                                 {
 
-                                                                                        case 1:
 
-                         return ws281x_color(tran * 3, 0, 0);
 
-                                                                                               case 2:
 
-                         return ws281x_color(0, tran * 3, 0);                                                                                                                                                                                
 
-                                                                                                                                         case 3:
 
-                         return ws281x_color(0, 0, tran * 3);                                                               
 
-                                                                                                                                 default:
 
-                                                                                                                                         return ws281x_color(tran * 3, 0, 0);                                                
 
-                                                                                 }
 
-      }
 
-                                        
 
-      if(tran < 170)
 
-                                         {
 
-           tran -= 85;
 
-                                                                                 switch(color_mode)
 
-                                                                                 {
 
-                                                                                        case 1:
 
-                         return ws281x_color(255, 0, 0);
 
-                                                                                               case 2:
 
-                         return ws281x_color(0,255, 0);                                                                                                                                                                                
 
-                                                                                                                                         case 3:
 
-                         return ws281x_color(0, 0, 255);                                                               
 
-                                                                                                                                 default:
 
-                                                                                                                                         return ws281x_color(255, 0, 0);                                                
 
-                                                                                 }
 
-      }
 
-      tran -= 170;
 
-                                         switch(color_mode)
 
-                                         {
 
-                                                                                                 case 1:
 
-                                                                                                                                                         return ws281x_color(255 - tran * 3, 0, 0);
 
-                                                                                                 case 2:
 
-                                                                                                                                                         return ws281x_color(0, 255 - tran * 3, 0);                                                                                                                                                                                
 
-                                                                                                 case 3:
 
-                                                                                                                                                         return ws281x_color(0, 0, 255 - tran * 3);                                                               
 
-                                                                                         default:
 
-                                                                                                                                                         return ws281x_color(255 - tran * 3, 0, 0);                                                                                                                                                
 
-                                         }
 
- }
 
 
 
- void ws281x_colorblnCtrl(uint8_t color_mode)   // ws281x_bln_num use timer,mode:red1/green2/blue3
 
- {
 
-      uint16_t i;
 
 
-                                                                                         if( !(ws281x_bln_num == ws281x_bln_oldnum))
 
-                                                                                         {
 
-                                                                                                                         for(i = 0; i < PIXEL_NUM; i++)
 
-                                                                                                                         {
 
-                                                                                                                                                         ws281x_setPixelColor(i ,ws281x_colorTran(ws281x_bln_num,color_mode));
 
-                                                                                                                         }
 
-                                                                                                                         ws281x_show();
 
-                                                                                                                         ws281x_bln_oldnum = ws281x_bln_num;
 
-                                                                                         }
 
-                                 
 
- }
 
- /***************************************************************************************************/
 
 
- void ws281x_setPixelColor_wheel_leds(uint16_t n ,uint32_t GRBcolor)            //n:0~15 whirling leds
 
- {
 
-        uint8_t i,k;
 
-                                                         
 
-                                                         for(i = 0; i < 24; i++)
 
-                                                  {        
 
-                   for(k = 0;k < PIXEL_NUM;k++)
 
-                                                                                                                                                 {                                                                                                                                                                                                        
 
-                                                                                                                                                                                                         pixelBuffer[k][i]  =   WS_LOW;                                                                                                                                                                                         
 
-                                                                                                                                                 }                                                            
 
 
-                                                                                                              pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
 
-                                                                                                                                                 if( n < PIXEL_NUM/2)
 
-                                                                                                                                                 {
 
-                                                                                                                                                      pixelBuffer[n + (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;        
 
-                                                                                                                                                 }
 
-                                                                                                                                                 else
 
-                                                                                                                                                 {
 
-                                                                                                                                                      pixelBuffer[n - (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;        
 
-                                                                                                                                                 }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
-                                                         }
 
-                                                         ws281x_show();        
 
- }
 
 
- void ws281x_display(void)
 
- {
 
-                                      if(ws281x_led_display_mode == 1)
 
-                                                                         {
 
-                                                                         ws281x_colorblnCtrl(ws281x_bln_mode);
 
-                                                                         }
 
-                                                                         
 
-                                                                         if(ws281x_led_display_mode == 2)
 
-                                                                         {
 
-                                                                         ws281x_colorWipe_freq(ws281x_freq_color_type);
 
-                                                                         }
 
-                                                                         if(ws281x_led_display_mode == 3)
 
-                                                                         {
 
-                                                                                                         ws281x_setPixelColor_wheel_leds(ws281x_whirl_index,
 
-                                                                                                                                                                                                                                                                                                                                                                         ws281x_color(color_R[ws281x_whirl_colortran_index],
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 color_G[ws281x_whirl_colortran_index],
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 color_B[ws281x_whirl_colortran_index])) ;        
 
-                                                                         }     
 
- }
 
 
 
 
 
 
 
 
- /*
 
- void ws281x_setPixelColor_11x44leds(uint16_t n ,uint32_t GRBcolor)            //PIXEL_NUM:11x44 leds  n:0~10
 
- {
 
-        uint8_t i,k,p,q;
 
-                                                         
 
-                                                         for(i = 0; i < 24; i++)
 
-                                                  {                        
 
-                                                                                                         for(k = 0;k < 44;k++)
 
-                                                                                                         {
 
-                                                                                                               for(q = 0 ;q < (n +1);q++)
 
-                                                                                                                                                         {
 
-                                                                                                                                                       pixelBuffer[q + k*11][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;                                                                                                                                                                                
 
-                                                                                                                                                  }
 
-                                                                                                                                                         for(p = 1;p < (10-n);p++)
 
-                                                                                                                                                  {
 
-                                                                                                                                                                                          pixelBuffer[(n + p) + k*11][i]  =   WS_LOW;                                                                                                                                                                                                                                 
 
-                                                                                                                                                  }                                                                                                                                                                                                        
 
-                                                                                                         }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
-                                                         }
 
- }
 
- */