Paparazzi UAS  v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
telemetry_intermcu_ap.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016 Freek van Tienen <freek.v.tienen@gmail.com>
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, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 
27 #define PERIODIC_C_INTERMCU
28 #include "telemetry_intermcu.h"
29 #include "telemetry_intermcu_ap.h"
30 #include "subsystems/intermcu.h"
31 #include "pprzlink/intermcu_msg.h"
32 #include "pprzlink/short_transport.h"
33 #include "generated/periodic_telemetry.h"
36 
37 /* Telemetry InterMCU throughput */
39 
40 /* Static functions */
41 static int telemetry_intermcu_check_free_space(struct telemetry_intermcu_t *p, long *fd __attribute__((unused)), uint16_t len);
42 static void telemetry_intermcu_put_byte(struct telemetry_intermcu_t *p, long fd __attribute__((unused)), uint8_t data);
43 static void telemetry_intermcu_put_buffer(struct telemetry_intermcu_t *p, long fd, uint8_t *data, uint16_t len);
44 static void telemetry_intermcu_send_message(struct telemetry_intermcu_t *p, long fd __attribute__((unused)));
45 
46 /* InterMCU initialization */
48 {
49  // Initialize transport structure
50  short_transport_init(&telemetry_intermcu.trans);
51 
52  // Configure the device
53  telemetry_intermcu.dev.check_free_space = (check_free_space_t)telemetry_intermcu_check_free_space;
54  telemetry_intermcu.dev.put_byte = (put_byte_t)telemetry_intermcu_put_byte;
55  telemetry_intermcu.dev.put_buffer = (put_buffer_t)telemetry_intermcu_put_buffer;
56  telemetry_intermcu.dev.send_message = (send_message_t)telemetry_intermcu_send_message;
57  telemetry_intermcu.dev.periph = (void *)&telemetry_intermcu;
58 }
59 
60 /* InterMCU periodic handling of telemetry */
62 {
63  periodic_telemetry_send_InterMCU(DefaultPeriodic, &telemetry_intermcu.trans.trans_tx, &telemetry_intermcu.dev);
64 }
65 
66 /* InterMCU event handling of telemetry */
68 {
69 
70 }
71 
72 void telemetry_intermcu_on_msg(uint8_t* msg, uint8_t size __attribute__((unused)))
73 {
74  datalink_time = 0;
77 }
78 
79 static int telemetry_intermcu_check_free_space(struct telemetry_intermcu_t *p, long *fd __attribute__((unused)), uint16_t len)
80 {
81  int available = TELEMERTY_INTERMCU_MSG_SIZE - p->buf_idx;
82  return available >= len ? available : 0;
83 }
84 
85 static void telemetry_intermcu_put_byte(struct telemetry_intermcu_t *p, long fd __attribute__((unused)), uint8_t data)
86 {
87  if(p->buf_idx >= (TELEMERTY_INTERMCU_MSG_SIZE - 1))
88  return;
89 
90  p->buf[p->buf_idx++] = data;
91 }
92 
93 static void telemetry_intermcu_put_buffer(struct telemetry_intermcu_t *p, long fd __attribute__((unused)), uint8_t *data, uint16_t len)
94 {
95  int i;
96  for (i = 0; i < len; i++) {
97  p->buf[p->buf_idx++] = data[i];
98  }
99 }
100 
101 static void telemetry_intermcu_send_message(struct telemetry_intermcu_t *p, long fd __attribute__((unused)))
102 {
103  pprz_msg_send_IMCU_TELEMETRY(&(intermcu.transport.trans_tx), intermcu.device,
104  INTERMCU_AP, p->buf_idx, p->buf);
105  p->buf_idx = 0;
106 }
telemetry_intermcu_event
void telemetry_intermcu_event(void)
Definition: telemetry_intermcu_ap.c:67
uint16_t
unsigned short uint16_t
Definition: types.h:16
intermcu.h
Rotorcraft Inter-MCU interface.
telemetry_intermcu_check_free_space
static int telemetry_intermcu_check_free_space(struct telemetry_intermcu_t *p, long *fd, uint16_t len)
Definition: telemetry_intermcu_ap.c:79
telemetry_intermcu_ap.h
Telemetry through InterMCU.
telemetry_intermcu.h
Telemetry through InterMCU.
intermcu_t::device
struct link_device * device
Device used for communication.
Definition: intermcu.h:71
telemetry_intermcu_t::dev
struct link_device dev
Device structure for communication.
Definition: telemetry_intermcu_ap.h:40
telemetry_intermcu_periodic
void telemetry_intermcu_periodic(void)
Definition: telemetry_intermcu_ap.c:61
TELEMERTY_INTERMCU_MSG_SIZE
#define TELEMERTY_INTERMCU_MSG_SIZE
Definition: telemetry_intermcu_ap.h:35
datalink_nb_msgs
uint16_t datalink_nb_msgs
Definition: sim_ap.c:42
telemetry_intermcu_init
void telemetry_intermcu_init(void)
Definition: telemetry_intermcu_ap.c:47
msg
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
Definition: high_speed_logger_direct_memory.c:134
telemetry.h
telemetry_intermcu
struct telemetry_intermcu_t telemetry_intermcu
Definition: telemetry_intermcu_ap.c:38
intermcu
struct intermcu_t intermcu
Definition: intermcu_ap.c:41
telemetry_intermcu_on_msg
void telemetry_intermcu_on_msg(uint8_t *msg, uint8_t size)
Definition: telemetry_intermcu_ap.c:72
uint8_t
unsigned char uint8_t
Definition: types.h:14
dl_parse_msg
void dl_parse_msg(struct link_device *dev, struct transport_tx *trans, uint8_t *buf)
Should be called when chars are available in dl_buffer.
Definition: setup_actuators.c:114
telemetry_intermcu_t
Definition: telemetry_intermcu_ap.h:39
fd
int fd
Definition: serial.c:26
telemetry_intermcu_send_message
static void telemetry_intermcu_send_message(struct telemetry_intermcu_t *p, long fd)
Definition: telemetry_intermcu_ap.c:101
datalink_time
uint16_t datalink_time
Definition: sim_ap.c:41
telemetry_intermcu_t::trans
struct short_transport trans
Transport without any extra encoding.
Definition: telemetry_intermcu_ap.h:41
intermcu_t::transport
struct pprz_transport transport
Transport over communication line (PPRZ)
Definition: intermcu.h:72
telemetry_intermcu_put_buffer
static void telemetry_intermcu_put_buffer(struct telemetry_intermcu_t *p, long fd, uint8_t *data, uint16_t len)
Definition: telemetry_intermcu_ap.c:93
DefaultPeriodic
#define DefaultPeriodic
Set default periodic telemetry.
Definition: telemetry.h:66
p
static float p[2][2]
Definition: ins_alt_float.c:268
INTERMCU_AP
#define INTERMCU_AP
Definition: intermcu.h:34
telemetry_intermcu_put_byte
static void telemetry_intermcu_put_byte(struct telemetry_intermcu_t *p, long fd, uint8_t data)
Definition: telemetry_intermcu_ap.c:85