2019-10-05 08:38:34 +02:00
""" Compile and flash QMK Firmware
You can compile a keymap already in the repo or using a QMK Configurator export .
A bootloader must be specified .
"""
import subprocess
2019-12-09 01:31:48 +01:00
from argparse import FileType
2019-10-05 08:38:34 +02:00
import qmk . path
2019-11-20 23:54:18 +01:00
from milc import cli
from qmk . commands import compile_configurator_json , create_make_command , parse_configurator_json
2019-10-05 08:38:34 +02:00
def print_bootloader_help ( ) :
""" Prints the available bootloaders listed in docs.qmk.fm.
"""
cli . log . info ( ' Here are the available bootloaders: ' )
cli . echo ( ' \t dfu ' )
cli . echo ( ' \t dfu-ee ' )
cli . echo ( ' \t dfu-split-left ' )
cli . echo ( ' \t dfu-split-right ' )
cli . echo ( ' \t avrdude ' )
cli . echo ( ' \t BootloadHID ' )
cli . echo ( ' \t dfu-util ' )
cli . echo ( ' \t dfu-util-split-left ' )
cli . echo ( ' \t dfu-util-split-right ' )
cli . echo ( ' \t st-link-cli ' )
cli . echo ( ' For more info, visit https://docs.qmk.fm/#/flashing ' )
2019-11-16 08:10:19 +01:00
2019-10-05 08:38:34 +02:00
@cli.argument ( ' -bl ' , ' --bootloader ' , default = ' flash ' , help = ' The flash command, corresponding to qmk \' s make options of bootloaders. ' )
2019-12-09 01:31:48 +01:00
@cli.argument ( ' filename ' , nargs = ' ? ' , arg_only = True , type = FileType ( ' r ' ) , help = ' The configurator export JSON to compile. ' )
2019-10-05 08:38:34 +02:00
@cli.argument ( ' -km ' , ' --keymap ' , help = ' The keymap to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied. ' )
@cli.argument ( ' -kb ' , ' --keyboard ' , help = ' The keyboard to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied. ' )
@cli.argument ( ' -b ' , ' --bootloaders ' , action = ' store_true ' , help = ' List the available bootloaders. ' )
@cli.subcommand ( ' QMK Flash. ' )
def flash ( cli ) :
""" Compile and or flash QMK Firmware or keyboard/layout
If a Configurator JSON export is supplied this command will create a new keymap . Keymap and Keyboard arguments
will be ignored .
If no file is supplied , keymap and keyboard are expected .
If bootloader is omitted , the one according to the rules . mk will be used .
"""
command = [ ]
if cli . args . bootloaders :
# Provide usage and list bootloaders
cli . echo ( ' usage: qmk flash [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename] ' )
print_bootloader_help ( )
return False
2020-02-08 23:58:28 +01:00
elif cli . config . flash . keymap and not cli . config . flash . keyboard :
2019-10-05 08:38:34 +02:00
# If only a keymap was given but no keyboard, suggest listing keyboards
cli . echo ( ' usage: qmk flash [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename] ' )
cli . log . error ( ' run \' qmk list_keyboards \' to find out the supported keyboards ' )
return False
elif cli . args . filename :
# Get keymap path to log info
user_keymap = parse_configurator_json ( cli . args . filename )
keymap_path = qmk . path . keymap ( user_keymap [ ' keyboard ' ] )
cli . log . info ( ' Creating {fg_cyan} %s {style_reset_all} keymap in {fg_cyan} %s ' , user_keymap [ ' keymap ' ] , keymap_path )
# Convert the JSON into a C file and write it to disk.
2019-12-09 01:31:48 +01:00
command = compile_configurator_json ( user_keymap , cli . args . bootloader )
2019-10-05 08:38:34 +02:00
cli . log . info ( ' Wrote keymap to {fg_cyan} %s / % s/keymap.c ' , keymap_path , user_keymap [ ' keymap ' ] )
2020-02-08 23:58:28 +01:00
elif cli . config . flash . keyboard and cli . config . flash . keymap :
2019-10-05 08:38:34 +02:00
# Generate the make command for a specific keyboard/keymap.
command = create_make_command ( cli . config . flash . keyboard , cli . config . flash . keymap , cli . args . bootloader )
else :
cli . echo ( ' usage: qmk flash [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename] ' )
cli . log . error ( ' You must supply a configurator export or both `--keyboard` and `--keymap`. You can also specify a bootloader with --bootloader. Use --bootloaders to list the available bootloaders. ' )
return False
cli . log . info ( ' Flashing keymap with {fg_cyan} %s \n \n ' , ' ' . join ( command ) )
2019-11-16 08:10:19 +01:00
subprocess . run ( command )