Browse Source

Got rid of useless orb_receive_loop, moved some helper functions

sbg
Julian Oes 12 years ago
parent
commit
3e161049ac
  1. 196
      src/modules/commander/commander.c
  2. 46
      src/modules/commander/commander_helper.c
  3. 7
      src/modules/commander/commander_helper.h

196
src/modules/commander/commander.c

@ -132,8 +132,7 @@ extern struct system_load_s system_load; @@ -132,8 +132,7 @@ extern struct system_load_s system_load;
#define LOCAL_POSITION_TIMEOUT 1000000 /**< consider the local position estimate invalid after 1s */
/* File descriptors */
static int leds;
/* Mavlink file descriptors */
static int mavlink_fd;
/* flags */
@ -159,8 +158,9 @@ enum { @@ -159,8 +158,9 @@ enum {
} low_prio_task;
/* pthread loops */
void *orb_receive_loop(void *arg);
/**
* Loop that runs at a lower rate and priority for calibration and parameter tasks.
*/
void *commander_low_prio_loop(void *arg);
__EXPORT int commander_main(int argc, char *argv[]);
@ -170,88 +170,16 @@ __EXPORT int commander_main(int argc, char *argv[]); @@ -170,88 +170,16 @@ __EXPORT int commander_main(int argc, char *argv[]);
*/
int commander_thread_main(int argc, char *argv[]);
int led_init(void);
void led_deinit(void);
int led_toggle(int led);
int led_on(int led);
int led_off(int led);
void do_reboot(void);
/**
* React to commands that are sent e.g. from the mavlink module.
*/
void handle_command(int status_pub, struct vehicle_status_s *current_status, struct vehicle_command_s *cmd, int armed_pub, struct actuator_armed_s *armed);
// int trigger_audio_alarm(uint8_t old_mode, uint8_t old_state, uint8_t new_mode, uint8_t new_state);
/**
* Print the correct usage.
*/
void usage(const char *reason);
/**
* Sort calibration values.
*
* Sorts the calibration values with bubble sort.
*
* @param a The array to sort
* @param n The number of entries in the array
*/
// static void cal_bsort(float a[], int n);
int led_init()
{
leds = open(LED_DEVICE_PATH, 0);
if (leds < 0) {
warnx("LED: open fail\n");
return ERROR;
}
if (ioctl(leds, LED_ON, LED_BLUE) || ioctl(leds, LED_ON, LED_AMBER)) {
warnx("LED: ioctl fail\n");
return ERROR;
}
return 0;
}
void led_deinit()
{
close(leds);
}
int led_toggle(int led)
{
static int last_blue = LED_ON;
static int last_amber = LED_ON;
if (led == LED_BLUE) last_blue = (last_blue == LED_ON) ? LED_OFF : LED_ON;
if (led == LED_AMBER) last_amber = (last_amber == LED_ON) ? LED_OFF : LED_ON;
return ioctl(leds, ((led == LED_BLUE) ? last_blue : last_amber), led);
}
int led_on(int led)
{
return ioctl(leds, LED_ON, led);
}
int led_off(int led)
{
return ioctl(leds, LED_OFF, led);
}
void do_reboot()
{
mavlink_log_critical(mavlink_fd, "REBOOTING SYSTEM");
usleep(500000);
up_systemreset();
/* SPECIAL CASE: NEVER RETURNS FROM THIS FUNCTION CALL */
}
void handle_command(int status_pub, struct vehicle_status_s *current_vehicle_status, struct vehicle_command_s *cmd, int armed_pub, struct actuator_armed_s *armed)
@ -317,8 +245,10 @@ void handle_command(int status_pub, struct vehicle_status_s *current_vehicle_sta @@ -317,8 +245,10 @@ void handle_command(int status_pub, struct vehicle_status_s *current_vehicle_sta
/* reboot is executed later, after positive tune is sent */
result = VEHICLE_CMD_RESULT_ACCEPTED;
tune_positive();
/* SPECIAL CASE: SYSTEM WILL NEVER RETURN HERE */
do_reboot();
mavlink_log_critical(mavlink_fd, "REBOOTING SYSTEM");
usleep(500000);
up_systemreset();
/* SPECIAL CASE: NEVER RETURNS FROM THIS FUNCTION CALL */
} else {
/* system may return here */
@ -526,59 +456,6 @@ void handle_command(int status_pub, struct vehicle_status_s *current_vehicle_sta @@ -526,59 +456,6 @@ void handle_command(int status_pub, struct vehicle_status_s *current_vehicle_sta
}
void *orb_receive_loop(void *arg) //handles status information coming from subsystems (present, enabled, health), these values do not indicate the quality (variance) of the signal
{
/* Set thread name */
prctl(PR_SET_NAME, "commander orb rcv", getpid());
/* Subscribe to command topic */
int subsys_sub = orb_subscribe(ORB_ID(subsystem_info));
struct subsystem_info_s info;
struct vehicle_status_s *vstatus = (struct vehicle_status_s *)arg;
while (!thread_should_exit) {
struct pollfd fds[1] = { { .fd = subsys_sub, .events = POLLIN } };
if (poll(fds, 1, 5000) == 0) {
/* timeout, but this is no problem, silently ignore */
} else {
/* got command */
orb_copy(ORB_ID(subsystem_info), subsys_sub, &info);
warnx("Subsys changed: %d\n", (int)info.subsystem_type);
/* mark / unmark as present */
if (info.present) {
vstatus->onboard_control_sensors_present |= info.subsystem_type;
} else {
vstatus->onboard_control_sensors_present &= ~info.subsystem_type;
}
/* mark / unmark as enabled */
if (info.enabled) {
vstatus->onboard_control_sensors_enabled |= info.subsystem_type;
} else {
vstatus->onboard_control_sensors_enabled &= ~info.subsystem_type;
}
/* mark / unmark as ok */
if (info.ok) {
vstatus->onboard_control_sensors_health |= info.subsystem_type;
} else {
vstatus->onboard_control_sensors_health &= ~info.subsystem_type;
}
}
}
close(subsys_sub);
return NULL;
}
/*
* Provides a coarse estimate of remaining battery power.
*
@ -709,9 +586,7 @@ int commander_thread_main(int argc, char *argv[]) @@ -709,9 +586,7 @@ int commander_thread_main(int argc, char *argv[])
/* welcome user */
warnx("[commander] starting");
/* pthreads for command and subsystem info handling */
// pthread_t command_handling_thread;
pthread_t subsystem_info_thread;
/* pthread for slow low prio thread */
pthread_t commander_low_prio_thread;
/* initialize */
@ -807,12 +682,6 @@ int commander_thread_main(int argc, char *argv[]) @@ -807,12 +682,6 @@ int commander_thread_main(int argc, char *argv[])
// XXX needed?
mavlink_log_info(mavlink_fd, "system is running");
/* create pthreads */
pthread_attr_t subsystem_info_attr;
pthread_attr_init(&subsystem_info_attr);
pthread_attr_setstacksize(&subsystem_info_attr, 2048);
pthread_create(&subsystem_info_thread, &subsystem_info_attr, orb_receive_loop, &current_status);
pthread_attr_t commander_low_prio_attr;
pthread_attr_init(&commander_low_prio_attr);
pthread_attr_setstacksize(&commander_low_prio_attr, 2048);
@ -905,6 +774,11 @@ int commander_thread_main(int argc, char *argv[]) @@ -905,6 +774,11 @@ int commander_thread_main(int argc, char *argv[])
memset(&battery, 0, sizeof(battery));
battery.voltage_v = 0.0f;
/* Subscribe to subsystem info topic */
int subsys_sub = orb_subscribe(ORB_ID(subsystem_info));
struct subsystem_info_s info;
memset(&info, 0, sizeof(info));
// uint8_t vehicle_state_previous = current_status.state_machine;
float voltage_previous = 0.0f;
@ -1073,6 +947,39 @@ int commander_thread_main(int argc, char *argv[]) @@ -1073,6 +947,39 @@ int commander_thread_main(int argc, char *argv[])
}
}
/* update subsystem */
orb_check(subsys_sub, &new_data);
if (new_data) {
orb_copy(ORB_ID(subsystem_info), subsys_sub, &info);
warnx("Subsys changed: %d\n", (int)info.subsystem_type);
/* mark / unmark as present */
if (info.present) {
current_status.onboard_control_sensors_present |= info.subsystem_type;
} else {
current_status.onboard_control_sensors_present &= ~info.subsystem_type;
}
/* mark / unmark as enabled */
if (info.enabled) {
current_status.onboard_control_sensors_enabled |= info.subsystem_type;
} else {
current_status.onboard_control_sensors_enabled &= ~info.subsystem_type;
}
/* mark / unmark as ok */
if (info.ok) {
current_status.onboard_control_sensors_health |= info.subsystem_type;
} else {
current_status.onboard_control_sensors_health &= ~info.subsystem_type;
}
}
/* Slow but important 8 Hz checks */
if (counter % ((1000000 / COMMANDER_MONITORING_INTERVAL) / 8) == 0) {
@ -1801,8 +1708,6 @@ int commander_thread_main(int argc, char *argv[]) @@ -1801,8 +1708,6 @@ int commander_thread_main(int argc, char *argv[])
}
/* wait for threads to complete */
// pthread_join(command_handling_thread, NULL);
pthread_join(subsystem_info_thread, NULL);
pthread_join(commander_low_prio_thread, NULL);
/* close fds */
@ -1814,6 +1719,7 @@ int commander_thread_main(int argc, char *argv[]) @@ -1814,6 +1719,7 @@ int commander_thread_main(int argc, char *argv[])
close(sensor_sub);
close(safety_sub);
close(cmd_sub);
close(subsys_sub);
warnx("exiting");
fflush(stdout);

46
src/modules/commander/commander_helper.c

@ -51,6 +51,7 @@ @@ -51,6 +51,7 @@
#include <systemlib/err.h>
#include <drivers/drv_hrt.h>
#include <drivers/drv_tone_alarm.h>
#include <drivers/drv_led.h>
#include "commander_helper.h"
@ -127,3 +128,48 @@ void tune_stop() @@ -127,3 +128,48 @@ void tune_stop()
ioctl(buzzer, TONE_SET_ALARM, 0);
}
static int leds;
int led_init()
{
leds = open(LED_DEVICE_PATH, 0);
if (leds < 0) {
warnx("LED: open fail\n");
return ERROR;
}
if (ioctl(leds, LED_ON, LED_BLUE) || ioctl(leds, LED_ON, LED_AMBER)) {
warnx("LED: ioctl fail\n");
return ERROR;
}
return 0;
}
void led_deinit()
{
close(leds);
}
int led_toggle(int led)
{
static int last_blue = LED_ON;
static int last_amber = LED_ON;
if (led == LED_BLUE) last_blue = (last_blue == LED_ON) ? LED_OFF : LED_ON;
if (led == LED_AMBER) last_amber = (last_amber == LED_ON) ? LED_OFF : LED_ON;
return ioctl(leds, ((led == LED_BLUE) ? last_blue : last_amber), led);
}
int led_on(int led)
{
return ioctl(leds, LED_ON, led);
}
int led_off(int led)
{
return ioctl(leds, LED_OFF, led);
}

7
src/modules/commander/commander_helper.h

@ -60,7 +60,12 @@ void tune_negative(void); @@ -60,7 +60,12 @@ void tune_negative(void);
int tune_arm(void);
int tune_critical_bat(void);
int tune_low_bat(void);
void tune_stop(void);
int led_init(void);
void led_deinit(void);
int led_toggle(int led);
int led_on(int led);
int led_off(int led);
#endif /* COMMANDER_HELPER_H_ */

Loading…
Cancel
Save