示例#1
0
void AKM8973_2_6_29::measure() {
    SUCCEED(gettimeofday(&next_update, NULL) == 0);

    /* Measuring puts readable state to 0. It is going to take
     * some time before the values are ready. Not using SET_MODE
     * because it contains mdelay(1) which makes measurements spin CPU! */
    char akm_data[5] = { 2, AKECS_REG_MS1, AKECS_MODE_MEASURE };
    SUCCEED(ioctl(fd, ECS_IOCTL_WRITE, &akm_data) == 0);

    /* Sleep for 300 us, which is the measurement interval. */ 
    struct timespec interval;
    interval.tv_sec = 0;
    interval.tv_nsec = 300000;
    SUCCEED(nanosleep(&interval, NULL) == 0);

    /* Significance and range of values can be extracted from
     * online AK 8973 manual. The kernel driver just passes the data on. */
    SUCCEED(ioctl(fd, ECS_IOCTL_GETDATA, &akm_data) == 0);
    temperature = (signed char) akm_data[1];
    mbuf[index] = Vector(127 - (unsigned char) akm_data[2], 127 - (unsigned char) akm_data[3], 127 - (unsigned char) akm_data[4]);
    index = (index + 1) & 1;
    
    m = mbuf[0].add(mbuf[1]).multiply(0.5f);
    calibrate_magnetometer_analog();
    calibrate();
}
void AK8973B::measure() {
    SUCCEED(gettimeofday(&next_update, NULL) == 0);

    /* Measuring puts readable state to 0. It is going to take
    * some time before the values are ready. Not using SET_MODE
    * because it contains mdelay(1) which makes measurements spin CPU! */
    char akm_data[5] = { 2, AKECS_REG_MS1, AKECS_MODE_MEASURE, 0, 0};

    SUCCEED(ioctl(fd, ECS_IOCTL_WRITE, &akm_data) == 0);

    /* Sleep for 300 us, which is the measurement interval. */ 
    struct timespec interval;
    interval.tv_sec = 0;
    interval.tv_nsec = 300000;
    SUCCEED(nanosleep(&interval, NULL) == 0);
    
    akm_data[0] = 4;
    akm_data[1] = AKECS_REG_TMPS;
    akm_data[2] = 0;
    akm_data[3] = 0;
    akm_data[4] = 0;  
    SUCCEED(ioctl(fd, ECS_IOCTL_READ, &akm_data) == 0);

    temperature = 110 - (unsigned char)akm_data[1]*0.625;
    
    //because every 2nd measure iz 0 0 0
    if(akm_data[2]!=0 && akm_data[3]!=0 && akm_data[4]!=0 )
    m = mbuf = mbuf.multiply(0.5f).add( Vector(
                                     127 - (unsigned char)akm_data[2],
                                     127 - (unsigned char)akm_data[3],
                                     127 - (unsigned char)akm_data[4]
                                     ).multiply(0.5f));
    else m = mbuf;
    
//    LOGD("mf x=%d y=%d z=%d",(int)mbuf.x,(int)mbuf.y,(int)mbuf.z);
    calibrate_magnetometer_analog();
    calibrate();
}