ref: 35bd7fa731d33914761a4b9461967dbeb4f1aa24
parent: 0448efcbfb7854e210296721025380d287d4c3de
author: Eli Cohen <echoline@gmail.com>
date: Sun Jan 30 20:52:48 EST 2022
android #N device (cameras, accelerometer, etc...)
--- a/gui-android/cpp/devandroid.c
+++ b/gui-android/cpp/devandroid.c
@@ -24,10 +24,19 @@
Qcam = 1,
Qaccel = 2,
Qcompass = 4,
- Qnotification = 6,
+ Qnotify = 6,
};
-#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y))
+Dirtab
+androiddir[] =
+{
+ ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555,
+ "camNNNN.jpg", {Qcam}, 0, 0444,
+ "accel", {Qaccel}, 0, 0444,
+ "compass", {Qcompass}, 0, 0444,
+ "notify", {Qnotify}, 0, 0222,
+};
+
static void androidinit(void);
static void
@@ -41,14 +50,7 @@
static Chan*
androidattach(char *param)
{
- Chan *c;
-
- c = devattach('N', param);
- c->qid.path = QID(0, 0, Qdir);
- c->qid.type = QTDIR;
- c->qid.vers = 0;
-
- return c;
+ return devattach('N', param);
}
static int
@@ -57,32 +59,33 @@
Qid q;
if (s == DEVDOTDOT) {
- mkqid(&q, Qdir, 0, QTDIR);
- devdir(c, q, "#N", 0, eve, 0555, dp);
+ devdir(c, d->qid, "#N", 0, eve, 0555, dp);
return 1;
}
if (s < Ncameras) {
+ d += 1;
+ q = d->qid;
+ q.path |= (s << 16);
sprintf(up->genbuf, "cam%d.jpg", s);
- mkqid(&q, (s << 16) | Qcam, 0, QTFILE);
devdir(c, q, up->genbuf, 0, eve, 0444, dp);
return 1;
}
if (s == Ncameras) {
+ d += 2;
sprintf(up->genbuf, "accel");
- mkqid(&q, Qaccel, 0, QTFILE);
- devdir(c, q, up->genbuf, 0, eve, 0444, dp);
+ devdir(c, d->qid, up->genbuf, 0, eve, 0444, dp);
return 1;
}
if (s == (Ncameras+1)) {
+ d += 3;
sprintf(up->genbuf, "compass");
- mkqid(&q, Qcompass, 0, QTFILE);
- devdir(c, q, up->genbuf, 0, eve, 0444, dp);
+ devdir(c, d->qid, up->genbuf, 0, eve, 0444, dp);
return 1;
}
if (s == (Ncameras+2)) {
- sprintf(up->genbuf, "notification");
- mkqid(&q, Qnotification, 0, QTFILE);
- devdir(c, q, up->genbuf, 0, eve, 0222, dp);
+ d += 4;
+ sprintf(up->genbuf, "notify");
+ devdir(c, d->qid, up->genbuf, 0, eve, 0222, dp);
return 1;
}
return -1;
@@ -91,13 +94,13 @@
static Walkqid*
androidwalk(Chan *c, Chan *nc, char **name, int nname)
{
- return devwalk(c, nc, name, nname, 0, 0, androidgen);
+ return devwalk(c, nc, name, nname, androiddir, nelem(androiddir) + Ncameras - 1, androidgen);
}
static int
androidstat(Chan *c, uchar *db, int n)
{
- return devstat(c, db, n, 0, 0, androidgen);
+ return devstat(c, db, n, androiddir, nelem(androiddir) + Ncameras - 1, androidgen);
}
static Chan*
@@ -105,7 +108,7 @@
{
p9_uvlong s;
- c = devopen(c, omode, 0, 0, androidgen);
+ c = devopen(c, omode, androiddir, nelem(androiddir) + Ncameras - 1, androidgen);
if (c->qid.path & Qcam) {
s = c->qid.path >> 16;
@@ -114,7 +117,6 @@
c->mode = openmode(omode);
c->flag |= COPEN;
c->offset = 0;
- c->iounit = 8192;
return c;
}
@@ -201,7 +203,7 @@
ASensorManager_destroyEventQueue(sensorManager, queue);
return l;
case Qdir:
- return devdirread(c, a, n, 0, 0, androidgen);
+ return devdirread(c, a, n, androiddir, nelem(androiddir) + Ncameras - 1, androidgen);
}
}
@@ -212,7 +214,7 @@
char *str;
switch((ulong)c->qid.path) {
- case Qnotification:
+ case Qnotify:
str = malloc(n+1);
memcpy(str, a, n);
str[n] = '\0';
--- a/kern/devtab.c
+++ b/kern/devtab.c
@@ -19,6 +19,9 @@
extern Dev kbddevtab;
extern Dev cmddevtab;
extern Dev envdevtab;
+#ifdef __ANDROID__
+extern Dev androiddevtab;
+#endif
Dev *devtab[] = {
&rootdevtab,
@@ -36,6 +39,9 @@
&kbddevtab,
&cmddevtab,
&envdevtab,
+#ifdef __ANDROID__
+ &androiddevtab,
+#endif
0
};
--- a/main.c
+++ b/main.c
@@ -52,7 +52,9 @@
if(bind("#I", "/net", MBEFORE) < 0)
panic("bind #I: %r");
bind("#A", "/dev", MAFTER);
+#ifdef __ANDROID__
bind("#N", "/dev", MAFTER);
+#endif
if(open("/dev/cons", OREAD) != 0)
panic("open0: %r");