Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jul 2012 21:57:31 GMT
From:      Brooks Davis <brooks@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 215197 for review
Message-ID:  <201207312157.q6VLvVPX062613@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@215197?ac=10

Change 215197 by brooks@brooks_ecr_current on 2012/07/31 21:56:49

	Add an about box with version information.  It is accessble by
	swiping left to right.  To close swipe right to left.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#14 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#14 (text+ko) ====

@@ -29,8 +29,10 @@
  */
 
 #include <sys/types.h>
+#include <sys/endian.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
+#include <sys/sysctl.h>
 #include <sys/wait.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -476,6 +478,142 @@
 }
 
 
+static void
+show_about(void)
+{
+	int fd;
+	u_int32_t rombuf[5];
+	u_int32_t bdate, btime, svnrev_bcd, svnrev;
+	u_int32_t *image;
+	int year, month, day, hour, minute, second;
+	char kvbuf[256];
+	char *kbuilder, *kconfig, *kdate, *kversion, *kvp;
+	char *version_string;
+	size_t len;
+
+	image = malloc(sizeof(u_int32_t) * fb_width * fb_height);
+	if (image == NULL)
+		err(1, "show_about() malloc");
+	fb_save(image);
+
+	if ((fd = open("/dev/berirom", O_RDONLY)) == -1) {
+		warn("Unable to open /dev/berirom");
+		return;
+	}
+	if (read(fd, rombuf, sizeof(rombuf)) != sizeof(rombuf)) {
+		warn("Unable to read from /dev/berirom");
+		return;
+	}
+	close(fd);
+	/*
+	 * bdate is the build date in BCD MMDDYYYY
+	 *   i.e. 0x08302012 is August 30th, 2012
+	 */
+	bdate = le32toh(rombuf[0]);
+	month = ((bdate >> 28) & 0xF) * 10 + ((bdate >> 24) & 0xF);
+	day = ((bdate >> 20) & 0xF) * 10 + ((bdate >> 16) & 0xF);
+	year = ((bdate >> 12) & 0xF) * 1000 + ((bdate >> 8) & 0xF) * 100 +
+	    ((bdate >> 4) & 0xF) * 10 + (bdate & 0xF);
+
+	/*
+	 * btime is the build time in BCD 00HHMMSS
+	 *   i.e. 0x00173700 is 5:37pm
+	 */
+	btime = le32toh(rombuf[1]);
+	hour = ((btime >> 20) & 0xF) * 10 + ((btime >> 16) & 0xF);
+	minute = ((btime >> 12) & 0xF) * 10 + ((btime >> 8) & 0xF);
+	second = ((btime >> 4) & 0xF) * 10 + (btime & 0xF);
+
+	svnrev_bcd = le32toh(rombuf[2]);
+	svnrev =
+	    10000000 * ((svnrev_bcd >> 28) & 0xF) +
+	    1000000 * ((svnrev_bcd >> 24) & 0xF) +
+	    100000 * ((svnrev_bcd >> 20) & 0xF) +
+	    10000 * ((svnrev_bcd >> 16) & 0xF) +
+	    1000 * ((svnrev_bcd >> 12) & 0xF) +
+	    100 * ((svnrev_bcd >> 8) & 0xF) +
+	    10 * ((svnrev_bcd >> 4) & 0xF) +
+	    (svnrev_bcd & 0xF);
+	
+	len = sizeof(kvbuf);
+	if (sysctlbyname("kern.version", kvbuf, &len, NULL, 0) == -1) {
+		warnx("sysctlbyname(kern.version)");
+		return;
+	}
+	if (len == sizeof(kvbuf))
+	kvbuf[len - 1] = '\0';
+	kvp = kvbuf;
+	kversion = kvp;
+	while (*kvp != ':' && *kvp != '\0')
+		kvp++;
+	if (kvp == '\0') {
+		warnx("malformed kernel version string: '%s'", kversion);
+		return;
+	}
+	kvp[0] = '\0';
+	kvp++;
+	while (*kvp == ' ')
+		kvp++;
+
+	kdate = kvp;
+	while (*kvp != '\n' && *kvp != '\0')
+		kvp++;
+	if (kvp == '\0') {
+		warnx("malformed kernel version string");
+		return;
+	}
+	kvp[0] = '\0';
+	kvp++;
+	while (*kvp == ' ')
+		kvp++;
+
+	kbuilder = kvp;
+	while (*kvp != ':' && *kvp != '\0')
+		kvp++;
+	if (kvp == '\0') {
+		warnx("malformed kernel version string");
+		return;
+	}
+	kvp[0] = '\0';
+	kvp++;
+
+	if (*kvp != '/') {
+		warnx("malformed kernel version string: config is not a path");
+		return;
+	}
+	while (*kvp != '\n' && *kvp != '\0')
+		kvp++;
+	if (kvp == '\0') {
+		warnx("malformed kernel version string");
+		return;
+	}
+	kvp[0] = '\0';
+	while (*(kvp - 1) != '/')
+		kvp --;
+	kconfig = kvp;
+
+	asprintf(&version_string,
+	    "CPU Info:\n"
+	    "  Date: %4d-%02d-%02d %02d:%02d:%02d\n"
+	    "  SVN Rev: r%d\n"
+	    "\n"
+	    "Kernel Info:\n"
+	    "  Version: %s\n"
+	    "  Date: %s\n"
+	    "  Builder: %s\n"
+	    "  Config: %s",	/* No terminating new-line */
+	    year, month, day, hour, minute, second, svnrev,
+	    kversion, kdate, kbuilder, kconfig);
+	fb_dialog(FBDT_WEST2CLOSE, fb_colour(0, 0, 0),
+	    fb_colour(0, 0, 255), fb_colour(0, 0, 0),
+	    "About the CHERI Demo", version_string);
+	ts_drain();
+	free(version_string);
+
+	fb_post(image);
+}
+
+
 // display thumb nails
 int
 pictview_selector(void)
@@ -484,7 +622,10 @@
   const int tile=3;  // 3 x 3 image tiles
   int display_image;
   int j,xi,yi;
+  int x,y;
   int imgmap[tile][tile];
+  struct tsstate *ts;
+
   // map images to tile locations
   imgmap[0][0] = SEL_QUILL_IMG;
   imgmap[1][0] = -1;
@@ -523,17 +664,22 @@
   // display on
   fb_fade2on();
 
-  multitouch_release_event();
+  ts_drain();
 
   // wait for image selection
   for(display_image=-1; (display_image<0); ) {
-    multitouch_pole();
-    if(touch_count==1) { // received a touch gesture
-      int x,y;
-      x = touch_x0/(fb_width/tile);
-      y = touch_y0/(fb_height/tile);
+    ts = ts_poll();
+    printf("gesture 0x%02x, (%d, %d)\n", ts->ts_gesture, ts->ts_x1, ts->ts_x2);
+    switch (ts->ts_gesture) {
+    case TSG_CLICK:
+    case TSG2_CLICK:
+      x = ts->ts_x1 / (fb_width / tile);
+      y = ts->ts_y1 / (fb_width / tile);
       display_image = imgmap[x][y];
-      // printf("display_image = %1d\n",display_image);
+      break;
+    case TSG_EAST:
+      show_about();
+      break;
     }
   }
 
@@ -723,6 +869,7 @@
 
   // initialise framebuffers and mtl control for mmap access
   fb_init();
+  fb_load_syscons_font(NULL, "/usr/share/syscons/fonts/iso-8x16.fnt");
   fb_text_cursor(255, 255);
 
    // various test routines...



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207312157.q6VLvVPX062613>