#define MAX_NAME_SIZE 32
+#define MIN_SAMPLES 5
+
#define ARRAY_SIZE(x) sizeof(x)/sizeof(x[0])
#define REPORTING_MODE(x) ((x) & 0x06)
int history_size; /* Number of recorded samples */
int history_entries; /* How many of these are initialized */
int history_index; /* Index of sample to evict next time */
+
+ /*
+ * Event counter - will be used to check if we have a significant sample
+ * for noisy sensors. We want to make sure we do not send any wrong
+ * events before filtering kicks in. We can also use it for statistics.
+ */
+ uint64_t event_count;
};
/* Reference a few commonly used variables... */
sensor_info[s].acquisition_thread = -1;
sensor_info[s].meta_data_pending = 0;
+ sensor_info[s].event_count = 0;
/* Check if we have a special ordering property on this sensor */
if (sensor_get_order(s, sensor_info[s].order))
if (sensor_info[s].quirks & QUIRK_FIELD_ORDERING)
reorder_fields(data->data, sensor_info[s].order);
+ sensor_info[s].event_count++;
switch (sensor_info[s].type) {
case SENSOR_TYPE_ACCELEROMETER:
/* Always consider the accelerometer accurate */
sensor_info[s].motion_trigger_name)
calibrate_gyro(data, &sensor_info[s]);
- if (sensor_info[s].quirks & QUIRK_NOISY)
+ /* For noisy sensors we'll drop a very few number
+ * of samples to make sure we have at least MIN_SAMPLES events
+ * in the filtering queue. This is to make sure we are not sending
+ * events that can disturb our mean or stddev.
+ */
+ if (sensor_info[s].quirks & QUIRK_NOISY) {
denoise_median(&sensor_info[s], data, 3);
+ if((sensor_info[s].selected_trigger !=
+ sensor_info[s].motion_trigger_name) &&
+ sensor_info[s].event_count < MIN_SAMPLES)
+ return 0;
+ }
break;
case SENSOR_TYPE_LIGHT: