# CANopenNode CANopen protocol stack configuration options

# Copyright (c) 2019 Vestas Wind Systems A/S
# SPDX-License-Identifier: Apache-2.0

config ZEPHYR_CANOPENNODE_MODULE
	bool

config CANOPENNODE
	bool "CANopenNode support"
	depends on CAN && !CAN_FD_MODE
	help
	  This option enables the CANopenNode library.

if CANOPENNODE

config CANOPENNODE_SDO_BUFFER_SIZE
	int "CANopen SDO buffer size"
	default 32
	range 7 889
	help
	  Size of the internal CANopen SDO buffer in bytes. Size must
	  be at least equal to the size of the largest variable in the
	  object dictionary. If data type is DOMAIN, data length is
	  not limited to the SDO buffer size. If block transfer is
	  implemented, value should be set to 889.

config CANOPENNODE_TRACE_BUFFER_SIZE
	int "CANopen trace buffer size"
	default 100
	help
	  Size of the CANopen trace buffer in bytes.

config CANOPENNODE_TX_WORKQUEUE_STACK_SIZE
	int "Stack size for the CANopen transmit workqueue"
	default 512
	help
	  Size of the stack used for the internal CANopen transmit
	  workqueue.

config CANOPENNODE_TX_WORKQUEUE_PRIORITY
	int "Priority for CANopen transmit workqueue"
	default 0 if !COOP_ENABLED
	default -1
	help
	  Priority level of the internal CANopen transmit workqueue.

config CANOPENNODE_STORAGE
	bool "CANopen object dictionary storage"
	depends on SETTINGS
	default y
	help
	  Enable support for storing the CANopen object dictionary to
	  non-volatile storage.

config CANOPENNODE_STORAGE_HANDLER_ERASES_EEPROM
	bool "Erase CANopen object dictionary EEPROM entries in storage handler"
	depends on CANOPENNODE_STORAGE
	help
	  Erase CANopen object dictionary EEPROM entries upon write to
	  object dictionary index 0x1011 subindex 1.

config CANOPENNODE_LEDS
	bool "CANopen LED indicators"
	default y
	help
	  Enable support for CANopen LED indicators according to the CiA
	  303-3 specification.

config CANOPENNODE_LEDS_BICOLOR
	bool "CANopen bicolor LED indicator"
	depends on CANOPENNODE_LEDS
	help
	  Handle CANopen LEDs as one bicolor LED, favoring the red LED
	  over the green LED in accordance with the CiA 303-3
	  specification.

config CANOPENNODE_SYNC_THREAD
	bool "CANopen SYNC thread"
	default y
	help
	  Enable internal thread for processing CANopen SYNC RPDOs and
	  TPDOs. Application layer must take care of SYNC RPDO and
	  TPDO processing on its own if this is disabled.

config CANOPENNODE_SYNC_THREAD_STACK_SIZE
	int "Stack size for the CANopen SYNC thread"
	depends on CANOPENNODE_SYNC_THREAD
	default 512
	help
	  Size of the stack used for the internal thread which
	  processes CANopen SYNC RPDOs and TPDOs.

config CANOPENNODE_SYNC_THREAD_PRIORITY
	int "Priority for CANopen SYNC thread"
	depends on CANOPENNODE_SYNC_THREAD
	default 0 if !COOP_ENABLED
	default -5
	help
	  Priority level of the internal thread which processes
	  CANopen SYNC RPDOs and TPDOs.

config CANOPENNODE_PROGRAM_DOWNLOAD
	bool "CANopen program download"
	depends on BOOTLOADER_MCUBOOT
	select IMG_MANAGER
	default y
	help
	  Enable support for program download over CANopen according
	  to the CiA 302-3 (draft) specification.

endif # CANOPENNODE
