#include <sys/time.h> /* Headset button (AKA sensor) device file */ static const char *button_filename = "/sys/devices/platform/nokia-av/detect"; int read_button() { FILE *fd; char button = 0; fd = fopen(button_filename, "r"); button = fgetc(fd); // 4 is open, 2 (or 0 for hacked wiring) is closed fclose(fd); if (button == '4') return 0; else if (button == '2' || button == '0') return 1; else return -1; } int do_poll(int samples) { int presses = 0, button_status, old_button_status = 0; // WARNING: Assuming button is open at start could lead to overcounting presses by 1/frame for (int i=samples; i > 0; i--) { button_status = read_button(); if (!old_button_status && button_status > 0) presses++; // No error checking old_button_status = button_status; } return presses; int main(int argc, char **argv) { struct timeval start_poll, end_poll; float elapsed_time; while(1) { // Begin main loop. This only exits if a trigger file that was specified is deleted. gettimeofday( &start_poll, NULL ); presses = do_poll( 60 ); gettimeofday( &end_poll, NULL ); elapsed_time = (float)(end_poll.tv_usec - start_poll.tv_usec)/1000000.0; elapsed_time += end_poll.tv_sec - start_poll.tv_sec; printf("Revolutions: %i Elapsed: %0.2fs Hertz: %0.2f Approx. speed: %0.1fm/s\n", presses, elapsed_time, (float)presses/elapsed_time, presses*2.0/elapsed_time); } // End main loop return 0; }