Merge branch 'main' into pr-dual-atmos

This commit is contained in:
Pedro Roque
2025-12-12 11:56:48 -08:00
committed by GitHub
22 changed files with 148 additions and 8 deletions
+1
View File
@@ -40,6 +40,7 @@ CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y
CONFIG_DRIVERS_POWER_MONITOR_INA226=y CONFIG_DRIVERS_POWER_MONITOR_INA226=y
CONFIG_DRIVERS_POWER_MONITOR_INA228=y CONFIG_DRIVERS_POWER_MONITOR_INA228=y
CONFIG_DRIVERS_POWER_MONITOR_INA238=y CONFIG_DRIVERS_POWER_MONITOR_INA238=y
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_PWM_OUT=y
CONFIG_DRIVERS_PX4IO=y CONFIG_DRIVERS_PX4IO=y
CONFIG_COMMON_RC=y CONFIG_COMMON_RC=y
+6
View File
@@ -97,5 +97,11 @@ bmm150 -I start
# Internal Baro on I2C # Internal Baro on I2C
bmp388 -I start bmp388 -I start
# Start an external PWM generator
if param greater PCA9685_EN_BUS 0
then
pca9685_pwm_out start
fi
unset HAVE_PM2 unset HAVE_PM2
unset HAVE_PM3 unset HAVE_PM3
+1
View File
@@ -21,6 +21,7 @@ CONFIG_DRIVERS_IMU_MURATA_SCH16T=y
CONFIG_COMMON_LIGHT=y CONFIG_COMMON_LIGHT=y
CONFIG_COMMON_MAGNETOMETER=y CONFIG_COMMON_MAGNETOMETER=y
CONFIG_DRIVERS_OSD_MSP_OSD=y CONFIG_DRIVERS_OSD_MSP_OSD=y
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_PWM_OUT=y
CONFIG_COMMON_RC=y CONFIG_COMMON_RC=y
CONFIG_DRIVERS_UAVCAN=y CONFIG_DRIVERS_UAVCAN=y
+6
View File
@@ -16,3 +16,9 @@ iis2mdc -R 0 -I -b 4 start
# Internal Baro on I2C # Internal Baro on I2C
bmp388 -I -b 2 start bmp388 -I -b 2 start
# Start an external PWM generator
if param greater PCA9685_EN_BUS 0
then
pca9685_pwm_out start
fi
+1
View File
@@ -19,6 +19,7 @@ CONFIG_COMMON_LIGHT=y
CONFIG_DRIVERS_MAGNETOMETER_MEMSIC_MMC5983MA=y CONFIG_DRIVERS_MAGNETOMETER_MEMSIC_MMC5983MA=y
CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y
CONFIG_DRIVERS_OPTICAL_FLOW_PAW3902=y CONFIG_DRIVERS_OPTICAL_FLOW_PAW3902=y
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
CONFIG_DRIVERS_POWER_MONITOR_INA226=y CONFIG_DRIVERS_POWER_MONITOR_INA226=y
CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_PWM_OUT=y
CONFIG_COMMON_RC=y CONFIG_COMMON_RC=y
+6
View File
@@ -34,3 +34,9 @@ paw3902 -s -b 3 start -Y 90
# Internal distance sensor # Internal distance sensor
afbrs50 start afbrs50 start
# Start an external PWM generator
if param greater PCA9685_EN_BUS 0
then
pca9685_pwm_out start
fi
@@ -74,5 +74,5 @@ ist8310 -X -b 1 -R 10 start
# Start an external PWM generator # Start an external PWM generator
if param greater PCA9685_EN_BUS 0 if param greater PCA9685_EN_BUS 0
then then
pca9685_pwm_out start -b 1 pca9685_pwm_out start
fi fi
@@ -11,3 +11,7 @@ param set BAT1_V_DIV 5.7
# Always keep current config # Always keep current config
param set SYS_AUTOCONFIG 0 param set SYS_AUTOCONFIG 0
# PCA9685 PWM Out defaults
param set-default PCA9685_EN_BUS 4
param set-default PCA9685_I2C_ADDR 64
@@ -28,7 +28,7 @@ then
echo "ads1115 not found." echo "ads1115 not found."
fi fi
if ! pca9685_pwm_out start -a 0x40 -b 4 if ! pca9685_pwm_out start
then then
echo "pca9685_pwm_out not found." echo "pca9685_pwm_out not found."
fi fi
@@ -486,6 +486,16 @@ The integer refers to the I2C bus number where PCA9685 is connected.
| ------ | -------- | -------- | --------- | ------- | ---- | | ------ | -------- | -------- | --------- | ------- | ---- |
|   | 0 | 10 | | 0 | |   | 0 | 10 | | 0 |
### PCA9685_I2C_ADDR (`INT32`) {#PCA9685_I2C_ADDR}
I2C address of PCA9685.
The default address is 0x40 (64).
| Reboot | minValue | maxValue | increment | default | unit |
| ------ | -------- | -------- | --------- | ------- | ---- |
|   | 0 | 127 | | 64 |
### PCA9685_FAIL1 (`INT32`) {#PCA9685_FAIL1} ### PCA9685_FAIL1 (`INT32`) {#PCA9685_FAIL1}
PCA9685 Output Channel 1 Failsafe Value. PCA9685 Output Channel 1 Failsafe Value.
+2
View File
@@ -899,6 +899,8 @@ fetching the latest mixing result and write them to PCA9685 at its scheduling ti
It can do full 12bits output as duty-cycle mode, while also able to output precious pulse width It can do full 12bits output as duty-cycle mode, while also able to output precious pulse width
that can be accepted by most ESCs and servos. that can be accepted by most ESCs and servos.
The I2C bus and address can be configured via parameters `PCA9685_EN_BUS` and `PCA9685_I2C_ADDR`, or via command line arguments.
### Examples ### Examples
It is typically started with: It is typically started with:
+5
View File
@@ -74,6 +74,11 @@ ssize_t Serial::bytesAvailable()
return _impl.bytesAvailable(); return _impl.bytesAvailable();
} }
ssize_t Serial::txSpaceAvailable()
{
return _impl.txSpaceAvailable();
}
ssize_t Serial::read(uint8_t *buffer, size_t buffer_size) ssize_t Serial::read(uint8_t *buffer, size_t buffer_size)
{ {
return _impl.read(buffer, buffer_size); return _impl.read(buffer, buffer_size);
@@ -62,6 +62,7 @@ public:
bool close(); bool close();
ssize_t bytesAvailable(); ssize_t bytesAvailable();
ssize_t txSpaceAvailable();
ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t read(uint8_t *buffer, size_t buffer_size);
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_ms = 0); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_ms = 0);
+25 -1
View File
@@ -293,12 +293,36 @@ ssize_t SerialImpl::bytesAvailable()
{ {
if (!_open) { if (!_open) {
PX4_ERR("Device not open!"); PX4_ERR("Device not open!");
errno = EBADF;
return -1; return -1;
} }
ssize_t bytes_available = 0; ssize_t bytes_available = 0;
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available); int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
return ret >= 0 ? bytes_available : 0;
if (ret < 0) {
return -1;
}
return bytes_available;
}
ssize_t SerialImpl::txSpaceAvailable()
{
if (!_open) {
PX4_ERR("Device not open!");
errno = EBADF;
return -1;
}
ssize_t space_available = 0;
int ret = ioctl(_serial_fd, FIONSPACE, &space_available);
if (ret < 0) {
return -1;
}
return space_available;
} }
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
@@ -60,6 +60,7 @@ public:
bool close(); bool close();
ssize_t bytesAvailable(); ssize_t bytesAvailable();
ssize_t txSpaceAvailable();
ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t read(uint8_t *buffer, size_t buffer_size);
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
+1
View File
@@ -60,6 +60,7 @@ public:
bool close(); bool close();
ssize_t bytesAvailable(); ssize_t bytesAvailable();
ssize_t txSpaceAvailable();
ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t read(uint8_t *buffer, size_t buffer_size);
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
+20 -1
View File
@@ -281,12 +281,31 @@ ssize_t SerialImpl::bytesAvailable()
{ {
if (!_open) { if (!_open) {
PX4_ERR("Device not open!"); PX4_ERR("Device not open!");
errno = EBADF;
return -1; return -1;
} }
ssize_t bytes_available = 0; ssize_t bytes_available = 0;
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available); int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
return ret >= 0 ? bytes_available : 0;
if (ret < 0) {
return -1;
}
return bytes_available;
}
ssize_t SerialImpl::txSpaceAvailable()
{
if (!_open) {
PX4_ERR("Device not open!");
errno = EBADF;
return -1;
}
// POSIX/Linux doesn't have a direct equivalent to NuttX's FIONSPACE
errno = ENOSYS;
return -1;
} }
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
+1
View File
@@ -59,6 +59,7 @@ public:
bool close(); bool close();
ssize_t bytesAvailable(); ssize_t bytesAvailable();
ssize_t txSpaceAvailable();
ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t read(uint8_t *buffer, size_t buffer_size);
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
+20 -1
View File
@@ -156,14 +156,33 @@ ssize_t SerialImpl::bytesAvailable()
{ {
if (!_open) { if (!_open) {
PX4_ERR("Device not open!"); PX4_ERR("Device not open!");
errno = EBADF;
return -1; return -1;
} }
uint32_t rx_bytes = 0; uint32_t rx_bytes = 0;
(void) fc_uart_rx_available(_serial_fd, &rx_bytes); int ret = fc_uart_rx_available(_serial_fd, &rx_bytes);
if (ret < 0) {
return -1;
}
return (ssize_t) rx_bytes; return (ssize_t) rx_bytes;
} }
ssize_t SerialImpl::txSpaceAvailable()
{
if (!_open) {
PX4_ERR("Device not open!");
errno = EBADF;
return -1;
}
// QURT doesn't have a direct equivalent to NuttX's FIONSPACE
errno = ENOSYS;
return -1;
}
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
{ {
if (!_open) { if (!_open) {
+25 -2
View File
@@ -47,6 +47,7 @@
#include <drivers/drv_hrt.h> #include <drivers/drv_hrt.h>
#include <px4_platform_common/getopt.h> #include <px4_platform_common/getopt.h>
#include <px4_platform_common/sem.hpp> #include <px4_platform_common/sem.hpp>
#include <lib/parameters/param.h>
#include "PCA9685.h" #include "PCA9685.h"
@@ -356,8 +357,30 @@ int PCA9685Wrapper::custom_command(int argc, char **argv) {
int PCA9685Wrapper::task_spawn(int argc, char **argv) { int PCA9685Wrapper::task_spawn(int argc, char **argv) {
int ch; int ch;
int address=PCA9685_DEFAULT_ADDRESS; int address = PCA9685_DEFAULT_ADDRESS;
int iicbus=PCA9685_DEFAULT_IICBUS; int iicbus = PCA9685_DEFAULT_IICBUS;
int32_t en_bus = 0;
param_t param_handle = param_find("PCA9685_EN_BUS");
if (param_handle != PARAM_INVALID) {
param_get(param_handle, &en_bus);
if (en_bus > 0) {
iicbus = en_bus;
}
}
int32_t i2c_addr = 0;
param_handle = param_find("PCA9685_I2C_ADDR");
if (param_handle != PARAM_INVALID) {
param_get(param_handle, &i2c_addr);
if (i2c_addr > 0) {
address = i2c_addr;
}
}
int myoptind = 1; int myoptind = 1;
const char *myoptarg = nullptr; const char *myoptarg = nullptr;
+10
View File
@@ -29,6 +29,16 @@ parameters:
min: 0 min: 0
max: 10 max: 10
default: 0 default: 0
PCA9685_I2C_ADDR:
description:
short: I2C address of PCA9685
long: |
I2C address of PCA9685.
The default address is 0x40 (64).
type: int32
min: 1
max: 127
default: 64
PCA9685_SCHD_HZ: PCA9685_SCHD_HZ:
description: description:
short: PWM update rate short: PWM update rate
-1
View File
@@ -105,7 +105,6 @@ EscBattery::Run()
} }
average_voltage_v /= online_esc_count; average_voltage_v /= online_esc_count;
total_current_a /= online_esc_count;
average_temperature_c /= online_esc_count; average_temperature_c /= online_esc_count;
_battery.setConnected(true); _battery.setConnected(true);