/* * dessiner avec OSC et la manette de jeu */ #include #include #include #include /* for SHRT_MIN */ #include #include #include #include #include #include #include "functions/ncursefuncs.h" /* ----------------------------------------------------------------- */ #define LOCAL_PORT "9000" int verbosity = 0; unsigned long hits = 0L; int erase_button = -1; int current_char = '%'; volatile int must_erase = 0; /* ----------------------------------------------------------------- */ void error(int num, const char *msg, const char *path) { fprintf(stderr, "liblo server error %d in path %s : %s\n", num, path, msg); exit(1); } /* ----------------------------------------------------------------- */ int button_handler(const char *path, const char *types, lo_arg ** argv, int argc, void *data, void *user_data) { char ligne[80]; #if DEBUG_LEVEL > 1 printf(stderr, "%s : %s %s %d\n", __func__, path, types, argc); #endif if (verbosity) { sprintf(ligne, "%s %s %s %d\n", __func__, path, types, argc); mvaddstr(2, 2, ligne); refresh(); } if (-1 == erase_button) return 0; if ( (argv[0]->i == erase_button) && (argv[1]->i == 0) ) { must_erase = 1; } return 0; } /* ----------------------------------------------------------------- */ static int old_c = 0, old_l = 0; int xy_handler(const char *path, const char *types, lo_arg ** argv, int argc, void *data, void *user_data) { char ligne[80]; int val_x, val_y; int cur_l, cur_c; float kx, ky; if (verbosity>1) fprintf(stderr, "%s : %s %s %d\n", __func__, path, types, argc); if (must_erase) { move(1, 0); clrtobot(); must_erase = 0; } standout(); val_x = argv[0]->i; val_y = argv[1]->i; if (verbosity) { sprintf(ligne, " xy %6d %6d ", val_x, val_y); mvaddstr(0, 30, ligne); hits++; sprintf(ligne, " %7lu ", hits); mvaddstr(0, COLS-12, ligne); } standend(); /* boundary checking */ if (val_x < SHRT_MIN) val_x = SHRT_MIN; if (val_y < SHRT_MIN) val_y = SHRT_MIN; if (val_x > SHRT_MAX) val_x = SHRT_MAX; if (val_y > SHRT_MAX) val_y = SHRT_MAX; /* make values positives */ val_x += -SHRT_MIN; val_y += -SHRT_MIN; /* compute position of the new spot */ kx = (float)COLS / 65535.0; ky = (float)(LINES-1) / 65535.0; cur_c = (int)((float)val_x * kx); cur_l = 1 + (int)((float)val_y * ky); if (verbosity) { fprintf(stderr, "%7d %7d -> %7d %7d\n", val_x, val_y, cur_l, cur_c); } /* erase the old spot */ if (old_l) mvaddch(old_l, old_c, current_char); standout(); mvaddch(cur_l, cur_c, '#'); standend(); old_l = cur_l, old_c = cur_c; refresh(); return 0; } /* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */ static int help(int notused) { fprintf(stderr, "\t * osc2cursor %s\n", __DATE__" *"); puts("\t-p\tlistening UDP port ("LOCAL_PORT")"); puts("\t-v\tincrease verbosity"); puts("\t-E\terasing button number (0)"); puts("\t-C\tdrawing character (NA)"); return -1; } /* ----------------------------------------------------------------- */ int main(int argc, char *argv[]) { int foo; lo_server_thread st; char *local_port = LOCAL_PORT; int opt; char ligne[81]; /* parsing command line options */ while ((opt = getopt(argc, argv, "hp:vE:C:")) != -1) { switch (opt) { case 'h': if (help(0)) exit(1); break; case 'p': local_port = optarg; break; case 'v': verbosity++; break; case 'E': erase_button = atoi(optarg); break; case 'C': current_char = *optarg; break; default: exit(1); } } fprintf(stderr, "erase %d\n", erase_button); st = lo_server_thread_new(local_port, error); foo = initcurses(); sprintf(ligne, ":%s ", local_port); foo = draw_main_screen(ligne, 0); if (verbosity) fprintf(stderr, "dms %d\n", foo); lo_server_thread_add_method(st, "/joystick/xy", "ii", xy_handler, NULL); lo_server_thread_add_method(st, "/joystick/b", "ii", button_handler, NULL); lo_server_thread_start(st); for (;;) { if (verbosity) fprintf(stderr, "t = %ld\n", time(NULL)); sleep(100); } return 0; } /* ----------------------------------------------------------------- */