PERFORCE change 215197 for review
Brooks Davis
brooks at FreeBSD.org
Tue Jul 31 21:57:32 UTC 2012
http://p4web.freebsd.org/@@215197?ac=10
Change 215197 by brooks at 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...
More information about the p4-projects
mailing list