cmake_minimum_required(VERSION 2.6)
-project(sensors_bb CXX)
+project(sensor-plugins-mfld-blackbay CXX)
# to install pkgconfig setup file.
SET(EXEC_PREFIX "\${prefix}")
#ifndef COMPASSPROCESSOR_H
#define COMPASSPROCESSOR_H
+#define AXES 3
+#define TWO_PI 6.283185307179586476925286766559
+#define RADIAN_MULTIPLIER 57.295779513082320876798154814105
+#define ROTATION_180 180
#include "baseprocessor.h"
virtual int get_property(unsigned int property_level,
base_property_struct &result);
+ virtual void process_input_events(const std::vector <input_event *> &events);
+private:
+ double min_xyz[AXES];
+ double max_xyz[AXES];
+ double offset[AXES];
+ double mgval[AXES];
+ double head[AXES];
+ double previous[AXES];
};
#endif // COMPASSPROCESSOR_H
virtual bool enable();
virtual bool disable();
virtual void* started();
+private:
+ int mFar_near;
+ int mDistance;
};
#endif // PROXIPROCESSOR_H
+* Wed Apr 03 2013 Telle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com> submit/trunk/20130219.093127@4568f10
+- Updating version number to 0.1.1
+
+* Tue Mar 26 2013 Timo Toikkanen <timo.toikkanen@ixonos.com> Obsolete_Repo@cb11ba4
+- Add comment for sensor internal selftest results handling
+
+* Fri Mar 22 2013 Timo Toikkanen <timo.toikkanen@ixonos.com> submit/trunk/20130219.093127@af95230
+- Magnetometer and Proximity new evens
+
+* Tue Feb 19 2013 Telle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com> accepted/tizen_2.0/20130201.180546@a897b1d
+- Merge tizen_2.0 to master
+
+* Wed Jan 30 2013 Telle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com> submit/tizen_2.0/20130128.082005@ddba03f
+- Rename package to sensor-plugins-mfld-blackbay
+
+* Thu Jan 24 2013 Timo Toikkanen <timo.toikkanen@ixonos.com> accepted/tizen_2.0/20130111.182103@acd54f7
+- Fix for TZSP-4919
+- Updating changelog
+
* Fri Jan 10 2013 Telle-Tiia Pitkänen <telle-tiia.pitkanen@ixonos.com> submit/trunk/20121023.061641@daf1aa1
- Adding LGPLv2.1 license information
-Name: sf-plugins-bb
+Name: sensor-plugins-mfld-blackbay
Summary: Plugins for sensor framework on blackbay device
-Version: 0.0.1
+Version: 0.1.1
Release: 1
Group: System/Sensor Framework
License: LGPLv2.1
-Source0: sf-plugins-bb-%{version}.tar.gz
+Source0: %{name}-%{version}.tar.gz
Requires: libsf-common
Requires: sensor
Requires: udev
if (!fill_values(struct_type, count, unit, accuracy)) {
DbgPrint("Fill values returned false");
+ mValueMutex.unlock();
return -3;
}
void* BaseProcessor::started(void *ctx)
{
- //DbgPrint("%p",(void *) ctx);
+ DbgPrint("");
return ((BaseProcessor *) ctx)->started();
}
case EV_REL:
case EV_ABS:
DbgPrint("%s sensor got input code %d value %d\n",mName.c_str(), event.code, event.value);
- if (event.code >= 0 && event.code < sizeof(mValues)/sizeof(float))
+ if (event.code < sizeof(mValues)/sizeof(float))
mValues[event.code] = event.value;
break;
udev_enumerate *enumerator = NULL;
bool result = false;
struct udev_list_entry *devices = NULL, *dev_list_entry = NULL;
- const char *devicePath = NULL;
+ const char *devicePath = "";
DbgPrint("");
DbgPrint("Sysfs file entry opened");
int writeCount = write(fd,buffer,count);
if (writeCount == count) {
+ close(fd);
return true;
}
+ close(fd);
}
}
DbgPrint("There was error opening sysfs file %s",strerror(errno));
#include "compassprocessor.h"
#include "sensor_geomag.h"
#include "log.h"
+#include "math.h"
CompassProcessor::CompassProcessor()
{
DbgPrint("");
+ int i=0;
mName = "magnetometer";
mInputEventCount = 4;
find_input_device_by_name("hmc5883");
BaseProcessor::find_device_from_udev("compass");
mSysfsPath += "/hmc5883";
mSupportedEvents.push_back(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME);
+ mSupportedEvents.push_back(GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME);
+
+ for(i=0; i < AXES; ++i) {
+ min_xyz[i] = 700;
+ max_xyz[i] = -700;
+ previous[i] = 0;
+ }
}
bool CompassProcessor::fill_values(unsigned int type, int &count,
data_unit_idx_t &unit, data_accuracy &accuracy)
{
- if (type == GEOMAGNETIC_RAW_DATA_SET) {
- count = 3;
+ switch (type) {
+ case GEOMAGNETIC_RAW_DATA_SET:
+ count = AXES;
unit = IDX_UNIT_MICRO_TESLA;
accuracy = ACCURACY_GOOD;
- return true;
+ break;
+ case GEOMAGNETIC_ATTITUDE_DATA_SET:
+ count = AXES;
+ unit = IDX_UNIT_DEGREE;
+ accuracy = ACCURACY_GOOD;
+ mValues[0]= (int)head[0];
+ mValues[1]= (int)head[1];
+ mValues[2]= (int)head[2];
+ break;
+ default:
+ return false;
}
- return false;
+ return true;
}
int CompassProcessor::get_property(unsigned int property_level,
{
strcpy(result.sensor_name, "hmc5883");
strcpy(result.sensor_vendor,"Honeywell");
- if (property_level == GEOMAGNETIC_RAW_DATA_SET) {
+ switch (property_level){
+ case GEOMAGNETIC_RAW_DATA_SET:
result.sensor_unit_idx = IDX_UNIT_MICRO_TESLA;
result.sensor_min_range = 0;
result.sensor_max_range = 1000;
result.sensor_resolution = 1;
- } else {
+ break;
+ case GEOMAGNETIC_ATTITUDE_DATA_SET:
+ result.sensor_unit_idx = IDX_UNIT_DEGREE;
+ result.sensor_min_range = 0;
+ result.sensor_max_range = 360;
+ result.sensor_resolution = 2;
+ break;
+ default:
return -1;
}
-
return 0;
}
+
+void CompassProcessor::process_input_events(const std::vector <input_event *> &events)
+{
+ int i = 0 ;
+ int trim = -105;
+ double temp[AXES] ={0,0,0};
+ double sf[AXES] = {1,1,1};
+ BaseProcessor::process_input_events(events);
+
+ for(i=0; i < AXES; ++i) {
+ // remove internal kernel driver selftest results !
+ if (fabs(previous[i]-mValues[i]) > 150 ) {
+ previous[i] = mValues[i];
+ return;
+ }
+ previous[i] = mValues[i];
+ if (min_xyz[i] > mValues[i] && mValues[i] != 0) {
+ min_xyz[i] = mValues[i];
+ }
+ if (max_xyz[i] < mValues[i] && mValues[i] != 0) {
+ max_xyz[i] = mValues[i];
+ }
+ temp[i] = max_xyz[i] - min_xyz[i];
+ }
+
+ sf[0] = (temp[1]/temp[0]) > 1 ? (temp[1]/temp[0]) : 1;
+ sf[1] = (temp[0]/temp[1]) > 1 ? (temp[0]/temp[1]) : 1;
+ sf[2] = (temp[0]/temp[2]) > 1 ? (temp[0]/temp[2]) : 1;
+
+ for(i=0; i < AXES; ++i) {
+ offset[i] =((temp[i])/2-max_xyz[i])*sf[i];
+ mgval[i] = (mValues[i]+offset[i]) * sf[i];
+ }
+
+ head[0] = atan2(mgval[0],mgval[1]);
+ head[1] = atan2(mgval[2],mgval[1]);
+ head[2] = atan2(mgval[0],mgval[2]);
+
+ if(head[0] < 0)
+ head[0] += TWO_PI;
+ if(head[0] > TWO_PI)
+ head[0] -= TWO_PI;
+ head[0] = head[0] * RADIAN_MULTIPLIER;
+ for(i=1; i < AXES; ++i) {
+ head[i] = head[i] * RADIAN_MULTIPLIER;
+ }
+ if(head[1] < trim) {
+ head[1] = head[1]+(ROTATION_180-trim);
+ }
+ else{
+ head[1] = head[1]-(ROTATION_180 + trim);
+ }
+}
pollfd pollInfo;
pollInfo.fd = mFd;
pollInfo.events = POLLIN;
- poll(&pollInfo,1,2000);
-
- if (pollInfo.revents & POLLIN) {
+ if(poll(&pollInfo,1,2000)){
DbgPrint("HAVE POLLIN");
int value;
int readCount = read(mFd,&value,sizeof(int));
mName = "proxi";
mSupportedEvents.push_back(PROXIMITY_EVENT_CHANGE_STATE);
mSupportedEvents.push_back(PROXIMITY_EVENT_STATE_REPORT_ON_TIME);
+ mSupportedEvents.push_back(PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME);
}
bool ProxiProcessor::fill_values(unsigned int type, int &count,
count = 1;
accuracy = ACCURACY_GOOD;
unit = IDX_UNIT_STATE_ON_OFF;
+ mValues[0] = mFar_near;
+ return true;
+ case PROXIMITY_DISTANCE_DATA_SET:
+ count = 1;
+ accuracy = ACCURACY_GOOD;
+ unit = IDX_UNIT_CENTIMETER;
+ mValues[0] = mDistance;
return true;
}
strcpy(result.sensor_name,"ltr502");
strcpy(result.sensor_vendor, "Lite-On");
- if (property_level == PROXIMITY_BASE_DATA_SET) {
+ switch (property_level){
+ case PROXIMITY_BASE_DATA_SET:
result.sensor_unit_idx = IDX_UNIT_STATE_ON_OFF;
result.sensor_min_range = 0;
result.sensor_max_range = 1;
- result.sensor_resolution = 6;
- } else {
+ result.sensor_resolution = 1;
+ break;
+ case PROXIMITY_DISTANCE_DATA_SET:
+ result.sensor_unit_idx = IDX_UNIT_CENTIMETER;
+ result.sensor_min_range = 0;
+ result.sensor_max_range = 10;
+ result.sensor_resolution = 10;
+ break;
+ default:
return -1;
}
pollfd pollInfo;
pollInfo.fd = mFd;
pollInfo.events = POLLIN;
- poll(&pollInfo,1,-1);
- DbgPrint("Poll completed");
-
- if (pollInfo.revents & POLLIN) {
+ if (poll(&pollInfo,1,-1)){
+ DbgPrint("Poll completed");
int value;
int result = read(mFd,&value,sizeof(int));
if (result > 0) {
mValueMutex.lock();
- mValues[0] = value != 0 ? 1 : 0;
+ mDistance = value != 0 ? 0 : 10;
+ mFar_near = value != 0 ? 1 : 0;
mValueMutex.unlock();
vconf_set_int(PROXI_CHANGED_KEY,value);
LOGERR("Sensor name: %s", props.sensor_name);
sensor_data_t data;
- //memset(&data,0,sizeof(data));
/* connect with sensor fw */
LOGERR("connect with sensor fw");
if (err == 0) {
err = sf_get_data(sf_handle,data_event, &data);
if (err == 0) {
- LOGERR("sf_get_data values:", data.values[0]);
+ LOGERR("sf_get_data values:");
for (int i =0; i <data.values_num; i++)
LOGERR("%d: %f\n",i, data.values[i]);
LOGERR("Values end");
if (err)
LOGERR("Error registering for event %d",err);
} else {
- LOGERR("sf_get_data value fail", err);
+ LOGERR("sf_get_data value fail %d", err);
}
} else {
LOGERR("sf_start failed %d", err);
else if (strcmp(argv[1],"proxi") == 0)
connect_sfsvc(PROXIMITY_SENSOR, PROXIMITY_BASE_DATA_SET,PROXIMITY_EVENT_CHANGE_STATE );
else if (strcmp(argv[1],"compass") == 0)
- connect_sfsvc(GEOMAGNETIC_SENSOR, GEOMAGNETIC_RAW_DATA_SET,GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME );
+ connect_sfsvc(GEOMAGNETIC_SENSOR, GEOMAGNETIC_ATTITUDE_DATA_SET,GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME );
else if (strcmp(argv[1],"gyro") == 0)
connect_sfsvc(GYROSCOPE_SENSOR, GYRO_BASE_DATA_SET,GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME );
else {
if (!processor) {
cout <<"Give processor name: compass, light, proxi, accel,"
- <<"gyro, pressure, temperature";
+ <<"gyro, pressure, temperature \n";
return 1;
}
processor->get_struct_value(event,&result);
cerr <<"Values from sensor: \n";
- for (int i =0; i <result.values_num; i++)
+ for (i = 0; i <result.values_num; i++)
cerr <<i <<":" <<result.values[i] <<"\n";
cerr <<"Values end\n";
- //break;
}
}