static int process_scan (IIOSensorData data, DrvData *or_data) { int i; int accel_x, accel_y, accel_z; gboolean present_x, present_y, present_z; AccelReadings readings; if (data.read_size < 0) { g_warning ("Couldn't read from device: %s", g_strerror (errno)); return 0; } /* Rather than read everything: * for (i = 0; i < data.read_size / or_data->scan_size; i++)... * Just read the last one */ i = (data.read_size / or_data->buffer_data->scan_size) - 1; if (i < 0) { g_debug ("Not enough data to read (read_size: %d scan_size: %d)", (int) data.read_size, or_data->buffer_data->scan_size); return 0; } process_scan_1(data.data + or_data->buffer_data->scan_size*i, or_data->buffer_data, "in_accel_x", &accel_x, &present_x); process_scan_1(data.data + or_data->buffer_data->scan_size*i, or_data->buffer_data, "in_accel_y", &accel_y, &present_y); process_scan_1(data.data + or_data->buffer_data->scan_size*i, or_data->buffer_data, "in_accel_z", &accel_z, &present_z); g_debug ("Read from IIO: %d, %d, %d", accel_x, accel_y, accel_z); /* To match the Pegatron accelerometer code * (see pega_accel_poll() in asus-laptop.c) * we invert both x, and y values */ accel_x = -accel_x; accel_y = -accel_y; //FIXME report errors readings.accel_x = accel_x; readings.accel_y = accel_y; readings.accel_z = accel_z; or_data->callback_func (&iio_buffer_accel, (gpointer) &readings, or_data->user_data); return 1; }
static int process_scan (IIOSensorData data, DrvData *or_data) { int i; int level = 0; gdouble scale; gboolean present_level; LightReadings readings; if (data.read_size < 0) { g_warning ("Couldn't read from device '%s': %s", or_data->name, g_strerror (errno)); return 0; } /* Rather than read everything: * for (i = 0; i < data.read_size / or_data->scan_size; i++)... * Just read the last one */ i = (data.read_size / or_data->buffer_data->scan_size) - 1; if (i < 0) { g_debug ("Not enough data to read from '%s' (read_size: %d scan_size: %d)", or_data->name, (int) data.read_size, or_data->buffer_data->scan_size); return 0; } process_scan_1(data.data + or_data->buffer_data->scan_size*i, or_data->buffer_data, "in_intensity_both", &level, &scale, &present_level); g_debug ("Light read from IIO on '%s': %d (scale %lf) = %lf", or_data->name, level, scale, level * scale); readings.level = level * scale; /* Even though the IIO kernel API declares in_intensity* values as unitless, * we use Microsoft's hid-sensors-usages.docx which mentions that Windows 8 * compatible sensor proxies will be using Lux as the unit, and most sensors * will be Windows 8 compatible */ readings.uses_lux = TRUE; //FIXME report errors or_data->callback_func (&iio_buffer_light, (gpointer) &readings, or_data->user_data); return 1; }
static int process_scan (IIOSensorData data, DrvData *or_data) { int i; int level = 0; gdouble scale; gboolean present_level; LightReadings readings; if (data.read_size < 0) { g_warning ("Couldn't read from device: %s", g_strerror (errno)); return 0; } /* Rather than read everything: * for (i = 0; i < data.read_size / or_data->scan_size; i++)... * Just read the last one */ i = (data.read_size / or_data->buffer_data->scan_size) - 1; if (i < 0) { g_debug ("Not enough data to read (read_size: %d scan_size: %d)", (int) data.read_size, or_data->buffer_data->scan_size); return 0; } process_scan_1(data.data + or_data->buffer_data->scan_size*i, or_data->buffer_data, "in_intensity_both", &level, &scale, &present_level); g_debug ("Read from IIO: %f", level * scale); readings.level = level; if (scale) readings.level *= scale; readings.uses_lux = TRUE; //FIXME report errors or_data->callback_func (&iio_buffer_light, (gpointer) &readings, or_data->user_data); return 1; }