Got luizribeiro's ps2avrgb implementation working for Mechmini
authorkrusli <rusli.kenneth@gmail.com>
Sat, 16 Sep 2017 01:08:29 +0000 (11:08 +1000)
committerJack Humbert <jack.humb@gmail.com>
Sat, 16 Sep 2017 13:34:29 +0000 (09:34 -0400)
keyboards/mechmini/config.h
keyboards/mechmini/i2c.c [new file with mode: 0644]
keyboards/mechmini/i2c.h [new file with mode: 0644]
keyboards/mechmini/keymaps/default/keymap.c
keyboards/mechmini/matrix.c
keyboards/mechmini/mechmini.c
keyboards/mechmini/program [changed mode: 0644->0755]
keyboards/mechmini/rules.mk

index ecd50ca29647986f5ee0dfd0fdc661e1c15dd651..96f4bb51e4365dc70cfd277d44288aff55c8db93 100644 (file)
@@ -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 (file)
index 0000000..c27f3e3
--- /dev/null
@@ -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 (file)
index 0000000..194a82c
--- /dev/null
@@ -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
index 10f11c5f55d08d0e54093da1eabf8963b46098ff..cf3d174f9ce4d99dcfde43508204780e5ffe621c 100644 (file)
@@ -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);
+  }
+}
index beaa54c400af53d020d382b665a0ddaa8d9a5678..140026013f021509ede9245feea98f796ff860b1 100644 (file)
@@ -93,6 +93,8 @@ uint8_t matrix_scan(void) {
         }
     }
 
+    matrix_scan_user();
+
     return 1;
 }
 
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..72b9d624fbeb834c226bc6bada877ac3d71ddf23 100644 (file)
@@ -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();
+}
old mode 100644 (file)
new mode 100755 (executable)
index 26dfe36d0a40e7344650a4ce61e2211700d3dce4..626af1d131f6f4eb1441382b3d736401f69d2844 100644 (file)
@@ -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