dropped in the dos stuff
[smouse] / src / dos / main.c
diff --git a/src/dos/main.c b/src/dos/main.c
new file mode 100644 (file)
index 0000000..3945cd0
--- /dev/null
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include <math.h>
+#include <conio.h>
+#include "serial.h"
+#include "device.h"
+#include "vmath.h"
+
+void init_gfx(void);
+void destroy_gfx(void);
+int handle_dev_event(device_event *ev);
+
+vec3_t pos = {0, 0, -6};
+quat_t rot = {0, 0, 0, 1};     /* that's 1 + 0i + 0j + 0k */
+
+static struct device *dev;
+
+int main(void)
+{
+       int devfd;
+
+       register_all();
+       set_port("COM1");
+
+       if(!(dev = dev_init(0))) {
+               fprintf(stderr, "failed to initialize 6dof serial device at COM1\n");
+               return 1;
+       }
+       if((devfd = dev->start()) == -1) {
+               return 1;
+       }
+
+       init_gfx();
+
+       for(;;) {
+               device_event ev;
+
+               if(kbhit() && getch() == 27) {
+                       break;
+               }
+
+               while(dev->getevent(&ev)) {
+                       handle_dev_event(&ev);
+               }
+
+               /* redisplay */
+       }
+
+       dev->stop();
+       dev_destroy();
+       destroy_gfx();
+       return 0;
+}
+
+void init_gfx(void)
+{
+}
+
+void destroy_gfx(void)
+{
+}
+
+#define TX(ev) ((ev)->motion.motion[0])
+#define TY(ev) ((ev)->motion.motion[1])
+#define TZ(ev) ((ev)->motion.motion[2])
+#define RX(ev) ((ev)->motion.motion[3])
+#define RY(ev) ((ev)->motion.motion[4])
+#define RZ(ev) ((ev)->motion.motion[5])
+
+int handle_dev_event(device_event *ev)
+{
+       switch(ev->type) {
+       case DEV_EV_MOTION:
+               printf("t: %5d %5d %5d - r: %5d %5d %5d\n", TX(ev), TY(ev), TZ(ev),
+                               RX(ev), RY(ev), RZ(ev));
+               if(RX(ev) | RY(ev) | RZ(ev)) {
+                       float axis_len = sqrt(RX(ev) * RX(ev) + RY(ev) * RY(ev) + RZ(ev) * RZ(ev));
+                       if(axis_len != 0.0) {
+                               rot = quat_rotate(rot, axis_len * 0.001, -RX(ev) / axis_len,
+                                               -RY(ev) / axis_len, -RZ(ev) / axis_len);
+                       }
+               }
+
+               pos.x += TX(ev) * 0.001;
+               pos.y += TY(ev) * 0.001;
+               pos.z += TZ(ev) * 0.001;
+               break;
+
+       case DEV_EV_BUTTON:
+               if(ev->button.pressed) {
+                       pos = v3_cons(0, 0, -6);
+                       rot = quat_cons(1, 0, 0, 0);
+               }
+               break;
+       }
+
+       return 0;
+}