diff --git a/keyboards/cheapino/cheapino.c b/keyboards/cheapino/cheapino.c new file mode 100644 index 00000000000..73aaa3f0516 --- /dev/null +++ b/keyboards/cheapino/cheapino.c @@ -0,0 +1,75 @@ +#include "wait.h" +#include "quantum.h" + +// This is to keep state between callbacks, when it is 0 the +// initial RGB flash is finished +uint8_t _hue_countdown = 50; + +// These are to keep track of user selected color, so we +// can restore it after RGB flash +uint8_t _hue; +uint8_t _saturation; +uint8_t _value; + +// Do a little 2.5 seconds display of the different colors +// Use the deferred executor so the LED flash dance does not +// stop us from using the keyboard. +// https://docs.qmk.fm/#/custom_quantum_functions?id=deferred-executor-registration +uint32_t flash_led(uint32_t next_trigger_time, void *cb_arg) { + rgblight_sethsv(_hue_countdown * 5, 230, 70); + _hue_countdown--; + if (_hue_countdown == 0) { + // Finished, reset to user chosen led color + rgblight_sethsv(_hue, _saturation, _value); + return 0; + } else { + return 50; + } +} + +void keyboard_post_init_user(void) { + debug_enable=true; + debug_matrix=true; + //debug_keyboard=true; + //debug_mouse=true; + + // Store user selected rgb hsv: + _hue = rgblight_get_hue(); + _saturation = rgblight_get_sat(); + _value = rgblight_get_val(); + + // Flash a little on start + defer_exec(50, flash_led, NULL); +} + +// Make the builtin RGB led show different colors per layer: +// This seemed like a good idea but turned out pretty annoying, +// to me at least... Uncomment the lines below to enable +/* +uint8_t get_hue(uint8_t layer) { + switch (layer) { + case 6: + return 169; + case 5: + return 43; + case 4: + return 85; + case 3: + return 120; + case 2: + return 180; + case 1: + return 220; + default: + return 0; + } +} + +layer_state_t layer_state_set_user(layer_state_t state) { + uint8_t sat = rgblight_get_sat(); + uint8_t val = rgblight_get_val(); + uint8_t hue = get_hue(get_highest_layer(state)); + rgblight_sethsv(hue, sat, val); + return state; +} +*/ \ No newline at end of file diff --git a/keyboards/cheapino/config.h b/keyboards/cheapino/config.h new file mode 100644 index 00000000000..6aa5d1ff730 --- /dev/null +++ b/keyboards/cheapino/config.h @@ -0,0 +1,43 @@ +// Copyright 2023 Thomas Haukland (@tompi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT + +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD +#define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral +//#define WS2812_TRST_US 80 +#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB +#define RGB_MATRIX_DEFAULT_VAL 32 + + +// Pick good defaults for enabling homerow modifiers +#define TAPPING_TERM 230 + + +#define WS2812_DI_PIN GP16 // The pin connected to the data pin of the LEDs +//#define RGBLIGHT_LED_COUNT 1 // The number of LEDs connected +#define RGBLED_NUM 1 + +#define MAX_DEFERRED_EXECUTORS 32 + +#define DEBOUNCE 5 +#define VIAL_KEYBOARD_UID {0x79, 0xED, 0x40, 0xBB, 0x09, 0x8B, 0xC1, 0x9E} +// Unlock combo is two inner thumb keys. +#define VIAL_UNLOCK_COMBO_ROWS { 6, 2 } +#define VIAL_UNLOCK_COMBO_COLS { 11, 5 } diff --git a/keyboards/cheapino/encoder.c b/keyboards/cheapino/encoder.c new file mode 100644 index 00000000000..e5920dce49a --- /dev/null +++ b/keyboards/cheapino/encoder.c @@ -0,0 +1,63 @@ +#include "matrix.h" +#include "quantum.h" + +#define COL_SHIFTER ((uint16_t)1) + +#define ENC_ROW 3 +#define ENC_A_COL 2 +#define ENC_B_COL 4 +#define ENC_BUTTON_COL 0 + +static bool colABPressed = false; +static bool encoderPressed = false; + +void clicked(void) { + tap_code(KC_MPLY); +} + +void turned(bool clockwise) { + if (IS_LAYER_ON(6)) { + tap_code(clockwise ? KC_VOLU : KC_VOLD); + } else if (IS_LAYER_ON(3)) { + tap_code16(clockwise ? LCTL(KC_TAB) : LCTL(LSFT(KC_TAB))); + } else if (IS_LAYER_ON(5)) { + tap_code16(clockwise ? LGUI(KC_Y) : LGUI(KC_Z)); + } else { + tap_code16(clockwise ? KC_PGDN : KC_PGUP); + } +} + +void fix_encoder_action(matrix_row_t current_matrix[]) { + matrix_row_t encoder_row = current_matrix[ENC_ROW]; + + if (encoder_row & (COL_SHIFTER << ENC_BUTTON_COL)) { + encoderPressed = true; + } else { + // Only trigger click on release + if (encoderPressed) { + encoderPressed = false; + clicked(); + } + } + + // Check which way the encoder is turned: + bool colA = encoder_row & (COL_SHIFTER << ENC_A_COL); + bool colB = encoder_row & (COL_SHIFTER << ENC_B_COL); + + if (colA && colB) { + colABPressed = true; + } else if (colA) { + if (colABPressed) { + // A+B followed by A means clockwise + colABPressed = false; + turned(true); + } + } else if (colB) { + if (colABPressed) { + // A+B followed by B means counter-clockwise + colABPressed = false; + turned(false); + } + } + current_matrix[ENC_ROW] = 0; +} diff --git a/keyboards/cheapino/encoder.h b/keyboards/cheapino/encoder.h new file mode 100644 index 00000000000..e393e5da2da --- /dev/null +++ b/keyboards/cheapino/encoder.h @@ -0,0 +1,5 @@ +// +// Created by Thomas Haukland on 25/03/2023. +// + +void fix_encoder_action(matrix_row_t current_matrix[]); \ No newline at end of file diff --git a/keyboards/cheapino/halconf.h b/keyboards/cheapino/halconf.h new file mode 100644 index 00000000000..c06a0cbf6cc --- /dev/null +++ b/keyboards/cheapino/halconf.h @@ -0,0 +1,8 @@ + +#pragma once + +#define HAL_USE_PWM TRUE +#define HAL_USE_PAL TRUE +#define HAL_USE_I2C TRUE + +#include_next diff --git a/keyboards/cheapino/info.json b/keyboards/cheapino/info.json new file mode 100644 index 00000000000..22deeaee0b2 --- /dev/null +++ b/keyboards/cheapino/info.json @@ -0,0 +1,93 @@ +{ + "manufacturer": "Thomas Haukland", + "keyboard_name": "Cheapino2", + "maintainer": "tompi", + "bootloader": "rp2040", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "command": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "community_layouts": ["split_3x5_3"], + "matrix_pins": { + "cols": [ + "GP6", + "GP6", + "GP5", + "GP5", + "GP4", + "GP4", + + "GP14", + "GP14", + "GP15", + "GP15", + "GP26", + "GP26" + ], + "rows": ["GP3", "GP1", "GP2", "GP0", "GP27", "GP28", "GP29", "GP8"] + }, + "processor": "RP2040", + "url": "", + "usb": { + "device_version": "2.0.0", + "pid": "0x0000", + "vid": "0xFEE3" + }, + "layouts": { + "LAYOUT_split_3x5_3": { + "layout": [ + { "matrix": [4, 10], "x": 0, "y": 0.25 }, + { "matrix": [4, 9], "x": 1, "y": 0.125 }, + { "matrix": [4, 8], "x": 2, "y": 0 }, + { "matrix": [4, 7], "x": 3, "y": 0.125 }, + { "matrix": [4, 6], "x": 4, "y": 0.25 }, + + { "matrix": [0, 0], "x": 7, "y": 0.25 }, + { "matrix": [0, 1], "x": 8, "y": 0.125 }, + { "matrix": [0, 2], "x": 9, "y": 0 }, + { "matrix": [0, 3], "x": 10, "y": 0.125 }, + { "matrix": [0, 4], "x": 11, "y": 0.25 }, + + + { "matrix": [5, 10], "x": 0, "y": 1.25 }, + { "matrix": [5, 9], "x": 1, "y": 1.125 }, + { "matrix": [5, 8], "x": 2, "y": 1 }, + { "matrix": [5, 7], "x": 3, "y": 1.125 }, + { "matrix": [5, 6], "x": 4, "y": 1.25 }, + + { "matrix": [1, 0], "x": 7, "y": 1.25 }, + { "matrix": [1, 1], "x": 8, "y": 1.125 }, + { "matrix": [1, 2], "x": 9, "y": 1 }, + { "matrix": [1, 3], "x": 10, "y": 1.125 }, + { "matrix": [1, 4], "x": 11, "y": 1.25 }, + + + { "matrix": [6, 10], "x": 0, "y": 2.25 }, + { "matrix": [6, 9], "x": 1, "y": 2.125 }, + { "matrix": [6, 8], "x": 2, "y": 2 }, + { "matrix": [6, 7], "x": 3, "y": 2.125 }, + { "matrix": [6, 6], "x": 4, "y": 2.25 }, + + { "matrix": [2, 0], "x": 7, "y": 2.25 }, + { "matrix": [2, 1], "x": 8, "y": 2.125 }, + { "matrix": [2, 2], "x": 9, "y": 2 }, + { "matrix": [2, 3], "x": 10, "y": 2.125 }, + { "matrix": [2, 4], "x": 11, "y": 2.25 }, + + + { "matrix": [6, 11], "x": 2.5, "y": 3.25 }, + { "matrix": [5, 11], "x": 3.5, "y": 3.5 }, + { "matrix": [4, 11], "x": 4.5, "y": 3.75 }, + + { "matrix": [0, 5], "x": 6.5, "y": 3.75 }, + { "matrix": [1, 5], "x": 7.5, "y": 3.5 }, + { "matrix": [2, 5], "x": 8.5, "y": 3.25 } + ] + } + } +} diff --git a/keyboards/cheapino/keymaps/default/keymap.json b/keyboards/cheapino/keymaps/default/keymap.json new file mode 100644 index 00000000000..b87ddaa1036 --- /dev/null +++ b/keyboards/cheapino/keymaps/default/keymap.json @@ -0,0 +1,277 @@ +{ + "version": 1, + "notes": "Cheapino default keymap", + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", + "keyboard": "bastardkb/skeletyl/blackpill", + "keymap": "default", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_Y", + "KC_U", + "KC_I", + "KC_O", + "KC_P", + "LGUI_T(KC_A)", + "LALT_T(KC_S)", + "LCTL_T(KC_D)", + "LSFT_T(KC_F)", + "KC_G", + "KC_H", + "RSFT_T(KC_J)", + "LCTL_T(KC_K)", + "LALT_T(KC_L)", + "LGUI_T(KC_SCLN)", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "KC_B", + "LT(1,KC_N)", + "KC_M", + "KC_COMM", + "KC_DOT", + "KC_SLSH", + "KC_ESC", + "LT(3,KC_SPC)", + "KC_TAB", + "LT(1,KC_DEL)", + "LT(2,KC_BSPC)", + "KC_ENT" + ], + [ + "KC_VOLU", + "KC_WH_L", + "KC_MS_U", + "KC_WH_U", + "KC_WH_R", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "ANY(QK_RBT)", + "KC_MS_L", + "KC_BTN2", + "KC_BTN1", + "KC_MS_R", + "KC_MUTE", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_VOLD", + "KC_MNXT", + "KC_MS_D", + "KC_WH_D", + "KC_MPLY", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_HOME", + "KC_DEL", + "KC_PGUP", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LEFT", + "KC_UP", + "KC_RGHT", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_END", + "KC_DOWN", + "KC_PGDN", + "KC_NO", + "KC_NO", + "KC_BTN1", + "KC_BTN2", + "KC_BTN3", + "KC_BTN4", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_WH_U", + "KC_AT", + "KC_UNDS", + "KC_PIPE", + "KC_GRV", + "KC_PERC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_HASH", + "KC_TAB", + "KC_EXLM", + "KC_DQUO", + "KC_DLR", + "KC_BTN4", + "KC_BTN3", + "KC_BTN2", + "KC_BTN1", + "KC_WH_D", + "KC_TILD", + "KC_QUOT", + "KC_BSLS", + "KC_SLSH", + "KC_AMPR", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_EQL", + "KC_CIRC", + "KC_LT", + "KC_GT", + "KC_SCLN", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LCBR", + "KC_RCBR", + "KC_LPRN", + "KC_RPRN", + "KC_AT", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_MINS", + "KC_EXLM", + "KC_LBRC", + "KC_RBRC", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO" + ], + [ + "ANY(QK_RBT)", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_F7", + "KC_F8", + "KC_F9", + "KC_F10", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_F4", + "KC_F5", + "KC_F6", + "KC_F11", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_F1", + "KC_F2", + "KC_F3", + "KC_F12", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "RGB_SPI", + "RGB_VAI", + "RGB_SAI", + "RGB_HUI", + "RGB_MOD", + "KC_PPLS", + "KC_P7", + "KC_P8", + "KC_P9", + "KC_PAST", + "EE_CLR", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_PMNS", + "KC_P4", + "KC_P5", + "KC_P6", + "KC_PSLS", + "RGB_SPD", + "RGB_VAD", + "RGB_SAD", + "RGB_HUD", + "RGB_RMOD", + "KC_PDOT", + "KC_P1", + "KC_P2", + "KC_P3", + "KC_PEQL", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_0", + "KC_COMM", + "KC_P0" + ] + ], + "author": "thomas.haukland@gmail.com" +} diff --git a/keyboards/cheapino/keymaps/lars/config.h b/keyboards/cheapino/keymaps/lars/config.h new file mode 100644 index 00000000000..4e9af1f6be2 --- /dev/null +++ b/keyboards/cheapino/keymaps/lars/config.h @@ -0,0 +1,51 @@ +/* +Copyright 2020 Pierre Chevalier + +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 . +*/ + +#pragma once +// Set the mouse settings to a comfortable speed/accuracy trade-off, +// assuming a screen refresh rate of 60 Htz or higher +// The default is 50. This makes the mouse ~3 times faster and more accurate +#define MOUSEKEY_INTERVAL 16 +// The default is 20. Since we made the mouse about 3 times faster with the previous setting, +// give it more time to accelerate to max speed to retain precise control over short distances. +#define MOUSEKEY_TIME_TO_MAX 40 +// The default is 300. Let's try and make this as low as possible while keeping the cursor responsive +#define MOUSEKEY_DELAY 100 +// It makes sense to use the same delay for the mouseweel +#define MOUSEKEY_WHEEL_DELAY 100 +// The default is 100 +#define MOUSEKEY_WHEEL_INTERVAL 50 +// The default is 40 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 100 + +// Pick good defaults for enabling homerow modifiers +#undef TAPPING_TERM +#define TAPPING_TERM 200 +// #define PERMISSIVE_HOLD + +#define TAPPING_FORCE_HOLD +//#define RETRO_TAPPING + +// Underglow configuration +#ifdef RGBLIGHT_ENABLE + #define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 +#endif + +//#define UNICODE_SELECTED_MODES UC_MAC diff --git a/keyboards/cheapino/keymaps/lars/keymap.json b/keyboards/cheapino/keymaps/lars/keymap.json new file mode 100644 index 00000000000..a78df9d539e --- /dev/null +++ b/keyboards/cheapino/keymaps/lars/keymap.json @@ -0,0 +1,125 @@ +{ + "version": 1, + "notes": "My awesome keymap", + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", + "keyboard": "bastardkb/skeletyl/blackpill", + "keymap": "default", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", + "KC_W", + "KC_F", + "KC_P", + "KC_B", + "KC_J", + "KC_L", + "KC_U", + "KC_Y", + "KC_SCLN", + "KC_A", + "KC_R", + "KC_S", + "KC_T", + "KC_G", + "KC_M", + "KC_N", + "KC_E", + "KC_I", + "KC_O", + "LSFT_T(KC_Z)", + "LCTL_T(KC_X)", + "RALT_T(KC_C)", + "KC_D", + "KC_V", + "KC_K", + "KC_H", + "RALT_T(KC_COMM)", + "LCTL_T(KC_DOT)", + "LSFT_T(KC_SLSH)", + "TO(1)", + "KC_BSPC", + "KC_TAB", + "KC_LGUI", + "KC_SPC", + "KC_ENT" + ], + [ + "KC_TRNS", + "KC_7", + "KC_8", + "KC_9", + "KC_TRNS", + "KC_QUOT", + "KC_MINS", + "KC_EQL", + "KC_ASTR", + "KC_CIRC", + "KC_TRNS", + "KC_4", + "KC_5", + "KC_6", + "KC_0", + "KC_BSLS", + "KC_LPRN", + "KC_RPRN", + "KC_LBRC", + "KC_RBRC", + "KC_LSFT", + "KC_1", + "KC_2", + "KC_3", + "KC_TRNS", + "KC_PIPE", + "KC_GRV", + "KC_LALT", + "KC_LCTL", + "KC_RSFT", + "TO(2)", + "KC_BSPC", + "KC_TAB", + "KC_DEL", + "TO(0)", + "KC_ENT" + ], + [ + "KC_TRNS", + "KC_TRNS", + "KC_PGUP", + "KC_TRNS", + "KC_TRNS", + "ANY(UC(0xE6))", + "ANY(UC(0xF8))", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_LEFT", + "KC_UP", + "KC_DOWN", + "KC_RGHT", + "KC_TRNS", + "KC_TRNS", + "KC_LGUI", + "ANY(UC(0xE5))", + "LCTL(KC_LALT)", + "LCA(KC_LSFT)", + "KC_TRNS", + "KC_HOME", + "KC_PGDN", + "KC_END", + "KC_TRNS", + "KC_TRNS", + "KC_RBRC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TAB", + "KC_DEL", + "TO(0)", + "KC_TRNS" + ] + ], + "author": "thomas.haukland@gmail.com" +} diff --git a/keyboards/cheapino/keymaps/tompi/keymap.json b/keyboards/cheapino/keymaps/tompi/keymap.json new file mode 100644 index 00000000000..99c58c8dc63 --- /dev/null +++ b/keyboards/cheapino/keymaps/tompi/keymap.json @@ -0,0 +1,277 @@ +{ + "version": 1, + "notes": "My awesome keymap", + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", + "keyboard": "bastardkb/skeletyl/blackpill", + "keymap": "default", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", + "KC_W", + "KC_F", + "KC_P", + "KC_B", + "KC_J", + "KC_L", + "KC_U", + "KC_Y", + "KC_SCLN", + "LGUI_T(KC_A)", + "LALT_T(KC_R)", + "LCTL_T(KC_S)", + "LSFT_T(KC_T)", + "KC_G", + "KC_M", + "RSFT_T(KC_N)", + "LCTL_T(KC_E)", + "LALT_T(KC_I)", + "LGUI_T(KC_O)", + "KC_Z", + "KC_X", + "KC_C", + "KC_D", + "LT(5,KC_V)", + "LT(1,KC_K)", + "KC_H", + "KC_COMM", + "KC_DOT", + "KC_SLSH", + "LT(6,KC_ESC)", + "LT(3,KC_SPC)", + "LT(5,KC_TAB)", + "LT(1,KC_DEL)", + "LT(2,KC_BSPC)", + "LT(4,KC_ENT)" + ], + [ + "KC_VOLU", + "KC_WH_L", + "KC_MS_U", + "KC_WH_U", + "KC_WH_R", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "QK_RBT", + "KC_MS_L", + "KC_BTN2", + "KC_BTN1", + "KC_MS_R", + "KC_MUTE", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_VOLD", + "KC_MNXT", + "KC_MS_D", + "KC_WH_D", + "KC_MPLY", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_HOME", + "KC_DEL", + "KC_PGUP", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LEFT", + "KC_UP", + "KC_RGHT", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_END", + "KC_DOWN", + "KC_PGDN", + "KC_NO", + "KC_NO", + "KC_BTN1", + "KC_BTN2", + "KC_BTN3", + "KC_BTN4", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_WH_U", + "KC_AT", + "KC_UNDS", + "KC_PIPE", + "KC_GRV", + "KC_PERC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_HASH", + "KC_TAB", + "KC_EXLM", + "KC_DQUO", + "KC_DLR", + "KC_BTN4", + "KC_BTN3", + "KC_BTN2", + "KC_BTN1", + "KC_WH_D", + "KC_TILD", + "KC_QUOT", + "KC_BSLS", + "KC_SLSH", + "KC_AMPR", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ], + [ + "KC_EQL", + "KC_CIRC", + "KC_LT", + "KC_GT", + "KC_SCLN", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LCBR", + "KC_RCBR", + "KC_LPRN", + "KC_RPRN", + "KC_AT", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_MINS", + "KC_EXLM", + "KC_LBRC", + "KC_RBRC", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO" + ], + [ + "QK_RBT", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_F7", + "KC_F8", + "KC_F9", + "KC_F10", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_F4", + "KC_F5", + "KC_F6", + "KC_F11", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_F1", + "KC_F2", + "KC_F3", + "KC_F12", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS" + ], + [ + "RGB_SPI", + "RGB_VAI", + "RGB_SAI", + "RGB_HUI", + "RGB_MOD", + "KC_PPLS", + "KC_P7", + "KC_P8", + "KC_P9", + "KC_PAST", + "EE_CLR", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_PMNS", + "KC_P4", + "KC_P5", + "KC_P6", + "KC_PSLS", + "RGB_SPD", + "RGB_VAD", + "RGB_SAD", + "RGB_HUD", + "RGB_RMOD", + "KC_PDOT", + "KC_P1", + "KC_P2", + "KC_P3", + "KC_PEQL", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_0", + "KC_COMM", + "KC_P0" + ] + ], + "author": "thomas.haukland@gmail.com" +} \ No newline at end of file diff --git a/keyboards/cheapino/keymaps/via/keymap.json b/keyboards/cheapino/keymaps/via/keymap.json new file mode 100644 index 00000000000..5167b7956c4 --- /dev/null +++ b/keyboards/cheapino/keymaps/via/keymap.json @@ -0,0 +1,163 @@ +{ + "version": 1, + "notes": "Cheapino default keymap", + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", + "keyboard": "bastardkb/skeletyl/blackpill", + "keymap": "via", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_Y", + "KC_U", + "KC_I", + "KC_O", + "KC_P", + "LGUI_T(KC_A)", + "LALT_T(KC_S)", + "LCTL_T(KC_D)", + "LSFT_T(KC_F)", + "KC_G", + "KC_H", + "RSFT_T(KC_J)", + "LCTL_T(KC_K)", + "LALT_T(KC_L)", + "LGUI_T(KC_SCLN)", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "LT(5,KC_B)", + "LT(1,KC_N)", + "KC_M", + "KC_COMM", + "KC_DOT", + "KC_SLSH", + "LT(6,KC_ESC)", + "LT(3,KC_SPC)", + "LT(5,KC_TAB)", + "LT(1,KC_DEL)", + "LT(2,KC_BSPC)", + "LT(4,KC_ENT)" + ], + [ + "KC_VOLU", + "KC_WH_L", + "KC_MS_U", + "KC_WH_U", + "KC_WH_R", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "ANY(QK_RBT)", + "KC_MS_L", + "KC_BTN2", + "KC_BTN1", + "KC_MS_R", + "KC_MUTE", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_VOLD", + "KC_MNXT", + "KC_MS_D", + "KC_WH_D", + "KC_MPLY", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_HOME", + "KC_DEL", + "KC_PGUP", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LEFT", + "KC_UP", + "KC_RGHT", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_END", + "KC_DOWN", + "KC_PGDN", + "KC_NO", + "KC_NO", + "KC_BTN1", + "KC_BTN2", + "KC_BTN3", + "KC_BTN4", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_WH_U", + "KC_AT", + "KC_UNDS", + "KC_PIPE", + "KC_GRV", + "KC_PERC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_HASH", + "KC_TAB", + "KC_EXLM", + "KC_DQUO", + "KC_DLR", + "KC_BTN4", + "KC_BTN3", + "KC_BTN2", + "KC_BTN1", + "KC_WH_D", + "KC_TILD", + "KC_QUOT", + "KC_BSLS", + "KC_SLSH", + "KC_AMPR", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ] + ], + "author": "thomas.haukland@gmail.com" +} diff --git a/keyboards/cheapino/keymaps/vial/keymap.json b/keyboards/cheapino/keymaps/vial/keymap.json new file mode 100644 index 00000000000..5167b7956c4 --- /dev/null +++ b/keyboards/cheapino/keymaps/vial/keymap.json @@ -0,0 +1,163 @@ +{ + "version": 1, + "notes": "Cheapino default keymap", + "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", + "keyboard": "bastardkb/skeletyl/blackpill", + "keymap": "via", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", + "KC_W", + "KC_E", + "KC_R", + "KC_T", + "KC_Y", + "KC_U", + "KC_I", + "KC_O", + "KC_P", + "LGUI_T(KC_A)", + "LALT_T(KC_S)", + "LCTL_T(KC_D)", + "LSFT_T(KC_F)", + "KC_G", + "KC_H", + "RSFT_T(KC_J)", + "LCTL_T(KC_K)", + "LALT_T(KC_L)", + "LGUI_T(KC_SCLN)", + "KC_Z", + "KC_X", + "KC_C", + "KC_V", + "LT(5,KC_B)", + "LT(1,KC_N)", + "KC_M", + "KC_COMM", + "KC_DOT", + "KC_SLSH", + "LT(6,KC_ESC)", + "LT(3,KC_SPC)", + "LT(5,KC_TAB)", + "LT(1,KC_DEL)", + "LT(2,KC_BSPC)", + "LT(4,KC_ENT)" + ], + [ + "KC_VOLU", + "KC_WH_L", + "KC_MS_U", + "KC_WH_U", + "KC_WH_R", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "ANY(QK_RBT)", + "KC_MS_L", + "KC_BTN2", + "KC_BTN1", + "KC_MS_R", + "KC_MUTE", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_VOLD", + "KC_MNXT", + "KC_MS_D", + "KC_WH_D", + "KC_MPLY", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_HOME", + "KC_DEL", + "KC_PGUP", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_LEFT", + "KC_UP", + "KC_RGHT", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_END", + "KC_DOWN", + "KC_PGDN", + "KC_NO", + "KC_NO", + "KC_BTN1", + "KC_BTN2", + "KC_BTN3", + "KC_BTN4", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO", + "KC_NO", + "KC_NO" + ], + [ + "KC_NO", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_WH_U", + "KC_AT", + "KC_UNDS", + "KC_PIPE", + "KC_GRV", + "KC_PERC", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "KC_TRNS", + "RGB_TOG", + "KC_HASH", + "KC_TAB", + "KC_EXLM", + "KC_DQUO", + "KC_DLR", + "KC_BTN4", + "KC_BTN3", + "KC_BTN2", + "KC_BTN1", + "KC_WH_D", + "KC_TILD", + "KC_QUOT", + "KC_BSLS", + "KC_SLSH", + "KC_AMPR", + "KC_NO", + "KC_NO", + "KC_NO", + "KC_TRNS", + "KC_TRNS", + "KC_NO" + ] + ], + "author": "thomas.haukland@gmail.com" +} diff --git a/keyboards/cheapino/keymaps/vial/vial.json b/keyboards/cheapino/keymaps/vial/vial.json new file mode 100644 index 00000000000..e038aa386f3 --- /dev/null +++ b/keyboards/cheapino/keymaps/vial/vial.json @@ -0,0 +1,31 @@ +{ + "name": "Cheapino2", + "vendorId": "0xFEE3", + "productId": "0x0001", + "matrix": { + "cols": 12, + "rows": 7 + }, + "layouts": { + "keymap": [ + [{"y":1,"x":3.5},"4,8",{"x":8.5},"0,2"], + [{"y":-0.875,"x":2.5},"4,9",{"x":1},"4,7",{"x":6.5},"0,1",{"x":1},"0,3"], + [{"y":-0.875,"x":5.5},"4,6",{"x":4.5},"0,0"], + [{"y":-0.875,"x":1.5},"4,10",{"x":12.5},"0,4"], + [{"y":-0.375,"x":3.5},"5,8",{"x":8.5},"1,2"], + [{"y":-0.875,"x":2.5},"5,9",{"x":1},"5,7",{"x":6.5},"1,1",{"x":1},"1,3"], + [{"y":-0.875,"x":5.5},"5,6",{"x":4.5},"1,0"], + [{"y":-0.875,"x":1.5},"5,10",{"x":12.5},"1,4"], + [{"y":-0.375,"x":3.5},"6,8",{"x":8.5},"2,2"], + [{"y":-0.875,"x":2.5},"6,9",{"x":1},"6,7",{"x":6.5},"2,1",{"x":1},"2,3"], + [{"y":-0.875,"x":5.5},"6,6",{"x":4.5},"2,0"], + [{"y":-0.875,"x":1.5},"6,10",{"x":12.5},"2,4"], + [{"rx":3.2,"ry":5.4,"y":-1,"x":2},"6,11"], + [{"r":9,"rx":4.3,"ry":5.1,"y":-1,"x":2},"5,11"], + [{"r":18,"rx":5.4,"ry":5,"y":-1,"x":2},"4,11"], + [{"r": 0,"rx":9.3,"ry":5.4,"y":-1,"x":2},"2,5"], + [{"r": -9,"rx":9.3,"ry":5.7,"y":-1,"x":1},"1,5"], + [{"r": -18,"rx":9.3,"ry":5.9,"y":-1,"x":0},"0,5"] + ] + } +} diff --git a/keyboards/cheapino/matrix.c b/keyboards/cheapino/matrix.c new file mode 100644 index 00000000000..21f91500884 --- /dev/null +++ b/keyboards/cheapino/matrix.c @@ -0,0 +1,147 @@ +/* +Copyright 2012 Jun Wako +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 . + + Copied from here: https://github.com/e3w2q/qmk_firmware/blob/762fe3e0a7cbea768245a75520f06ff5a2f00b9f/keyboards/2x3test/matrix.c +*/ + +/* + * scan matrix + */ +#include +#include +#include "wait.h" +#include "util.h" +#include "matrix.h" +#include "config.h" +#include "quantum.h" +#include "debounce.h" +#include "encoder.h" +#include "print.h" + +// How long the scanning code waits for changed io to settle. +#define MATRIX_IO_DELAY 30 + +#define COL_SHIFTER ((uint16_t)1) + +static const pin_t row_pins[] = MATRIX_ROW_PINS; +static const pin_t col_pins[] = MATRIX_COL_PINS; +static matrix_row_t previous_matrix[MATRIX_ROWS]; + +static void select_row(uint8_t row) { + setPinOutput(row_pins[row]); + writePinLow(row_pins[row]); +} + +static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); } + +static void unselect_rows(void) { + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + setPinInputHigh(row_pins[x]); + } +} + +static void select_col(uint8_t col) { + setPinOutput(col_pins[col]); + writePinLow(col_pins[col]); +} + +static void unselect_col(uint8_t col) { + setPinInputHigh(col_pins[col]); +} + +static void unselect_cols(void) { + for (uint8_t x = 0; x < MATRIX_COLS/2; x++) { + setPinInputHigh(col_pins[x*2]); + } +} + +static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { + // Select row and wait for row selection to stabilize + select_row(current_row); + wait_us(MATRIX_IO_DELAY); + + // For each col... + for (uint8_t col_index = 0; col_index < MATRIX_COLS / 2; col_index++) { + uint16_t column_index_bitmask = COL_SHIFTER << ((col_index * 2) + 1); + // Check row pin state + if (readPin(col_pins[col_index*2])) { + // Pin HI, clear col bit + current_matrix[current_row] &= ~column_index_bitmask; + } else { + // Pin LO, set col bit + current_matrix[current_row] |= column_index_bitmask; + } + } + + // Unselect row + unselect_row(current_row); +} + +static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { + // Select col and wait for col selection to stabilize + select_col(current_col*2); + wait_us(MATRIX_IO_DELAY); + + uint16_t column_index_bitmask = COL_SHIFTER << (current_col * 2); + // For each row... + for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { + // Check row pin state + if (readPin(row_pins[row_index])) { + // Pin HI, clear col bit + current_matrix[row_index] &= ~column_index_bitmask; + } else { + // Pin LO, set col bit + current_matrix[row_index] |= column_index_bitmask; + } + } + // Unselect col + unselect_col(current_col*2); +} + + +void matrix_init_custom(void) { + // initialize key pins + unselect_cols(); + unselect_rows(); + debounce_init(MATRIX_ROWS); +} + +void store_old_matrix(matrix_row_t current_matrix[]) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + previous_matrix[i] = current_matrix[i]; + } +} + +bool has_matrix_changed(matrix_row_t current_matrix[]) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + if (previous_matrix[i] != current_matrix[i]) return true; + } + return false; +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + store_old_matrix(current_matrix); + // Set row, read cols + for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { + read_cols_on_row(current_matrix, current_row); + } + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS/2; current_col++) { + read_rows_on_col(current_matrix, current_col); + } + + fix_encoder_action(current_matrix); + + return has_matrix_changed(current_matrix); +} + diff --git a/keyboards/cheapino/mcuconf.h b/keyboards/cheapino/mcuconf.h new file mode 100644 index 00000000000..7ed3f874511 --- /dev/null +++ b/keyboards/cheapino/mcuconf.h @@ -0,0 +1,6 @@ + #pragma once + +#include_next + +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 TRUE diff --git a/keyboards/cheapino/readme.md b/keyboards/cheapino/readme.md new file mode 100644 index 00000000000..4901584a1ca --- /dev/null +++ b/keyboards/cheapino/readme.md @@ -0,0 +1,27 @@ +# cheapino + +![cheapino](imgur.com image replace me!) + +*A short description of the keyboard/project* + +* Keyboard Maintainer: [Thomas Haukland](https://github.com/tompi) +* Hardware Supported: *The PCBs, controllers supported* +* Hardware Availability: *Links to where you can find this hardware* + +Make example for this keyboard (after setting up your build environment): + + make cheapino:default + +Flashing example for this keyboard: + + make cheapino:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cheapino/rules.mk b/keyboards/cheapino/rules.mk new file mode 100644 index 00000000000..e46d27ab62a --- /dev/null +++ b/keyboards/cheapino/rules.mk @@ -0,0 +1,10 @@ +CAPS_WORD_ENABLE = yes +CUSTOM_MATRIX = lite +WS2812_DRIVER = vendor +RGBLIGHT_ENABLE = yes +DEFERRED_EXEC_ENABLE = yes +VIA_ENABLE = yes +VIAL_ENABLE = yes +VIAL_INSECURE = yet +SRC += encoder.c +SRC += matrix.c diff --git a/keyboards/cheapino/via.json b/keyboards/cheapino/via.json new file mode 100644 index 00000000000..1fe92920e52 --- /dev/null +++ b/keyboards/cheapino/via.json @@ -0,0 +1,31 @@ +{ + "name": "Cheapino2", + "vendorId": "0xFEE3", + "productId": "0x0001", + "matrix": { + "cols": 12, + "rows": 8 + }, + "layouts": { + "keymap": [ + [{"y":1,"x":3.5},"4,8",{"x":8.5},"0,2"], + [{"y":-0.875,"x":2.5},"4,9",{"x":1},"4,7",{"x":6.5},"0,1",{"x":1},"0,3"], + [{"y":-0.875,"x":5.5},"4,6",{"x":4.5},"0,0"], + [{"y":-0.875,"x":1.5},"4,10",{"x":12.5},"0,4"], + [{"y":-0.375,"x":3.5},"5,8",{"x":8.5},"1,2"], + [{"y":-0.875,"x":2.5},"5,9",{"x":1},"5,7",{"x":6.5},"1,1",{"x":1},"1,3"], + [{"y":-0.875,"x":5.5},"5,6",{"x":4.5},"1,0"], + [{"y":-0.875,"x":1.5},"5,10",{"x":12.5},"1,4"], + [{"y":-0.375,"x":3.5},"6,8",{"x":8.5},"2,2"], + [{"y":-0.875,"x":2.5},"6,9",{"x":1},"6,7",{"x":6.5},"2,1",{"x":1},"2,3"], + [{"y":-0.875,"x":5.5},"6,6",{"x":4.5},"2,0"], + [{"y":-0.875,"x":1.5},"6,10",{"x":12.5},"2,4"], + [{"rx":3.2,"ry":5.4,"y":-1,"x":2},"6,11"], + [{"r":9,"rx":4.3,"ry":5.1,"y":-1,"x":2},"5,11"], + [{"r":18,"rx":5.4,"ry":5,"y":-1,"x":2},"4,11"], + [{"r": 0,"rx":9.3,"ry":5.4,"y":-1,"x":2},"2,5"], + [{"r": -9,"rx":9.3,"ry":5.7,"y":-1,"x":1},"1,5"], + [{"r": -18,"rx":9.3,"ry":5.9,"y":-1,"x":0},"0,5"] + ] + } +}