-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdbg_translator.h
113 lines (99 loc) · 3.62 KB
/
dbg_translator.h
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
#ifndef DBG_TRANSLATOR_H
#define DBG_TRANSLATOR_H
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "key_map.h"
#include "layout.h"
#include "translator.h"
template <int R, int C>
class DbgTranslator : public Translator {
public:
DbgTranslator(const int* row_pins, const int* col_pins, int num_layers,
const Layer<R,C>* layers)
: row_pins_(row_pins), col_pins_(col_pins),
num_layers_(num_layers), layers_(layers) {}
const char* name() const { return "dbg"; }
void Input(Events events, Sender* sender) override {
switch (events.keys[0].key) {
case KEY_H: ShowHeatMap(sender); break;
case KEY_L: ShowLayers(sender); break;
case KEY_P: ShowPins(sender); break;
}
}
void AutoRepeat() override {}
private:
void ShowHeatMap(Sender* sender) {
char message[200];
for (int l = 0; l < num_layers_; ++l) {
const auto& layer = layers_[l];
sprintf(message, "layer[%d] = {\n", l);
sender->Send(message);
for (int r = 0; r < R; ++r) {
sprintf(message, " row[%d] = { ", r);
for (int c = 0; c < C; ++c) {
sprintf(message + strlen(message), "%d%c", layer.freq[r][c],
(c < C - 1 ? ',' : ' '));
}
sprintf(message + strlen(message), "},\n");
sender->Send(message);
}
sprintf(message, "};\n");
sender->Send(message);
}
}
void ShowLayers(Sender* sender) {
char message[200];
for (int l = 0; l < num_layers_; ++l) {
const auto& layer = layers_[l];
sprintf(message, "layer[%d] = {\n", l);
sprintf(message + strlen(message), " name = \"%s\",\n", layer.name);
sprintf(message + strlen(message), " layer_id = %d,\n", layer.layer_id);
sprintf(message + strlen(message), " fn_layer_id = %d,\n", layer.fn_layer_id);
sprintf(message + strlen(message), " translator = \"%s\",\n", layer.translator);
sender->Send(message);
for (int r = 0; r < R; ++r) {
sprintf(message, " row[%d] = { ", r);
for (int c = 0; c < C; ++c) {
auto key = layer.keys[r][c];
if (isprint(key))
sprintf(message + strlen(message), "'%c'%c ", key, (c < C - 1 ? ',' : ' '));
else
sprintf(message + strlen(message), "%3d%c ", key, (c < C - 1 ? ',' : ' '));
}
sprintf(message + strlen(message), "},\n");
sender->Send(message);
}
sprintf(message, " taps = { ");
for (int t = 0; t < kMaxTaps; ++t) {
if (layer.taps[t].modifier == 0) break;
sprintf(message + strlen(message), "%d->%d ", layer.taps[t].modifier,
layer.taps[t].key);
}
sprintf(message + strlen(message), "},\n");
sender->Send(message);
sprintf(message, "};\n");
sender->Send(message);
}
}
void ShowPins(Sender* sender) {
char message[200];
sprintf(message, "row_pins[%d] = { ", R);
for (int r = 0; r < R; ++r)
sprintf(message + strlen(message), "%d%c ", row_pins_[r],
(r < R-1 ? ',' : ' '));
sprintf(message + strlen(message), "};\n");
sender->Send(message);
sprintf(message, "col_pins[%d] = { ", C);
for (int c = 0; c < C; ++c)
sprintf(message + strlen(message), "%d%c ", col_pins_[c],
(c < C-1 ? ',' : ' '));
sprintf(message + strlen(message), "};\n");
sender->Send(message);
}
const int* row_pins_;
const int* col_pins_;
const int num_layers_;
const Layer<R,C>* layers_;
};
#endif