#!nsh # # PX4FMU startup script. # # NOTE: COMMENT LINES ARE REMOVED BEFORE STORED IN ROMFS. # # # Start CDC/ACM serial driver # sercon # # Default to auto-start mode. # set MODE autostart set FRC /fs/microsd/etc/rc.txt set FCONFIG /fs/microsd/etc/config.txt set TUNE_ERR ML<> $LOG_FILE set IO_PRESENT yes else echo "PX4IO Trying to update" >> $LOG_FILE tone_alarm MLL32CP8MB if px4io start then # try to safe px4 io so motor outputs dont go crazy if px4io safety_on then # success! no-op else # px4io did not respond to the safety command px4io stop fi fi if px4io forceupdate 14662 ${IO_FILE} then usleep 500000 if px4io checkcrc $IO_FILE then echo "PX4IO CRC OK after updating" >> $LOG_FILE tone_alarm MLL8CDE set IO_PRESENT yes else echo "ERROR: PX4IO update failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi else echo "ERROR: PX4IO update failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi fi unset IO_FILE if [ $IO_PRESENT == no ] then echo "[i] ERROR: PX4IO not found" echo "ERROR: PX4IO not found" >> $LOG_FILE tone_alarm $TUNE_ERR fi fi # # Set default output if not set # if [ $OUTPUT_MODE == none ] then if [ $USE_IO == yes ] then set OUTPUT_MODE io else set OUTPUT_MODE fmu fi fi if [ $OUTPUT_MODE == io -a $IO_PRESENT != yes ] then # Need IO for output but it not present, disable output set OUTPUT_MODE none echo "[i] ERROR: PX4IO not found, disabling output" # Avoid using ttyS0 for MAVLink on FMUv1 if ver hwcmp PX4FMU_V1 then set FMU_MODE serial fi fi if [ $OUTPUT_MODE == ardrone ] then set FMU_MODE gpio_serial fi if [ $HIL == yes ] then set OUTPUT_MODE hil set GPS no if ver hwcmp PX4FMU_V1 then set FMU_MODE serial fi fi unset HIL # waypoint storage # REBOOTWORK this needs to start in parallel if dataman start then fi # # Sensors System (start before Commander so Preflight checks are properly run) # sh /etc/init.d/rc.sensors if [ $GPS == yes ] then if [ $GPS_FAKE == yes ] then echo "[i] Faking GPS" gps start -f else gps start fi fi unset GPS unset GPS_FAKE # Needs to be this early for in-air-restarts commander start # # Start primary output # set TTYS1_BUSY no # # Check if UAVCAN is enabled, default to it for ESCs # if param greater UAVCAN_ENABLE 2 then set OUTPUT_MODE uavcan_esc fi # If OUTPUT_MODE == none then something is wrong with setup and we shouldn't try to enable output if [ $OUTPUT_MODE != none ] then if [ $OUTPUT_MODE == uavcan_esc ] then if param compare UAVCAN_ENABLE 0 then echo "[i] OVERRIDING UAVCAN_ENABLE = 1" param set UAVCAN_ENABLE 1 fi fi if [ $OUTPUT_MODE == io -o $OUTPUT_MODE == uavcan_esc ] then if px4io start then sh /etc/init.d/rc.io else echo "ERROR: PX4IO start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi fi if [ $OUTPUT_MODE == fmu -o $OUTPUT_MODE == ardrone ] then if fmu mode_$FMU_MODE then echo "[i] FMU mode_$FMU_MODE started" else echo "[i] ERROR: FMU mode_$FMU_MODE start failed" echo "ERROR: FMU start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi if ver hwcmp PX4FMU_V1 then if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ] then set TTYS1_BUSY yes fi if [ $FMU_MODE == pwm_gpio -o $OUTPUT_MODE == ardrone ] then set TTYS1_BUSY yes fi fi fi if [ $OUTPUT_MODE == mkblctrl ] then set MKBLCTRL_ARG "" if [ $MKBLCTRL_MODE == x ] then set MKBLCTRL_ARG "-mkmode x" fi if [ $MKBLCTRL_MODE == + ] then set MKBLCTRL_ARG "-mkmode +" fi if mkblctrl $MKBLCTRL_ARG then echo "[i] MK started" else echo "[i] ERROR: MK start failed" echo "ERROR: MK start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi unset MKBLCTRL_ARG fi unset MK_MODE if [ $OUTPUT_MODE == hil ] then if pwm_out_sim mode_port2_pwm8 then echo "[i] PWM SIM output started" else echo "[i] ERROR: PWM SIM output start failed" echo "ERROR: PWM SIM output start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi fi # # Start IO or FMU for RC PPM input if needed # if [ $IO_PRESENT == yes ] then if [ $OUTPUT_MODE != io ] then if px4io start then echo "[i] PX4IO started" sh /etc/init.d/rc.io else echo "[i] ERROR: PX4IO start failed" echo "ERROR: PX4IO start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi fi else if [ $OUTPUT_MODE != fmu -a $OUTPUT_MODE != ardrone ] then if fmu mode_$FMU_MODE then echo "[i] FMU mode_$FMU_MODE started" else echo "[i] ERROR: FMU mode_$FMU_MODE start failed" echo "ERROR: FMU mode_$FMU_MODE start failed" >> $LOG_FILE tone_alarm $TUNE_ERR fi if ver hwcmp PX4FMU_V1 then if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ] then set TTYS1_BUSY yes fi if [ $FMU_MODE == pwm_gpio -o $OUTPUT_MODE == ardrone ] then set TTYS1_BUSY yes fi fi fi fi fi if [ $MAVLINK_F == default ] then # Normal mode, use baudrate 57600 (default) and data rate 1000 bytes/s if [ $TTYS1_BUSY == yes ] then # Start MAVLink on ttyS0, because FMU ttyS1 pins configured as something else set MAVLINK_F "-r 1200 -d /dev/ttyS0" # Exit from nsh to free port for mavlink set EXIT_ON_END yes else set MAVLINK_F "-r 1200" # Avoid using ttyS1 for MAVLink on FMUv4 if ver hwcmp PX4FMU_V4 then set MAVLINK_F "-r 1200 -d /dev/ttyS1" # Start MAVLink on Wifi (ESP8266 port) mavlink start -r 20000 -m config -b 921600 -d /dev/ttyS0 fi fi fi mavlink start $MAVLINK_F unset MAVLINK_F if ver hwcmp PX4FMU_V4 then # Start MAVLink on OSD (TELEM2 port) mavlink start -r 1200 -d /dev/ttyS2 -b 57600 -m osd fi # # MAVLink onboard / TELEM2 # if ver hwcmp PX4FMU_V2 then # XXX We need a better way for runtime eval of shell variables, # but this works for now if param compare SYS_COMPANION 921600 then mavlink start -d /dev/ttyS2 -b 921600 -m onboard -r 80000 -x fi if param compare SYS_COMPANION 57600 then mavlink start -d /dev/ttyS2 -b 57600 -m onboard -r 5000 -x fi if param compare SYS_COMPANION 157600 then mavlink start -d /dev/ttyS2 -b 57600 -m osd -r 1000 fi if param compare SYS_COMPANION 257600 then mavlink start -d /dev/ttyS2 -b 57600 -m magic -r 5000 -x fi # Sensors on the PWM interface bank # clear pins 5 and 6 if param compare SENS_EN_LL40LS 1 then set AUX_MODE pwm4 fi if param greater TRIG_MODE 0 then # Get FMU driver out of the way set MIXER_AUX none set AUX_MODE none camera_trigger start fi fi # # UAVCAN # sh /etc/init.d/rc.uavcan # # Logging # sh /etc/init.d/rc.logging # # Start up ARDrone Motor interface # if [ $OUTPUT_MODE == ardrone ] then ardrone_interface start -d /dev/ttyS1 fi # # Fixed wing setup # if [ $VEHICLE_TYPE == fw ] then echo "[i] FIXED WING" if [ $MIXER == none ] then # Set default mixer for fixed wing if not defined set MIXER AERT fi if [ $MAV_TYPE == none ] then # Use MAV_TYPE = 1 (fixed wing) if not defined set MAV_TYPE 1 fi param set MAV_TYPE $MAV_TYPE # Load mixer and configure outputs sh /etc/init.d/rc.interface # Start standard fixedwing apps if [ $LOAD_DAPPS == yes ] then sh /etc/init.d/rc.fw_apps fi fi # # Multicopters setup # if [ $VEHICLE_TYPE == mc ] then echo "[i] MULTICOPTER" if [ $MIXER == none ] then echo "Mixer undefined" fi if [ $MAV_TYPE == none ] then # Use mixer to detect vehicle type if [ $MIXER == quad_x -o $MIXER == quad_+ ] then set MAV_TYPE 2 fi if [ $MIXER == quad_w -o $MIXER == sk450_deadcat ] then set MAV_TYPE 2 fi if [ $MIXER == quad_h ] then set MAV_TYPE 2 fi if [ $MIXER == tri_y_yaw- -o $MIXER == tri_y_yaw+ ] then set MAV_TYPE 15 fi if [ $MIXER == hexa_x -o $MIXER == hexa_+ ] then set MAV_TYPE 13 fi if [ $MIXER == hexa_cox ] then set MAV_TYPE 13 fi if [ $MIXER == octo_x -o $MIXER == octo_+ ] then set MAV_TYPE 14 fi if [ $MIXER == octo_cox -o $MIXER == octo_cox_w ] then set MAV_TYPE 14 fi fi # Still no MAV_TYPE found if [ $MAV_TYPE == none ] then echo "Unknown MAV_TYPE" param set MAV_TYPE 2 else param set MAV_TYPE $MAV_TYPE fi # Load mixer and configure outputs sh /etc/init.d/rc.interface # Start standard multicopter apps if [ $LOAD_DAPPS == yes ] then sh /etc/init.d/rc.mc_apps fi fi # # VTOL setup # if [ $VEHICLE_TYPE == vtol ] then echo "[init] Vehicle type: VTOL" if [ $MIXER == none ] then echo "Default mixer for vtol not defined" fi if [ $MAV_TYPE == none ] then # Use mixer to detect vehicle type if [ $MIXER == caipirinha_vtol ] then set MAV_TYPE 19 fi if [ $MIXER == firefly6 ] then set MAV_TYPE 21 fi if [ $MIXER == quad_x_pusher_vtol ] then set MAV_TYPE 22 fi fi # Still no MAV_TYPE found if [ $MAV_TYPE == none ] then echo "Unknown MAV_TYPE" param set MAV_TYPE 19 else param set MAV_TYPE $MAV_TYPE fi # Load mixer and configure outputs sh /etc/init.d/rc.interface # Start standard vtol apps if [ $LOAD_DAPPS == yes ] then sh /etc/init.d/rc.vtol_apps fi fi # # Rover setup # if [ $VEHICLE_TYPE == rover ] then # 10 is MAV_TYPE_GROUND_ROVER set MAV_TYPE 10 # Load mixer and configure outputs sh /etc/init.d/rc.interface # Start standard rover apps if [ $LOAD_DAPPS == yes ] then sh /etc/init.d/rc.axialracing_ax10_apps fi param set MAV_TYPE 10 fi unset MIXER unset MAV_TYPE unset OUTPUT_MODE # # Start the navigator # navigator start # # Generic setup (autostart ID not found) # if [ $VEHICLE_TYPE == none ] then echo "[i] No autostart ID found" fi # Start any custom addons set FEXTRAS /fs/microsd/etc/extras.txt if [ -f $FEXTRAS ] then echo "[i] Addons script: $FEXTRAS" sh $FEXTRAS fi unset FEXTRAS # Run no SD alarm if [ $LOG_FILE == /dev/null ] then echo "[i] No microSD card found" # Play SOS tone_alarm error fi # End of autostart fi # There is no further script processing, so we can free some RAM # XXX potentially unset all script variables. unset TUNE_ERR # Boot is complete, inform MAVLink app(s) that the system is now fully up and running mavlink boot_complete # Sensors on the PWM interface bank if param compare SENS_EN_LL40LS 1 then if pwm_input start then if ll40ls start pwm then fi fi fi if ver hwcmp PX4FMU_V4 then frsky_telemetry start -d /dev/ttyS6 fi if ver hwcmp PX4FMU_V2 then # Check for flow sensor - as it is a background task, launch it last px4flow start & fi # Start USB shell if no microSD present, MAVLink else if [ $LOG_FILE == /dev/null ] then # Try to get an USB console nshterm /dev/ttyACM0 & else mavlink start -r 800000 -d /dev/ttyACM0 -m config -x fi if [ $EXIT_ON_END == yes ] then echo "Exit from nsh" exit fi unset EXIT_ON_END