#!nsh

# APM startup script for NuttX on PX4

# To disable APM startup add a /fs/microsd/APM/nostart file

set deviceA /dev/ttyACM0
set deviceC /dev/ttyS2

# check for an old file called APM, caused by 
# a bug in an earlier firmware release
if [ -f /fs/microsd/APM ]
then
   echo "APM file found - renaming"
   mv /fs/microsd/APM /fs/microsd/APM.old
fi

if [ -f /fs/microsd/APM/nostart ]
then
   echo "APM/nostart found - skipping"
else

# mount binfs so we can find the built-in apps
if [ -f /bin/reboot ]
then
	echo "binfs already mounted"
else
	echo "Mounting binfs"
	mount -t binfs /dev/null /bin
fi

set sketch NONE
set logfile /fs/microsd/APM/boot.log

if [ -f /bin/ArduPlane ]
then
	set sketch ArduPlane
fi

if [ -f /bin/ArduCopter ]
then
	set sketch ArduCopter
fi

if [ -f /bin/APMrover2 ]
then
	set sketch APMrover2
fi

if [ $sketch != NONE ]
then
	if mkdir /fs/microsd/APM
	then
	     echo "Created APM directory"
	fi

	if [ -f /fs/microsd/px4io.bin ]
	then
	   echo "Checking for new px4io firmware"
	   if cmp /fs/microsd/px4io.bin /fs/microsd/px4io.bin.loaded
	   then
	      echo "No new px4io firmware"
	   else
	      echo "Loading /fs/microsd/px4io.bin"
	      if px4io update /fs/microsd/px4io.bin > /fs/microsd/APM/px4io_update.log
	      then
	      	cp /fs/microsd/px4io.bin /fs/microsd/px4io.bin.loaded
	      	echo "Loaded /fs/microsd/px4io.bin OK" >> /fs/microsd/APM/px4io_update.log
	      else
	      	echo "Failed loading /fs/microsd/px4io.bin" >> /fs/microsd/APM/px4io_update.log
		echo "Failed to upgrade PX4IO firmware - check PX4IO is in bootloader mode"
	      fi
	   fi
	fi

	echo "Starting APM sensors"
	echo "Starting APM sensors" > $logfile
	uorb start
	mpu6000 start
	ms5611 start
	hmc5883 start
	adc start

	echo "Trying PX4IO board"
	echo "Trying PX4IO board" >> $logfile
	if px4io start
	then
		echo "PX4IO board OK"
		echo "PX4IO board OK" >> $logfile
		echo "Setting FMU mode_pwm"
		fmu mode_pwm
		echo "Loading FMU_pass mixer"
		mixer load /dev/pwm_output /etc/mixers/FMU_pass.mix
		if [ $deviceC == /dev/ttyS1 ]
		then
			# ttyS1 is used for PWM output for 4 extra channels
			set deviceC /dev/ttyS2
		fi
	else
		echo "No PX4IO board found"
		echo "No PX4IO board found" >> $logfile
		echo "Setting up PX4FMU direct mode"
		fmu mode_pwm
		if [ $deviceC == /dev/ttyS1 ]
		then
			# ttyS1 is used for PWM output when there
			# is no IO board
			set deviceC /dev/ttyS2
		fi
	fi

	echo Starting $sketch
	echo Starting $sketch >> $logfile
	$sketch -d $deviceA -d2 $deviceC start

	# if starting on the console, tell nsh to exit
	# this prevents it from chewing bytes
	if [ $deviceC == /dev/ttyS0 ]
	then
		echo "Exiting from nsh shell"
		exit
	fi
else
	echo "No APM sketch found"
fi
fi

echo "rc.APM finished"
echo "rc.APM finished" >> $logfile

