static void * calibrate_client_work(void) { long dummy; struct timeval nowtv; struct timeval warmuptv = { 0, 100 * 1000 }; /* 100ms */ struct timeval starttv; struct timeval endtv; if (client_spin) { /* Warm-up the stepper first... */ gettimeofday(&nowtv, NULL); timeradd(&nowtv, &warmuptv, &endtv); do { client_spin_loop(calibration_count, client_work_atom); gettimeofday(&nowtv, NULL); } while (timercmp(&nowtv, &endtv, < )); /* Now do the calibration */ while (TRUE) { gettimeofday(&starttv, NULL); client_spin_loop(calibration_count, client_work_atom); gettimeofday(&endtv, NULL); if (endtv.tv_sec - starttv.tv_sec > 1) { calibration_count /= 10; continue; } calibration_usec = endtv.tv_usec - starttv.tv_usec; if (endtv.tv_usec < starttv.tv_usec) { calibration_usec += 1000000; } if (calibration_usec < 1000) { calibration_count *= 10; continue; } calibration_count /= calibration_usec; break; } if (verbose > 1) printf("calibration_count=%d calibration_usec=%d\n", calibration_count, calibration_usec); } return NULL; }
static void * client_work(void) { if (client_spin) { client_spin_loop(calibration_count*client_spin, client_work_atom); } if (client_delay) { usleep(client_delay); } }