# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT

mainmenu "ZMK Firmware"

menu "ZMK"

menu "Basic Keyboard Setup"

config ZMK_KEYBOARD_NAME
	string "Keyboard Name"

config USB_DEVICE_PRODUCT
	default ZMK_KEYBOARD_NAME

config BT_DEVICE_NAME
	default ZMK_KEYBOARD_NAME

config USB_DEVICE_VID
	default 0x1D50

config USB_DEVICE_PID
	default 0x615E

config USB_DEVICE_MANUFACTURER
	default "ZMK Project"

menu "HID"

choice ZMK_HID_REPORT_TYPE
	prompt "HID Report Type"

config ZMK_HID_REPORT_TYPE_HKRO
	bool "#-Key Roll Over (HKRO) HID Report"
	help
	  Enable # key roll over for HID report. This selection is "boot keyboard" compatible
	  but limits the total number of possible keys to report as held to #.

config ZMK_HID_REPORT_TYPE_NKRO
	bool "Full N-Key Roll Over (NKRO) HID Report"
	help
	  Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard
	  from working with some BIOS/UEFI versions that only support "boot keyboard" support.
	  This option also prevents using some infrequently used higher range HID usages.

endchoice

if ZMK_HID_REPORT_TYPE_HKRO

config ZMK_HID_KEYBOARD_REPORT_SIZE
	int "# Keyboard Keys Reportable"
	default 6

endif

config ZMK_HID_CONSUMER_REPORT_SIZE
	int "# Consumer Keys Reportable"
	default 6


choice ZMK_HID_CONSUMER_REPORT_USAGES
	prompt "HID Report Type"

config ZMK_HID_CONSUMER_REPORT_USAGES_FULL
	bool "Full Consumer HID Usage Support"
	help
	  Enable full Consumer usage ID values to be sent to hosts. Allows for less
	  frequently used usages, but has compatibability issues with some host OSes.

config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC
	bool "Basic Consumer HID Usage Support"
	help
	  Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to
	  hosts. Allows for broader compatibability with more host OSes.

endchoice

menu "Output Types"

config ZMK_USB
	bool "USB"
	select USB
	select USB_DEVICE_STACK
	select USB_DEVICE_HID

if ZMK_USB

config USB_NUMOF_EP_WRITE_RETRIES
	default 10

#ZMK_USB
endif

menuconfig ZMK_BLE
	bool "BLE (HID over GATT)"
	select BT
	select BT_SMP
	select BT_SMP_SC_PAIR_ONLY
	select BT_SMP_APP_PAIRING_ACCEPT
	select BT_PERIPHERAL
	select BT_DIS
	select BT_BAS
	select BT_SETTINGS
	select SETTINGS

if ZMK_BLE

config SYSTEM_WORKQUEUE_STACK_SIZE
	default 2048

config ZMK_BLE_THREAD_STACK_SIZE
	int "BLE notify thread stack size"
	default 512

config ZMK_BLE_THREAD_PRIORITY
	int "BLE notify thread priority"
	default 5

config ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE
	int "Max number of keyboard HID reports to queue for sending over BLE"
	default 20

config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE
	int "Max number of consumer HID reports to queue for sending over BLE"
	default 5

config ZMK_BLE_CLEAR_BONDS_ON_START
	bool "Configuration that clears all bond information from the keyboard on startup."
	default n

# HID GATT notifications sent this way are *not* picked up by Linux, and possibly others.
config BT_GATT_NOTIFY_MULTIPLE
	default n

config BT_DEVICE_APPEARANCE
	default 961

config ZMK_BLE_PASSKEY_ENTRY
	bool "Experimental: Requiring typing passkey from host to pair BLE connection"
	default n

#ZMK_BLE
endif

#Output Types
endmenu

# HID
endmenu

menu "Split Support"

config ZMK_SPLIT
	bool "Split keyboard support"

if ZMK_SPLIT

menuconfig ZMK_SPLIT_BLE
	bool "Split keyboard support via BLE transport"
	depends on ZMK_BLE
	default y
	select BT_USER_PHY_UPDATE

if ZMK_SPLIT_BLE

menuconfig ZMK_SPLIT_BLE_ROLE_CENTRAL
	bool "Central"
	select BT_CENTRAL
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC

if ZMK_SPLIT_BLE_ROLE_CENTRAL

config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE
	int "Max number of key position state events to queue when received from peripherals"
	default 5

config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE
	int "BLE split central write thread stack size"
	default 512

config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE
	int "Max number of behavior run events to queue to send to the peripheral(s)"
	default 5

endif

if !ZMK_SPLIT_BLE_ROLE_CENTRAL

config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE
	int "BLE split peripheral notify thread stack size"
	default 512

config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY
	int "BLE split peripheral notify thread priority"
	default 5

config ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE
	int "Max number of key position state events to queue to send to the central"
	default 10

config ZMK_USB
	default n

config BT_MAX_PAIRED
	default 1

config BT_MAX_CONN
	default 1

config BT_GAP_AUTO_UPDATE_CONN_PARAMS
	default n

#!ZMK_SPLIT_BLE_ROLE_CENTRAL
endif

#ZMK_SPLIT_BLE
endif

#ZMK_SPLIT
endif

if ZMK_BLE

if ZMK_SPLIT_BLE && ZMK_SPLIT_BLE_ROLE_CENTRAL

config BT_MAX_CONN
	default 6

config BT_MAX_PAIRED
	default 6

#ZMK_SPLIT_BLE && ZMK_SPLIT_BLE_ROLE_CENTRAL
endif

if !ZMK_SPLIT_BLE

config BT_MAX_CONN
	default 5

config BT_MAX_PAIRED
	default 5

#!ZMK_SPLIT_BLE
endif

#ZMK_BLE
endif

#Split Support
endmenu

#Basic Keyboard Setup
endmenu

menu "Display/LED Options"

rsource "src/display/Kconfig"

menuconfig ZMK_RGB_UNDERGLOW
	bool "RGB Adressable LED Underglow"
	select LED_STRIP

if ZMK_RGB_UNDERGLOW

# This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this
config SPI
	default y

config ZMK_RGB_UNDERGLOW_EXT_POWER
	bool "RGB underglow toggling also controls external power"
	default y

config ZMK_RGB_UNDERGLOW_BRT_MIN
	int "RGB underglow minimum brightness in percent"
	range 0 100
	default 0

config ZMK_RGB_UNDERGLOW_BRT_MAX
	int "RGB underglow maximum brightness in percent"
	range ZMK_RGB_UNDERGLOW_BRT_MIN 100
	default 100

config ZMK_RGB_UNDERGLOW_HUE_STEP
	int "RGB underglow hue step in degrees"
	range 0 359
	default 10

config ZMK_RGB_UNDERGLOW_SAT_STEP
	int "RGB underglow saturation step in percent"
	range 0 100
	default 10

config ZMK_RGB_UNDERGLOW_BRT_STEP
	int "RGB underglow brightness step in percent"
	range 0 100
	default 10

config ZMK_RGB_UNDERGLOW_HUE_START
	int "RGB underglow start hue value in degrees"
	range 0 359
	default 0

config ZMK_RGB_UNDERGLOW_SAT_START
	int "RGB underglow start saturations value in percent"
	range 0 100
	default 100

config ZMK_RGB_UNDERGLOW_BRT_START
	int "RGB underglow start brightness value in percent"
	range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX
	default ZMK_RGB_UNDERGLOW_BRT_MAX

config ZMK_RGB_UNDERGLOW_SPD_START
	int "RGB underglow start animation speed value"
	range 1 5
	default 3

config ZMK_RGB_UNDERGLOW_EFF_START
	int "RGB underglow start effect int value related to the effect enum list"
	range 0 3
	default 0

config ZMK_RGB_UNDERGLOW_ON_START
	bool "RGB underglow starts on by default"
	default y

#ZMK_RGB_UNDERGLOW
endif

menuconfig ZMK_BACKLIGHT
	bool "LED backlight"
	select LED

if ZMK_BACKLIGHT

config ZMK_BACKLIGHT_BRT_STEP
	int "Brightness step in percent"
	range 1 100
	default 20

config ZMK_BACKLIGHT_BRT_START
	int "Default brightness in percent"
	range 1 100
	default 40

config ZMK_BACKLIGHT_ON_START
	bool "Default backlight state"
	default y

config ZMK_BACKLIGHT_AUTO_OFF_IDLE
	bool "Turn off backlight when keyboard goes into idle state"

config ZMK_BACKLIGHT_AUTO_OFF_USB
	bool "Turn off backlight when USB is disconnected"

#ZMK_BACKLIGHT
endif

#Display/LED Options
endmenu

menu "Power Management"

config ZMK_IDLE_TIMEOUT
	int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)"
	default 30000

config ZMK_SLEEP
	bool "Enable deep sleep support"
	imply USB

if ZMK_SLEEP

choice SYS_PM_POLICY
	default PM_POLICY_APP
endchoice

config PM_DEVICE
	default y

config ZMK_IDLE_SLEEP_TIMEOUT
	int "Milliseconds of inactivity before entering deep sleep"
	default 900000

#ZMK_SLEEP
endif

config ZMK_EXT_POWER
	bool "Enable support to control external power output"
	default y

#Power Management
endmenu

menu "Combo options"

config ZMK_COMBO_MAX_PRESSED_COMBOS
	int "Maximum number of currently pressed combos"
	default 4

config ZMK_COMBO_MAX_COMBOS_PER_KEY
	int "Maximum number of combos per key"
	default 5

config ZMK_COMBO_MAX_KEYS_PER_COMBO
	int "Maximum number of keys per combo"
	default 4

#Combo options
endmenu

menu "Behavior Options"

config ZMK_BEHAVIORS_QUEUE_SIZE
	int "Maximum number of behaviors to allow queueing from a macro or other complex behavior"
	default 64

endmenu

menu "Advanced"

menu "Initialization Priorities"

if USB

config ZMK_USB_INIT_PRIORITY
	int "USB Init Priority"
	default 50

#USB
endif

if ZMK_BLE || ZMK_SPLIT_BLE

config ZMK_BLE_INIT_PRIORITY
	int "BLE Init Priority"
	default 50

#ZMK_BLE || ZMK_SPLIT_BLE
endif

#Initialization Priorities
endmenu

menu "KSCAN Settings"

config ZMK_KSCAN_EVENT_QUEUE_SIZE
	int "Size of the event queue for KSCAN events to buffer events"
	default 4

config ZMK_KSCAN_MOCK_DRIVER
	bool "Enable mock kscan driver to simulate key presses"

config ZMK_KSCAN_COMPOSITE_DRIVER
	bool "Enable composite kscan driver to combine kscan devices"

#KSCAN Settings
endmenu

menu "USB Logging"

config ZMK_USB_LOGGING
	bool "Enable USB CDC ACM logging to help debug"
	select LOG
	select USB
	select USB_DEVICE_STACK
	select USB_CDC_ACM
	select SERIAL
	select CONSOLE
	select UART_INTERRUPT_DRIVEN
	select UART_LINE_CTRL
	select UART_CONSOLE
	select USB_UART_CONSOLE

if ZMK_USB_LOGGING

config ZMK_LOG_LEVEL
	default 4

config USB_CDC_ACM_RINGBUF_SIZE
	default 1024

config USB_CDC_ACM_DEVICE_NAME
	default "CDC_ACM"

config USB_CDC_ACM_DEVICE_COUNT
	default 1

config UART_CONSOLE_ON_DEV_NAME
	default "CDC_ACM_0"

config LOG_BUFFER_SIZE
	default 8192

config LOG_STRDUP_BUF_COUNT
	default 16

#ZMK_USB_LOGGING
endif

#USB Logging
endmenu

if SETTINGS

config ZMK_SETTINGS_SAVE_DEBOUNCE
	int "Milliseconds to debounce settings saves"
	default 60000

#SETTINGS
endif

#Advanced
endmenu

#ZMK
endmenu

config HEAP_MEM_POOL_SIZE
	default 8192

config KERNEL_BIN_NAME
	default "zmk"

config REBOOT
	default y

config USB
	default y if HAS_HW_NRF_USBD

config ZMK_WPM
	bool "Calculate WPM"
	default n

config SENSOR
	default y

choice CBPRINTF_IMPLEMENTATION
	default CBPRINTF_NANO

endchoice

module = ZMK
module-str = zmk
source "subsys/logging/Kconfig.template.log_config"

rsource "boards/Kconfig"
rsource "boards/shields/*/Kconfig.defconfig"
rsource "boards/shields/*/Kconfig.shield"

osource "$(ZMK_CONFIG)/boards/shields/*/Kconfig.defconfig"
osource "$(ZMK_CONFIG)/boards/shields/*/Kconfig.shield"


source "Kconfig.zephyr"