/**
* @file WS2812_ATY.c
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2026 MZ-ATY
* - This code follows:
* - MZ-ATY Various Contents Joint Statement -
*
* https://mengze.top/MZ-ATY_VCJS
* - CC 4.0 BY-NC-SA -
*
* https://creativecommons.org/licenses/by-nc-sa/4.0/
* - Your use will be deemed to have accepted the terms of this statement.
*
* @brief functions of WS2812 for C platform (Dev-style)
*
* @version
* - 1_01_251112 > ATY
* -# Refactor to Dev-style; remove legacy global interfaces
********************************************************************************
*/
#ifndef __WS2812_ATY_C
#define __WS2812_ATY_C
#include "WS2812_ATY.h"
static void _ws2812_send_byte(struct WS2812_ATY_Dev* dev, uint8_t byte)
{
for (int i = 7; i >= 0; --i) {
uint8_t bit = (byte >> i) & 0x01;
dev->sendBit(bit);
}
}
uint8_t WS2812_InitDev(struct WS2812_ATY_Dev* dev)
{
if (!dev || !dev->sendBit) return 1;
if (dev->debugEnable == 1 && dev->LOG) dev->LOG("\r\nWS2812 init done.");
return 0;
}
void WS2812_SendColorDev(struct WS2812_ATY_Dev* dev, uint8_t R, uint8_t G, uint8_t B)
{
__ATY_LOCK(dev);
_ws2812_send_byte(dev, G);
_ws2812_send_byte(dev, R);
_ws2812_send_byte(dev, B);
if (dev->reset_us) dev->reset_us(60);
if (dev->debugEnable == 1 && dev->LOG) dev->LOG("\r\nWS2812 send color.");
__ATY_UNLOCK(dev);
}
void WS2812_SendBufferDev(struct WS2812_ATY_Dev* dev, const uint8_t* rgb, uint16_t count)
{
__ATY_LOCK(dev);
if (!dev || !dev->sendBit || !rgb) { __ATY_UNLOCK(dev); return; }
for (uint16_t i = 0; i < count; ++i) {
uint8_t R = rgb[i*3 + 0];
uint8_t G = rgb[i*3 + 1];
uint8_t B = rgb[i*3 + 2];
_ws2812_send_byte(dev, G);
_ws2812_send_byte(dev, R);
_ws2812_send_byte(dev, B);
}
if (dev->reset_us) dev->reset_us(60);
if (dev->debugEnable == 1 && dev->LOG) dev->LOG("\r\nWS2812 send buffer.");
__ATY_UNLOCK(dev);
}
#endif /* __WS2812_ATY_C */
/******************************** End Of File *********************************/