Warning: session_start(): open(/var/lib/php/sessions/sess_8d4ljktskti0t8g2v6bktc68pa, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cm GazelleV > DynPrintLogAndEnabled {
switchable int x1;
switchable int y1;
switchable int w = screenWidth();
switchable int h = screenHeight();
switchable double maxFPS = 10;
switchable int previewWidth = 200;
switchable double statsEvery = 5;
PersistableThrowable lastProcessingError;
transient WithTimestamp> lastScreen;
transient new Average screenShotTime;
transient new Average iiTime;
transient Timestamp loopStarted;
transient new RestartableCountdown screenShotCountdown;
transient ImageSurface imageSurface;
transient Throwable currentProcessingError;
transient BufferedImage previewImage;
transient JButton popDownButton;
transient JComponent topControls;
transient long screenShotsTaken;
transient double fps;
transient Compression longTermCompression;
Rect area() { ret rect(x1, y1, w, h); }
class Compression {
settable BufferedImage image;
settable BWIntegralImage ii;
CompressionSearch_AnyType search;
S score() {
var submission = search?.bestSubmission();
ret strOr(submission?.scoreRatio(), "-");
}
}
start-thread {
dm_registerAs_direct gazelleV();
dm_watchField enabled(r { if (enabled) dm_reload(); });
// TODO: react to event sent by OS
dm_doEvery(1.0, r {
if (dm_moduleIsPoppedOut()) adjustUIForPoppedOutWindow();
});
print("Screen bounds: " + allScreenBounds());
dm_doEvery(min(statsEvery, 10.0), statsEvery, r { if (enabled) printStats(); });
loopStarted = tsNow();
shoot();
}
void shoot enter {
if (!enabled) ret;
long targetTime = sysNow()+iround(1000/maxFPS);
long time = nanoTime();
try {
lastScreen = withTimestamp(okOrError(-> screenshot(area())));
++screenShotsTaken;
setField(fps := doubleRatio(screenShotsTaken, elapsedSeconds(loopStarted)));
screenShotTime.add(nanosToSeconds(nanoTime()-time));
if (lastScreen->isOK()) {
time = nanoTime();
//ii = BWIntegralImage(lastScreen!!);
var ii = BWIntegralImage_luminosity(lastScreen!!);
iiTime.add(nanosToSeconds(nanoTime()-time));
if (longTermCompression == null) {
longTermCompression = new Compression()
.image(lastScreen!!)
.ii(ii);
}
previewImage = scaledBufferedImageFromBWIntegralImage(ii, previewWidth);
imageSurface?.setImage(previewImage);
}
currentProcessingError = null;
} catch print e {
setField(lastProcessingError := currentProcessingError = e);
sleepSeconds(60); // errors in processing are no good
}
screenShotCountdown.setTargetTime(targetTime, r shoot);
}
void printStats() { print(stats()); }
S stats() {
var screen = lastScreen?!;
ret formatColonProperties_noNulls(
"Monitored area", area(),
"Error", screen?.getError(),
"Last screenshot taken", lastScreen?.timeStamp(),
"Average time to take a screenshot", screenShotTime,
"Average time to make integral image", iiTime,
"Capacity left in first core", percentRatioStrOneDigit(freeInCore()),
"Total CPU used", percentRatioStrOneDigit((1-freeInCore())/numberOfCores()),
);
}
double freeInCore() {
ret ratio(toSeconds(screenShotCountdown.totalSleepTime),
elapsedSeconds(loopStarted));
}
visual
hsplit(northAndCenterWithMargin(
topControls = hgrid(
jSection("FPS", dm_calculatedCenteredLabel(() -> iround(fps))),
jSection("Compression", dm_calculatedCenteredLabel(() -> longTermCompressionScore()))
),
super /* print log */),
jscroll_center(imageSurface = doubleBufferedImageSurface_noAlpha()));
BufferedImage lastScreenImage() { ret getVar(getVar(lastScreen)); }
void adjustUIForPoppedOutWindow swing {
if (popDownButton == null) {
Window window = cast getWindow(dm_vis());
var popBackInButton = findButton(window, "Pop Back In");
var parent = getParent(popBackInButton);
print(+parent);
removeFromParent(parent); // hide controls
popDownButton = jPopDownButton_noText(
"Pop Back In", r { dm_popInModule(me()) },
jCheckBoxMenuItem("Always On Top", isAlwaysOnTop(window),
r { toggleAlwaysOnTop(window) }),
);
addControl(popDownButton);
}
}
S longTermCompressionScore() {
ret longTermCompression?.score();
}
}