summaryrefslogtreecommitdiff
path: root/keyboards/matrix/noah/ws2812_f4.h
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/matrix/noah/ws2812_f4.h')
-rw-r--r--keyboards/matrix/noah/ws2812_f4.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/keyboards/matrix/noah/ws2812_f4.h b/keyboards/matrix/noah/ws2812_f4.h
new file mode 100644
index 0000000000..245bd15fef
--- /dev/null
+++ b/keyboards/matrix/noah/ws2812_f4.h
@@ -0,0 +1,102 @@
+/**
+ * @file ws2812.h
+ * @author Austin Glaser <austin.glaser@gmail.com>
+ * @brief Interface to WS2812 LED driver
+ *
+ * Copyright (C) 2016 Austin Glaser
+ *
+ * This software may be modified and distributed under the terms
+ * of the MIT license. See the LICENSE file for details.
+ *
+ * @todo Put in names and descriptions of variables which need to be defined to use this file
+ */
+
+#ifndef WS2812_H_
+#define WS2812_H_
+
+/**
+ * @defgroup WS2812 WS2812 Driver
+ * @{
+ *
+ * @brief DMA-based WS2812 LED driver
+ *
+ * A driver for WS2812 LEDs
+ */
+
+/* --- PUBLIC DEPENDENCIES -------------------------------------------------- */
+
+// Standard
+#include <stdint.h>
+#include "color.h"
+
+/* --- PUBLIC MACROS -------------------------------------------------------- */
+
+/**
+ * @brief Concatenates two symbols s1 and s2 exactly, without expanding either
+ *
+ * @param[in] s1: The first symbol to concatenate
+ * @param[in] s2: The second symbol to concatenate
+ *
+ * @return A single symbol containing s1 and s2 concatenated without expansion
+ */
+#define CONCAT_SYMBOLS(s1, s2) s1##s2
+
+/**
+ * @brief Concatenate the symbols s1 and s2, expanding both of them
+ *
+ * This is important because simply applying s1##s2 doesn't expand them if they're
+ * preprocessor tokens themselves
+ *
+ * @param[in] s1: The first symbol to concatenate
+ * @param[in] s2: The second symbol to concatenate
+ *
+ * @return A single symbol containing s1 expanded followed by s2 expanded
+ */
+#define CONCAT_EXPANDED_SYMBOLS(s1, s2) CONCAT_SYMBOLS(s1, s2)
+
+/* --- PUBLIC CONSTANTS ----------------------------------------------------- */
+
+/**
+ * @brief Return codes from ws2812 interface functions
+ */
+typedef enum {
+ WS2812_SUCCESS = 0x00, /**< Operation completeed successfully */
+ WS2812_LED_INVALID, /**< Attempted to index an invalid LED (@ref WS2812_N_LEDS) */
+ MAX_WS2812_ERR, /**< Total number of possible error codes */
+ WS2812_ERR_INVALID /**< Invalid error value */
+} ws2812_err_t;
+
+/* --- PUBLIC FUNCTIONS ----------------------------------------------------- */
+
+/**
+ * @brief Initialize the driver
+ *
+ * After this function is called, all necessary background tasks will be started.
+ * The frame is initially dark.
+ */
+void ws2812_init(void);
+
+/**
+ * @brief Write the value of a single LED in the chain
+ *
+ * The color value is written to a frame buffer, and will not
+ * be updated until the next frame is written. Frames are written
+ * at the maximum possible speed -- the longest latency between a
+ * call to this function and the value being displayed is
+ * 1.25uS*(24*@ref WS2812_LED_N + 50)
+ *
+ * @param[in] led_number: The index of the LED to be written. Must be strictly less than
+ * @ref WS2812_N_LEDS
+ * @param[in] r: The red level of the LED
+ * @param[in] g: The green level of the LED
+ * @param[in] b: The blue level of the LED
+ *
+ * @retval WS2812_SUCCESS: The write was successful
+ * @retval WS2812_LED_INVALID: The write was to an invalid LED index
+ */
+ws2812_err_t ws2812_write_led(uint32_t led_number, uint8_t r, uint8_t g, uint8_t b);
+
+void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
+/** @} defgroup WS2812 */
+
+#endif // ifndef WS2812_H_