mostly working

master
Jack Humbert 2016-11-13 23:02:38 -05:00
parent 33e62c080c
commit e9f7487518
10 changed files with 125 additions and 72 deletions

View File

@ -16,10 +16,10 @@ void matrix_init_kb(void) {
// unused pins - C7, D4, D5, D7, E6 // unused pins - C7, D4, D5, D7, E6
// set as input with internal pull-ip enabled // set as input with internal pull-ip enabled
DDRC &= ~(1<<7); DDRC &= ~(1<<7);
DDRD &= ~(1<<7 | 1<<5 | 1<<4); DDRD &= ~(1<<5 | 1<<4);
DDRE &= ~(1<<6); DDRE &= ~(1<<6);
PORTC |= (1<<7); PORTC |= (1<<7);
PORTD |= (1<<7 | 1<<5 | 1<<4); PORTD |= (1<<5 | 1<<4);
PORTE |= (1<<6); PORTE |= (1<<6);
ergodox_blink_all_leds(); ergodox_blink_all_leds();
@ -51,6 +51,10 @@ uint8_t init_mcp23018(void) {
mcp23018_status = 0x20; mcp23018_status = 0x20;
// I2C subsystem // I2C subsystem
uint8_t sreg_prev;
sreg_prev=SREG;
cli();
if (i2c_initialized == 0) { if (i2c_initialized == 0) {
i2c_init(); // on pins D(1,0) i2c_init(); // on pins D(1,0)
i2c_initialized++; i2c_initialized++;
@ -79,6 +83,8 @@ uint8_t init_mcp23018(void) {
out: out:
i2c_stop(); i2c_stop();
SREG=sreg_prev;
return mcp23018_status; return mcp23018_status;
} }

View File

@ -121,7 +121,7 @@ void matrix_init(void)
matrix_scan_count = 0; matrix_scan_count = 0;
#endif #endif
matrix_init_kb(); matrix_init_quantum();
} }

View File

@ -1,4 +1,5 @@
RGBLIGHT_ENABLE = yes RGBLIGHT_ENABLE = yes
MIDI_ENABLE = yes
ifndef QUANTUM_DIR ifndef QUANTUM_DIR
include ../../../../Makefile include ../../../../Makefile

View File

@ -5,10 +5,12 @@
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define RGB_DI_PIN D7 #define RGB_DI_PIN D7
// #define RGBLIGHT_TIMER #define RGBLIGHT_TIMER
#define RGBLED_NUM 15 // Number of LEDs #define RGBLED_NUM 15 // Number of LEDs
#define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_HUE_STEP 12
#define RGBLIGHT_SAT_STEP 255 #define RGBLIGHT_SAT_STEP 255
#define RGBLIGHT_VAL_STEP 12 #define RGBLIGHT_VAL_STEP 12
#define RGB_MIDI
#endif #endif

View File

@ -133,13 +133,13 @@ unsigned char I2C_Write(unsigned char c)
#endif #endif
// Setleds for standard RGB // Setleds for standard RGB
void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds) void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds)
{ {
// ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF)); ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF));
} }
void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask) void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask)
{ {
// ws2812_DDRREG |= pinmask; // Enable DDR // ws2812_DDRREG |= pinmask; // Enable DDR
// new universal format (DDR) // new universal format (DDR)
@ -150,12 +150,15 @@ void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pin
} }
// Setleds for SK6812RGBW // Setleds for SK6812RGBW
void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds) void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds)
{ {
#ifdef RGBW_BB_TWI #ifdef RGBW_BB_TWI
uint8_t sreg_prev, twcr_prev;
sreg_prev=SREG;
twcr_prev=TWCR;
cli(); cli();
TWCR = 0; TWCR &= ~(1<<TWEN);
I2C_Init(); I2C_Init();
I2C_Start(); I2C_Start();
I2C_Write(0x84); I2C_Write(0x84);
@ -167,9 +170,9 @@ void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
I2C_Write(curbyte); I2C_Write(curbyte);
} }
I2C_Stop(); I2C_Stop();
sei(); SREG=sreg_prev;
#else // TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
_delay_us(80); TWCR=twcr_prev;
#endif #endif
@ -180,7 +183,9 @@ void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF)); ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF));
#ifndef RGBW_BB_TWI
_delay_us(80);
#endif
} }
void ws2812_sendarray(uint8_t *data,uint16_t datlen) void ws2812_sendarray(uint8_t *data,uint16_t datlen)

View File

@ -23,6 +23,14 @@
#define LIGHT_I2C_ADDR_WRITE ( (LIGHT_I2C_ADDR<<1) | I2C_WRITE ) #define LIGHT_I2C_ADDR_WRITE ( (LIGHT_I2C_ADDR<<1) | I2C_WRITE )
#define LIGHT_I2C_ADDR_READ ( (LIGHT_I2C_ADDR<<1) | I2C_READ ) #define LIGHT_I2C_ADDR_READ ( (LIGHT_I2C_ADDR<<1) | I2C_READ )
#define RGBW 1
#ifdef RGBW
#define LED_TYPE struct cRGBW
#else
#define LED_TYPE struct cRGB
#endif
/* /*
* Structure of the LED array * Structure of the LED array
@ -49,9 +57,9 @@ struct cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;};
* - Wait 50<EFBFBD>s to reset the LEDs * - Wait 50<EFBFBD>s to reset the LEDs
*/ */
void ws2812_setleds (struct cRGB *ledarray, uint16_t number_of_leds); void ws2812_setleds (LED_TYPE *ledarray, uint16_t number_of_leds);
void ws2812_setleds_pin (struct cRGB *ledarray, uint16_t number_of_leds,uint8_t pinmask); void ws2812_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask);
void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t number_of_leds); void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
/* /*
* Old interface / Internal functions * Old interface / Internal functions

View File

@ -131,6 +131,7 @@ bool process_record_quantum(keyrecord_t *record) {
#endif #endif
#ifdef PRINTING_ENABLE #ifdef PRINTING_ENABLE
process_printer(keycode, record) && process_printer(keycode, record) &&
#endif
#ifdef UNICODEMAP_ENABLE #ifdef UNICODEMAP_ENABLE
process_unicode_map(keycode, record) && process_unicode_map(keycode, record) &&
#endif #endif

View File

@ -69,15 +69,12 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20};
rgblight_config_t rgblight_config; rgblight_config_t rgblight_config;
rgblight_config_t inmem_config; rgblight_config_t inmem_config;
#ifdef RGBW
struct cRGBW led[RGBLED_NUM]; LED_TYPE led[RGBLED_NUM];
#else
struct cRGB led[RGBLED_NUM];
#endif
uint8_t rgblight_inited = 0; uint8_t rgblight_inited = 0;
bool rgblight_timer_enabled = false;
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) {
uint8_t r = 0, g = 0, b = 0, base, color; uint8_t r = 0, g = 0, b = 0, base, color;
if (sat == 0) { // Acromatic color (gray). Hue doesn't mind. if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
@ -128,7 +125,7 @@ void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) {
setrgb(r, g, b, led1); setrgb(r, g, b, led1);
} }
void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) { void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) {
(*led1).r = r; (*led1).r = r;
(*led1).g = g; (*led1).g = g;
(*led1).b = b; (*led1).b = b;
@ -145,9 +142,9 @@ void eeconfig_update_rgblight_default(void) {
dprintf("eeconfig_update_rgblight_default\n"); dprintf("eeconfig_update_rgblight_default\n");
rgblight_config.enable = 1; rgblight_config.enable = 1;
rgblight_config.mode = 1; rgblight_config.mode = 1;
rgblight_config.hue = 200; rgblight_config.hue = 0;
rgblight_config.sat = 204; rgblight_config.sat = 255;
rgblight_config.val = 204; rgblight_config.val = 255;
eeconfig_update_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
} }
void eeconfig_debug_rgblight(void) { void eeconfig_debug_rgblight(void) {
@ -311,7 +308,7 @@ void rgblight_decrease_val(void) {
void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) {
inmem_config.raw = rgblight_config.raw; inmem_config.raw = rgblight_config.raw;
if (rgblight_config.enable) { if (rgblight_config.enable) {
struct cRGB tmp_led; LED_TYPE tmp_led;
sethsv(hue, sat, val, &tmp_led); sethsv(hue, sat, val, &tmp_led);
inmem_config.hue = hue; inmem_config.hue = hue;
inmem_config.sat = sat; inmem_config.sat = sat;
@ -378,51 +375,55 @@ void rgblight_set(void) {
// Animation timer -- AVR Timer3 // Animation timer -- AVR Timer3
void rgblight_timer_init(void) { void rgblight_timer_init(void) {
static uint8_t rgblight_timer_is_init = 0; // static uint8_t rgblight_timer_is_init = 0;
if (rgblight_timer_is_init) { // if (rgblight_timer_is_init) {
return; // return;
} // }
rgblight_timer_is_init = 1; // rgblight_timer_is_init = 1;
/* Timer 3 setup */ // /* Timer 3 setup */
TCCR3B = _BV(WGM32) //CTC mode OCR3A as TOP // TCCR3B = _BV(WGM32) // CTC mode OCR3A as TOP
| _BV(CS30); //Clock selelct: clk/1 // | _BV(CS30); // Clock selelct: clk/1
/* Set TOP value */ // /* Set TOP value */
uint8_t sreg = SREG; // uint8_t sreg = SREG;
cli(); // cli();
OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff; // OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff;
OCR3AL = RGBLED_TIMER_TOP & 0xff; // OCR3AL = RGBLED_TIMER_TOP & 0xff;
SREG = sreg; // SREG = sreg;
rgblight_timer_enabled = true;
} }
void rgblight_timer_enable(void) { void rgblight_timer_enable(void) {
TIMSK3 |= _BV(OCIE3A); rgblight_timer_enabled = true;
dprintf("TIMER3 enabled.\n"); dprintf("TIMER3 enabled.\n");
} }
void rgblight_timer_disable(void) { void rgblight_timer_disable(void) {
TIMSK3 &= ~_BV(OCIE3A); rgblight_timer_enabled = false;
dprintf("TIMER3 disabled.\n"); dprintf("TIMER3 disabled.\n");
} }
void rgblight_timer_toggle(void) { void rgblight_timer_toggle(void) {
TIMSK3 ^= _BV(OCIE3A); rgblight_timer_enabled ^= rgblight_timer_enabled;
dprintf("TIMER3 toggled.\n"); dprintf("TIMER3 toggled.\n");
} }
ISR(TIMER3_COMPA_vect) { void rgblight_task(void) {
// mode = 1, static light, do nothing here if (rgblight_timer_enabled) {
if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { // mode = 1, static light, do nothing here
// mode = 2 to 5, breathing mode if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) {
rgblight_effect_breathing(rgblight_config.mode - 2); // mode = 2 to 5, breathing mode
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { rgblight_effect_breathing(rgblight_config.mode - 2);
// mode = 6 to 8, rainbow mood mod } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) {
rgblight_effect_rainbow_mood(rgblight_config.mode - 6); // mode = 6 to 8, rainbow mood mod
} else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { rgblight_effect_rainbow_mood(rgblight_config.mode - 6);
// mode = 9 to 14, rainbow swirl mode } else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) {
rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); // mode = 9 to 14, rainbow swirl mode
} else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { rgblight_effect_rainbow_swirl(rgblight_config.mode - 9);
// mode = 15 to 20, snake mode } else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) {
rgblight_effect_snake(rgblight_config.mode - 15); // mode = 15 to 20, snake mode
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { rgblight_effect_snake(rgblight_config.mode - 15);
// mode = 21 to 23, knight mode } else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) {
rgblight_effect_knight(rgblight_config.mode - 21); // mode = 21 to 23, knight mode
rgblight_effect_knight(rgblight_config.mode - 21);
}
} }
} }
@ -461,7 +462,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) {
last_timer = timer_read(); last_timer = timer_read();
for (i = 0; i < RGBLED_NUM; i++) { for (i = 0; i < RGBLED_NUM; i++) {
hue = (360 / RGBLED_NUM * i + current_hue) % 360; hue = (360 / RGBLED_NUM * i + current_hue) % 360;
sethsv(hue, rgblight_config.sat, rgblight_config.val, &led[i]); sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
} }
rgblight_set(); rgblight_set();
@ -498,7 +499,7 @@ void rgblight_effect_snake(uint8_t interval) {
k = k + RGBLED_NUM; k = k + RGBLED_NUM;
} }
if (i == k) { if (i == k) {
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), &led[i]); sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), (LED_TYPE *)&led[i]);
} }
} }
} }
@ -518,7 +519,7 @@ void rgblight_effect_knight(uint8_t interval) {
static uint16_t last_timer = 0; static uint16_t last_timer = 0;
uint8_t i, j, cur; uint8_t i, j, cur;
int8_t k; int8_t k;
struct cRGB preled[RGBLED_NUM]; LED_TYPE preled[RGBLED_NUM];
static int8_t increment = -1; static int8_t increment = -1;
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) { if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) {
return; return;
@ -537,7 +538,7 @@ void rgblight_effect_knight(uint8_t interval) {
k = RGBLED_NUM - 1; k = RGBLED_NUM - 1;
} }
if (i == k) { if (i == k) {
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, &preled[i]); sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&preled[i]);
} }
} }
} }

View File

@ -1,8 +1,6 @@
#ifndef RGBLIGHT_H #ifndef RGBLIGHT_H
#define RGBLIGHT_H #define RGBLIGHT_H
#define RGBW 1
#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
#define RGBLIGHT_MODES 23 #define RGBLIGHT_MODES 23
#else #else
@ -35,6 +33,7 @@
#endif #endif
#define RGBLED_TIMER_TOP F_CPU/(256*64) #define RGBLED_TIMER_TOP F_CPU/(256*64)
// #define RGBLED_TIMER_TOP 0xFF10
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@ -79,10 +78,13 @@ void eeconfig_update_rgblight(uint32_t val);
void eeconfig_update_rgblight_default(void); void eeconfig_update_rgblight_default(void);
void eeconfig_debug_rgblight(void); void eeconfig_debug_rgblight(void);
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1); void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);
void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1); void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1);
void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val);
void rgblight_task(void);
void rgblight_timer_init(void); void rgblight_timer_init(void);
void rgblight_timer_enable(void); void rgblight_timer_enable(void);
void rgblight_timer_disable(void); void rgblight_timer_disable(void);

View File

@ -71,6 +71,10 @@
#include "virtser.h" #include "virtser.h"
#endif #endif
#ifdef RGB_MIDI
#include "rgblight.h"
#endif
uint8_t keyboard_idle = 0; uint8_t keyboard_idle = 0;
/* 0: Boot Protocol, 1: Report Protocol(default) */ /* 0: Boot Protocol, 1: Report Protocol(default) */
uint8_t keyboard_protocol = 1; uint8_t keyboard_protocol = 1;
@ -1045,6 +1049,10 @@ int main(void)
#endif #endif
keyboard_task(); keyboard_task();
#ifdef RGBLIGHT_ENABLE
rgblight_task();
#endif
#ifdef VIRTSER_ENABLE #ifdef VIRTSER_ENABLE
virtser_task(); virtser_task();
CDC_Device_USBTask(&cdc_device); CDC_Device_USBTask(&cdc_device);
@ -1077,15 +1085,34 @@ void fallthrough_callback(MidiDevice * device,
#endif #endif
} }
#ifdef RGB_MIDI
rgblight_config_t rgblight_config;
#endif
void cc_callback(MidiDevice * device, void cc_callback(MidiDevice * device,
uint8_t chan, uint8_t num, uint8_t val) { uint8_t chan, uint8_t num, uint8_t val) {
//sending it back on the next channel //sending it back on the next channel
midi_send_cc(device, (chan + 1) % 16, num, val); // midi_send_cc(device, (chan + 1) % 16, num, val);
#ifdef RGB_MIDI
rgblight_config.raw = eeconfig_read_rgblight();
switch (num) {
case 14:
rgblight_config.hue = val * 360 / 127;
break;
case 15:
rgblight_config.sat = val << 1;
break;
case 16:
rgblight_config.val = val << 1;
break;
}
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
#endif
} }
void sysex_callback(MidiDevice * device, void sysex_callback(MidiDevice * device,
uint16_t start, uint8_t length, uint8_t * data) { uint16_t start, uint8_t length, uint8_t * data) {
for (int i = 0; i < length; i++) // for (int i = 0; i < length; i++)
midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i)); // midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i));
} }
#endif #endif