drivers/sensors/gnss: Different nbuffer for each topic

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
This commit is contained in:
wangjianyu3 2024-11-30 07:54:33 +08:00 committed by Xiang Xiao
parent 16f39fbb56
commit d2dd747e09
2 changed files with 48 additions and 37 deletions

View file

@ -45,13 +45,6 @@
#define GNSS_PATH_FMT "/dev/ttyGNSS%d"
#define GNSS_IDX 0
#define GNSS_SATELLITE_IDX 1
#define GNSS_MEASUREMENT_IDX 2
#define GNSS_CLOCK_IDX 3
#define GNSS_GEOFENCE_IDX 4
#define GNSS_MAX_IDX 5
#define GNSS_PARSE_BUFFERSIZE 256
#define GNSS_KNOT_TO_KMH 1.852f
@ -86,7 +79,7 @@ struct gnss_user_s
struct gnss_upperhalf_s
{
struct gnss_sensor_s dev[GNSS_MAX_IDX];
struct gnss_sensor_s dev[SENSOR_GNSS_IDX_GNSS_MAX];
struct list_node userlist;
FAR struct gnss_lowerhalf_s *lower;
uint8_t crefs;
@ -537,7 +530,7 @@ static void gnss_parse_nmea(FAR struct gnss_upperhalf_s *upper,
satellite.satellites = frame.total_sats;
memcpy(satellite.info, frame.sats,
sizeof(satellite.info[0]) * 4);
lower = &upper->dev[GNSS_SATELLITE_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS_SATELLITE].lower;
for (i = 0; i < nitems(g_gnss_constellation); i++)
{
@ -572,7 +565,7 @@ static void gnss_parse_nmea(FAR struct gnss_upperhalf_s *upper,
if (GNSS_FLAG_MARK == upper->flags)
{
upper->flags &= ~GNSS_FLAG_MARK;
lower = &upper->dev[GNSS_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS].lower;
lower->push_event(lower->priv, &upper->gnss, sizeof(upper->gnss));
gnss_init_data(&upper->gnss);
}
@ -660,27 +653,27 @@ static void gnss_push_event(FAR void *priv, FAR const void *data,
if (type == SENSOR_TYPE_GNSS)
{
lower = &upper->dev[GNSS_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS].lower;
lower->push_event(lower->priv, data, bytes);
}
else if (type == SENSOR_TYPE_GNSS_SATELLITE)
{
lower = &upper->dev[GNSS_SATELLITE_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS_SATELLITE].lower;
lower->push_event(lower->priv, data, bytes);
}
else if (type == SENSOR_TYPE_GNSS_MEASUREMENT)
{
lower = &upper->dev[GNSS_MEASUREMENT_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS_MEASUREMENT].lower;
lower->push_event(lower->priv, data, bytes);
}
else if (type == SENSOR_TYPE_GNSS_CLOCK)
{
lower = &upper->dev[GNSS_CLOCK_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS_CLOCK].lower;
lower->push_event(lower->priv, data, bytes);
}
else if (type == SENSOR_TYPE_GNSS_GEOFENCE)
{
lower = &upper->dev[GNSS_GEOFENCE_IDX].lower;
lower = &upper->dev[SENSOR_GNSS_IDX_GNSS_GEOFENCE].lower;
lower->push_event(lower->priv, data, bytes);
}
}
@ -704,6 +697,7 @@ static void gnss_push_event(FAR void *priv, FAR const void *data,
* devno - The user specifies which device of this type, from 0. If the
* devno alerady exists, -EEXIST will be returned.
* nbuffer - The number of events that the circular buffer can hold.
* count - The array size of nbuffer.
*
* Returned Value:
* OK if the driver was successfully register; A negated errno value is
@ -712,13 +706,18 @@ static void gnss_push_event(FAR void *priv, FAR const void *data,
****************************************************************************/
int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
uint32_t nbuffer)
uint32_t nbuffer[], size_t count)
{
FAR struct gnss_upperhalf_s *upper;
FAR struct gnss_sensor_s *dev;
FAR char *path;
int ret;
if (count != SENSOR_GNSS_IDX_GNSS_MAX)
{
return -EINVAL;
}
upper = kmm_zalloc(sizeof(struct gnss_upperhalf_s));
if (upper == NULL)
{
@ -745,10 +744,10 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
/* GNSS register */
dev = &upper->dev[GNSS_IDX];
dev = &upper->dev[SENSOR_GNSS_IDX_GNSS];
dev->lower.ops = &g_gnss_sensor_ops;
dev->lower.type = SENSOR_TYPE_GNSS;
dev->lower.nbuffer = nbuffer;
dev->lower.nbuffer = nbuffer[SENSOR_GNSS_IDX_GNSS];
dev->upper = upper;
ret = sensor_register(&dev->lower, devno);
if (ret < 0)
@ -758,10 +757,10 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
/* Satellite register */
dev = &upper->dev[GNSS_SATELLITE_IDX];
dev = &upper->dev[SENSOR_GNSS_IDX_GNSS_SATELLITE];
dev->lower.ops = &g_gnss_sensor_ops;
dev->lower.type = SENSOR_TYPE_GNSS_SATELLITE;
dev->lower.nbuffer = nbuffer;
dev->lower.nbuffer = nbuffer[SENSOR_GNSS_IDX_GNSS_SATELLITE];
dev->upper = upper;
ret = sensor_register(&dev->lower, devno);
if (ret < 0)
@ -771,10 +770,10 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
/* GNSS Measurement register */
dev = &upper->dev[GNSS_MEASUREMENT_IDX];
dev = &upper->dev[SENSOR_GNSS_IDX_GNSS_MEASUREMENT];
dev->lower.ops = &g_gnss_sensor_ops;
dev->lower.type = SENSOR_TYPE_GNSS_MEASUREMENT;
dev->lower.nbuffer = nbuffer;
dev->lower.nbuffer = nbuffer[SENSOR_GNSS_IDX_GNSS_MEASUREMENT];
dev->upper = upper;
ret = sensor_register(&dev->lower, devno);
if (ret < 0)
@ -784,10 +783,10 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
/* GNSS Colck register */
dev = &upper->dev[GNSS_CLOCK_IDX];
dev = &upper->dev[SENSOR_GNSS_IDX_GNSS_CLOCK];
dev->lower.ops = &g_gnss_sensor_ops;
dev->lower.type = SENSOR_TYPE_GNSS_CLOCK;
dev->lower.nbuffer = nbuffer;
dev->lower.nbuffer = nbuffer[SENSOR_GNSS_IDX_GNSS_CLOCK];
dev->upper = upper;
ret = sensor_register(&dev->lower, devno);
if (ret < 0)
@ -797,10 +796,10 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
/* GNSS Geofence */
dev = &upper->dev[GNSS_GEOFENCE_IDX];
dev = &upper->dev[SENSOR_GNSS_IDX_GNSS_GEOFENCE];
dev->lower.ops = &g_gnss_sensor_ops;
dev->lower.type = SENSOR_TYPE_GNSS_GEOFENCE;
dev->lower.nbuffer = nbuffer;
dev->lower.nbuffer = nbuffer[SENSOR_GNSS_IDX_GNSS_GEOFENCE];
dev->upper = upper;
ret = sensor_register(&dev->lower, devno);
if (ret < 0)
@ -828,15 +827,17 @@ int gnss_register(FAR struct gnss_lowerhalf_s *lower, int devno,
driver_err:
circbuf_uninit(&upper->buffer);
circ_err:
sensor_unregister(&upper->dev[GNSS_GEOFENCE_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_GEOFENCE].lower, devno);
gnss_geofence_err:
sensor_unregister(&upper->dev[GNSS_CLOCK_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_CLOCK].lower, devno);
gnss_clock_err:
sensor_unregister(&upper->dev[GNSS_MEASUREMENT_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_MEASUREMENT].lower,
devno);
gnss_measurement_err:
sensor_unregister(&upper->dev[GNSS_SATELLITE_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_SATELLITE].lower,
devno);
satellite_err:
sensor_unregister(&upper->dev[GNSS_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS].lower, devno);
gnss_err:
nxmutex_destroy(&upper->lock);
nxmutex_destroy(&upper->bufferlock);
@ -872,11 +873,13 @@ void gnss_unregister(FAR struct gnss_lowerhalf_s *lower, int devno)
return;
}
sensor_unregister(&upper->dev[GNSS_IDX].lower, devno);
sensor_unregister(&upper->dev[GNSS_SATELLITE_IDX].lower, devno);
sensor_unregister(&upper->dev[GNSS_MEASUREMENT_IDX].lower, devno);
sensor_unregister(&upper->dev[GNSS_CLOCK_IDX].lower, devno);
sensor_unregister(&upper->dev[GNSS_GEOFENCE_IDX].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_SATELLITE].lower,
devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_MEASUREMENT].lower,
devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_CLOCK].lower, devno);
sensor_unregister(&upper->dev[SENSOR_GNSS_IDX_GNSS_GEOFENCE].lower, devno);
snprintf(path, PATH_MAX, GNSS_PATH_FMT, devno);
unregister_driver(path);
nxsem_destroy(&upper->buffersem);

View file

@ -33,6 +33,13 @@
* Pre-processor Definitions
****************************************************************************/
#define SENSOR_GNSS_IDX_GNSS 0
#define SENSOR_GNSS_IDX_GNSS_SATELLITE 1
#define SENSOR_GNSS_IDX_GNSS_MEASUREMENT 2
#define SENSOR_GNSS_IDX_GNSS_CLOCK 3
#define SENSOR_GNSS_IDX_GNSS_GEOFENCE 4
#define SENSOR_GNSS_IDX_GNSS_MAX 5
/****************************************************************************
* Public Types
****************************************************************************/
@ -202,6 +209,7 @@ extern "C"
* devno - The user specifies which device of this type, from 0. If the
* devno alerady exists, -EEXIST will be returned.
* nbuffer - The number of events that the circular buffer can hold.
* count - The array size of nbuffer.
*
* Returned Value:
* OK if the driver was successfully register; A negated errno value is
@ -210,7 +218,7 @@ extern "C"
****************************************************************************/
int gnss_register(FAR struct gnss_lowerhalf_s *dev, int devno,
uint32_t nbuffer);
uint32_t nbuffer[], size_t count);
/****************************************************************************
* Name: gnss_unregister