1 /*
2  * Copyright (c) 2017 Linaro Limited
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <errno.h>
8 #include <string.h>
9 
10 #define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
11 #include <zephyr/logging/log.h>
12 LOG_MODULE_REGISTER(main);
13 
14 #include <zephyr/kernel.h>
15 #include <zephyr/drivers/led_strip.h>
16 #include <zephyr/device.h>
17 #include <zephyr/drivers/spi.h>
18 #include <zephyr/sys/util.h>
19 
20 /*
21  * Number of RGB LEDs in the LED strip, adjust as needed.
22  */
23 #define STRIP_NUM_LEDS 32
24 
25 #define DELAY_TIME K_MSEC(40)
26 
27 static const struct led_rgb colors[] = {
28 	{ .r = 0xff, .g = 0x00, .b = 0x00, }, /* red */
29 	{ .r = 0x00, .g = 0xff, .b = 0x00, }, /* green */
30 	{ .r = 0x00, .g = 0x00, .b = 0xff, }, /* blue */
31 };
32 
33 static const struct led_rgb black = {
34 	.r = 0x00,
35 	.g = 0x00,
36 	.b = 0x00,
37 };
38 
39 struct led_rgb strip_colors[STRIP_NUM_LEDS];
40 
41 static const struct device *const strip = DEVICE_DT_GET_ANY(greeled_lpd8806);
42 
color_at(size_t time,size_t i)43 const struct led_rgb *color_at(size_t time, size_t i)
44 {
45 	size_t rgb_start = time % STRIP_NUM_LEDS;
46 
47 	if (rgb_start <= i && i < rgb_start + ARRAY_SIZE(colors)) {
48 		return &colors[i - rgb_start];
49 	} else {
50 		return &black;
51 	}
52 }
53 
main(void)54 int main(void)
55 {
56 	size_t i, time;
57 
58 	if (!strip) {
59 		LOG_ERR("LED strip device not found");
60 		return 0;
61 	} else if (!device_is_ready(strip)) {
62 		LOG_INF("LED strip device %s is not ready", strip->name);
63 		return 0;
64 	}
65 	LOG_INF("Found LED strip device %s", strip->name);
66 
67 	/*
68 	 * Display a pattern that "walks" the three primary colors
69 	 * down the strip until it reaches the end, then starts at the
70 	 * beginning.
71 	 */
72 	LOG_INF("Displaying pattern on strip");
73 	time = 0;
74 	while (1) {
75 		for (i = 0; i < STRIP_NUM_LEDS; i++) {
76 			memcpy(&strip_colors[i], color_at(time, i),
77 			       sizeof(strip_colors[i]));
78 		}
79 		led_strip_update_rgb(strip, strip_colors, STRIP_NUM_LEDS);
80 		k_sleep(DELAY_TIME);
81 		time++;
82 	}
83 	return 0;
84 }
85