annotate web/calibrate/FindSafeExposure.ts @ 2441:0761cdd5bff0

fix delay on setting midi, so it doesn't grab faders when you're sliding them
author drewp@bigasterisk.com
date Fri, 31 May 2024 11:52:47 -0700
parents d5750b2aaa9e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2419
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
1 import { clamp } from "lodash";
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
2 import { sleep } from "./Light9Calibrate";
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
3 import { Light9Camera } from "./Light9Camera";
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
4 import { XyPlot } from "./XyPlot";
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
5
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
6 export class FindSafeExposure {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
7 expoMin: number;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
8 expoMax: number;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
9 expo: number;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
10 expoStep: number;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
11 sameStateSteps: number;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
12
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
13 constructor(public cam: Light9Camera, public plot: XyPlot) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
14 const fixedSteps = 5;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
15
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
16 this.plot.clear();
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
17 this.expoMin = 1;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
18 this.expoMax = 800;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
19 this.expo = this.expoMin;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
20 this.expoStep = (this.expoMax - this.expoMin) / fixedSteps;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
21 this.sameStateSteps = 0;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
22 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
23
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
24 async run() {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
25 while (true) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
26 const currentOverexposed = await this.gatherSample();
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
27 this.step(currentOverexposed);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
28 if (this.plot.data.length > 50 || Math.abs(this.expoStep) < 1) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
29 this.expo = this.expoMin;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
30 await this.gatherSample();
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
31 break;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
32 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
33 }
2420
d5750b2aaa9e minor cam edits
drewp@bigasterisk.com
parents: 2419
diff changeset
34 return this.expo;
2419
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
35 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
36
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
37 step(currentOverexposed: number) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
38 const maxAllowedOverexposedPixels = 5;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
39 const turnaroundScale = 0.6;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
40 const stepsPerSide = 3;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
41
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
42 const overexposed = currentOverexposed > maxAllowedOverexposedPixels;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
43 if (this.expoStep > 0) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
44 if (overexposed) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
45 this.sameStateSteps += 1;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
46 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
47 } else {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
48 if (!overexposed) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
49 this.sameStateSteps += 1;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
50 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
51 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
52 this.plot.setXMarklines([
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
53 { txt: "min", x: this.expoMin },
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
54 { txt: "max", x: this.expoMax },
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
55 { txt: "expo", x: this.expo },
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
56 ]);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
57 const nextExpo = clamp(this.expo + this.expoStep, this.expoMin, this.expoMax);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
58 if (this.sameStateSteps > stepsPerSide || nextExpo <= this.expoMin || nextExpo >= this.expoMax) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
59 if (this.expoStep > 0) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
60 this.expoMax = this.expo;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
61 } else {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
62 this.expoMin = this.expo;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
63 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
64 this.expoStep = this.expoStep * -1 * turnaroundScale;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
65 this.sameStateSteps = 0;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
66 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
67 this.expo = clamp(this.expo + this.expoStep, this.expoMin, this.expoMax);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
68 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
69
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
70 async gatherSample() {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
71 const settleMs = 200;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
72
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
73 await this.cam.set("exposureTime", this.expo);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
74 const settleUntil = Date.now() + settleMs;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
75 let miny = this.cam.saturatedPixelCount!;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
76 while (Date.now() < settleUntil) {
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
77 await sleep(1000 / this.cam.videoSettings.frameRate);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
78 miny = Math.min(miny, this.cam.saturatedPixelCount!);
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
79 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
80 this.plot!.insertPoint(this.expo, clamp(miny, 0, 100));
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
81 return miny;
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
82 }
e3af0ac507c8 new exposure-finder algorithm
drewp@bigasterisk.com
parents:
diff changeset
83 }