<snapdata remixID="10668181"><project name="MachineLearningVideoFinchBrowser" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="true" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts><script x="152" y="13"><block s="receiveGo"></block><custom-block s="BirdBrain Setup"></custom-block></script></scripts><sprites><sprite name="Sprite" idx="1" x="0" y="2.842170943040401e-14" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="10"><costumes><list struct="atomic" id="11"></list></costumes><sounds><list struct="atomic" id="12"></list></sounds><blocks></blocks><variables></variables><scripts><script x="23.976190476190425" y="10"><block s="receiveKey"><l><option>s</option></l><comment w="90" collapsed="false">Run this when you open the project.</comment></block><block s="doSetVar"><l>URL</l><l>https://teachablemachine.withgoogle.com/models/ie1pVmXpOv/</l></block><custom-block s="Load Libraries"></custom-block><custom-block s="Load Model %txt"><block var="URL"/></custom-block></script><script x="23.26190476190473" y="116.02380952380943"><block s="receiveKey"><l><option>space</option></l></block><custom-block s="Predict"><comment w="178" collapsed="false">When you run this the first time, it will take a minute to start predicting. Press x to stop predicting. </comment></custom-block></script><script x="27.571428571428555" y="268.5476190476188"><block s="receiveKey"><l><option>space</option></l></block><block s="doUntil"><block s="reportKeyPressed"><l><option>x</option></l></block><script><block s="doIf"><block s="reportGreaterThan"><block s="reportListItem"><l>1</l><block var="Prediction"/></block><l>.9</l></block><script><custom-block s="Finch Move %txt %n cm at %n %"><l>Forward</l><l>10</l><l>50</l></custom-block></script></block></script></block></script></scripts></sprite><watcher var="URL" style="normal" x="9.999999999999886" y="10" color="243,118,29"/><watcher var="PredictionTable" style="normal" x="8.999999999999886" y="43" color="243,118,29" extX="128.5615234375001" extY="86"/><watcher var="Prediction" style="normal" x="9" y="159" color="243,118,29" extX="80" extY="70"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Load Libraries" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRepeat"><l>2</l><script><block s="doRun"><block s="reportJSFunction"><list></list><l>   let script = document.createElement("script");&#xD;   script.type = "text/javascript"; &#xD;   script.src = "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.3.1/dist/tf.min.js";  &#xD;   document.head.appendChild(script);&#xD;   let script2 = document.createElement("script");&#xD;   script2.type = "text/javascript";&#xD;   script2.src = "https://cdn.jsdelivr.net/npm/@teachablemachine/image@0.8/dist/teachablemachine-image.min.js";&#xD;   document.head.appendChild(script2);  </l></block><list></list></block><block s="doWait"><l>1</l></block></script></block></script></block-definition><block-definition s="Load Model %&apos;URL&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>URL</l></list><l>const when_loaded = (loaded_model) =&gt; {&#xD;  console.log("loading model")&#xD;  window.imageModel = loaded_model;&#xD;};&#xD;&#xD;const modelURL = URL + "model.json"; // model topology&#xD;const metadataURL = URL + "metadata.json"; // model metadata&#xD;&#xD;const recognizer = tmImage.load(modelURL, metadataURL).then(when_loaded);     </l></block><list><block var="URL"/></list></block></script></block-definition><block-definition s="Predict" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>predictionJS</l></list></block><block s="doDeclareVariables"><list><l>predictionList</l></list></block><block s="doDeclareVariables"><list><l>tempTable</l></list></block><block s="doUntil"><block s="reportKeyPressed"><l><option>x</option></l></block><script><block s="doRun"><block s="reportJSFunction"><list><l>videoCapture</l></list><l>const report_predictions = (prediction) =&gt; {&#xD;   let class_names = window.imageModel.getClassLabels();&#xD;   let names_and_scores = prediction.map((score, index) =&gt; [class_names[index], score.probability]);&#xD;   &#xD;   //console.log(class_names)&#xD;&#xD;   var predictionList = []&#xD;&#xD;   // This loop is for outer array&#xD;   for (var i = 0; i &lt; names_and_scores.length; i++) {&#xD;      if (names_and_scores[i].length &gt; 1) {&#xD;         predictionList.push([class_names[i],names_and_scores[i][1]]) &#xD;         //console.log([class_names[i], predictionList[i]])&#xD;      }&#xD;   }&#xD;&#xD;   window.prediction = predictionList&#xD;};&#xD;&#xD;const prediction = window.imageModel.predict(videoCapture.contents).then(report_predictions);   &#xD;//console.log(prediction)        </l></block><list><block s="reportVideo"><l><option>snap</option></l><l>Stage</l></block></list></block><block s="doSetVar"><l>predictionJS</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>return window.prediction</l></block><list></list></block></block><block s="doSetVar"><l>predictionList</l><block s="reportTextSplit"><block s="reportJoinWords"><list><block var="predictionJS"/></list></block><l>,</l></block></block><block s="doSetVar"><l>tempTable</l><block s="reportNewList"><list></list></block></block><block s="doFor"><l>i</l><l>1</l><block s="reportQuotient"><block s="reportListAttribute"><l><option>length</option></l><block var="predictionList"/></block><l>2</l></block><script><block s="doAddToList"><block s="reportNewList"><list><block s="reportListItem"><block s="reportDifference"><block s="reportProduct"><l>2</l><block var="i"/></block><l>1</l></block><block var="predictionList"/></block><block s="reportListItem"><block s="reportProduct"><l>2</l><block var="i"/></block><block var="predictionList"/></block></list></block><block var="tempTable"/></block></script></block><block s="doSetVar"><l>PredictionTable</l><block var="tempTable"/></block><block s="doSetVar"><l>Prediction</l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>2</l><l/></block></autolambda><list></list></block><block var="PredictionTable"/></block></block></script></block></script></block-definition><block-definition s="Finch Distance (cm)" type="reporter" category="sensing"><header></header><code></code><translations>ca:Finch Distància (cm)&#xD;de:Finch Entfernung (cm)&#xD;es:Finch Distancia (cm)&#xD;fr:Finch Distance (cm)&#xD;he:Finch מרחק (cm)&#xD;ko:Finch 거리 센서 (cm)&#xD;nl:Finch Afstand (cm)&#xD;pt:Finch Distância (cm)&#xD;zh_CN:Finch 距离 (cm)&#xD;zh_TW:Finch 距離 (cm)&#xD;</translations><inputs></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>&#xD;                          return window.birdbrain.getFinchDistance(&apos;A&apos;);&#xD;                        </l></block><list></list></block></block></script></block-definition><block-definition s="Finch %&apos;port&apos; Light" type="reporter" category="sensing"><header></header><code></code><translations>ca:Finch _ Llum&#xD;de:Finch _ Licht&#xD;es:Finch _ Luz&#xD;fr:Finch _ Lumière&#xD;he:Finch _ אור&#xD;ko:Finch _ 빛 센서&#xD;nl:Finch _ Licht&#xD;pt:Finch _ Luz&#xD;zh_CN:Finch _ 灯光&#xD;zh_TW:Finch _ 燈光&#xD;</translations><inputs><input type="%txt" readonly="true">Right<options>Left&#xD;Right</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>port</l></list><l>&#xD;                        if (window.birdbrain.getFinchLight === undefined) {&#xD;                          window.birdbrain.getFinchLight = function (port, robot) {&#xD;                            const beak = window.birdbrain.currentBeak || [0,0,0];&#xD;                            const R = beak[0]*100/255;&#xD;                            const G = beak[1]*100/255;&#xD;                            const B = beak[2]*100/255;&#xD;                            var raw = 0;&#xD;                            var correction = 0;&#xD;                            switch (port) {&#xD;                              case &apos;Right&apos;:&#xD;                                raw = window.birdbrain.sensorData[robot][3];&#xD;                                correction = 6.40473070e-03*R + 1.41015162e-02*G + 5.05547817e-02*B + 3.98301391e-04*R*G + 4.41091223e-04*R*B + 6.40756862e-04*G*B + -4.76971242e-06*R*G*B;&#xD;                                break;&#xD;                              case &apos;Left&apos;:&#xD;                                raw = window.birdbrain.sensorData[robot][2];&#xD;                                correction = 1.06871493e-02*R + 1.94526614e-02*G + 6.12409825e-02*B + 4.01343475e-04*R*G + 4.25761981e-04*R*B + 6.46091068e-04*G*B + -4.41056971e-06*R*G*B;&#xD;                                break;&#xD;                              default:&#xD;                                console.log("unknown light port " + port);&#xD;                                return 0;&#xD;                            }&#xD;&#xD;                            return Math.round(Math.max(0, Math.min(100, (raw - correction))));&#xD;                          }&#xD;                        }&#xD;&#xD;                        return window.birdbrain.getFinchLight(port, &apos;A&apos;);&#xD;                      </l></block><list><block var="port"/></list></block></block></script></block-definition><block-definition s="Finch %&apos;port&apos; Line" type="reporter" category="sensing"><header></header><code></code><translations>ca:Finch _ Línia&#xD;de:Finch _ Linie&#xD;es:Finch _ Línea&#xD;fr:Finch _ Ligne&#xD;he:Finch _ קו&#xD;ko:Finch _ 선&#xD;nl:Finch _ Lijn&#xD;pt:Finch _ Linha&#xD;zh_CN:Finch _ 线&#xD;zh_TW:Finch _ 線&#xD;</translations><inputs><input type="%txt" readonly="true">Right<options>Left&#xD;Right</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>port</l></list><l>&#xD;                          if (window.birdbrain.getFinchLine === undefined) {&#xD;                            window.birdbrain.getFinchLine = function (port, robot) {&#xD;                              var rawVal = 0;&#xD;                              switch (port) {&#xD;                                case &apos;Right&apos;:&#xD;                                  rawVal = window.birdbrain.sensorData[robot][5];&#xD;                                  break;&#xD;                                case &apos;Left&apos;:&#xD;                                  rawVal = window.birdbrain.sensorData[robot][4];&#xD;                                  //first bit is for position control&#xD;                                  rawVal = (0x7F &amp; rawVal)&#xD;                                  break;&#xD;                                default:&#xD;                                  console.log("unknown line port " + port);&#xD;                              }&#xD;                              var returnVal = 100 - ((rawVal - 6) * 100/121);&#xD;                              return Math.min(100, Math.max(0, Math.round(returnVal)));&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.getFinchLine(port, &apos;A&apos;);&#xD;                        </l></block><list><block var="port"/></list></block></block></script></block-definition><block-definition s="Finch %&apos;port&apos; Encoder (rotations)" type="reporter" category="sensing"><header></header><code></code><translations>ca:Finch Recompte de voltes _&#xD;de:Finch _ Kodierer&#xD;es:Finch Recuento de vueltas _&#xD;fr:Finch _ Encodeur&#xD;he:Finch _ קודאי&#xD;ko:Finch _ 인코더&#xD;nl:Finch _ Encoder&#xD;pt:Finch _ Código&#xD;zh_CN:Finch _ 编码器&#xD;zh_TW:Finch _ 編碼器&#xD;</translations><inputs><input type="%txt" readonly="true">Right<options>Left&#xD;Right</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>port</l></list><l>&#xD;                        if (window.birdbrain.getFinchEncoder === undefined) {&#xD;                          window.birdbrain.getFinchEncoder = function (port, robot) {&#xD;                            let TICKS_PER_ROTATION = 792&#xD;                            var msb = 0;&#xD;                            var ssb = 0;&#xD;                            var lsb = 0;&#xD;                            switch (port) {&#xD;                              case &apos;Right&apos;:&#xD;                                msb = window.birdbrain.sensorData[robot][10];&#xD;                                ssb = window.birdbrain.sensorData[robot][11];&#xD;                                lsb = window.birdbrain.sensorData[robot][12];&#xD;                                break;&#xD;                              case &apos;Left&apos;:&#xD;                                msb = window.birdbrain.sensorData[robot][7];&#xD;                                ssb = window.birdbrain.sensorData[robot][8];&#xD;                                lsb = window.birdbrain.sensorData[robot][9];&#xD;                                break;&#xD;                              default:&#xD;                                console.log("unknown encoder port " + port);&#xD;                            }&#xD;                            var encoder = msb &lt;&lt; 16 | ssb &lt;&lt; 8 | lsb&#xD;                            if (encoder &gt;= 0x800000) {&#xD;                              encoder = encoder | 0xFF000000;&#xD;                            }&#xD;                            return Math.round( encoder * 10 / TICKS_PER_ROTATION ) / 10&#xD;                          }&#xD;                        }&#xD;&#xD;                        return window.birdbrain.getFinchEncoder(port, &apos;A&apos;);&#xD;                      </l></block><list><block var="port"/></list></block></block></script></block-definition><block-definition s="Finch Reset Encoders" type="command" category="sensing"><header></header><code></code><translations>ca:Finch Reinicialitza els comptadors de voltes&#xD;de:Finch Kodierer Zurücksetzen&#xD;es:Finch Reinicializar los contadores de vueltas&#xD;fr:Finch Réinitialiser les encodeurs&#xD;he:Finch לאפס קודאי&#xD;ko:Finch 인코더 리셋하기&#xD;nl:Finch Encoders Resetten&#xD;pt:Finch Redefinir Código&#xD;zh_CN:Finch 重置编码器&#xD;zh_TW:Finch 重置編碼器&#xD;</translations><inputs></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "resetEncoders"&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list></list></block><block s="doWait"><l>0.5</l><comment w="205" collapsed="false">block until reset happens</comment></block></script></block-definition><block-definition s="Finch Play Note %&apos;note&apos; for %&apos;beats&apos; beats" type="command" category="sound"><header></header><code></code><translations>ko:Finch _ 번 음을 _ 박자로 연주하기&#xD;de:Finch Spiele Note _ für _ Schläge&#xD;pt:Finch Toque Notas _ por _ Batidas&#xD;fr:Finch Jouer la note _ pour _ battement(s)&#xD;nl:Finch Speel Noot _ voor _ Beats&#xD;zh_CN:Finch 演奏 音阶 _ 于 _ 拍&#xD;zh_TW:Finch 演奏 音階 _ 於 _ 拍&#xD;ar:Finch تشغيل الموسيقى _ _&#xD;dk:Finch Spil tone _ i _ slag&#xD;he:Finch נגן תו _ במשך _ פעימות&#xD;es:Finch Emitir un sonido _ por _ pulsos&#xD;ca:Finch Toca nota _ durant _ temps&#xD;fi:Finch Soita sävel _ _ iskun ajan&#xD;sv:Finch Spela not _ _&#xD;</translations><inputs><input type="%n">60<options>§_pianoKeyboardMenu</options></input><input type="%n">0.5</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doIf"><block s="reportGreaterThan"><block var="note"/><l>135</l></block><script><block s="doSetVar"><l>note</l><l>135</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><l>32</l><block var="note"/></block><script><block s="doSetVar"><l>note</l><l>32</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="beats"/><l>16</l></block><script><block s="doSetVar"><l>beats</l><l>16</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><l>0</l><block var="beats"/></block><script><block s="doSetVar"><l>beats</l><l>0</l></block></script></block><block s="doSetVar"><l>beats</l><block s="reportRound"><block s="reportProduct"><block s="reportQuotient"><l>60000</l><block s="getTempo"></block></block><block var="beats"/></block><comment w="242" collapsed="false">BPM = tempo&#xD;60 * 1000/BPM = BPMS beats per millisecond&#xD;beats&#xD;                            = Duration in ms = BPMS * number of beats&#xD;                        </comment></block></block><block s="doSetVar"><l>note</l><block s="reportRound"><block var="note"/></block></block><block s="doRun"><block s="reportJSFunction"><list><l>note</l><l>duration</l></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "playNote",&#xD;                          note: note,&#xD;                          duration: duration&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list><block var="note"/><block var="beats"/></list></block><block s="doWait"><block s="reportQuotient"><block var="beats"/><l>1000</l></block><comment w="205" collapsed="false">block for number of seconds</comment></block></script></block-definition><block-definition s="micro:bit Button %&apos;button&apos;" type="predicate" category="sensing"><header></header><code></code><translations>ko:micro:bit 버튼 _&#xD;de:micro:bit Knopf _&#xD;pt:micro:bit Tecla _&#xD;fr:micro:bit Bouton _&#xD;nl:micro:bit Knop _&#xD;zh_CN:micro:bit 按钮 _&#xD;zh_TW:micro:bit 按鈕 _&#xD;ar:micro:bit زر _&#xD;dk:micro:bit Knap _&#xD;he:micro:bit לחצן _&#xD;es:micro:bit Pulsador _&#xD;ca:micro:bit Botó _&#xD;fi:micro:bit Painike _&#xD;sv:micro:bit Knapp _&#xD;</translations><inputs><input type="%txt" readonly="true">A<options>A&#xD;B&#xD;Logo (V2)</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>button</l></list><l>&#xD;                          if (window.birdbrain.getButton === undefined) {&#xD;                            window.birdbrain.getButton = function (button, robot) {&#xD;                              const type = window.birdbrain.robotType[robot];&#xD;                              const index = (type == window.birdbrain.robotType.FINCH) ? 16 : 7;&#xD;                              var buttonState = window.birdbrain.sensorData[robot][index] &amp; 0xF0; //Button Byte position = 7, clear LS Bits as it is for shake and calibrate&#xD;&#xD;                              switch (button) {&#xD;                                case &apos;A&apos;:&#xD;                                  return (buttonState == 0x00 || buttonState == 0x20)&#xD;                                case &apos;B&apos;:&#xD;                                  return (buttonState == 0x00 || buttonState == 0x10)&#xD;                                case &apos;Logo (V2)&apos;:&#xD;                                  if(window.birdbrain.microbitIsV2[robot]) {&#xD;                                    return (((window.birdbrain.sensorData[robot][index] &gt;&gt; 1) &amp; 0x1) == 0x0)&#xD;                                  } else {&#xD;                                    return "micro:bit V2 required";&#xD;                                  }&#xD;                                default:&#xD;                                  console.log("unknown button " + button);&#xD;                                  return false;&#xD;                              }&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.getButton(button, &apos;A&apos;);&#xD;                        </l></block><list><block var="button"/></list></block></block></script></block-definition><block-definition s="micro:bit V2 %&apos;sensor&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%txt" readonly="true">Sound<options>Sound&#xD;Temperature (°C)</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>sensor</l></list><l>&#xD;                          if (window.birdbrain.getSoundOrTemp === undefined) {&#xD;                            window.birdbrain.getSoundOrTemp = function (sensor, robot) {&#xD;                              if (window.birdbrain.microbitIsV2[robot]) {&#xD;                                const type = window.birdbrain.robotType[robot];&#xD;                                switch(sensor) {&#xD;                                  case "Sound":&#xD;                                    if (type == window.birdbrain.robotType.FINCH) {&#xD;                                      return window.birdbrain.sensorData[robot][0];&#xD;                                    } else {&#xD;                                      return window.birdbrain.sensorData[robot][14];&#xD;                                    }&#xD;                                  case "Temperature (°C)":&#xD;                                    if (type == window.birdbrain.robotType.FINCH) {&#xD;                                      return (window.birdbrain.sensorData[robot][6] &gt;&gt; 2);&#xD;                                    } else {&#xD;                                      return window.birdbrain.sensorData[robot][15];&#xD;                                    }&#xD;                                }&#xD;                              } else {&#xD;                                return "micro:bit V2 required"&#xD;                              }&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.getSoundOrTemp(sensor, &apos;A&apos;);&#xD;                        </l></block><list><block var="sensor"/></list></block></block></script></block-definition><block-definition s="Finch %&apos;dim&apos;" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%txt" readonly="true">Beak Up<options>Beak Up&#xD;Beak Down&#xD;Tilt Left&#xD;Tilt Right&#xD;Level&#xD;Upside Down&#xD;Shake</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>dim</l></list><l>&#xD;                          if (window.birdbrain.finchOrientation === undefined) {&#xD;                            window.birdbrain.finchOrientation = function (dim, robot) {&#xD;                              if (dim == "Shake") {&#xD;                                let shake = window.birdbrain.sensorData[robot][16];&#xD;                                return ((shake &amp; 0x01) &gt; 0);&#xD;                              }&#xD;                              const threshold = 7.848;&#xD;                              let acceleration = 0;&#xD;                              switch(dim) {&#xD;                                case "Tilt Left":&#xD;                                case "Tilt Right":&#xD;                                  acceleration = window.birdbrain.getFinchAcceleration(&apos;X&apos;, robot);&#xD;                                  break;&#xD;                                case "Beak Up":&#xD;                                case "Beak Down":&#xD;                                  acceleration = window.birdbrain.getFinchAcceleration(&apos;Y&apos;, robot);&#xD;                                  break;&#xD;                                case "Level":&#xD;                                case "Upside Down":&#xD;                                  acceleration = window.birdbrain.getFinchAcceleration(&apos;Z&apos;, robot);&#xD;                                  break;&#xD;                              }&#xD;                              switch(dim) {&#xD;                                case "Tilt Right":&#xD;                                case "Beak Up":&#xD;                                case "Upside Down":&#xD;                                  return (acceleration &gt; threshold);&#xD;                                case "Tilt Left":&#xD;                                case "Beak Down":&#xD;                                case "Level":&#xD;                                  return (acceleration &lt; -threshold);&#xD;                              }&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.finchOrientation(dim, &apos;A&apos;);&#xD;                        </l></block><list><block var="dim"/></list></block></block></script></block-definition><block-definition s="Finch %&apos;device&apos; %&apos;dim&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%txt" readonly="true">Accelerometer (m/s²)<options>Accelerometer (m/s²)&#xD;Magnetometer (µT)</options></input><input type="%txt" readonly="true">X<options>X&#xD;Y&#xD;Z</options></input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>device</l><l>dim</l></list><l>&#xD;                          if (window.birdbrain.getFinchAorM === undefined) {&#xD;                            window.birdbrain.getFinchAorM = function (device, dim, robot) {&#xD;                              switch(device) {&#xD;                                case "Accelerometer (m/s²)":&#xD;                                  let acc = window.birdbrain.getFinchAcceleration(dim, robot);&#xD;                                  return Math.round(acc * 10) / 10;&#xD;                                case "Magnetometer (µT)":&#xD;                                  return window.birdbrain.getFinchMagnetometer(dim, robot);&#xD;                              }&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.getFinchAorM(device, dim, &apos;A&apos;);&#xD;                        </l></block><list><block var="device"/><block var="dim"/></list></block></block></script></block-definition><block-definition s="Finch Compass" type="reporter" category="sensing"><header></header><code></code><translations>ko:Finch 나침반 센서&#xD;de:Finch Kompass&#xD;pt:Finch Bússola&#xD;fr:Finch Compas&#xD;nl:Finch Kompas&#xD;zh_CN:Finch 指南针&#xD;zh_TW:Finch 指南針&#xD;ar:Finch بوصلة&#xD;dk:Finch Kompas&#xD;he:Finch מצפן&#xD;es:Finch Brujula&#xD;ca:Finch Brúixola&#xD;fi:Finch Kompassi&#xD;sv:Finch Kompass&#xD;</translations><inputs></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>&#xD;                          if (window.birdbrain.getFinchCompass === undefined) {&#xD;                            window.birdbrain.getFinchCompass = function (robot) {&#xD;                              const ax = window.birdbrain.getFinchAcceleration(&apos;X&apos;, robot);&#xD;                              const ay = window.birdbrain.getFinchAcceleration(&apos;Y&apos;, robot);&#xD;                              const az = window.birdbrain.getFinchAcceleration(&apos;Z&apos;, robot);&#xD;                              const mx = window.birdbrain.getFinchMagnetometer(&apos;X&apos;, robot);&#xD;                              const my = window.birdbrain.getFinchMagnetometer(&apos;Y&apos;, robot);&#xD;                              const mz = window.birdbrain.getFinchMagnetometer(&apos;Z&apos;, robot);&#xD;&#xD;                              const phi = Math.atan(-ay / az)&#xD;                              const theta = Math.atan(ax / (ay * Math.sin(phi) + az * Math.cos(phi)))&#xD;&#xD;                              const xp = mx&#xD;                              const yp = my * Math.cos(phi) - mz * Math.sin(phi)&#xD;                              const zp = my * Math.sin(phi) + mz * Math.cos(phi)&#xD;&#xD;                              const xpp = xp * Math.cos(theta) + zp * Math.sin(theta)&#xD;                              const ypp = yp&#xD;&#xD;                              const angle = 180.0 + ((Math.atan2(xpp, ypp)) * (180 / Math.PI)) //convert result to degrees&#xD;&#xD;                              return ((Math.round(angle) + 180) % 360) //turn so that beak points north&#xD;                            }&#xD;                          }&#xD;&#xD;                          return window.birdbrain.getFinchCompass(&apos;A&apos;);&#xD;                        </l></block><list></list></block></block></script></block-definition><block-definition s="stop all" type="command" category="control"><header></header><code></code><translations>ko:모두 멈추기&#xD;de:stoppe alles&#xD;pt:pare todos&#xD;fr:stop tout&#xD;nl:stop alle&#xD;zh_CN:停止 全部&#xD;zh_TW:停止 全部&#xD;ar:توقف الكل&#xD;dk:stop alle&#xD;he:להפסיק הכל&#xD;es:detener todo&#xD;ca:atura tot&#xD;fi:pysäytä kaikki&#xD;sv:stop allt&#xD;</translations><inputs></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "stopAll"&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list></list></block></script></block-definition><block-definition s="Finch Move %&apos;direction&apos; %&apos;distance&apos; cm at %&apos;speed&apos; %" type="command" category="motion"><header></header><code></code><translations>ca:Finch Mou-te cap _ _ cm  a velocitat _ %&#xD;de:Finch Gehe _ _ cm mit _ %&#xD;es:Finch Mover hacia _ _ cm a velocidad _ %&#xD;fr:Finch Déplacer _ _ cm sur _ %&#xD;he:Finch זוז _ _ ס&apos;&apos;מ ב _ %&#xD;ko:Finch _ _ cm 로 움직이기 빠르기 _ %&#xD;nl:Finch Beweeg _ _ cm op _ %&#xD;pt:Finch Mova _ _ cm  a _ %&#xD;zh_CN:Finch 移动 _ _ cm 以 _ %&#xD;zh_TW:Finch 移動  _ _ 厘米在 _ %&#xD;</translations><inputs><input type="%txt" readonly="true">Forward<options>Forward&#xD;Backward</options></input><input type="%n">10</input><input type="%n">50</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doIf"><block s="reportLessThan"><block var="distance"/><l>-10000</l></block><script><block s="doSetVar"><l>distance</l><l>-10000</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="distance"/><l>10000</l></block><script><block s="doSetVar"><l>distance</l><l>10000</l></block></script></block><block s="doIf"><block s="reportLessThan"><block var="speed"/><l>0</l></block><script><block s="doSetVar"><l>speed</l><l>0</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="speed"/><l>100</l></block><script><block s="doSetVar"><l>speed</l><l>100</l></block></script></block><block s="doDeclareVariables"><list><l>wasMoving</l><l>isMoving</l><l>commandSendTime</l></list></block><block s="doSetVar"><l>isMoving</l><block s="evaluate"><block s="reportJSFunction"><list></list><l> return window.birdbrain.finchIsMoving(&apos;A&apos;); </l></block><list></list></block></block><block s="doSetVar"><l>wasMoving</l><block var="isMoving"/></block><block s="doSetVar"><l>commandSendTime</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></block><block s="doRun"><block s="reportJSFunction"><list><l>direction</l><l>distance</l><l>speed</l></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "move",&#xD;                          direction: direction,&#xD;                          distance: distance,&#xD;                          speed: speed&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list><block var="direction"/><block var="distance"/><block var="speed"/></list></block><block s="doUntil"><block s="reportAnd"><block s="reportOr"><block var="wasMoving"/><block s="reportGreaterThan"><block s="reportDate"><l><option>time in milliseconds</option></l></block><block s="reportSum"><block var="commandSendTime"/><l>1000</l><comment w="350" collapsed="true">Timeout must be longer here to accommodate slower Chromebooks</comment></block></block></block><block s="reportNot"><block var="isMoving"/></block></block><script><block s="doSetVar"><l>wasMoving</l><block var="isMoving"/></block><block s="doWait"><l>0.01</l></block><block s="doSetVar"><l>isMoving</l><block s="evaluate"><block s="reportJSFunction"><list></list><l> return window.birdbrain.finchIsMoving(&apos;A&apos;); </l></block><list></list></block></block></script></block></script></block-definition><block-definition s="Finch Turn %&apos;direction&apos; %&apos;angle&apos; ° at %&apos;speed&apos; %" type="command" category="motion"><header></header><code></code><translations>ca:Finch Gira cap a la _ _ ° a velocitat _ %&#xD;de:Finch Drehe _ _ ° mit _ %&#xD;es:Finch Girar hacia la _ _ ° a velocidad _ %&#xD;fr:Finch Tournez _ _ ° à _ %&#xD;he:Finch הסתובב _ _ מעלות ב _ %&#xD;ko:Finch _ _ ° 로 회전하기 빠르기 _ %&#xD;nl:Finch Draai _ _ ° op _ %&#xD;pt:Finch Gire _ _ ° a _ %&#xD;zh_CN:Finch 转动 _ _ ° 以 _ %&#xD;zh_TW:Finch 轉動 _ _ °在 _ %&#xD;</translations><inputs><input type="%txt" readonly="true">Right<options>Right&#xD;Left</options></input><input type="%n">90</input><input type="%n">50</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doIf"><block s="reportLessThan"><block var="angle"/><l>-360000</l></block><script><block s="doSetVar"><l>angle</l><l>-360000</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="angle"/><l>360000</l></block><script><block s="doSetVar"><l>angle</l><l>360000</l></block></script></block><block s="doIf"><block s="reportLessThan"><block var="speed"/><l>0</l></block><script><block s="doSetVar"><l>speed</l><l>0</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="speed"/><l>100</l></block><script><block s="doSetVar"><l>speed</l><l>100</l></block></script></block><block s="doDeclareVariables"><list><l>wasMoving</l><l>isMoving</l><l>commandSendTime</l></list></block><block s="doSetVar"><l>isMoving</l><block s="evaluate"><block s="reportJSFunction"><list></list><l> return window.birdbrain.finchIsMoving(&apos;A&apos;); </l></block><list></list></block></block><block s="doSetVar"><l>wasMoving</l><block var="isMoving"/></block><block s="doSetVar"><l>commandSendTime</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></block><block s="doRun"><block s="reportJSFunction"><list><l>direction</l><l>angle</l><l>speed</l></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "turn",&#xD;                          direction: direction,&#xD;                          angle: angle,&#xD;                          speed: speed&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list><block var="direction"/><block var="angle"/><block var="speed"/></list></block><block s="doUntil"><block s="reportAnd"><block s="reportOr"><block var="wasMoving"/><block s="reportGreaterThan"><block s="reportDate"><l><option>time in milliseconds</option></l></block><block s="reportSum"><block var="commandSendTime"/><l>1000</l><comment w="350" collapsed="true">Timeout must be longer here to accommodate slower Chromebooks</comment></block></block></block><block s="reportNot"><block var="isMoving"/></block></block><script><block s="doSetVar"><l>wasMoving</l><block var="isMoving"/></block><block s="doWait"><l>0.01</l></block><block s="doSetVar"><l>isMoving</l><block s="evaluate"><block s="reportJSFunction"><list></list><l> return window.birdbrain.finchIsMoving(&apos;A&apos;); </l></block><list></list></block></block></script></block></script></block-definition><block-definition s="Finch Wheels L %&apos;left&apos; % R %&apos;right&apos; %" type="command" category="motion"><header></header><code></code><translations>ca:Finch Posa les rodes a velocitat E _ % D _ %&#xD;de:Finch Räder L _ % R _ %&#xD;es:Finch Poner las ruedas a velocidad I _ % D _ %&#xD;fr:Finch Roues L _ % R _ %&#xD;he:Finch גלגלים שמאל _ % ימין _ %&#xD;ko:Finch 바퀴 왼쪽 _ % 오른쪽 _ %&#xD;nl:Finch Wielen L _ % R _ %&#xD;pt:Finch Rodas E _ % D _ %&#xD;zh_CN:Finch 左轮 _ % 右轮 _ %&#xD;zh_TW:Finch 車輪  左 _ % 右 _ %&#xD;</translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doIf"><block s="reportLessThan"><block var="left"/><l>-100</l></block><script><block s="doSetVar"><l>left</l><l>-100</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="left"/><l>100</l></block><script><block s="doSetVar"><l>left</l><l>100</l></block></script></block><block s="doIf"><block s="reportLessThan"><block var="right"/><l>-100</l></block><script><block s="doSetVar"><l>right</l><l>-100</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="right"/><l>100</l></block><script><block s="doSetVar"><l>right</l><l>100</l></block></script></block><block s="doRun"><block s="reportJSFunction"><list><l>left</l><l>right</l></list><l>&#xD;                          var thisCommand = {&#xD;                            robot: &apos;A&apos;,&#xD;                            cmd: "wheels",&#xD;                            speedL: left,&#xD;                            speedR: right&#xD;                          }&#xD;                          window.birdbrain.sendCommand(thisCommand)&#xD;                        </l></block><list><block var="left"/><block var="right"/></list></block><block s="doWait"><l>0.03</l></block></script></block-definition><block-definition s="Finch Stop" type="command" category="motion"><header></header><code></code><translations>ca:Finch Atura&#xD;de:Finch Stoppe&#xD;es:Finch Detener&#xD;fr:Finch Stop&#xD;he:Finch להפסיק&#xD;ko:Finch 멈추기&#xD;nl:Finch Stop&#xD;pt:Finch Pare&#xD;zh_CN:Finch 停止&#xD;zh_TW:Finch 停止&#xD;</translations><inputs></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list></list><l>&#xD;                        var thisCommand = {&#xD;                          robot: &apos;A&apos;,&#xD;                          cmd: "stopFinch"&#xD;                        }&#xD;                        window.birdbrain.sendCommand(thisCommand)&#xD;                      </l></block><list></list></block></script></block-definition><block-definition s="Finch Beak R %&apos;redLED&apos; % G %&apos;greenLED&apos; % B %&apos;blueLED&apos; %" type="command" category="looks"><header></header><code></code><translations>ca:Finch Encén el bec de color R _ % G _ % B _ %&#xD;de:Finch Schnabel R _ % G _ % B _ %&#xD;es:Finch Encender el pico de color R _ % V _ % A _ %&#xD;fr:Finch Bec R _ % G _ % B _ %&#xD;he:Finch מקור אדום _ % ירוק _ % כחול _ %&#xD;ko:Finch 부리 빨강 _ % 초록 _ % 파랑 _ %&#xD;nl:Finch Bek R _ % G _ % B _ %&#xD;pt:Finch Bico R _ % G _ % B _ %&#xD;zh_CN:Finch 鸟喙 R _ % G _ % B _ %&#xD;zh_TW:Finch 鳥嘴 紅 _ % 綠 _ % 藍 _ %&#xD;</translations><inputs><input type="%n">0</input><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>rednum</l><l>greennum</l><l>bluenum</l></list><l>&#xD;                          var thisCommand = {&#xD;                            robot: &apos;A&apos;,&#xD;                            cmd: "triled",&#xD;                            port: 1,&#xD;                            red: Math.floor(Math.max(Math.min(rednum*2.55, 255), 0)),&#xD;                            green: Math.floor(Math.max(Math.min(greennum*2.55, 255), 0)),&#xD;                            blue: Math.floor(Math.max(Math.min(bluenum*2.55, 255), 0))&#xD;                          }&#xD;                          window.birdbrain.currentBeak = [thisCommand.red, thisCommand.green, thisCommand.blue];&#xD;&#xD;                          window.birdbrain.sendCommand(thisCommand);&#xD;                        </l></block><list><block var="redLED"/><block var="greenLED"/><block var="blueLED"/></list></block><block s="doWait"><l>0.03</l></block></script></block-definition><block-definition s="Finch Tail %&apos;port&apos; R %&apos;redLED&apos; % G %&apos;greenLED&apos; % B %&apos;blueLED&apos; %" type="command" category="looks"><header></header><code></code><translations>ca:Finch Encén la cua de color _ R _ % G _ % B _ %&#xD;de:Finch Schwanz _ R _ % G _ % B _ %&#xD;es:Finch Encender la cola de color _ R _ % V _ % A _ %&#xD;fr:Finch Queue _ R _ % G _ % B _ %&#xD;he:Finch זנב _ אדום _ % ירוק _ % כחול _ %&#xD;ko:Finch 꼬리 _ 빨강 _ % 초록 _ % 파랑 _ %&#xD;nl:Finch Staart _ R _ % G _ % B _ %&#xD;pt:Finch Cauda _ R _ % G _ % B _ %&#xD;zh_CN:Finch 鸟尾 _ R _ % G _ % B _ %&#xD;zh_TW:Finch 尾巴 _ 紅 _ % 綠 _ % 藍 _ %&#xD;</translations><inputs><input type="%txt" readonly="true">all<options>all&#xD;1&#xD;2&#xD;3&#xD;4</options></input><input type="%n">0</input><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>port</l><l>rednum</l><l>greennum</l><l>bluenum</l></list><l>&#xD;                          var actualPort = port;&#xD;                          if (actualPort != "all") { actualPort = parseInt(port) + 1;}&#xD;&#xD;                          var thisCommand = {&#xD;                            robot: &apos;A&apos;,&#xD;                            cmd: "triled",&#xD;                            port: actualPort,&#xD;                            red: Math.floor(Math.max(Math.min(rednum*2.55, 255), 0)),&#xD;                            green: Math.floor(Math.max(Math.min(greennum*2.55, 255), 0)),&#xD;                            blue: Math.floor(Math.max(Math.min(bluenum*2.55, 255), 0))&#xD;                          }&#xD;&#xD;                          window.birdbrain.sendCommand(thisCommand);&#xD;                        </l></block><list><block var="port"/><block var="redLED"/><block var="greenLED"/><block var="blueLED"/></list></block><block s="doWait"><l>0.03</l></block></script></block-definition><block-definition s="micro:bit Print %&apos;string&apos;" type="command" category="looks"><header></header><code></code><translations>ko:micro:bit 출력 _&#xD;de:micro:bit Drucke _&#xD;pt:micro:bit Imprimir _&#xD;fr:micro:bit Imprimer _&#xD;nl:micro:bit Schrijf _&#xD;zh_CN:micro:bit 打印 _&#xD;zh_TW:micro:bit 打印 _&#xD;ar:micro:bit طباعة _&#xD;dk:micro:bit Vis _&#xD;he:micro:bit הדפס _&#xD;es:micro:bit Imprimir _&#xD;ca:micro:bit Escriu _&#xD;fi:micro:bit Näytä teksti _&#xD;sv:micro:bit Visa text _&#xD;</translations><inputs><input type="%txt">Hello</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>string</l></list><l>&#xD;                            var thisCommand = {&#xD;                              robot: &apos;A&apos;,&#xD;                              cmd: "print",&#xD;                              printString: string&#xD;                            }&#xD;&#xD;                            window.birdbrain.sendCommand(thisCommand);&#xD;                        </l></block><list><block var="string"/></list></block><block s="doWait"><block s="reportProduct"><l>.6</l><block s="reportStringSize"><block var="string"/></block></block></block></script></block-definition><block-definition s="micro:bit Display $nl %&apos;r1c1&apos; %&apos;r1c2&apos; %&apos;r1c3&apos; %&apos;r1c4&apos; %&apos;r1c5&apos; $nl %&apos;r2c1&apos; %&apos;r2c2&apos; %&apos;r2c3&apos; %&apos;r2c4&apos; %&apos;r2c5&apos; $nl %&apos;r3c1&apos; %&apos;r3c2&apos; %&apos;r3c3&apos; %&apos;r3c4&apos; %&apos;r3c5&apos; $nl %&apos;r4c1&apos; %&apos;r4c2&apos; %&apos;r4c3&apos; %&apos;r4c4&apos; %&apos;r4c5&apos; $nl %&apos;r5c1&apos; %&apos;r5c2&apos; %&apos;r5c3&apos; %&apos;r5c4&apos; %&apos;r5c5&apos;" type="command" category="looks"><header></header><code></code><translations>ko:micro:bit 보이기 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;de:micro:bit LED Anzeige _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;pt:micro:bit Visor _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;fr:micro:bit Display _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;nl:micro:bit Scherm _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;zh_CN:micro:bit 显示 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;zh_TW:micro:bit 顯示 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;ar:micro:bit عرض _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;dk:micro:bit Display _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;he:micro:bit מסך _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;es:micro:bit Monitor _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;ca:micro:bit Pantalla _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;fi:micro:bit Näytä _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;sv:micro:bit Skärm _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&#xD;</translations><inputs><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input><input type="%b">false</input></inputs><script><custom-block s="BirdBrain Setup"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>r1c1, r1c2, r1c3, r1c4, r1c5, r2c1, r2c2, r2c3, r2c4, r2c5, r3c1, r3c2, r3c3, r3c4, r3c5,&#xD;                                r4c1, r4c2, r4c3, r4c4, r4c5, r5c1, r5c2, r5c3, r5c4, r5c5&#xD;                            </l></list><l>&#xD;                            // Create url representation from inputs&#xD;                            var symbolString = r1c1 + "\/"+ r1c2 + "\/"+ r1c3 + "\/"+ r1c4 + "\/"+ r1c5 + "\/" +&#xD;                             r2c1 + "\/"+ r2c2 + "\/"+ r2c3 + "\/"+ r2c4 + "\/"+ r2c5 + "\/" +&#xD;                             r3c1 + "\/"+ r3c2 + "\/"+ r3c3 + "\/"+ r3c4 + "\/"+ r3c5 + "\/" +&#xD;                             r4c1 + "\/"+ r4c2 + "\/"+ r4c3 + "\/"+ r4c4 + "\/"+ r4c5 + "\/" +&#xD;                             r5c1 + "\/"+ r5c2 + "\/"+ r5c3 + "\/"+ r5c4 + "\/"+ r5c5 ;&#xD;&#xD;                             var thisCommand = {&#xD;                               robot: &apos;A&apos;,&#xD;                               cmd: "symbol",&#xD;                               symbolString: symbolString&#xD;                             }&#xD;&#xD;                            window.birdbrain.sendCommand(thisCommand);&#xD;                        </l></block><list><block var="r1c1"/><block var="r1c2"/><block var="r1c3"/><block var="r1c4"/><block var="r1c5"/><block var="r2c1"/><block var="r2c2"/><block var="r2c3"/><block var="r2c4"/><block var="r2c5"/><block var="r3c1"/><block var="r3c2"/><block var="r3c3"/><block var="r3c4"/><block var="r3c5"/><block var="r4c1"/><block var="r4c2"/><block var="r4c3"/><block var="r4c4"/><block var="r4c5"/><block var="r5c1"/><block var="r5c2"/><block var="r5c3"/><block var="r5c4"/><block var="r5c5"/></list></block><block s="doWait"><l>0.03</l></block></script></block-definition><block-definition s="BirdBrain Setup" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>&#xD;                      function setupBirdbrain() {&#xD;                        window.birdbrain = {};&#xD;                        window.birdbrain.sensorData = {};&#xD;                        window.birdbrain.sensorData.A = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];&#xD;                        window.birdbrain.sensorData.B = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];&#xD;                        window.birdbrain.sensorData.C = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];&#xD;                        window.birdbrain.microbitIsV2 = {};&#xD;                        window.birdbrain.microbitIsV2.A = false;&#xD;                        window.birdbrain.microbitIsV2.B = false;&#xD;                        window.birdbrain.microbitIsV2.C = false;&#xD;                        window.birdbrain.robotType = {&#xD;                          FINCH: 1,&#xD;                          HUMMINGBIRDBIT: 2,&#xD;                          MICROBIT: 3,&#xD;                          //connected robots default to type MICROBIT&#xD;                          A: 3,&#xD;                          B: 3,&#xD;                          C: 3&#xD;                        };&#xD;&#xD;                        //console.log("setting up message channel")&#xD;                        window.birdbrain.messageChannel = new MessageChannel();&#xD;                        window.birdbrain.messageChannel.port1.onmessage = function (e) {&#xD;                            //console.log("Got a message: ");&#xD;                            //console.log(e.data);&#xD;                            let robot = e.data.robot;&#xD;                            if (e.data.sensorData != null &amp;&amp; robot != null) {&#xD;                              window.birdbrain.sensorData[robot] = e.data.sensorData;&#xD;                              window.birdbrain.robotType[robot] = e.data.robotType;&#xD;                              window.birdbrain.microbitIsV2[robot] = e.data.hasV2Microbit;&#xD;                            }&#xD;                        }&#xD;                        window.parent.postMessage("hello from snap", "*", [window.birdbrain.messageChannel.port2]);&#xD;&#xD;                        window.birdbrain.sendCommand = function(command) {&#xD;                          window.parent.postMessage(command, "*");&#xD;                        }&#xD;&#xD;                        window.birdbrain.finchIsMoving = function(finch) {&#xD;                          return (window.birdbrain.sensorData[finch][4] &gt; 127);&#xD;                        }&#xD;&#xD;                        //  Converts byte range 0 - 255 to -127 - 127 represented as a 32 bit signe int&#xD;                        function byteToSignedInt8 (byte) {&#xD;                          var sign = (byte &amp; (1 &lt;&lt; 7));&#xD;                          var value = byte &amp; 0x7F;&#xD;                          if (sign) { value  = byte | 0xFFFFFF00; }&#xD;                          return value;&#xD;                        }&#xD;&#xD;                        //  Converts byte range 0 - 255 to -127 - 127 represented as a 32 bit signe int&#xD;                        function byteToSignedInt16 (msb, lsb) {&#xD;                          var sign = msb &amp; (1 &lt;&lt; 7);&#xD;                          var value = (((msb &amp; 0xFF) &lt;&lt; 8) | (lsb &amp; 0xFF));&#xD;                          if (sign) {&#xD;                            value = 0xFFFF0000 | value;  // fill in most significant bits with 1&apos;s&#xD;                          }&#xD;                          return value;&#xD;                        }&#xD;&#xD;                        window.birdbrain.getMicrobitAcceleration = function(axis, robot) {&#xD;                          const rawToMperS = 196/1280; //convert to meters per second squared&#xD;                          let sensorData = window.birdbrain.sensorData[robot];&#xD;                          let accVal = 0;&#xD;                          switch (axis) {&#xD;                            case &apos;X&apos;:&#xD;                              accVal = byteToSignedInt8(sensorData[4]);&#xD;                              break;&#xD;                            case &apos;Y&apos;:&#xD;                              accVal = byteToSignedInt8(sensorData[5]);&#xD;                              break;&#xD;                            case &apos;Z&apos;:&#xD;                              accVal = byteToSignedInt8(sensorData[6]);&#xD;                              break;&#xD;                          }&#xD;                          return (accVal * rawToMperS);&#xD;                        }&#xD;&#xD;                        window.birdbrain.getMicrobitMagnetometer = function(axis, finch) {&#xD;                          const rawToUT = 1/10; //convert to uT&#xD;                          let sensorData = window.birdbrain.sensorData[finch];&#xD;                          let msb = 0;&#xD;                          let lsb = 0;&#xD;                          switch (axis) {&#xD;                            case &apos;X&apos;:&#xD;                              msb = sensorData[8];&#xD;                              lsb = sensorData[9];&#xD;                              break;&#xD;                            case &apos;Y&apos;:&#xD;                              msb = sensorData[10];&#xD;                              lsb = sensorData[11];&#xD;                              break;&#xD;                            case &apos;Z&apos;:&#xD;                              msb = sensorData[12];&#xD;                              lsb = sensorData[13];&#xD;                              break;&#xD;                          }&#xD;                          let magVal = byteToSignedInt16(msb, lsb);&#xD;                          return Math.round(magVal * rawToUT);&#xD;                        }&#xD;&#xD;                        window.birdbrain.getFinchAcceleration = function(axis, finch) {&#xD;                          let sensorData = window.birdbrain.sensorData[finch];&#xD;                          let accVal = 0;&#xD;                          switch (axis) {&#xD;                            case &apos;X&apos;:&#xD;                              accVal = byteToSignedInt8(sensorData[13]);&#xD;                              break;&#xD;                            case &apos;Y&apos;:&#xD;                            case &apos;Z&apos;:&#xD;                              const rawY = byteToSignedInt8(sensorData[14]);&#xD;                              const rawZ = byteToSignedInt8(sensorData[15]);&#xD;                              const rad = 40 * Math.PI / 180; //40° in radians&#xD;&#xD;                              switch(axis) {&#xD;                                case &apos;Y&apos;:&#xD;                                  accVal = (rawY*Math.cos(rad) - rawZ*Math.sin(rad));&#xD;                                  break;&#xD;                                case &apos;Z&apos;:&#xD;                                  accVal = (rawY*Math.sin(rad) + rawZ*Math.cos(rad));&#xD;                                  break;&#xD;                              }&#xD;                            }&#xD;                            return (accVal * 196/1280);&#xD;                        }&#xD;&#xD;                        window.birdbrain.getFinchMagnetometer = function(axis, finch) {&#xD;                          let sensorData = window.birdbrain.sensorData[finch];&#xD;                          switch (axis) {&#xD;                            case &apos;X&apos;:&#xD;                              return byteToSignedInt8(sensorData[17]);&#xD;                            case &apos;Y&apos;:&#xD;                            case &apos;Z&apos;:&#xD;                              const rawY = byteToSignedInt8(sensorData[18]);&#xD;                              const rawZ = byteToSignedInt8(sensorData[19]);&#xD;                              const rad = 40 * Math.PI / 180 //40° in radians&#xD;&#xD;                              let magVal = 0;&#xD;                              switch(axis) {&#xD;                                case &apos;Y&apos;:&#xD;                                  magVal = (rawY*Math.cos(rad) + rawZ*Math.sin(rad));&#xD;                                  break;&#xD;                                case &apos;Z&apos;:&#xD;                                  magVal = (rawZ*Math.cos(rad) - rawY*Math.sin(rad));&#xD;                                  break;&#xD;                              }&#xD;                              return Math.round(magVal);&#xD;                          }&#xD;                        }&#xD;&#xD;                        window.birdbrain.getFinchDistance = function (robot) {&#xD;                          if (window.birdbrain.microbitIsV2[robot]) {&#xD;                            return window.birdbrain.sensorData[robot][1];&#xD;                          } else {&#xD;                            const cmPerDistance = 0.0919;&#xD;                            const msb = window.birdbrain.sensorData[robot][0];&#xD;                            const lsb = window.birdbrain.sensorData[robot][1];&#xD;&#xD;                            const distance = msb &lt;&lt; 8 | lsb;&#xD;                            return Math.round(distance * cmPerDistance);&#xD;                          }&#xD;                        }&#xD;                      }&#xD;&#xD;                      let currentVersion = 1&#xD;                      if (window.birdbrain === undefined ||&#xD;                        window.birdbrain.version === undefined ||&#xD;                        window.birdbrain.version &lt; currentVersion) {&#xD;&#xD;                        setupBirdbrain()&#xD;                        window.birdbrain.version = currentVersion&#xD;                      } else {&#xD;                        //console.log("BirdBrain already set up");&#xD;                      }&#xD;                    </l></block><list></list></block></script></block-definition></blocks><variables><variable name="URL"><l>https://teachablemachine.withgoogle.com/models/ie1pVmXpOv/</l></variable><variable name="PredictionTable"><list id="841"><item><list struct="atomic" id="842">Mandalorian,0.0035256061237305403</list></item><item><list struct="atomic" id="843">Darth Vader,0.0009886783082038164</list></item><item><list struct="atomic" id="844">Grogu,0.0055242315866053104</list></item><item><list struct="atomic" id="845">None,0.989961564540863</list></item></list></variable><variable name="Prediction"><list struct="atomic" id="846">0.0035256061237305403,0.0009886783082038164,0.0055242315866053104,0.989961564540863</list></variable></variables></project><media name="MachineLearningVideoFinchBrowser" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>