static int sensor_events_listener(int fd, int events, void* data) { SensorListener* listener = (SensorListener*) data; ssize_t num_sensors; ASensorEvent sen_events[8]; while ((num_sensors = listener->mSensorEventQueue->read(sen_events, 8)) > 0) { for (int i = 0; i < num_sensors; i++) { if (sen_events[i].type == Sensor::TYPE_ACCELEROMETER) { float x = sen_events[i].vector.azimuth; float y = sen_events[i].vector.pitch; float z = sen_events[i].vector.roll; float radius = 0; int tilt = 0, orient = 0; CAMHAL_LOGVA("ACCELEROMETER EVENT"); CAMHAL_LOGVB(" azimuth = %f pitch = %f roll = %f", sen_events[i].vector.azimuth, sen_events[i].vector.pitch, sen_events[i].vector.roll); // see http://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates // about conversion from cartesian to spherical for orientation calculations radius = (float) sqrt(x * x + y * y + z * z); tilt = (int) asinf(z / radius) * RADIANS_2_DEG; orient = (int) atan2f(-x, y) * RADIANS_2_DEG; if (orient < 0) { orient += 360; } if (orient >= DEGREES_270_THRESH) { orient = 270; } else if (orient >= DEGREES_180_THRESH) { orient = 180; } else if (orient >= DEGREES_90_THRESH) { orient = 90; } else { orient = 0; } listener->handleOrientation(orient, tilt); CAMHAL_LOGVB(" tilt = %d orientation = %d", tilt, orient); } else if (sen_events[i].type == Sensor::TYPE_GYROSCOPE) { CAMHAL_LOGVA("GYROSCOPE EVENT"); } } } if (num_sensors < 0 && num_sensors != -EAGAIN) { CAMHAL_LOGEB("reading events failed: %s", strerror(-num_sensors)); } return 1; }
status_t OMXCameraAdapter::setParametersEXIF(const CameraParameters ¶ms, BaseCameraAdapter::AdapterState state) { status_t ret = NO_ERROR; const char *valstr = NULL; double gpsPos; LOG_FUNCTION_NAME; if( ( valstr = params.get(CameraParameters::KEY_GPS_LATITUDE) ) != NULL ) { gpsPos = strtod(valstr, NULL); if ( convertGPSCoord(gpsPos, mEXIFData.mGPSData.mLatDeg, mEXIFData.mGPSData.mLatMin, mEXIFData.mGPSData.mLatSec, mEXIFData.mGPSData.mLatSecDiv ) == NO_ERROR ) { if ( 0 < gpsPos ) { strncpy(mEXIFData.mGPSData.mLatRef, GPS_NORTH_REF, GPS_REF_SIZE); } else { strncpy(mEXIFData.mGPSData.mLatRef, GPS_SOUTH_REF, GPS_REF_SIZE); } mEXIFData.mGPSData.mLatValid = true; } else { mEXIFData.mGPSData.mLatValid = false; } } else { mEXIFData.mGPSData.mLatValid = false; } if( ( valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE) ) != NULL ) { gpsPos = strtod(valstr, NULL); if ( convertGPSCoord(gpsPos, mEXIFData.mGPSData.mLongDeg, mEXIFData.mGPSData.mLongMin, mEXIFData.mGPSData.mLongSec, mEXIFData.mGPSData.mLongSecDiv) == NO_ERROR ) { if ( 0 < gpsPos ) { strncpy(mEXIFData.mGPSData.mLongRef, GPS_EAST_REF, GPS_REF_SIZE); } else { strncpy(mEXIFData.mGPSData.mLongRef, GPS_WEST_REF, GPS_REF_SIZE); } mEXIFData.mGPSData.mLongValid= true; } else { mEXIFData.mGPSData.mLongValid = false; } } else { mEXIFData.mGPSData.mLongValid = false; } if( ( valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE) ) != NULL ) { gpsPos = strtod(valstr, NULL); mEXIFData.mGPSData.mAltitude = floor(fabs(gpsPos)); if (gpsPos < 0) { mEXIFData.mGPSData.mAltitudeRef = 1; } else { mEXIFData.mGPSData.mAltitudeRef = 0; } mEXIFData.mGPSData.mAltitudeValid = true; } else { mEXIFData.mGPSData.mAltitudeValid= false; } if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL ) { long gpsTimestamp = strtol(valstr, NULL, 10); struct tm *timeinfo = gmtime( ( time_t * ) & (gpsTimestamp) ); if ( NULL != timeinfo ) { mEXIFData.mGPSData.mTimeStampHour = timeinfo->tm_hour; mEXIFData.mGPSData.mTimeStampMin = timeinfo->tm_min; mEXIFData.mGPSData.mTimeStampSec = timeinfo->tm_sec; mEXIFData.mGPSData.mTimeStampValid = true; } else { mEXIFData.mGPSData.mTimeStampValid = false; } } else { mEXIFData.mGPSData.mTimeStampValid = false; } if( ( valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP) ) != NULL ) { long gpsDatestamp = strtol(valstr, NULL, 10); struct tm *timeinfo = gmtime( ( time_t * ) & (gpsDatestamp) ); if ( NULL != timeinfo ) { strftime(mEXIFData.mGPSData.mDatestamp, GPS_DATESTAMP_SIZE, "%Y:%m:%d", timeinfo); mEXIFData.mGPSData.mDatestampValid = true; } else { mEXIFData.mGPSData.mDatestampValid = false; } } else { mEXIFData.mGPSData.mDatestampValid = false; } if( ( valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD) ) != NULL ) { strncpy(mEXIFData.mGPSData.mProcMethod, valstr, GPS_PROCESSING_SIZE-1); mEXIFData.mGPSData.mProcMethodValid = true; } else { mEXIFData.mGPSData.mProcMethodValid = false; } if( ( valstr = params.get(ActCameraParameters::KEY_GPS_MAPDATUM) ) != NULL ) { strncpy(mEXIFData.mGPSData.mMapDatum, valstr, GPS_MAPDATUM_SIZE-1); mEXIFData.mGPSData.mMapDatumValid = true; } else { mEXIFData.mGPSData.mMapDatumValid = false; } if( ( valstr = params.get(ActCameraParameters::KEY_GPS_VERSION) ) != NULL ) { strncpy(mEXIFData.mGPSData.mVersionId, valstr, GPS_VERSION_SIZE-1); mEXIFData.mGPSData.mVersionIdValid = true; } else { mEXIFData.mGPSData.mVersionIdValid = false; } if( ( valstr = params.get(ActCameraParameters::KEY_EXIF_MODEL ) ) != NULL ) { CAMHAL_LOGVB("EXIF Model: %s", valstr); mEXIFData.mModelValid= true; } else { mEXIFData.mModelValid= false; } if( ( valstr = params.get(ActCameraParameters::KEY_EXIF_MAKE ) ) != NULL ) { CAMHAL_LOGVB("EXIF Make: %s", valstr); mEXIFData.mMakeValid = true; } else { mEXIFData.mMakeValid= false; } LOG_FUNCTION_NAME_EXIT; return ret; }