Date: Fri, 15 Jun 2012 18:32:36 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 212921 for review Message-ID: <201206151832.q5FIWaiX000693@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@212921?ac=10 Change 212921 by brooks@brooks_ecr_current on 2012/06/15 18:32:30 Enhance the spinner cdoe to support overlaying images above and below the spinner. Add images for boot and flashing. Add some limited ability to run a command and send the output to the text framebuffer. It looks like we will really need to do some tty initialization there to make it useful, but the goal is to try and who boot messages and, more importantly, show the flash process. Affected files ... .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/Makefile#2 edit .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/boot-bottom.png#1 add .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/boot-top.png#1 add .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/upgrade-bottom.png#1 add .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/upgrade-top.png#1 add .. //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/spinner.c#2 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/images/Makefile#2 (text+ko) ==== @@ -1,7 +1,9 @@ # From: @(#)Makefile 8.1 (Berkeley) 6/8/93 # $FreeBSD: src/share/misc/Makefile,v 1.27 2007/12/19 01:28:17 imp Exp $ -FILES= spinner00.png \ +FILES= boot-bottom.png \ + boot-top.png \ + spinner00.png \ spinner01.png \ spinner02.png \ spinner03.png \ @@ -12,7 +14,9 @@ spinner08.png \ spinner09.png \ spinner10.png \ - spinner11.png + spinner11.png \ + upgrade-bottom.png \ + upgrade-top.png NO_OBJ= BINDIR?= ${SHAREDIR} ==== //depot/projects/ctsrd/beribsd/src/ctsrd/spinner/spinner.c#2 (text+ko) ==== @@ -31,24 +31,106 @@ #include <sys/types.h> #include <sys/param.h> +#include <sys/wait.h> #include <de4tc.h> #include <err.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <time.h> +#include <unistd.h> #define NSPINNERS 12 +#define IMGDIR "/usr/share/images" + +const int b_height = 120; +const int t_height = 120; + +static void +usage(void) +{ + + printf("usage: spinner [-b bottom] [-t top] [cmd ...]\n"); + exit(1); +} + +static void +clean_exit(void) +{ + fb_fade2off(); +} +static void +poll_child(pid_t pid) +{ + int status; + + if (wait4(pid, &status, WNOHANG, NULL) != 0) { + if (WIFEXITED(status)) + exit(WEXITSTATUS(status)); + if (WIFSIGNALED(status)) + fprintf(stderr, "child killed with signal %d\n", + WTERMSIG(status)); + err(1, "wait4() unknown status 0x%x", status); + } +} int main(int argc, char *argv[]) { - int i; - char imgpath[MAXPATHLEN]; - u_int32_t* spinners[NSPINNERS]; + int alpha, ch, i, ofd; + pid_t pid; + char *ep; + char imgpath[MAXPATHLEN]; + u_int32_t *bottom, *top; + u_int32_t *spinners[NSPINNERS]; struct timespec stime; + alpha=127; + bottom=NULL; + top=NULL; + while ((ch = getopt(argc, argv, "a:b:t:")) != -1) { + switch (ch) { + case 'a': + alpha = strtoul(optarg, &ep, 0); + if (*ep != '\0' || alpha < 0 || alpha > 255) + err(1, "invalid alpha value %s", optarg); + break; + case 'b': + if (optarg[0] == '/') + strncpy(imgpath, optarg, sizeof(imgpath)); + else + snprintf(imgpath, sizeof(imgpath), "%s/%s", + IMGDIR, optarg); + bottom = malloc(sizeof(u_int32_t) * b_height * + fb_width); + if (bottom == NULL) + err(1, "malloc"); + read_png_file(imgpath, bottom, fb_width, b_height); + break; + case 't': + if (optarg[0] == '/') + strncpy(imgpath, optarg, sizeof(imgpath)); + else + snprintf(imgpath, sizeof(imgpath), "%s/%s", + IMGDIR, optarg); + top = malloc(sizeof(u_int32_t) * t_height * + fb_width); + if (top == NULL) + err(1, "malloc"); + read_png_file(imgpath, top, fb_width, t_height); + break; + case '?': + default: + usage(); + } + } + argc -= optind; + argv += optind; + fb_init(); + atexit(clean_exit); fb_text_cursor(255, 255); fb_fade2off(); @@ -56,24 +138,60 @@ spinners[i] = malloc(sizeof(u_int32_t) * fb_width * fb_height); if (spinners[i] == NULL) err(1, "malloc"); + memset(spinners[i], 0, sizeof(u_int32_t) * fb_width * fb_height); + } + fb_post(spinners[0]); + + if (argc > 1) { + fb_fade2text(alpha); + + pid = fork(); + if (pid < 0) + err(1, "fork"); + else if (pid == 0) { + ofd = open("/dev/ttyv0", O_WRONLY); + if (ofd < 0) + err(1, "open(/dev/ttyv0)"); + if (dup2(ofd, 1) == -1) + err(1, "dup2(ofd, 1)"); + if (dup2(ofd, 2) == -1) + err(1, "dup2(ofd, 2)"); + execvp(*argv, argv); + err(1, "execvp"); + } + } else + fb_fade2on(); + + + for (i = 0; i < NSPINNERS; i++) { + poll_child(pid); snprintf(imgpath, sizeof(imgpath), - "/usr/share/images/spinner%02d.png", i); + "%s/spinner%02d.png", IMGDIR, i); read_png_file(imgpath, spinners[i], fb_width, fb_height); + + /* + * If they exist overlay the top and bottom images on the + * spinners. + */ + if (top != NULL) + memcpy(spinners[i], top, sizeof(u_int32_t) * fb_width * + t_height); + if (bottom != NULL) + memcpy(spinners[i] + + (fb_width * (fb_height - b_height)), + bottom, sizeof(u_int32_t) * fb_width * b_height); fb_post(spinners[i]); - if (i == 0) - fb_fade2on(); } stime.tv_sec = 0; stime.tv_nsec = (1000 * 1000 * 1000) / NSPINNERS; for(;;) { - /* Exit if a signal is received */ - if (nanosleep(&stime, NULL) == -1) - break; + nanosleep(&stime, NULL); i++; if (i >= NSPINNERS) i = 0; fb_post(spinners[i]); + poll_child(pid); } fb_fade2off();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206151832.q5FIWaiX000693>