summaryrefslogtreecommitdiff
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/calibrator_client.c82
-rw-r--r--host/client.c7
2 files changed, 88 insertions, 1 deletions
diff --git a/host/calibrator_client.c b/host/calibrator_client.c
new file mode 100644
index 0000000..3b5eee5
--- /dev/null
+++ b/host/calibrator_client.c
@@ -0,0 +1,82 @@
+/* Thinger to read 60hz cycle times and display diagnostics in a kind
+ * of stripcharty way.
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+
+// window for reporting, in cycles
+#define REPORT_FREQ 60
+// width of the bargraph
+#define WIDTH 40
+// timer cycles per second
+#define SCALE 1000000
+// length between nominal timer overflows, in microseconds
+// (1 overflow / 65'536 microseconds) * (1'000'000 microseconds)
+#define TICKSIZE (SCALE / 65536)
+
+#define NANOSECOND 1000000000
+#define MILLISECOND 1000
+
+#define NOMINAL 60
+#define MOTION 0.2
+
+int main(int *argc, char **argv)
+{
+ char line[WIDTH + 10];
+ char blankline[] = " | ";
+ double bottom = SCALE/(NOMINAL-MOTION);
+ double top = SCALE/(NOMINAL+MOTION);
+ double center = SCALE/(NOMINAL);
+ int counter;
+ int qpos = 0;
+ int fd = open("/dev/ttyACM0", O_RDONLY);
+
+ long int count_total = 0; // total overflows so far ever
+ struct timespec initial; // initial timestamp
+
+ signed long long int initial_nsec;
+ signed long int initial_msec;
+
+ strcpy(&line, &blankline);
+
+ clock_gettime(CLOCK_REALTIME, &initial);
+
+ initial_nsec = initial.tv_nsec;
+
+ initial_msec = (initial.tv_sec * 1000) + (initial.tv_nsec / (1000 * 1000));
+
+ while (1) {
+ double current, average;
+ char inlin[20];
+ int position, pos_avg, i;
+ int len;
+
+ struct timespec current_time;
+ signed long long int cur_nsec;
+ signed long int cur_msec;
+
+ long double nominal, measured;
+
+ len = read(fd, &inlin, 1);
+ if (len == 0) {
+ puts("Fucked\n");
+ continue;
+ }
+ clock_gettime(CLOCK_REALTIME, &current_time);
+ cur_nsec = (current_time.tv_nsec) + ((current_time.tv_sec - initial.tv_sec) * 1000 * 1000 * 1000);
+ cur_msec = (current_time.tv_nsec / (1000 * 1000)) + ((current_time.tv_sec) * 1000);
+
+ count_total++;
+
+ nominal = (long double) count_total / TICKSIZE;
+ //measured = (cur_nsec - initial_nsec) / NANOSECOND;
+ measured = (cur_msec - initial_msec) / MILLISECOND;
+
+ printf("% '05.8Lf - % '05.8Lf, % '05.8Lf\n", nominal, measured, measured/nominal);
+
+ }
+}
diff --git a/host/client.c b/host/client.c
index 17f3fba..3752800 100644
--- a/host/client.c
+++ b/host/client.c
@@ -7,8 +7,13 @@
#include <string.h>
#include <fcntl.h>
+// window for frequency averaging, in cycles
#define QUEUE 3600
+// window for reporting, in cycles
+#define REPORT_FREQ 60
+// width of the bargraph
#define WIDTH 40
+// timer cycles per second
#define SCALE 1000000
int main(int *argc, char **argv)
@@ -57,7 +62,7 @@ int main(int *argc, char **argv)
line[position] = '.';
}
- if (counter % 60 == 0) {
+ if (counter % REPORT_FREQ == 0) {
if (pos_avg > WIDTH) {
line[WIDTH] = '_';
} else if (pos_avg < 0) {