diff options
| -rw-r--r-- | keyboards/planck/keymaps/thermal_printer/Makefile | 26 | ||||
| -rw-r--r-- | keyboards/planck/keymaps/thermal_printer/config.h | 23 | ||||
| -rw-r--r-- | keyboards/planck/keymaps/thermal_printer/keymap.c | 314 | ||||
| -rw-r--r-- | keyboards/planck/keymaps/thermal_printer/readme.md | 2 | ||||
| -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 | 
7 files changed, 887 insertions, 0 deletions
| diff --git a/keyboards/planck/keymaps/thermal_printer/Makefile b/keyboards/planck/keymaps/thermal_printer/Makefile new file mode 100644 index 0000000000..3d1d11877f --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/Makefile @@ -0,0 +1,26 @@ + + +# Build Options +#   change to "no" to disable the options, or define them in the Makefile in  +#   the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes       # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes       # Audio control and System control(+450) +CONSOLE_ENABLE = no         # Console for debug(+400) +COMMAND_ENABLE = yes        # Commands for debug and configuration +NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality +MIDI_ENABLE = no            # MIDI controls +AUDIO_ENABLE = yes           # Audio output on port C6 +UNICODE_ENABLE = no         # Unicode +BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time. +PRINTING_ENABLE = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR +	include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/thermal_printer/config.h b/keyboards/planck/keymaps/thermal_printer/config.h new file mode 100644 index 0000000000..430b6493cf --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/config.h @@ -0,0 +1,23 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#      define SERIAL_UART_BAUD 19200 +#      define SERIAL_UART_DATA UDR1 +#      define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1) +#      define SERIAL_UART_RXD_VECT USART1_RX_vect +#      define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1)) +#      define SERIAL_UART_INIT() do { \ +            /* baud rate */ \ +            UBRR1L = SERIAL_UART_UBRR; \ +            /* baud rate */ \ +            UBRR1H = SERIAL_UART_UBRR >> 8; \ +            /* enable TX */ \ +            UCSR1B = _BV(TXEN1); \ +            /* 8-bit data */ \ +            UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \ +            sei(); \ +        } while(0) + + #endif
\ No newline at end of file diff --git a/keyboards/planck/keymaps/thermal_printer/keymap.c b/keyboards/planck/keymaps/thermal_printer/keymap.c new file mode 100644 index 0000000000..e880597319 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/keymap.c @@ -0,0 +1,314 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE +  #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _ADJUST 16 + +enum planck_keycodes { +  QWERTY = SAFE_RANGE, +  COLEMAK, +  DVORAK, +  PLOVER, +  LOWER, +  RAISE, +  BACKLIT, +  EXT_PLV +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { +  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC}, +  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, +  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, +  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { +  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC}, +  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT}, +  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, +  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { +  {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC}, +  {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH}, +  {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT }, +  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { +  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, +  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, +  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { +  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, +  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS}, +  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { +  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   }, +  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC}, +  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, +  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * |      | Reset|      | Print|no prnt |    |      |      |      |      |      |  Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      |      |      |      |      | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { +  {_______, RESET,   _______, PRINT_ON, PRINT_OFF, _______, _______, _______, _______, _______, _______, KC_DEL}, +  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______}, +  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2]    = SONG(STARTUP_SOUND); +float tone_qwerty[][2]     = SONG(QWERTY_SOUND); +float tone_dvorak[][2]     = SONG(DVORAK_SOUND); +float tone_colemak[][2]    = SONG(COLEMAK_SOUND); +float tone_plover[][2]     = SONG(PLOVER_SOUND); +float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { +  eeconfig_update_default_layer(default_layer); +  default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +  switch (keycode) { +    case QWERTY: +      if (record->event.pressed) { +        #ifdef AUDIO_ENABLE +          PLAY_NOTE_ARRAY(tone_qwerty, false, 0); +        #endif +        persistant_default_layer_set(1UL<<_QWERTY); +      } +      return false; +      break; +    case COLEMAK: +      if (record->event.pressed) { +        #ifdef AUDIO_ENABLE +          PLAY_NOTE_ARRAY(tone_colemak, false, 0); +        #endif +        persistant_default_layer_set(1UL<<_COLEMAK); +      } +      return false; +      break; +    case DVORAK: +      if (record->event.pressed) { +        #ifdef AUDIO_ENABLE +          PLAY_NOTE_ARRAY(tone_dvorak, false, 0); +        #endif +        persistant_default_layer_set(1UL<<_DVORAK); +      } +      return false; +      break; +    case LOWER: +      if (record->event.pressed) { +        layer_on(_LOWER); +        update_tri_layer(_LOWER, _RAISE, _ADJUST); +      } else { +        layer_off(_LOWER); +        update_tri_layer(_LOWER, _RAISE, _ADJUST); +      } +      return false; +      break; +    case RAISE: +      if (record->event.pressed) { +        layer_on(_RAISE); +        update_tri_layer(_LOWER, _RAISE, _ADJUST); +      } else { +        layer_off(_RAISE); +        update_tri_layer(_LOWER, _RAISE, _ADJUST); +      } +      return false; +      break; +    case BACKLIT: +      if (record->event.pressed) { +        register_code(KC_RSFT); +        #ifdef BACKLIGHT_ENABLE +          backlight_step(); +        #endif +      } else { +        unregister_code(KC_RSFT); +      } +      return false; +      break; +    case PLOVER: +      if (record->event.pressed) { +        #ifdef AUDIO_ENABLE +          stop_all_notes(); +          PLAY_NOTE_ARRAY(tone_plover, false, 0); +        #endif +        layer_off(_RAISE); +        layer_off(_LOWER); +        layer_off(_ADJUST); +        layer_on(_PLOVER); +        if (!eeconfig_is_enabled()) { +            eeconfig_init(); +        } +        keymap_config.raw = eeconfig_read_keymap(); +        keymap_config.nkro = 1; +        eeconfig_update_keymap(keymap_config.raw); +      } +      return false; +      break; +    case EXT_PLV: +      if (record->event.pressed) { +        #ifdef AUDIO_ENABLE +          PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); +        #endif +        layer_off(_PLOVER); +      } +      return false; +      break; +  } +  return true; +} + +void matrix_init_user(void) { +    #ifdef AUDIO_ENABLE +        startup_user(); +    #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ +    _delay_ms(20); // gets rid of tick +    PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ +    PLAY_NOTE_ARRAY(tone_goodbye, false, 0); +    _delay_ms(150); +    stop_all_notes(); +} + +void music_on_user(void) +{ +    music_scale_user(); +} + +void music_scale_user(void) +{ +    PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/planck/keymaps/thermal_printer/readme.md b/keyboards/planck/keymaps/thermal_printer/readme.md new file mode 100644 index 0000000000..de9680b498 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/readme.md @@ -0,0 +1,2 @@ +# The Default Planck Layout + 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 | 
