/* * definitions from * xen/include/asm-ia64/linux/asm/sal.h * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef XC_IA64_SAL_H #define XC_IA64_SAL_H /* * The SAL system table is followed by a variable number of variable * length descriptors. The structure of these descriptors follows * below. * The defininition follows SAL specs from July 2000 */ struct ia64_sal_systab { uint8_t signature[4]; /* should be "SST_" */ uint32_t size; /* size of this table in bytes */ uint8_t sal_rev_minor; uint8_t sal_rev_major; uint16_t entry_count; /* # of entries in variable portion */ uint8_t checksum; uint8_t reserved1[7]; uint8_t sal_a_rev_minor; uint8_t sal_a_rev_major; uint8_t sal_b_rev_minor; uint8_t sal_b_rev_major; /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */ uint8_t oem_id[32]; uint8_t product_id[32]; /* ASCII product id */ uint8_t reserved2[8]; }; enum sal_systab_entry_type { SAL_DESC_ENTRY_POINT = 0, SAL_DESC_MEMORY = 1, SAL_DESC_PLATFORM_FEATURE = 2, SAL_DESC_TR = 3, SAL_DESC_PTC = 4, SAL_DESC_AP_WAKEUP = 5 }; typedef struct ia64_sal_desc_entry_point { uint8_t type; uint8_t reserved1[7]; uint64_t pal_proc; uint64_t sal_proc; uint64_t gp; uint8_t reserved2[16]; }ia64_sal_desc_entry_point_t; #define IA64_SAL_AP_EXTERNAL_INT 0 typedef struct ia64_sal_desc_ap_wakeup { uint8_t type; uint8_t mechanism; /* 0 == external interrupt */ uint8_t reserved1[6]; uint64_t vector; /* interrupt vector in range 0x10-0xff */ } ia64_sal_desc_ap_wakeup_t ; //XXX should move xen_sal_data to arch-ia64.h? /* These are data in domain memory for SAL emulator. */ struct xen_sal_data { /* OS boot rendez vous. */ unsigned long boot_rdv_ip; unsigned long boot_rdv_r1; /* There are these for EFI_SET_VIRTUAL_ADDRESS_MAP emulation. */ int efi_virt_mode; /* phys : 0 , virt : 1 */ }; #endif /* XC_IA64_SAL_H */ orm>
path: root/quantum/process_keycode/process_printer.c
blob: 7c5e4169a6044a097917d42d5b64464739070157 (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
260
261
262
263
264
265
/* 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;

void enable_printing(void) {
    printing_enabled = true;
    serial_init();
}

void disable_printing(void) { 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_string(char c[]) {
    for (uint8_t i = 0; i < strlen(c); i++) print_char(c[i]);
}

void print_box_string(const char text[]) {
    size_t len = strlen(text);
    char   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);
}

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_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;
}