void CompassSensor::readCalibrationData()
{
    FILE * dataFile = fdopen(dup(mCalDataFile), "r");
    CompassCal_init(dataFile);
    if (dataFile)
        fclose(dataFile);
}
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;
        }
    }
}