Goldfish Sensor Driver

Introduction

The Goldfish Sensor driver provides a virtual multi-sensor interface for Android Goldfish/QEMU emulator environments. This driver enables NuttX to interact with the QEMU sensor emulation infrastructure, allowing applications to access various simulated sensor types without requiring physical hardware.

The driver supports multiple sensor types through a unified interface based on the NuttX sensor framework (uORB), making it suitable for development, testing, and debugging of sensor-dependent applications in virtualized environments.

Supported Sensor Types

The Goldfish Sensor driver supports the following sensor types:

Inertial Sensors

  • Accelerometer (SENSOR_TYPE_ACCELEROMETER)

    • Measures linear acceleration in three axes (x, y, z)

    • Range: ±2.8 m/s²

    • Resolution: 1.0/4032.0 m/s²

    • Power consumption: 3.0 mW

  • Gyroscope (SENSOR_TYPE_GYROSCOPE)

    • Measures angular velocity in three axes

    • Range: ±11.11 rad/s

    • Resolution: 1.0/1000.0 rad/s

    • Power consumption: 3.0 mW

  • Uncalibrated Accelerometer (SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED)

    • Raw accelerometer data without calibration

    • Range: ±39.3 m/s²

    • Resolution: 1.0/4032.0 m/s²

  • Uncalibrated Gyroscope (SENSOR_TYPE_GYROSCOPE_UNCALIBRATED)

    • Raw gyroscope data without drift compensation

    • Range: ±16.46 rad/s

    • Resolution: 1.0/1000.0 rad/s

Magnetic Sensors

  • Magnetometer (SENSOR_TYPE_MAGNETIC_FIELD)

    • Measures magnetic field strength in three axes

    • Range: ±2000.0 μT

    • Resolution: 1.0 μT

    • Power consumption: 6.7 mW

  • Uncalibrated Magnetometer (SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED)

    • Raw magnetic field data without hard/soft iron correction

    • Range: ±2000.0 μT

    • Resolution: 1.0 μT

Environmental Sensors

  • Ambient Temperature (SENSOR_TYPE_AMBIENT_TEMPERATURE)

    • Measures ambient temperature

    • Range: 0-80°C

    • Resolution: 1.0°C

    • Power consumption: 0.0 mW

  • Barometric Pressure (SENSOR_TYPE_BAROMETER)

    • Measures atmospheric pressure

    • Range: 0-800 hPa

    • Resolution: 1.0 hPa

    • Power consumption: 20.0 mW

  • Relative Humidity (SENSOR_TYPE_RELATIVE_HUMIDITY)

    • Measures relative humidity

    • Range: 0-100%

    • Resolution: 1.0%

    • Power consumption: 20.0 mW

Optical Sensors

  • Ambient Light (SENSOR_TYPE_LIGHT)

    • Measures ambient light intensity

    • Range: 0-40000 lux

    • Resolution: 1.0 lux

    • Power consumption: 20.0 mW

  • Proximity (SENSOR_TYPE_PROXIMITY)

    • Detects nearby objects

    • Range: 0-1.0 (binary detection)

    • Resolution: 1.0

    • Power consumption: 20.0 mW

Orientation Sensors

  • Orientation (SENSOR_TYPE_ORIENTATION)

    • Provides device orientation (azimuth, pitch, roll)

    • Range: 0-360°

    • Resolution: 1.0°

    • Power consumption: 9.7 mW

Position Sensors

  • Hinge Angle 0/1/2 (SENSOR_TYPE_HINGE_ANGLE)

    • Measures foldable device hinge angles

    • Range: 0-360°

    • Resolution: 1.0°

    • Power consumption: 3.0 mW

    • Note: Supports up to 3 hinges (for multi-fold devices)

Biometric Sensors

  • Heart Rate (SENSOR_TYPE_HEART_RATE)

    • Measures heart rate in beats per minute

    • Range: 0-500 bpm

    • Resolution: 1.0 bpm

    • Power consumption: 20.0 mW

Gesture Sensors

  • Wrist Tilt (SENSOR_TYPE_WRIST_TILT_GESTURE)

    • Detects wrist tilt gesture events

    • Range: 0-1.0 (event trigger)

    • Resolution: 1.0

    • Power consumption: 20.0 mW

Usage

Kernel Configuration

Enable the Goldfish Sensor driver in your NuttX configuration:

CONFIG_SENSORS=y
CONFIG_SENSORS_GOLDFISH=y
CONFIG_GOLDFISH_PIPE=y

Driver Initialization

The driver is typically initialized during board-level setup:

#include <nuttx/sensors/goldfish_sensor.h>

int board_sensors_initialize(void)
{
  int ret;

  /* Initialize Goldfish sensors with device number 0
   * and batch buffer size of 1
   */
  ret = goldfish_sensor_init(0, 1);
  if (ret < 0)
    {
      snerr("ERROR: Failed to initialize Goldfish sensors: %d\n", ret);
      return ret;
    }

  return OK;
}

Application Usage

Applications can access sensors through the standard NuttX sensor interface:

#include <fcntl.h>
#include <nuttx/sensors/sensor.h>

int main(int argc, char *argv[])
{
  struct sensor_accel accel_data;
  int fd;
  int ret;

  /* Open accelerometer sensor */
  fd = open("/dev/uorb/sensor_accel0", O_RDONLY);
  if (fd < 0)
    {
      printf("Failed to open accelerometer\n");
      return -1;
    }

  /* Read sensor data */
  while (1)
    {
      ret = read(fd, &accel_data, sizeof(accel_data));
      if (ret == sizeof(accel_data))
        {
          printf("Accel: x=%.2f y=%.2f z=%.2f (timestamp=%llu)\n",
                 accel_data.x, accel_data.y, accel_data.z,
                 accel_data.timestamp);
        }

      usleep(100000); /* 100ms */
    }

  close(fd);
  return 0;
}