diff --git a/conf/boards/ardrone2.makefile b/conf/boards/ardrone2.makefile index 16d3ebf609..7e0fbc2be2 100644 --- a/conf/boards/ardrone2.makefile +++ b/conf/boards/ardrone2.makefile @@ -2,7 +2,7 @@ # # ardrone2.makefile # -# http://wiki.paparazziuav.org/wiki/AR.Drone_2_-_Specifications +# http://wiki.paparazziuav.org/wiki/AR_Drone_2 # BOARD=ardrone diff --git a/sw/airborne/boards/ardrone/board.c b/sw/airborne/boards/ardrone/board.c index 0de5b3a3af..79c42da192 100644 --- a/sw/airborne/boards/ardrone/board.c +++ b/sw/airborne/boards/ardrone/board.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The Paparazzi Team + * Copyright (C) 2016 The Paparazzi Team * * This file is part of paparazzi. * @@ -26,12 +26,15 @@ */ #include +#include +#include +#include #include "mcu.h" -/* check if the bat_voltage_ardrone2 module is loaded */ +/* Check if the bat_voltage_ardrone2 module is loaded */ #include "generated/modules.h" #ifndef BAT_VOLTAGE_ARDRONE2_PERIODIC_FREQ -#warning No battery voltage measurement available! Please add to your modules. +#warning No battery voltage measurement available! Please add to your modules section in aircraft file. #endif #include "peripherals/video_device.h" @@ -56,10 +59,49 @@ struct video_config_t bottom_camera = { .filters = 0 }; +int KillGracefully(char *process_name); + +int KillGracefully(char *process_name) +{ + /* "pidof" always in /bin on ARdrone2, no need for "which" */ + char pidof_commandline[200] = "/bin/pidof -s "; + strcat(pidof_commandline, process_name); + /* ARDrone2 Busybox a + $ cat /proc/sys/kernel/pid_max + Gives max 32768, makes sure it never kills existing other process + */ + char pid[7] = ""; + int ret = 0; /* Return code of kill system call */ + FILE *fp; + + while (ret == 0) { + fp = popen(pidof_commandline, "r"); + if (fp != NULL) { /* Could open the pidof with line */ + if (fgets(pid, sizeof(pid) - 1, fp) != NULL) { + printf("Process ID deducted: \"%s\"\n", pid); + if (atoi(pid) > 0) { /* To make sure we end 0 > There is a real process id found */ + char kill_command_and_process[200] = "kill -9 "; /* BTW there is no pkill on this Busybox */ + strcat(kill_command_and_process, pid); + ret = system(kill_command_and_process); + /* No need to wait, since if it is not closed the next pidof scan still will still find it and try to kill it */ + } + } else { + ret = 256; /* Could not get handle */ + pclose(fp); + } + } else { + ret = 256; /* fp NULL, so no process, just return */ + return 0; + } + } /* end while */ + return 0; +} void board_init(void) { - // First we try to kill the program.elf and its respawner if it is running - int ret = system("killall -9 program.elf.respawner.sh; killall -9 program.elf"); + /* Two process to kill, the respawner first to make sure program.elf does not get restarted */ + int ret = system("killall -15 program.elf.respawner.sh"); + usleep(50000); /* Give respawner 50ms time to end on a busy system */ + KillGracefully("program.elf"); (void) ret; } diff --git a/sw/airborne/boards/ardrone/gpio_ardrone.c b/sw/airborne/boards/ardrone/gpio_ardrone.c index 2c77947434..44d69bc084 100644 --- a/sw/airborne/boards/ardrone/gpio_ardrone.c +++ b/sw/airborne/boards/ardrone/gpio_ardrone.c @@ -53,14 +53,14 @@ struct gpio_direction { void gpio_set(uint32_t port, uint16_t pin) { - if (port != 0x32524) { return; } // protect ardrone board from unauthorized use + if (port != 0x32524) { return; } /* protect ardrone board from unauthorized use */ struct gpio_data data; // Open the device if not open if (gpiofp == 0) { gpiofp = open("/dev/gpio", O_RDWR); } - // Read the GPIO value + /* Read the GPIO value */ data.pin = pin; data.value = 1; ioctl(gpiofp, GPIO_WRITE, &data); @@ -69,14 +69,14 @@ void gpio_set(uint32_t port, uint16_t pin) void gpio_clear(uint32_t port, uint16_t pin) { - if (port != 0x32524) { return; } // protect ardrone board from unauthorized use + if (port != 0x32524) { return; } /* protect ardrone board from unauthorized use */ struct gpio_data data; // Open the device if not open if (gpiofp == 0) { gpiofp = open("/dev/gpio", O_RDWR); } - // Read the GPIO value + /* Read the GPIO value */ data.pin = pin; data.value = 0; ioctl(gpiofp, GPIO_WRITE, &data); @@ -85,14 +85,14 @@ void gpio_clear(uint32_t port, uint16_t pin) void gpio_setup_input(uint32_t port, uint16_t pin) { - if (port != 0x32524) { return; } // protect ardrone board from unauthorized use + if (port != 0x32524) { return; } /* protect ardrone board from unauthorized use */ struct gpio_direction dir; - // Open the device if not open + /* Open the device if not yet opened*/ if (gpiofp == 0) { gpiofp = open("/dev/gpio", O_RDWR); } - // Read the GPIO value + /* Read the GPIO value */ dir.pin = pin; dir.mode = GPIO_INPUT; ioctl(gpiofp, GPIO_DIRECTION, &dir); @@ -119,14 +119,14 @@ void gpio_setup_output(uint32_t port, uint16_t pin) uint16_t gpio_get(uint32_t port, uint16_t pin) { - if (port != 0x32524) { return 0; } // protect ardrone board from unauthorized use + if (port != 0x32524) { return 0; } /* protect ARDroneX board from unauthorized use */ struct gpio_data data; - // Open the device if not open + /* Open the device if not open */ if (gpiofp == 0) { gpiofp = open("/dev/gpio", O_RDWR); } - // Read the GPIO value + /* Read the GPIO value */ data.pin = pin; ioctl(gpiofp, GPIO_READ, &data); return data.value; diff --git a/sw/airborne/boards/ardrone/navdata.c b/sw/airborne/boards/ardrone/navdata.c index 183e31e8e2..ec816bad16 100644 --- a/sw/airborne/boards/ardrone/navdata.c +++ b/sw/airborne/boards/ardrone/navdata.c @@ -1,37 +1,39 @@ /* - * Copyright (C) 2013 Dino Hensen, Vincent van Hoek - * 2015 Freek van Tienen + * Copyright (C) 2016 The Paparazzi Team * - * This file is part of Paparazzi. + * This file is part of paparazzi. * - * Paparazzi is free software; you can redistribute it and/or modify + * paparazzi is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * - * Paparazzi is distributed in the hope that it will be useful, + * paparazzi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Paparazzi; see the file COPYING. If not, write to - * the Free Software Foundation, 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * along with paparazzi; see the file COPYING. If not, see + * . */ +/* Thanks to TU Delft by assigning students Dino Hensen, Vincent van Hoek for + * their inital work and later improvements made in 2015 by Freek van Tienen +*/ + /** * @file boards/ardrone/navdata.c - * ardrone2 navdata aquisition driver. + * ARDrone2 navdata aquisition driver. * - * The ardrone2 provides a navdata stream of packets + * The ADRrone2 provides a navdata stream of packets * containing info about all sensors at a rate of 200Hz. */ #include #include #include -#include // for baud rates and options +#include /* for baud rates and options */ #include #include #include @@ -170,28 +172,28 @@ bool_t navdata_init() { assert(sizeof(struct navdata_measure_t) == NAVDATA_PACKET_SIZE); - // Check if the FD isn't already initialized + /* Check if the FD isn't already initialized */ if (navdata.fd <= 0) { - navdata.fd = open("/dev/ttyO1", O_RDWR | O_NOCTTY); //O_NONBLOCK doesn't work + navdata.fd = open("/dev/ttyO1", O_RDWR | O_NOCTTY); /* O_NONBLOCK doesn't work */ if (navdata.fd < 0) { printf("[navdata] Unable to open navdata board connection(/dev/ttyO1)\n"); return FALSE; } - // Update the settings of the UART connection - fcntl(navdata.fd, F_SETFL, 0); //read calls are non blocking - //set port options + /* Update the settings of the UART connection */ + fcntl(navdata.fd, F_SETFL, 0); /* read calls are non blocking */ + /* set port options */ struct termios options; - //Get the current options for the port + /* Get the current options for the port */ tcgetattr(navdata.fd, &options); - //Set the baud rates to 460800 + /* Set the baud rates to 460800 */ cfsetispeed(&options, B460800); cfsetospeed(&options, B460800); - options.c_cflag |= (CLOCAL | CREAD); //Enable the receiver and set local mode - options.c_iflag = 0; //clear input options - options.c_lflag = 0; //clear local options + options.c_cflag |= (CLOCAL | CREAD); /* Enable the receiver and set local mode */ + options.c_iflag = 0; /* clear input options */ + options.c_lflag = 0; /* clear local options */ options.c_oflag &= ~OPOST; //clear output options (raw output) //Set the new options for the port @@ -211,24 +213,24 @@ bool_t navdata_init() navdata.packetsRead = 0; navdata.last_packet_number = 0; - // Stop acquisition + /* Stop acquisition */ navdata_cmd_send(NAVDATA_CMD_STOP); - // Read the baro calibration(blocking) + /* Read the baro calibration(blocking) */ if (!navdata_baro_calib()) { printf("[navdata] Could not acquire baro calibration!\n"); return FALSE; } navdata.baro_calibrated = TRUE; - // Start acquisition + /* Start acquisition */ navdata_cmd_send(NAVDATA_CMD_START); - // Set navboard gpio control + /* Set navboard gpio control */ gpio_setup_output(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_NAVDATA); gpio_set(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_NAVDATA); - // Start navdata reading thread + /* Start navdata reading thread */ pthread_t navdata_thread; if (pthread_create(&navdata_thread, NULL, navdata_read, NULL) != 0) { printf("[navdata] Could not create navdata reading thread!\n"); @@ -239,7 +241,7 @@ bool_t navdata_init() register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_ARDRONE_NAVDATA, send_navdata); #endif - // Set to initialized + /* Set to initialized */ navdata.is_initialized = TRUE; return TRUE; } @@ -256,30 +258,30 @@ static void *navdata_read(void *data __attribute__((unused))) while (TRUE) { - // Wait until we are notified to read next data, - // i.e. buffer has been copied in navdata_update + /* Wait until we are notified to read next data, + i.e. buffer has been copied in navdata_update */ pthread_mutex_lock(&navdata_mutex); while (navdata_available) { pthread_cond_wait(&navdata_cond, &navdata_mutex); } pthread_mutex_unlock(&navdata_mutex); - // Read new bytes + /* Read new bytes */ int newbytes = read(navdata.fd, navdata_buffer + buffer_idx, NAVDATA_PACKET_SIZE - buffer_idx); - // When there was no signal interrupt + /* When there was no signal interrupt */ if (newbytes > 0) { buffer_idx += newbytes; navdata.totalBytesRead += newbytes; } - // If we got a full packet + /* If we got a full packet */ if (buffer_idx >= NAVDATA_PACKET_SIZE) { - // check if the start byte is correct + /* check if the start byte is correct */ if (navdata_buffer[0] != NAVDATA_START_BYTE) { uint8_t *pint = memchr(navdata_buffer, NAVDATA_START_BYTE, buffer_idx); - // Check if we found the start byte in the read data + /* Check if we found the start byte in the read data */ if (pint != NULL) { memmove(navdata_buffer, pint, NAVDATA_PACKET_SIZE - (pint - navdata_buffer)); buffer_idx = pint - navdata_buffer; @@ -293,7 +295,7 @@ static void *navdata_read(void *data __attribute__((unused))) /* full packet read with startbyte at the beginning, reset insert index */ buffer_idx = 0; - // Calculating the checksum + /* Calculate the checksum */ uint16_t checksum = 0; for (int i = 2; i < NAVDATA_PACKET_SIZE - 2; i += 2) { checksum += navdata_buffer[i] + (navdata_buffer[i + 1] << 8); @@ -301,7 +303,7 @@ static void *navdata_read(void *data __attribute__((unused))) struct navdata_measure_t *new_measurement = (struct navdata_measure_t *)navdata_buffer; - // Check if the checksum is ok + /* Check if the checksum is OK */ if (new_measurement->chksum != checksum) { fprintf(stderr, "[navdata] Checksum error [calculated: %d] [packet: %d] [diff: %d]\n", checksum, new_measurement->chksum, checksum - new_measurement->chksum); @@ -309,7 +311,7 @@ static void *navdata_read(void *data __attribute__((unused))) continue; } - // set flag that we have new valid navdata + /* Set flag that we have new valid navdata */ pthread_mutex_lock(&navdata_mutex); navdata_available = TRUE; pthread_mutex_unlock(&navdata_mutex); @@ -339,7 +341,7 @@ static void navdata_publish_imu(void) */ void navdata_update() { - // Check if initialized + /* Check if initialized */ if (!navdata.is_initialized) { navdata_init(); mag_freeze_check(); @@ -347,19 +349,19 @@ void navdata_update() } pthread_mutex_lock(&navdata_mutex); - // If we got a new navdata packet + /* If we got a new navdata packet */ if (navdata_available) { - // Copy the navdata packet + /* Copy the navdata packet */ memcpy(&navdata.measure, navdata_buffer, NAVDATA_PACKET_SIZE); - // reset the flag + /* reset the flag */ navdata_available = FALSE; - // signal that we copied the buffer and new packet can be read + /* signal that we copied the buffer and new packet can be read */ pthread_cond_signal(&navdata_cond); pthread_mutex_unlock(&navdata_mutex); - // Check if we missed a packet (our counter and the one from the navdata) + /* Check if we missed a packet (our counter and the one from the navdata) */ navdata.last_packet_number++; if (navdata.last_packet_number != navdata.measure.nu_trame) { fprintf(stderr, "[navdata] Lost frame: %d should have been %d\n", @@ -368,7 +370,7 @@ void navdata_update() } navdata.last_packet_number = navdata.measure.nu_trame; - // Invert byte order so that TELEMETRY works better + /* Invert byte order so that TELEMETRY works better */ uint8_t tmp; uint8_t *p = (uint8_t *) & (navdata.measure.pressure); tmp = p[0]; @@ -383,7 +385,7 @@ void navdata_update() mag_freeze_check(); #ifdef USE_SONAR - // Check if there is a new sonar measurement and update the sonar + /* Check if there is a new sonar measurement and update the sonar */ if (navdata.measure.ultrasound >> 15) { float sonar_meas = (float)((navdata.measure.ultrasound & 0x7FFF) - SONAR_OFFSET) * SONAR_SCALE; AbiSendMsgAGL(AGL_SONAR_ARDRONE2_ID, sonar_meas); @@ -394,7 +396,7 @@ void navdata_update() navdata.packetsRead++; } else { - // no new packet available, still unlock mutex again + /* no new packet available, still unlock mutex again */ pthread_mutex_unlock(&navdata_mutex); } } @@ -413,17 +415,17 @@ static void navdata_cmd_send(uint8_t cmd) */ static bool_t navdata_baro_calib(void) { - // Start baro calibration acquisition + /* Start baro calibration acquisition */ navdata_cmd_send(NAVDATA_CMD_BARO_CALIB); - // Receive the calibration (blocking) + /* Receive the calibration (blocking) */ uint8_t calibBuffer[22]; if (full_read(navdata.fd, calibBuffer, sizeof calibBuffer) < 0) { printf("[navdata] Could not read calibration data."); return FALSE; } - //Convert the read bytes + /* Convert the read bytes */ navdata.bmp180_calib.ac1 = calibBuffer[0] << 8 | calibBuffer[1]; navdata.bmp180_calib.ac2 = calibBuffer[2] << 8 | calibBuffer[3]; navdata.bmp180_calib.ac3 = calibBuffer[4] << 8 | calibBuffer[5]; @@ -445,42 +447,42 @@ static bool_t navdata_baro_calib(void) */ static void mag_freeze_check(void) { - // Thanks to Daren.G.Lee for initial fix on 20140530 + /* Thanks to Daren.G.Lee for initial fix on 20140530 */ static int16_t LastMagValue = 0; static int MagFreezeCounter = 0; if (LastMagValue == navdata.measure.mx) { MagFreezeCounter++; - // has to have at least 30 times the same value to consider it a frozen magnetometer value + /* Has to have at least 30 times the exact same value to consider it a frozen magnetometer value */ if (MagFreezeCounter > 30) { fprintf(stderr, "mag freeze detected, resetting!\n"); - // set imu_lost flag + /* set imu_lost flag */ navdata.imu_lost = TRUE; navdata.lost_imu_frames++; - // Stop acquisition + /* Stop acquisition */ navdata_cmd_send(NAVDATA_CMD_STOP); - // Reset the hardware of the navboard + /* Reset the hardware of the navboard */ gpio_clear(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_NAVDATA); usleep(20000); gpio_set(ARDRONE_GPIO_PORT, ARDRONE_GPIO_PIN_NAVDATA); - // Wait for 40ms for it to boot + /* Wait for 40ms for it to boot */ usleep(40000); - // Start the navdata again and reset the counter + /* Start the navdata again and reset the counter */ navdata_cmd_send(NAVDATA_CMD_START); - MagFreezeCounter = 0; // reset counter back to zero + MagFreezeCounter = 0; /* reset counter back to zero */ } } else { navdata.imu_lost = FALSE; - // Reset counter if value _does_ change + /* Reset counter if value _does_ change */ MagFreezeCounter = 0; } - // set last value + /* set last value */ LastMagValue = navdata.measure.mx; } @@ -496,52 +498,52 @@ static void baro_update_logic(void) static int32_t lastpressval_nospike = 0; static uint16_t lasttempval_nospike = 0; static uint8_t temp_or_press_was_updated_last = - 0; // 0 = press, so we now wait for temp, 1 = temp so we now wait for press + 0; /* 0 = press, so we now wait for temp, 1 = temp so we now wait for press */ static int sync_errors = 0; static int spike_detected = 0; - if (temp_or_press_was_updated_last == 0) { // Last update was press so we are now waiting for temp - // temp was updated + if (temp_or_press_was_updated_last == 0) { /* Last update was press so we are now waiting for temp */ + /* temp was updated */ temp_or_press_was_updated_last = TRUE; - // This means that press must remain constant + /* This means that press must remain constant */ if (lastpressval != 0) { - // If pressure was updated: this is a sync error + /* If pressure was updated: this is a sync error */ if (lastpressval != navdata.measure.pressure) { - // wait for temp again + /* wait for temp again */ temp_or_press_was_updated_last = FALSE; sync_errors++; //printf("Baro-Logic-Error (expected updated temp, got press)\n"); } } } else { - // press was updated + /* press was updated */ temp_or_press_was_updated_last = FALSE; - // This means that temp must remain constant + /* This means that temp must remain constant */ if (lasttempval != 0) { - // If temp was updated: this is a sync error + /* If temp was updated: this is a sync error */ if (lasttempval != navdata.measure.temperature_pressure) { - // wait for press again + /* wait for press again */ temp_or_press_was_updated_last = TRUE; sync_errors++; //printf("Baro-Logic-Error (expected updated press, got temp)\n"); } else { - // We now got valid pressure and temperature + /* We now got valid pressure and temperature */ navdata.baro_available = TRUE; } } } - // Detected a pressure switch + /* Detected a pressure swap */ if (lastpressval != 0 && lasttempval != 0 && ABS(lastpressval - navdata.measure.pressure) > ABS(lasttempval - navdata.measure.pressure)) { navdata.baro_available = FALSE; } - // Detected a temprature switch + /* Detected a temprature swap */ if (lastpressval != 0 && lasttempval != 0 && ABS(lasttempval - navdata.measure.temperature_pressure) > ABS(lastpressval - navdata.measure.temperature_pressure)) { navdata.baro_available = FALSE; @@ -589,22 +591,22 @@ static void baro_update_logic(void) */ - // if press and temp are same and temp has jump: neglect the next frame + /* If press and temp are same and temp has jump: neglect the next frame */ if (navdata.measure.temperature_pressure == navdata.measure.pressure) { // && (abs((int32_t)navdata.temperature_pressure - (int32_t)lasttempval) > 40)) - // dont use next 3 packets + /* dont use the next 3 packets */ spike_detected = 3; } if (spike_detected > 0) { - // disable kalman filter use + /* disable kalman filter use */ navdata.baro_available = FALSE; // override both to last good navdata.measure.pressure = lastpressval_nospike; navdata.measure.temperature_pressure = lasttempval_nospike; - // Countdown + /* Countdown */ spike_detected--; } else { // both are good lastpressval_nospike = navdata.measure.pressure; diff --git a/sw/airborne/boards/ardrone/navdata.h b/sw/airborne/boards/ardrone/navdata.h index 4ba32063af..6df78b6a2b 100644 --- a/sw/airborne/boards/ardrone/navdata.h +++ b/sw/airborne/boards/ardrone/navdata.h @@ -1,24 +1,25 @@ /* - * Copyright (C) 2013 Dino Hensen, Vincent van Hoek + * Copyright (C) 2016 The Paparazzi Team * - * This file is part of Paparazzi. + * This file is part of paparazzi. * - * Paparazzi is free software; you can redistribute it and/or modify + * paparazzi is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * - * Paparazzi is distributed in the hope that it will be useful, + * paparazzi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Paparazzi; see the file COPYING. If not, write to - * the Free Software Foundation, 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * along with paparazzi; see the file COPYING. If not, see + * . */ +/* Thanks to TU Delft by assigning students Dino Hensen, Vincent van Hoek */ + /** * @file boards/ardrone/navdata.h * ardrone2 navdata aquisition driver. @@ -27,6 +28,8 @@ * containing info about all sensors at a rate of 200Hz. */ + + #ifndef NAVDATA_H_ #define NAVDATA_H_ @@ -132,7 +135,7 @@ bool_t navdata_init(void); void navdata_update(void); int16_t navdata_height(void); -/* This should be moved to the uart handling part! */ +/* FIXME: This should be moved to the uart handling part! */ ssize_t full_write(int fd, const uint8_t *buf, size_t count); ssize_t full_read(int fd, uint8_t *buf, size_t count); diff --git a/sw/airborne/mcu.c b/sw/airborne/mcu.c index 6136658415..4bf894c507 100644 --- a/sw/airborne/mcu.c +++ b/sw/airborne/mcu.c @@ -65,18 +65,21 @@ void WEAK board_init(void) { - // default board init function does nothing... + /* default board init function does nothing... */ } void mcu_init(void) { - - mcu_arch_init(); /* If we have a board specific init function, call it. * Otherwise it will simply call the empty weak function. + * + * For example the ARDrone2 has this implemented to prevent stray data of IMU + * from OEM program still running and also accessing AC sensors */ board_init(); + mcu_arch_init(); + #ifdef PERIPHERALS_AUTO_INIT sys_time_init(); #ifdef USE_LED diff --git a/sw/tools/parrot/ardrone2.py b/sw/tools/parrot/ardrone2.py index 81ba416c97..7baa2ea908 100755 --- a/sw/tools/parrot/ardrone2.py +++ b/sw/tools/parrot/ardrone2.py @@ -163,7 +163,7 @@ def ardrone2_status(): print('Version:\t\t' + parrot_utils.check_version(tn, '/firmware')) print('Host:\t\t\t' + args.host + ' (' + read_from_config('static_ip_address_base', config_ini) + read_from_config('static_ip_address_probe', config_ini) + ' after boot)') - print('Currently running:\t' + parrot_utils.check_running(tn)) + print('Serial number:\t\t' + read_from_config('drone_serial', config_ini)) print('Network id:\t\t' + read_from_config('ssid_single_player', config_ini)) print('Motor software:\t\t' + @@ -172,7 +172,9 @@ def ardrone2_status(): print('Motor hardware:\t\t' + read_from_config('motor1_hard', config_ini) + '\t' + read_from_config('motor2_hard', config_ini) + '\t' + read_from_config('motor3_hard', config_ini) + '\t' + read_from_config('motor4_hard', config_ini)) - + + sleep(2.0) #Wait running process reporting back lag + print('Currently running:\t' + parrot_utils.check_running(tn)) autorun = {'': 'Native', '0': 'Native', '1': 'Paparazzi'} if check_autoboot(): print('Autorun at start:\tInstalled booting ' + autorun[read_from_config('start_paparazzi', config_ini)]) @@ -260,7 +262,7 @@ elif args.command == 'reboot': # Kill a program elif args.command == 'kill': - parrot_utils.execute_command(tn,'killall -9 ' + args.program) + parrot_utils.execute_command(tn,'killall -9 ' + args.program + ' &') print('Program "' + args.program + '" is now killed') # Start a program @@ -400,15 +402,16 @@ elif args.command == 'upload_file_and_run': f = parrot_utils.split_into_path_and_file(args.file) print("Kill running " + f[1] + " and make folder " + args.folder) - parrot_utils.execute_command(tn,"killall -9 " + f[1]) + parrot_utils.execute_command(tn,"killall -9 " + f[1] + ' &') sleep(1) parrot_utils.execute_command(tn, "mkdir -p /data/video/" + args.folder) print('Uploading \'' + f[1] + "\' from " + f[0] + " to " + args.folder) + print("#pragma message: Please wait, uploading can take some time...") parrot_utils.uploadfile(ftp, args.folder + "/" + f[1], file(args.file, "rb")) sleep(0.5) parrot_utils.execute_command(tn, "chmod 777 /data/video/" + args.folder + "/" + f[1]) parrot_utils.execute_command(tn, "/data/video/" + args.folder + "/" + f[1] + " > /dev/null 2>&1 &") - print("#pragma message: Upload and Start of ap.elf to ARDrone2 Succes!") + print("#pragma message: Upload to, and start of Autopilot on, ARDrone2 successful !") elif args.command == 'upload_file': # Split filename and path @@ -417,7 +420,7 @@ elif args.command == 'upload_file': parrot_utils.execute_command(tn,"mkdir -p /data/video/" + args.folder) print('Uploading \'' + f[1] + "\' from " + f[0] + " to /data/video/" + args.folder) parrot_utils.uploadfile(ftp, args.folder + "/" + f[1], file(args.file, "rb")) - print("#pragma message: Upload of " + f[1] + " to ARDrone2 Succes!") + print("#pragma message: Upload of " + f[1] + " to ARDrone2 successful !") elif args.command == 'download_file': # Split filename and path @@ -427,7 +430,7 @@ elif args.command == 'download_file': file = open(args.file, 'wb') print('Downloading \'' + f[1] + "\' from " + args.folder + " to " + f[0]) ftp.retrbinary("RETR " + args.folder + "/" + f[1], file.write) - print("#pragma message: Download of " + f[1] + " from ARDrone2 Succes!") + print("#pragma message: Download of " + f[1] + " from ARDrone2 successful !") except IOError: print("#pragma message: Fail to open file " + args.file) except: @@ -462,7 +465,7 @@ elif args.command == 'download_dir': elif args.command == 'rm_dir': # Split filename and path - print("Deleting folder /data/video/" + args.folder + " from ARDrone2") + print("Deleting folder /data/video/" + args.folder + " from ARDrone2...") print(parrot_utils.execute_command(tn, 'rm -r /data/video/' + args.folder)) diff --git a/sw/tools/parrot/parrot_utils.py b/sw/tools/parrot/parrot_utils.py index b0a640b285..8c450ca64f 100644 --- a/sw/tools/parrot/parrot_utils.py +++ b/sw/tools/parrot/parrot_utils.py @@ -55,12 +55,13 @@ def check_running(tn): ps_aux = execute_command(tn, 'ps') running = "" - if 'program.elf' in ps_aux: - running += ' Native (program.elf),' + if 'dragon-prog' in ps_aux: running += ' Native (dragon-prog),' if 'ap.elf' in ps_aux: running += ' Paparazzi (ap.elf),' + if 'program.elf' in ps_aux: + running += ' Native (program.elf),' if 'gst-launch' in ps_aux: running += ' GStreamer (gst-launch)' return running[1:]