From e8e2142059ba9a34d54975d32022fa9596772849 Mon Sep 17 00:00:00 2001 From: jp7g21 <jp7g21@soton.ac.uk> Date: Sat, 13 Nov 2021 17:14:31 +0000 Subject: [PATCH] Wrote duck cli --- duck/Makefile | 12 ++++++++ duck/duck.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ duck/udev-rule | 1 + 3 files changed, 89 insertions(+) create mode 100644 duck/Makefile create mode 100644 duck/duck.c create mode 100644 duck/udev-rule diff --git a/duck/Makefile b/duck/Makefile new file mode 100644 index 0000000..3a80c70 --- /dev/null +++ b/duck/Makefile @@ -0,0 +1,12 @@ +duck: duck.c ../libduck/libduck.so + cc duck.c -o duck -L ../libduck -l duck + +.PHONY: clean install + +clean: + rm -f duck + +install: duck + install -T -D -m 555 duck /usr/lib/duck/duck && \ + install -T udev-rule /etc/udev/rules.d/80-duck.rules && \ + udevadm control -R diff --git a/duck/duck.c b/duck/duck.c new file mode 100644 index 0000000..cf2c4d3 --- /dev/null +++ b/duck/duck.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <err.h> +#include <stdlib.h> +#include "../libduck/libduck.h" + +#define SHAKE_ANGLE 45 +#define SHAKE_T 300 + +void shake(int motor, int number) +{ + for (int j=0; j < number; j++) { + duck_set_position(motor, -SHAKE_ANGLE); + duck_delay(SHAKE_T); + duck_set_position(motor, SHAKE_ANGLE); + duck_delay(2 * SHAKE_T); + duck_set_position(motor, 0); + duck_delay(SHAKE_T); + } +} + +int main(int argc, char **argv) +{ + int option; + const char *fname = DEFAULT_DUCK_FNAME; + char buf[100]; + + while ((option=getopt(argc, argv, "t:")) != -1) { + switch (option) { + case 't': + strncpy(buf, optarg, 100); + fname = buf; + break; + default: + printf("Usage: duck [-t TTYNAME] command\n"); + exit(EXIT_FAILURE); + break; + } + } + + open_duck(fname); + configure_duck(); + + for (int i=optind; argv[i]; i++) { + if (strcmp(argv[i], "set") == 0) { + if (argv[i+1] && argv[i+2]) { + int motor = atoi(argv[i+1]); + int angle = atoi(argv[i+2]); + duck_set_position(motor, angle); + i += 2; + } + } else if (strcmp(argv[i], "vel") == 0) { + if (argv[i+1] && argv[i+2]) { + int motor = atoi(argv[i+1]); + int deg_per_sec = atoi(argv[i+2]); + duck_set_velocity(motor, deg_per_sec); + i += 2; + } + } else if (strcmp(argv[i], "headshake") == 0) { + if (argv[i+1]) { + int numshakes = atoi(argv[i+1]); + shake(MOTOR_1, numshakes); + i++; + } + } else if (strcmp(argv[i], "nod") == 0) { + if (argv[i+1]) { + int numnods = atoi(argv[i+1]); + shake(MOTOR_2, numnods); + i++; + } + } + } + return 0; +} + diff --git a/duck/udev-rule b/duck/udev-rule new file mode 100644 index 0000000..d03f158 --- /dev/null +++ b/duck/udev-rule @@ -0,0 +1 @@ +ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="666" \ No newline at end of file -- GitLab