#include "main.h"

/* Adjust these values based on your timer clock and desired WS2812 timings.
   With a timer period of 100 counts, a “0” is defined as a pulse width of 30,
   and a “1” as 70. These numbers may need tuning for your board. */
#define TIMER_PERIOD    100
#define WS2812_0        30
#define WS2812_1        70

#define LED_COUNT       8
/* 24 bits (GRB) per LED plus extra end-frame zeros (50 counts gives >50µs low) */
#define LED_DATA_LENGTH ((LED_COUNT * 24) + 50)

uint16_t ledBuffer[LED_DATA_LENGTH] = {0};

/* Simple structure to hold color values in GRB order */
typedef struct {
  uint8_t green;
  uint8_t red;
  uint8_t blue;
} LED_Color;

LED_Color led_colors[LED_COUNT];

/* 
 * Set a given LED color.
 */
void ws2812_setLED(uint16_t led_index, uint8_t red, uint8_t green, uint8_t blue) {
  if (led_index < LED_COUNT) {
    led_colors[led_index].red = red;
    led_colors[led_index].green = green;
    led_colors[led_index].blue = blue;
  }
}

/*
 * Encode LED color data into a PWM buffer. Each bit of color data is converted
 * into a PWM pulse width:
 *   - WS2812_1 for bit '1'
 *   - WS2812_0 for bit '0'
 * Data is sent in GRB order.
 */
void ws2812_prepareData(void) {
  uint32_t indx = 0;
  for (int i = 0; i < LED_COUNT; i++) {
    uint8_t colors[3] = { led_colors[i].green, led_colors[i].red, led_colors[i].blue };
    for (int j = 0; j < 3; j++) {
      for (int bit = 7; bit >= 0; bit--) {
        if (colors[j] & (1 << bit))
          ledBuffer[indx++] = WS2812_1;
        else
          ledBuffer[indx++] = WS2812_0;
      }
    }
  }
  /* Fill rest of buffer with 0s to generate the reset pulse (>50µs low) */
  for (; indx < LED_DATA_LENGTH; indx++) {
    ledBuffer[indx] = 0;
  }
}

/*
 * Start DMA transfer via timer PWM.
 * This function assumes that TIM2 (or your chosen timer) has been configured
 * in PWM mode with a period of TIMER_PERIOD.
 */
void ws2812_show(void) {
  ws2812_prepareData();
  /* Start PWM on TIM2 Channel 1 using DMA. Adjust the timer handle and channel as needed. */
  HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*)ledBuffer, LED_DATA_LENGTH);
  
  /* Wait sufficiently long for the DMA transfer to complete.
     A delay of 1ms is usually enough for 8 LEDs. */
  HAL_Delay(1);

  HAL_TIM_PWM_Stop_DMA(&htim2, TIM_CHANNEL_1);
}

/*
 * Main application entry
 */
int main(void) {
  HAL_Init();
  SystemClock_Config();    // Configure system clock (generated via CubeMX)
  MX_GPIO_Init();          // Initialize GPIO (may be generated via CubeMX)
  MX_TIM2_Init();          // Initialize TIM2 for PWM (configure via CubeMX)
  
  /* Main loop: cycle colors on the LED strip */
  while (1) {
    for (int i = 0; i < LED_COUNT; i++) {
      ws2812_setLED(i, 255, 0, 0);  // Red
    }
    ws2812_show();
    HAL_Delay(500);
    
    for (int i = 0; i < LED_COUNT; i++) {
      ws2812_setLED(i, 0, 255, 0);  // Green
    }
    ws2812_show();
    HAL_Delay(500);
    
    for (int i = 0; i < LED_COUNT; i++) {
      ws2812_setLED(i, 0, 0, 255);  // Blue
    }
    ws2812_show();
    HAL_Delay(500);
  }
}
nucleo:D1
nucleo:D0
nucleo:RST.1
nucleo:GND.1
nucleo:D2
nucleo:D3
nucleo:D4
nucleo:D5
nucleo:D6
nucleo:D7
nucleo:D8
nucleo:D9
nucleo:D10
nucleo:D11
nucleo:D12
nucleo:VIN
nucleo:GND.2
nucleo:RST.2
nucleo:5V
nucleo:A7
nucleo:A6
nucleo:A5
nucleo:A4
nucleo:A3
nucleo:A2
nucleo:A1
nucleo:A0
nucleo:REF
nucleo:3V3
nucleo:D13
74HC165
sr1:PL
sr1:CP
sr1:D4
sr1:D5
sr1:D6
sr1:D7
sr1:Q7_N
sr1:GND
sr1:Q7
sr1:DS
sr1:D0
sr1:D1
sr1:D2
sr1:D3
sr1:CE
sr1:VCC
74HC165
sr2:PL
sr2:CP
sr2:D4
sr2:D5
sr2:D6
sr2:D7
sr2:Q7_N
sr2:GND
sr2:Q7
sr2:DS
sr2:D0
sr2:D1
sr2:D2
sr2:D3
sr2:CE
sr2:VCC
74HC165
sr5:PL
sr5:CP
sr5:D4
sr5:D5
sr5:D6
sr5:D7
sr5:Q7_N
sr5:GND
sr5:Q7
sr5:DS
sr5:D0
sr5:D1
sr5:D2
sr5:D3
sr5:CE
sr5:VCC
rgb1:VDD
rgb1:DOUT
rgb1:VSS
rgb1:DIN
rgb2:VDD
rgb2:DOUT
rgb2:VSS
rgb2:DIN
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
rgb3:VDD
rgb3:DOUT
rgb3:VSS
rgb3:DIN
rgb4:VDD
rgb4:DOUT
rgb4:VSS
rgb4:DIN
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r
rgb5:VDD
rgb5:DOUT
rgb5:VSS
rgb5:DIN
rgb6:VDD
rgb6:DOUT
rgb6:VSS
rgb6:DIN
btn6:1.l
btn6:2.l
btn6:1.r
btn6:2.r
btn7:1.l
btn7:2.l
btn7:1.r
btn7:2.r
rgb7:VDD
rgb7:DOUT
rgb7:VSS
rgb7:DIN
rgb8:VDD
rgb8:DOUT
rgb8:VSS
rgb8:DIN
btn8:1.l
btn8:2.l
btn8:1.r
btn8:2.r
btn9:1.l
btn9:2.l
btn9:1.r
btn9:2.r
rgb9:VDD
rgb9:DOUT
rgb9:VSS
rgb9:DIN
rgb10:VDD
rgb10:DOUT
rgb10:VSS
rgb10:DIN
btn10:1.l
btn10:2.l
btn10:1.r
btn10:2.r
btn11:1.l
btn11:2.l
btn11:1.r
btn11:2.r
rgb12:VDD
rgb12:DOUT
rgb12:VSS
rgb12:DIN
btn12:1.l
btn12:2.l
btn12:1.r
btn12:2.r
btn13:1.l
btn13:2.l
btn13:1.r
btn13:2.r
rgb13:VDD
rgb13:DOUT
rgb13:VSS
rgb13:DIN
rgb14:VDD
rgb14:DOUT
rgb14:VSS
rgb14:DIN
btn14:1.l
btn14:2.l
btn14:1.r
btn14:2.r
btn15:1.l
btn15:2.l
btn15:1.r
btn15:2.r
rgb15:VDD
rgb15:DOUT
rgb15:VSS
rgb15:DIN
rgb16:VDD
rgb16:DOUT
rgb16:VSS
rgb16:DIN
btn16:1.l
btn16:2.l
btn16:1.r
btn16:2.r
btn17:1.l
btn17:2.l
btn17:1.r
btn17:2.r
rgb17:VDD
rgb17:DOUT
rgb17:VSS
rgb17:DIN
rgb18:VDD
rgb18:DOUT
rgb18:VSS
rgb18:DIN
btn18:1.l
btn18:2.l
btn18:1.r
btn18:2.r
btn19:1.l
btn19:2.l
btn19:1.r
btn19:2.r
rgb19:VDD
rgb19:DOUT
rgb19:VSS
rgb19:DIN
rgb20:VDD
rgb20:DOUT
rgb20:VSS
rgb20:DIN
btn20:1.l
btn20:2.l
btn20:1.r
btn20:2.r
btn21:1.l
btn21:2.l
btn21:1.r
btn21:2.r
rgb21:VDD
rgb21:DOUT
rgb21:VSS
rgb21:DIN
rgb22:VDD
rgb22:DOUT
rgb22:VSS
rgb22:DIN
rgb23:VDD
rgb23:DOUT
rgb23:VSS
rgb23:DIN
rgb24:VDD
rgb24:DOUT
rgb24:VSS
rgb24:DIN
rgb25:VDD
rgb25:DOUT
rgb25:VSS
rgb25:DIN
rgb26:VDD
rgb26:DOUT
rgb26:VSS
rgb26:DIN
btn22:1.l
btn22:2.l
btn22:1.r
btn22:2.r
btn23:1.l
btn23:2.l
btn23:1.r
btn23:2.r
rgb27:VDD
rgb27:DOUT
rgb27:VSS
rgb27:DIN
rgb28:VDD
rgb28:DOUT
rgb28:VSS
rgb28:DIN
btn24:1.l
btn24:2.l
btn24:1.r
btn24:2.r
btn25:1.l
btn25:2.l
btn25:1.r
btn25:2.r
rgb29:VDD
rgb29:DOUT
rgb29:VSS
rgb29:DIN
rgb30:VDD
rgb30:DOUT
rgb30:VSS
rgb30:DIN
btn26:1.l
btn26:2.l
btn26:1.r
btn26:2.r
btn27:1.l
btn27:2.l
btn27:1.r
btn27:2.r
rgb31:VDD
rgb31:DOUT
rgb31:VSS
rgb31:DIN
rgb32:VDD
rgb32:DOUT
rgb32:VSS
rgb32:DIN
btn28:1.l
btn28:2.l
btn28:1.r
btn28:2.r
btn29:1.l
btn29:2.l
btn29:1.r
btn29:2.r
rgb33:VDD
rgb33:DOUT
rgb33:VSS
rgb33:DIN
rgb34:VDD
rgb34:DOUT
rgb34:VSS
rgb34:DIN
btn30:1.l
btn30:2.l
btn30:1.r
btn30:2.r
btn31:1.l
btn31:2.l
btn31:1.r
btn31:2.r
rgb35:VDD
rgb35:DOUT
rgb35:VSS
rgb35:DIN
rgb36:VDD
rgb36:DOUT
rgb36:VSS
rgb36:DIN
btn32:1.l
btn32:2.l
btn32:1.r
btn32:2.r
btn33:1.l
btn33:2.l
btn33:1.r
btn33:2.r
rgb37:VDD
rgb37:DOUT
rgb37:VSS
rgb37:DIN
rgb38:VDD
rgb38:DOUT
rgb38:VSS
rgb38:DIN
btn34:1.l
btn34:2.l
btn34:1.r
btn34:2.r
btn35:1.l
btn35:2.l
btn35:1.r
btn35:2.r
rgb39:VDD
rgb39:DOUT
rgb39:VSS
rgb39:DIN
rgb40:VDD
rgb40:DOUT
rgb40:VSS
rgb40:DIN
btn36:1.l
btn36:2.l
btn36:1.r
btn36:2.r
btn37:1.l
btn37:2.l
btn37:1.r
btn37:2.r
rgb41:VDD
rgb41:DOUT
rgb41:VSS
rgb41:DIN
rgb42:VDD
rgb42:DOUT
rgb42:VSS
rgb42:DIN
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn38:1.l
btn38:2.l
btn38:1.r
btn38:2.r
rgb43:VDD
rgb43:DOUT
rgb43:VSS
rgb43:DIN
rgb44:VDD
rgb44:DOUT
rgb44:VSS
rgb44:DIN
btn39:1.l
btn39:2.l
btn39:1.r
btn39:2.r
btn40:1.l
btn40:2.l
btn40:1.r
btn40:2.r
rgb45:VDD
rgb45:DOUT
rgb45:VSS
rgb45:DIN
rgb46:VDD
rgb46:DOUT
rgb46:VSS
rgb46:DIN
btn41:1.l
btn41:2.l
btn41:1.r
btn41:2.r
btn42:1.l
btn42:2.l
btn42:1.r
btn42:2.r
rgb47:VDD
rgb47:DOUT
rgb47:VSS
rgb47:DIN
rgb48:VDD
rgb48:DOUT
rgb48:VSS
rgb48:DIN
btn43:1.l
btn43:2.l
btn43:1.r
btn43:2.r
btn44:1.l
btn44:2.l
btn44:1.r
btn44:2.r
gnd1:GND
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
vcc1:VCC
led1:A
led1:C
gnd2:GND
btn45:1.l
btn45:2.l
btn45:1.r
btn45:2.r
vcc2:VCC
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
74HC165
sr3:PL
sr3:CP
sr3:D4
sr3:D5
sr3:D6
sr3:D7
sr3:Q7_N
sr3:GND
sr3:Q7
sr3:DS
sr3:D0
sr3:D1
sr3:D2
sr3:D3
sr3:CE
sr3:VCC
gnd4:GND
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
r13:1
r13:2
r14:1
r14:2
r15:1
r15:2
r16:1
r16:2
74HC165
sr4:PL
sr4:CP
sr4:D4
sr4:D5
sr4:D6
sr4:D7
sr4:Q7_N
sr4:GND
sr4:Q7
sr4:DS
sr4:D0
sr4:D1
sr4:D2
sr4:D3
sr4:CE
sr4:VCC
r17:1
r17:2
r18:1
r18:2
r19:1
r19:2
r20:1
r20:2
r21:1
r21:2
r22:1
r22:2
r23:1
r23:2
r24:1
r24:2
gnd7:GND
gnd3:GND
rgb11:VDD
rgb11:DOUT
rgb11:VSS
rgb11:DIN
D0D1D2D3D4D5D6D7GNDLOGIC
logic1:D0
logic1:D1
logic1:D2
logic1:D3
logic1:D4
logic1:D5
logic1:D6
logic1:D7
logic1:GND