diff --git a/drake/drake b/drake/drake index 3e7bd9df8aee96da03f4a6a35042cdc7f50aaaaa..ce8bbdc43a8bf62f9cce08f994ff612670b420df 100755 --- a/drake/drake +++ b/drake/drake @@ -5,9 +5,9 @@ res=$? if [ $res != 0 ] then - /usr/lib/duck/duck headshake 3 + /usr/lib/duck/duck headshake 4 else - /usr/lib/duck/duck nod 1 + /usr/lib/duck/duck nod 2 fi exit $res diff --git a/duck/duck.c b/duck/duck.c index 1735615e0d13b187cb3854ccbe06a16e46101a5b..8c8f8565c03ee7e3a7a77467ccd5010e181bc5f4 100644 --- a/duck/duck.c +++ b/duck/duck.c @@ -27,17 +27,22 @@ void shake(int motor, int number, int min, int max, int delay) duck_delay(delay2); } +int read_mode = 0; + int main(int argc, char **argv) { int option; const char *fname = DEFAULT_DUCK_FNAME; char buf[100]; - while ((option=getopt(argc, argv, "t:d")) != -1) { + while ((option=getopt(argc, argv, "+t:dr")) != -1) { switch (option) { case 'd': duck_debug_mode = 1; break; + case 'r': + read_mode = 1; + break; case 't': strncpy(buf, optarg, 100); fname = buf; @@ -61,11 +66,12 @@ int main(int argc, char **argv) i += 2; } } else if (strcmp(argv[i], "vel") == 0) { - if (argv[i+1] && argv[i+2]) { + if (argv[i+1] && argv[i+2] && argv[i+3]) { int motor = atoi(argv[i+1]); int deg_per_sec = atoi(argv[i+2]); - duck_set_velocity(motor, deg_per_sec); - i += 2; + int ms = atoi(argv[i+3]); + duck_set_velocity(motor, deg_per_sec, ms); + i += 3; } } else if (strcmp(argv[i], "headshake") == 0) { if (argv[i+1]) { @@ -87,6 +93,11 @@ int main(int argc, char **argv) } } } + if (read_mode) { + while (1) { + char c; + if (read(duckfd, &c, 1) != 1) err( + close_duck(); return 0; } diff --git a/libduck/libduck.c b/libduck/libduck.c index 7556dfe3c259f412236c686982369867cc240cc7..8fdee78b8e87e585c6b62b46787abe7a3393b6de 100644 --- a/libduck/libduck.c +++ b/libduck/libduck.c @@ -80,11 +80,12 @@ int duck_delay(int ms) return duck_printf("d %d\n", ms); } -int duck_set_velocity(int motor, int deg_per_sec) +/* Final position will be (deg_per_sec * ms / 1000), rounded down to nearest degree */ +int duck_set_velocity(int motor, int deg_per_sec, int ms) { if (!validate_motor(motor)) return -1; if (abs(deg_per_sec) > 1000) return -1; - return duck_printf("v %d %d\n", motor, deg_per_sec); + return duck_printf("v %d %d %d\n", motor, deg_per_sec, ms); } void close_duck(void) diff --git a/libduck/libduck.h b/libduck/libduck.h index b938702fa563c4e1d0a00352417c35d25e3eed17..bea82bd7cba1534fd1c65d0736aaa2bc590d199e 100644 --- a/libduck/libduck.h +++ b/libduck/libduck.h @@ -15,7 +15,7 @@ void open_duck(const char *fname); void configure_duck(void); int duck_set_position(int motor, int angle); int duck_delay(int ms); -int duck_set_velocity(int motor, int deg_per_sec); +int duck_set_velocity(int motor, int deg_per_sec, int ms); void close_duck(void); #endif /* _LIBDUCK_H */