From 69ab37fca1f891af6a0101766dc74642c5c2fa82 Mon Sep 17 00:00:00 2001 From: krusli Date: Sat, 16 Sep 2017 11:08:29 +1000 Subject: [PATCH] Got luizribeiro's ps2avrgb implementation working for Mechmini --- keyboards/mechmini/config.h | 5 + keyboards/mechmini/i2c.c | 104 ++++++++++++++++++++ keyboards/mechmini/i2c.h | 22 +++++ keyboards/mechmini/keymaps/default/keymap.c | 71 ++++++++++++- keyboards/mechmini/matrix.c | 2 + keyboards/mechmini/mechmini.c | 42 ++++++++ keyboards/mechmini/program | 0 keyboards/mechmini/rules.mk | 7 +- 8 files changed, 250 insertions(+), 3 deletions(-) create mode 100644 keyboards/mechmini/i2c.c create mode 100644 keyboards/mechmini/i2c.h mode change 100644 => 100755 keyboards/mechmini/program diff --git a/keyboards/mechmini/config.h b/keyboards/mechmini/config.h index ecd50ca29..96f4bb51e 100644 --- a/keyboards/mechmini/config.h +++ b/keyboards/mechmini/config.h @@ -14,6 +14,7 @@ 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 . */ +#include "config_common.h" #ifndef CONFIG_H #define CONFIG_H @@ -29,6 +30,10 @@ along with this program. If not, see . #define MATRIX_ROWS 8 #define MATRIX_COLS 15 +#define RGBLED_NUM 16 +#define RGBLIGHT_ANIMATIONS +#define RGB_DI_PIN E2 + #define NO_UART 1 #define BOOTLOADHID_BOOTLOADER 1 diff --git a/keyboards/mechmini/i2c.c b/keyboards/mechmini/i2c.c new file mode 100644 index 000000000..c27f3e3d1 --- /dev/null +++ b/keyboards/mechmini/i2c.c @@ -0,0 +1,104 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 2 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 . +*/ + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< +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 2 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 __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/mechmini/keymaps/default/keymap.c b/keyboards/mechmini/keymaps/default/keymap.c index 10f11c5f5..cf3d174f9 100644 --- a/keyboards/mechmini/keymaps/default/keymap.c +++ b/keyboards/mechmini/keymaps/default/keymap.c @@ -14,6 +14,10 @@ along with this program. If not, see . */ #include "mechmini.h" +#include "rgblight.h" +#include "action_layer.h" +#include "quantum.h" + #define _BL 0 #define _FN1 1 #define _FN2 2 @@ -30,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN1] = KEYMAP( _____, _____, KC_UP, KC_MUTE, KC_VOLD, KC_VOLU, KC_MRWD, KC_MPLY, KC_MFFD, KC_SLCK, KC_PAUS, KC_DEL, KC_CAPS, KC_LEFT, KC_DOWN, KC_RIGHT, _____, _____, _____, KC_INS, KC_HOME, KC_PGUP, KC_PSCR, - _____, _____, _____, _____, _____, _____, _____, KC_END, KC_PGDN, _____, _____, + _____, _____, M(0), M(1), M(2), _____, _____, KC_END, KC_PGDN, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____ ), [_FN2] = KEYMAP( @@ -57,5 +61,68 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) */ -const uint16_t PROGMEM fn_actions[] = { +uint8_t current_level = 8; +uint8_t prev_current_level = 8; +int is_on = 0; + +enum macro_id { + TOGGLE_RGB, + RGB_LEVEL_DOWN, + RGB_LEVEL_UP }; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + keyevent_t event = record->event; + + switch (id) { + case TOGGLE_RGB: + if (event.pressed) { + if (!is_on) { + is_on = 1; + } else { + is_on = 0; + } + } + case RGB_LEVEL_DOWN: + if (event.pressed && current_level > 0) { + current_level--; + prev_current_level--; + } + break; + case RGB_LEVEL_UP: + if (event.pressed && current_level < 15) { + current_level++; + prev_current_level++; + } + break; + } + + return MACRO_NONE; +} + +const uint16_t fn_actions[] PROGMEM = { + [0] = ACTION_MACRO(TOGGLE_RGB), + [1] = ACTION_MACRO(RGB_LEVEL_DOWN), + [2] = ACTION_MACRO(RGB_LEVEL_UP) +}; + +void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); + +uint8_t dim(uint8_t color, uint8_t opacity) { + return ((uint16_t) color * opacity / 0xFF) & 0xFF; +} + +void user_setrgb(uint8_t r, uint8_t g, uint8_t b) { + uint8_t alpha = current_level * 0x11; + rgblight_setrgb(dim(r, alpha), dim(g, alpha), dim(b, alpha)); +} + +void matrix_scan_user(void) { + if (is_on) { + current_level = prev_current_level; + user_setrgb(0xFF, 0xFF, 0xFF); + } else { + current_level = 0; + user_setrgb(0xFF, 0xFF, 0xFF); + } +} diff --git a/keyboards/mechmini/matrix.c b/keyboards/mechmini/matrix.c index beaa54c40..140026013 100644 --- a/keyboards/mechmini/matrix.c +++ b/keyboards/mechmini/matrix.c @@ -93,6 +93,8 @@ uint8_t matrix_scan(void) { } } + matrix_scan_user(); + return 1; } diff --git a/keyboards/mechmini/mechmini.c b/keyboards/mechmini/mechmini.c index e69de29bb..72b9d624f 100644 --- a/keyboards/mechmini/mechmini.c +++ b/keyboards/mechmini/mechmini.c @@ -0,0 +1,42 @@ +/* +Copyright 2017 Luiz Ribeiro +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 2 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 . +*/ + +#include "mechmini.h" +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +extern rgblight_config_t rgblight_config; + +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + } + } + + i2c_init(); + i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM); +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { + rgblight_task(); +} diff --git a/keyboards/mechmini/program b/keyboards/mechmini/program old mode 100644 new mode 100755 diff --git a/keyboards/mechmini/rules.mk b/keyboards/mechmini/rules.mk index 26dfe36d0..626af1d13 100644 --- a/keyboards/mechmini/rules.mk +++ b/keyboards/mechmini/rules.mk @@ -21,6 +21,8 @@ PROTOCOL = VUSB NO_UART = yes NO_SUSPEND_POWER_DOWN = yes BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = yes +DISABLE_WS2812 = yes # processor frequency F_CPU = 12000000 @@ -32,12 +34,15 @@ EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes +RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes + OPT_DEFS = -DDEBUG_LEVEL=0 OPT_DEFS += -DBOOTLOADER_SIZE=2048 # custom matrix setup CUSTOM_MATRIX = yes -SRC = matrix.c +SRC = matrix.c i2c.c # programming options PROGRAM_CMD = ./keyboards/mechmini/program $(TARGET).hex