void CompassGenericCalibration(struct sensors_event_t* event, calibration_flag_t flag, const char* configFile) { static int fd = -1; if (fd < 0) fd = open(configFile, O_RDWR | O_CREAT, S_IRWXU); if (fd < 0) { ALOGE("%s line:%d unable to open %s", __FUNCTION__, __LINE__, configFile); return; } if (flag == READ_DATA) { struct flock lock; lock.l_type = F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if (fcntl(fd, F_SETLK, &lock) < 0) ALOGE("%s line:%d calibration file: %s lock fail!", __FUNCTION__, __LINE__, configFile); FILE * dataFile = fdopen(dup(fd), "r"); CompassCal_init(dataFile); if (dataFile) fclose(dataFile); } else if (flag == STORE_DATA) { struct flock lock; lock.l_type = F_UNLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if (fcntl(fd, F_SETLK, &lock) < 0) ALOGE("%s line:%d calibration file: %s unlock fail!", __FUNCTION__, __LINE__, configFile); FILE * dataFile = fdopen(dup(fd), "w"); if (dataFile) { rewind(dataFile); CompassCal_storeResult(dataFile); fclose(dataFile); } close(fd); fd = -1; } else if (flag == CALIBRATION_DATA) { long current_time_ms = (long)event->timestamp / 1000000; CompassCal_collectData(event->magnetic.x, event->magnetic.y, event->magnetic.z, current_time_ms); if (CompassCal_readyCheck()) { CompassCal_computeCal(event->magnetic.x, event->magnetic.y, event->magnetic.z, &event->magnetic.x, &event->magnetic.y, &event->magnetic.z); event->magnetic.status = SENSOR_STATUS_ACCURACY_HIGH; } else { event->magnetic.status = SENSOR_STATUS_ACCURACY_LOW; } } }
void CompassSensor::calibration(int64_t time) { long current_time_ms = time / 1000000; CompassCal_collectData(mMagneticEvent.magnetic.x, mMagneticEvent.magnetic.y, mMagneticEvent.magnetic.z, current_time_ms); if (CompassCal_readyCheck()) { CompassCal_computeCal(mMagneticEvent.magnetic.x, mMagneticEvent.magnetic.y, mMagneticEvent.magnetic.z, &mMagneticEvent.magnetic.x, &mMagneticEvent.magnetic.y, &mMagneticEvent.magnetic.z); mMagneticEvent.magnetic.status = SENSOR_STATUS_ACCURACY_HIGH; } else { mMagneticEvent.magnetic.status = SENSOR_STATUS_ACCURACY_LOW; } }