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(); }