diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_music.c | 16 | ||||
| -rw-r--r-- | quantum/process_keycode/process_printer.c | 254 | ||||
| -rw-r--r-- | quantum/process_keycode/process_printer.h | 8 | ||||
| -rw-r--r-- | quantum/process_keycode/process_printer_bb.c | 260 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode.c | 41 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode.h | 1 | 
6 files changed, 569 insertions, 11 deletions
| diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 2d52e47a72..1e2648bff5 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -1,8 +1,8 @@  #include "process_music.h"  bool music_activated = false; -uint8_t starting_note = 0x0C; -int offset = 7; +uint8_t music_starting_note = 0x0C; +int music_offset = 7;  // music sequencer  static bool music_sequence_recording = false; @@ -114,8 +114,18 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {              music_sequence_interval+=10;          return false;        } +      #define MUSIC_MODE_GUITAR + +      #ifdef MUSIC_MODE_CHROMATIC +      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row)); +      #elif defined(MUSIC_MODE_GUITAR) +      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 7)*5.0/12); +      #elif defined(MUSIC_MODE_VIOLIN) +      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 5)*7.0/12); +      #else +      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + SCALE[record->event.key.col + music_offset])/12.0+(MATRIX_ROWS - record->event.key.row)); +      #endif -      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));        if (record->event.pressed) {          play_note(freq, 0xF);          if (music_sequence_recording) { diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c new file mode 100644 index 0000000000..2e11dd366c --- /dev/null +++ b/quantum/process_keycode/process_printer.c @@ -0,0 +1,254 @@ +#include "process_printer.h" +#include "action_util.h" + +bool printing_enabled = false; +uint8_t character_shift = 0; + +void enabled_printing() { +	printing_enabled = true; +	serial_init(); +} + +void disable_printing() { +	printing_enabled = false; +} + +uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0x28, 0x29}; + +// uint8_t keycode_to_ascii[0xFF][2]; + +// keycode_to_ascii[KC_MINS] = {0x2D, 0x5F}; + +void print_char(char c) { +	USB_Disable(); +	serial_send(c); +	USB_Init(); +} + +void print_box_string(uint8_t text[]) { +	uint8_t len = strlen(text); +	uint8_t out[len * 3 + 8]; +	out[0] = 0xDA; +	for (uint8_t i = 0; i < len; i++) { +		out[i+1] = 0xC4; +	} +	out[len + 1] = 0xBF; +	out[len + 2] = '\n'; + +	out[len + 3] = 0xB3; +	for (uint8_t i = 0; i < len; i++) { +		out[len + 4 + i] = text[i]; +	} +	out[len * 2 + 4] = 0xB3; +	out[len * 2 + 5] = '\n'; + + +	out[len * 2 + 6] = 0xC0; +	for (uint8_t i = 0; i < len; i++) { +		out[len * 2 + 7 + i] = 0xC4; +	} +	out[len * 3 + 7] = 0xD9; +	out[len * 3 + 8] = '\n'; + +	print_string(out);  +} + +void print_string(char c[]) { +	for(uint8_t i = 0; i < strlen(c); i++) +		print_char(c[i]); +} + +bool process_printer(uint16_t keycode, keyrecord_t *record) { +	if (keycode == PRINT_ON) { +		enabled_printing(); +		return false; +	} +	if (keycode == PRINT_OFF) { +		disable_printing(); +		return false; +	} + +	if (printing_enabled) { +		switch(keycode) { +			case KC_EXLM ... KC_RPRN: +			case KC_UNDS: +			case KC_PLUS: +			case KC_LCBR: +			case KC_RCBR: +			case KC_PIPE: +			case KC_TILD: +				keycode &= 0xFF; +			case KC_LSFT: +			case KC_RSFT: +				if (record->event.pressed) { +					character_shift++; +				} else { +					character_shift--; +				} +				return false; +			break; +		} + +		switch(keycode) { +			case KC_F1: +				if (record->event.pressed) { +					print_box_string("This is a line of text!"); +				} +				return false; +			case KC_ESC: +				if (record->event.pressed) { +					print_char(0x1B); +				} +				return false; +			break; +			case KC_SPC: +				if (record->event.pressed) { +					print_char(0x20); +				} +				return false; +			break; +			case KC_A ... KC_Z: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x41 + (keycode - KC_A)); +					} else { +						print_char(0x61 + (keycode - KC_A)); +					} +				} +				return false; +			break; +			case KC_1 ... KC_0: +				if (record->event.pressed) { +					if (character_shift) { +							print_char(shifted_numbers[keycode - KC_1]); +					} else { +							print_char(0x30 + ((keycode - KC_1 + 1) % 10)); +					} +				} +				return false; +			break; +			case KC_ENT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x0C); +					} else { +						print_char(0x0A); +					} +				} +				return false; +			break; +			case KC_BSPC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x18); +					} else { +						print_char(0x1A); +					} +				} +				return false; +			break; +			case KC_DOT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3E); +					} else { +						print_char(0x2E); +					} +				} +				return false; +			break; +			case KC_COMM: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3C); +					} else { +						print_char(0x2C); +					} +				} +				return false; +			break; +			case KC_SLSH: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3F); +					} else { +						print_char(0x2F); +					} +				} +				return false; +			break; +			case KC_QUOT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x22); +					} else { +						print_char(0x27); +					} +				} +				return false; +			break; +			case KC_GRV: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7E); +					} else { +						print_char(0x60); +					} +				} +				return false; +			break; +			case KC_MINS: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x5F); +					} else { +						print_char(0x2D); +					} +				} +				return false; +			break; +			case KC_EQL: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x2B); +					} else { +						print_char(0x3D); +					} +				} +				return false; +			break; +			case KC_LBRC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7B); +					} else { +						print_char(0x5B); +					} +				} +				return false; +			break; +			case KC_RBRC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7D); +					} else { +						print_char(0x5D); +					} +				} +				return false; +			break; +			case KC_BSLS: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7C); +					} else { +						print_char(0x5C); +					} +				} +				return false; +			break; +		} +	} +	return true; + +}
\ No newline at end of file diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h new file mode 100644 index 0000000000..fdd36d75a8 --- /dev/null +++ b/quantum/process_keycode/process_printer.h @@ -0,0 +1,8 @@ +#ifndef PROCESS_PRINTER_H +#define PROCESS_PRINTER_H + +#include "quantum.h" + +#include "protocol/serial.h" + +#endif
\ No newline at end of file diff --git a/quantum/process_keycode/process_printer_bb.c b/quantum/process_keycode/process_printer_bb.c new file mode 100644 index 0000000000..1924d03774 --- /dev/null +++ b/quantum/process_keycode/process_printer_bb.c @@ -0,0 +1,260 @@ +#include "process_printer.h" +#include "action_util.h" + +bool printing_enabled = false; +uint8_t character_shift = 0; + +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_MASK _BV(PD3) +#define SERIAL_DELAY 52 + +inline static +void serial_delay(void) { +  _delay_us(SERIAL_DELAY); +} + +inline static +void serial_high(void) { +  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +void serial_low(void) { +  SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static +void serial_output(void) { +  SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + + +void enabled_printing() { +	printing_enabled = true; +	serial_output(); +	serial_high(); +} + +void disable_printing() { +	printing_enabled = false; +} + +uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0x28, 0x29}; + +// uint8_t keycode_to_ascii[0xFF][2]; + +// keycode_to_ascii[KC_MINS] = {0x2D, 0x5F}; + +void print_char(char c) { +  uint8_t b = 8; +  serial_output(); +  while( b-- ) { +    if(c & (1 << b)) { +      serial_high(); +    } else { +      serial_low(); +    } +    serial_delay(); +  } +} + +void print_string(char c[]) { +	for(uint8_t i = 0; i < strlen(c); i++) +		print_char(c[i]); +} + +bool process_printer(uint16_t keycode, keyrecord_t *record) { +	if (keycode == PRINT_ON) { +		enabled_printing(); +		return false; +	} +	if (keycode == PRINT_OFF) { +		disable_printing(); +		return false; +	} + +	if (printing_enabled) { +		switch(keycode) { +			case KC_EXLM ... KC_RPRN: +			case KC_UNDS: +			case KC_PLUS: +			case KC_LCBR: +			case KC_RCBR: +			case KC_PIPE: +			case KC_TILD: +				keycode &= 0xFF; +			case KC_LSFT: +			case KC_RSFT: +				if (record->event.pressed) { +					character_shift++; +				} else { +					character_shift--; +				} +				return false; +			break; +		} + +		switch(keycode) { +			case KC_F1: +				if (record->event.pressed) { +					print_string("This is a line of text!\n\n\n"); +				} +				return false; +			case KC_ESC: +				if (record->event.pressed) { +					print_char(0x1B); +				} +				return false; +			break; +			case KC_SPC: +				if (record->event.pressed) { +					print_char(0x20); +				} +				return false; +			break; +			case KC_A ... KC_Z: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x41 + (keycode - KC_A)); +					} else { +						print_char(0x61 + (keycode - KC_A)); +					} +				} +				return false; +			break; +			case KC_1 ... KC_0: +				if (record->event.pressed) { +					if (character_shift) { +							print_char(shifted_numbers[keycode - KC_1]); +					} else { +							print_char(0x30 + ((keycode - KC_1 + 1) % 10)); +					} +				} +				return false; +			break; +			case KC_ENT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x0C); +					} else { +						print_char(0x0A); +					} +				} +				return false; +			break; +			case KC_BSPC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x18); +					} else { +						print_char(0x1A); +					} +				} +				return false; +			break; +			case KC_DOT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3E); +					} else { +						print_char(0x2E); +					} +				} +				return false; +			break; +			case KC_COMM: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3C); +					} else { +						print_char(0x2C); +					} +				} +				return false; +			break; +			case KC_SLSH: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x3F); +					} else { +						print_char(0x2F); +					} +				} +				return false; +			break; +			case KC_QUOT: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x22); +					} else { +						print_char(0x27); +					} +				} +				return false; +			break; +			case KC_GRV: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7E); +					} else { +						print_char(0x60); +					} +				} +				return false; +			break; +			case KC_MINS: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x5F); +					} else { +						print_char(0x2D); +					} +				} +				return false; +			break; +			case KC_EQL: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x2B); +					} else { +						print_char(0x3D); +					} +				} +				return false; +			break; +			case KC_LBRC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7B); +					} else { +						print_char(0x5B); +					} +				} +				return false; +			break; +			case KC_RBRC: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7D); +					} else { +						print_char(0x5D); +					} +				} +				return false; +			break; +			case KC_BSLS: +				if (record->event.pressed) { +					if (character_shift) { +						print_char(0x7C); +					} else { +						print_char(0x5C); +					} +				} +				return false; +			break; +		} +	} +	return true; + +}
\ No newline at end of file diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index cd3a610b4d..a30e93ae32 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -1,6 +1,8 @@  #include "process_unicode.h" +#include "action_util.h"  static uint8_t input_mode; +uint8_t mods;  __attribute__((weak))  uint16_t hex_to_keycode(uint8_t hex) @@ -25,6 +27,19 @@ uint8_t get_unicode_input_mode(void) {  __attribute__((weak))  void unicode_input_start (void) { +  // save current mods +  mods = keyboard_report->mods; + +  // unregister all mods to start from clean state +  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT); +  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT); +  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL); +  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL); +  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT); +  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT); +  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI); +  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI); +    switch(input_mode) {    case UC_OSX:      register_code(KC_LALT); @@ -54,15 +69,25 @@ void unicode_input_start (void) {  __attribute__((weak))  void unicode_input_finish (void) {    switch(input_mode) { -  case UC_OSX: -  case UC_WIN: -    unregister_code(KC_LALT); -    break; -  case UC_LNX: -    register_code(KC_SPC); -    unregister_code(KC_SPC); -    break; +    case UC_OSX: +    case UC_WIN: +      unregister_code(KC_LALT); +      break; +    case UC_LNX: +      register_code(KC_SPC); +      unregister_code(KC_SPC); +      break;    } + +  // reregister previously set mods +  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT); +  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT); +  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL); +  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL); +  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT); +  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT); +  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI); +  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);  }  void register_hex(uint16_t hex) { diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index 065eeb5f6a..f17cfa6cf2 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -22,6 +22,7 @@ void register_hex(uint16_t hex);  bool process_unicode(uint16_t keycode, keyrecord_t *record);  #ifdef UNICODEMAP_ENABLE +void unicode_map_input_error(void);  bool process_unicode_map(uint16_t keycode, keyrecord_t *record);  #endif | 
