diff options
-rw-r--r-- | keyboards/mechmini/config.h | 5 | ||||
-rw-r--r-- | keyboards/mechmini/i2c.c | 104 | ||||
-rw-r--r-- | keyboards/mechmini/i2c.h | 22 | ||||
-rw-r--r-- | keyboards/mechmini/keymaps/default/keymap.c | 71 | ||||
-rw-r--r-- | keyboards/mechmini/matrix.c | 2 | ||||
-rw-r--r-- | keyboards/mechmini/mechmini.c | 42 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/mechmini/program | 0 | ||||
-rw-r--r-- | keyboards/mechmini/rules.mk | 7 |
8 files changed, 250 insertions, 3 deletions
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 <http://www.gnu.org/licenses/>. */ +#include "config_common.h" #ifndef CONFIG_H #define CONFIG_H @@ -29,6 +30,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #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 <luizribeiro@gmail.com> + +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 <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include <util/twi.h> + +#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<<TWINT) | (1<<TWSTA) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the start condition was successfully transmitted + if ((TWSR & 0xF8) != TW_START) { + return 1; + } + + // transmit address and wait + TWDR = address; + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the device has acknowledged the READ / WRITE mode + uint8_t twst = TW_STATUS & 0xF8; + if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) { + return 1; + } + + return 0; +} + +void i2c_stop(void) { + TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); +} + +uint8_t i2c_write(uint8_t data) { + TWDR = data; + + // transmit data and wait + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + if ((TWSR & 0xF8) != TW_MT_DATA_ACK) { + return 1; + } + + return 0; +} + +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) { + if (i2c_start(address)) { + return 1; + } + + for (uint16_t i = 0; i < length; i++) { + if (i2c_write(data[i])) { + return 1; + } + } + + i2c_stop(); + + return 0; +} diff --git a/keyboards/mechmini/i2c.h b/keyboards/mechmini/i2c.h new file mode 100644 index 000000000..194a82cab --- /dev/null +++ b/keyboards/mechmini/i2c.h @@ -0,0 +1,22 @@ +/* +Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com> +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 <http://www.gnu.org/licenses/>. +*/ + +#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 <http://www.gnu.org/licenses/>. */ #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 <luizribeiro@gmail.com> +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 <http://www.gnu.org/licenses/>. +*/ + +#include "mechmini.h" +#include "rgblight.h" + +#include <avr/pgmspace.h> + +#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 index a88d9cd9b..a88d9cd9b 100644..100755 --- a/keyboards/mechmini/program +++ b/keyboards/mechmini/program 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 |