/* MY9291 LED Driver Arduino library 0.1.0 Copyright (c) 2016 - 2026 MaiKe Labs Copyright (C) 2017 - Xose PĂ©rez This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _my9291_h #define _my9291_h #include typedef enum my9291_cmd_one_shot_t { MY9291_CMD_ONE_SHOT_DISABLE = 0X00, MY9291_CMD_ONE_SHOT_ENFORCE = 0X01, } my9291_cmd_one_shot_t; typedef enum my9291_cmd_reaction_t { MY9291_CMD_REACTION_FAST = 0X00, MY9291_CMD_REACTION_SLOW = 0X01, } my9291_cmd_reaction_t; typedef enum my9291_cmd_bit_width_t { MY9291_CMD_BIT_WIDTH_16 = 0X00, MY9291_CMD_BIT_WIDTH_14 = 0X01, MY9291_CMD_BIT_WIDTH_12 = 0X02, MY9291_CMD_BIT_WIDTH_8 = 0X03, } my9291_cmd_bit_width_t; typedef enum my9291_cmd_frequency_t { MY9291_CMD_FREQUENCY_DIVIDE_1 = 0X00, MY9291_CMD_FREQUENCY_DIVIDE_4 = 0X01, MY9291_CMD_FREQUENCY_DIVIDE_16 = 0X02, MY9291_CMD_FREQUENCY_DIVIDE_64 = 0X03, } my9291_cmd_frequency_t; typedef enum my9291_cmd_scatter_t { MY9291_CMD_SCATTER_APDM = 0X00, MY9291_CMD_SCATTER_PWM = 0X01, } my9291_cmd_scatter_t; typedef struct { my9291_cmd_scatter_t scatter:1; my9291_cmd_frequency_t frequency:2; my9291_cmd_bit_width_t bit_width:2; my9291_cmd_reaction_t reaction:1; my9291_cmd_one_shot_t one_shot:1; unsigned char resv:1; } __attribute__ ((aligned(1), packed)) my9291_cmd_t; #define MY9291_COMMAND_DEFAULT { \ .scatter = MY9291_CMD_SCATTER_APDM, \ .frequency = MY9291_CMD_FREQUENCY_DIVIDE_1, \ .bit_width = MY9291_CMD_BIT_WIDTH_8, \ .reaction = MY9291_CMD_REACTION_FAST, \ .one_shot = MY9291_CMD_ONE_SHOT_DISABLE, \ .resv = 0 \ } class my9291 { public: my9291(unsigned char di, unsigned char dcki, my9291_cmd_t command); void send(unsigned int duty_r, unsigned int duty_g, unsigned int duty_b, unsigned int duty_w); private: void _di_pulse(unsigned int times); void _dcki_pulse(unsigned int times); void _set_cmd(my9291_cmd_t command); my9291_cmd_t _command; unsigned char _pin_di; unsigned char _pin_dcki; }; #endif