foo
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 17 Oct 2016 19:49:36 +0000 (22:49 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 17 Oct 2016 19:49:36 +0000 (22:49 +0300)
.gitignore [new file with mode: 0644]
src/dev_smag.c
src/serial.h
src/unix/serial.c
src/vmath.inl [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..a2793a8
--- /dev/null
@@ -0,0 +1,4 @@
+*.o
+*.swp
+*.d
+smouse
index 40f5046..f96ae5d 100644 (file)
@@ -76,21 +76,13 @@ static int opendev(const char *dev)
                return -1;      /* failed to get a response */
        }
 
-       while(ser_getline(fd, buf, sizeof buf)) {
-               printf("magellan open(%s): %s\n", dev, buf);
-       }
-
        ser_printf(fd, "vQ\r");
-       ser_wait(fd, 250);
 
-       while(ser_getline(fd, buf, sizeof buf)) {
-               if(buf[0] == 'v') {
-                       break;
-               }
-       }
-       printf("magellan open(%s): got version string: \"%s\"\n", dev, buf + 1);
-       if(!strstr(buf, "v Magellan")) {
-               fprintf(stderr, "unknown device\n");
+       while(ser_getline_block(fd, buf, sizeof buf) && buf[0] != 'v');
+
+       printf("DBG: \"%s\"\n", buf);
+       if(buf[0] != 'v' || !strstr(buf, "MAGELLAN")) {
+               fprintf(stderr, "unknown device: \"%s\"\n", buf + 1);
                ser_close(fd);
                return -1;
        }
index e4a8670..f920461 100644 (file)
@@ -17,5 +17,6 @@ int ser_read(int fd, char *buf, int count);
 
 void ser_printf(int fd, const char *fmt, ...);
 char *ser_getline(int fd, char *buf, int bsz);
+char *ser_getline_block(int fd, char *buf, int bsz);
 
 #endif /* SERIAL_H_ */
index fe8aeb3..cdcdb88 100644 (file)
@@ -137,7 +137,6 @@ char *ser_getline(int fd, char *buf, int bsz)
        static char linebuf[512];
        static int widx;
        int i, rd, size;
-       char *ptr;
 
        size = sizeof linebuf - widx;
        while(size && (rd = read(fd, linebuf + widx, size)) > 0) {
@@ -145,27 +144,28 @@ char *ser_getline(int fd, char *buf, int bsz)
                size -= rd;
        }
 
-       ptr = linebuf;
        for(i=0; i<widx; i++) {
-               if(*ptr == '\r' || *ptr == '\n') {
-                       *ptr++ = '\n';
-                       if(i < widx - 1 && ptr[1] == '\n') {
-                               *ptr++ = 0;
-                       }
-
-                       size = widx >= bsz ? bsz - 1 : widx;
+               if(linebuf[i] == '\r' || linebuf[i] == '\n') {
+                       size = i >= bsz ? bsz - 1 : i;
                        memcpy(buf, linebuf, size);
                        buf[size] = 0;
 
-                       memmove(linebuf, linebuf + widx, sizeof linebuf - widx);
+                       memmove(linebuf, linebuf + i + 1, sizeof linebuf - i - 1);
+                       printf("ser_getline-> \"%s\"\n", buf);
                        return buf;
-               } else {
-                       ++ptr;
                }
        }
        return 0;
 }
 
+char *ser_getline_block(int fd, char *buf, int bsz)
+{
+       if(!ser_wait(fd, -1)) {
+               return 0;
+       }
+       return ser_getline(fd, buf, bsz);
+}
+
 static int baud_id(int baud)
 {
        switch(baud) {
diff --git a/src/vmath.inl b/src/vmath.inl
new file mode 100644 (file)
index 0000000..49b5a2f
--- /dev/null
@@ -0,0 +1,68 @@
+/* vector functions */
+static inline vec3_t v3_cons(float x, float y, float z)
+{
+       vec3_t res;
+       res.x = x;
+       res.y = y;
+       res.z = z;
+       return res;
+}
+
+static inline vec3_t quat_vec(quat_t q)
+{
+       vec3_t v;
+       v.x = q.x;
+       v.y = q.y;
+       v.z = q.z;
+       return v;
+}
+
+static inline float v3_dot(vec3_t v1, vec3_t v2)
+{
+       return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
+}
+
+/* quaternion functions */
+static inline quat_t quat_cons(float s, float x, float y, float z)
+{
+       quat_t q;
+       q.x = x;
+       q.y = y;
+       q.z = z;
+       q.w = s;
+       return q;
+}
+
+static inline quat_t quat_mul(quat_t q1, quat_t q2)
+{
+       quat_t res;
+       vec3_t v1 = quat_vec(q1);
+       vec3_t v2 = quat_vec(q2);
+
+       res.w = q1.w * q2.w - v3_dot(v1, v2);
+       res.x = v2.x * q1.w + v1.x * q2.w + (v1.y * v2.z - v1.z * v2.y);
+       res.y = v2.y * q1.w + v1.y * q2.w + (v1.z * v2.x - v1.x * v2.z);
+       res.z = v2.z * q1.w + v1.z * q2.w + (v1.x * v2.y - v1.y * v2.x);
+       return res;
+}
+
+static inline void quat_to_mat(mat4_t res, quat_t q)
+{
+       m4_cons(res,    1.0 - 2.0 * q.y*q.y - 2.0 * q.z*q.z,    2.0 * q.x * q.y + 2.0 * q.w * q.z,              2.0 * q.z * q.x - 2.0 * q.w * q.y, 0,
+                                       2.0 * q.x * q.y - 2.0 * q.w * q.z,              1.0 - 2.0 * q.x*q.x - 2.0 * q.z*q.z,    2.0 * q.y * q.z + 2.0 * q.w * q.x, 0,
+                                       2.0 * q.z * q.x + 2.0 * q.w * q.y,              2.0 * q.y * q.z - 2.0 * q.w * q.x,              1.0 - 2.0 * q.x*q.x - 2.0 * q.y*q.y, 0,
+                                       0, 0, 0, 1);
+}
+
+/* matrix functions */
+static inline void m4_cons(mat4_t m,
+               float m11, float m12, float m13, float m14,
+               float m21, float m22, float m23, float m24,
+               float m31, float m32, float m33, float m34,
+               float m41, float m42, float m43, float m44)
+{
+       m[0][0] = m11; m[0][1] = m12; m[0][2] = m13; m[0][3] = m14;
+       m[1][0] = m21; m[1][1] = m22; m[1][2] = m23; m[1][3] = m24;
+       m[2][0] = m31; m[2][1] = m32; m[2][2] = m33; m[2][3] = m34;
+       m[3][0] = m41; m[3][1] = m42; m[3][2] = m43; m[3][3] = m44;
+}