/*
 * STMicroelectronics Tilt Sensor Class
 *
 * Copyright 2014-2015 STMicroelectronics Inc.
 * Author: Denis Ciocca - <denis.ciocca@st.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 */

#include <fcntl.h>
#include <assert.h>
#include <signal.h>

#include "TiltSensor.h"

TiltSensor::TiltSensor(HWSensorBaseCommonData *data, const char *name, int handle,
		int pipe_data_fd, float power_consumption) :
		HWSensorBase(data, name, handle, SENSOR_TYPE_TILT_DETECTOR, 0,
			pipe_data_fd, power_consumption)
{
	sensor_t_data.stringType = SENSOR_STRING_TYPE_TILT_DETECTOR;
	sensor_t_data.flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP;
	sensor_t_data.resolution = 1.0f;
	sensor_t_data.maxRange = 1.0f;

	num_data_axis = SENSOR_BASE_0AXIS;
}

TiltSensor::~TiltSensor()
{

}

int TiltSensor::SetDelay(int __attribute__((unused))handle,
				int64_t __attribute__((unused))period_ns,
				int64_t __attribute__((unused))timeout)
{
	return 0;
}

void TiltSensor::ProcessEvent(struct iio_event_data *event_data)
{
	sensor_event.data[0] = 1.0f;
	sensor_event.timestamp = event_data->timestamp;

	HWSensorBase::WriteDataToPipe();
	HWSensorBase::ProcessEvent(event_data);
}
