Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
autopilot_firmware.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012-2017 Gautier Hattenberger <gautier.hattenberger@enac.fr>
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
30 
31 #include "state.h"
33 #include <stdint.h>
35 
36 PRINT_CONFIG_VAR(CONTROL_FREQUENCY)
37 
39 
40 #if PERIODIC_TELEMETRY
42 #include "generated/settings.h"
43 
44 #if defined RADIO_CALIB && defined RADIO_CONTROL_SETTINGS
45 #include "modules/settings/rc_settings.h"
46 static void send_rc_settings(struct transport_tx *trans, struct link_device *dev)
47 {
48  if (!RcSettingsOff()) {
49  pprz_msg_send_SETTINGS(trans, dev, AC_ID, &slider_1_val, &slider_2_val);
50  }
51 }
52 #else
54 #endif
55 
56 static void send_mode(struct transport_tx *trans, struct link_device *dev)
57 {
65  uint8_t mcu1_status = 0;
66 #ifdef RADIO_CONTROL
67  mcu1_status |= (radio_control.status == RC_OK ? (1<<0) : 0);
68  mcu1_status |= (radio_control.status == RC_REALLY_LOST ? (1<<2) : 0);
69  mcu1_status |= (radio_control.status == RC_OK ? (1<<4) : 0);
70 #endif
71 #ifdef AP_MODE_MANUAL
72  mcu1_status |= (autopilot_get_mode() == AP_MODE_MANUAL ? 0 : (1<<2));
73 #endif
74 
75  pprz_msg_send_PPRZ_MODE(trans, dev, AC_ID,
77 }
78 
79 static void send_estimator(struct transport_tx *trans, struct link_device *dev)
80 {
81  pprz_msg_send_ESTIMATOR(trans, dev, AC_ID,
82  &(stateGetPositionUtm_f()->alt), &(stateGetSpeedEnu_f()->z));
83 }
84 
85 static void send_energy(struct transport_tx *trans, struct link_device *dev)
86 {
87  uint8_t throttle = 100 * autopilot.throttle / MAX_PPRZ;
88  float power = electrical.vsupply * electrical.current;
89  float avg_power = 0;
90  if(electrical.avg_cnt != 0) {
91  avg_power = (float)electrical.avg_power / electrical.avg_cnt;
92  }
93 
94  pprz_msg_send_ENERGY(trans, dev, AC_ID,
95  &throttle, &electrical.vsupply, &electrical.current, &power, &avg_power, &electrical.charge, &electrical.energy);
96 }
97 
98 // FIXME not the best place
100 #include CTRL_TYPE_H
101 static void send_desired(struct transport_tx *trans, struct link_device *dev)
102 {
103 #ifndef USE_AIRSPEED
104  float v_ctl_auto_airspeed_setpoint = NOMINAL_AIRSPEED;
105 #endif
106  pprz_msg_send_DESIRED(trans, dev, AC_ID,
110 }
111 
112 static void send_airspeed(struct transport_tx *trans __attribute__((unused)),
113  struct link_device *dev __attribute__((unused)))
114 {
115  float airspeed = stateGetAirspeed_f();
116 #if USE_AIRSPEED
117  pprz_msg_send_AIRSPEED(trans, dev, AC_ID,
118  &airspeed, &v_ctl_auto_airspeed_setpoint,
120 #else
121  float zero = 0;
122  pprz_msg_send_AIRSPEED(trans, dev, AC_ID, &airspeed, &zero, &zero, &zero);
123 #endif
124 }
125 
126 #if !INTERMCU_AP
128 static void send_fbw_status(struct transport_tx *trans, struct link_device *dev)
129 {
130  uint8_t fbw_mode = 1; // old FBW_AUTO
131 #ifdef AP_MODE_MANUAL
132  if (autopilot_get_mode() == AP_MODE_MANUAL) { fbw_mode = 0; } // FBW Manual
133 #endif
134 #ifdef RADIO_CONTROL
135  uint8_t rc_status = radio_control.status;
136  uint8_t rc_rate = radio_control.frame_rate;
137 #else
138  uint8_t rc_status = 0;
139  uint8_t rc_rate = 0;
140 #endif
141  pprz_msg_send_FBW_STATUS(trans, dev, AC_ID,
142  &rc_status, &rc_rate, &fbw_mode,
144 }
145 #endif
146 
147 #endif /* PERIODIC_TELEMETRY */
148 
150 {
151  // use default telemetry here
152 #if DOWNLINK
153  send_mode(&(DefaultChannel).trans_tx, &(DefaultDevice).device);
154 #endif
155 }
156 
158 {
159 #if PERIODIC_TELEMETRY
160  /* register some periodic message */
161  register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_PPRZ_MODE, send_mode);
166 #if defined RADIO_CALIB && defined RADIO_CONTROL_SETTINGS
167  register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_RC_SETTINGS, send_rc_settings);
168 #endif
169 #if !INTERMCU_AP
171 #endif
172 #endif
173 }
174 
175 
176 #include "generated/flight_plan.h"
177 #include "generated/airframe.h"
178 
179 #ifdef LOW_BATTERY_KILL_DELAY
180 #warning LOW_BATTERY_KILL_DELAY has been renamed to CATASTROPHIC_BAT_KILL_DELAY, please update your airframe file!
181 #endif
182 
184 #ifndef CATASTROPHIC_BAT_KILL_DELAY
185 #define CATASTROPHIC_BAT_KILL_DELAY 5
186 #endif
187 
189 #ifndef KILL_MODE_DISTANCE
190 #define KILL_MODE_DISTANCE (1.5*MAX_DIST_FROM_HOME)
191 #endif
192 
194 #ifndef MIN_SPEED_FOR_TAKEOFF
195 #define MIN_SPEED_FOR_TAKEOFF 5.
196 #endif
197 
199 void monitor_task(void)
200 {
201  static uint8_t t = 0;
202  if (electrical.vsupply < CATASTROPHIC_BAT_LEVEL) {
203  t++;
204  } else {
205  t = 0;
206  }
207 #if !USE_GENERATED_AUTOPILOT
208  // only check for static autopilot
211 #endif
212 
213  if (!autopilot.flight_time &&
216  autopilot.launch = true; /* Not set in non auto launch */
217 #if DOWNLINK
218  uint16_t time_sec = sys_time.nb_sec;
219  DOWNLINK_SEND_TAKEOFF(DefaultChannel, DefaultDevice, &time_sec);
220 #endif
221  }
222 
223 }
224 
225 
uint8_t autopilot_get_mode(void)
get autopilot mode
Definition: autopilot.c:217
struct pprz_autopilot autopilot
Global autopilot structure.
Definition: autopilot.c:49
bool launch
request launch
Definition: autopilot.h:71
pprz_t throttle
throttle level as will be displayed in GCS
Definition: autopilot.h:66
bool kill_throttle
allow autopilot to use throttle
Definition: autopilot.h:69
uint8_t mode
current autopilot mode
Definition: autopilot.h:63
uint16_t flight_time
flight time in seconds
Definition: autopilot.h:65
float dist2_to_home
Definition: common_nav.c:33
struct Electrical electrical
Definition: electrical.c:92
Interface for electrical status: supply voltage, current, battery status, etc.
uint32_t avg_power
average power sum
Definition: electrical.h:53
float energy
consumed energy in Wh
Definition: electrical.h:49
float current
current in A
Definition: electrical.h:47
uint32_t avg_cnt
average power counter
Definition: electrical.h:54
float charge
consumed electric charge in Ah
Definition: electrical.h:48
float vsupply
supply voltage in V
Definition: electrical.h:45
float v_ctl_auto_airspeed_controlled
Definition: energy_ctrl.c:123
float v_ctl_altitude_setpoint
in meters above MSL
Definition: energy_ctrl.c:88
float v_ctl_auto_airspeed_setpoint
in meters per second
Definition: energy_ctrl.c:121
float v_ctl_auto_groundspeed_setpoint
in meters per second
Definition: energy_ctrl.c:125
float v_ctl_climb_setpoint
Definition: energy_ctrl.c:98
uint8_t v_ctl_mode
Definition: energy_ctrl.c:74
#define KILL_MODE_DISTANCE
Maximum distance from HOME waypoint before going into kill mode.
void autopilot_firmware_init(void)
Init function.
uint8_t rc_settings_mode
static void send_desired(struct transport_tx *trans, struct link_device *dev)
void autopilot_send_mode(void)
Report autopilot mode on default downlink channel.
static void send_energy(struct transport_tx *trans, struct link_device *dev)
static void send_airspeed(struct transport_tx *trans, struct link_device *dev)
void monitor_task(void)
monitor stuff run at 1Hz
static void send_fbw_status(struct transport_tx *trans, struct link_device *dev)
#define CATASTROPHIC_BAT_KILL_DELAY
Maximum time allowed for catastrophic battery level before going into kill mode.
uint8_t lateral_mode
static void send_estimator(struct transport_tx *trans, struct link_device *dev)
#define MIN_SPEED_FOR_TAKEOFF
Default minimal speed for takeoff in m/s.
static void send_mode(struct transport_tx *trans, struct link_device *dev)
Fixedwing specific autopilot interface and initialization.
#define AP_MODE_MANUAL
AP modes.
#define CONTROL_FREQUENCY
Fixed wing horizontal control.
static struct UtmCoor_f * stateGetPositionUtm_f(void)
Get position in UTM coordinates (float).
Definition: state.h:692
static float stateGetHorizontalSpeedNorm_f(void)
Get norm of horizontal ground speed (float).
Definition: state.h:935
static struct EnuCoor_f * stateGetSpeedEnu_f(void)
Get ground speed in local ENU coordinates (float).
Definition: state.h:917
static float stateGetAirspeed_f(void)
Get airspeed (float).
Definition: state.h:1407
uint8_t fbw_mode
Fly by wire modes.
Definition: main_fbw.c:41
float desired_x
Definition: nav.c:308
float desired_y
Definition: nav.c:308
uint8_t horizontal_mode
Definition: nav.c:70
Fixedwing Navigation library.
#define Square(_x)
Definition: nav.h:53
#define MAX_PPRZ
Definition: paparazzi.h:8
struct RadioControl radio_control
Definition: radio_control.c:33
Generic interface for radio control modules.
#define RC_REALLY_LOST
Definition: radio_control.h:51
uint8_t status
Definition: radio_control.h:61
uint8_t frame_rate
Definition: radio_control.h:64
#define RC_OK
Definition: radio_control.h:49
float slider_1_val
Definition: rc_settings.c:33
float slider_2_val
Definition: rc_settings.c:33
#define RcSettingsOff()
Definition: rc_settings.h:70
float h_ctl_roll_setpoint
float h_ctl_pitch_loop_setpoint
float h_ctl_course_setpoint
API to get/set the generic vehicle states.
static const struct usb_device_descriptor dev
Definition: usb_ser_hw.c:74
volatile uint32_t nb_sec
full seconds since startup
Definition: sys_time.h:72
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition: telemetry.c:51
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
Definition: telemetry.h:66
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
Definition: vl53l1_types.h:88
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98