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