static void drawruntime (const char *upsrunts, const char *lowbatts) { gdImagePtr im; char utiltxt[16]; int uoutpos, lowbattpos; double upsrunt; double lowbatt; int step, maxt; upsrunt = strtod(upsrunts, NULL); lowbatt = strtod(lowbatts, NULL); im = InitImage(); step = (int)(upsrunt + 4) / 5; if (step <= 0) step = 1; /* make sure we have a positive step */ DrawText(im, 0, step); maxt = step * 5; uoutpos = 300 - (int)(upsrunt * 300 ) / maxt; lowbattpos = 300 - (int)(lowbatt * 300) / maxt; gdImageFilledRectangle(im, 50, lowbattpos, 150, 300, red); gdImageFilledRectangle(im, 75, uoutpos, 125, 300, black); (void) snprintf(utiltxt, sizeof(utiltxt), "%.1f mins", upsrunt); gdImageString(im, gdFontLarge, 65, 320, (unsigned char *)utiltxt, black); TermImage(im); }
static void drawbattcap(const char *battcaps, const char *minbchgs) { gdImagePtr im; char batttxt[16]; int battpos; double battcap; int minbchgpos; double minbchg; battcap = strtod(battcaps, NULL); minbchg = strtod(minbchgs, NULL); im = InitImage(); DrawText(im, 0, 20); minbchgpos = (int)(300 - (minbchg * 3)); gdImageFilledRectangle(im, 50, minbchgpos, 150, 300, red); battpos = (int)(300 - (battcap * 3)); gdImageFilledRectangle(im, 75, battpos, 125, 300, black); (void) snprintf(batttxt, sizeof(batttxt), "%.1f %%", battcap); gdImageString(im, gdFontLarge, 70, 320, (unsigned char *)batttxt, black); TermImage(im); }
/* * Input Voltage */ static void drawutility (const char *utilitys, const char *translos, const char *transhis) { gdImagePtr im; char utiltxt[16]; int utilpos, translopos, transhipos; double utility, translo, transhi; int minv, deltav; utility = strtod(utilitys, NULL); translo = strtod(translos, NULL); transhi = strtod(transhis, NULL); im = InitImage(); if (utility > 180) { /* Europe 230V */ minv = 200; deltav = 75; } else if (utility > 110) { /* US 110-120 V */ minv = 90; deltav = 50; } else if (utility > 95) { /* Japan 100V */ minv = 80; deltav = 50; } else { /* No voltage */ minv = 0; deltav = 50; } DrawText(im, minv, deltav/5); utilpos = (int)(300 - (((utility - minv) / deltav) * 300) ); translopos = (int)(300 - (((translo - minv) / deltav) * 300) ); transhipos = (int)(300 - (((transhi - minv) / deltav) * 300) ); gdImageFilledRectangle(im, 50, 0, 150, transhipos, red); gdImageFilledRectangle(im, 50, translopos, 150, 300, red); gdImageFilledRectangle (im, 75, utilpos, 125, 300, black); (void) snprintf (utiltxt, sizeof(utiltxt), "%.1f VAC", utility); gdImageString (im, gdFontLarge, 65, 320, (unsigned char *)utiltxt, black); TermImage(im); }
/* * Output Voltage */ static void drawupsout (const char *upsouts) { gdImagePtr im; char utiltxt[16]; int uoutpos; double upsout; int minv, deltav; upsout = strtod(upsouts, NULL); im = InitImage(); if (upsout > 180) { minv = 200; deltav = 75; } else if (upsout > 110) { minv = 90; deltav = 50; } else if (upsout > 95) { minv = 80; deltav = 50; } else { minv = 0; deltav = 50; } DrawText(im, minv, deltav/5); uoutpos = (int)(300 - (((upsout - minv) / deltav) * 300) ); gdImageFilledRectangle(im, 75, uoutpos, 125, 300, black); (void) snprintf(utiltxt, sizeof(utiltxt), "%.1f VAC", upsout); gdImageString(im, gdFontLarge, 65, 320, (unsigned char *)utiltxt, black); TermImage(im); }
static void drawupsload(const char *upsloads) { gdImagePtr im; char loadtxt[16]; int loadpos; double upsload; upsload = strtod(upsloads, NULL); im = InitImage(); DrawText(im, 0, 25); gdImageFilledRectangle (im, 50, 0, 150, 60, red); gdImageFilledRectangle (im, 50, 60, 150, 300, green); loadpos = (int)(300 - ((upsload / 125) * 300)); gdImageFilledRectangle(im, 75, loadpos, 125, 300, black); (void) snprintf(loadtxt, sizeof(loadtxt), "%.1f %%", upsload); gdImageString(im, gdFontLarge, 70, 320, (unsigned char *)loadtxt, black); TermImage(im); }
int main(int argc, char **argv) { int len; char buf[1024 + 128]; #ifdef W3MIMGDISPLAY_SETUID uid_t runner_uid = getuid(); uid_t owner_uid = geteuid(); /* swap real and effective */ setreuid(owner_uid, runner_uid); #endif GetOption(argc, argv); if (!defined_debug) freopen(DEV_NULL_PATH, "w", stderr); #ifdef W3MIMGDISPLAY_SETUID /* * back real and effective * run w3mimg_open() in setuid privileges */ setreuid(runner_uid, owner_uid); #endif w_op = w3mimg_open(); #ifdef W3MIMGDISPLAY_SETUID /* make sure drop privileges now */ setreuid(runner_uid, runner_uid); #endif if (w_op == NULL) exit(1); if (defined_x) w_op->offset_x = offset_x; if (defined_y) w_op->offset_y = offset_y; w_op->max_anim = maxAnim; w_op->clear_margin = clearMargin; if (defined_test) { printf("%d %d\n", w_op->width - w_op->offset_x, w_op->height - w_op->offset_y); w_op->close(w_op); exit(0); } if (defined_size) { if (w_op->init(w_op)) { W3MImage img; int w, h; if (w_op->get_image_size(w_op, &img, defined_size, &w, &h)) printf("%d %d\n", w, h); } w_op->close(w_op); exit(0); } w_op->set_background(w_op, background); while (fgets(buf, sizeof(buf), stdin) != NULL) { if (!(isdigit(buf[0]) && buf[1] == ';')) { fputc('\n', stdout); fflush(stdout); continue; } len = strlen(buf); if (buf[len - 1] == '\n') { buf[--len] = '\0'; if (buf[len - 1] == '\r') buf[--len] = '\0'; } /* * w3mimg protocol * 0 1 2 .... * +--+--+--+--+ ...... +--+--+ * |op|; |args |\n| * +--+--+--+--+ .......+--+--+ * * args is separeted by ';' * op args * 0; params draw image * 1; params redraw image * 2; -none- terminate drawing * 3; -none- sync drawing * 4; -none- nop, sync communication * response '\n' * 5; path get size of image, * response "<width> <height>\n" * 6; params(6) clear image * 7; gif : once * 8; gif : infinite * * params * <n>;<x>;<y>;<w>;<h>;<sx>;<sy>;<sw>;<sh>;<path> * params(6) * <x>;<y>;<w>;<h> * gif * <n>;<x>;<y>;<w>;<h>;<sx>;<sy>;<sw>;<sh>;<path> //n->0 loop, >0 number of times loop * */ switch (buf[0]) { case '0': DrawImage(&buf[2], 0); break; case '1': DrawImage(&buf[2], 1); break; case '2': TermImage(); break; case '3': w_op->sync(w_op); break; case '4': fputs("\n", stdout); fflush(stdout); break; case '5': if (w_op->init(w_op)) { W3MImage img; int w, h; if (w_op->get_image_size(w_op, &img, &buf[2], &w, &h)) { fprintf(stdout, "%d %d\n", w, h); fflush(stdout); } else { fprintf(stdout, "\n"); fflush(stdout); } } else { fprintf(stdout, "\n"); fflush(stdout); } break; case '6': ClearImage(&buf[2]); break; case '7': { printf("single\n"); gif_info *gAnimate; gAnimate=malloc(sizeof(gif_info)); int i; if((i=gif_animate(&buf[2],gAnimate,1))) return i; break; } case '8': { gif_info *gAnimate; gAnimate=malloc(sizeof(gif_info)); int i; if((i=gif_animate(&buf[2],gAnimate,0))) return i; break; } } } TermImage(); w_op->close(w_op); exit(0); }
static void drawbattvolt(const char *battvolts, const char *nombattvs) { gdImagePtr im; char batttxt[16]; int battpos; int hipos, lowpos; double battvolt; double nombattv; double hip, lowp; /* hi and low red line conditions */ int minv, maxv, deltav; im = InitImage(); battvolt = strtod(battvolts, NULL); nombattv = strtod(nombattvs, NULL); /* NOTE, if you tweek minv and maxv, ensure that the difference * is evenly divisible by 5 or the scales will be wrong!!! */ switch ((int)nombattv) { case 12: minv = 3; maxv = 18; hip = 12 + 3; /* high redline -- guess */ lowp = 12 - 3; /* low redline -- guess */ break; case 24: minv = 15; maxv = 30; hip = 24 + 5; lowp = 24 - 5; break; case 48: minv = 30; maxv = 60; hip = 48 + 7; lowp = 48 - 7; break; default: minv = 0; maxv = (int)(battvolt/10 + 1) * 10; hip = battvolt + 5; lowp = battvolt - 5; break; } deltav = maxv - minv; DrawText(im, minv, (deltav)/5); /* Do proper scaling of battery voltage and redline positions */ battpos = (int)(300 - (((battvolt - minv) / deltav ) * 300)); hipos = (int)( 300 - (((hip - minv) / deltav) * 300) ); lowpos = (int)( 300 - (((lowp - minv) / deltav) * 300) ); gdImageFilledRectangle (im, 50, 0, 150, hipos, red); gdImageFilledRectangle (im, 50, lowpos, 150, 300, red); gdImageFilledRectangle (im, 75, battpos, 125, 300, black); (void) snprintf (batttxt, sizeof(batttxt), "%.1f VDC", battvolt); gdImageString(im, gdFontLarge, 70, 320, (unsigned char *)batttxt, black); TermImage(im); }