You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/11/17 14:59:46 UTC

[incubator-nuttx] branch master updated: Optimized GPS sensor and add gps satellite sensor.

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/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new fa90a3d  Optimized GPS sensor and add gps satellite sensor.
fa90a3d is described below

commit fa90a3dfd4a0b9c6a879c1c4d9cca3de88bb5ee7
Author: buyuer <di...@163.com>
AuthorDate: Wed Nov 17 10:04:50 2021 +0800

    Optimized GPS sensor and add gps satellite sensor.
    
    Signed-off-by: buyuer <di...@163.com>
---
 drivers/sensors/fakesensor.c   |  2 +-
 drivers/sensors/sensor.c       | 59 ++++++++++++++++---------------
 drivers/sensors/wtgahrs2.c     | 25 +++++--------
 include/nuttx/sensors/sensor.h | 80 ++++++++++++++++++++++++++++++++++--------
 4 files changed, 105 insertions(+), 61 deletions(-)

diff --git a/drivers/sensors/fakesensor.c b/drivers/sensors/fakesensor.c
index fa3e564..2860f96 100644
--- a/drivers/sensors/fakesensor.c
+++ b/drivers/sensors/fakesensor.c
@@ -207,7 +207,7 @@ static inline void fakesensor_read_gps(FAR struct fakesensor_s *sensor)
   gps.latitude /= 100.0f;
   gps.longitude /= 100.0f;
 
-  gps.height = altitude;
+  gps.altitude = altitude;
 
   sensor->lower.push_event(sensor->lower.priv, &gps,
                            sizeof(struct sensor_event_gps));
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index 5b48ce0..fc9d1c8 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -100,35 +100,36 @@ static int     sensor_poll(FAR struct file *filep, FAR struct pollfd *fds,
 
 static const struct sensor_info g_sensor_info[] =
 {
-  {0,                                 NULL},
-  {sizeof(struct sensor_event_accel), "accel"},
-  {sizeof(struct sensor_event_mag),   "mag"},
-  {sizeof(struct sensor_event_gyro),  "gyro"},
-  {sizeof(struct sensor_event_light), "light"},
-  {sizeof(struct sensor_event_baro),  "baro"},
-  {sizeof(struct sensor_event_prox),  "prox"},
-  {sizeof(struct sensor_event_humi),  "humi"},
-  {sizeof(struct sensor_event_temp),  "temp"},
-  {sizeof(struct sensor_event_rgb),   "rgb"},
-  {sizeof(struct sensor_event_hall),  "hall"},
-  {sizeof(struct sensor_event_ir),    "ir"},
-  {sizeof(struct sensor_event_gps),   "gps"},
-  {sizeof(struct sensor_event_uv),    "uv"},
-  {sizeof(struct sensor_event_noise), "noise"},
-  {sizeof(struct sensor_event_pm25),  "pm25"},
-  {sizeof(struct sensor_event_pm1p0), "pm1p0"},
-  {sizeof(struct sensor_event_pm10),  "pm10"},
-  {sizeof(struct sensor_event_co2),   "co2"},
-  {sizeof(struct sensor_event_hcho),  "hcho"},
-  {sizeof(struct sensor_event_tvoc),  "tvoc"},
-  {sizeof(struct sensor_event_ph),    "ph"},
-  {sizeof(struct sensor_event_dust),  "dust"},
-  {sizeof(struct sensor_event_hrate), "hrate"},
-  {sizeof(struct sensor_event_hbeat), "hbeat"},
-  {sizeof(struct sensor_event_ecg),   "ecg"},
-  {sizeof(struct sensor_event_ppg),   "ppg"},
-  {sizeof(struct sensor_event_impd),  "impd"},
-  {sizeof(struct sensor_event_ots),   "ots"},
+  {0,                                           NULL},
+  {sizeof(struct sensor_event_accel),           "accel"},
+  {sizeof(struct sensor_event_mag),             "mag"},
+  {sizeof(struct sensor_event_gyro),            "gyro"},
+  {sizeof(struct sensor_event_light),           "light"},
+  {sizeof(struct sensor_event_baro),            "baro"},
+  {sizeof(struct sensor_event_prox),            "prox"},
+  {sizeof(struct sensor_event_humi),            "humi"},
+  {sizeof(struct sensor_event_temp),            "temp"},
+  {sizeof(struct sensor_event_rgb),             "rgb"},
+  {sizeof(struct sensor_event_hall),            "hall"},
+  {sizeof(struct sensor_event_ir),              "ir"},
+  {sizeof(struct sensor_event_gps),             "gps"},
+  {sizeof(struct sensor_event_uv),              "uv"},
+  {sizeof(struct sensor_event_noise),           "noise"},
+  {sizeof(struct sensor_event_pm25),            "pm25"},
+  {sizeof(struct sensor_event_pm1p0),           "pm1p0"},
+  {sizeof(struct sensor_event_pm10),            "pm10"},
+  {sizeof(struct sensor_event_co2),             "co2"},
+  {sizeof(struct sensor_event_hcho),            "hcho"},
+  {sizeof(struct sensor_event_tvoc),            "tvoc"},
+  {sizeof(struct sensor_event_ph),              "ph"},
+  {sizeof(struct sensor_event_dust),            "dust"},
+  {sizeof(struct sensor_event_hrate),           "hrate"},
+  {sizeof(struct sensor_event_hbeat),           "hbeat"},
+  {sizeof(struct sensor_event_ecg),             "ecg"},
+  {sizeof(struct sensor_event_ppg),             "ppg"},
+  {sizeof(struct sensor_event_impd),            "impd"},
+  {sizeof(struct sensor_event_ots),             "ots"},
+  {sizeof(struct sensor_event_gps_satellite),   "gps_satellite"},
 };
 
 static const struct file_operations g_sensor_fops =
diff --git a/drivers/sensors/wtgahrs2.c b/drivers/sensors/wtgahrs2.c
index 42d28d9..8d726ef 100644
--- a/drivers/sensors/wtgahrs2.c
+++ b/drivers/sensors/wtgahrs2.c
@@ -303,22 +303,15 @@ static void wtgahrs2_gps_data(FAR struct wtgahrs2_dev_s *rtdata,
     {
       case WTGAHRS2_GPS0_INFO:
         rtdata->gps_mask |= WTGAHRS2_GPS0_MASK;
-        rtdata->gps.year = 2000 + buffer[0];
-        rtdata->gps.month = buffer[1];
-        rtdata->gps.day = buffer[2];
-        rtdata->gps.hour = buffer[3];
-        rtdata->gps.min = buffer[4];
-        rtdata->gps.sec = buffer[5];
-        rtdata->gps.msec = (buffer[7] << 8) | buffer[6];
         break;
 
       case WTGAHRS2_GPS1_INFO:
         rtdata->gps_mask |= WTGAHRS2_GPS1_MASK;
-        rtdata->gps.longitude = (long)(buffer[3] << 8
+        rtdata->gps.longitude = (buffer[3] << 8
                                 | buffer[2] << 8
                                 | buffer[1] << 8
                                 | buffer[0]) / 10000000.0f;
-        rtdata->gps.latitude = (long)(buffer[7] << 8
+        rtdata->gps.latitude = (buffer[7] << 8
                                | buffer[6] << 8
                                | buffer[5] << 8
                                | buffer[4]) / 10000000.0f;
@@ -326,9 +319,8 @@ static void wtgahrs2_gps_data(FAR struct wtgahrs2_dev_s *rtdata,
 
       case WTGAHRS2_GPS2_INFO:
         rtdata->gps_mask |= WTGAHRS2_GPS2_MASK;
-        rtdata->gps.height = (short)(buffer[1] << 8 | buffer[0]) / 10.0f;
-        rtdata->gps.yaw = (short)(buffer[3] << 8 | buffer[2]) / 10.0f;
-        rtdata->gps.speed = (long)(buffer[7] << 8 | buffer[6] << 8
+        rtdata->gps.altitude = (float)(buffer[1] << 8 | buffer[0]) / 10.0f;
+        rtdata->gps.ground_speed = (float)(buffer[7] << 8 | buffer[6] << 8
                     | buffer[5] << 8 | buffer[4]) / 3600.0f;
         break;
     }
@@ -337,13 +329,12 @@ static void wtgahrs2_gps_data(FAR struct wtgahrs2_dev_s *rtdata,
     {
       rtdata->gps_mask = 0;
       lower->push_event(lower->priv, &rtdata->gps, sizeof(rtdata->gps));
-      sninfo("Time : %d/%d/%d-%d:%d:%d\n", rtdata->gps.year,
-              rtdata->gps.month, rtdata->gps.day, rtdata->gps.hour,
-              rtdata->gps.min, rtdata->gps.sec);
+      sninfo("Time : %llu utc_time: %llu\n",
+             rtdata->gps.timestamp, rtdata->gps.time_utc);
       sninfo("GPS longitude : %fdegree, latitude:%fdegree\n",
               rtdata->gps.longitude, rtdata->gps.latitude);
-      sninfo("GPS speed: %fm/s, yaw:%fdegrees, height:%fm \n",
-              rtdata->gps.speed, rtdata->gps.yaw, rtdata->gps.height);
+      sninfo("GPS speed: %fm/s, altitude: %fm \n",
+              rtdata->gps.ground_speed, rtdata->gps.altitude);
     }
 }
 
diff --git a/include/nuttx/sensors/sensor.h b/include/nuttx/sensors/sensor.h
index 139646a..6374c8a 100644
--- a/include/nuttx/sensors/sensor.h
+++ b/include/nuttx/sensors/sensor.h
@@ -125,8 +125,9 @@
 #define SENSOR_TYPE_IR                              11
 
 /* GPS
- * A sensor of this type returns gps data. Include year, month, day,
- * hour, minutes, seconds, altitude, longitude, latitude.
+ * A sensor of this type returns gps data. Include latitude, longitude,
+ * altitude, horizontal position accuracy, vertical position accuracy,
+ * horizontal dilution of precision, vertical dilution of precision...
  */
 
 #define SENSOR_TYPE_GPS                             12
@@ -254,9 +255,15 @@
 
 #define SENSOR_TYPE_OTS                             28
 
+/* Sensor of gps satellite
+ * A sensor of this type returns the gps satellite information.
+ */
+
+#define SENSOR_TYPE_GPS_SATELLITE                   29
+
 /* The total number of sensor */
 
-#define SENSOR_TYPE_COUNT                           29
+#define SENSOR_TYPE_COUNT                           30
 
 /****************************************************************************
  * Inline Functions
@@ -364,19 +371,35 @@ struct sensor_event_ir      /* Type: Infrared Ray */
 
 struct sensor_event_gps     /* Type: Gps */
 {
-  int year;                 /* Time */
-  int month;
-  int day;
-  int hour;
-  int min;
-  int sec;
-  int msec;
-
-  float yaw;                /* Unit is Si degrees */
-  float height;             /* Unit is SI m */
-  float speed;              /* Unit is m/s */
+  uint64_t timestamp;       /* Time since system start, Units is microseconds */
+
+  /* This is the timestamp which comes from the gps module. It might be
+   * unavailable right after cold start, indicated by a value of 0,
+   * Units is microseconds
+   */
+
+  uint64_t time_utc;
+
   float latitude;           /* Unit is degrees */
   float longitude;          /* Unit is degrees */
+  float altitude;           /* Altitude above MSL(mean seal level), Unit is SI m */
+  float altitude_ellipsoid; /* Altitude bove Ellipsoid, Unit is SI m */
+
+  float eph;                /* GPS horizontal position accuracy (metres) */
+  float epv;                /* GPS vertical position accuracy (metres) */
+
+  float hdop;               /* Horizontal dilution of precision */
+  float vdop;               /* Vertical dilution of precision */
+
+  float ground_speed;       /* GPS ground speed, Unit is m/s */
+
+  /* Course over ground (NOT heading, but direction of movement),
+   * Unit is Si degrees
+   */
+
+  float course;
+
+  uint32_t satellites_used; /* Number of satellites used */
 };
 
 struct sensor_event_uv      /* Type: Ultraviolet Light */
@@ -477,6 +500,35 @@ struct sensor_event_ots     /* Type: OTS */
   int32_t y;                /* Axis Y in counts */
 };
 
+struct sensor_event_gps_satellite
+{
+  uint64_t timestamp;       /* Time since system start, Units is microseconds */
+  uint32_t count;           /* Total number of messages of satellites visible */
+  uint32_t satellites;      /* Total number of satellites in view */
+
+  struct satellite
+  {
+    uint32_t svid;          /* Space vehicle ID */
+
+  /* Elevation (0: right on top of receiver,
+   * 90: on the horizon) of satellite
+   */
+
+    uint32_t elevation;
+
+    /* Direction of satellite, 0: 0 deg, 255: 360 deg. */
+
+    uint32_t azimuth;
+
+  /* dBHz, Signal to noise ratio of satellite C/N0, range 0..99,
+   * zero when not tracking this satellite
+   */
+
+    uint32_t snr;
+  }
+  info[4];
+};
+
 /* The sensor lower half driver interface */
 
 struct sensor_lowerhalf_s;