This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new c51f749f9ab /drivers/sensors/nau7802: Added frequency control
c51f749f9ab is described below
commit c51f749f9abe73fe7966e3bd164abdba5c18d281
Author: Daniel Byshkin <[email protected]>
AuthorDate: Sat Jul 12 16:42:07 2025 -0400
/drivers/sensors/nau7802: Added frequency control
Added controls to the NAU7802 so that a user can change the frequency via
orb_set_frequency/orb_set_interval
---
drivers/sensors/nau7802.c | 47 +++++++++++++++++++++++++++++++++++++++--------
1 file changed, 39 insertions(+), 8 deletions(-)
diff --git a/drivers/sensors/nau7802.c b/drivers/sensors/nau7802.c
index 1b7c716c37d..42b1c18b232 100644
--- a/drivers/sensors/nau7802.c
+++ b/drivers/sensors/nau7802.c
@@ -105,6 +105,7 @@ typedef struct
sem_t run;
mutex_t devlock;
bool enabled;
+ uint32_t interval;
nau7802_odr_e odr;
} nau7802_dev_s;
@@ -440,11 +441,39 @@ static int nau7802_set_gain(FAR nau7802_dev_s *dev,
nau7802_gain_e gain)
* Name: nau7802_set_interval
****************************************************************************/
-static int nau7802_set_interval(FAR nau7802_dev_s *dev,
- nau7802_odr_e rate)
+static int nau7802_set_interval(FAR struct sensor_lowerhalf_s *lower,
+ FAR struct file *filep, uint32_t *period_us)
{
- dev->odr = rate;
- return nau7802_set_bits(dev, REG_CTRL_2, 3, 4, rate);
+ FAR nau7802_dev_s *dev = container_of(lower, FAR nau7802_dev_s, lower);
+
+ if (*period_us >= 100000)
+ {
+ dev->odr = NAU7802_ODR_10HZ;
+ }
+ else if (*period_us >= 50000)
+ {
+ dev->odr = NAU7802_ODR_20HZ;
+ }
+ else if (*period_us >= 25000)
+ {
+ dev->odr = NAU7802_ODR_40HZ;
+ }
+ else if (*period_us >= 12500)
+ {
+ dev->odr = NAU7802_ODR_80HZ;
+ }
+ else if (*period_us >= 3125)
+ {
+ dev->odr = NAU7802_ODR_320HZ;
+ }
+ else
+ {
+ return -EINVAL;
+ }
+
+ dev->interval = *period_us;
+
+ return nau7802_set_bits(dev, REG_CTRL_2, 3, 4, dev->odr);
}
/****************************************************************************
@@ -745,7 +774,7 @@ static int nau7802_activate(FAR struct sensor_lowerhalf_s
*lower,
return err;
}
- err = nau7802_set_interval(dev, NAU7802_ODR_10HZ);
+ err = nau7802_set_interval(lower, filep, &dev->interval);
if (err < 0)
{
return err;
@@ -846,7 +875,7 @@ static int nau7802_thread(int argc, FAR char *argv[])
/* Wait for next measurement cycle */
- nxsig_usleep(ODR_TO_INTERVAL[dev->odr]);
+ nxsig_usleep(dev->interval);
}
return err;
@@ -858,7 +887,8 @@ static const struct sensor_ops_s g_sensor_ops =
.get_info = nau7802_get_info,
.control = nau7802_control,
.calibrate = nau7802_calibrate,
- .set_calibvalue = nau7802_set_calibvalue
+ .set_calibvalue = nau7802_set_calibvalue,
+ .set_interval = nau7802_set_interval
};
/****************************************************************************
@@ -914,7 +944,8 @@ int nau7802_register(FAR struct i2c_master_s *i2c, int
devno, uint8_t addr)
priv->lower.ops = &g_sensor_ops;
priv->lower.type = SENSOR_TYPE_FORCE;
priv->enabled = false;
- priv->odr = NAU7802_ODR_10HZ; /* 10Hz (0.1s) default ODR */
+ priv->odr = NAU7802_ODR_10HZ; /* 10Hz (0.1s) default ODR */
+ priv->interval = ODR_TO_INTERVAL[priv->odr]; /* 100ms default interval */
err = sensor_register(&priv->lower, devno);
if (err < 0)