aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2020-04-11hineybush Physix Configurator bugfix (#8761)Gravatar James Young
* file linting * fix object order
2020-04-11quantum/debounce: Added sym_pk debounce algorithm (#8587)Gravatar Purdea Andrei
* quantum/debounce: Added sym_pk debounce algorithm * Apply suggestions from code review Co-Authored-By: Ryan <fauxpark@gmail.com> * quantum/debounce/sym_pk: delete comments and rename functions following code review * quantum/debounce/sym_pk: Modifications for code readability according to code review * quantum/debounce/sym_pk: Modifications for code readability according to code review (2) * quantum/debounce/sym_pk: code review: cleaner code Co-Authored-By: Nick Brassel <nick@tzarc.org> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-04-11[Keymap] fix OLED display on Helix keyboard keymaps default and… (#8737)Gravatar Takeshi ISHII
Since #7773, the mode number of RGBlight is no longer displayed on the Helix OLEDs. I fixed this.
2020-04-10change kbd67 rev1 and rev2 default keymaps (#8758)Gravatar moyi4681
* change kbd67 default keymap
2020-04-11[Keyboard] Add splitish (#8751)Gravatar Reid
* Added personal minivan keymap, and started work on splitish directory * Merge branch 'splitish' of github.com:RSchneyer/qmk_firmware into splitish Trying to undo attempted fix Added splitish keyboard files, removed personal Minivan keymap * Removed personal Minivan keymaps * Fixed small issue in readme * Added changes based on inital PR feedback * forgot a semicolon * Quick config.h file and default keymap update
2020-04-11format code according to conventions [skip ci]Gravatar QMK Bot
2020-04-11Various fixes to how timer differences are calculated (#8585)Gravatar Purdea Andrei
* tmk_core/common: Fixing TIMER_DIFF macro to calculate difference correctly after the timer wraps. Let's go through an example, using the following macro: If the first timer read is 0xe4 and the second one is 0x32, the timer wrapped. If the timer would have had more bits, it's new value would have been 0x132, and the correct difference in time is 0x132 - 0xe4 = 0x4e old code TIMER_DIFF_8(0x32, 0xe4) = 0xff - 0xe4 + 0x32 = 0x4d, which is wrong. new code TIMER_DIFF_8(0x32, 0xe4) = 0xff + 1 - 0xe4 + 0x32 = 0x4e, which is correct. This also gives a chance for a smart compiler to optimize the code using normal integer overflow. For example on AVR, the following C code: uint8_t __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer) { return TIMER_DIFF_8(current_timer, start_timer); } With the original code, it gets translated to the following list of instructions: 00004c6e <test>: 4c6e: 98 2f mov r25, r24 4c70: 86 1b sub r24, r22 4c72: 96 17 cp r25, r22 4c74: 08 f4 brcc .+2 ; 0x4c78 <test+0xa> 4c76: 81 50 subi r24, 0x01 ; 1 4c78: 08 95 ret But with this commit, it gets translated to a single instruction: 00004c40 <test>: 4c40: 86 1b sub r24, r22 4c42: 08 95 ret This unfortunately doesn't always work so nicely, for example the following C code: int __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer) { return TIMER_DIFF_8(current_timer, start_timer); } (Note: return type changed to int) With the original code it gets translated to: 00004c6e <test>: 4c6e: 28 2f mov r18, r24 4c70: 30 e0 ldi r19, 0x00 ; 0 4c72: 46 2f mov r20, r22 4c74: 50 e0 ldi r21, 0x00 ; 0 4c76: 86 17 cp r24, r22 4c78: 20 f0 brcs .+8 ; 0x4c82 <test+0x14> 4c7a: c9 01 movw r24, r18 4c7c: 84 1b sub r24, r20 4c7e: 95 0b sbc r25, r21 4c80: 08 95 ret 4c82: c9 01 movw r24, r18 4c84: 84 1b sub r24, r20 4c86: 95 0b sbc r25, r21 4c88: 81 50 subi r24, 0x01 ; 1 4c8a: 9f 4f sbci r25, 0xFF ; 255 4c8c: 08 95 ret Wth this commit it gets translated to: 00004c40 <test>: 4c40: 28 2f mov r18, r24 4c42: 30 e0 ldi r19, 0x00 ; 0 4c44: 46 2f mov r20, r22 4c46: 50 e0 ldi r21, 0x00 ; 0 4c48: 86 17 cp r24, r22 4c4a: 20 f0 brcs .+8 ; 0x4c54 <test+0x14> 4c4c: c9 01 movw r24, r18 4c4e: 84 1b sub r24, r20 4c50: 95 0b sbc r25, r21 4c52: 08 95 ret 4c54: c9 01 movw r24, r18 4c56: 84 1b sub r24, r20 4c58: 95 0b sbc r25, r21 4c5a: 93 95 inc r25 4c5c: 08 95 ret There is not much performance improvement in this case, however at least with this commit it functions correctly. Note: The following commit will improve compiler output for the latter example. * tmk_core/common: Improve code generation for TIMER_DIFF* macros Because of integer promotion the compiler is having a hard time generating efficient code to calculate TIMER_DIFF* macros in some situations. In the below example, the return value is "int", and this is causing the trouble. Example C code: int __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer) { return TIMER_DIFF_8(current_timer, start_timer); } BEFORE: (with -Os) 00004c40 <test>: 4c40: 28 2f mov r18, r24 4c42: 30 e0 ldi r19, 0x00 ; 0 4c44: 46 2f mov r20, r22 4c46: 50 e0 ldi r21, 0x00 ; 0 4c48: 86 17 cp r24, r22 4c4a: 20 f0 brcs .+8 ; 0x4c54 <test+0x14> 4c4c: c9 01 movw r24, r18 4c4e: 84 1b sub r24, r20 4c50: 95 0b sbc r25, r21 4c52: 08 95 ret 4c54: c9 01 movw r24, r18 4c56: 84 1b sub r24, r20 4c58: 95 0b sbc r25, r21 4c5a: 93 95 inc r25 4c5c: 08 95 ret AFTER: (with -Os) 00004c40 <test>: 4c40: 86 1b sub r24, r22 4c42: 90 e0 ldi r25, 0x00 ; 0 4c44: 08 95 ret Note: the example is showing -Os but improvements can be seen at all optimization levels, including -O0. We never use -O0, but I tested it to make sure that no extra code is generated in that case.OA * quantum/debounce: Fix custom wrapping timers in eager_pr and eager_pk debounce algorithms Please see the below simulated sequence of events: Column A is the 16-bit value returned by read_timer(); Column B is the value returned by custom_wrap_timer_read(); Column C is the original code: (timer_read() % MAX_DEBOUNCE) A, B, C 65530, 19, 30 65531, 20, 31 65532, 21, 32 65533, 22, 33 65534, 23, 34 65535, 24, 35 0 25, 0 1, 26, 1 2, 27, 2 3, 28, 3 4, 29, 4 5, 30, 5 read_timer() wraps about every 1.09 seconds, and so debouncing might fail at these times without this commit. * quantum/debounce/eager_pr and eager_pk: modifications for code readability according to code review. * quantum/debounce/eager_pr and eager_pk: modifications for code readability according to code review. (2)
2020-04-11Some refinements of 75_ansi/spidey3 layout (#8581)Gravatar Joshua Moses Diamond
* First cut at Josh Diamond's KBD75 customizations. Includes: * My unique keymap with ChromeOS specific keys * Use RGB underglow to indicate Caps Lock * Some unicode bindings * Some changes to make debugging easier * Updated spidey3 to be applicable to all 75_ansi boards * Sadly, ChromeOS doesn't pay attention to most consumer codes * Add mac layer; fix flakeyness in CAPS_LOCK underglow. * Make layers.json match the keymap (to the extent possible) * Major cleanup; fix broken debug persistence * Cleanup some whitespace issues * Fix incorrect log message. * Rework layer indication to user RGBLIGHT_LAYERS * Update layouts/community/75_ansi/spidey3/keymap.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * Rename users/spidey3/rgblight.c to layer_rgb.c per suggestion * Refactor to use set_single_persistant_default_layer(). * Use dprint/f to make logging more elegant. * Update users/spidey3/config.h Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update users/spidey3/config.h Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update layouts/community/75_ansi/spidey3/rules.mk Co-Authored-By: Ryan <fauxpark@gmail.com> * Update users/spidey3/spidey3.c Co-Authored-By: Ryan <fauxpark@gmail.com> * Update users/spidey3/layer_rgb.c Co-Authored-By: Ryan <fauxpark@gmail.com> * Update users/spidey3/init.c Co-Authored-By: Ryan <fauxpark@gmail.com> * Changes from code review * Numpad layer, various keys for 75_ansi/spidey3 * Add Fn-B to toggle NKRO * Blink rgb to acknowledge some setting changes * Updated media control & reset key location * Minor cleanup Co-authored-by: Joshua Diamond <jdiamond@Deep-Thought.local> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Ryan <fauxpark@gmail.com>
2020-04-10[Keymap] added vim compatibility, backspace above enter, and general macOS ↵Gravatar Keith Long
opt… (#8080) * added vim compatibility, backspace above enter, and general macOS optimizations on top of default layout * add space65 macOS keymap for vim users with an optimized bottom row * Update keyboards/projectkb/alice/keymaps/keithlo/keymap.c
2020-04-10Modernize ctrl, shift, alt mods detection (#8724)Gravatar foxx1337
2020-04-10Fix spaceman naming (#8741)Gravatar Spaceman
* Fix spaceman naming * Update keyboards/pancake/info.json * Update keyboards/2_milk/info.json
2020-04-09[Keyboard] obuwunkunubi/spaget handwired (#8738)Gravatar Marko Bakan
* adding my keymap * Update keyboards/handwired/obuwunkunubi/spaget/readme.md * Update keyboards/handwired/obuwunkunubi/spaget/readme.md * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/rules.mk * Update rules.mk * Update keyboards/handwired/obuwunkunubi/spaget/spaget.h * Update keyboards/handwired/obuwunkunubi/spaget/spaget.h * Update keyboards/handwired/obuwunkunubi/spaget/info.json * Update keyboards/handwired/obuwunkunubi/spaget/rules.mk * Update rules.mk * Update keyboards/handwired/obuwunkunubi/spaget/spaget.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c * Update keyboards/handwired/obuwunkunubi/spaget/info.json * Update keymap.c * Apply suggestions from code review * Apply suggestions from code review * Update spaget.h * Update keymap.c Updated comments
2020-04-09[Keymap] Update personal userspace and keymaps (#8747)Gravatar Konstantin Đorđević
* Update mousekey parameters in userspace * Disable GRAVE_ESC in boards where it isn't used * Tweak MODERN_DOLCH_RED and reset RGB on Shift+Toggle in KBD6X * Disable RGB controls when Fn/Caps indicator lights are on * Use LTO_ENABLE instead of setting -flto directly * Add led_update_keymap, use SS_LCTL instead of SS_LCTRL * Change TAPPING_TOGGLE from 2 to 3
2020-04-09Add PS2_MOUSE_ROTATE to compensate for device orientation (#8650)Gravatar Manna Harbour
* Add PS2_MOUSE_ROTATE to compensate for device orientation * fixup! Add PS2_MOUSE_ROTATE to compensate for device orientation * Reformat with IndentPPDirectives: AfterHash as per #6316
2020-04-09Add RGB support in via to launchpad (#8621)Gravatar Joshua Rubin
Signed-off-by: Joshua Rubin <me@jawa.dev>
2020-04-09VIA support for the KBDFans KBD6x (#8680)Gravatar George Wietor
* Add VIA keymap * Update VID/PID - Update VID/PID to match other KBDfans keyboards - Flesh out keyboard description * add missing newline. whoops. * Update keyboards/kbdfans/kbd6x/keymaps/via/rules.mk Co-Authored-By: Drashna Jaelre <drashna@live.com> * update author / copyright date * Update keyboards/kbdfans/kbd6x/keymaps/via/rules.mk Co-Authored-By: Ryan <fauxpark@gmail.com> * Update keyboards/kbdfans/kbd6x/keymaps/via/keymap.c Co-Authored-By: Joel Challis <git@zvecr.com> * Update keyboards/kbdfans/kbd6x/kbd6x.h Co-Authored-By: Joel Challis <git@zvecr.com> Co-authored-by: George Wietor <george@light-gray.attlocal.net> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Joel Challis <git@zvecr.com>
2020-04-08Set the correct RGB LED count on YD60MQ (#8629)Gravatar Konstantin Đorđević
* Fix RGB LED count on YD60MQ * Split YD60MQ into 12-LED and 16-LED revisions * Update readmes * Make 12led the default version * Readd base rules.mk, version→variant in readme * Add syntax highlighting to code blocks in readme
2020-04-08[Keymap] Updates to personal keymaps (#8665)Gravatar Yan-Fa Li
2020-04-09Fix compile issues related to NO_ACTION_MACRO/FUNCTION and LTO_ENABLE (#8663)Gravatar Konstantin Đorđević
* Define NO_ACTION_MACRO/FUNCTION in header instead of makefile when LTO is enabled Currently, boards and keymaps that define NO_ACTION_MACRO/FUNCTION unconditionally will not compile with LTO_ENABLE (#8604). This fixes the issue by moving the definitions from common.mk to action.h, which enables us to check for previous definitions of those macros (this cannot be done in a makefile). * Remove LTO checks in templates Since now NO_ACTION_MACRO/FUNCTION are defined as needed in action.h (which is included by quantum.h), checking for LTO in keyboard and user code is no longer required. * Update LTO_ENABLE docs
2020-04-08[Keymap] Userspace update Rgb layers code (#8659)Gravatar stanrc85
* enable rgblight layers * rgblight layers code * switch to new rgblight layers * testing led positions * fix caps typo * lights and colors working * rules updated for different rgb use * Extra spaces removed
2020-04-08Add Choconum (#8709)Gravatar Danny
* Add Choconum * Disable SPI/I2C, add mem fix * Rename layouts * Nuke unused config.h files * Fix username
2020-04-08Add Via keymap for BM16-A (#8681)Gravatar Jared Giles
* Add Via keymap for BM16-A * Apply suggestions from code review Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com> Co-Authored-By: Ryan <fauxpark@gmail.com> * Deleted as per noroadsleft Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: Ryan <fauxpark@gmail.com>
2020-04-08Fix edge-case with configGravatar Erovia
Without this check, users can lock themselves out by enabling developer mode, than disabling the dependencies. They wouldn't be able to turn off developer mode as none of the subcommands (including 'config') would work.
2020-04-08Don't hide for devs...Gravatar Erovia
2020-04-08Apply @skullydazed's suggestions, move 'import milc'Gravatar Erovia
Only 'import milc' after we are sure that the minimum required modules are available, as it depends on a few of them.
2020-04-08Make dedicated sections for user/dev commands in docsGravatar Erovia
2020-04-08Rebase on master, hide some other subcommandsGravatar Erovia
The list of hidden subcommands were approved by @skullydazed ;) Currently hidden if 'user.developer' is not True: - cformat - docs - kle2json - pyformat - pytest
2020-04-08Use milc for config check, requirements fixesGravatar Erovia
Use milc's config finding and parsing to check if the user is a developer or not. 'requirements-dev.txt' will now load 'requirements.txt', so no need to run pip twice. Add missing 'yapf' dependency to 'requirements-dev.txt'.
2020-04-08CLI: Add development mode supportGravatar Erovia
Hide development specific options and don't require dev modules unless `user.developer` is set to `True`.
2020-04-08Update info.json (#8723)Gravatar Salicylic-acid3
Addressed a key shift in the QMK Configurator.
2020-04-08format code according to conventions [skip ci]Gravatar QMK Bot
2020-04-08spi_master for AVR (#8299)Gravatar Ryan
* Change _delay_ms/us() to wait_ms/us() * Switch to platform-agnostic GPIO macros * Add AVR spi_master and migrate Adafruit BLE code * Set verbose back to false * Add clock divisor, bit order and SPI mode configuration for init * Add start and stop functions * Move configuration of mode, endianness and speed to `spi_start()` * Some breaks here would be good * Default Adafruit BLE clock divisor to 4 (2MHz on the Feather 32U4) * Remove mode and divisor enums * Add some docs * No hr at EOF * Add links in sidebar
2020-04-07DennyTom's buttery_engine (#8138)Gravatar DennyTom
* Selectively adding pieces * Adding georgi keymap * Adding more files, fixing make * Smaller makefiles * Fixing make rules * README more inline with QMK's guidelines * Turning off buggy assert * Improving documentation based on a user feedback. * Slightly better schema * Resurrected state machine diagram
2020-04-07add via support for kira80 (#8677)Gravatar elmo-space
* add via support for kira80 * remove redundant raw enable from rules.mk * clean additional layers for via * changed USB Vendor ID
2020-04-07[Keyboard] Wheatfield Split75 (#8511)Gravatar artjomsR
* Added split75 keyboard * tidy up commented out code + removed default * added visual map * proper led functions. more layers for keymap * led functions. moved mod keys to numbers * double tapping toggle + leds on power on * media keys fix * clean up of commented out code and unnecessary functions. readme update. default keymap * removed bootloadHID file * Update keyboards/split75/config.h * Update keyboards/split75/config.h * Update keyboards/split75/config.h * Update keyboards/split75/config.h * removed python flashing script * Update keyboards/split75/keymaps/default/keymap.c * Update keyboards/split75/split75.h * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/default/keymap.c * reintroduced empty matrix_scan_user to default keymap * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/usbconfig.h * Update keyboards/ergodone/config.h * Update keyboards/split75/keymaps/art/keymap.c * updated readme file * Update keyboards/split75/usbconfig.h * Update keyboards/split75/rules.mk * Update keyboards/split75/split75.c * code fix after suggestions * defined tapping toggle as double tap * added info.json * Update keyboards/split75/config.h * fix for leds not displaying properly when initialising * Update keyboards/split75/README.md * Update keyboards/split75/keymaps/default/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * changed product description fields * renamed user functions * indentation fix * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * art keymap update * Update keyboards/split75/config.h * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/split75.c * Update keyboards/split75/keymaps/art/keymap.c * Update keyboards/split75/keymaps/default/keymap.c * Update keyboards/split75/split75.c * Update keyboards/split75/matrix.c * Update keyboards/split75/rules.mk * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/config.h * Update keyboards/split75/split75.c * disable underglow on sleep and enabled backlighting * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * Update keyboards/split75/usbconfig.h * personal keymap update * changed boot animation * consistent whitespace * Tidied up default notes and unnecessary comments * Unique Vendor ID * remove usb config file * corrected manufacturer * Update keyboards/split75/config.h * Update keyboards/split75/README.md * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.c * Update keyboards/split75/split75.h * Update keyboards/split75/split75.h * Update keyboards/split75/split75.h * Update keyboards/split75/split75.c * Update keyboards/split75/matrix.c * Update keyboards/split75/matrix.c * Update keyboards/split75/matrix.c * Update keyboards/split75/matrix.c * Update keyboards/split75/split75.h * Personal keymap restore after refactor * Moved to wheatfield folder + updated readme
2020-04-07Correctly handle json keymaps with ANY()Gravatar skullY
2020-04-07Update C coding conventions to match .clang-format config for i… (#8717)Gravatar Konstantin Đorđević
* Update C coding conventions to match current .clang-format config for indenting PP directives * Make indenting guideline clearer
2020-04-07Update 072 based CannonKeys boards to rely on core QMK support (#8716)Gravatar Andrew Kannan
* Swap CannonKeys 072 boards over to rely on core QMK backlight support * Rename keymap * Rename via_tsangan back to via
2020-04-06Remove keyboard level ws2812 spi drivers (#7694)Gravatar Joel Challis
2020-04-06Refactor cannonkeys f103 boards to use core backlight (#8089)Gravatar Joel Challis
* Refactor to use core backlight * Remove custom implementation
2020-04-06Configurable VIA layout options default value (#8707)Gravatar Wilba
2020-04-06Keymap Update jisplit89 (#8708)Gravatar Salicylic-acid3
Fixed wrong Enter key position.
2020-04-06fix for split-common (#8703)Gravatar Pekaso
2020-04-05add 60_ansi layout to YD60MQ (#8696)Gravatar James Young
2020-04-05format code according to conventions [skip ci]Gravatar QMK Bot
2020-04-05V-USB: Remove some stuff from usbconfig.h that should not be configurable ↵Gravatar Ryan
(#8656) * V-USB: Remove some stuff from usbconfig.h that should not be configurable * Clean up some ifdefs * And some more * Even more
2020-04-05jotix layouts (#8644)Gravatar jotix
* jotix layouts * jotix ortho 4x4 layout * Update layouts/community/ortho_4x4/jotix/keymap.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * jotix Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-04-05Enable memcore to fix malloc/rand crashes (#8695)Gravatar Joel Challis
2020-04-05Doctor: Add avrdude/dfu-util/dfu-programmer version printing (#8678)Gravatar Ryan
* Doctor: Add avrdude/dfu-util/dfu-programmer version printing * Extra newline * Iterate through version checking functions
2020-04-05updated rules.mk and default keymap of Wonderland for VIA support (#8668)Gravatar ThePanduuh
* updated rules.mk and default keymap of Wonderland for VIA support * Restored default keymap and rules.mk, added via keymap folder with modified default keymap and rules.mk, also fixed VendorID in config.h * fixed jargon on layers 3 and 4 of Wonderland VIA keymap * cleaned up via keymap, removed fluff * default keymap for Wonderland restored * removed unnecessary information from rules.mk * made more readable per noroadsleft suggestion Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>