This updates my ErgoDox EZ layout to v1.3, which has the following noteworthy changes: * Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a **heatmap** out of the logs. * The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the **base layer** for an image that shows where arrows are. * The **experimental** layer has been redone, and is now called **ADORE**, and as such, can be enabled by `LEAD a` now. * Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>pull/535/head
parent
9ecf9073b9
commit
53eb36c085
After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 135 KiB |
@ -0,0 +1,533 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"backcolor": "#ffffff",
|
||||||
|
"name": "ErgoDox - algernon's layout: Heatmap",
|
||||||
|
"author": "Gergely Nagy <kbd@gergo.csillger.hu>",
|
||||||
|
"notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
|
||||||
|
"switchMount": "cherry",
|
||||||
|
"switchBrand": "gateron",
|
||||||
|
"switchType": "KS-3-Tea",
|
||||||
|
"pcb": true,
|
||||||
|
"css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
|
||||||
|
},
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"x": 3.5,
|
||||||
|
"c": "#a7d0db",
|
||||||
|
"fa": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"#\n3\nF3",
|
||||||
|
{
|
||||||
|
"x": 10.5,
|
||||||
|
"c": "#a7d0db",
|
||||||
|
"t": "#000000",
|
||||||
|
"a": 4,
|
||||||
|
"fa": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"*\n8\nF8"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 2.5,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"@\n2\nF2",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"$\n4\nF4",
|
||||||
|
{
|
||||||
|
"x": 8.5
|
||||||
|
},
|
||||||
|
"&\n7\nF7",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"(\n9\nF9"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 5.5,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"%\n5\nF5",
|
||||||
|
{
|
||||||
|
"c": "#f9cd31",
|
||||||
|
"a": 7,
|
||||||
|
"f": 2
|
||||||
|
},
|
||||||
|
"STENO",
|
||||||
|
{
|
||||||
|
"x": 4.5,
|
||||||
|
"f": 6
|
||||||
|
},
|
||||||
|
"<i class='mss mss-Unicode-Option-3'></i>",
|
||||||
|
{
|
||||||
|
"c": "#7adabd",
|
||||||
|
"a": 4,
|
||||||
|
"f": 3,
|
||||||
|
"fa": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"^\n6\nF6"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"c": "#ffb2d2",
|
||||||
|
"f": 3,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"\n\n~\n`",
|
||||||
|
{
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"!\n1\nF1",
|
||||||
|
{
|
||||||
|
"x": 14.5
|
||||||
|
},
|
||||||
|
")\n0\nF10",
|
||||||
|
{
|
||||||
|
"a": 7,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"F11"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.375,
|
||||||
|
"x": 3.5,
|
||||||
|
"c": "#a7d0db",
|
||||||
|
"t": "#000000",
|
||||||
|
"a": 4
|
||||||
|
},
|
||||||
|
">\n.",
|
||||||
|
{
|
||||||
|
"x": 10.5,
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"C"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 2.5,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b",
|
||||||
|
"a": 4
|
||||||
|
},
|
||||||
|
"<\n,",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000",
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"P",
|
||||||
|
{
|
||||||
|
"x": 8.5
|
||||||
|
},
|
||||||
|
"G",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"R"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 5.5,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"Y",
|
||||||
|
{
|
||||||
|
"c": "#93c9b7",
|
||||||
|
"a": 4,
|
||||||
|
"h": 1.5
|
||||||
|
},
|
||||||
|
"{\n[",
|
||||||
|
{
|
||||||
|
"x": 4.5,
|
||||||
|
"h": 1.5
|
||||||
|
},
|
||||||
|
"}\n]",
|
||||||
|
{
|
||||||
|
"c": "#7adabd",
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"F"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"c": "#ffb07b",
|
||||||
|
"t": "#0d0d0b",
|
||||||
|
"f": 6,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
|
||||||
|
{
|
||||||
|
"c": "#ffb2d2",
|
||||||
|
"a": 4,
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"\"\n'",
|
||||||
|
{
|
||||||
|
"x": 14.5,
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"L",
|
||||||
|
{
|
||||||
|
"a": 4,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"|\n\\"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.375,
|
||||||
|
"x": 3.5,
|
||||||
|
"c": "#a7d0db",
|
||||||
|
"t": "#000000",
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"E",
|
||||||
|
{
|
||||||
|
"x": 10.5
|
||||||
|
},
|
||||||
|
"T"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 2.5,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"O",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000",
|
||||||
|
"n": true
|
||||||
|
},
|
||||||
|
"U",
|
||||||
|
{
|
||||||
|
"x": 8.5,
|
||||||
|
"n": true
|
||||||
|
},
|
||||||
|
"H",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"N"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 5.5,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"I",
|
||||||
|
{
|
||||||
|
"x": 6.5
|
||||||
|
},
|
||||||
|
"D"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"c": "#ffb2d2",
|
||||||
|
"t": "#0d0d0b",
|
||||||
|
"fa": [
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"<i class='fa fa-arrows'></i>\n\nTab",
|
||||||
|
{
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"A",
|
||||||
|
{
|
||||||
|
"x": 14.5,
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"S",
|
||||||
|
{
|
||||||
|
"a": 4,
|
||||||
|
"fa": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"+\n="
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.625,
|
||||||
|
"x": 6.5,
|
||||||
|
"c": "#93c9b7",
|
||||||
|
"t": "#000000",
|
||||||
|
"a": 7,
|
||||||
|
"h": 1.5
|
||||||
|
},
|
||||||
|
"(",
|
||||||
|
{
|
||||||
|
"x": 4.5,
|
||||||
|
"h": 1.5
|
||||||
|
},
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.75,
|
||||||
|
"x": 3.5,
|
||||||
|
"c": "#a7d0db",
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"J",
|
||||||
|
{
|
||||||
|
"x": 10.5
|
||||||
|
},
|
||||||
|
"W"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 2.5,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"Q",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"K",
|
||||||
|
{
|
||||||
|
"x": 8.5
|
||||||
|
},
|
||||||
|
"M",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#bfbad1",
|
||||||
|
"t": "#0d0d0b"
|
||||||
|
},
|
||||||
|
"V"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 5.5,
|
||||||
|
"c": "#7adabd",
|
||||||
|
"t": "#000000"
|
||||||
|
},
|
||||||
|
"X",
|
||||||
|
{
|
||||||
|
"x": 6.5
|
||||||
|
},
|
||||||
|
"B"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"c": "#ffb07b",
|
||||||
|
"f": 9,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
|
||||||
|
{
|
||||||
|
"c": "#ffb2d2",
|
||||||
|
"t": "#0d0d0b",
|
||||||
|
"a": 4,
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"?\n/",
|
||||||
|
{
|
||||||
|
"x": 14.5,
|
||||||
|
"a": 6
|
||||||
|
},
|
||||||
|
"Z",
|
||||||
|
{
|
||||||
|
"c": "#ffb07b",
|
||||||
|
"t": "#000000",
|
||||||
|
"f": 9,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
"<i class='kb kb-Multimedia-Stop'></i>"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.375,
|
||||||
|
"x": 3.5,
|
||||||
|
"c": "#d9dae0",
|
||||||
|
"g": true,
|
||||||
|
"a": 7,
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
"x": 10.5
|
||||||
|
},
|
||||||
|
""
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.875,
|
||||||
|
"x": 2.5
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#d4872a",
|
||||||
|
"g": false,
|
||||||
|
"a": 5
|
||||||
|
},
|
||||||
|
";\n:",
|
||||||
|
{
|
||||||
|
"x": 8.5
|
||||||
|
},
|
||||||
|
"_\n-",
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"c": "#d9dae0",
|
||||||
|
"g": true,
|
||||||
|
"a": 7
|
||||||
|
},
|
||||||
|
""
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"y": -0.75,
|
||||||
|
"x": 0.5
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{},
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
"x": 14.5
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{},
|
||||||
|
""
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"r": 30,
|
||||||
|
"rx": 6.5,
|
||||||
|
"ry": 4.25,
|
||||||
|
"y": -1,
|
||||||
|
"x": 1,
|
||||||
|
"c": "#f9cd31",
|
||||||
|
"g": false
|
||||||
|
},
|
||||||
|
"Alt",
|
||||||
|
{
|
||||||
|
"a": 4,
|
||||||
|
"fa": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
9
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"c": "#d4872a",
|
||||||
|
"a": 7,
|
||||||
|
"f": 9,
|
||||||
|
"h": 2
|
||||||
|
},
|
||||||
|
"<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
|
||||||
|
{
|
||||||
|
"h": 2
|
||||||
|
},
|
||||||
|
"<i class='fa fa-angle-double-up'></i>",
|
||||||
|
{
|
||||||
|
"c": "#f9cd31",
|
||||||
|
"f": 3
|
||||||
|
},
|
||||||
|
"Ctrl"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"x": 2,
|
||||||
|
"c": "#e26757"
|
||||||
|
},
|
||||||
|
"ESC"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"r": -30,
|
||||||
|
"rx": 13,
|
||||||
|
"y": -1,
|
||||||
|
"x": -3,
|
||||||
|
"c": "#f9cd31",
|
||||||
|
"f": 2
|
||||||
|
},
|
||||||
|
"MEDIA",
|
||||||
|
{},
|
||||||
|
"1HAND"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"x": -3
|
||||||
|
},
|
||||||
|
"LEAD",
|
||||||
|
{
|
||||||
|
"c": "#d4872a",
|
||||||
|
"f": 9,
|
||||||
|
"h": 2
|
||||||
|
},
|
||||||
|
"<i class='kb kb-Return-2'></i>",
|
||||||
|
{
|
||||||
|
"f": 3,
|
||||||
|
"h": 2
|
||||||
|
},
|
||||||
|
"SPC"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"x": -3,
|
||||||
|
"c": "#f9cd31",
|
||||||
|
"f": 2
|
||||||
|
},
|
||||||
|
"HUN"
|
||||||
|
]
|
||||||
|
]
|
@ -0,0 +1,145 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
from math import floor
|
||||||
|
|
||||||
|
cr_coord_map = [
|
||||||
|
[
|
||||||
|
# Row 0
|
||||||
|
[ 4, 0], [ 4, 2], [ 2, 0], [ 1, 0], [ 2, 2], [ 3, 0], [ 3, 2],
|
||||||
|
[ 3, 4], [ 3, 6], [ 2, 4], [ 1, 2], [ 2, 6], [ 4, 4], [ 4, 6],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
# Row 1
|
||||||
|
[ 8, 0], [ 8, 2], [ 6, 0], [ 5, 0], [ 6, 2], [ 7, 0], [ 7, 2],
|
||||||
|
[ 7, 4], [ 7, 6], [ 6, 4], [ 5, 2], [ 6, 6], [ 8, 4], [ 8, 6],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
# Row 2
|
||||||
|
[12, 0], [12, 2], [10, 0], [ 9, 0], [10, 2], [11, 0], [ ],
|
||||||
|
[ ], [11, 2], [10, 4], [ 9, 2], [10, 6], [12, 4], [12, 6],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
# Row 3
|
||||||
|
[17, 0], [17, 2], [15, 0], [14, 0], [15, 2], [16, 0], [13, 0],
|
||||||
|
[13, 2], [16, 2], [15, 4], [14, 2], [15, 6], [17, 4], [17, 6],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
# Row 4
|
||||||
|
[20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [],
|
||||||
|
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
# Row 5
|
||||||
|
[ ], [23, 0], [22, 2], [22, 0], [22, 4], [21, 0], [21, 2],
|
||||||
|
[24, 0], [24, 2], [25, 0], [25, 4], [25, 2], [26, 0], [ ],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
|
def set_attr_at(j, b, n, attr, fn, val):
|
||||||
|
blk = j[b][n]
|
||||||
|
if attr in blk:
|
||||||
|
blk[attr] = fn(blk[attr], val)
|
||||||
|
else:
|
||||||
|
blk[attr] = fn(None, val)
|
||||||
|
|
||||||
|
def coord(col, row):
|
||||||
|
return cr_coord_map[row][col]
|
||||||
|
|
||||||
|
def set_attr(orig, new):
|
||||||
|
return new
|
||||||
|
|
||||||
|
def set_bg(j, (b, n), color):
|
||||||
|
set_attr_at(j, b, n, "c", set_attr, color)
|
||||||
|
#set_attr_at(j, b, n, "g", set_attr, False)
|
||||||
|
|
||||||
|
def _set_tap_info(o, count, cap):
|
||||||
|
ns = 4 - o.count ("\n")
|
||||||
|
return o + "\n" * ns + "%.02f%%" % (float(count) / float(cap) * 100)
|
||||||
|
|
||||||
|
def set_tap_info(j, (b, n), count, cap):
|
||||||
|
j[b][n + 1] = _set_tap_info (j[b][n + 1], count, cap)
|
||||||
|
|
||||||
|
def heatmap_color (v):
|
||||||
|
colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
|
||||||
|
fb = 0
|
||||||
|
if v <= 0:
|
||||||
|
idx1, idx2 = 0, 0
|
||||||
|
elif v >= 1:
|
||||||
|
idx1, idx2 = len(colors) - 1, len(colors) - 1
|
||||||
|
else:
|
||||||
|
val = v * (len(colors) - 1)
|
||||||
|
idx1 = int(floor(val))
|
||||||
|
idx2 = idx1 + 1
|
||||||
|
fb = val - float(idx1)
|
||||||
|
|
||||||
|
r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
|
||||||
|
g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
|
||||||
|
b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
|
||||||
|
|
||||||
|
r, g, b = [x * 255 for x in r, g, b]
|
||||||
|
return "#%02x%02x%02x" % (r, g, b)
|
||||||
|
|
||||||
|
# Load the keylog
|
||||||
|
def load_keylog(fname, restrict_row):
|
||||||
|
keylog = {}
|
||||||
|
total = 0
|
||||||
|
with open(fname, "r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
m = re.search ('KL: col=(\d+), row=(\d+)', line)
|
||||||
|
if not m:
|
||||||
|
continue
|
||||||
|
(c, r) = (int(m.group (2)), int(m.group (1)))
|
||||||
|
if restrict_row != None and r != int(restrict_row):
|
||||||
|
continue
|
||||||
|
if (c, r) in keylog:
|
||||||
|
keylog[(c, r)] = keylog[(c, r)] + 1
|
||||||
|
else:
|
||||||
|
keylog[(c, r)] = 1
|
||||||
|
total = total + 1
|
||||||
|
return total / 2, keylog
|
||||||
|
|
||||||
|
def l_flat(s):
|
||||||
|
f = s.split("\n")
|
||||||
|
return ", ".join (f)
|
||||||
|
|
||||||
|
def main(base_fn, log_fn, restrict_row = None):
|
||||||
|
|
||||||
|
with open(base_fn, "r") as f:
|
||||||
|
layout = json.load (f)
|
||||||
|
|
||||||
|
## Reset colors
|
||||||
|
for row in cr_coord_map:
|
||||||
|
for col in row:
|
||||||
|
if col != []:
|
||||||
|
set_bg (layout, col, "#d9dae0")
|
||||||
|
#set_attr_at (layout, col[0], col[1], "g", set_attr, True)
|
||||||
|
|
||||||
|
total, log = load_keylog (log_fn, restrict_row)
|
||||||
|
max_cnt = 0
|
||||||
|
for (c, r) in log:
|
||||||
|
max_cnt = max(max_cnt, log[(c, r)])
|
||||||
|
|
||||||
|
# Create the heatmap
|
||||||
|
for (c, r) in log:
|
||||||
|
coords = coord(c, r)
|
||||||
|
b, n = coords
|
||||||
|
cap = max_cnt
|
||||||
|
v = float(log[(c, r)]) / cap
|
||||||
|
print >> sys.stderr, "%s => %d/%d => %f = %s" % (l_flat(layout[b][n+1]), log[(c,r)], cap, v, heatmap_color(v))
|
||||||
|
set_bg (layout, coord(c, r), heatmap_color (v))
|
||||||
|
set_tap_info (layout, coord (c, r), log[(c, r)], total)
|
||||||
|
|
||||||
|
print json.dumps(layout)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print """Log to Heatmap -- creates a heatmap out of keyboard logs
|
||||||
|
|
||||||
|
Usage: log-to-heatmap.py base-layout.json logfile [row] >layout.json"""
|
||||||
|
sys.exit (1)
|
||||||
|
main(*sys.argv[1:])
|
Loading…
Reference in new issue