Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
power_uavcan.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2023 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
26#include "power_uavcan.h"
27#include "uavcan/uavcan.h"
29#include "math/pprz_random.h"
30#include "uavcan.equipment.power.BatteryInfo.h"
31#include "uavcan.equipment.power.CircuitStatus.h"
32
33
34/* Default maximum amount of batteries */
35#ifndef POWER_UAVCAN_BATTERIES_MAX
36#define POWER_UAVCAN_BATTERIES_MAX 3
37#endif
38
39/* Default maximum amount of circuits */
40#ifndef POWER_UAVCAN_CIRCUITS_MAX
41#define POWER_UAVCAN_CIRCUITS_MAX 15
42#endif
43
44/* Default Battery circuits */
45#ifndef POWER_UAVCAN_BATTERY_CIRCUITS
46#define POWER_UAVCAN_BATTERY_CIRCUITS {}
47#endif
48
49/* Local variables */
52
59
60/* Circuits */
67
68
71
72/* Battery circuits */
78
79#if PERIODIC_TELEMETRY
81
83{
84 static uint8_t idx = 0;
85 // Send the circuit status
86 if(circuits[idx].set) {
87 uint8_t cid = circuits[idx].status.circuit_id;
89 }
90
91 // Go to the next
92 if (rand_uniform() > 0.02) {
93 idx++;
94 }
96 idx = 0;
97 }
98}
99#endif /* PERIODIC_TELEMETRY */
100
101
103{
106 return; // decode error
107 }
108
109 // Search for the battery or free spot
111 for (uint8_t i = 0; i < POWER_UAVCAN_BATTERIES_MAX; i++) {
112 if (batteries[i].set && batteries[i].node_id == transfer->source_node_id &&
113 batteries[i].info.battery_id == msg.battery_id && batteries[i].info.model_instance_id == msg.model_instance_id) {
114 battery_idx = i;
115 break;
116 }
117 else if(!batteries[i].set) {
118 battery_idx = i;
119 break;
120 }
121 }
122
123 // No free spot found
125 return;
126 }
127
128 // Set the battery info
129 batteries[battery_idx].set = true;
130 batteries[battery_idx].node_id = transfer->source_node_id;
132
133 // Sum the battery currents
134 float current_sum = 0;
135 for (uint8_t i = 0; i < POWER_UAVCAN_BATTERIES_MAX; i++) {
136 if (batteries[i].set) {
137 current_sum += batteries[i].info.current;
138 }
139 }
141 if (msg.voltage > 0) {
142 electrical.vsupply = msg.voltage;
143 }
144}
145
147{
148
151 return; // decode error
152 }
153
154 // Search for the circuit or free spot
156 for (uint8_t i = 0; i < POWER_UAVCAN_CIRCUITS_MAX; i++) {
157 if (circuits[i].set && circuits[i].node_id == transfer->source_node_id && circuits[i].status.circuit_id == msg.circuit_id) {
158 circuit_idx = i;
159 break;
160 }
161 else if(!circuits[i].set) {
162 circuit_idx = i;
163 break;
164 }
165 }
166
167 // No free spot found
169 return;
170 }
171
172 // Set the circuit info
173 circuits[circuit_idx].set = true;
174 circuits[circuit_idx].node_id = transfer->source_node_id;
176
177 // Sum the 'battery' circuit currents
178 float current_sum = 0;
179 for (uint8_t i = 0; i < POWER_UAVCAN_CIRCUITS_MAX; i++) {
180 if (circuits[i].set && circuits[i].is_battery) {
181 current_sum += circuits[i].status.current;
182 }
183 }
185 if (msg.voltage > 0 && circuits[circuit_idx].is_battery) {
186 electrical.vsupply = msg.voltage;
187 }
188}
189
191{
192 // Init the battery circuits
193 for (uint8_t i = 0; i < sizeof(battery_circuits) / sizeof(struct uavcan_circuit_battery_t); i++) {
194 circuits[i].set = true;
196 circuits[i].status.circuit_id = battery_circuits[i].circuit_id;
197 circuits[i].is_battery = true;
198 }
199
200 // Bind uavcan BATTERYINFO message from EQUIPMENT.POWER
203
204 // Bind uavcan CIRCUIT_STATUS message from EQUIPMENT.POWER
207
208 // Configure telemetry
209#if PERIODIC_TELEMETRY
211#endif
212
213 // Initialize Random (for telemetry)
214 init_random();
215}
static uint8_t status
Main uavcan event structure for registering/calling callbacks.
Definition uavcan.h:60
struct Electrical electrical
Definition electrical.c:92
Interface for electrical status: supply voltage, current, battery status, etc.
float current
current in A
Definition electrical.h:47
float vsupply
supply voltage in V
Definition electrical.h:45
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
uint16_t foo
Definition main_demo5.c:58
static uint32_t idx
static struct uavcan_circuit_battery_t battery_circuits[]
static void power_uavcan_battery_cb(struct uavcan_iface_t *iface, CanardRxTransfer *transfer)
#define POWER_UAVCAN_BATTERY_CIRCUITS
static void power_uavcan_circuit_cb(struct uavcan_iface_t *iface, CanardRxTransfer *transfer)
static struct battery_info batteries[POWER_UAVCAN_BATTERIES_MAX]
static void power_uavcan_send_power_device(struct transport_tx *trans, struct link_device *dev)
struct uavcan_equipment_power_BatteryInfo info
struct uavcan_equipment_power_CircuitStatus status
static uavcan_event circuit_uavcan_ev
#define POWER_UAVCAN_CIRCUITS_MAX
void power_uavcan_init(void)
static uavcan_event power_uavcan_ev
#define POWER_UAVCAN_BATTERIES_MAX
uint8_t node_id
static struct circuit_status circuits[POWER_UAVCAN_CIRCUITS_MAX]
Power sensors on the uavcan bus.
void init_random(void)
Definition pprz_random.c:35
double rand_uniform(void)
Definition pprz_random.c:45
uavcan interface structure
Definition uavcan.h:34
static const struct usb_device_descriptor dev
Definition usb_ser_hw.c:74
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
void uavcan_bind(uint16_t data_type_id, uint64_t data_type_signature, uavcan_event *ev, uavcan_callback cb)
Bind to a receiving message from uavcan.
Definition uavcan.c:417
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
int transfer(const Mat *from, const image_t *to)