diff --git a/conf/modules/telemetry_intermcu.xml b/conf/modules/telemetry_intermcu.xml index 571c004264..79c9ca565b 100644 --- a/conf/modules/telemetry_intermcu.xml +++ b/conf/modules/telemetry_intermcu.xml @@ -14,9 +14,11 @@ + + diff --git a/sw/airborne/firmwares/rotorcraft/main_fbw.c b/sw/airborne/firmwares/rotorcraft/main_fbw.c index ab77d541c7..d538f9d7d7 100644 --- a/sw/airborne/firmwares/rotorcraft/main_fbw.c +++ b/sw/airborne/firmwares/rotorcraft/main_fbw.c @@ -56,7 +56,6 @@ /** Fly by wire modes */ -typedef enum {FBW_MODE_MANUAL = 0, FBW_MODE_AUTO = 1, FBW_MODE_FAILSAFE = 2} fbw_mode_enum; fbw_mode_enum fbw_mode; bool fbw_motors_on = false; diff --git a/sw/airborne/firmwares/rotorcraft/main_fbw.h b/sw/airborne/firmwares/rotorcraft/main_fbw.h index 9875787115..82bef33c71 100644 --- a/sw/airborne/firmwares/rotorcraft/main_fbw.h +++ b/sw/airborne/firmwares/rotorcraft/main_fbw.h @@ -64,6 +64,9 @@ #define RADIO_FBW_MODE RADIO_MODE #endif +typedef enum {FBW_MODE_MANUAL = 0, FBW_MODE_AUTO = 1, FBW_MODE_FAILSAFE = 2} fbw_mode_enum; + + STATIC_INLINE void main_init(void); STATIC_INLINE void main_event(void); STATIC_INLINE void handle_periodic_tasks(void); diff --git a/sw/airborne/modules/telemetry/telemetry_intermcu_ap.c b/sw/airborne/modules/telemetry/telemetry_intermcu_ap.c index 0e3a9106d8..1ce1de1889 100644 --- a/sw/airborne/modules/telemetry/telemetry_intermcu_ap.c +++ b/sw/airborne/modules/telemetry/telemetry_intermcu_ap.c @@ -26,11 +26,13 @@ #define PERIODIC_C_INTERMCU #include "telemetry_intermcu.h" +#include "telemetry_intermcu_ap.h" #include "subsystems/intermcu.h" #include "pprzlink/intermcu_msg.h" #include "pprzlink/short_transport.h" #include "generated/periodic_telemetry.h" #include "subsystems/datalink/telemetry.h" +#include "subsystems/datalink/datalink.h" /* Default maximum telemetry message size */ #ifndef TELEMERTY_INTERMCU_MSG_SIZE @@ -74,11 +76,19 @@ void telemetry_intermcu_periodic(void) periodic_telemetry_send_InterMCU(DefaultPeriodic, &telemetry_intermcu.trans.trans_tx, &telemetry_intermcu.dev); } -void telemetry_intermcu_on_msg(uint8_t msg_id __attribute__((unused)), uint8_t* msg __attribute__((unused)), uint8_t size __attribute__((unused))) +/* InterMCU event handling of telemetry */ +void telemetry_intermcu_event(void) { } +void telemetry_intermcu_on_msg(uint8_t msg_id __attribute__((unused)), uint8_t* msg, uint8_t size __attribute__((unused))) +{ + datalink_time = 0; + datalink_nb_msgs++; + dl_parse_msg(&telemetry_intermcu.dev, &telemetry_intermcu.trans.trans_tx, msg); +} + static bool telemetry_intermcu_check_free_space(struct telemetry_intermcu_t *p, long *fd __attribute__((unused)), uint16_t len) { return ((p->buf_idx + len) < (TELEMERTY_INTERMCU_MSG_SIZE - 1)); diff --git a/sw/airborne/modules/telemetry/telemetry_intermcu_ap.h b/sw/airborne/modules/telemetry/telemetry_intermcu_ap.h new file mode 100644 index 0000000000..3680ed6a86 --- /dev/null +++ b/sw/airborne/modules/telemetry/telemetry_intermcu_ap.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016 Freek van Tienen + * + * 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. + * + */ + +/** @file modules/telemetry/telemetry_intermcu_ap.h + * @brief Telemetry through InterMCU + */ + +#ifndef TELEMETRY_INTERMCU_AP_H +#define TELEMETRY_INTERMCU_AP_H + +#include "std.h" +#include "pprzlink/short_transport.h" + +/* Default maximum telemetry message size */ +#ifndef TELEMERTY_INTERMCU_MSG_SIZE +#define TELEMERTY_INTERMCU_MSG_SIZE 128 +#endif + +/* Structure for handling telemetry over InterMCU */ +struct telemetry_intermcu_t { + struct link_device dev; ///< Device structure for communication + struct short_transport trans; ///< Transport without any extra encoding + uint8_t buf[TELEMERTY_INTERMCU_MSG_SIZE]; ///< Buffer for the messages + uint8_t buf_idx; ///< Index of the buffer +}; + +/* Telemetry InterMCU throughput */ +extern struct telemetry_intermcu_t telemetry_intermcu; + +#endif /* TELEMETRY_INTERMCU_AP_H */ diff --git a/sw/airborne/modules/telemetry/telemetry_intermcu_fbw.c b/sw/airborne/modules/telemetry/telemetry_intermcu_fbw.c index 181d644cad..78a86ee29b 100644 --- a/sw/airborne/modules/telemetry/telemetry_intermcu_fbw.c +++ b/sw/airborne/modules/telemetry/telemetry_intermcu_fbw.c @@ -29,11 +29,19 @@ #include "pprzlink/pprz_transport.h" #include "pprzlink/intermcu_msg.h" #include "subsystems/datalink/telemetry.h" +#include "firmwares/rotorcraft/main_fbw.h" + +#define MSG_SIZE 128 + +extern fbw_mode_enum fbw_mode; /* Structure for handling telemetry over InterMCU */ struct telemetry_intermcu_t { struct link_device *dev; ///< Device structure for communication struct pprz_transport trans; ///< Transport without any extra encoding + + uint8_t rx_buffer[MSG_SIZE]; ///< Received bytes from datalink + bool msg_received; ///< Whenever a datalink message is received }; /* Telemetry InterMCU throughput */ @@ -58,6 +66,32 @@ void telemetry_intermcu_periodic(void) } +/* InterMCU event handling of telemetry */ +void telemetry_intermcu_event(void) +{ + pprz_check_and_parse(&(TELEMETRY_INTERMCU_DEV).device, &telemetry_intermcu.trans, telemetry_intermcu.rx_buffer, &telemetry_intermcu.msg_received); + if(telemetry_intermcu.msg_received) { + /* Switch on MSG ID */ + switch(telemetry_intermcu.rx_buffer[1]) { + case DL_EMERGENCY_CMD: + if(DL_EMERGENCY_CMD_ac_id(telemetry_intermcu.rx_buffer) == AC_ID + && DL_EMERGENCY_CMD_cmd(telemetry_intermcu.rx_buffer) == 0) { + fbw_mode = FBW_MODE_FAILSAFE; + } + break; + + default: + break; + } + + /* Forward to AP */ + pprz_msg_send_IMCU_DATALINK(&(intermcu.transport.trans_tx), intermcu.device, + INTERMCU_FBW, telemetry_intermcu.trans.trans_rx.payload_len, telemetry_intermcu.rx_buffer); + + telemetry_intermcu.msg_received = false; + } +} + void telemetry_intermcu_on_msg(uint8_t msg_id, uint8_t* msg, uint8_t size) { telemetry_intermcu_repack(&(telemetry_intermcu.trans.trans_tx), telemetry_intermcu.dev, AC_ID, msg_id, msg, size); diff --git a/sw/airborne/subsystems/intermcu/intermcu_ap.c b/sw/airborne/subsystems/intermcu/intermcu_ap.c index 50371bda06..612d3ef538 100644 --- a/sw/airborne/subsystems/intermcu/intermcu_ap.c +++ b/sw/airborne/subsystems/intermcu/intermcu_ap.c @@ -144,6 +144,16 @@ static inline void intermcu_parse_msg(void (*rc_frame_handler)(void)) break; } +#if TELEMETRY_INTERMCU + case DL_IMCU_DATALINK: { + uint8_t size = DL_IMCU_DATALINK_msg_length(imcu_msg_buf); + uint8_t *msg = DL_IMCU_DATALINK_msg(imcu_msg_buf); + telemetry_intermcu_on_msg(0, msg, size); + break; + } + +#endif + default: break; }