#
# stm32_serialbuffer.py
#
import pioutil
if pioutil.is_pio_build():
	Import("env")

	# Get a build flag's value or None
	def getBuildFlagValue(name):
		for flag in build_flags:
			if isinstance(flag, list) and flag[0] == name:
				return flag[1]

		return None

	# Get an overriding buffer size for RX or TX from the build flags
	def getInternalSize(side):
		return	getBuildFlagValue(f"MF_{side}_BUFFER_SIZE") or \
				getBuildFlagValue(f"SERIAL_{side}_BUFFER_SIZE") or \
				getBuildFlagValue(f"USART_{side}_BUF_SIZE")

	# Get the largest defined buffer size for RX or TX
	def getBufferSize(side, default):
		# Get a build flag value or fall back to the given default
		internal = int(getInternalSize(side) or default)
		flag = side + "_BUFFER_SIZE"
		# Return the largest value
		return max(int(mf[flag]), internal) if flag in mf else internal

	# Add a build flag if it's not already defined
	def tryAddFlag(name, value):
		if getBuildFlagValue(name) is None:
			env.Append(BUILD_FLAGS=[f"-D{name}={value}"])

	# Marlin uses the `RX_BUFFER_SIZE` \ `TX_BUFFER_SIZE` options to
	# configure buffer sizes for receiving \ transmitting serial data.
	# Stm32duino uses another set of defines for the same purpose, so this
	# script gets the values from the configuration and uses them to define
	# `SERIAL_RX_BUFFER_SIZE` and `SERIAL_TX_BUFFER_SIZE` as global build
	# flags so they are available for use by the platform.
	#
	# The script will set the value as the default one (64 bytes)
	# or the user-configured one, whichever is higher.
	#
	# Marlin's default buffer sizes are 128 for RX and 32 for TX.
	# The highest value is taken (128/64).
	#
	# If MF_*_BUFFER_SIZE, SERIAL_*_BUFFER_SIZE, USART_*_BUF_SIZE, are
	# defined, the first of these values will be used as the minimum.
	build_flags = env.ParseFlags(env.get('BUILD_FLAGS'))["CPPDEFINES"]
	mf = env["MARLIN_FEATURES"]

	# Get the largest defined buffer sizes for RX or TX, using defaults for undefined
	rxBuf = getBufferSize("RX", 128)
	txBuf = getBufferSize("TX",  64)

	# Provide serial buffer sizes to the stm32duino platform
	tryAddFlag("SERIAL_RX_BUFFER_SIZE", rxBuf)
	tryAddFlag("SERIAL_TX_BUFFER_SIZE", txBuf)
	tryAddFlag("USART_RX_BUF_SIZE", rxBuf)
	tryAddFlag("USART_TX_BUF_SIZE", txBuf)
