~ruther/qmk_firmware

b3f55cb5b2a1490c2bbe3c6ab147c943223b3608 — Ryan 1 year, 4 months ago e5203f8
apa102: cleanups (#22826)

2 files changed, 46 insertions(+), 51 deletions(-)

M drivers/led/apa102.c
M drivers/led/apa102.h
M drivers/led/apa102.c => drivers/led/apa102.c +44 -50
@@ 55,55 55,25 @@

uint8_t apa102_led_brightness = APA102_DEFAULT_BRIGHTNESS;

void static apa102_start_frame(void);
void static apa102_end_frame(uint16_t num_leds);

void static apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, uint8_t brightness);
void static apa102_send_byte(uint8_t byte);

void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds) {
    rgb_led_t *end = start_led + num_leds;

    apa102_start_frame();
    for (rgb_led_t *led = start_led; led < end; led++) {
        apa102_send_frame(led->r, led->g, led->b, apa102_led_brightness);
    }
    apa102_end_frame(num_leds);
}

void static apa102_init(void) {
    setPinOutput(APA102_DI_PIN);
    setPinOutput(APA102_CI_PIN);

    writePinLow(APA102_DI_PIN);
    writePinLow(APA102_CI_PIN);
}

void apa102_set_brightness(uint8_t brightness) {
    if (brightness > APA102_MAX_BRIGHTNESS) {
        apa102_led_brightness = APA102_MAX_BRIGHTNESS;
    } else if (brightness < 0) {
        apa102_led_brightness = 0;
    } else {
        apa102_led_brightness = brightness;
    }
}

void static apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, uint8_t brightness) {
    apa102_send_byte(0b11100000 | brightness);
    apa102_send_byte(blue);
    apa102_send_byte(green);
    apa102_send_byte(red);
static void apa102_send_byte(uint8_t byte) {
    APA102_SEND_BIT(byte, 7);
    APA102_SEND_BIT(byte, 6);
    APA102_SEND_BIT(byte, 5);
    APA102_SEND_BIT(byte, 4);
    APA102_SEND_BIT(byte, 3);
    APA102_SEND_BIT(byte, 2);
    APA102_SEND_BIT(byte, 1);
    APA102_SEND_BIT(byte, 0);
}

void static apa102_start_frame(void) {
static void apa102_start_frame(void) {
    apa102_init();
    for (uint16_t i = 0; i < 4; i++) {
        apa102_send_byte(0);
    }
}

void static apa102_end_frame(uint16_t num_leds) {
static void apa102_end_frame(uint16_t num_leds) {
    // This function has been taken from: https://github.com/pololu/apa102-arduino/blob/master/APA102.h
    // and adapted. The code is MIT licensed. I think thats compatible?
    //


@@ 136,13 106,37 @@ void static apa102_end_frame(uint16_t num_leds) {
    apa102_init();
}

void static apa102_send_byte(uint8_t byte) {
    APA102_SEND_BIT(byte, 7);
    APA102_SEND_BIT(byte, 6);
    APA102_SEND_BIT(byte, 5);
    APA102_SEND_BIT(byte, 4);
    APA102_SEND_BIT(byte, 3);
    APA102_SEND_BIT(byte, 2);
    APA102_SEND_BIT(byte, 1);
    APA102_SEND_BIT(byte, 0);
static void apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, uint8_t brightness) {
    apa102_send_byte(0b11100000 | brightness);
    apa102_send_byte(blue);
    apa102_send_byte(green);
    apa102_send_byte(red);
}

void apa102_init(void) {
    setPinOutput(APA102_DI_PIN);
    setPinOutput(APA102_CI_PIN);

    writePinLow(APA102_DI_PIN);
    writePinLow(APA102_CI_PIN);
}

void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds) {
    rgb_led_t *end = start_led + num_leds;

    apa102_start_frame();
    for (rgb_led_t *led = start_led; led < end; led++) {
        apa102_send_frame(led->r, led->g, led->b, apa102_led_brightness);
    }
    apa102_end_frame(num_leds);
}

void apa102_set_brightness(uint8_t brightness) {
    if (brightness > APA102_MAX_BRIGHTNESS) {
        apa102_led_brightness = APA102_MAX_BRIGHTNESS;
    } else if (brightness < 0) {
        apa102_led_brightness = 0;
    } else {
        apa102_led_brightness = brightness;
    }
}

M drivers/led/apa102.h => drivers/led/apa102.h +2 -1
@@ 31,7 31,7 @@

#define APA102_MAX_BRIGHTNESS 31

extern uint8_t apa102_led_brightness;
void apa102_init(void);

/* User Interface
 *


@@ 44,4 44,5 @@ extern uint8_t apa102_led_brightness;
 *         - Send out the LED data
 */
void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds);

void apa102_set_brightness(uint8_t brightness);

Do not follow this link