diff --git a/conf/airframes/example_heli_lisam.xml b/conf/airframes/example_heli_lisam.xml
new file mode 100644
index 0000000000..616a32ed0a
--- /dev/null
+++ b/conf/airframes/example_heli_lisam.xml
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/airframes/fraser_lisa_m_rotorcraft.xml b/conf/airframes/fraser_lisa_m_rotorcraft.xml
index 78fd75ff8a..7ebebd2c69 100644
--- a/conf/airframes/fraser_lisa_m_rotorcraft.xml
+++ b/conf/airframes/fraser_lisa_m_rotorcraft.xml
@@ -23,11 +23,8 @@
-
+
-
diff --git a/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat.makefile b/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat.makefile
new file mode 100644
index 0000000000..8c00152cab
--- /dev/null
+++ b/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat.makefile
@@ -0,0 +1,5 @@
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_TYPE_INT
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_H=\"stabilization/stabilization_attitude_int.h\"
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_REF_H=\"stabilization/stabilization_attitude_ref_quat_int.h\"
+ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_ref_quat_int.c
+ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_quat_int.c
diff --git a/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat_transition.makefile b/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat_transition.makefile
new file mode 100644
index 0000000000..2403f25272
--- /dev/null
+++ b/conf/autopilot/subsystems/rotorcraft/stabilization_int_quat_transition.makefile
@@ -0,0 +1,7 @@
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_TYPE_INT
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_H=\"stabilization/stabilization_attitude_int.h\"
+ap.CFLAGS += -DSTABILISATION_ATTITUDE_REF_H=\"stabilization/stabilization_attitude_ref_quat_int.h\"
+ap.CFLAGS += -DUSE_SETPOINTS_WITH_TRANSITIONS
+ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_ref_quat_int.c
+ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_quat_int.c
+ap.srcs += $(SRC_FIRMWARE)/stabilization/quat_setpoint_int.c
diff --git a/conf/autopilot/subsystems/rotorcraft/stabilization_quaternion.makefile b/conf/autopilot/subsystems/rotorcraft/stabilization_quaternion.makefile
index e9d4cc7edd..344044bbe6 100644
--- a/conf/autopilot/subsystems/rotorcraft/stabilization_quaternion.makefile
+++ b/conf/autopilot/subsystems/rotorcraft/stabilization_quaternion.makefile
@@ -1,6 +1 @@
-ap.CFLAGS += -DSTABILISATION_ATTITUDE_TYPE_INT
-ap.CFLAGS += -DSTABILISATION_ATTITUDE_H=\"stabilization/stabilization_attitude_int.h\"
-ap.CFLAGS += -DSTABILISATION_ATTITUDE_REF_H=\"stabilization/stabilization_attitude_ref_quat_int.h\"
-ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_ref_quat_int.c
-ap.srcs += $(SRC_FIRMWARE)/stabilization/stabilization_attitude_quat_int.c
-ap.srcs += $(SRC_FIRMWARE)/stabilization/quat_setpoint.c
+$(error The stabilization quaternion subsystem has been changed, for normal rotorcrafts please use , for transitioning rotorcrafts (quadshot) use )
diff --git a/sw/airborne/arch/stm32/mcu_periph/sys_time_arch.h b/sw/airborne/arch/stm32/mcu_periph/sys_time_arch.h
index 4550633116..d0cfee8013 100644
--- a/sw/airborne/arch/stm32/mcu_periph/sys_time_arch.h
+++ b/sw/airborne/arch/stm32/mcu_periph/sys_time_arch.h
@@ -55,9 +55,10 @@ extern void sys_tick_irq_handler(void);
/** Busy wait, in microseconds */
-/* for now empty shell */
+// FIXME: directly use the SysTick->VAL here
static inline void sys_time_usleep(uint32_t us) {
-
+ uint32_t end = GET_CUR_TIME_USEC() + us;
+ while ((uint32_t)GET_CUR_TIME_USEC() < end);
}
#endif /* SYS_TIME_ARCH_H */
diff --git a/sw/airborne/boards/lisa_l/baro_board.c b/sw/airborne/boards/lisa_l/baro_board.c
index 0333505ba8..43c1414907 100644
--- a/sw/airborne/boards/lisa_l/baro_board.c
+++ b/sw/airborne/boards/lisa_l/baro_board.c
@@ -66,7 +66,14 @@ void baro_periodic(void) {
void baro_board_send_config_abs(void) {
+#ifndef BARO_LOW_GAIN
+#pragma message "Using High LisaL Baro Gain: Do not use below 1000hPa"
baro_board_write_to_register(BARO_ABS_ADDR, 0x01, 0x86, 0x83);
+#else
+#pragma message "Using Low LisaL Baro Gain, capable of measuring below 1000hPa or more"
+ //config register should be 0x84 in low countries, or 0x86 in normal countries
+ baro_board_write_to_register(BARO_ABS_ADDR, 0x01, 0x84, 0x83);
+#endif
}
void baro_board_send_config_diff(void) {
diff --git a/sw/airborne/csc/arm7/props_csc.h b/sw/airborne/csc/arm7/props_csc.h
deleted file mode 100644
index 3dce09844f..0000000000
--- a/sw/airborne/csc/arm7/props_csc.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef PROPS_CSC_H
-#define PROPS_CSC_H
-
-#include "generated/airframe.h"
-#include "firmwares/rotorcraft/actuators.h"
-#include "mcu_periph/sys_time.h"
-#include "csc_ap_link.h"
-#include "csc_msg_def.h"
-
-extern uint8_t csc_prop_speeds[PROPS_NB];
-
-void props_set(uint8_t i, uint8_t speed);
-void props_commit();
-
-#endif /* PROPS_CSC_H */
diff --git a/sw/airborne/csc/csc_adc.c b/sw/airborne/csc/csc_adc.c
deleted file mode 100644
index ca4d2db9b4..0000000000
--- a/sw/airborne/csc/csc_adc.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "csc_adc.h"
-#include "csc_ap_link.h"
-#include
-#include "mcu_periph/uart.h"
-#include "print.h"
-
-#include "LPC21xx.h"
-#include "led.h"
-#include "mcu_periph/adc.h"
-#include ACTUATORS
-#include "csc_servos.h"
-#include "mcu_periph/sys_time.h"
-
-#define ADC_NB_CSC 4
-
-struct adc_buf adc_bufs[ADC_NB_CSC];
-
-uint8_t vsupply;
-uint16_t adc_slider;
-uint16_t adc_values[ADC_NB_CSC];
-
-#define ADC_VDIV 5.7
-#define ADC_VOLT 3.28
-#define ADC_FACTOR 1024.0 * ADC_VOLT * ADC_VDIV
-
-#ifndef ADC_AV_NB
-#define ADC_AV_NB 8
-#endif
-
-#define ADC_VSUPPLY 0
-#define ADC_SLIDER 3
-
-
-
-void csc_adc_init(void)
-{
- adc_init();
- for (int i = 0; i < ADC_NB_CSC; i++) {
- adc_buf_channel(i, &adc_bufs[i], ADC_AV_NB);
- }
-}
-
-void csc_adc_periodic(void)
-{
- vsupply = adc_bufs[ADC_VSUPPLY].sum / adc_bufs[ADC_VSUPPLY].av_nb_sample / ADC_FACTOR * 10;
- adc_slider = adc_bufs[ADC_SLIDER].sum / adc_bufs[ADC_SLIDER].av_nb_sample;
- for (int i = 0; i < ADC_NB_CSC; i++) {
- adc_values[i] = adc_bufs[i].sum / adc_bufs[i].av_nb_sample;
- }
-}
-
diff --git a/sw/airborne/csc/csc_ap_main.c b/sw/airborne/csc/csc_ap_main.c
deleted file mode 100644
index 757dcbd75c..0000000000
--- a/sw/airborne/csc/csc_ap_main.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * $Id: booz2_main.c 3049 2009-02-24 16:51:25Z poine $
- *
- * Copyright (C) 2008 Antoine Drouin
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-
-#include "csc_main.h"
-
-#include "std.h"
-
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-#include "interrupt_hw.h"
-#include "mcu_periph/uart.h"
-#include "subsystems/datalink/downlink.h"
-#include "generated/periodic.h"
-#include "generated/airframe.h"
-#include "commands.h"
-#include "subsystems/radio_control.h"
-#include "booz/booz2_gps.h"
-
-//#include "ap_subsystems/datalink/downlink.h"
-
-#include "csc_servos.h"
-#include "csc_telemetry.h"
-#include "csc_adc.h"
-#include "csc_xsens.h"
-#include "csc_autopilot.h"
-#include "csc_can.h"
-#include "pwm_input.h"
-#include "csc_ap_link.h"
-#include "led.h"
-
-#include "subsystems/datalink/pprz_transport.h"
-
-#define CSC_STATUS_TIMEOUT (CPU_TICKS_OF_SEC(0.25) / PERIODIC_TASK_PERIOD)
-
-#define PPRZ_MODE_MANUAL 0
-#define PPRZ_MODE_AUTO1 1
-
-#define TRESHOLD_MANUAL_PPRZ (MIN_PPRZ / 2)
-#define PPRZ_MODE_OF_RC(mode) ((mode) < TRESHOLD_MANUAL_PPRZ ? PPRZ_MODE_MANUAL : PPRZ_MODE_AUTO1)
-
-extern uint8_t vsupply;
-
-uint8_t pprz_mode = PPRZ_MODE_AUTO1;
-static uint16_t cpu_time = 0;
-uint8_t csc_trims_set = 0;
-
-struct Booz_gps_state booz_gps_state;
-struct NedCoor_i booz_ins_gps_pos_cm_ned;
-struct NedCoor_i booz_ins_gps_speed_cm_s_ned;
-
-static void nop(struct CscCanMsg *msg)
-{
-
-}
-
-#define RADIO_SCALE 20
-#define ROLL_OFFSET 1544
-#define PITCH_OFFSET 2551
-#define YAW_OFFSET 3585
-#define MODE_OFFSET 5632
-
-static void on_rc_cmd(struct CscRCMsg *msg)
-{
- int aux2_flag;
- static int last_aux2_flag = -1;
-
- rc_values[RADIO_ROLL] = CSC_RC_SCALE*(msg->right_stick_horizontal - CSC_RC_OFFSET);
- rc_values[RADIO_PITCH] = -CSC_RC_SCALE*(msg->right_stick_vertical - CSC_RC_OFFSET);
- rc_values[RADIO_YAW] = CSC_RC_SCALE*((msg->left_stick_horizontal_and_aux2 & ~(3 << 13)) - CSC_RC_OFFSET);
- uint8_t mode = (msg->left_stick_vertical_and_flap_mix & (3 << 13)) >> 13;
- rc_values[RADIO_MODE] = mode ? -7000 : ( (mode == 1) ? 0 : 7000);
- aux2_flag = (msg->left_stick_horizontal_and_aux2 >> 13) & 0x1;
- rc_values[RADIO_MODE2] = (aux2_flag == 0) ? -7000 : ( (aux2_flag == 1) ? 0 : 7000);
- rc_values[RADIO_THROTTLE] = -CSC_RC_SCALE*((msg->left_stick_vertical_and_flap_mix & ~(3 << 13)) - CSC_RC_OFFSET);
-
- time_since_last_ppm = 0;
- rc_status = RC_OK;
- pprz_mode = PPRZ_MODE_OF_RC(rc_values[RADIO_MODE]);
- if (pprz_mode == PPRZ_MODE_MANUAL) {
- csc_ap_clear_ierrors();
- SetCommandsFromRC(commands, rc_values);
- }
-}
-
-static void on_gpsacc_cmd( struct CscGPSAccMsg *msg )
-{
- booz_gps_state.pacc = msg->pacc;
- booz_gps_state.sacc = msg->sacc;
-}
-
-static void on_gpsfix_cmd( struct CscGPSFixMsg *msg )
-{
- booz_gps_state.fix = msg->gps_fix;
- booz_gps_state.num_sv = msg->num_sv;
- booz_ins_gps_speed_cm_s_ned.x = msg->vx;
- booz_ins_gps_speed_cm_s_ned.y = msg->vy;
- booz_ins_gps_speed_cm_s_ned.z = msg->vz;
-}
-
-static void on_gpspos_cmd( struct CscGPSPosMsg *msg )
-{
- switch (msg->axis) {
- case CSC_GPS_AXIS_IDX_X:
- booz_ins_gps_pos_cm_ned.x = msg->val;
- break;
- case CSC_GPS_AXIS_IDX_Y:
- booz_ins_gps_pos_cm_ned.y = msg->val;
- break;
- case CSC_GPS_AXIS_IDX_Z:
- booz_ins_gps_pos_cm_ned.z = msg->val;
- break;
- default:
- // Invalid msg
- break;
- }
-}
-
-static void csc_main_init( void ) {
-
- mcu_init();
- sys_time_register_timer((1./PERIODIC_FREQUENCY), NULL);
- led_init();
-
- Uart0Init();
- Uart1Init();
-
- xsens_init();
-
- csc_adc_init();
- ppm_init();
-
-#ifdef USE_PWM_INPUT
- pwm_input_init();
-#endif
-
- csc_ap_link_init();
- csc_ap_link_set_servo_cmd_cb(&nop);
- csc_ap_link_set_motor_cmd_cb(&nop);
- csc_ap_link_set_rc_cmd_cb(on_rc_cmd);
- csc_ap_link_set_gpsfix_cb(on_gpsfix_cmd);
- csc_ap_link_set_gpspos_cb(on_gpspos_cmd);
- csc_ap_link_set_gpsacc_cb(on_gpsacc_cmd);
- actuators_init();
-
- csc_ap_init();
- mcu_int_enable();
-
-}
-
-
-static void csc_main_periodic( void )
-{
- static uint32_t csc_loops = 0;
-
- PeriodicSendAp(DefaultChannel);
- radio_control_periodic_task();
-
- if (rc_status == RC_REALLY_LOST) {
- pprz_mode = PPRZ_MODE_AUTO1;
- }
- cpu_time++;
-
- if ((++csc_loops % CSC_STATUS_TIMEOUT) == 0) {
- csc_adc_periodic();
- }
- xsens_periodic_task();
- if (pprz_mode == PPRZ_MODE_AUTO1)
- csc_ap_periodic(cpu_time, &booz_ins_gps_pos_cm_ned, &booz_ins_gps_speed_cm_s_ned);
-
- if (csc_trims_set) {
- csc_trims_set = 0;
- csc_ap_set_trims();
- }
-
-#ifdef ACTUATORS
- SetActuatorsFromCommands(commands);
-#endif
- SendCscFromActuators();
-
-}
-
-static void csc_main_event( void )
-{
- csc_can_event();
- xsens_event_task();
- DatalinkEvent();
-}
-
-int main( void ) {
- csc_main_init();
- while(1) {
- if (sys_time_check_and_ack_timer(0))
- csc_main_periodic();
- csc_main_event();
- }
- return 0;
-}
diff --git a/sw/airborne/csc/csc_baro.c b/sw/airborne/csc/csc_baro.c
deleted file mode 100644
index 08c7edbe21..0000000000
--- a/sw/airborne/csc/csc_baro.c
+++ /dev/null
@@ -1,169 +0,0 @@
-#include "std.h"
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-#include "interrupt_hw.h"
-
-#include "mcu_periph/uart.h"
-#include "messages.h"
-#include "subsystems/datalink/downlink.h"
-#include "csc_booz2_ins.h"
-#include "csc_ap_link.h"
-
-#include "mcu_periph/spi_arch.h"
-
-#include "csc_baro.h"
-
-uint8_t baro_scp_status;
-uint32_t baro_scp_pressure;
-uint16_t baro_scp_temperature;
-float baro_scp_alt;
-bool_t baro_scp_available;
-
-static void baro_scp_start_high_res_measurement(void);
-static void spi1_isr(void);
-
-void baro_scp_periodic(void) {
- if (cpu_time_sec > 1) {
- if (baro_scp_status == STA_UNINIT) {
- baro_scp_start_high_res_measurement();
- baro_scp_status = STA_INITIALISING;
- } else {
- spi1_isr();
- }
- }
-}
-
-#define SS_PIN 30
-#define SS_IODIR IO0DIR
-#define SS_IOSET IO0SET
-#define SS_IOCLR IO0CLR
-
-#define ScpSelect() SetBit(SS_IOCLR,SS_PIN)
-#define ScpUnselect() SetBit(SS_IOSET,SS_PIN)
-
-// DRDY1 aka P0.15
-#define DRDY1_PIN 15
-#define DRDY1_IODIR IO0DIR
-#define DRDY1_IOPIN IO0PIN
-#define DRDY1_PINSEL() PINSEL0 = (PINSEL0 & ~(3 << 30)) | (0 << 30)
-
-#define SSP1_SCK_PINSEL() (PINSEL1 = (PINSEL1 & ~(3 << 2)) | (2 << 2))
-#define SSP1_MISO_PINSEL() (PINSEL1 = (PINSEL1 & ~(3 << 4)) | (2 << 4))
-#define SSP1_MOSI_PINSEL() (PINSEL1 = (PINSEL1 & ~(3 << 6)) | (2 << 6))
-#define SSP1_SSEL_PINSEL() (PINSEL1 = (PINSEL1 & ~(3 << 8)) | (2 << 8))
-
-static uint8_t baro_scp_read_reg_8(uint8_t regno)
-{
- uint8_t value;
- uint8_t foo0 __attribute__ ((unused));
-
- ScpSelect();
- sys_time_usleep(20);
- S1SPDR = regno << 2;
- while(~S1SPSR & _BV(7));
- foo0 = S1SPDR;
-
- S1SPDR = 0;
- while(~S1SPSR & _BV(7));
- value = S1SPDR;
- sys_time_usleep(10);
- ScpUnselect();
-
- return value;
-}
-
-static void baro_scp_write_reg_8(uint8_t regno, uint8_t value)
-{
- uint8_t foo0 __attribute__ ((unused));
- uint8_t foo1 __attribute__ ((unused));
-
- ScpSelect();
-
- foo0 = S1SPSR;
- foo0 = S1SPDR;
-
- sys_time_usleep(20);
- S1SPDR = (regno << 2) | (1 << 1);
- while(~S1SPSR & _BV(7));
- foo0 = S1SPDR;
-
- S1SPDR = value;
- foo1 = S1SPDR;
- while(~S1SPSR & _BV(7));
-
- sys_time_usleep(10);
- ScpUnselect();
-}
-
-static uint16_t baro_scp_read_reg_16(uint8_t regno)
-{
- uint8_t lsb, msb;
- uint8_t foo0 __attribute__ ((unused));
-
- ScpSelect();
- sys_time_usleep(20);
- S1SPDR = regno << 2;
- while(~S1SPSR & _BV(7));
- foo0 = S1SPDR;
-
- S1SPDR = 0;
- while(~S1SPSR & _BV(7));
- msb = S1SPDR;
-
- S1SPDR = 0;
- while(~S1SPSR & _BV(7));
- lsb = S1SPDR;
-
- sys_time_usleep(10);
- ScpUnselect();
-
-
- return (uint16_t) ((msb << 8) | lsb);
-}
-
-void baro_scp_init( void )
-{
-
- SSP1_SCK_PINSEL();
- SSP1_MISO_PINSEL();
- SSP1_MOSI_PINSEL();
- SSP1_SSEL_PINSEL();
- DRDY1_PINSEL();
-
- S1SPCR = _BV(3) | _BV(4) | _BV(5);
- S1SPCCR = 0x80;
-
- baro_scp_status = STA_UNINIT;
-}
-
-void spi1_isr()
-{
- uint32_t msb;
- uint16_t lsb;
-
- if (bit_is_set(DRDY1_IOPIN, DRDY1_PIN)) {
- sys_time_usleep(10);
- baro_scp_temperature = baro_scp_read_reg_16(0x21);
- msb = baro_scp_read_reg_8(0x1F);
- lsb = baro_scp_read_reg_16(0x20);
-
- //if (baro_scp_temperature & 0x2000) {
- // baro_scp_temperature |= 0xC000;
- //}
- baro_scp_temperature = baro_scp_temperature & (0xFFFF >> 2);
- baro_scp_temperature *= 5;
-
- baro_scp_pressure = lsb;
- baro_scp_pressure |= (msb << 16);
- baro_scp_pressure *= 25;
-
- //baro_scp_alt = 9000 - baro_scp_pressure * 0.00084366;
- baro_scp_status = STA_VALID;
- }
-}
-
-/* write 0x0A to 0x03 */
-static void baro_scp_start_high_res_measurement(void) {
- baro_scp_write_reg_8(0x3, 0xA);
-}
diff --git a/sw/airborne/csc/csc_main.c b/sw/airborne/csc/csc_main.c
deleted file mode 100644
index 40f7db23ec..0000000000
--- a/sw/airborne/csc/csc_main.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * $Id: booz2_main.c 3049 2009-02-24 16:51:25Z poine $
- *
- * Copyright (C) 2008 Antoine Drouin
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-
-#include "csc_main.h"
-
-#include "std.h"
-
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-#include "interrupt_hw.h"
-#include "mcu_periph/uart.h"
-#include "csc_telemetry.h"
-#include "generated/periodic.h"
-#include "subsystems/datalink/downlink.h"
-#include "i2c.h"
-
-#include "csc_servos.h"
-#include "csc_throttle.h"
-#include "csc_adc.h"
-#include "csc_rc_spektrum.h"
-#include "csc_msg_def.h"
-
-#include "csc_can.h"
-#include "csc_ap_link.h"
-static inline void on_servo_cmd(struct CscServoCmd *cmd);
-static inline void on_motor_cmd(struct CscMotorMsg *msg);
-
-#define SERVO_TIMEOUT (CPU_TICKS_OF_SEC(0.1) / PERIODIC_TASK_PERIOD)
-#define CSC_STATUS_TIMEOUT (CPU_TICKS_OF_SEC(0.25) / PERIODIC_TASK_PERIOD)
-
-static uint32_t servo_cmd_timeout = 0;
-static uint32_t can_msg_count = 0;
-
-// gps stuff stolen from antoine's code
-#include "booz/booz2_gps.h"
-#include "math/pprz_geodetic_int.h"
-
-struct LtpDef_i booz_ins_ltp_def;
- bool_t booz_ins_ltp_initialised;
-struct NedCoor_i booz_ins_gps_pos_cm_ned;
-struct NedCoor_i booz_ins_gps_speed_cm_s_ned;
-
-static void csc_main_init( void ) {
-
- mcu_init();
- sys_time_register_timer((1./PERIODIC_FREQUENCY), NULL);
- led_init();
-
-#ifdef USE_UART0
- Uart0Init();
-#endif
-#ifdef USE_UART1
- Uart1Init();
-#endif
-
-#ifdef SPEKTRUM_LINK
- spektrum_init();
-#endif
-
-
-#if USE_GPS
- booz2_gps_init();
-#endif
-
- csc_ap_link_init();
- csc_ap_link_set_servo_cmd_cb(on_servo_cmd);
- csc_ap_link_set_motor_cmd_cb(on_motor_cmd);
-
- csc_adc_init();
-
- #ifdef USE_I2C0
- i2c_init();
- #endif
- // be sure to call servos_init after uart1 init since they are sharing pins
- csc_servos_init();
-#ifdef USE_CSC_THROTTLE
- csc_throttle_init();
-#endif
- mcu_int_enable();
-
-
-}
-
-
-static void csc_main_periodic( void ) {
- static uint32_t zeros[4] = {0, 0, 0, 0};
- static uint32_t csc_loops = 0;
-
- #ifdef DOWNLINK
- PeriodicSendAp(DefaultChannel);
- #endif
-
- if (servo_cmd_timeout > SERVO_TIMEOUT) {
- LED_OFF(CAN_LED);
- csc_servos_set(zeros);
- } else {
- servo_cmd_timeout++;
- }
-
- if ((++csc_loops % CSC_STATUS_TIMEOUT) == 0) {
- csc_ap_link_send_status(csc_loops, can_msg_count);
- }
- if ((++csc_loops % CSC_STATUS_TIMEOUT) == 0) {
- csc_adc_periodic();
- }
-
-}
-
-static inline void on_gps_event(void) {
- if (booz_gps_state.fix == BOOZ2_GPS_FIX_3D) {
- if (!booz_ins_ltp_initialised) {
- ltp_def_from_ecef_i(&booz_ins_ltp_def, &booz_gps_state.ecef_pos);
- booz_ins_ltp_initialised = TRUE;
- }
- ned_of_ecef_point_i(&booz_ins_gps_pos_cm_ned, &booz_ins_ltp_def, &booz_gps_state.ecef_pos);
- ned_of_ecef_vect_i(&booz_ins_gps_speed_cm_s_ned, &booz_ins_ltp_def, &booz_gps_state.ecef_vel);
- }
-
- struct CscGPSFixMsg fix_msg;
- struct CscGPSAccMsg acc_msg;
- struct CscGPSPosMsg pos_msg;
-
- fix_msg.gps_fix = (booz_gps_state.fix == BOOZ2_GPS_FIX_3D);
- fix_msg.vx = booz_ins_gps_speed_cm_s_ned.x;
- fix_msg.vy = booz_ins_gps_speed_cm_s_ned.y;
- fix_msg.vz = booz_ins_gps_speed_cm_s_ned.z;
- csc_ap_send_msg(CSC_GPS_FIX_ID, (const uint8_t *) &fix_msg, sizeof(fix_msg));
-
- acc_msg.pacc = booz_gps_state.pacc;
- acc_msg.sacc = booz_gps_state.sacc;
- csc_ap_send_msg(CSC_GPS_ACC_ID, (const uint8_t *) &acc_msg, sizeof(acc_msg));
-
- pos_msg.val = booz_ins_gps_pos_cm_ned.x;
- pos_msg.axis = CSC_GPS_AXIS_IDX_X;
- csc_ap_send_msg(CSC_GPS_POS_ID, (const uint8_t *) &pos_msg, sizeof(pos_msg));
-
- pos_msg.val = booz_ins_gps_pos_cm_ned.y;
- pos_msg.axis = CSC_GPS_AXIS_IDX_Y;
- csc_ap_send_msg(CSC_GPS_POS_ID, (const uint8_t *) &pos_msg, sizeof(pos_msg));
-
- pos_msg.val = booz_ins_gps_pos_cm_ned.z;
- pos_msg.axis = CSC_GPS_AXIS_IDX_Z;
- csc_ap_send_msg(CSC_GPS_POS_ID, (const uint8_t *) &pos_msg, sizeof(pos_msg));
-
-}
-
-static void csc_main_event( void ) {
-
- csc_can_event();
-#ifdef USE_CSC_THROTTLE
- csc_throttle_event_task();
-#endif
-#ifdef SPEKTRUM_LINK
- spektrum_event_task();
-#endif
-#if USE_GPS
- Booz2GpsEvent(on_gps_event);
-#endif
-}
-
-
-#define MIN_SERVO CPU_TICKS_OF_USEC(1000)
-#define MAX_SERVO CPU_TICKS_OF_USEC(2000)
-
-static inline void on_servo_cmd(struct CscServoCmd *cmd)
-{
-
- uint32_t servos_checked[4];
- uint32_t i;
- for (i=0; i<4; i++)
- servos_checked[i] = cmd->servos[i];
- // servos_checked[i] = Chop(servos[i],MIN_SERVO, MAX_SERVO);
- csc_servos_set(servos_checked);
-
- servo_cmd_timeout = 0;
- ++can_msg_count;
-
- // DOWNLINK_SEND_CSC_CAN_MSG(&can1_rx_msg.frame, &can1_rx_msg.id,
- // &can1_rx_msg.dat_a, &can1_rx_msg.dat_b);
- // DOWNLINK_SEND_ADC_GENERIC(&servos[0], &servos[1]);
-
-}
-
-
-static inline void on_motor_cmd(struct CscMotorMsg *msg)
-{
- // always send to throttle_id zero, only one motorcontrol per csc board
- const static uint8_t throttle_id = 0;
-
- #ifdef USE_CSC_THROTTLE
- csc_throttle_send_msg(throttle_id, msg->cmd_id, msg->arg1, msg->arg2);
- #endif
-}
-
-int main( void ) {
- csc_main_init();
- while(1) {
- if (sys_time_check_and_ack_timer(0))
- csc_main_periodic();
- csc_main_event();
- }
- return 0;
-}
-
diff --git a/sw/airborne/csc/csc_protocol.c b/sw/airborne/csc/csc_protocol.c
deleted file mode 100644
index 5acc9fee53..0000000000
--- a/sw/airborne/csc/csc_protocol.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * $Id:$
- *
- * Copyright (C) 2010 Piotr Esden-Tempski
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-#include
-
-#include "csc_protocol.h"
-#include "mcu_periph/can.h"
-#include "csc_msg_def.h"
-
-// #include "mcu.h"
-// #include "mcu_periph/sys_time.h"
-// #include "subsystems/datalink/downlink.h"
-
-#define CSCP_QUEUE_LEN 8
-
-struct cscp_msg {
- uint8_t id;
- uint8_t len;
- uint8_t data[8];
-};
-
-struct cscp_msg_queue {
- int head;
- int tail;
- int full;
- int empty;
- struct cscp_msg msgs[CSCP_QUEUE_LEN];
-} cscp_msg_queue;
-
-/*
- * This handle is being used internally in the protocol driver
- * data points to user supplied memory (user allocated struct)
- * this way we make sure that the user allocates only the amount
- * of memory necessary and we don't have to mess around with malloc
- */
-struct cscp_callback_handle {
- cscp_callback_t callback;
- void *data;
-};
-
-struct cscp_callback_handle cscp_callback_handles[CSC_ID_COUNT];
-
-void cscp_can_rx_callback(uint32_t id, uint8_t *buf, int len);
-void cscp_queue_init(void);
-int cscp_enqueue(uint32_t msg_id, uint8_t *buf, int len);
-int cscp_peek_msg_id(void);
-int cscp_dequeue(uint8_t *buf);
-void cscp_callback_init(void);
-
-void cscp_init(void)
-{
- can_init(cscp_can_rx_callback);
- cscp_queue_init();
- cscp_callback_init();
-}
-
-static inline uint32_t cscp_can_id(uint8_t client_id, uint8_t msg_id)
-{
- return ((client_id & 0xF) << 7) | (msg_id & 0x7F);
-}
-
-static inline uint32_t cscp_msg_id(uint32_t id)
-{
- return (id & 0x7F);
-}
-
-int cscp_transmit(uint32_t client_id, uint8_t msg_id, const uint8_t *buf, uint8_t len)
-{
- uint32_t id = cscp_can_id(client_id, msg_id);
- return can_transmit(id, buf, len);
-}
-
-void cscp_can_rx_callback(uint32_t id, uint8_t *buf, int len)
-{
- /* just store the incoming data in a buffer with very little processing */
-
- /* TODO we should handle the return value of enqueue somehow,
- * the return value tells us if the queue had enough space to
- * store our message or not
- */
- uint32_t msg_id = cscp_msg_id(id);
-
- cscp_enqueue(msg_id, buf, len);
-}
-
-void cscp_event(void)
-{
- /* this periodig is the main csc protocol event dispatcher */
- int msg_id = cscp_peek_msg_id();
-
- if (msg_id == -1){
- return;
- }
-
- if(cscp_callback_handles[msg_id].callback){
- cscp_dequeue(cscp_callback_handles[msg_id].data);
- cscp_callback_handles[msg_id].callback(cscp_callback_handles[msg_id].data);
- return;
- }
-
-}
-
-void cscp_queue_init(void)
-{
- cscp_msg_queue.head = 0;
- cscp_msg_queue.tail = 0;
- cscp_msg_queue.full = 0;
- cscp_msg_queue.empty = 1;
-}
-
-int cscp_enqueue(uint32_t msg_id, uint8_t *buf, int len)
-{
- if (cscp_msg_queue.full) {
- cscp_msg_queue.empty = 0;
- return 1;
- }
- if(!cscp_callback_handles[msg_id].callback) {
- return 2;
- }
-
- cscp_msg_queue.msgs[cscp_msg_queue.tail].id = msg_id;
- cscp_msg_queue.msgs[cscp_msg_queue.tail].len = len;
- memcpy(cscp_msg_queue.msgs[cscp_msg_queue.tail].data, buf, len);
- cscp_msg_queue.tail = (cscp_msg_queue.tail + 1) % CSCP_QUEUE_LEN;
- cscp_msg_queue.empty = 0;
- if (cscp_msg_queue.head == cscp_msg_queue.tail) {
- cscp_msg_queue.full = 1;
- }
-
- return 0;
-}
-
-int cscp_peek_msg_id(void)
-{
- if (cscp_msg_queue.empty) {
- return -1;
- }
- return cscp_msg_queue.msgs[cscp_msg_queue.head].id;
-}
-
-int cscp_dequeue(uint8_t *buf)
-{
- if (cscp_msg_queue.empty) {
- return 1;
- }
-
- memcpy(buf,
- cscp_msg_queue.msgs[cscp_msg_queue.head].data,
- cscp_msg_queue.msgs[cscp_msg_queue.head].len);
- cscp_msg_queue.head = (cscp_msg_queue.head + 1) % CSCP_QUEUE_LEN;
- cscp_msg_queue.full = 0;
- if (cscp_msg_queue.head == cscp_msg_queue.tail) {
- cscp_msg_queue.empty = 1;
- }
-
- return 0;
-}
-
-void cscp_callback_init(void)
-{
- memset(cscp_callback_handles, 0, sizeof(cscp_callback_handles));
-}
-
-void cscp_register_callback(uint32_t msg_id, cscp_callback_t callback, uint8_t *data)
-{
- cscp_callback_handles[msg_id].callback = callback;
- cscp_callback_handles[msg_id].data = data;
-}
diff --git a/sw/airborne/csc/csc_servos.c b/sw/airborne/csc/csc_servos.c
deleted file mode 100644
index 9490b6749d..0000000000
--- a/sw/airborne/csc/csc_servos.c
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "csc_servos.h"
-
-#include "LPC21xx.h"
-#include "std.h"
-#include "mcu_periph/sys_time.h"
-#include "firmwares/rotorcraft/actuators.h"
-#include "generated/airframe.h"
-#include ACTUATORS
-
-#define CSC_SERVOS_NB 4
-
-static uint32_t csc_servos_rng[] = {CPU_TICKS_OF_USEC(SERVO_S1_MAX-SERVO_S1_MIN),
- CPU_TICKS_OF_USEC(SERVO_S2_MAX-SERVO_S2_MIN),
- CPU_TICKS_OF_USEC(SERVO_S3_MAX-SERVO_S3_MIN),
- CPU_TICKS_OF_USEC(SERVO_S4_MAX-SERVO_S4_MIN)};
-static uint32_t csc_servos_min[] = {CPU_TICKS_OF_USEC(SERVO_S1_MIN),
- CPU_TICKS_OF_USEC(SERVO_S2_MIN),
- CPU_TICKS_OF_USEC(SERVO_S3_MIN),
- CPU_TICKS_OF_USEC(SERVO_S4_MIN)};
-
-
-void csc_servos_init(void)
-{
- actuators_init();
-}
-
-/* val == 0 literally mean off, otherwise, val 1-255 are continuous angle */
-void csc_servo_normalized_set(uint8_t id, uint16_t val)
-{
- if(id > 3) return;
- if(val == 0) csc_servo_set(id,0);
- else{
- uint32_t ticks = csc_servos_rng[id]*(val-1);
-
- csc_servo_set(id,ticks/((1<<16)-2) + csc_servos_min[id]);
- }
-}
-
-
-void csc_servos_commit()
-{
- ActuatorsCommit();
-}
-
-void csc_servo_set(uint8_t id, uint32_t val)
-{
- if(id > 3) return;
-
-#ifdef CSC_MOTORS_I2C
- Actuator(id) = val;
-#else
- switch(id){
- case 0: Actuator(0) = val; break;
- case 1: Actuator(5) = val; break;
- case 2: Actuator(4) = val; break;
- case 3: Actuator(3) = val; break;
- }
-#endif
-}
-
-void csc_servos_set(int32_t* val)
-{
-#ifdef CSC_MOTORS_I2C
- Actuator(0) = val[0];
- Actuator(1) = val[1];
- Actuator(2) = val[2];
- Actuator(3) = val[3];
-#else
- Actuator(0) = val[0];
- Actuator(5) = val[1];
- Actuator(4) = val[2];
- Actuator(3) = val[3];
-#endif
-
- csc_servos_commit();
-}
diff --git a/sw/airborne/csc/mercury_csc_main.c b/sw/airborne/csc/mercury_csc_main.c
deleted file mode 100644
index ce9c725186..0000000000
--- a/sw/airborne/csc/mercury_csc_main.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * $Id: booz2_main.c 3049 2009-02-24 16:51:25Z poine $
- *
- * Copyright (C) 2008 Antoine Drouin
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-
-#include "csc_main.h"
-
-#include "std.h"
-
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-
-#include "csc_vane.h"
-
-#ifdef USE_BUSS_TWI_BLMC_MOTOR
-#include "buss_twi_blmc_hw.h"
-#endif
-#include "i2c.h"
-
-#include "csc_servos.h"
-
-#include "airspeed.h"
-#include "baro_ets.h"
-#include "airspeed_ets.h"
-// #include "ams5812.h"
-
-#include "interrupt_hw.h"
-#include "mcu_periph/uart.h"
-#include "csc_telemetry.h"
-
-#include "generated/periodic.h"
-#include "subsystems/datalink/downlink.h"
-
-#include "pwm_input.h"
-#include "csc_airspeed.h"
-#include "csc_baro.h"
-#include "csc_bat_monitor.h"
-
-#include "csc_adc.h"
-
-#include "csc_rc_spektrum.h"
-
-#include "csc_can.h"
-#include "csc_ap_link.h"
-
-static inline void on_servo_cmd(struct CscServoCmd *cmd);
-static inline void on_motor_cmd(struct CscMotorMsg *msg);
-static inline void on_prop_cmd(struct CscPropCmd *msg, int idx);
-
-#define SERVO_TIMEOUT (CPU_TICKS_OF_SEC(0.1) / PERIODIC_TASK_PERIOD)
-#define CSC_STATUS_TIMEOUT (CPU_TICKS_OF_SEC(0.25) / PERIODIC_TASK_PERIOD)
-#define AIRSPEED_TIMEOUT (CPU_TICKS_OF_SEC(0.01) / PERIODIC_TASK_PERIOD)
-
-
-static uint32_t servo_cmd_timeout = 0;
-static uint32_t can_msg_count = 0;
-
-
-static void csc_main_init( void ) {
-
- hw_init();
- sys_time_register_timer((1./PERIODIC_FREQUENCY), NULL);
- led_init();
-
- actuators_init();
-
-
-#ifdef USE_UART0
- Uart0Init();
-#endif
-
-#ifdef USE_UART1
- Uart1Init();
-#endif
-
-#ifdef SPEKTRUM_LINK
- spektrum_init();
-#endif
-
-#ifdef USE_PWM_INPUT
- pwm_input_init();
-#endif
-
-
-// be sure to call servos_init after uart1 init since they are sharing pins
- csc_servos_init();
-
-#ifdef USE_VANE_SENSOR
-#ifndef USE_PWM_INPUT
- pwm_input_init();
-#endif
-#endif
-
- csc_ap_link_init();
- csc_ap_link_set_servo_cmd_cb(on_servo_cmd);
- csc_ap_link_set_motor_cmd_cb(on_motor_cmd);
- csc_ap_link_set_prop_cmd_cb(on_prop_cmd);
-
-#ifdef ADC
- csc_adc_init();
-#endif
-
-
-#ifdef USE_I2C0
- i2c0_init();
-#endif
-
-#ifdef USE_BUSS_TWI_BLMC_MOTOR
- motors_init();
-#endif
-
-#if USE_AIRSPEED
- airspeed_init();
-#endif
-#ifdef USE_AMS5812
- csc_ams5812_init();
-#endif
-#if USE_BARO_SCP
- baro_scp_init();
-#endif
-
-#ifdef USE_BAT_MONITOR
- csc_bat_monitor_init();
-#endif
-
- int_enable();
-
-}
-
-static void csc_main_periodic( void )
-{
- static uint32_t zeros[4] = {0, 0, 0, 0};
- static uint32_t csc_loops = 0;
-
-#ifdef DOWNLINK
- PeriodicSendAp(DefaultChannel);
-#endif
-
-#ifdef USE_VANE_SENSOR
- csc_vane_periodic();
-#endif
-
- if (servo_cmd_timeout > SERVO_TIMEOUT) {
- csc_servos_set(zeros);
- } else {
- servo_cmd_timeout++;
- }
-
- if ((++csc_loops % CSC_STATUS_TIMEOUT) == 0) {
- csc_ap_link_send_status(csc_loops, can_msg_count);
- }
-
- csc_adc_periodic();
-
- if ((csc_loops % AIRSPEED_TIMEOUT) == 0) {
- } else if ((csc_loops % AIRSPEED_TIMEOUT) == 1) {
-#if USE_BARO_ETS
- baro_ets_periodic();
-#endif
-#if USE_AIRSPEED
- csc_airspeed_periodic();
-#endif
-#ifdef USE_AMS5812
- csc_ams5812_periodic();
- csc_ap_link_send_pressure(ams5812_pressure[0], ams5812_pressure[1]);
-#endif
- }
-
-#if USE_AIRSPEED
- airspeed_update();
-#endif
-
-#if USE_BARO_SCP
- baro_scp_periodic();
- csc_ap_link_send_baro(baro_scp_pressure, baro_scp_temperature, baro_scp_status);
-#endif
-
-#ifdef USE_BAT_MONITOR
- csc_bat_monitor_periodic();
-#endif
-
-}
-
-static void csc_main_event( void ) {
- csc_can_event();
-
-#ifdef USE_BUSS_TWI_BLMC_MOTOR
- motors_event();
-#endif
-
-#ifdef SPEKTRUM_LINK
- spektrum_event_task();
-#endif
-}
-
-#define MIN_SERVO CPU_TICKS_OF_USEC(1000)
-#define MAX_SERVO CPU_TICKS_OF_USEC(2000)
-
-#ifdef USE_BUSS_TWI_BLMC_MOTOR
-static void on_prop_cmd(struct CscPropCmd *cmd, int idx)
-{
- for(uint8_t i = 0; i < 4; i++)
- motors_set_motor(i + idx * 4, cmd->speeds[i]);
-
- motors_commit(idx == 1);
-
- ++can_msg_count;
-}
-#else
-static void on_prop_cmd(struct CscPropCmd *cmd, int idx) {}
-#endif
-
-static void on_servo_cmd(struct CscServoCmd *cmd)
-{
- uint16_t* servos = (uint16_t*)(cmd);
- uint8_t i;
-
- // uint32_t servos_checked[4];
- for(i = 0; i < 4; i++) {
- csc_servo_normalized_set(i,servos[i]);
- }
- csc_servos_commit();
- servo_cmd_timeout = 0;
- ++can_msg_count;
-}
-
-static void on_motor_cmd(struct CscMotorMsg *msg) {}
-
-int main( void ) {
- csc_main_init();
-// Uart0PrintString("Hello");
- while(1) {
- if (sys_time_check_and_ack_timer(0)) {
- csc_main_periodic();
- }
- csc_main_event();
- }
- return 0;
-}
-
diff --git a/sw/airborne/csc/mercury_main.c b/sw/airborne/csc/mercury_main.c
deleted file mode 100644
index 1ce22fb4b5..0000000000
--- a/sw/airborne/csc/mercury_main.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * $Id: booz2_main.c 3049 2009-02-24 16:51:25Z poine $
- *
- * Copyright (C) 2008 Antoine Drouin
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-
-#include "csc_main.h"
-
-#include "std.h"
-
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-#include "interrupt_hw.h"
-#include "mcu_periph/uart.h"
-#include "subsystems/datalink/downlink.h"
-#include "generated/periodic.h"
-#include "generated/airframe.h"
-#include "commands.h"
-
-#include "csc_msg_def.h"
-#include ACTUATORS
-#include "subsystems/imu.h"
-#include "booz/ahrs/ahrs_aligner.h"
-#include "booz/ahrs.h"
-#include "mercury_xsens.h"
-#include "csc_telemetry.h"
-#include "csc_adc.h"
-#include "mercury_ap.h"
-#include "booz/booz2_autopilot.h"
-#include "booz/guidance/booz2_guidance_v.h"
-#include "csc_can.h"
-#include "csc_baro.h"
-#include "subsystems/radio_control.h"
-
-#include "booz/stabilization/stabilization_attitude.h"
-
-extern uint8_t vsupply;
-
-
-#define CSC_STATUS_TIMEOUT (CPU_TICKS_OF_SEC(0.25) / PERIODIC_TASK_PERIOD)
-
-#define PPRZ_MODE_MOTORS_OFF 0
-#define PPRZ_MODE_MOTORS_ON 1
-#define PPRZ_MODE_IN_FLIGHT 2
-
-uint8_t pprz_mode = PPRZ_MODE_MOTORS_OFF;
-static uint16_t cpu_time = 0;
-
-static inline void csc_main_init( void );
-static inline void csc_main_periodic( void );
-static inline void csc_main_event( void );
-
-int main( void ) {
- csc_main_init();
- while(1) {
- if (sys_time_check_and_ack_timer(0))
- csc_main_periodic();
- csc_main_event();
- }
- return 0;
-}
-
-static void nop(struct CscCanMsg *msg)
-{
-
-}
-
-static void on_rc_cmd(struct CscRCMsg *msg)
-{
- uint16_t aux2_flag;
-
- radio_control.values[RADIO_ROLL] = CSC_RC_SCALE*(msg->right_stick_horizontal - CSC_RC_OFFSET);
- radio_control.values[RADIO_PITCH] = -CSC_RC_SCALE*(msg->right_stick_vertical - CSC_RC_OFFSET);
- radio_control.values[RADIO_YAW] = CSC_RC_SCALE*((msg->left_stick_horizontal_and_aux2 & ~(3 << 13)) - CSC_RC_OFFSET);
- pprz_mode = (msg->left_stick_vertical_and_flap_mix & (3 << 13)) >> 13;
- aux2_flag = (msg->left_stick_horizontal_and_aux2 >> 13) & 0x1;
- radio_control.values[RADIO_MODE2] = (aux2_flag == 0) ? -7000 : ( (aux2_flag == 1) ? 0 : 7000);
- radio_control.values[RADIO_MODE] = (pprz_mode == 0) ? -7000 : ( (pprz_mode == 1) ? 0 : 7000);
- radio_control.values[RADIO_THROTTLE] = -CSC_RC_SCALE*((msg->left_stick_vertical_and_flap_mix & ~(3 << 13)) - CSC_RC_OFFSET);
-
- radio_control.time_since_last_frame = 0;
- radio_control.status = RC_OK;
-}
-
-static inline void csc_main_init( void ) {
-
- mcu_init();
- sys_time_register_timer((1./PERIODIC_FREQUENCY), NULL);
- led_init();
-
- Uart0Init();
- Uart1Init();
-
- imu_init();
-
- ahrs_aligner_init();
- ahrs_init();
-
- xsens_init();
-
- stabilization_attitude_init();
- booz2_guidance_v_init();
- booz_ins_init();
-
- csc_adc_init();
-
- baro_scp_init();
-
- csc_ap_link_init();
- csc_ap_link_set_servo_cmd_cb(&nop);
- csc_ap_link_set_motor_cmd_cb(&nop);
- csc_ap_link_set_rc_cmd_cb(on_rc_cmd);
- actuators_init();
-
- props_init();
-
- csc_ap_init();
- mcu_int_enable();
-
- stabilization_attitude_enter();
-}
-
-
-static inline void csc_main_periodic( void )
-{
- static uint32_t csc_loops = 0;
-
- PeriodicSendAp();
- radio_control_periodic();
-
- cpu_time++;
-
- if ((++csc_loops % CSC_STATUS_TIMEOUT) == 0) {
- csc_adc_periodic();
- }
- xsens_periodic_task();
-
- baro_scp_periodic();
-
- csc_ap_periodic(pprz_mode == PPRZ_MODE_IN_FLIGHT,
- !(pprz_mode > PPRZ_MODE_MOTORS_OFF && ahrs_aligner.status == AHRS_ALIGNER_LOCKED));
-
-}
-
-static inline void csc_main_event( void )
-{
- csc_can_event();
- xsens_event_task();
- DatalinkEvent();
-}
diff --git a/sw/airborne/csc/ppm_bridge_main.c b/sw/airborne/csc/ppm_bridge_main.c
deleted file mode 100644
index 1cd8521013..0000000000
--- a/sw/airborne/csc/ppm_bridge_main.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * $Id: booz2_main.c 3049 2009-02-24 16:51:25Z poine $
- *
- * Copyright (C) 2008 Antoine Drouin
- *
- * This file is part of paparazzi.
- *
- * 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,
- * 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.
- *
- */
-
-#include
-
-#include "csc_main.h"
-
-#include "std.h"
-
-#include "mcu.h"
-#include "mcu_periph/sys_time.h"
-#include "led.h"
-#include "interrupt_hw.h"
-#include "mcu_periph/uart.h"
-#include "subsystems/datalink/downlink.h"
-#include "generated/periodic.h"
-#include "generated/airframe.h"
-#include "commands.h"
-#include "subsystems/radio_control.h"
-
-#include "csc_telemetry.h"
-#include "led.h"
-
-#include "subsystems/datalink/pprz_transport.h"
-
-#define RC_PROTOCOL_SYNC 13999
-
-extern uint8_t vsupply;
-
-static uint16_t cpu_time = 0;
-
-static void csc_main_init( void ) {
-
- mcu_init();
- sys_time_register_timer((1./PERIODIC_FREQUENCY), NULL);
- led_init();
-
- Uart0Init();
- Uart1Init();
-
- ppm_init();
-
- // Configure P0.21 as GPIO, output and then pull high as we use it to drive ppm input transistor
- PINSEL1 = PINSEL1 & ~(0x3 << 10);
- IO0DIR = IO0DIR | (0x1 << 21);
- IO0PIN = IO0DIR | (0x1 << 21);
-
- mcu_int_enable();
-
-}
-
-
-static void csc_main_periodic( void )
-{
- PeriodicSendAp(DefaultChannel);
- radio_control_periodic_task();
-
- cpu_time++;
-}
-
-static void send_short( int16_t s )
-{
- Uart1Transmit(s >> 8);
- Uart1Transmit(s & 0xFF);
-}
-
-static void send_channel ( int16_t c )
-{
- send_short(c);
- send_short(~c);
-}
-
-static void on_rc_event( void )
-{
-
-#ifdef SWAP_STICKS
- int temp;
- temp = rc_values[RADIO_YAW];
- rc_values[RADIO_YAW] = rc_values[RADIO_ROLL];
- rc_values[RADIO_ROLL] = temp;
-#endif
-
- // 7 channels
- // integers -9600 to +9600
-
- // sync bytes
- send_channel(RC_PROTOCOL_SYNC);
-
- for (int i = 0; i < RADIO_CTL_NB; i++) {
- send_channel(rc_values[i]);
- }
-
- LED_TOGGLE(3);
-}
-
-static void csc_main_event( void )
-{
- RadioControlEventCheckAndHandle(on_rc_event);
- DatalinkEvent();
-}
-
-int main( void ) {
- csc_main_init();
- while(1) {
- if (sys_time_check_and_ack_timer(0))
- csc_main_periodic();
- csc_main_event();
- }
- return 0;
-}
diff --git a/sw/airborne/firmwares/rotorcraft/actuators/actuators_heli.c b/sw/airborne/firmwares/rotorcraft/actuators/actuators_heli.c
index 1951252929..196dc528fe 100644
--- a/sw/airborne/firmwares/rotorcraft/actuators/actuators_heli.c
+++ b/sw/airborne/firmwares/rotorcraft/actuators/actuators_heli.c
@@ -43,7 +43,9 @@
#endif
#define Actuator(_x) actuators_pwm_values[_x]
+#ifndef ChopServo
#define ChopServo(x,a,b) Chop(x, a, b)
+#endif
#define ActuatorsCommit actuators_pwm_commit
int32_t actuators_pwm_values[ACTUATORS_PWM_NB];
diff --git a/sw/airborne/firmwares/rotorcraft/autopilot.h b/sw/airborne/firmwares/rotorcraft/autopilot.h
index b2eda139d3..ad9bc6f23f 100644
--- a/sw/airborne/firmwares/rotorcraft/autopilot.h
+++ b/sw/airborne/firmwares/rotorcraft/autopilot.h
@@ -45,6 +45,7 @@
#define AP_MODE_HOVER_CLIMB 10
#define AP_MODE_HOVER_Z_HOLD 11
#define AP_MODE_NAV 12
+#define AP_MODE_RC_DIRECT 13 // Safety Pilot Direct Commands for helicopter direct control: appropriately chosen as mode "13"
extern uint8_t autopilot_mode;
diff --git a/sw/airborne/firmwares/rotorcraft/guidance/guidance_h.c b/sw/airborne/firmwares/rotorcraft/guidance/guidance_h.c
index 5bb1c2dfa8..4c7a1eefd4 100644
--- a/sw/airborne/firmwares/rotorcraft/guidance/guidance_h.c
+++ b/sw/airborne/firmwares/rotorcraft/guidance/guidance_h.c
@@ -146,12 +146,12 @@ void guidance_h_read_rc(bool_t in_flight) {
break;
case GUIDANCE_H_MODE_HOVER:
- STABILIZATION_ATTITUDE_READ_RC(guidance_h_rc_sp, in_flight);
+ stabilization_attitude_read_rc_ref(&guidance_h_rc_sp, in_flight);
break;
case GUIDANCE_H_MODE_NAV:
if (radio_control.status == RC_OK) {
- STABILIZATION_ATTITUDE_READ_RC(guidance_h_rc_sp, in_flight);
+ stabilization_attitude_read_rc_ref(&guidance_h_rc_sp, in_flight);
guidance_h_rc_sp.psi = 0;
}
else {
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.c b/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.c
similarity index 62%
rename from sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.c
rename to sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.c
index 435f832b50..10b3029f05 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.c
@@ -4,7 +4,7 @@
*
*/
-/** \file quat_setpoint.c
+/** \file quat_setpoint_int.c
* \brief Quaternion setpoint generation
*
*/
@@ -12,7 +12,7 @@
#include "subsystems/ahrs.h"
#include "stabilization/stabilization_attitude_ref_quat_int.h"
-#include "stabilization/quat_setpoint.h"
+#include "stabilization/quat_setpoint_int.h"
#include "stabilization.h"
#include "messages.h"
@@ -55,60 +55,7 @@ static void reset_sp_quat(int32_t _psi, int32_t _theta, struct Int32Quat *initia
QUAT_COPY(stab_att_sp_quat, pitch_rotated_quat2);
}
-static void update_sp_quat_from_eulers(void) {
- struct Int32RMat sp_rmat;
-
-#ifdef STICKS_RMAT312
- INT32_RMAT_OF_EULERS_312(sp_rmat, stab_att_sp_euler);
-#else
- INT32_RMAT_OF_EULERS_321(sp_rmat, stab_att_sp_euler);
-#endif
- INT32_QUAT_OF_RMAT(stab_att_sp_quat, sp_rmat);
- INT32_QUAT_WRAP_SHORTEST(stab_att_sp_quat);
-}
-
-/* FIXME: what is up with this???
-void stabilization_attitude_read_rc_incremental(bool_t enable_alpha_vane, bool_t enable_beta_vane)
-{
- pprz_t roll = radio_control.values[RADIO_ROLL];
- pprz_t pitch = radio_control.values[RADIO_PITCH];
- pprz_t yaw = radio_control.values[RADIO_YAW];
- struct Int32Quat prev_sp_quat, q_e2s, temp_quat;
-
- struct Int32RMat R_e2s;
- struct Int32Rates sticks_w_bn_e, sticks_w_bn_s;
-
- QUAT_COPY(prev_sp_quat, stab_att_sp_quat);
-
- sticks_w_bn_e.p = APPLY_DEADBAND(roll, STABILIZATION_ATTITUDE_DEADBAND_A) * ROLL_COEF_H;
- sticks_w_bn_e.q = APPLY_DEADBAND(pitch, STABILIZATION_ATTITUDE_DEADBAND_E) * PITCH_COEF_RATE;
- sticks_w_bn_e.r = APPLY_DEADBAND(yaw, STABILIZATION_ATTITUDE_DEADBAND_R) * YAW_COEF_RATE;
-
- // Don't let the sticks command a theta rotation in vane mode
- if (enable_alpha_vane) {
- sticks_w_bn_e.q = 0;
- }
-
- if (enable_beta_vane) {
- sticks_w_bn_e.r = 0;
- }
- // q_e2s = q_sp (comp) q_b^(-1)
- INT_QUAT_INV_COMP_NORM_SHORTEST(q_e2s, ahrs.ltp_to_body_quat, stab_att_sp_quat);
-
- INT_RMAT_OF_QUAT(R_e2s, q_e2s);
-
- INT_RMAT_RATEMULT(sticks_w_bn_s, R_e2s, sticks_w_bn_e);
-
- INT_QUAT_DIFFERENTIAL(temp_quat, sticks_w_bn_s, 1/RC_UPDATE_FREQ);
-
- INT32_QUAT_COMP_NORM_SHORTEST(stab_att_sp_quat, prev_sp_quat, temp_quat);
-
- // update euler setpoints for telemetry
- INT32_EULERS_OF_QUAT(stab_att_sp_euler, stab_att_sp_quat);
-}
-*/
-
-void stabilization_attitude_read_rc_absolute(struct Int32Eulers sp, bool_t in_flight) {
+void stabilization_attitude_read_rc_absolute(bool_t in_flight) {
// FIXME: wtf???
#ifdef AIRPLANE_STICKS
@@ -147,7 +94,7 @@ void stabilization_attitude_read_rc_absolute(struct Int32Eulers sp, bool_t in_fl
INT32_EULERS_OF_QUAT(stab_att_sp_euler, stab_att_sp_quat);
}
-void stabilization_attitude_sp_enter()
+void stabilization_attitude_sp_enter(void)
{
// reset setpoint to "hover"
reset_sp_quat(0., 0., &ahrs.ltp_to_body_quat);
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.h b/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.h
similarity index 56%
rename from sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.h
rename to sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.h
index fe8ddc2230..da4b8b08ac 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/quat_setpoint_int.h
@@ -13,9 +13,6 @@
void stabilization_attitude_sp_enter(void);
-// FIXME: apparently unused... still needed??
-//void stabilization_attitude_read_rc_incremental(bool_t enable_alpha_vane, bool_t enable_beta_vane);
-
-void stabilization_attitude_read_rc_absolute(struct Int32Eulers sp, bool_t in_flight);
+void stabilization_attitude_read_rc_absolute(bool_t in_flight);
#endif
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude.h
index f4b1259353..74e46759d1 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude.h
@@ -28,8 +28,6 @@
#include STABILISATION_ATTITUDE_H
extern void stabilization_attitude_init(void);
extern void stabilization_attitude_read_rc(bool_t in_flight);
-extern void stabilization_attitude_read_beta_vane(float beta);
-extern void stabilization_attitude_read_alpha_vane(float alpha);
extern void stabilization_attitude_enter(void);
extern void stabilization_attitude_run(bool_t in_flight);
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_euler_int.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_euler_int.c
index 24569f0e78..4524917124 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_euler_int.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_euler_int.c
@@ -1,6 +1,4 @@
/*
- * $Id$
- *
* Copyright (C) 2008-2009 Antoine Drouin
*
* This file is part of paparazzi.
@@ -69,7 +67,7 @@ void stabilization_attitude_init(void) {
void stabilization_attitude_read_rc(bool_t in_flight) {
- STABILIZATION_ATTITUDE_READ_RC(stab_att_sp_euler, in_flight);
+ stabilization_attitude_read_rc_ref(&stab_att_sp_euler, in_flight);
}
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_float.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_float.c
index 4ca17813fc..ca4ad1535f 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_float.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_float.c
@@ -213,6 +213,7 @@ void stabilization_attitude_run(bool_t enable_integrator) {
attitude_run_fb(stabilization_att_fb_cmd, &stabilization_gains[gain_idx], &att_err, &rate_err, &ahrs_float.body_rate_d, &stabilization_att_sum_err_quat);
+ // FIXME: this is very dangerous! only works if this really includes all commands
for (int i = COMMAND_ROLL; i <= COMMAND_YAW_SURFACE; i++) {
stabilization_cmd[i] = stabilization_att_fb_cmd[i]+stabilization_att_ff_cmd[i];
}
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_int.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_int.c
index a221633e5e..fc8942161a 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_int.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_quat_int.c
@@ -1,5 +1,4 @@
/*
- *
* Copyright (C) 2008-2009 Antoine Drouin
*
* This file is part of paparazzi.
@@ -20,12 +19,15 @@
* Boston, MA 02111-1307, USA.
*/
-/** \file stabilization_attitude_quat_int.c
- * \brief Booz quaternion attitude stabilization
+/** @file stabilization_attitude_quat_int.c
+ * Rotorcraft quaternion attitude stabilization
*/
#include "firmwares/rotorcraft/stabilization.h"
-#include "firmwares/rotorcraft/stabilization/quat_setpoint.h"
+
+#if USE_SETPOINTS_WITH_TRANSITIONS
+#include "firmwares/rotorcraft/stabilization/quat_setpoint_int.h"
+#endif
#include
#include "math/pprz_algebra_float.h"
@@ -46,46 +48,6 @@ struct Int32Eulers stabilization_att_sum_err;
int32_t stabilization_att_fb_cmd[COMMANDS_NB];
int32_t stabilization_att_ff_cmd[COMMANDS_NB];
-//static int gain_idx = STABILIZATION_ATTITUDE_GAIN_IDX_DEFAULT;
-
-/*
-static const float phi_pgain[] = STABILIZATION_ATTITUDE_PHI_PGAIN;
-static const float theta_pgain[] = STABILIZATION_ATTITUDE_THETA_PGAIN;
-static const float psi_pgain[] = STABILIZATION_ATTITUDE_PSI_PGAIN;
-
-static const float phi_dgain[] = STABILIZATION_ATTITUDE_PHI_DGAIN;
-static const float theta_dgain[] = STABILIZATION_ATTITUDE_THETA_DGAIN;
-static const float psi_dgain[] = STABILIZATION_ATTITUDE_PSI_DGAIN;
-
-static const float phi_igain[] = STABILIZATION_ATTITUDE_PHI_IGAIN;
-static const float theta_igain[] = STABILIZATION_ATTITUDE_THETA_IGAIN;
-static const float psi_igain[] = STABILIZATION_ATTITUDE_PSI_IGAIN;
-
-static const float phi_ddgain[] = STABILIZATION_ATTITUDE_PHI_DDGAIN;
-static const float theta_ddgain[] = STABILIZATION_ATTITUDE_THETA_DDGAIN;
-static const float psi_ddgain[] = STABILIZATION_ATTITUDE_PSI_DDGAIN;
-
-static const float phi_dgain_d[] = STABILIZATION_ATTITUDE_PHI_DGAIN_D;
-static const float theta_dgain_d[] = STABILIZATION_ATTITUDE_THETA_DGAIN_D;
-static const float psi_dgain_d[] = STABILIZATION_ATTITUDE_PSI_DGAIN_D;
-
-static const float phi_pgain_surface[] = STABILIZATION_ATTITUDE_PHI_PGAIN_SURFACE;
-static const float theta_pgain_surface[] = STABILIZATION_ATTITUDE_THETA_PGAIN_SURFACE;
-static const float psi_pgain_surface[] = STABILIZATION_ATTITUDE_PSI_PGAIN_SURFACE;
-
-static const float phi_dgain_surface[] = STABILIZATION_ATTITUDE_PHI_DGAIN_SURFACE;
-static const float theta_dgain_surface[] = STABILIZATION_ATTITUDE_THETA_DGAIN_SURFACE;
-static const float psi_dgain_surface[] = STABILIZATION_ATTITUDE_PSI_DGAIN_SURFACE;
-
-static const float phi_igain_surface[] = STABILIZATION_ATTITUDE_PHI_IGAIN_SURFACE;
-static const float theta_igain_surface[] = STABILIZATION_ATTITUDE_THETA_IGAIN_SURFACE;
-static const float psi_igain_surface[] = STABILIZATION_ATTITUDE_PSI_IGAIN_SURFACE;
-
-static const float phi_ddgain_surface[] = STABILIZATION_ATTITUDE_PHI_DDGAIN_SURFACE;
-static const float theta_ddgain_surface[] = STABILIZATION_ATTITUDE_THETA_DDGAIN_SURFACE;
-static const float psi_ddgain_surface[] = STABILIZATION_ATTITUDE_PSI_DDGAIN_SURFACE;
-*/
-
#define IERROR_SCALE 1024
#define GAIN_PRESCALER_FF 1
#define GAIN_PRESCALER_P 1
@@ -96,43 +58,21 @@ void stabilization_attitude_init(void) {
stabilization_attitude_ref_init();
- /*
- for (int i = 0; i < STABILIZATION_ATTITUDE_GAIN_NB; i++) {
- VECT3_ASSIGN(stabilization_gains[i].p, phi_pgain[i], theta_pgain[i], psi_pgain[i]);
- VECT3_ASSIGN(stabilization_gains[i].d, phi_dgain[i], theta_dgain[i], psi_dgain[i]);
- VECT3_ASSIGN(stabilization_gains[i].i, phi_igain[i], theta_igain[i], psi_igain[i]);
- VECT3_ASSIGN(stabilization_gains[i].dd, phi_ddgain[i], theta_ddgain[i], psi_ddgain[i]);
- VECT3_ASSIGN(stabilization_gains[i].rates_d, phi_dgain_d[i], theta_dgain_d[i], psi_dgain_d[i]);
- VECT3_ASSIGN(stabilization_gains[i].surface_p, phi_pgain_surface[i], theta_pgain_surface[i], psi_pgain_surface[i]);
- VECT3_ASSIGN(stabilization_gains[i].surface_d, phi_dgain_surface[i], theta_dgain_surface[i], psi_dgain_surface[i]);
- VECT3_ASSIGN(stabilization_gains[i].surface_i, phi_igain_surface[i], theta_igain_surface[i], psi_igain_surface[i]);
- VECT3_ASSIGN(stabilization_gains[i].surface_dd, phi_ddgain_surface[i], theta_ddgain_surface[i], psi_ddgain_surface[i]);
- }
- */
-
INT32_QUAT_ZERO( stabilization_att_sum_err_quat );
INT_EULERS_ZERO( stabilization_att_sum_err );
}
- /*
-void stabilization_attitude_gain_schedule(uint8_t idx)
-{
- if (gain_idx >= STABILIZATION_ATTITUDE_GAIN_NB) {
- // This could be bad -- Just say no.
- return;
- }
- gain_idx = idx;
- stabilization_attitude_ref_schedule(idx);
-}
- */
-
void stabilization_attitude_enter(void) {
+#if !USE_SETPOINTS_WITH_TRANSITIONS
+ /* reset psi setpoint to current psi angle */
+ stab_att_sp_euler.psi = ahrs.ltp_to_body_euler.psi;
+#endif
+
stabilization_attitude_ref_enter();
- INT32_QUAT_ZERO( stabilization_att_sum_err_quat );
- //FLOAT_EULERS_ZERO( stabilization_att_sum_err_eulers );
- INT_EULERS_ZERO( stabilization_att_sum_err );
+ INT32_QUAT_ZERO(stabilization_att_sum_err_quat);
+ INT_EULERS_ZERO(stabilization_att_sum_err);
}
#define OFFSET_AND_ROUND(_a, _b) (((_a)+(1<<((_b)-1)))>>(_b))
@@ -208,18 +148,29 @@ void stabilization_attitude_run(bool_t enable_integrator) {
INT_EULERS_ZERO( stabilization_att_sum_err );
}
+ /* compute the feed forward command */
attitude_run_ff(stabilization_att_ff_cmd, &stabilization_gains, &stab_att_ref_accel);
+ /* compute the feed back command */
attitude_run_fb(stabilization_att_fb_cmd, &stabilization_gains, &att_err, &rate_err, &stabilization_att_sum_err_quat);
- for (int i = COMMAND_ROLL; i <= COMMAND_YAW; i++) {
- stabilization_cmd[i] = stabilization_att_fb_cmd[i]+stabilization_att_ff_cmd[i];
- Bound(stabilization_cmd[i], -200, 200);
- }
+ /* sum feedforward and feedback */
+ stabilization_cmd[COMMAND_ROLL] = stabilization_att_fb_cmd[COMMAND_ROLL] + stabilization_att_ff_cmd[COMMAND_ROLL];
+ stabilization_cmd[COMMAND_PITCH] = stabilization_att_fb_cmd[COMMAND_PITCH] + stabilization_att_ff_cmd[COMMAND_PITCH];
+ stabilization_cmd[COMMAND_YAW] = stabilization_att_fb_cmd[COMMAND_YAW] + stabilization_att_ff_cmd[COMMAND_YAW];
+
+ /* bound the result */
+ Bound(stabilization_cmd[COMMAND_ROLL], -200, 200);
+ Bound(stabilization_cmd[COMMAND_PITCH], -200, 200);
+ Bound(stabilization_cmd[COMMAND_YAW], -200, 200);
}
void stabilization_attitude_read_rc(bool_t in_flight) {
- STABILIZATION_ATTITUDE_READ_RC(stab_att_sp_euler, in_flight);
+#if USE_SETPOINTS_WITH_TRANSITIONS
+ stabilization_attitude_read_rc_absolute(in_flight);
+#else
+ stabilization_attitude_read_rc_setpoint(in_flight);
+#endif
}
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.c
index 075fc7f67d..de71614943 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.c
@@ -23,8 +23,8 @@
#include "firmwares/rotorcraft/stabilization.h"
-struct Int32Eulers stab_att_sp_euler;
-struct Int32Eulers stab_att_ref_euler;
+struct Int32Eulers stab_att_sp_euler; ///< with #REF_ANGLE_FRAC
+struct Int32Eulers stab_att_ref_euler; ///< with #REF_ANGLE_FRAC
struct Int32Rates stab_att_ref_rate;
struct Int32Rates stab_att_ref_accel;
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.h
index b511ea7162..66cc06fed0 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_euler_int.h
@@ -26,59 +26,6 @@
#include "stabilization_attitude_ref_int.h"
-#include "subsystems/radio_control.h"
-
-
-#define REF_ACCEL_FRAC 12
-#define REF_RATE_FRAC 16
-#define REF_ANGLE_FRAC 20
-#define REF_ANGLE_PI BFP_OF_REAL(3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
-#define REF_ANGLE_TWO_PI BFP_OF_REAL(2.*3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
-#define ANGLE_REF_NORMALIZE(_a) { \
- while (_a > REF_ANGLE_PI) _a -= REF_ANGLE_TWO_PI; \
- while (_a < -REF_ANGLE_PI) _a += REF_ANGLE_TWO_PI; \
- }
-
-
-
-/*
- * Radio Control
- */
-#define SP_MAX_PHI ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_PHI)
-#define SP_MAX_THETA ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_THETA)
-#define SP_MAX_R ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_R)
-
-
-
-
-
-#define RC_UPDATE_FREQ 40
-
-#define YAW_DEADBAND_EXCEEDED() \
- (radio_control.values[RADIO_YAW] > STABILIZATION_ATTITUDE_DEADBAND_R || \
- radio_control.values[RADIO_YAW] < -STABILIZATION_ATTITUDE_DEADBAND_R)
-
-#define STABILIZATION_ATTITUDE_READ_RC(_sp, _inflight) { \
- \
- _sp.phi = \
- ((int32_t)-radio_control.values[RADIO_ROLL] * (int32_t)SP_MAX_PHI / MAX_PPRZ) \
- << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC); \
- _sp.theta = \
- ((int32_t) radio_control.values[RADIO_PITCH] * (int32_t)SP_MAX_THETA / MAX_PPRZ) \
- << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC); \
- if (_inflight) { \
- if (YAW_DEADBAND_EXCEEDED()) { \
- _sp.psi += \
- ((int32_t)-radio_control.values[RADIO_YAW] * (int32_t)SP_MAX_R / MAX_PPRZ / RC_UPDATE_FREQ) \
- << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC); \
- ANGLE_REF_NORMALIZE(_sp.psi); \
- } \
- } \
- else { /* if not flying, use current yaw as setpoint */ \
- _sp.psi = (ahrs.ltp_to_body_euler.psi << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC)); \
- } \
- }
-
#define STABILIZATION_ATTITUDE_ADD_SP(_add_sp) { \
EULERS_ADD(stab_att_sp_euler,_add_sp); \
ANGLE_REF_NORMALIZE(stab_att_sp_euler.psi); \
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_float.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_float.h
index 36f31cdd97..fcdf56f0eb 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_float.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_float.h
@@ -20,8 +20,8 @@
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#ifndef BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H
-#define BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H
+#ifndef STABILISATION_ATTITUDE_REF_FLOAT_H
+#define STABILISATION_ATTITUDE_REF_FLOAT_H
#include "generated/airframe.h"
@@ -39,4 +39,4 @@ struct FloatRefModel {
extern struct FloatRefModel stab_att_ref_model[];
-#endif /* BOOZ_STABILISATION_ATTITUDE_REF_FLOAT_H */
+#endif /* STABILISATION_ATTITUDE_REF_FLOAT_H */
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_int.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_int.h
index 25e38111fc..ef6d03ab7d 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_int.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_int.h
@@ -20,17 +20,25 @@
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#ifndef BOOZ_STABILISATION_ATTITUDE_REF_INT_H
-#define BOOZ_STABILISATION_ATTITUDE_REF_INT_H
+#ifndef STABILISATION_ATTITUDE_REF_INT_H
+#define STABILISATION_ATTITUDE_REF_INT_H
-extern struct Int32Eulers stab_att_sp_vi_euler; /* vehicle interface */
-extern struct Int32Eulers stab_att_sp_rc_euler; /* radio control */
-extern struct Int32Eulers stab_att_sp_euler; /* sum of the above */
-extern struct Int32Quat stab_att_sp_quat;
+#include "generated/airframe.h"
+#include "math/pprz_algebra_int.h"
+
+// FIXME: move stabilization_attitude_read_rc_ref somewere else, so we don't need these includes here???
+#include "subsystems/radio_control.h"
+#include "subsystems/ahrs.h"
+
+/*
+ * CAUTION! stabilization euler has the euler angles with REF_ANGLE_FRAC, but stab quat with INT32_ANGLE_FRAC
+ */
+extern struct Int32Eulers stab_att_sp_euler;
+extern struct Int32Quat stab_att_sp_quat; ///< with #INT32_QUAT_FRAC
extern struct Int32Eulers stab_att_ref_euler;
-extern struct Int32Quat stab_att_ref_quat;
-extern struct Int32Rates stab_att_ref_rate;
-extern struct Int32Rates stab_att_ref_accel;
+extern struct Int32Quat stab_att_ref_quat; ///< with #INT32_QUAT_FRAC
+extern struct Int32Rates stab_att_ref_rate; ///< with #REF_RATE_FRAC
+extern struct Int32Rates stab_att_ref_accel; ///< with #REF_ACCEL_FRAC
struct Int32RefModel {
struct Int32Rates omega;
@@ -39,4 +47,47 @@ struct Int32RefModel {
extern struct Int32RefModel stab_att_ref_model;
-#endif /* BOOZ_STABILISATION_ATTITUDE_REF_INT_H */
+#define REF_ACCEL_FRAC 12
+#define REF_RATE_FRAC 16
+#define REF_ANGLE_FRAC 20
+
+#define REF_ANGLE_PI BFP_OF_REAL(3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
+#define REF_ANGLE_TWO_PI BFP_OF_REAL(2.*3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
+#define ANGLE_REF_NORMALIZE(_a) { \
+ while (_a > REF_ANGLE_PI) _a -= REF_ANGLE_TWO_PI; \
+ while (_a < -REF_ANGLE_PI) _a += REF_ANGLE_TWO_PI; \
+ }
+
+#define SP_MAX_PHI (int32_t)ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_PHI)
+#define SP_MAX_THETA (int32_t)ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_THETA)
+#define SP_MAX_R (int32_t)ANGLE_BFP_OF_REAL(STABILIZATION_ATTITUDE_SP_MAX_R)
+
+
+#define RC_UPDATE_FREQ 40
+
+#define YAW_DEADBAND_EXCEEDED() \
+ (radio_control.values[RADIO_YAW] > STABILIZATION_ATTITUDE_DEADBAND_R || \
+ radio_control.values[RADIO_YAW] < -STABILIZATION_ATTITUDE_DEADBAND_R)
+
+static inline void stabilization_attitude_read_rc_ref(struct Int32Eulers *sp, bool_t in_flight) {
+
+ sp->phi = ((int32_t)-radio_control.values[RADIO_ROLL] * SP_MAX_PHI / MAX_PPRZ)
+ << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC);
+
+ sp->theta = ((int32_t) radio_control.values[RADIO_PITCH] * SP_MAX_THETA / MAX_PPRZ)
+ << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC);
+
+ if (in_flight) {
+ if (YAW_DEADBAND_EXCEEDED()) {
+ sp->psi += ((int32_t)-radio_control.values[RADIO_YAW] * SP_MAX_R / MAX_PPRZ / RC_UPDATE_FREQ)
+ << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC);
+ ANGLE_REF_NORMALIZE(sp->psi);
+ }
+ }
+ else { /* if not flying, use current yaw as setpoint */
+ sp->psi = (ahrs.ltp_to_body_euler.psi << (REF_ANGLE_FRAC - INT32_ANGLE_FRAC));
+ }
+
+}
+
+#endif /* STABILISATION_ATTITUDE_REF_INT_H */
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.c
index cb28d79409..f31f758b4c 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.c
@@ -31,7 +31,6 @@
#include "subsystems/ahrs.h"
#include "stabilization_attitude_ref_float.h"
-#include "quat_setpoint.h"
#define REF_ACCEL_MAX_P STABILIZATION_ATTITUDE_FLOAT_REF_MAX_PDOT
#define REF_ACCEL_MAX_Q STABILIZATION_ATTITUDE_FLOAT_REF_MAX_QDOT
@@ -104,11 +103,7 @@ void stabilization_attitude_ref_enter()
/*
* Reference
*/
-#ifdef BOOZ_AP_PERIODIC_PRESCALE
-#define DT_UPDATE ((float) BOOZ_AP_PERIODIC_PRESCALE / (float) PERIODIC_FREQ)
-#else
-#define DT_UPDATE (1./512.)
-#endif
+#define DT_UPDATE (1./PERIODIC_FREQUENCY)
void stabilization_attitude_ref_update() {
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.h
index bdd8fb5a79..20b22aba6c 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_float.h
@@ -1,6 +1,4 @@
/*
- * $Id: stabilization_attitude_ref_traj_euler.h 3796 2009-07-25 00:01:02Z poine $
- *
* Copyright (C) 2008-2009 Antoine Drouin
*
* This file is part of paparazzi.
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.c b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.c
index 17aaa88d7c..88484d7ca2 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.c
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.c
@@ -1,6 +1,4 @@
/*
- * $Id$
- *
* Copyright (C) 2008-2009 Antoine Drouin
*
* This file is part of paparazzi.
@@ -21,8 +19,8 @@
* Boston, MA 02111-1307, USA.
*/
-/** \file stabilization_attitude_ref_int.c
- * \brief Booz attitude reference generation (quaternion int version)
+/** @file stabilization_attitude_ref_int.c
+ * Rotorcraft attitude reference generation (quaternion int version)
*
*/
@@ -31,7 +29,10 @@
#include "subsystems/ahrs.h"
#include "stabilization_attitude_ref_int.h"
-//#include "quat_setpoint.h"
+
+#if USE_SETPOINTS_WITH_TRANSITIONS
+#include "firmwares/rotorcraft/stabilization/quat_setpoint_int.h"
+#endif
#define REF_ACCEL_MAX_P BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_PDOT, REF_ACCEL_FRAC)
#define REF_ACCEL_MAX_Q BFP_OF_REAL(STABILIZATION_ATTITUDE_REF_MAX_QDOT, REF_ACCEL_FRAC)
@@ -63,9 +64,9 @@
#define OMEGA_2_R BFP_OF_REAL((OMEGA_R*OMEGA_R), OMEGA_2_R_RES)
-struct Int32Eulers stab_att_sp_euler;
+struct Int32Eulers stab_att_sp_euler; ///< with #INT32_ANGLE_FRAC
struct Int32Quat stab_att_sp_quat;
-struct Int32Eulers stab_att_ref_euler;
+struct Int32Eulers stab_att_ref_euler; ///< with #INT32_ANGLE_FRAC
struct Int32Quat stab_att_ref_quat;
struct Int32Rates stab_att_ref_rate;
struct Int32Rates stab_att_ref_accel;
@@ -75,14 +76,6 @@ struct Int32RefModel stab_att_ref_model = {
{STABILIZATION_ATTITUDE_REF_ZETA_P, STABILIZATION_ATTITUDE_REF_ZETA_Q, STABILIZATION_ATTITUDE_REF_ZETA_R}
};
-/*
-static const float omega_p[] = STABILIZATION_ATTITUDE_REF_OMEGA_P;
-static const float zeta_p[] = STABILIZATION_ATTITUDE_REF_ZETA_P;
-static const float omega_q[] = STABILIZATION_ATTITUDE_REF_OMEGA_Q;
-static const float zeta_q[] = STABILIZATION_ATTITUDE_REF_ZETA_Q;
-static const float omega_r[] = STABILIZATION_ATTITUDE_REF_OMEGA_R;
-static const float zeta_r[] = STABILIZATION_ATTITUDE_REF_ZETA_R;
-*/
static void reset_psi_ref_from_body(void) {
stab_att_ref_euler.psi = ahrs.ltp_to_body_euler.psi;
@@ -90,26 +83,14 @@ static void reset_psi_ref_from_body(void) {
stab_att_ref_accel.r = 0;
}
-static void update_ref_quat_from_eulers(void) {
- struct Int32RMat ref_rmat;
-
-#ifdef STICKS_RMAT312
- INT32_RMAT_OF_EULERS_312(ref_rmat, stab_att_ref_euler);
-#else
- INT32_RMAT_OF_EULERS_321(ref_rmat, stab_att_ref_euler);
-#endif
- INT32_QUAT_OF_RMAT(stab_att_ref_quat, ref_rmat);
- INT32_QUAT_WRAP_SHORTEST(stab_att_ref_quat);
-}
-
void stabilization_attitude_ref_init(void) {
INT_EULERS_ZERO(stab_att_sp_euler);
- INT32_QUAT_ZERO( stab_att_sp_quat);
+ INT32_QUAT_ZERO(stab_att_sp_quat);
INT_EULERS_ZERO(stab_att_ref_euler);
- INT32_QUAT_ZERO( stab_att_ref_quat);
- INT_RATES_ZERO( stab_att_ref_rate);
- INT_RATES_ZERO( stab_att_ref_accel);
+ INT32_QUAT_ZERO(stab_att_ref_quat);
+ INT_RATES_ZERO(stab_att_ref_rate);
+ INT_RATES_ZERO(stab_att_ref_accel);
/*
for (int i = 0; i < STABILIZATION_ATTITUDE_GAIN_NB; i++) {
@@ -123,23 +104,25 @@ void stabilization_attitude_ref_init(void) {
void stabilization_attitude_ref_enter()
{
reset_psi_ref_from_body();
+
+#if USE_SETPOINTS_WITH_TRANSITIONS
stabilization_attitude_sp_enter();
memcpy(&stab_att_ref_quat, &stab_att_sp_quat, sizeof(struct Int32Quat));
+#else
+ update_quat_from_eulers(&stab_att_ref_quat, &stab_att_ref_euler);
+#endif
+
+ /* set reference rate and acceleration to zero */
memset(&stab_att_ref_accel, 0, sizeof(struct Int32Rates));
memset(&stab_att_ref_rate, 0, sizeof(struct Int32Rates));
- //update_ref_quat_from_eulers();
}
/*
* Reference
*/
-#define DT_UPDATE (1./512.)
+#define DT_UPDATE (1./PERIODIC_FREQUENCY)
#define F_UPDATE_RES 9
-#include "messages.h"
-#include "mcu_periph/uart.h"
-#include "subsystems/datalink/downlink.h"
-
void stabilization_attitude_ref_update() {
/* integrate reference attitude */
diff --git a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.h b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.h
index c307fcab6e..aa1124e674 100644
--- a/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.h
+++ b/sw/airborne/firmwares/rotorcraft/stabilization/stabilization_attitude_ref_quat_int.h
@@ -22,26 +22,14 @@
#define STABILIZATION_ATTITUDE_INT_REF_QUAT_INT_H
#include "firmwares/rotorcraft/stabilization.h"
-#include "firmwares/rotorcraft/stabilization/quat_setpoint.h"
#include "subsystems/radio_control.h"
#include "math/pprz_algebra_float.h"
#include "stabilization_attitude_ref_int.h"
-#define REF_ACCEL_FRAC 12
-#define REF_RATE_FRAC 16
-#define REF_ANGLE_FRAC 20
+#include "subsystems/ahrs.h"
-#define REF_ANGLE_PI BFP_OF_REAL(3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
-#define REF_ANGLE_TWO_PI BFP_OF_REAL(2.*3.1415926535897932384626433832795029, REF_ANGLE_FRAC)
-#define ANGLE_REF_NORMALIZE(_a) { \
- while (_a > REF_ANGLE_PI) _a -= REF_ANGLE_TWO_PI; \
- while (_a < -REF_ANGLE_PI) _a += REF_ANGLE_TWO_PI; \
- }
-
-
-#define RC_UPDATE_FREQ 40.
#define ROLL_COEF (STABILIZATION_ATTITUDE_SP_MAX_PHI / MAX_PPRZ)
// FIXME: unused, what was it supposed to be?
//#define ROLL_COEF_H (STABILIZATION_ATTITUDE_SP_MAX_P_H / MAX_PPRZ)
@@ -62,14 +50,42 @@
#define PITCH_DEADBAND_EXCEEDED() \
(radio_control.values[RADIO_PITCH] > STABILIZATION_ATTITUDE_DEADBAND_E || \
radio_control.values[RADIO_PITCH] < -STABILIZATION_ATTITUDE_DEADBAND_E)
-#define YAW_DEADBAND_EXCEEDED() \
- (radio_control.values[RADIO_YAW] > STABILIZATION_ATTITUDE_DEADBAND_R || \
- radio_control.values[RADIO_YAW] < -STABILIZATION_ATTITUDE_DEADBAND_R)
-#define STABILIZATION_ATTITUDE_READ_RC(_sp, _in_flight) do { stabilization_attitude_read_rc_absolute(_sp, _in_flight); } while(0)
-#define STABILIZATION_ATTITUDE_RESET_PSI_REF(_sp) do {} while(0)
+#define STABILIZATION_ATTITUDE_RESET_PSI_REF(_sp) {}
+
+static inline void update_quat_from_eulers(struct Int32Quat *quat, struct Int32Eulers *eulers) {
+ struct Int32RMat rmat;
+
+#ifdef STICKS_RMAT312
+ INT32_RMAT_OF_EULERS_312(rmat, *eulers);
+#else
+ INT32_RMAT_OF_EULERS_321(rmat, *eulers);
+#endif
+ INT32_QUAT_OF_RMAT(*quat, rmat);
+ INT32_QUAT_WRAP_SHORTEST(*quat);
+}
+
+
+static inline void stabilization_attitude_read_rc_setpoint(bool_t in_flight) {
+
+ stab_att_sp_euler.phi = ((int32_t)-radio_control.values[RADIO_ROLL] * SP_MAX_PHI / MAX_PPRZ);
+ stab_att_sp_euler.theta = ((int32_t) radio_control.values[RADIO_PITCH] * SP_MAX_THETA / MAX_PPRZ);
+
+ if (in_flight) {
+ if (YAW_DEADBAND_EXCEEDED()) {
+ stab_att_sp_euler.psi += ((int32_t)-radio_control.values[RADIO_YAW] * SP_MAX_R / MAX_PPRZ / RC_UPDATE_FREQ);
+ INT32_ANGLE_NORMALIZE(stab_att_sp_euler.psi);
+ }
+ }
+ else { /* if not flying, use current yaw as setpoint */
+ stab_att_sp_euler.psi = ahrs.ltp_to_body_euler.psi;
+ }
+
+ /* update quaternion setpoint from euler setpoint */
+ update_quat_from_eulers(&stab_att_sp_quat, &stab_att_sp_euler);
+
+}
void stabilization_attitude_ref_enter(void);
-void stabilization_attitude_ref_schedule(uint8_t idx);
#endif /* STABILIZATION_ATTITUDE_INT_REF_QUAT_INT_H */
diff --git a/sw/airborne/mcu_periph/sys_time.h b/sw/airborne/mcu_periph/sys_time.h
index 6a6d59b442..40bf45d329 100644
--- a/sw/airborne/mcu_periph/sys_time.h
+++ b/sw/airborne/mcu_periph/sys_time.h
@@ -52,9 +52,9 @@ struct sys_time_timer {
};
struct sys_time {
- uint32_t nb_sec; ///< full seconds since startup
- uint32_t nb_sec_rem; ///< remainder of second in CPU_TICKS
- uint32_t nb_tick; ///< in SYS_TICKS with SYS_TIME_RESOLUTION
+ volatile uint32_t nb_sec; ///< full seconds since startup
+ volatile uint32_t nb_sec_rem; ///< remainder of second in CPU_TICKS
+ volatile uint32_t nb_tick; ///< in SYS_TICKS with SYS_TIME_RESOLUTION
struct sys_time_timer timer[SYS_TIME_NB_TIMER];
};
diff --git a/sw/airborne/modules/digital_cam/led_cam_ctrl.h b/sw/airborne/modules/digital_cam/led_cam_ctrl.h
index 6fe8ef72c8..541b691eed 100644
--- a/sw/airborne/modules/digital_cam/led_cam_ctrl.h
+++ b/sw/airborne/modules/digital_cam/led_cam_ctrl.h
@@ -102,6 +102,8 @@ static inline void dc_send_command(uint8_t cmd)
DC_PUSH(DC_POWER_LED);
break;
#endif
+ default:
+ break;
}
}
diff --git a/sw/airborne/subsystems/datalink/xbee.c b/sw/airborne/subsystems/datalink/xbee.c
index 9d1c2aedf5..e2fe65e5c8 100644
--- a/sw/airborne/subsystems/datalink/xbee.c
+++ b/sw/airborne/subsystems/datalink/xbee.c
@@ -41,6 +41,8 @@ struct xbee_transport xbee_tp;
#define AT_AP_MODE "ATAP1\r"
#define AT_EXIT "ATCN\r"
+uint32_t xbee_delay_time;
+
void xbee_init( void ) {
xbee_tp.status = XBEE_UNINIT;