aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/process_keycode/process_printer_bb.c
blob: e482d82591aa1d885d2beca6a5af0fcffd1ab090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/* Copyright 2016 Jack Humbert
 *
 * 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 "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 enable_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) {
        enable_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;
}
B_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER * USB_CFG_DESCR_PROPS_HID * USB_CFG_DESCR_PROPS_HID_REPORT * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) * * Note about string descriptors: String descriptors are not just strings, they * are Unicode strings prefixed with a 2 byte header. Example: * int serialNumberDescriptor[] = { * USB_STRING_DESCRIPTOR_HEADER(6), * 'S', 'e', 'r', 'i', 'a', 'l' * }; */ #define USB_CFG_DESCR_PROPS_DEVICE 0 #define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC //#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 #define USB_CFG_DESCR_PROPS_STRINGS 0 #define USB_CFG_DESCR_PROPS_STRING_0 0 #define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 #define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 #define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 #define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC //#define USB_CFG_DESCR_PROPS_HID 0 #define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC //#define USB_CFG_DESCR_PROPS_HID_REPORT 0 #define USB_CFG_DESCR_PROPS_UNKNOWN 0 #define usbMsgPtr_t unsigned short /* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to * a scalar type here because gcc generates slightly shorter code for scalar * arithmetics than for pointer arithmetics. Remove this define for backward * type compatibility or define it to an 8 bit type if you use data in RAM only * and all RAM is below 256 bytes (tiny memory model in IAR CC). */ /* ----------------------- Optional MCU Description ------------------------ */ /* The following configurations have working defaults in usbdrv.h. You * usually don't need to set them explicitly. Only if you want to run * the driver on a device which is not yet supported or with a compiler * which is not fully supported (such as IAR C) or if you use a differnt * interrupt than INT0, you may have to define some of these. */ /* #define USB_INTR_CFG MCUCR */ /* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ /* #define USB_INTR_CFG_CLR 0 */ /* #define USB_INTR_ENABLE GIMSK */ /* #define USB_INTR_ENABLE_BIT INT0 */ /* #define USB_INTR_PENDING GIFR */ /* #define USB_INTR_PENDING_BIT INTF0 */ /* #define USB_INTR_VECTOR INT0_vect */ /* Set INT1 for D- falling edge to count SOF */ /* #define USB_INTR_CFG EICRA */ #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) /* #define USB_INTR_CFG_CLR 0 */ /* #define USB_INTR_ENABLE EIMSK */ #define USB_INTR_ENABLE_BIT INT1 /* #define USB_INTR_PENDING EIFR */ #define USB_INTR_PENDING_BIT INTF1 #define USB_INTR_VECTOR INT1_vect #endif /* __usbconfig_h_included__ */