Skip to content

Commit 702ff40

Browse files
committed
Fix redundant behavior in SensorsBlocks and RGB blocks
1 parent d0c0840 commit 702ff40

File tree

2 files changed

+158
-191
lines changed

2 files changed

+158
-191
lines changed

git

Whitespace-only changes.

js/blocks/SensorsBlocks.js

Lines changed: 158 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -9,227 +9,194 @@
99
// License along with this library; if not, write to the Free Software
1010
// Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
1111

12-
/*
13-
global
14-
12+
/* global
1513
_, FlowBlock, NOINPUTERRORMSG, ValueBlock, docById, toFixed2,
1614
LeftBlock, BooleanSensorBlock, NANERRORMSG, hex2rgb, searchColors,
1715
Tone, platformColor, _THIS_IS_MUSIC_BLOCKS_
18-
*/
19-
20-
/* exported setupSensorsBlocks */
16+
*/
2117

2218
function setupSensorsBlocks(activity) {
2319

24-
// Helper function to remove duplicate logic for color blocks
25-
function getColorComponent(turtle, index) {
26-
let colorString = activity.turtles.getTurtle(turtle).painter.canvasColor;
27-
if (colorString[0] === "#") colorString = hex2rgb(colorString.split("#")[1]);
28-
const obj = colorString.split("(")[1].split(",");
29-
return parseInt(Number(obj[index]) / 2.55);
30-
}
31-
32-
/**
33-
* Represents a block that prompts for keyboard input in the logo programming language.
34-
* @extends {FlowBlock}
35-
*/
36-
class InputBlock extends FlowBlock {
37-
constructor() {
38-
super("input");
39-
this.setPalette("sensors", activity);
40-
this.parameter = true;
41-
this.setHelpString([
42-
_("The Input block prompts for keyboard input."),
43-
"documentation",
44-
""
45-
]);
46-
47-
this.formBlock({
48-
name: _("input"),
49-
args: 1,
50-
argTypes: ["anyin"],
51-
defaults: [_("Input a value")]
52-
});
53-
}
54-
55-
flow(args, logo, turtle, blk) {
56-
const tur = activity.turtles.ithTurtle(turtle);
57-
tur.doWait(120);
58-
59-
docById("labelDiv").innerHTML =
60-
'<input id="textLabel" style="position: absolute; -webkit-user-select: text;-moz-user-select: text;-ms-user-select: text;" class="input" type="text" value="" />';
61-
const inputElem = docById("textLabel");
62-
const cblk = activity.blocks.blockList[blk].connections[1];
63-
if (cblk !== null) inputElem.placeholder = activity.blocks.blockList[cblk].value;
64-
65-
inputElem.style.left = activity.turtles.getTurtle(turtle).container.x + "px";
66-
inputElem.style.top = activity.turtles.getTurtle(turtle).container.y + "px";
67-
inputElem.focus();
68-
69-
docById("labelDiv").classList.add("hasKeyboard");
70-
71-
function __keyPressed(event) {
72-
if (event.keyCode === 13) {
73-
const inputElem = docById("textLabel");
74-
const value = inputElem.value;
75-
logo.inputValues[turtle] = isNaN(value) ? value : Number(value);
76-
77-
inputElem.blur();
78-
inputElem.style.display = "none";
79-
logo.clearTurtleRun(turtle);
80-
docById("labelDiv").classList.remove("hasKeyboard");
81-
}
82-
}
20+
// =================== INPUT BLOCKS ===================
21+
class InputBlock extends FlowBlock {
22+
constructor() {
23+
super("input");
24+
this.setPalette("sensors", activity);
25+
this.parameter = true;
26+
this.setHelpString([_("The Input block prompts for keyboard input."), "documentation", ""]);
27+
this.formBlock({ name: _("input"), args: 1, argTypes: ["anyin"], defaults: [_("Input a value")] });
28+
}
8329

84-
docById("textLabel").addEventListener("keypress", __keyPressed);
85-
}
30+
flow(args, logo, turtle, blk) {
31+
const tur = activity.turtles.ithTurtle(turtle);
32+
tur.doWait(120);
33+
34+
const labelDiv = docById("labelDiv");
35+
labelDiv.innerHTML = '<input id="textLabel" class="input" type="text" value="" />';
36+
const inputElem = docById("textLabel");
37+
const cblk = activity.blocks.blockList[blk].connections[1];
38+
if (cblk !== null) inputElem.placeholder = activity.blocks.blockList[cblk].value;
39+
40+
const turtleContainer = activity.turtles.getTurtle(turtle).container;
41+
inputElem.style.left = turtleContainer.x + "px";
42+
inputElem.style.top = turtleContainer.y + "px";
43+
inputElem.focus();
44+
labelDiv.classList.add("hasKeyboard");
45+
46+
function __keyPressed(event) {
47+
if (event.keyCode === 13) {
48+
const val = inputElem.value;
49+
logo.inputValues[turtle] = isNaN(val) ? val : Number(val);
50+
inputElem.blur();
51+
inputElem.style.display = "none";
52+
logo.clearTurtleRun(turtle);
53+
labelDiv.classList.remove("hasKeyboard");
54+
}
55+
}
56+
57+
inputElem.addEventListener("keypress", __keyPressed);
58+
}
59+
}
60+
61+
class InputValueBlock extends ValueBlock {
62+
constructor() {
63+
super("inputvalue", _("input value"));
64+
this.setPalette("sensors", activity);
65+
this.parameter = true;
66+
this.setHelpString([_("The Input-value block stores the input."), "documentation", null, "input"]);
8667
}
8768

88-
class InputValueBlock extends ValueBlock {
89-
constructor() {
90-
super("inputvalue", _("input value"));
91-
this.setPalette("sensors", activity);
92-
this.parameter = true;
69+
updateParameter(logo, turtle) {
70+
return turtle in logo.inputValues ? logo.inputValues[turtle] : 0;
71+
}
9372

94-
this.setHelpString([
95-
_("The Input-value block stores the input."),
96-
"documentation",
97-
null,
98-
"input"
99-
]);
100-
}
73+
arg(logo, turtle, blk) {
74+
if (turtle in logo.inputValues) return logo.inputValues[turtle];
75+
activity.errorMsg(NOINPUTERRORMSG, blk);
76+
return 0;
77+
}
78+
}
79+
80+
// =================== RGB BLOCKS ===================
81+
class GetRedBlock extends ValueBlock {
82+
constructor() {
83+
super("getred", _("red"));
84+
this.setPalette("sensors", activity);
85+
this.parameter = true;
86+
}
10187

102-
updateParameter(logo, turtle) {
103-
return turtle in logo.inputValues ? logo.inputValues[turtle] : 0;
104-
}
88+
updateParameter(logo, turtle, blk) {
89+
return toFixed2(activity.blocks.blockList[blk].value);
90+
}
10591

106-
arg(logo, turtle, blk) {
107-
if (turtle in logo.inputValues) return logo.inputValues[turtle];
108-
activity.errorMsg(NOINPUTERRORMSG, blk);
109-
return 0;
110-
}
92+
arg(logo, turtle) {
93+
let colorStr = activity.turtles.getTurtle(turtle).painter.canvasColor;
94+
if (colorStr[0] === "#") colorStr = hex2rgb(colorStr.slice(1));
95+
const r = colorStr.split("(")[1].split(",")[0];
96+
return Math.round(Number(r) / 2.55);
11197
}
98+
}
11299

113-
class PitchnessBlock extends ValueBlock {
114-
constructor() {
115-
super("pitchness", _("pitch"));
116-
this.setPalette("sensors", activity);
117-
this.parameter = true;
118-
}
100+
class GetGreenBlock extends ValueBlock {
101+
constructor() {
102+
super("getgreen", _("green"));
103+
this.setPalette("sensors", activity);
104+
this.parameter = true;
105+
}
119106

120-
updateParameter(logo, turtle, blk) {
121-
return toFixed2(activity.blocks.blockList[blk].value);
122-
}
107+
updateParameter(logo, turtle, blk) {
108+
return toFixed2(activity.blocks.blockList[blk].value);
109+
}
123110

124-
arg(logo) {
125-
if (!logo.mic) return 440;
126-
if (!logo.pitchAnalyser) {
127-
logo.pitchAnalyser = new Tone.Analyser({ type: "fft", size: logo.limit, smoothing: 0 });
128-
logo.mic.connect(logo.pitchAnalyser);
129-
}
130-
131-
const values = logo.pitchAnalyser.getValue();
132-
let max = Infinity;
133-
let idx = 0;
134-
135-
for (let i = 0; i < logo.limit; i++) {
136-
const v2 = -values[i];
137-
if (v2 < max) {
138-
max = v2;
139-
idx = i;
140-
}
141-
}
142-
143-
return idx / (logo.pitchAnalyser.sampleTime * logo.limit * 2);
144-
}
111+
arg(logo, turtle) {
112+
let colorStr = activity.turtles.getTurtle(turtle).painter.canvasColor;
113+
if (colorStr[0] === "#") colorStr = hex2rgb(colorStr.slice(1));
114+
const g = colorStr.split("(")[1].split(",")[1];
115+
return Math.round(Number(g) / 2.55);
145116
}
117+
}
146118

147-
class LoudnessBlock extends ValueBlock {
148-
constructor() {
149-
super("loudness", _("loudness"));
150-
this.setPalette("sensors", activity);
151-
this.parameter = true;
152-
this.beginnerBlock(!(this.lang === "ja"));
153-
this.setHelpString([
154-
_("The Loudness block returns the volume detected by the microphone."),
155-
"documentation",
156-
""
157-
]);
158-
}
119+
class GetBlueBlock extends ValueBlock {
120+
constructor() {
121+
super("getblue", _("blue"));
122+
this.setPalette("sensors", activity);
123+
this.parameter = true;
124+
}
159125

160-
updateParameter(logo, turtle, blk) {
161-
return toFixed2(activity.blocks.blockList[blk].value);
162-
}
126+
updateParameter(logo, turtle, blk) {
127+
return toFixed2(activity.blocks.blockList[blk].value);
128+
}
163129

164-
arg(logo) {
165-
if (!logo.mic) return 0;
166-
if (!logo.volumeAnalyser) {
167-
logo.volumeAnalyser = new Tone.Analyser({ type: "waveform", size: logo.limit });
168-
logo.mic.connect(logo.volumeAnalyser);
169-
}
170-
171-
const values = logo.volumeAnalyser.getValue();
172-
let sum = 0;
173-
for (let k = 0; k < logo.limit; k++) sum += values[k] * values[k];
174-
return Math.round(Math.sqrt(sum / logo.limit) * 100);
175-
}
130+
arg(logo, turtle) {
131+
let colorStr = activity.turtles.getTurtle(turtle).painter.canvasColor;
132+
if (colorStr[0] === "#") colorStr = hex2rgb(colorStr.slice(1));
133+
const b = colorStr.split("(")[1].split(",")[2];
134+
return Math.round(Number(b) / 2.55);
135+
}
136+
}
137+
138+
// =================== OTHER BLOCKS ===================
139+
class PitchnessBlock extends ValueBlock {
140+
constructor() {
141+
super("pitchness", _("pitch"));
142+
this.setPalette("sensors", activity);
143+
this.parameter = true;
176144
}
177145

178-
class GetRedBlock extends ValueBlock {
179-
constructor() {
180-
super("getred", _("red"));
181-
this.setPalette("sensors", activity);
182-
this.parameter = true;
183-
}
184-
updateParameter(logo, turtle, blk) {
185-
return toFixed2(activity.blocks.blockList[blk].value);
186-
}
187-
arg(logo, turtle) {
188-
return getColorComponent(turtle, 0);
189-
}
146+
updateParameter(logo, turtle, blk) {
147+
return toFixed2(activity.blocks.blockList[blk].value);
190148
}
191149

192-
class GetGreenBlock extends ValueBlock {
193-
constructor() {
194-
super("getgreen", _("green"));
195-
this.setPalette("sensors", activity);
196-
this.parameter = true;
197-
}
198-
updateParameter(logo, turtle, blk) {
199-
return toFixed2(activity.blocks.blockList[blk].value);
200-
}
201-
arg(logo, turtle) {
202-
return getColorComponent(turtle, 1);
203-
}
150+
arg(logo) {
151+
if (!logo.mic) return 440;
152+
if (!logo.pitchAnalyser) {
153+
logo.pitchAnalyser = new Tone.Analyser({ type: "fft", size: logo.limit, smoothing: 0 });
154+
logo.mic.connect(logo.pitchAnalyser);
155+
}
156+
157+
const values = logo.pitchAnalyser.getValue();
158+
let max = Infinity, idx = 0;
159+
for (let i = 0; i < logo.limit; i++) {
160+
const v2 = -values[i];
161+
if (v2 < max) { max = v2; idx = i; }
162+
}
163+
return idx / (logo.pitchAnalyser.sampleTime * logo.limit * 2);
204164
}
165+
}
205166

206-
class GetBlueBlock extends ValueBlock {
207-
constructor() {
208-
super("getblue", _("blue"));
209-
this.setPalette("sensors", activity);
210-
this.parameter = true;
211-
}
212-
updateParameter(logo, turtle, blk) {
213-
return toFixed2(activity.blocks.blockList[blk].value);
214-
}
215-
arg(logo, turtle) {
216-
return getColorComponent(turtle, 2);
217-
}
167+
class LoudnessBlock extends ValueBlock {
168+
constructor() {
169+
super("loudness", _("loudness"));
170+
this.setPalette("sensors", activity);
171+
this.parameter = true;
218172
}
219173

220-
// ... baaki blocks unchanged, jaise GetColorPixelBlock, ToASCIIBlock, KeyboardBlock, InputBlock, TimeBlock, PitchnessBlock, LoudnessBlock, Cursor & Mouse blocks
174+
updateParameter(logo, turtle, blk) {
175+
return toFixed2(activity.blocks.blockList[blk].value);
176+
}
221177

222-
// Setup all blocks
223-
new GetRedBlock().setup(activity);
224-
new GetGreenBlock().setup(activity);
225-
new GetBlueBlock().setup(activity);
226-
new InputValueBlock().setup(activity);
227-
new InputBlock().setup(activity);
228-
new PitchnessBlock().setup(activity);
229-
new LoudnessBlock().setup(activity);
230-
// ... baaki setup() calls
178+
arg(logo) {
179+
if (!logo.mic) return 0;
180+
if (!logo.volumeAnalyser) {
181+
logo.volumeAnalyser = new Tone.Analyser({ type: "waveform", size: logo.limit });
182+
logo.mic.connect(logo.volumeAnalyser);
183+
}
184+
const values = logo.volumeAnalyser.getValue();
185+
const rms = Math.sqrt(values.reduce((acc, v) => acc + v * v, 0) / logo.limit);
186+
return Math.round(rms * 100);
187+
}
188+
}
189+
190+
// =================== REGISTER BLOCKS ===================
191+
new GetRedBlock().setup(activity);
192+
new GetGreenBlock().setup(activity);
193+
new GetBlueBlock().setup(activity);
194+
new InputBlock().setup(activity);
195+
new InputValueBlock().setup(activity);
196+
new PitchnessBlock().setup(activity);
197+
new LoudnessBlock().setup(activity);
231198
}
232199

233200
if (typeof module !== "undefined" && module.exports) {
234-
module.exports = { setupSensorsBlocks };
201+
module.exports = { setupSensorsBlocks };
235202
}

0 commit comments

Comments
 (0)