#!nsh
#
# Standard startup script for PX4FMU v1, v2, v3, v4 onboard sensor drivers.
#

if ver hwcmp PX4FMU_V1
then
	if ms5611 start
	then
	fi

else
	if ver hwcmp AEROFC_V1
	then
		# Aero FC uses separate driver
	else
		if ver hwcmp CRAZYFLIE
		then
			# Crazyflie uses separate driver
		else
			# Configure all I2C buses to 100 KHz as they
			# are all external or slow
			fmu i2c 1 100000
			fmu i2c 2 100000
		fi

		if ver hwcmp PX4FMU_V4
		then
			# We know there are sketchy boards out there
			# as chinese companies produce Pixracers without
			# fully understanding the critical parts of the
			# schematic and BOM, leading to sensor brownouts
			# on boot. Original Pixracers following the
			# open hardware design do not require this.
			fmu sensor_reset 50
		fi

		# External SPI
		if ms5611 -S start
		then
		fi

		# Internal SPI
		if ms5611 -s start
		then
		fi

		# Blacksheep telemetry
		if bst start
		then
		fi
	fi
fi

if adc start
then
fi

if ver hwcmp AUAV_X21
then
	# I2C bus
	if hmc5883 -C -T start
	then
	fi

	# I2C bus
	if lis3mdl start
	then
	fi

	# Internal SPI bus ICM-20608-G is rotated 90 deg yaw
	if mpu6000 -R 2 -T 20608 start
	then
	fi

	# Internal SPI bus mpu9250 is rotated 90 deg yaw
	if mpu9250 -R 2 start
	then
	fi
fi

if ver hwcmp PX4FMU_V2
then
	# External I2C bus
	if hmc5883 -C -T -X start
	then
	fi

	# External I2C bus
	if lis3mdl -X start
	then
	fi

	# Internal I2C bus
	if hmc5883 -C -T -I -R 4 start
	then
	fi

	# Internal SPI bus ICM-20608-G
	if mpu6000 -T 20608 start
	then
	fi

	# external MPU6K is rotated 180 degrees yaw
	if mpu6000 -S -R 4 start
	then
		set BOARD_FMUV3 true
	else
		# Check for Pixhawk 2.1 board
		if mpu9250 -S -R 4 start
		then
			set BOARD_FMUV3 true
		else
			set BOARD_FMUV3 false
		fi
	fi

	if [ $BOARD_FMUV3 == true ]
	then
		# sensor heating is available, but we disable it for now
		param set SENS_EN_THERMAL 0

		# external L3GD20H is rotated 180 degrees yaw
		if l3gd20 -X -R 4 start
		then
		fi

		# external LSM303D is rotated 270 degrees yaw
		if lsm303d -X -R 6 start
		then
		fi

		# internal MPU6000 is rotated 180 deg roll, 270 deg yaw
		if mpu6000 -R 14 start
		then
		else
			if mpu9250 -R 14 start
			then
			fi
		fi

		if hmc5883 -C -T -S -R 8 start
		then
		fi

		if meas_airspeed start -b 2
		then
		fi

	else
		# FMUv2
		if mpu6000 start
		then
		fi

		if mpu9250 start
		then
		fi

		if l3gd20 start
		then
		fi

		if lsm303d start
		then
		fi
	fi
fi

if ver hwcmp PX4FMU_V4
then
	# External I2C bus
	if hmc5883 -C -T -X start
	then
	fi

	if lis3mdl -R 2 start
	then
	fi

	# Internal SPI bus is rotated 90 deg yaw
	if hmc5883 -C -T -S -R 2 start
	then
	fi

	# Internal SPI bus ICM-20608-G is rotated 90 deg yaw
	if mpu6000 -R 2 -T 20608 start
	then
	fi

	# Start either MPU9250 or BMI160. They are both connected to the same SPI bus and use the same
	# chip select pin. There are different boards with either one of them and the WHO_AM_I register
	# will prevent the incorrect driver from a successful initialization.

	# Internal SPI bus mpu9250 is rotated 90 deg yaw
	if mpu9250 -R 2 start
	then
	fi

	# Internal SPI bus BMI160
	if bmi160 start
	then
	fi
fi

if ver hwcmp PX4FMU_V1
then
	# FMUv1
	if mpu6000 start
	then
	fi

	if l3gd20 start
	then
	fi

	# MAG selection
	if param compare SENS_EXT_MAG 2
	then
		if hmc5883 -C -I start
		then
		fi
	else
		# Use only external as primary
		if param compare SENS_EXT_MAG 1
		then
			if hmc5883 -C -X start
			then
			fi
		else
		# auto-detect the primary, prefer external
			if hmc5883 start
			then
			fi
		fi
	fi
fi

if ver hwcmp MINDPX_V2
then
	# External I2C bus
	if hmc5883 -C -T -X start
	then
	fi

	# Internal I2C bus
	if hmc5883 -C -T -I -R 8 start
	then
	fi

	if mpu6500 -R 8 start
	then
	fi

	if lsm303d -R 10 start
	then
	fi

	if l3gd20 -R 14 start
	then
	fi
fi

if ver hwcmp CRAZYFLIE
then
	# Onboard I2C
	if mpu9250 -R 12 start
	then
	fi

	# I2C bypass of mpu
	if lps25h start
	then
	fi
fi

if ver hwcmp AEROFC_V1
then
	if ms5611 start
	then
	fi

	if mpu6500 -R 14 start
	then
	fi

	# Internal compass
	if hmc5883 -I -R 4 start
	then
	fi

	# Possible external compasses
	if hmc5883 -X start
	then
	fi

	if ist8310 -C -b 1 -R 8 start
	then
	fi
fi

if ver hwcmp PX4FMU_V4PRO
then
	# Internal SPI bus ICM-20608-G
	if mpu6000 -R 2 -T 20608 start
	then
	fi

	# Internal SPI bus mpu9250
	if mpu9250 -R 2 start
	then
	fi

	# Possible external compasses
	if hmc5883 -X start
	then
	fi

	# Internal SPI bus
	if lis3mdl -R 2 start
	then
	fi
fi

if ver hwcmp PX4FMU_V5
then
	# Internal SPI bus ICM-20602
	if mpu6000 -R 8 -s -T 20602 start
	then
	fi

	# Internal SPI bus ICM-20689
	if mpu6000 -R 8 -z -T 20689 start
	then
	fi

	# Internal SPI bus BMI055
# Place holder Need BMI055 Support added
	if bmi055 -R 2 start
	then
	fi

	# Possible external compasses
	if hmc5883 -X start
	then
	fi
fi

if meas_airspeed start
then
else
	if ets_airspeed start
	then
	else
		if ets_airspeed start -b 1
		then
		fi
	fi
fi

# Wait 20 ms for sensors (because we need to wait for the HRT and work queue callbacks to fire)
usleep 20000
if sensors start
then
fi
