From beb67f238f0abb5f91a8bb0600871388a8ca0070 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Thu, 15 May 2014 21:11:16 -0400 Subject: [PATCH 01/47] Create gh-pages branch via GitHub --- images/bg_hr.png | Bin 0 -> 943 bytes images/blacktocat.png | Bin 0 -> 1428 bytes images/icon_download.png | Bin 0 -> 1162 bytes images/sprite_download.png | Bin 0 -> 16799 bytes index.html | 144 ++++++++++++ javascripts/main.js | 1 + params.json | 1 + stylesheets/pygment_trac.css | 70 ++++++ stylesheets/stylesheet.css | 423 +++++++++++++++++++++++++++++++++++ 9 files changed, 639 insertions(+) create mode 100644 images/bg_hr.png create mode 100644 images/blacktocat.png create mode 100644 images/icon_download.png create mode 100644 images/sprite_download.png create mode 100644 index.html create mode 100644 javascripts/main.js create mode 100644 params.json create mode 100644 stylesheets/pygment_trac.css create mode 100644 stylesheets/stylesheet.css diff --git a/images/bg_hr.png b/images/bg_hr.png new file mode 100644 index 0000000000000000000000000000000000000000..7973bd69888c7e10ccad1111d555ceabb7cd99b6 GIT binary patch literal 943 zcmaJ=O^ee&7!FiK7FWCot{@Ck@nrMW&tx0B-6VAbrk1u~FTzffX&bu9#AIsIdef8t z!QZfdz=K}>3m(LO;6X3qN}Y6@>cJYA%)G<%Jn!ec>9im1@7>wsIBwrMF}iHO!q%;8 zSJ@xEd~(FL18NRvkBsOXMVM>4WQc*~qcQGc<Sw3n#C49#L9aic1N*V+5T8dWhEM#E zu{o~ZNJ8XHF$F_B_5uxlefJ&$&(+}5vMt)7jwjy9GQz!OyYDQgj^e_`Lr_mtCg5X= zK;oYTv6^Ubt*f$gdM!Y(hR~@7FM}G`9iWp4gEB7`9I+yTio{FBQngxr0Ax`T1yL3x zxgb^5qO6J{*nE(Ai`<dgHCh{A%+lb5(ohwI`FzgLi#&<Of}|))sv*k-hA6~~fTE-j z#Q99Yz_Al~A@xWAQbjZ*Gpa!r>17IjxRnj!O_^B1gan0x#EWT48PK->5B2>mI;LIx zC*FSw$Nfc!g)WZCEOJ=mM)}lLsOk|$ltg_(&ax_YCWMlBLPDVT%D_gB7o_$YZ`-OB z#1sV%whRq21>W;qwN$N?OUGtQQe;JvOsQrna;+v+j8dth=*?orHHb6waX>S!yXCgT zo!oR3{E&GzaOAzfZYv@_Sf{LdyJInS>TS60&R9%yCs$y>2x(*gYIJtRrYAja$Ceq} z!N&oc_K1!3-Ft`U>`CM;quEbB4KG%!MovB*9_3!QzFhqHwrbwK|Doo-y>auDJNSP6 T=d)j*_4El@X4^PFK7I8YBT*xD literal 0 HcmV?d00001 diff --git a/images/blacktocat.png b/images/blacktocat.png new file mode 100644 index 0000000000000000000000000000000000000000..6e264fe57a2e35a2855405ac7d4102c3f6ddcdae GIT binary patch literal 1428 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA<wUD9OyvQvjKmn3P{y zVygsnDZ~r81#n~YilM;-3^4tQ!~%UoJp+)JU<!SG@hi>Eg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L<y@4SSdw29lAoUg3&ntp{F40QjQj!x=U`I>-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=eg`=5?o13Glvx}*rp{t>#shg3DvyriZv5}jZ ztD`wguS<S%X>Mv>2~2MaLa!4}y`ZF!TL84#CABECEH%ZgC_h&L>}9J=EN(GzcCm0X zaRr%YgxxI=y(w7S0@dq`Q?EYIG5Vm0MT%&c5HR(CnDAr^<iHbtY927P7Xgzs$AOa5 z3=B*ho-U3d6}QfW-_30?;IZ?o)mKhwPHT~VXqI8+n9pLCz~Z(*x<I<XoH2(%`ofZ; z3+mVT>T6f1avxRvmvnsN+?-j<F7H>}Z~1)Zr#rqzrt`edmo44*B<0=C4>mrxHF6$p zVws~UocMfeI`gB8pYMLYT<kBy5cl%*+P|OvOiaDG<5W_Sc2L3k=!bUB#~ZJ({Z!h( z5cQ^m-ML}np}?nF1qJ%QZ%&+4qx_-u5%b!7*Mwh!%GW0DVVfR1^AmT&2Zx^5+9#_y zVl?bOyxwefi2JC5G4th=kQ;{6OD@}K%_vt2<#@BBJ27y#@Q%c)SuYG()&<V!_^|eg zNbEu8<;F38thq0oZ=U&WuIgkD`^dLEH(#C<yVZQ)bJeLhTi*Lh1xx<*XLIlWZ+j~E zz+=Y;?pdE$&$m3i@NdO#%>zA87`NOI2w2B*JM5L`^AkN4AFQu&S+6ULTPjv;vzl4& z-eaK_F|D4~l3hzBSF~icNT@MID=v+_X`vpuvf=8+S(<atG{hZMy2ue`t;n3Y?!6FW z7+0vj&y&wTAN+K_C+A?+FM45h$mB}pfT9AcHouH#b+t?P^&V~W-D<ZsX{Vy=S*e6g zB_1KRh5{A)pF~s!H%@IkzxJ(BvBuOJnbWpR>|^vlRdHe0<)v-^wiVR3w=TQ)uFA9F z>vmq<fW2S3Joc$<shiogLvWdMT)oG7Hr^l64U7!J|6HeToTRW0R8D%j`njxgN@xNA D{Dl;^ literal 0 HcmV?d00001 diff --git a/images/icon_download.png b/images/icon_download.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a287f642aaeeadf62d3819a16d6a55e12afc01 GIT binary patch literal 1162 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA<wUD9OyvQvjKmn3P{y zVygsnDZ~r81#n~YilM;-3^4tQ!~%UoJp+)JU<!SG@hi>Eg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L<y@4SSdw29lAoUg3&ntp{F40QjQj!x=U`I>-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=$skw`#i<zmJiL;xbp{t>#v$3O_v5UEZv#YC% zp@9obuS<S%X>Mv>2~2MaLa!N4y`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<(X&zK> z3U0TU;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3t#h8?05D7Z^K@|xskoK& z=l_5E!ww8;ZH!Ed#V+%1n6Rkg{=V8A2QTsNE8^<v%V(Qxmf%on_`xIgQQ0BKTI%>> zvHmC<g$BX!w=6n3JPlV26`rYFeiOW453f!{-NYx!3);9HwEBF!=QC}z*YoCNGYxnw zrEt|{(bD@1r|nbFUU9LhR(1lH%B4pf3zllHoVsIC;}0XjS5ciCr(|?Dwly}L7w(9E z9Jr0M<F%&WRg0!OLLRaVNoFQ1PhSxEGg0lQM8=0gg{ggNJY1~`K{~3d85pBBFnD}* z+_`^2=Sx1{Xa$c2JRMsdK5}g-k&jescr-(1Px<>ezoM^A29GnE>#ih4F*YzTGbm`! V-6~#faTQcLc)I$ztaD0e0svx<f<*uT literal 0 HcmV?d00001 diff --git a/images/sprite_download.png b/images/sprite_download.png new file mode 100644 index 0000000000000000000000000000000000000000..f2babd575dc1cbd6e9342cc58ca795377d35afdb GIT binary patch literal 16799 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..30d6fdd --- /dev/null +++ b/index.html @@ -0,0 +1,144 @@ +<!DOCTYPE html> +<html> + + <head> + <meta charset='utf-8' /> + <meta http-equiv="X-UA-Compatible" content="chrome=1" /> + <meta name="description" content="Scratch Extensions : Extensions for Scratch 2.0" /> + + <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css"> + + <title>Scratch Extensions</title> + </head> + + <body> + + <!-- HEADER --> + <div id="header_wrap" class="outer"> + <header class="inner"> + <a id="forkme_banner" href="https://github.com/LLK/scratch-extensions">View on GitHub</a> + + <h1 id="project_title">Scratch Extensions</h1> + <h2 id="project_tagline">Extensions for Scratch 2.0</h2> + + <section id="downloads"> + <a class="zip_download_link" href="https://github.com/LLK/scratch-extensions/zipball/master">Download this project as a .zip file</a> + <a class="tar_download_link" href="https://github.com/LLK/scratch-extensions/tarball/master">Download this project as a tar.gz file</a> + </section> + </header> + </div> + + <!-- MAIN CONTENT --> + <div id="main_content_wrap" class="outer"> + <section id="main_content" class="inner"> + <h1> +<a name="writing-extensions-for-scratch-20" class="anchor" href="#writing-extensions-for-scratch-20"><span class="octicon octicon-link"></span></a>Writing Extensions for Scratch 2.0</h1> + +<p>Writing a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> +</pre></div> + +<h2> +<a name="adding-blocks" class="anchor" href="#adding-blocks"><span class="octicon octicon-link"></span></a>Adding Blocks</h2> + +<p>An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.</p> + +<h3> +<a name="command-blocks" class="anchor" href="#command-blocks"><span class="octicon octicon-link"></span></a>Command blocks</h3> + +<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function. The simplest block possible is shown below:</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="nx">ext</span><span class="p">.</span><span class="nx">get_pi</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">;</span> + <span class="p">}</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'PI'</span><span class="p">,</span> <span class="s1">'get_pi'</span><span class="p">],</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> +</pre></div> + +<p>To add parameters to blocks, the block definition in <code>descriptors.blocks</code> needs to be extended.</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="nx">ext</span><span class="p">.</span><span class="nx">power</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">)</span> <span class="p">{</span> + <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">);</span> + <span class="p">}</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> + <span class="c1">// The last two values above represent default parameter values</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> +</pre></div> + </section> + </div> + + <!-- FOOTER --> + <div id="footer_wrap" class="outer"> + <footer class="inner"> + <p class="copyright">Scratch Extensions maintained by <a href="https://github.com/LLK">LLK</a></p> + <p>Published with <a href="http://pages.github.com">GitHub Pages</a></p> + </footer> + </div> + + + + </body> +</html> diff --git a/javascripts/main.js b/javascripts/main.js new file mode 100644 index 0000000..d8135d3 --- /dev/null +++ b/javascripts/main.js @@ -0,0 +1 @@ +console.log('This would be the main JS file.'); diff --git a/params.json b/params.json new file mode 100644 index 0000000..7640347 --- /dev/null +++ b/params.json @@ -0,0 +1 @@ +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function. The simplest block possible is shown below:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file diff --git a/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css new file mode 100644 index 0000000..e65cedf --- /dev/null +++ b/stylesheets/pygment_trac.css @@ -0,0 +1,70 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f0f3f3; } +.highlight .c { color: #0099FF; font-style: italic } /* Comment */ +.highlight .err { color: #AA0000; background-color: #FFAAAA } /* Error */ +.highlight .k { color: #006699; font-weight: bold } /* Keyword */ +.highlight .o { color: #555555 } /* Operator */ +.highlight .cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #009999 } /* Comment.Preproc */ +.highlight .c1 { color: #0099FF; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #0099FF; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #003300; font-weight: bold } /* Generic.Heading */ +.highlight .gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ +.highlight .go { color: #AAAAAA } /* Generic.Output */ +.highlight .gp { color: #000099; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #003300; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #99CC66 } /* Generic.Traceback */ +.highlight .kc { color: #006699; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #006699; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #006699; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #006699 } /* Keyword.Pseudo */ +.highlight .kr { color: #006699; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #007788; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #FF6600 } /* Literal.Number */ +.highlight .s { color: #CC3300 } /* Literal.String */ +.highlight .na { color: #330099 } /* Name.Attribute */ +.highlight .nb { color: #336666 } /* Name.Builtin */ +.highlight .nc { color: #00AA88; font-weight: bold } /* Name.Class */ +.highlight .no { color: #336600 } /* Name.Constant */ +.highlight .nd { color: #9999FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CC0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #CC00FF } /* Name.Function */ +.highlight .nl { color: #9999FF } /* Name.Label */ +.highlight .nn { color: #00CCFF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #330099; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #003333 } /* Name.Variable */ +.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #FF6600 } /* Literal.Number.Float */ +.highlight .mh { color: #FF6600 } /* Literal.Number.Hex */ +.highlight .mi { color: #FF6600 } /* Literal.Number.Integer */ +.highlight .mo { color: #FF6600 } /* Literal.Number.Oct */ +.highlight .sb { color: #CC3300 } /* Literal.String.Backtick */ +.highlight .sc { color: #CC3300 } /* Literal.String.Char */ +.highlight .sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #CC3300 } /* Literal.String.Double */ +.highlight .se { color: #CC3300; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #CC3300 } /* Literal.String.Heredoc */ +.highlight .si { color: #AA0000 } /* Literal.String.Interpol */ +.highlight .sx { color: #CC3300 } /* Literal.String.Other */ +.highlight .sr { color: #33AAAA } /* Literal.String.Regex */ +.highlight .s1 { color: #CC3300 } /* Literal.String.Single */ +.highlight .ss { color: #FFCC33 } /* Literal.String.Symbol */ +.highlight .bp { color: #336666 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #003333 } /* Name.Variable.Class */ +.highlight .vg { color: #003333 } /* Name.Variable.Global */ +.highlight .vi { color: #003333 } /* Name.Variable.Instance */ +.highlight .il { color: #FF6600 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/stylesheets/stylesheet.css b/stylesheets/stylesheet.css new file mode 100644 index 0000000..7a08b01 --- /dev/null +++ b/stylesheets/stylesheet.css @@ -0,0 +1,423 @@ +/******************************************************************************* +Slate Theme for GitHub Pages +by Jason Costello, @jsncostello +*******************************************************************************/ + +@import url(pygment_trac.css); + +/******************************************************************************* +MeyerWeb Reset +*******************************************************************************/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +ol, ul { + list-style: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/******************************************************************************* +Theme Styles +*******************************************************************************/ + +body { + box-sizing: border-box; + color:#373737; + background: #212121; + font-size: 16px; + font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6 { + margin: 10px 0; + font-weight: 700; + color:#222222; + font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif; + letter-spacing: -1px; +} + +h1 { + font-size: 36px; + font-weight: 700; +} + +h2 { + padding-bottom: 10px; + font-size: 32px; + background: url('../images/bg_hr.png') repeat-x bottom; +} + +h3 { + font-size: 24px; +} + +h4 { + font-size: 21px; +} + +h5 { + font-size: 18px; +} + +h6 { + font-size: 16px; +} + +p { + margin: 10px 0 15px 0; +} + +footer p { + color: #f2f2f2; +} + +a { + text-decoration: none; + color: #007edf; + text-shadow: none; + + transition: color 0.5s ease; + transition: text-shadow 0.5s ease; + -webkit-transition: color 0.5s ease; + -webkit-transition: text-shadow 0.5s ease; + -moz-transition: color 0.5s ease; + -moz-transition: text-shadow 0.5s ease; + -o-transition: color 0.5s ease; + -o-transition: text-shadow 0.5s ease; + -ms-transition: color 0.5s ease; + -ms-transition: text-shadow 0.5s ease; +} + +a:hover, a:focus {text-decoration: underline;} + +footer a { + color: #F2F2F2; + text-decoration: underline; +} + +em { + font-style: italic; +} + +strong { + font-weight: bold; +} + +img { + position: relative; + margin: 0 auto; + max-width: 739px; + padding: 5px; + margin: 10px 0 10px 0; + border: 1px solid #ebebeb; + + box-shadow: 0 0 5px #ebebeb; + -webkit-box-shadow: 0 0 5px #ebebeb; + -moz-box-shadow: 0 0 5px #ebebeb; + -o-box-shadow: 0 0 5px #ebebeb; + -ms-box-shadow: 0 0 5px #ebebeb; +} + +p img { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +pre, code { + width: 100%; + color: #222; + background-color: #fff; + + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 14px; + + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +pre { + width: 100%; + padding: 10px; + box-shadow: 0 0 10px rgba(0,0,0,.1); + overflow: auto; +} + +code { + padding: 3px; + margin: 0 3px; + box-shadow: 0 0 10px rgba(0,0,0,.1); +} + +pre code { + display: block; + box-shadow: none; +} + +blockquote { + color: #666; + margin-bottom: 20px; + padding: 0 0 0 20px; + border-left: 3px solid #bbb; +} + + +ul, ol, dl { + margin-bottom: 15px +} + +ul { + list-style: inside; + padding-left: 20px; +} + +ol { + list-style: decimal inside; + padding-left: 20px; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + height: 1px; + margin-bottom: 5px; + border: none; + background: url('../images/bg_hr.png') repeat-x center; +} + +table { + border: 1px solid #373737; + margin-bottom: 20px; + text-align: left; + } + +th { + font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif; + padding: 10px; + background: #373737; + color: #fff; + } + +td { + padding: 10px; + border: 1px solid #373737; + } + +form { + background: #f2f2f2; + padding: 20px; +} + +/******************************************************************************* +Full-Width Styles +*******************************************************************************/ + +.outer { + width: 100%; +} + +.inner { + position: relative; + max-width: 640px; + padding: 20px 10px; + margin: 0 auto; +} + +#forkme_banner { + display: block; + position: absolute; + top:0; + right: 10px; + z-index: 10; + padding: 10px 50px 10px 10px; + color: #fff; + background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%; + font-weight: 700; + box-shadow: 0 0 10px rgba(0,0,0,.5); + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +#header_wrap { + background: #212121; + background: -moz-linear-gradient(top, #373737, #212121); + background: -webkit-linear-gradient(top, #373737, #212121); + background: -ms-linear-gradient(top, #373737, #212121); + background: -o-linear-gradient(top, #373737, #212121); + background: linear-gradient(top, #373737, #212121); +} + +#header_wrap .inner { + padding: 50px 10px 30px 10px; +} + +#project_title { + margin: 0; + color: #fff; + font-size: 42px; + font-weight: 700; + text-shadow: #111 0px 0px 10px; +} + +#project_tagline { + color: #fff; + font-size: 24px; + font-weight: 300; + background: none; + text-shadow: #111 0px 0px 10px; +} + +#downloads { + position: absolute; + width: 210px; + z-index: 10; + bottom: -40px; + right: 0; + height: 70px; + background: url('../images/icon_download.png') no-repeat 0% 90%; +} + +.zip_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom left; +} + +.tar_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom right; + margin-left: 10px; +} + +.zip_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top left; +} + +.tar_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top right; +} + +#main_content_wrap { + background: #f2f2f2; + border-top: 1px solid #111; + border-bottom: 1px solid #111; +} + +#main_content { + padding-top: 40px; +} + +#footer_wrap { + background: #212121; +} + + + +/******************************************************************************* +Small Device Styles +*******************************************************************************/ + +@media screen and (max-width: 480px) { + body { + font-size:14px; + } + + #downloads { + display: none; + } + + .inner { + min-width: 320px; + max-width: 480px; + } + + #project_title { + font-size: 32px; + } + + h1 { + font-size: 28px; + } + + h2 { + font-size: 24px; + } + + h3 { + font-size: 21px; + } + + h4 { + font-size: 18px; + } + + h5 { + font-size: 14px; + } + + h6 { + font-size: 12px; + } + + code, pre { + min-width: 320px; + max-width: 480px; + font-size: 11px; + } + +} From c0fc82331eb8c6b2c301840f71390b09e68a3ad7 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Thu, 15 May 2014 21:25:17 -0400 Subject: [PATCH 02/47] Create gh-pages branch via GitHub --- index.html | 8 ++++---- params.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index 30d6fdd..55ae46e 100644 --- a/index.html +++ b/index.html @@ -65,9 +65,9 @@ <p>An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.</p> <h3> -<a name="command-blocks" class="anchor" href="#command-blocks"><span class="octicon octicon-link"></span></a>Command blocks</h3> +<a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> -<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function. The simplest block possible is shown below:</p> +<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function. The simplest block possible is shown below. The block reports back the value of the constant π.</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> @@ -88,7 +88,7 @@ <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'PI'</span><span class="p">,</span> <span class="s1">'get_pi'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'PI'</span><span class="p">,</span> <span class="s1">'get_pi'</span><span class="p">],</span> <span class="p">]</span> <span class="p">};</span> @@ -118,7 +118,7 @@ <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="c1">// The last two values above represent default parameter values</span> <span class="p">]</span> <span class="p">};</span> diff --git a/params.json b/params.json index 7640347..e311387 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function. The simplest block possible is shown below:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Reporter blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function. The simplest block possible is shown below. The block reports back the value of the constant π.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 61511462dd48211b6a20e0e80c9b01d5baa298dc Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Thu, 15 May 2014 21:26:24 -0400 Subject: [PATCH 03/47] Create gh-pages branch via GitHub --- index.html | 2 +- params.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 55ae46e..67bbe76 100644 --- a/index.html +++ b/index.html @@ -67,7 +67,7 @@ <h3> <a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> -<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function. The simplest block possible is shown below. The block reports back the value of the constant π.</p> +<p>To add a simple <em>reporter</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function that returns the reported value. The simplest block possible is shown below. The block reports back the value of the constant π.</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> diff --git a/params.json b/params.json index e311387..8951cbc 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Reporter blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function. The simplest block possible is shown below. The block reports back the value of the constant π.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Reporter blocks\r\n\r\nTo add a simple _reporter_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function that returns the reported value. The simplest block possible is shown below. The block reports back the value of the constant π.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From a983f05ef5ca094ab22507bdcd5da42a4eb94a1f Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 16 May 2014 15:46:48 -0400 Subject: [PATCH 04/47] Create gh-pages branch via GitHub --- index.html | 20 ++++++++++++-------- params.json | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/index.html b/index.html index 67bbe76..a70d892 100644 --- a/index.html +++ b/index.html @@ -65,9 +65,9 @@ <p>An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.</p> <h3> -<a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> +<a name="command-blocks" class="anchor" href="#command-blocks"><span class="octicon octicon-link"></span></a>Command blocks</h3> -<p>To add a simple <em>reporter</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function that returns the reported value. The simplest block possible is shown below. The block reports back the value of the constant π.</p> +<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> @@ -81,23 +81,27 @@ <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> <span class="p">};</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">get_pi</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">;</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">my_first_block</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="c1">// Code that gets executed when the block is run</span> <span class="p">}</span> <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'PI'</span><span class="p">,</span> <span class="s1">'get_pi'</span><span class="p">],</span> + <span class="c1">// Block type, block name, function name</span> + <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'my first block'</span><span class="p">,</span> <span class="s1">'my_first_block'</span><span class="p">],</span> <span class="p">]</span> <span class="p">};</span> <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'My first extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> <span class="p">})();</span> </pre></div> -<p>To add parameters to blocks, the block definition in <code>descriptors.blocks</code> needs to be extended.</p> +<h3> +<a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> + +<p>Blocks can also return values, and they are called <em>reporter</em> blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> @@ -118,8 +122,8 @@ <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="c1">// Block type, block name, function name, parameter1 default value, parameter2 default value</span> <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> - <span class="c1">// The last two values above represent default parameter values</span> <span class="p">]</span> <span class="p">};</span> diff --git a/params.json b/params.json index 8951cbc..de006f7 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Reporter blocks\r\n\r\nTo add a simple _reporter_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function that returns the reported value. The simplest block possible is shown below. The block reports back the value of the constant π.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_pi = function() {\r\n return Math.PI;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', 'PI', 'get_pi'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nTo add parameters to blocks, the block definition in ``descriptors.blocks`` needs to be extended.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n // The last two values above represent default parameter values\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, parameter1 default value, parameter2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 3b5d42ac813c1f14e780bfe820955b14adf88151 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 16 May 2014 16:30:25 -0400 Subject: [PATCH 05/47] Create gh-pages branch via GitHub --- index.html | 44 +++++++++++++++++++++++++++++++++++++++++++- params.json | 2 +- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index a70d892..778bd8f 100644 --- a/index.html +++ b/index.html @@ -122,7 +122,7 @@ <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="c1">// Block type, block name, function name, parameter1 default value, parameter2 default value</span> + <span class="c1">// Block type, block name, function name, param1 default value, param2 default value</span> <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">]</span> <span class="p">};</span> @@ -130,6 +130,48 @@ <span class="c1">// Register the extension</span> <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> <span class="p">})();</span> +</pre></div> + +<h3> +<a name="reporter-blocks-that-wait" class="anchor" href="#reporter-blocks-that-wait"><span class="octicon octicon-link"></span></a>Reporter blocks that wait</h3> + +<p>One common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to <a href="http://openweathermap.org/API">Open Weather Map API</a>. Note that the block type is <em>R</em> instead of <em>r</em> (which is for a non-blocking reporter).</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="nx">ext</span><span class="p">.</span><span class="nx">get_temp</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">location</span><span class="p">)</span> <span class="p">{</span> + <span class="c1">// Make an AJAX call to the Open Weather Maps API</span> + <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span> + <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://api.openweathermap.org/data/2.5/weather?q='</span><span class="o">+</span><span class="nx">location</span><span class="o">+</span><span class="s1">'&units=imperial'</span><span class="p">,</span> + <span class="nx">dataType</span><span class="o">:</span> <span class="s1">'jsonp'</span><span class="p">,</span> + <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">data</span> <span class="p">)</span> <span class="p">{</span> + <span class="c1">// Got the data - return the value</span> + <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> + <span class="nx">callback</span><span class="p">(</span><span class="nx">temperature</span><span class="p">);</span> + <span class="p">}</span> + <span class="p">});</span> + <span class="p">}</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">'R'</span><span class="p">,</span> <span class="s1">'current temperature in city %s'</span><span class="p">,</span> <span class="s1">'get_temp'</span><span class="p">,</span> <span class="s1">'Boston, MA'</span><span class="p">],</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Weather extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> </pre></div> </section> </div> diff --git a/params.json b/params.json index de006f7..395074c 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, parameter1 default value, parameter2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - return the value\r\n temperature = data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From ae5755515bb8126e741e53815a50e534284fcd63 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 16 May 2014 16:50:55 -0400 Subject: [PATCH 06/47] Create gh-pages branch via GitHub --- index.html | 8 ++++++-- params.json | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 778bd8f..c8913f7 100644 --- a/index.html +++ b/index.html @@ -155,8 +155,9 @@ <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://api.openweathermap.org/data/2.5/weather?q='</span><span class="o">+</span><span class="nx">location</span><span class="o">+</span><span class="s1">'&units=imperial'</span><span class="p">,</span> <span class="nx">dataType</span><span class="o">:</span> <span class="s1">'jsonp'</span><span class="p">,</span> <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">data</span> <span class="p">)</span> <span class="p">{</span> - <span class="c1">// Got the data - return the value</span> - <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> + <span class="c1">// Got the data - parse it and return the temperature</span> + <span class="nx">weather_obj</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span> + <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">weather_obj</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">temperature</span><span class="p">);</span> <span class="p">}</span> <span class="p">});</span> @@ -173,6 +174,9 @@ <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Weather extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> <span class="p">})();</span> </pre></div> + +<h3> +<a name="hat-blocks" class="anchor" href="#hat-blocks"><span class="octicon octicon-link"></span></a>Hat blocks</h3> </section> </div> diff --git a/params.json b/params.json index 395074c..c1c614e 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - return the value\r\n temperature = data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - parse it and return the temperature\r\n weather_obj = JSON.parse(data);\r\n temperature = weather_obj['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n ","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From b4ed4e47b8075ad2f25296b2c0e8bd8926b1f9ec Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 16 May 2014 18:02:57 -0400 Subject: [PATCH 07/47] Create gh-pages branch via GitHub --- index.html | 45 +++++++++++++++++++++++++++++++++++++++++++++ params.json | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index c8913f7..0f9305c 100644 --- a/index.html +++ b/index.html @@ -177,6 +177,51 @@ <h3> <a name="hat-blocks" class="anchor" href="#hat-blocks"><span class="octicon octicon-link"></span></a>Hat blocks</h3> + +<p>Hat blocks go on top of block stacks - examples of Scratch hat blocks include "when green flag clicked" or "when this sprite clicked". To create a hat block through an extension, the block type needs to be set to <em>h</em>, as shown in the example below.</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + <span class="kd">var</span> <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="c1">// This becomes true after the alarm goes off</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="nx">ext</span><span class="p">.</span><span class="nx">set_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">time</span><span class="p">)</span> <span class="p">{</span> + <span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> + <span class="p">},</span> <span class="nx">time</span><span class="o">*</span><span class="mi">1000</span><span class="p">);</span> + <span class="p">}</span> + + <span class="nx">ext</span><span class="p">.</span><span class="nx">when_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="c1">// Reset alarm_went_off if it is true, and return true</span> + <span class="c1">// otherwise, return false.</span> + <span class="k">if</span> <span class="p">(</span><span class="nx">alarm_went_off</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span> + <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> + <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> + <span class="p">}</span> + + <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> + <span class="p">}</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'run alarm after %n seconds'</span><span class="p">,</span> <span class="s1">'set_alarm'</span><span class="p">,</span> <span class="s1">'2'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when alarm goes off'</span><span class="p">,</span> <span class="s1">'when_alarm'</span><span class="p">],</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Alarm extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> +</pre></div> </section> </div> diff --git a/params.json b/params.json index c1c614e..d5bc54a 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - parse it and return the temperature\r\n weather_obj = JSON.parse(data);\r\n temperature = weather_obj['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n ","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - parse it and return the temperature\r\n weather_obj = JSON.parse(data);\r\n temperature = weather_obj['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true; \r\n }, time*1000);\r\n }\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off == true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 6be24baa43aa510c27d01d4c5e17d24ac88de376 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 16 May 2014 23:58:36 -0400 Subject: [PATCH 08/47] Create gh-pages branch via GitHub --- index.html | 63 +++++++++++++++++++++++++++++++++++++++++++---------- params.json | 2 +- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/index.html b/index.html index 0f9305c..80c086f 100644 --- a/index.html +++ b/index.html @@ -98,6 +98,46 @@ <span class="p">})();</span> </pre></div> +<h3> +<a name="command-blocks-that-wait" class="anchor" href="#command-blocks-that-wait"><span class="octicon octicon-link"></span></a>Command blocks that wait</h3> + +<p>Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the <code>console.log</code> statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.</p> + +<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> + + <span class="c1">// Cleanup function when the extension is unloaded</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> + + <span class="c1">// Status reporting code</span> + <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> + <span class="p">};</span> + + <span class="c1">// Functions for block with type 'w' will get a callback function as the </span> + <span class="c1">// final argument. This should be called to indicate that the block can</span> + <span class="c1">// stop waiting.</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">wait_random</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> + <span class="nx">wait</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">();</span> + <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Waiting for '</span> <span class="o">+</span> <span class="nx">wait</span> <span class="o">+</span> <span class="s1">' seconds'</span><span class="p">);</span> + <span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="nx">callback</span><span class="p">();</span> + <span class="p">},</span> <span class="nx">wait</span><span class="o">*</span><span class="mi">1000</span><span class="p">);</span> + <span class="p">};</span> + + <span class="c1">// Block and block menu descriptions</span> + <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'wait for random time'</span><span class="p">,</span> <span class="s1">'wait_random'</span><span class="p">],</span> + <span class="p">]</span> + <span class="p">};</span> + + <span class="c1">// Register the extension</span> + <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Random wait extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> +<span class="p">})();</span> +</pre></div> + <h3> <a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> @@ -117,13 +157,13 @@ <span class="nx">ext</span><span class="p">.</span><span class="nx">power</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">);</span> - <span class="p">}</span> + <span class="p">};</span> <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> <span class="c1">// Block type, block name, function name, param1 default value, param2 default value</span> - <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%d ^ %d'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%n ^ %n'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">]</span> <span class="p">};</span> @@ -149,24 +189,23 @@ <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> <span class="p">};</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">get_temp</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">location</span><span class="p">)</span> <span class="p">{</span> + <span class="nx">ext</span><span class="p">.</span><span class="nx">get_temp</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">location</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Make an AJAX call to the Open Weather Maps API</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span> <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://api.openweathermap.org/data/2.5/weather?q='</span><span class="o">+</span><span class="nx">location</span><span class="o">+</span><span class="s1">'&units=imperial'</span><span class="p">,</span> <span class="nx">dataType</span><span class="o">:</span> <span class="s1">'jsonp'</span><span class="p">,</span> - <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">data</span> <span class="p">)</span> <span class="p">{</span> + <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">weather_data</span> <span class="p">)</span> <span class="p">{</span> <span class="c1">// Got the data - parse it and return the temperature</span> - <span class="nx">weather_obj</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span> - <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">weather_obj</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> + <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">weather_data</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">temperature</span><span class="p">);</span> <span class="p">}</span> <span class="p">});</span> - <span class="p">}</span> + <span class="p">};</span> <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">'R'</span><span class="p">,</span> <span class="s1">'current temperature in city %s'</span><span class="p">,</span> <span class="s1">'get_temp'</span><span class="p">,</span> <span class="s1">'Boston, MA'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'R'</span><span class="p">,</span> <span class="s1">'current temperature in city %s'</span><span class="p">,</span> <span class="s1">'get_temp'</span><span class="p">,</span> <span class="s1">'Boston, MA'</span><span class="p">],</span> <span class="p">]</span> <span class="p">};</span> @@ -195,20 +234,20 @@ <span class="nx">ext</span><span class="p">.</span><span class="nx">set_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">time</span><span class="p">)</span> <span class="p">{</span> <span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> + <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="p">},</span> <span class="nx">time</span><span class="o">*</span><span class="mi">1000</span><span class="p">);</span> - <span class="p">}</span> + <span class="p">};</span> <span class="nx">ext</span><span class="p">.</span><span class="nx">when_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// Reset alarm_went_off if it is true, and return true</span> <span class="c1">// otherwise, return false.</span> - <span class="k">if</span> <span class="p">(</span><span class="nx">alarm_went_off</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span> + <span class="k">if</span> <span class="p">(</span><span class="nx">alarm_went_off</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span> <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> - <span class="p">}</span> + <span class="p">};</span> <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> diff --git a/params.json b/params.json index d5bc54a..145233a 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%d ^ %d', 'power', 2, 3], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( data ) {\r\n // Got the data - parse it and return the temperature\r\n weather_obj = JSON.parse(data);\r\n temperature = weather_obj['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], \r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true; \r\n }, time*1000);\r\n }\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off == true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 57427de6b26c9cecb4106f338222d4e3a6bb5677 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@media.mit.edu> Date: Sat, 17 May 2014 00:07:40 -0400 Subject: [PATCH 09/47] Initial import of sample extensions --- alarm_extension.js | 44 ++++++++++++++++++++++++++ localstorage_extension.js | 46 +++++++++++++++++++++++++++ power_extension.js | 30 ++++++++++++++++++ random_wait_extension.js | 36 +++++++++++++++++++++ speech_to_text_extension.js | 39 +++++++++++++++++++++++ text_to_speech_extension.js | 51 ++++++++++++++++++++++++++++++ text_to_speech_simple_extension.js | 30 ++++++++++++++++++ weather_extension.js | 39 +++++++++++++++++++++++ 8 files changed, 315 insertions(+) create mode 100644 alarm_extension.js create mode 100644 localstorage_extension.js create mode 100644 power_extension.js create mode 100644 random_wait_extension.js create mode 100644 speech_to_text_extension.js create mode 100644 text_to_speech_extension.js create mode 100644 text_to_speech_simple_extension.js create mode 100644 weather_extension.js diff --git a/alarm_extension.js b/alarm_extension.js new file mode 100644 index 0000000..89239d6 --- /dev/null +++ b/alarm_extension.js @@ -0,0 +1,44 @@ +/* Extension demonstrating a hat block */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ + +new (function() { + var ext = this; + var alarm_went_off = false; // This becomes true after the alarm goes off + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.set_alarm = function(time) { + window.setTimeout(function() { + alarm_went_off = true; + }, time*1000); + }; + + ext.when_alarm = function() { + // Reset alarm_went_off if it is true, and return true + // otherwise, return false. + if (alarm_went_off === true) { + alarm_went_off = false; + return true; + } + + return false; + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['', 'run alarm after %n seconds', 'set_alarm', '2'], + ['h', 'when alarm goes off', 'when_alarm'], + ] + }; + + // Register the extension + ScratchExtensions.register('Alarm extension', descriptor, ext); +})(); \ No newline at end of file diff --git a/localstorage_extension.js b/localstorage_extension.js new file mode 100644 index 0000000..2f42433 --- /dev/null +++ b/localstorage_extension.js @@ -0,0 +1,46 @@ +/* Extension using the JavaScript localStorage API */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ + +new (function() { + var ext = this; + + ext.set_localstorage = function (data) { + localStorage.setItem(app.projectModel.id.toString(), data); + }; + + ext.change_localstorage = function(change) { + var data = localStorage.getItem(app.projectModel.id.toString()); + if (!isNaN(parseFloat(data))) { + localStorage.setItem(app.projectModel.id.toString(), parseFloat(data) + change); + } + }; + + ext.get_localstorage = function () { + return localStorage.getItem(app.projectModel.id.toString()); + }; + + ext._shutdown = function() {}; + + + ext._getStatus = function() { + var test = 'test'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + } catch(e) { + return {status: 1, msg: 'Your browser does not support the localStorage API'}; + } + + return {status: 2, msg: 'Ready'}; + }; + + var descriptor = { + blocks: [ + ['', 'set local data to %s', 'set_localstorage', '0'], + ['', 'change local data by %d', 'change_localstorage', 1], + ['r', 'local data', 'get_localstorage'], + ], + }; + + ScratchExtensions.register('Local Storage', descriptor, ext); +})(); \ No newline at end of file diff --git a/power_extension.js b/power_extension.js new file mode 100644 index 0000000..f4b3870 --- /dev/null +++ b/power_extension.js @@ -0,0 +1,30 @@ +/* Extension demonstrating a reporter block */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ + +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.power = function(base, exponent) { + return Math.pow(base, exponent); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + // Block type, block name, function name, param1 default value, param2 default value + ['r', '%n ^ %n', 'power', 2, 3], + ] + }; + + // Register the extension + ScratchExtensions.register('Sample extension', descriptor, ext); +})(); \ No newline at end of file diff --git a/random_wait_extension.js b/random_wait_extension.js new file mode 100644 index 0000000..23b5f71 --- /dev/null +++ b/random_wait_extension.js @@ -0,0 +1,36 @@ +/* Extension demonstrating a blocking command block */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ + +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + // Functions for block with type 'w' will get a callback function as the + // final argument. This should be called to indicate that the block can + // stop waiting. + ext.wait_random = function(callback) { + wait = Math.random(); + console.log('Waiting for ' + wait + ' seconds'); + window.setTimeout(function() { + callback(); + }, wait*1000); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['w', 'wait for random time', 'wait_random'], + ] + }; + + // Register the extension + ScratchExtensions.register('Random wait extension', descriptor, ext); +})(); \ No newline at end of file diff --git a/speech_to_text_extension.js b/speech_to_text_extension.js new file mode 100644 index 0000000..38fb956 --- /dev/null +++ b/speech_to_text_extension.js @@ -0,0 +1,39 @@ +/* Extension using the JavaScript Speech API for speech to text */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ + +new (function() { + var ext = this; + + var recognized_speech = ''; + + ext.recognize_speech = function (callback) { + var recognition = new webkitSpeechRecognition(); + recognition.onresult = function(event) { + if (event.results.length > 0) { + recognized_speech = event.results[0][0].transcript; + if (typeof callback=="function") callback(); + } + }; + recognition.start(); + }; + + ext.recognized_speech = function () {return recognized_speech;}; + + ext._shutdown = function() {}; + + ext._getStatus = function() { + if (window.webkitSpeechRecognition === undefined) { + return {status: 1, msg: 'Your browser does not support speech recognition. Try using Google Chrome.'}; + } + return {status: 2, msg: 'Ready'}; + }; + + var descriptor = { + blocks: [ + ['w', 'wait and recognize speech', 'recognize_speech'], + ['r', 'recognized speech', 'recognized_speech'] + ], + }; + + ScratchExtensions.register('Speech To Text', descriptor, ext); +})(); \ No newline at end of file diff --git a/text_to_speech_extension.js b/text_to_speech_extension.js new file mode 100644 index 0000000..fd26964 --- /dev/null +++ b/text_to_speech_extension.js @@ -0,0 +1,51 @@ +/* Extension using the JavaScript Speech API for text to speech */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ + +new (function() { + var ext = this; + + /*function _get_voices() { + var ret = []; + var voices = speechSynthesis.getVoices(); + + for(var i = 0; i < voices.length; i++ ) { + ret.push(voices[i].name); + console.log(voices.toString()); + } + + return ret; + } + + ext.set_voice = function() { + };*/ + + ext.speak_text = function (text, callback) { + var u = new SpeechSynthesisUtterance(text.toString()); + u.onend = function(event) { + if (typeof callback=="function") callback(); + }; + + speechSynthesis.speak(u); + }; + + ext._shutdown = function() {}; + + ext._getStatus = function() { + if (window.SpeechSynthesisUtterance === undefined) { + return {status: 1, msg: 'Your browser does not support text to speech. Try using Google Chrome or Safari.'}; + } + return {status: 2, msg: 'Ready'}; + }; + + var descriptor = { + blocks: [ + //['', 'set voice to %m.voices', 'set_voice', ''], + ['w', 'speak %s', 'speak_text', 'Hello!'], + ], + /*menus: { + voices: _get_voices(), + },*/ + }; + + ScratchExtensions.register('Text to Speech', descriptor, ext); +})(); \ No newline at end of file diff --git a/text_to_speech_simple_extension.js b/text_to_speech_simple_extension.js new file mode 100644 index 0000000..fd02d0f --- /dev/null +++ b/text_to_speech_simple_extension.js @@ -0,0 +1,30 @@ +/* Extension demonstrating a simple version of the Text to Speech block */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ + +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.speak = function(text) { + msg = new SpeechSynthesisUtterance(text); + window.speechSynthesis.speak(msg); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['', 'speak %s', 'speak', "Hello!"], + ] + }; + + // Register the extension + ScratchExtensions.register('Simple text to speech extension', descriptor, ext); +})(); \ No newline at end of file diff --git a/weather_extension.js b/weather_extension.js new file mode 100644 index 0000000..d530045 --- /dev/null +++ b/weather_extension.js @@ -0,0 +1,39 @@ +/* Extension demonstrating a blocking reporter block */ +/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ + + +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.get_temp = function(location, callback) { + // Make an AJAX call to the Open Weather Maps API + $.ajax({ + url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial', + dataType: 'jsonp', + success: function( weather_data ) { + // Got the data - parse it and return the temperature + temperature = weather_data['main']['temp']; + callback(temperature); + } + }); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], + ] + }; + + // Register the extension + ScratchExtensions.register('Weather extension', descriptor, ext); +})(); \ No newline at end of file From 298f82b6fcd482845963bce900509e01ffe2ac24 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Sat, 17 May 2014 08:19:05 -0400 Subject: [PATCH 10/47] Create gh-pages branch via GitHub --- index.html | 2 +- params.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 80c086f..ba718bc 100644 --- a/index.html +++ b/index.html @@ -83,7 +83,7 @@ <span class="nx">ext</span><span class="p">.</span><span class="nx">my_first_block</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// Code that gets executed when the block is run</span> - <span class="p">}</span> + <span class="p">};</span> <span class="c1">// Block and block menu descriptions</span> <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> diff --git a/params.json b/params.json index 145233a..92a2d95 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n }\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 59c7ba05e61b29dd55b360c0067b8f85a4d9feff Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 30 May 2014 17:31:37 -0400 Subject: [PATCH 11/47] Create gh-pages branch via GitHub --- index.html | 2 +- params.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index ba718bc..8c34da4 100644 --- a/index.html +++ b/index.html @@ -34,7 +34,7 @@ <h1> <a name="writing-extensions-for-scratch-20" class="anchor" href="#writing-extensions-for-scratch-20"><span class="octicon octicon-link"></span></a>Writing Extensions for Scratch 2.0</h1> -<p>Writing a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:</p> +<p>Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> diff --git a/params.json b/params.json index 92a2d95..cb90a9a 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 is quite straightforward. Every extension starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 76dadfd4b8e1775834023dc2f8d4d3db9e9679cd Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Thu, 31 Jul 2014 12:40:38 -0700 Subject: [PATCH 12/47] Create gh-pages branch via GitHub --- images/bg_hr.png | Bin 943 -> 78 bytes images/blacktocat.png | Bin 1428 -> 463 bytes images/icon_download.png | Bin 1162 -> 216 bytes images/sprite_download.png | Bin 16799 -> 14832 bytes index.html | 213 ++++++++++++++++++++++++++++++++++++- params.json | 2 +- 6 files changed, 210 insertions(+), 5 deletions(-) diff --git a/images/bg_hr.png b/images/bg_hr.png index 7973bd69888c7e10ccad1111d555ceabb7cd99b6..514aee5056a320b059a4b92fc31385b01f3fd707 100644 GIT binary patch delta 48 zcmZ3_?l(b2OVrcFF+}2Wa)N}>gF8Em|2xh|Ji*9t_b}UK{lKHU8Gyjk)z4*}Q$iB} D!}1bm literal 943 zcmaJ=O^ee&7!FiK7FWCot{@Ck@nrMW&tx0B-6VAbrk1u~FTzffX&bu9#AIsIdef8t z!QZfdz=K}>3m(LO;6X3qN}Y6@>cJYA%)G<%Jn!ec>9im1@7>wsIBwrMF}iHO!q%;8 zSJ@xEd~(FL18NRvkBsOXMVM>4WQc*~qcQGc<Sw3n#C49#L9aic1N*V+5T8dWhEM#E zu{o~ZNJ8XHF$F_B_5uxlefJ&$&(+}5vMt)7jwjy9GQz!OyYDQgj^e_`Lr_mtCg5X= zK;oYTv6^Ubt*f$gdM!Y(hR~@7FM}G`9iWp4gEB7`9I+yTio{FBQngxr0Ax`T1yL3x zxgb^5qO6J{*nE(Ai`<dgHCh{A%+lb5(ohwI`FzgLi#&<Of}|))sv*k-hA6~~fTE-j z#Q99Yz_Al~A@xWAQbjZ*Gpa!r>17IjxRnj!O_^B1gan0x#EWT48PK->5B2>mI;LIx zC*FSw$Nfc!g)WZCEOJ=mM)}lLsOk|$ltg_(&ax_YCWMlBLPDVT%D_gB7o_$YZ`-OB z#1sV%whRq21>W;qwN$N?OUGtQQe;JvOsQrna;+v+j8dth=*?orHHb6waX>S!yXCgT zo!oR3{E&GzaOAzfZYv@_Sf{LdyJInS>TS60&R9%yCs$y>2x(*gYIJtRrYAja$Ceq} z!N&oc_K1!3-Ft`U>`CM;quEbB4KG%!MovB*9_3!QzFhqHwrbwK|Doo-y>auDJNSP6 T=d)j*_4El@X4^PFK7I8YBT*xD diff --git a/images/blacktocat.png b/images/blacktocat.png index 6e264fe57a2e35a2855405ac7d4102c3f6ddcdae..e160053a5bfc1f1891c5df1a04244b46132ed91c 100644 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGW&u7Su0Z-f>EL7Xu|Ghaf+azI z!3+%h6VAUEXmGf1FkfMPe?Wo5`wP+x42<TUE{-7;akZCTZ)!H+U`Y@XYI?S)^8a*O z?ybGQ9$zRd`Ly$Z&(aV17uWB|yR6msxBOeGX63rBUr+8f?G(ReBvezj(~#MG+3Kj) z<<I_Hb=scwV#3o$vghwSIi@B0lb`#U(bt)Lb5?ido@CKKcT_%S`_`I|0nFa>q#I?$ zCZCHu*mLc{mj@jVb0qJie|tLrXx$RV*xy|DA2&%h)(GsqVy%>MraS!Shm183{#@F! zV^vm_@$^Y{GUuI-cUN0({K+A*SMX|j#GmyK98SEwQl?dz*($XqK|j>0;H2RlD{}=; zx7!XPy5}bEXEt-@-@Ngc#+nIgOgm!u=S(u>E&hLN(cd}Wb8P2o&P?9><1zE8l8pz9 zg==?S&3yIdUhdL~<_mg1Y!?@vTUiymeaGcy&vRcbOG}I6uI`9fxn}VP_6h8=I%b0Z Rq=4be;OXk;vd$@?2>`O9@hboT literal 1428 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA<wUD9OyvQvjKmn3P{y zVygsnDZ~r81#n~YilM;-3^4tQ!~%UoJp+)JU<!SG@hi>Eg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L<y@4SSdw29lAoUg3&ntp{F40QjQj!x=U`I>-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=eg`=5?o13Glvx}*rp{t>#shg3DvyriZv5}jZ ztD`wguS<S%X>Mv>2~2MaLa!4}y`ZF!TL84#CABECEH%ZgC_h&L>}9J=EN(GzcCm0X zaRr%YgxxI=y(w7S0@dq`Q?EYIG5Vm0MT%&c5HR(CnDAr^<iHbtY927P7Xgzs$AOa5 z3=B*ho-U3d6}QfW-_30?;IZ?o)mKhwPHT~VXqI8+n9pLCz~Z(*x<I<XoH2(%`ofZ; z3+mVT>T6f1avxRvmvnsN+?-j<F7H>}Z~1)Zr#rqzrt`edmo44*B<0=C4>mrxHF6$p zVws~UocMfeI`gB8pYMLYT<kBy5cl%*+P|OvOiaDG<5W_Sc2L3k=!bUB#~ZJ({Z!h( z5cQ^m-ML}np}?nF1qJ%QZ%&+4qx_-u5%b!7*Mwh!%GW0DVVfR1^AmT&2Zx^5+9#_y zVl?bOyxwefi2JC5G4th=kQ;{6OD@}K%_vt2<#@BBJ27y#@Q%c)SuYG()&<V!_^|eg zNbEu8<;F38thq0oZ=U&WuIgkD`^dLEH(#C<yVZQ)bJeLhTi*Lh1xx<*XLIlWZ+j~E zz+=Y;?pdE$&$m3i@NdO#%>zA87`NOI2w2B*JM5L`^AkN4AFQu&S+6ULTPjv;vzl4& z-eaK_F|D4~l3hzBSF~icNT@MID=v+_X`vpuvf=8+S(<atG{hZMy2ue`t;n3Y?!6FW z7+0vj&y&wTAN+K_C+A?+FM45h$mB}pfT9AcHouH#b+t?P^&V~W-D<ZsX{Vy=S*e6g zB_1KRh5{A)pF~s!H%@IkzxJ(BvBuOJnbWpR>|^vlRdHe0<)v-^wiVR3w=TQ)uFA9F z>vmq<fW2S3Joc$<shiogLvWdMT)oG7Hr^l64U7!J|6HeToTRW0R8D%j`njxgN@xNA D{Dl;^ diff --git a/images/icon_download.png b/images/icon_download.png index a2a287f642aaeeadf62d3819a16d6a55e12afc01..5a793f17688b22d0c98f8b32855f69daff65afaf 100644 GIT binary patch delta 188 zcmV;t07L(Z3D^OUB!8btL_t(Y$75g^1*2dvfW3S7vH`I%7OYNdi{*g$KNfs=)Z$T# zM=c(F76T140OD^rEFuP<1Qj^sS{_2CrB8rZf>NJ1l4vO?l#Hnr?CVIdIGmdC%?ZSp zh_JMU7Aaa9h+pBcbR!Tm(<(bz0`X5QmV!cqpVoOf0nJiSC^e|it3l8UwG`xgCwjI- qn1OgZ5N8fVGl+AvF*phaB>({Q6ZHXLR?Z{<0000<MNUMnLSTYxgGz7! literal 1162 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA<wUD9OyvQvjKmn3P{y zVygsnDZ~r81#n~YilM;-3^4tQ!~%UoJp+)JU<!SG@hi>Eg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L<y@4SSdw29lAoUg3&ntp{F40QjQj!x=U`I>-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=$skw`#i<zmJiL;xbp{t>#v$3O_v5UEZv#YC% zp@9obuS<S%X>Mv>2~2MaLa!N4y`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<(X&zK> z3U0TU;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3t#h8?05D7Z^K@|xskoK& z=l_5E!ww8;ZH!Ed#V+%1n6Rkg{=V8A2QTsNE8^<v%V(Qxmf%on_`xIgQQ0BKTI%>> zvHmC<g$BX!w=6n3JPlV26`rYFeiOW453f!{-NYx!3);9HwEBF!=QC}z*YoCNGYxnw zrEt|{(bD@1r|nbFUU9LhR(1lH%B4pf3zllHoVsIC;}0XjS5ciCr(|?Dwly}L7w(9E z9Jr0M<F%&WRg0!OLLRaVNoFQ1PhSxEGg0lQM8=0gg{ggNJY1~`K{~3d85pBBFnD}* z+_`^2=Sx1{Xa$c2JRMsdK5}g-k&jescr-(1Px<>ezoM^A29GnE>#ih4F*YzTGbm`! V-6~#faTQcLc)I$ztaD0e0svx<f<*uT diff --git a/images/sprite_download.png b/images/sprite_download.png index f2babd575dc1cbd6e9342cc58ca795377d35afdb..f9f8de24c1c49ce421a44ce2a24ac22d045a39fe 100644 GIT binary patch literal 14832 zcmV<MIS<B(P)<h;3K|Lk000e1NJLTq006WA004{#1^@s6)#QWn0023+Nkl<ZcmeF1 z?W<i!6~=#S&EDsndvESdjmd57OVXsZt+q`l6x&jfwxZaAr7g9zid02G6czCwu!wI} z`$_bZ;3q{C1i#czf^Sq*P!wOGFH*6jYF}cLoOAY`S?-+0z%bmK+cr(ols>T7`_9bS zGy9om)?RBR!dAHWW*_tXQwl(6h1e+?gcKD^-i|3EJ{A>9<n|h71~rl`+9ep44AF#! zM2bf0jdsb1ozWdJGG4dO0OQqyM}8t~TX$Y#CphoQ%L#3a?wAo;!}m7<ob5cymSTS9 zF`-=%N-<khViyn%SR4$66p-NJHIv2lMZiTYE@q2>8ln+WM4G`Q(TpQ08lg@2W*dNu z`wYPkQ--~aVh%`9umIwmOAssxCj(K#qJbKu1jKBGu<g|+=*>JcgoT)`Z%KUv(qL&Y z3y1_T0eMM+&Nn~;i3=0ykkF%{Lz_tHu>lwNX+rFb8u>t-ytpedYYWnXjSvk$02B~T z7G^GFkqC68e!k$ipY|MkCZ5fLZa5L#JG+=IIiVICEVZOKSQ=x4K?~Mkl1VSZ43Vwa ztwf#hwg@suwF71(6p<cndRTbtge4nHIMqnesL?KY2m}z$5n^Y<;g^NDUD$%dUXqwa z$CynJT>?hVG3tDtBt#Ne4|Kp3(J5xfuQsf~&gSr=*)r6~VipyM!M$;8v9!#)AH0>_ z2R@Ck4hX4-eg>k@E)@hSSn@0Qec7IR&|)b*)_^HT{`(N$|IinR^P|8FOM*zhxSAOV zkPHBAjZ=VXZ3g(7^L-fxu|h5E7b%Q@*$82o+rNGr>u>%H8g_xb%=`uebAG?~{`;99 z0SyVT!h}~2jIDueDdyPea8=9#an=&M5vgBdyt<vczV%tw&bx!u1K@;D0ia#Zgw`=! zy%CvYH*Nfy`})}-9{$D$`OA+ULEB@5wnNmtG-g=x1oD(3*~a0KB!C<SWnq`GeUY$k z?VVF>&~}W-GAlcG4E%n6;P>`Z&hM|jc^`lL!Cy)72-uVqJ2V()3b9LMR7vYr;%+vK zn{yJFs~P>wJ+q}2TZ9=)?AX79(Ci`gnIO={iOzr51ZU*_lH?k>FSM)d*tZX}C$S{N z&f`5SW<f!3oN8Dd8YKfYgoK1hl!R(e1X6EklaBK^I0pt%1K5T_26Cu@h8AH0ED!vy z6Gj)Fa(*?e4gBs0c>)mwQB*p-(>N0dV;m_VY9MjoD7}!xwb?XoPQB8Mh1hx0m--fq zV^UmN*m(!vIFP%C8rcKX<dt3{o26_Uj`ORGS-<RBEd745Ceaa+=I)){a3oF(d`{o| zn1BwtgoYkdLEDHn{bH?I)Uavjkv+4ES(ibU5!uH1S6@my*?Y?Q)i7e$rPqV~4p9Y0 zkmg88oGDl`5QE^0x8#KZ=#YiDHx+fWX{Z5SXHI=^&m1SDxQq?9=i2kxf8(8KvnzXp zlH5(>xe__Ht3R7%n{Qs=oQvMcf%iPjKY#l;+C(&TASsvmz$n5F11t3hQsh!r49h@3 zB==QgYb|1AYnF`v{QWS~!&A&=h$xokxbS*BWU~dY9(vSaMj_^~1S})6#@-wDu<vch z`Q3Rs_#M{v4i4V)OP=`kV>F`~5;{av=AoFc;wAS5yx*!rwnbf_<hR}v(L^&b{{6S- zm_9cJW($r}KO=VCi%SZ%@p@-B4VX1p9Fh77*MIyVyRW>7wezoIym~d3>V%}eFNv%Z ztgU0e{H)Q+Zr<{d`?>PYKa=x7)Q~(+kKZef1StYQoO=Q#*|Q}8@0Uz?gU{LHsGg&t ztacaxVPuFZ^XCr@iPdlT`PY8T;eQ=2-rI;Bo-D4gVd$ZaBHDO0Lza2#r><f5RX4M` zd*FBN^zqv+5Bz@kb6j=jpGXNZzZ#745R~)g`C{k%`r&XZf0NfFntxM2C$Bm8m%kDE z>7l_J5Bxs(5YImGG^PpBR8(VZb3teC+#M4@5phAMG~&9CUcnW&e}#5=FLCaR3L~)O zqG={j6J8SBPctd`WjFr}x?udd*^`9PI@>Q?U$m7ZiTb#H>TB4HobqodiTB@!QTYxV zZM<LmsgKPYIN1*8?7f#;AGn<Fy!Xq9B`iiP#f6x)aWB1*ckXA3h6V{EZusN@-gMhn z8LgZtes{5U!Husle%-cTcn`OH>2kjNzAu6u=QYyLA{#&{W9RIhH3$$$F<`L)8*%a5 z@1vRQ#S)an)d>hdeP0q}sV2RS3-cz{pUKV1g1n}Zth%lC9&SFjw`D8IuIJUptxmqS zoqG=l?%t235k`Y7_*3Fs39aA>qL358*a;#5qy;8ieA5SLmrlg*Yy2L(cORl7j8Obn z0HHv$sdpwRxOc_|8$3sO>a&%Lc2p$gF?C!0obp6YpM`!7<86Mb%a{+G<ox39&3s(; zQrcAOsM_k!?|6+GdCu}adz$jy3$*OK<hY>!0X8Sa9@PXSVy8eXpH66fQK~I4qFuh| z1pL0nuV};T_g?}$iqK+oY+H|2Igf@K8uI_w2v`bWPPoN>usLRuU!*|kO@vI|>~OA^ zZd_7w)Th=4gRrT`abm$qwnUBUlUtA3xTICDtE~O{oNjq@A#b)@>}JfL4?v5h5wY*l z5J@NyJ<(nPuwf$v2);2kMr1<j;tS!o^u)t_Q1V*~1Sq-7?Pn>!bDZBX$P@@bs4E@~ zrQ3E-qF_pjE@n$DtLLup<R5;<c=b_Irx?KnZ$gTKYFR-LL?A^cJVlQ);lv3}DR{7) zw0XZk`DyKsK^PmBsw6_d%t;C@WTaR=+xyIXyuY{4qhaGphlr1{2oj8T0{zU0bFVj# zRwCF@{`b^T%*G30iZ-O!BX}$g8A9F+PYB1Xy<v6W_ZLjo9;fdVOAVNis{r*{P_XC@ z!wkl&xsp?ip-5;8m^lvxzlG3zd^gSfWt7j)_3MrK%{<oYfUWsW(dX6H#T;k0;I3Vc zq%`n*=oq3Cuqh@pCxN)JhxUKs7BHckxpz+eh%4^6h=X^3jO`cPf&>NXQ@z<gvAUpV zgRShOLQXdF_)_HF)*Y>5!`zp>RrVlxta~dcW6&~&EIo_ghf$vM#5LaHdBwfY>j{;Q z+j-f|TyV{|`RM~c<ml6Lke)_+L?wqE3-2sJy%cJrA@1JCfxA92@cXX+vv;Mjc3stZ zpL^fnXFG}Q#7Ufy<mDw{5Q$^L9O^nkI4wmTek4LIL#6fyPzf3&kV;cRnj$K-qJ@q~ zrBYKuXhnf$pj1FxhK%4OG$g@(Hcm@y*HaP?@7{Z+?(d%SDa)VMJNI4JelMhVN&B7Q z?z7L?-(Kh2YpuP{ej|Jb;Ct4~Hiq-A2EJbihxc@1p0p;1Vt$h&&k{@rt=Ktce$~4^ z6jrQ#lXfpUg2k;B0Ajljde;Py6?Q{V^uon1V`c5LSP*T9NROkE(QYKTKF}6iirS@F zr+Pkn5BM49ZTN6_<NFVWuYKgMm=Up4OtqyMf&DTnd1U9x8I1UTI4nQ?XBLF-2;U1L zz8?zLd|-dL=fhu$C(#pTh!~NnTk(K5O~52DH!5~6s_4el>Z?((4d+;ZZ5W3@xD$Ic zj_HqPQP?29ZK#b40Bv4X2IJW)BZwmTUONF+4?XSlohvbYCc_!i8~bDs$~sb1AUsE< z24TS5KpKzc*sDkQ4u@}a4mZKCt4y|>)0~r-!WjPO*CqWFN~DTO3S-cVb0P-5@0I&= z3G}V^S;T83>y_&>QS9?_fB71HHdO}5{0<Go-g|15KVX5W0l=<|sg?AJ!c04bgOSt* z<ygdbVubHd_#!Q<=idVi5b%QLL&Nz?q8-zTM*2!VR6MTUriqpIffQH^lpls^%BSbO z>nvk1k8Y9J9g}I4-BcMg&g#c`S(eX;d3O$1AnAN<IMMOh`BhIV;yE|McPM;;PY2im zL*QGRbfVCRKaWlF2V7Y(by0L<2>_fAt>GgNK>5uN*EtpQLrH!-mSBq=DbJvzYAOn} zKA$){+-iM9X}ieT2b@xcGn4w-xL-SfL*qNb7a`I*<g$>t94#nv$qV`+sMe&t3E0C2 zP9Iz=%X6B)A(ST#pg_t1fB@X!h`8ZG%_laUY}uVNpWSw`0gg~)B=<8YKs-FYBYg9` z3jiC3zTvb8g8T}kqm|$TDcC-kQt3efd4H>U{rfb(;c6o`UpFkvSf>bpCyD#DyA%L? zyF=kS!WXF%d};jXlG7%8)(aQo+z+|<9=UzXm`?%JuGZ#JCxl67nrS2G^#Zcoo5?nS zmYp6&(!5|+#A<1B3=on=*&X3~T=<rC56Gn$T$95AsOW^Ty3pnsT!XusCN}ZeKs|l! z^4uwle47cPh;*?6s+QM0Z0}D3D$))W)|pyR(i}mzIl}k2@SUqavTzvM69SG@^tvus z8oE(7@$;+a?t`r%BE~7TTf;ftTfu8jG&@PUuY(!Z^VV{}5=h>xwKB)l#yKi;pFyl( zaTg;)<2%B)0KWXPC7vr)p-cT#Ul_V)fptN(;OJZBHAurZaUAM|$Ru=vsDRmPcpk?B zdIRgI)8X5rI*iQw$c(Wx4SBaiBnZ4zvc$Q1&dPB3j_~b8e7hjqVb|s0jk?y3@w*2D zGLwdan3`r{>E}UGp4fF>oO9t$j5fL|3C}C=szjP6lqteWLww^nG`=HzGko%<J)p19 z%v8MrF%@Z#m9v#?4B{)Bs1u;^P7T&GKP#mGuzS?6Cv-Sg%hz%!+7NyNGaf5A$XtuE z%%fS+1$MyDvNO9!V_z2`?{$a6cZ6>}umb<1XtbgIH7JUXb{&=t6l9(4rQWbQ3;LF; zC(knU^C47TXP~jtp64!g@_+Y~hR@KeJ#Wi4I&_SLs1Th(l0$3kSj8?gvtM+F!gqvk z8uNGRI6l^7!MBB_%!jVUf=)`$vsB0S<*lb7zwpM;%B$#{1#X+lut~)qDO2F(dBw?^ zTBY5hPMc(7r=fdf4&#K43nm8O8@I#aJHofupDr+uG$K-UnOV<1Oe~D^Y_)q};@1ZX zstxxr2^i8P@|@R*+FjCd;q_Xk#}@vqF?CD^e+SpIm?U|~<~k@H$y>(O#GsD{-x0pO z8egz<-XlBrWlR<y#3%g#xenRYaZ=Zq7od8Ft8R**`;$wox7_TFd%x@3>yMWC=RKhG zSu~FgBPsLPA>o#7)I2iu;hx5w=aZrF9pRfrEV>oh4jbh_x0!Xi*2BilwTmQM@Sz#f z@w`^rVAu{V4rpfU?Kj(Qe&aW<XQ3a3vaUD=4$nQEhC{n6KoW-MkP;~u41FB<j_~b; zLr-^n!e~}#c7a{ey@q%QxV<q%zuYC*Y%C2^DI<w();#w>2L!yZl8QGvrumzOm8mpZ zhpdB%=4m+cKLk9C@IB%9X5sMOxlr;U7HmT^Y?pUq_g0YpEt|N(dTgzohkVOcnfbi} zobIdm-COhg1c=&+-lTVp#WqjmL270<)N%ENSvYzS6|bB=-zfyHp<bJBZU}rw_^x?L zFC5+1I60}o3lG?I5odD4JL)i)%JQ=v9ha9b(k8#FYj7$wPHOLC%a{G;`321k#yV*k z_B*~b^p50Qp|l@X(siqgzK_BY+H?qfNBFkJv*@GbA@K=g%wPG@Fm%@K#)PMwAgJ`D zt+)+h7cQY_rL{ZM3Ty1spQXh--iMuj_v?Q_q4uYm0Upz+lB9w2U<ONpuUm%1cZ6>U zjO%kPX<=xxhAK5!8iNF_c1EyuDxe#KRPn)W9yCzq@x5(6hu+6`V4P<VAe+I|5jTo8 z6+)SM7?}SFQ%!l~z(Ah%hQxP-Z-b1vaZ(h(q3?9ATG74TwjQ+qg@Zo0R}po1nn7;{ zfZ`36YFFonm=?ka78`FWrNm(Yo-y52Fsg+w?I~IJ=+O9%@Wsi}8@zHx3KRb8FHUzv zScwecGl1T-nH?C0(IHV~h$fKzE><H2+HES3!+xKqPLDT#Ay4Nxk3**tU?m_EwyRh= zJu)=DBYc@ZFNcpqW8Azo&f!_kAs8HF_rIc$E=)viEM+Eb&?Zk@<Cz{q=<G9JRC(0q zR1HuM+%8v4N3aO(R;W#mPE^1VzQf>4b}ok-`Y!q@>!jG~WD-01TkJ3e-0K!?qxoSU ze_}aB8A9zfyOyzU>rtG!#9|N5&p!S%%B*Hz$0w1GWRWNBrg1yMcNly_Nqh$@w2r=D z7#G8h{(>aU%fG5Yud}w0v}<$OKr5yVW1q<Znb%3O=No5?H8iw-yovpap{dk^r1u=~ z%}4kSh3^nfA#FZ7G+77AoO_d9<RSg=i?_a-zp#m3?>i6@X3~}B#akX|+g&t06TbVa z)#2-J3t`9X*7?6@^Fg<HP<U!v3v*){Cx2zVYJIjv#&>3BCcNtGs<rR<_STbzud_tL z3BWhhbIt3hQKLd@7uk6h3l3(cvPimsp91YWA-?BsW1P*iu{?%B@<*wfyDn{X1=%0H z()ceG#m>*@g&`#3+gl2Jq0E20smglCw~CX8FZb;;oEUsLS7s1Hi}Vg>p-2l|Nr%U} z3Z(_#Is*!}uAAmpP!z1ePP4Pkv^!OBt?byfKQi;_)&5WRXrnX_Oz3L&MOK8~(aiti zTTD8}qI*YDT(<=HQcfnmirxPm-?WqJ7vBTo(BtsDv4apEz6R*RF*I+uvH^kPxkhI} zoEBaqK#4SrJh`5?d5*VSJriztX>jHJUyoTLE;qfQI{xi%oE1Vii_8^1|9A)=d0hyX ztPWw@!4Tf|#SjkuWY%`$^1>xWDD!TkGTV?-(hlL!u88kk#COG_;rre<Plp>W50voP zcg*zb`Y#V|4I5rD6K;Ba2(Mlj`ht3Y`umkxf^t6lt_sZC9t+{pHKCt(-OXaA#YG$c z=&ftR+g}#KfevsD{Wc(`_dOlLC$9~zeBp@@?s;%_ete6pqgKRVhECuVW@Y7tcQB#4 z4C7|u4|P6#@6>i3YMVJjxPCBQ>_*@7W+StF<3y~Q3}N#{!Id>N5%Txnmt!<4^FXP; z^2;Gy^QmA(zlJU_AyfxeM2?L`W8O#Fjm)!n_`=*keJH5!SGUKVGiJh_zk)OIct^~$ z3i&GKdtlcL{0qg#ZKL0PGnAPa!?a;u+z0z^oA7tVSFkG?MXKk-v<5{vL;(22RL>3k zTVTCU;3+oHud}fHIHZ@)cSLj^gOqv45A(jW#{|ZJV7ue#z2Xj6$%4D?mK}YDp;BLT z@wD%xAr&bYgllpX4NOw?fW&uvGF?o3-+kMT@WF2eN?7-?*=R>U8LqEc`(xjYdH!xT zT=N;?Qz<Z?i;4>7MlYw4koT;w@_g=xvFwjN89w%%K%r?D-uU++yy<gD)yqS9U{{zQ zUqplQtSf{u<R@52c~&s?NN~u43Luz<6(4Lm4ESARuv$rmtgNl6UGM&FVaK*7!;bB< zmQ}(#?g}ByJrk^qwY2-I%DDX@+pvwXTFiaPy@dpIu^FT6OM)+7Gm9@@{=ayr3e>Dv zwbmcN36(P6`sK&_FM^FmOixb-%I6-hoz5rJ5q>Vr&d!Fd+h&jLA@2=nrvdopSyMQ4 zOefIDhz^-2s~toe0#fIr@iTh)pL@+tgXU9~mSJ8QVR9YIQ_j7Nc3Yo0zW1M7g9=<T zt`kZYM_HBPueId~lX4sK7`N}xhL$A^6kEzt;Oobb4{Q%R!o}hGmyd_d7tc`9)O4Y3 z?S4C0lm@@Ky6k<xdM2pA*8ZF8o-gmuzP*1CzA(*>$`S@cnjB<mH3Mt~?dm#Q!pWbC z$aC|b_XimCJR8;pm0~^f+ur)TlHPddUS%w0u0dZbd;j}{44o1)PWJL9fGsJ$Qcu=r z^?5VlvEOLp#fSYI%?ZJU<vI8|Sb`iH=R&{t4XbI(hhM)Zgm7dZ@m758blXfPd-)2j z|GwASCrP_wW0X2POVCt|Dc~w9q>+Uc42_YhGUJ(OhM08y8)qt0fu_dM11uk)tJz^0 z+iwitIpw-*YU4H7(X_Rb?vmgu^1iDolMHNm%_kq{fD0A6dM0~p?=3GA^WZ#~*eW^l z%}if}2og;Vm>(>o0pB8z_#V3^hdA1TlJFF#kS49v0?N;YT*F<b7HWuz=lmg2t%UnY zzkZTrS$y@m(+s<X_x)>tfN>Zyf~ldvQ&hQQw;S!r?XB>dS4;=W_Gg1e60oHbM!<Wi zyC%o@R2>dAtV~$~d|6j}?ZvC=?*Ew@SFV-87ky%-vTqgk`?ZJ<Lv9aL<^^An8@GpW z{RXkcW4Xte8s9l+U$zE(yO=CD<a}s<<gn*<_elO|mBvdO|49v#8|!8nWGyU8G&WKH zyIr}jgz3&+QH_XE5DUHG_h`$(!){dQIvzV6)AQ!agWLA%8p?Kr4>q1%sBvH%x|Z%@ z<7?&1zc~~B^m`#Zu^-q~39)KyRe{Yh7r#M1Mul(>IE+x{7`lt;rs+OzR;JH6ou)>A zyX%8EK&s4~JO2H#`S8s{?`W4{yQmKXqa3<=QXS>!^=xccBMb9J8)T4!3CCnt{W!E~ z@ofHQB#xx<UR<0-Y(wlfN>(8GN=;85jm5|aLS69C?f=JCry5a?Ar@)`NF@fY78~E& zAFtSvk()E7s`^s-U=CmagdsJux7ySwTiO5CZ$8_1yve|C|7VM@5{H9-6TW$x)gKr0 z$ANP><lo)m;v%IIsWZm?#?>PUtPag;gRvs&jOqFmC{Kojq13p3=M!7Px|=4*RxxCk zMO)CBEMwmMb+<gvS~Hi>yr@i+TknnMB6)1x^(>qgWjuM#b{-=lbH=PFbWIMGI>gso zbbR;E#z7*9n#3r}%RhN$xahofeZ_wEsmJ(2^b@XM_d8qcQo8-bkwTU|v+lJ1%W>n~ z2SEU}>2exh1lY?lJ}vXIb#l~v_;wD?4QFz2hFFqS4h#QNlVwkW#Y8~KFshh3+U2hm ztRrDMQ%eUJY~$Nw++UZ_Qg3|T|N7L+g)L&kZ`~g>45+Jh@_t3=9_m$bQYf=XdZe63 zr(Zbub`LWaOpJ!c7xpnsiHCNtj!eC}Z+cK}|3TMII$}8s#kY*lmvW|^CoOecXm%hG zp;%xK6GL=TxD00atIpeQi2y1CX}r~&@urJ%lc||U{;wYx+x{0+Y>{|BK9_A+b(V;L ztzYBU(;<lr4Q?w-J2%EzOkP$`>b|J(MF<Wka7G`tIL7(#%u}|U;qg7XuPgKRU4|}e z0IA3fITc7)Yz9tD+*)w__0{x&^nvZ11^y-`gaOqulLFv+##Uk3&7v{b?TSK>?N}bz zDViWMsKe{jB+z@Nb456`r^|30Ob+0wVNrhhO_L6DqF+q-!lZcl$9v(zOJ3TKjyw|) z+5g|OI-%_N@zqt62AUkLR%GR}Y7{Im-5%>!ll;rJ%K~}N2N37AyCkq+1MPC0`3#nQ z2%uF=CbLL4^V!g!&j5BE4DGgcv}(`<Deho?bJEU3gv}eGm65|rvD@w5ixJ<Q+qY6- zPY}K#kNDOm2MD1Uq|hAx##@Bkb?P2I3Wm{1+T2%r&30>?2}Y-b-5M)EMxkA1g+L*{ ztsu9wuk3v+2x=d?L%<px(2$pRt%l5)FKMIFm<^VP00nJVJswQCbS^jpS9yPOfA8p# zh2T5FH)0BW!4^>JEG;~RHV(@QHVjGuA{l;(mD&?;ki`NgS$XZkEZ_u54Sd9o^}j4> zSr8pOalzC1&wi9ZXQfd|*yw&FK^-YRn|{uuBV|Q?u)-{ffQQ=LXjg2k!?nv#$1o+# z5`^q_F96>WzIl4ES~;oI&}aigx5v>C2^1P{L}cqU{NRiCg|l9^CE7~sW5F%0tOotv zZ_Kz=+sK|L8+b$85bXjn>E)EOtiz%WXqkl#JpZH~D_TE)ReEEtlt;pWtzV9rdNmOM zzXClTmMjn{>#tV8=DqOfKi(JCUixrU$SZ*_@R$3`^9q(aDU18|JlR^;)lhtS4e?zW z@tt(=Wxa`SdjjSApHaz*N{TO!#kS^ipzIR(#+j2}!AL;dPobMpSFvc1#G$#0&+3ct zbxK0B0}f41@oCuo$bqoy2Y(*cUiR}Ll*{7pN!;>(SX+fnj`gN-d1BvOeF>PaR*two zF=ZN{3ws_fnKBdR5l18KJ0YC2KA;XL!$?)uSiCMvSw`K6CA?$*Ga{c!?EbNXPMrSP z9xLK~c7}WZ@+-0IP9L*mERXw@Qp21;4+xBrX1@X4U}t9$#$I@O%igf(@lVGI_P_8v zzC}#pL}|35j48AR<69z?6(-{b->k;B<=~q}e4o0H_@WHKH?J_wQ<hQVgl8B#UVPQj zeg412=Gl&L|6hG6p6teyM(mmxTFefxG=kW@EQ#C7n*RDN--@8z9}C0N#uSlEpsh#@ z0WN`Txjmc=(fJlsV(!%YKqjwjx>g!f7bXPEhuFv&*_ni)qguEY4Bc<Muif--asS>} z?nK<yZ`=z&zJFU-I^l?5NNb#83LW?=nCu@3xCkO+@np4kmc!ER@f^(++E~vxtJu0M z+fZJnN~!;!NMff1)HWO(z_Ng1QmNq(W_>>d#6WhoGQ9~bT~y3h1V)p<JU|<T#`8-@ z6nv4FNQ69qO-!M}2g;mvvWTt!=mK;S4(>?8_=+T6ki^Dlg))z+tW#Dgb6G2LSte9y zbmJ5@#!$j8{e>*L8WN82%t@%6Xec&Fz$$Z;sJQOD1DGE1w^qytyjxJ_SYBmAkHjuj zP*f44yy_7l6+4%M6&hldI-P@ET$>&_z^0c}Z7o9=C#WG>!zi{4*)N7rp&7F;3iM_G zz8V!Aq|Bn!bv`>cJrM`><S95};V)zXt`wRW4R|&ImB_Ybj$7RFJkK#L@IK`{=lI|S zkGU`B^}3~!a>(<8F=x`_6DOscUWhUTmV*FlsZvWCi^<y5iR2wdJYaJsI$)ykCAUir z><M@t#kp;^NXZGYr-dj4-_mS<Dy5O3nS_DI>iu!-b4vx6Yll`82k2C`1b-=%xmci* zA1~V_Mv2GkG+~swbs|_=@XccCVq2$N>hx13V?zS1U{BU*+_JTHpF=QSDGJ@I6}elN zlVK|+NV$lt+@43l6M4ZBxpr7(Cbr9BnyQt0`~)j>R%6?#@7WRjS*I6;LMM{i+!|J1 zzG>5@pF8u+Gd~db&n(L_!I$M(mi7I_@$vEgmVP6CYqcs}$36td2o&Ubj(z55-ZDxj z$~|}8b=M!na*sNST`qy?Q3_6C_e<X46$2Pg0N-n`z4mQqoN>mD^%@E%5?}1&nfmzN zefQlrr)g?U5vJtDU_&R8l$inc)UsvEPP^{9>pr@2<;q_ofY{c+go%j>fMz3I8Wgd= zV~fN_;BRQaJzKVHdH2?>TQTc=u4a`?!Cz!Bd0cSo*`Px_A8{V5nR)rt)YO{In>XJY z@%_b<jqk$`Km5)g{pd$n4(3SB)aeqlbD>!4xn_oLj%+A11MsO;t5&Uvpj-fu2@t>n z&^#unDi%<Jtis>g?e;10Uib`iSN$wKW9t=5#LT6dN9@Lhv0c+c@fN~Z28BNDwA0Rv zxSW3y@#Sx)#(P~HPyH88*Uyr^K%7H91M$t}{9u#Abpl11k)o+F6T7_&f(RKvz_YBu zg!4>ZK5i%1tXcD#xce}QuX~7|!+u3r98qOXjWQ?3(Q1h;%B@PvnsIen8S%YzY;5ep zlZY?Nn~3;gg^VqNZxNPA1YcrIo4--1lO|I`%#39O{G4;nIdA>?_3u69lv6fa+e{h4 zfT($_EoYA{qhQN!ardK-K6>-6UAul9^XKt=itM!=Sk~8IKk%5+z))^C-Nbef-V-Ul z(B**x2cGM8yPev;PuYXGW|7$6qRb$Q6)~N9?z!h)aOIU(zAxhYmPNo9HummE9(m-W zyLa#25zloEzIs2!j=v!di!bx2@R}mN(7^Xu;>%<dyBx|Xq^UuLzUr#0u2{Qv?axNL z?zOQo*YklCV7pI&W5RCJ5&ov#B^{u%uejohn`dTberU=strKKHr6a`qqMK&fNZQy` z8rrI+9CfxzzAXSd=4(ZpcF)}0+=EfRdg#!h=NfH4o)>l|S!~#_;Z+geP0N=re{Fo` z#ljbLIs28beB~{dUV7<c1{dI4E;7En9;PPpCB*lkhaS2o;(MUMUvU|_CG0#wCnYlS z6_;Ih*`J^rBzT5Fp>#Gvq3j4}2Kz{?EE|E9B+vwbpz#`PaW7k8mV@&9&%pcfTIMyj zr~;2N(WtmyS<iyby#4Z!EaM$MeE6^Lyz|aa)Q)S%Fm>TY4@8+)Y>0BnC6|0EKEnuK zAK%YJd_NvSI8<ZYRhCwUPL!Q3Ltl8|h3||vxzKho5*}*olH#@Yn3doI+c%nxs9`28 zpB2^yQ>IcIlJ{1oKqI+qrsfOkVi^wG$f`HQ7ycifeDcYy3v^l&>j<8I{`v0$S&Z=Y z@r_ZR8!o^6^3OjJr6!9OFc#lL6k0-cRAwZAZ6A=yKAhTb763hGE6Or>9J`o)<tHa6 z@n-WH?2{c>aT}Kfi?DIEd@_y~+5%WXMcIrEqHJVjeD&(ph!*Trb|&}@_A~H($p~K; zU*;c+(XLCdykL!4Dx}d6<uG#y2zb0f7E>>#gy0Fld@~b1V6WF>H$?!n>$6>BKN%;F z`Pe-YJOHcgp!TG_r#dJE5J{O$^Ru34SlpM5%LcG)+Ku%!PBdBCFo_*(krBaoeLe_Z zJ};j$I!lVLuPkB%|CHj}tMQ%W=q8dzJjOIs=M8bMh_Y|rzW<0f+8zt;{}vw#DT&94 zFcq~D!%+Qg9E8y>OYK38kCp_Ni9*2Pl<6C<u~!967?0(;UAsDA0GA_}@!mKtV<VKY z!HS3r6!s{j2D}Gs#q^-4IX4;MJ!S9Sz2A<E`QunFhDdQfQC1dq1JklQZj48J(GTKl z@KAiM;whf?SRFxaQ+c6$A-=SqacuF8_W-<ewa?L^4UN=fL#zEf5hDvPiMGpoPCfP1 z>)_R^on{qDD+&fdiVfy<MR;K3ci98%P9UwKva;BZ6~&f$;cc^Q%ltY7OaRenyk}#K zm*w$#?$Z%NIjDOyIX0br_St`X|NZy>Q&ct^zDtCuTV(QRcV85v3%?cd-Q0}t2;b9B zKYb(cec*uyz7Un0BbseX7;P~#bi`_M<Hn7ji1E-jCsEXUMbcotG6_Ji3`YP6o|+)q zZCVzA&=Y6FC=+RyhkbUb5d>@RS)g?=N6XY61kZp(R$;lTVo39K5wC4eJ@wRfYv;+_ z2;#dk;`@j3nuXyz!uK?Uj3d6YJ9qBf#vahd_*)J`w`_DHnhRIsVQq*9i4SgLh&1LY z%wrlwyC7bpjsP3PeZ#d|!yBxQigtfw5PLoE$z;K1vU4b$a2m_BjXfEedLuA&rhTf( zF&@o~SC8-=4&Ue;ZmRv1F~QY$3QcOqLdJO`TN&%s8qf$b_Zzz!YmX5CdmcdQY%(?! z8^i+1-zCOrLu>jhEU$4yP1%LNS=&|aIVBVGk=#M6c+JEJ-=XkDS|%Ts44w~7R*Cjg zCl<c)f7v;k9ZPW-3h!n$@Bf~)xXtf{ju%Hd`eZAFu4OEtsp?`v@&UHvoS?z9-{WnH zl8*-Lt2+!c^bQO$ylLsAEHilw7W8>@d{rxQLbl;hnbR@1v}>p>{y$nASOlAjMwUk# z&t-`3<QsfeZuzSxh1eh18rxbU|3_m=&{_78IcWZkWgCW9LGeME=hC@p=+fYs`>D_T zIWx*EW$uO4SB{4k%$z6r`gW>ezLRg9FTRh}cDI$^cD=0{On47oh%i0OuvEr;FDsMD zvZY)d?ge~?Oo;w=d!GoL;g=5qD-d24&{zZ<HRlZeHO_bPHHVRg7ETH&qKONyd~>J~ z&_NZKhdF}R-+9xD|N3BfKCj_m9!o1(*2*mFgS8_MCg5bshgqz)VZM{^nq$p#Jld`j zicA350RdJCDI1W#ZP|hcOFr&3I0@m6WAUF}j+FxDnhLvoz}R-=xp8=Z!<uK+D%Uok z``sqrSA1_A-ASP?C=cx&EJZ6czHRgj{C5K3jbb<@RJCC%dk&1(0@PXpNpE5O^6;z& zU@b*S*q$}{zT&&|cdWn!yfwI~AsIszlw7<4X;Gf%(JQzoaS5Wo-CFzS^?dN`2fYS8 zAoD!tu08`--yo^{HZ$M=kKc#+PQF*O#aL24T5k{1q{ZG!mXgvsC~ts6tx8NRO;KYJ zgN(mbt6bJ!mXz3EYJy#2scTSlu5<XHsK5Sj9Iee&D5{5A$K*TAH&Wnj#6#1<gK$u( z29}coPEuG};#=<do99}*S^nl0rJhV-#xTh6n1<+V+^qe=Gacb|^)OGqzt1;PI!3_W z1ASY{vAbBDgJGzoIT*f)GTtB;tI(4u6ow%bc^eLnt7JSU9UJSWzOu%1eW^OSV;+Pd zkw0JY@Q?AGe4DM}_rycroD@=W$c_t$n}9h?2gy7t{*Bvl1WB`9nFh{UrT0heG6#i+ zV3~{$l2QScj6w{g^F4gKSJ^cwq;nu+)l`T0PQFU%k`2gspfl*vfUoTfE<j3JSnjmY z-)Ms4W&={*Rkq{cb-?(LFg&K7gr3GHDm))5x1$+m;dKNY<~#ZB!MCnM)6A4|sDlbe z+Q`V-sE#-%4z6(NJcd5VBo#ta5lp2`@S3HAL!Rf5)rN;Nhn@Bhvwi7>r9D>4ArEr( z%660QKk{WAIs=Vk&5GdcNL*Ax>?|M3*6OR04<|WXmEwe_x4Ok8UvGmqgI-VG1O3oL z!3RhldI#6ihWSpuXXE?2%5ld8#~YQP+y^ah;j`-ip5#BCgFXKE2)zh_66}+YoiNlo zOomA}>VTsS9l_z}=jUi!?$^XQ(C$}!C*Qq&pF?~fS2=tcGJvy2$ed3X<%*7%gM33L zJx7^`bymM36qO!`pb4L$E?doF{g;9s?saSr^YQt79Qfq>yL`{sTd0&{B!`w~*_t=F z<o>-(B$MpXKRTjZP(p3#dy&g^SD7F&Og%#;wPf3@>3UAcYx4%Py~^{&7~6N^&iHf{ zJad^xw>Fo_cZl!4HXEH3-d5$<+J#QvUc>Mp@1egbBnrMvZBSrC%>aw@f&-z9Pn=4T zOdR+*T{){hXvh^TgnISG(}bhhmvfPdZ>%g%zC(OZ@a@;3spV)5MBMpL1N5)%P`}FX z;-EPbW(aiS(kpen%(YnD=XtW82uQgf&(9`EypGD82D@ih=sqUj_k8OQ&E$puyEPPQ zu#@=~H%&U2Y)}G7m<(CW@p!|sP}TV|XZf~se;eA#%2R3k5XK+9G{aW8g6}^0zUMpa zp`+#(VKD$_t3<`O$_Sb8)AQZvRrr>(P2PBemBJ@H|DB<f3NtR@LY&_#*->rxXYw89 zdp%7#ZbFZmU)26=z@>njaH=I+yLkjqP8tYK#=MUqj9vz1B=$A$4{}dxFYqud4!fu2 zh$_eAJIq&BKhQL!9EU5WwD!*LGt)y*JkAM-8+5V;uvTi-GjZgAX5J3fXO%G=GUtSq zGjQg868JYBlkXVcdw5|*b-o5RU|;?g`FF@1Dy57JH{J$;@C~IGVR%Iei8mXw<vR4z zbGTKtS7;UJwa$*p&iUTKH-4Uc$N7$y?Ns;=_1MYJLa{T{(E7$kesWcynKQ*fZ@|IQ zOF%cPYvk~7^zz0mS7oTB$X!Z1LZ^Z6ck&(K`+iawz+wje6$nTWIj9tXEZb7=l11-0 zy+Rm662Cq1m$)m}Q6vVU^$|b_DToYWh)FqOvf&7Ukdzn%A^*UUK@1^+5K@j1QnZ=@ z%`C5_l1kR=)%NbdJgL<-_O!;&?y{@PRYvFfOB}woi^t>AY&HexcDsUj+RQV=-A8Om zH+9S*LN1^Fo4@cK`qlg<lSzq2qh5MGpFfRXB5l8e->+aB{E1RXJcr2wo+|>H_tV_n zIA|93m;_f6F?W4eiV>eRb|)lr>zecZR~0aOpwNc|03`HJ@QcBm&*uf0&1O&Im-{+? z8^3{-LWFC*e?Fj%(Maz~o?h0gz>r5hB($EfXi?8$C6f#~>SOl@4c|A0+VOalUau#> ze!tf;s?`&yG|_fL=eYlkWHw(pZa>AZ;+gz1?*510M_wiLKP@>BWg3>ko5l*Z(;ZVX z++zg*c3z&HzN`YoO{D&oC#HGZX*-+EN;;huhS6x`)z9T}0*uFF0SbkJ0PFSID+`4} zaz3ABI2_99bh0LB_k{!J@0@VX^YwatIlpM1<)qPQcx_!Q7Wmz3b1W7U;BvX(cPvZ1 z=d@Za0amM(L?RKdZlzMOgWn6<ST2|GEQHwgctu({h2SU_i^8zkY-G7y`twUdL<I6F zd=P^T)nDe6CHFW3Uo)*;d$G?kxO`lS$aKlgzOJ%_w7%6E-9C{>2!RF)M>)--Q_(p< zI2@L0wJPm)+x{PrrnU`e+&zF{1-yda&sXw`<py3-K-;_BZncd9>~=dZk9v3k4u=DN zqujX1#Fa`V9l)rAzsFsli!|*MEe8m{%H7=x-Jl*T0>U5C<HK=rr<+?`+rPq2Q%GxG z31?<s_DrU5=rqg9RU$yy!-b^<BnE&xI*A1iwB*+7b(u^i0-$rDMEZGLLwr2$zZ?fn z-yL^`-`gws9SjCColZqjtJORSoJyqxK)T=WOQ+KjKnJkp3WE}o8?&6NsAe)5<zC+2 zez$l2JWd@^6t|ZsYylD<fQphTk@yZsMEL?xP@uGk4k5vJpok(-0)mDnn*s?sI=U=K zG*GP4Wr^6WLcqy0nPd59ogB?PKSyXc0gp8DzwwNH-hFq@y>sWzceDN+V`=D{H*abT zRfJfDYm)d<JF-%(EYK04G}QobyUavs0LsX5@S5}>t>V^}_FAj~f|n6xsyX$FDhRN0 z+}c01%H6wn5$<Y8B-5Yzc=F_lUsxCZj8za;ogSCsdieMzPn7`brq}<~|5B)C^JbSY z-??*VCajK~Yu<8L=0dQ2rcm^!yh#W$-+A=tk>2mcS7yp89J<<Y-U(-Iq`#AabNfzC zcYr%6S$Ap`+BY)T(^u1o)HDk>7SMoPb0bkWVnL7DUqg60<<nli?0xw7QXF6LWtB5$ z&Wui<KJCJpv%*YKI37NB;z!&34Wf7#E?l5LZjL^DMa|yE47eKQz+K|}&cWglO_Ih< z#>Q6s%YB*Qd-Dd<SAt4$%UnhZAWJ*<gjKe7O=rJJ1JEFU^1Po%A1c1pV13O#*RNlf z!6tfzksSS1aY(Ay9LvW%d-m*t%iq6$U%OG%whv!<IsQs4mxYh!Yjygrb#4bhXRx`u zol;XI==59F&;def$=n%Tn~Kk!I|o&OYQ#;^9;0Uu9-xB-Zl&OOOL?>adVkRP)`~nr zqGZyR*REYtKg?=Xd!^>L_TooNq)%G5hy)s{A^PFi2fkp^WloO7_lqGMPr*q!wY%{6 zbXdva(>(LTkMi>3vA`Lmld%MVNp))R;K2jjaByN#ji4lTe=OWioK90PMbmQlVBJ9N z(oZ@>VH^g&NwqL~`H#XELF7B+2FV-f%9ShNyRbL7L4=<ky{O;w=g%{i1ln)r8otPa zBzom|=xV}72aw0y)$1VUA?tlx?^83SAp_{-q|mqmrIvNm-E`&bznOqjWW~#uOp%4% zC(!s~RiP^{Uc7LQhrsy4N+fEGQWx;|2aT^6xgsTqySux>PF1Uj;8>++o+Xra(y|&u z1|$CeTeohd4I(_{5?tIw@<938z{7_RTlkV@ZMfTxMwtx7Q%Pm=69Qz?^MIxRe1Gkn zkMCsYVR|>1z67L?&xX-f_V-p{j1X$K<aM#|jL3bbl~V~$Yl_9o(H7=L#N7eoE5lgS z0s)hOrvHoZi4MrUh9^RYUIunX^MbN%ZEY=#ZjEvK_U+~tts1xP!`HkV(^X<QvLCHv zRgI+NJ?U~u4wwNjs(wH^pSjhX`6=`|mxMW2{Q2|eqf3`AEiR@O3^b*=mPsLyuUW6t z?W8I6@#DwRCR!rbsvf@&K}qAPD+2#V3hV$)JvnH6-@JJ<x^d%%<2!SwUA=mBbn4Wp z*?-;H*;)Kg^`Y-yym*lfx?Cq#3KxQ^Sy4B~y?gi6r&AZT*ENxU+GmgC%}snue~$0U zD}__r`JF-Gc|J2h16*$wo^;0N+P{B}7GRt_OHajLbNIQ}w8ou_Qn>gOTu$P7jkCeI z(db8Rr3u(oajlpC3ci|w@CAd}%J|9^Cn_N&AWiMd?B&>Kj!jPcU<ke+6#KHeA3Ao` z&MC(fijttDg`FXg4muYsHA#32@>C}>Q)VI-+9+p(v^3ur2m+q4$qY(ISdyzZ4`pv` z5={-$l{3EG51m-HvL}5~_)0TN14~n@Vt<IT?d|O`_P@pV{qktLiXfw92)GgNh%Au4 z&Yn*Frh7@CWU@f@;~DI^du^=VD7@VF=3@dnJk&qqKezyBMbRk;;j6V%oGLLDQw4K5 zc4@#Q&g}gDl<*a$xP1BYjJ|2SB7|DfX1qL@e|3Dpb_L2YwTsftj~?qv=SO@1io4dh zvzfl(TWRRHHUKQOO^3YtNK3wUQj;g?251L`n(iwA&7&Gpa5A}Jx)-4wWy+oivw<O` zxJ4(QBEC`%aN&=HuWXbE@E;yNI;EDo{;hm~ZfIyQx6CPNRSPhFr1+VD1~lH|jF0rK z(tn=I;l_l3h6mO%$2&i)Yy;|x@uja^hUEfzTdJf(wNo9Ctg%!3g75EZd<Ws%f$!1` z{sB6|tS`%@v^!6RaultWR(85%1Zo}^wz;{vXhSwhchP0oq>tr~xf@!Q@oI^~DV~lt z&&{S}_@%d3iD@&l&F=$vi*6*Ho1Yo->l)vs`0Dk(@B-hV8hWaJp&RPp)vH%eOXSth z<?jD_qm<gN;&k38CvtE?2xyD8X&(HTQ{d~@ueEq0gC#-Z0_xGVjdM>vPvax`TQ0{} z$5E{Q{{H@!XsrH9a_9!#P`k;?moJ~5IB{aT{Ex4MZ|QUFc;&&G=@CeL!O>R?!K}ue z9bcZStvo!(j~`Eb^&1l3#r2~Y?{$2WcI3^&=g0|k@WUM6pOnS`p$5l34L#<$3v>~j zz2dt1p*YvSDFben!N+Q=5-y=J&(ocg1fN1Xz61Aj|Earp)ECB&c8{Dqd2)2@*s+}M zXqz`rb@@1^z;+44PT|k<z#<vWzie-BC*UsBRB-MP=z{NW#rprgD2;DRKbz(Ej8#Kh z`R{hxfu|wyMJQImSI^mc_tEiHo7Oojjf|++7_ymno;`c^qkfuiM9wny=TVQ$1zzm` zORIWMb%VCqSHAuqmk$H-({<eV2KGdcA<#U6&4w^Ge2>nno*$WgzAoSfrmF7(-=>DH zY3VMWtCI}?=fZr(K&x~i)Ll}JCWofjY$$9~QGBk#3^suehIf`a<?xPb7I_Nt=LCFG z4r+kj_4}Yxs6(K^cU=-E9=m2(K>`=TNgag{$7gE|k{mg}?%i7$7{`0-61Xi*;PW?P WAV6(21mh6^0000<MNUMnLSTaBggD0l literal 16799 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 diff --git a/index.html b/index.html index 8c34da4..914a2f3 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ <html> <head> - <meta charset='utf-8' /> - <meta http-equiv="X-UA-Compatible" content="chrome=1" /> - <meta name="description" content="Scratch Extensions : Extensions for Scratch 2.0" /> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="chrome=1"> + <meta name="description" content="Scratch Extensions : Extensions for Scratch 2.0"> <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css"> @@ -101,7 +101,7 @@ <h3> <a name="command-blocks-that-wait" class="anchor" href="#command-blocks-that-wait"><span class="octicon octicon-link"></span></a>Command blocks that wait</h3> -<p>Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the <code>console.log</code> statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.</p> +<p>Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the <code>console.log</code> statement in the code - most Javascript methods, as well as <a href="http://jquery.com/">jQuery</a> methods will work fine in an extension.</p> <div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> @@ -260,6 +260,211 @@ <span class="c1">// Register the extension</span> <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Alarm extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> <span class="p">})();</span> +</pre></div> + +<h2> +<a name="hardware-support" class="anchor" href="#hardware-support"><span class="octicon octicon-link"></span></a>Hardware Support</h2> + +<p>Scratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:</p> + +<ul> +<li>Serial devices such as the PicoBoard</li> +<li>USB HID devices such as joysticks or the LEGO WeDo</li> +</ul><p>Extensions that request hardware access are required to implement two additional methods on the extension instance: <code>_deviceConnected()</code> and <code>_deviceRemoved()</code>. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example Name'</span><span class="p">,</span> <span class="nx">descriptor_object</span><span class="p">,</span> <span class="nx">ext_instance</span><span class="p">[,</span> <span class="nx">hardware_info</span><span class="p">]);</span> +</pre></div> + +<p>The <code>_getStatus()</code> method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">device</span><span class="p">)</span> <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Device not connected'</span><span class="p">};</span> + <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Device connected'</span><span class="p">};</span> +<span class="p">}</span> +</pre></div> + +<p>The value returned by <code>_getStatus()</code> corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The <code>msg</code> property can be used to provide more specific information.</p> + +<table> +<thead><tr> +<th>Value</th> +<th>Color</th> +<th>Meaning</th> +</tr></thead> +<tbody> +<tr> +<td>0</td> +<td>red</td> +<td>error</td> +</tr> +<tr> +<td>1</td> +<td>yellow</td> +<td>not ready</td> +</tr> +<tr> +<td>2</td> +<td>green</td> +<td>ready</td> +</tr> +</tbody> +</table><p>The details of the <code>hardware_info</code> parameter and the <code>_deviceConnected()</code> and <code>_deviceRemoved()</code> methods are described below in sections specific to each type of device.</p> + +<p><em><em>API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as <code>read()</code> for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available.</em></em></p> + +<h3> +<a name="usb-hid-support" class="anchor" href="#usb-hid-support"><span class="octicon octicon-link"></span></a>USB HID Support</h3> + +<p><em>An example HID device extension is available <a href="http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js">here</a>.</em> +<em>More information about the HID protocol is available <a href="http://www.usb.org/developers/devclass_docs/HID1_11.pdf">here</a>.</em></p> + +<p>To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> + +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">hid_info</span> <span class="o">=</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">'hid'</span><span class="p">,</span> <span class="nx">vendor</span><span class="o">:</span> <span class="mh">0x0694</span><span class="p">,</span> <span class="nx">product</span><span class="o">:</span> <span class="mh">0x0003</span><span class="p">};</span> +<span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">,</span> <span class="nx">hid_info</span><span class="p">);</span> +</pre></div> + +<p>The <code>vendor</code> and <code>product</code> values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the <code>0x</code> prefix in the JavaScript above.</p> + +<p>If a device is connected with matching vendor and product IDs, Scratch will call the <code>_deviceConnected()</code> method on your extension and pass an object representing that device. Your <code>_deviceConnected()</code> method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:</p> + +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">poller</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> +<span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceConnected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> + + <span class="nx">device</span> <span class="o">=</span> <span class="nx">dev</span><span class="p">;</span> + <span class="nx">device</span><span class="p">.</span><span class="nx">open</span><span class="p">();</span> + + <span class="nx">poller</span> <span class="o">=</span> <span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="nx">rawData</span> <span class="o">=</span> <span class="nx">device</span><span class="p">.</span><span class="nx">read</span><span class="p">();</span> + <span class="p">},</span> <span class="mi">20</span><span class="p">);</span> +<span class="p">};</span> +</pre></div> + +<p>Once a connection to your device is established, your extension may use the <code>read()</code> and <code>write()</code> methods on the device object to communicate with it. These methods use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays">ArrayBuffer</a> objects to contain data being sent or received.</p> + +<ul> +<li> +<code>device.read(48)</code> will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. <em><em>This method is likely to change soon. See the API Note above.</em></em> +</li> +<li> +<code>device.write(buffer)</code> will send the given ArrayBuffer's data to the device.</li> +</ul><p>Your extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceRemoved</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="nx">device</span> <span class="o">!=</span> <span class="nx">dev</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> + <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> + <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> +<span class="p">};</span> +</pre></div> + +<p>Finally, your extension's <code>_shutdown()</code> method will be executed when the extension itself is shut down. For example:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> + <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="nx">device</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span> + <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> +<span class="p">}</span> +</pre></div> + +<h3> +<a name="serial-device-support" class="anchor" href="#serial-device-support"><span class="octicon octicon-link"></span></a>Serial Device Support</h3> + +<p><em>An example serial device extension is available <a href="http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js">here</a>.</em></p> + +<p>To let the extension system know that your extension is interested in serial devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> + +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">serial_info</span> <span class="o">=</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">'serial'</span><span class="p">};</span> +<span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">,</span> <span class="nx">serial_info</span><span class="p">);</span> +</pre></div> + +<p>Your extension's <code>_deviceConnected()</code> method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your <code>_deviceConnected()</code> will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.</p> + +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">potentialDevices</span> <span class="o">=</span> <span class="p">[];</span> +<span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceConnected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> + <span class="nx">potentialDevices</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">dev</span><span class="p">);</span> + + <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">device</span><span class="p">)</span> <span class="p">{</span> + <span class="nx">tryNextDevice</span><span class="p">();</span> + <span class="p">}</span> +<span class="p">}</span> +</pre></div> + +<p>To communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on <a href="http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html">Boost.Asio's serial port options</a>. For a PicoBoard:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">device</span><span class="p">.</span><span class="nx">open</span><span class="p">({</span> <span class="nx">stopBits</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bitRate</span><span class="o">:</span> <span class="mi">38400</span><span class="p">,</span> <span class="nx">ctsFlowControl</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span> +</pre></div> + +<p>The full set of options available for a serial port are as follows:</p> + +<table> +<thead><tr> +<th>Option</th> +<th>Default</th> +<th>Valid values</th> +<th>Description</th> +</tr></thead> +<tbody> +<tr> +<td>bitRate</td> +<td>9600</td> +<td>Any valid baud rate</td> +<td>Up to The bit (or baud) rate at which to communicate.</td> +</tr> +<tr> +<td>bufferSize</td> +<td>4096</td> +<td>Up to 8192</td> +<td>The maximum amount of data that can be received at a time.</td> +</tr> +<tr> +<td>ctsFlowControl</td> +<td>1 (software)</td> +<td>0 (none), 1 (software), 2 (hardware)</td> +<td>The type of flow control to use.</td> +</tr> +<tr> +<td>dataBits</td> +<td>8</td> +<td>5, 6, 7, 8</td> +<td>The number of data bits per character.</td> +</tr> +<tr> +<td>parityBit</td> +<td>0 (none)</td> +<td>0 (none), 1 (odd), 2 (even)</td> +<td>Whether and how to use the parity bit in each character.</td> +</tr> +<tr> +<td>stopBits</td> +<td>1 (1.5 bits)</td> +<td>0 (1 bit), 1 (1.5 bits), 2 (2 bits)</td> +<td>The number of stop bits per character.</td> +</tr> +</tbody> +</table><p>Once a connection to your device is established, your extension may use the <code>send()</code> method to send data to your device, and the <code>set_receive_handler()</code> method to register a function to handle received data. These methods use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays">ArrayBuffer</a> objects to contain data being sent or received.</p> + +<ul> +<li> +<code>device.send(buffer)</code> will send the given ArrayBuffer's data to the device.</li> +<li> +<code>device.set_receive_handler(myReceiveHandler)</code> will result in <code>myReceiveHandler(buffer)</code> being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.</li> +</ul><p>Your extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceRemoved</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="nx">device</span> <span class="o">!=</span> <span class="nx">dev</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> + <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> + <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> +<span class="p">};</span> +</pre></div> + +<p>Finally, your extension's <code>_shutdown()</code> method will be executed when the extension itself is shut down. For example:</p> + +<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> + <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> + <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="nx">device</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span> + <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> +<span class="p">}</span> </pre></div> </section> </div> diff --git a/params.json b/params.json index cb90a9a..999f803 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"Writing Extensions for Scratch 2.0\r\n===================================\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\nAdding Blocks\r\n--------------\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as JQuery methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 33824316bce99d02b3d4f8c9a0f156c4fddd37f3 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Thu, 31 Jul 2014 15:42:45 -0700 Subject: [PATCH 13/47] Create gh-pages branch via GitHub --- index.html | 29 +++++++++++++++++++++++++++++ params.json | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 914a2f3..a36362e 100644 --- a/index.html +++ b/index.html @@ -32,6 +32,35 @@ <div id="main_content_wrap" class="outer"> <section id="main_content" class="inner"> <h1> +<a name="contents" class="anchor" href="#contents"><span class="octicon octicon-link"></span></a>Contents</h1> + +<ol> +<li> +<a href="#writing-extensions-for-scratch-20">Writing Extensions for Scratch 2.0</a> + +<ol> +<li> +<a href="#adding-blocks">Adding Blocks</a> + +<ol> +<li><a href="#command-blocks">Command blocks</a></li> +<li><a href="#command-blocks-that-wait">Command blocks that wait</a></li> +<li><a href="#reporter-blocks">Reporter blocks</a></li> +<li><a href="#reporter-blocks-that-wait">Reporter blocks that wait</a></li> +<li><a href="#hat-blocks">Hat blocks</a></li> +</ol> +</li> +<li> +<a href="#hardware-support">Hardware Support</a> + +<ol> +<li><a href="#usb-hid-support">USB HID Support</a></li> +<li><a href="#serial-device-support">Serial Device Support</a></li> +</ol> +</li> +</ol> +</li> +</ol><h1> <a name="writing-extensions-for-scratch-20" class="anchor" href="#writing-extensions-for-scratch-20"><span class="octicon octicon-link"></span></a>Writing Extensions for Scratch 2.0</h1> <p>Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:</p> diff --git a/params.json b/params.json index 999f803..ccd92c3 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From b311089cdb0e7a301db93311e1c5287bd70b82a7 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 1 Aug 2014 10:15:09 -0700 Subject: [PATCH 14/47] Create gh-pages branch via GitHub --- index.html | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ params.json | 2 +- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index a36362e..a89fa70 100644 --- a/index.html +++ b/index.html @@ -51,6 +51,15 @@ </ol> </li> <li> +<a href="#the-extension-descriptor">The Extension Descriptor</a> + +<ol> +<li><a href="#blocks">Blocks</a></li> +<li><a href="#menus">Menus</a></li> +<li><a href="#url">URL</a></li> +</ol> +</li> +<li> <a href="#hardware-support">Hardware Support</a> <ol> @@ -291,6 +300,81 @@ <span class="p">})();</span> </pre></div> +<h2> +<a name="the-extension-descriptor" class="anchor" href="#the-extension-descriptor"><span class="octicon octicon-link"></span></a>The Extension Descriptor</h2> + +<p>The extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:</p> + +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> + <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> + <span class="p">[</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'turn motor on for %n secs'</span><span class="p">,</span> <span class="s1">'motorOnFor'</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> + <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'turn motor on'</span><span class="p">,</span> <span class="s1">'allMotorsOn'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'turn motor off'</span><span class="p">,</span> <span class="s1">'allMotorsOff'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'set motor power %n'</span><span class="p">,</span> <span class="s1">'startMotorPower'</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> + <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'set motor direction %m.motorDirection'</span><span class="p">,</span> <span class="s1">'setMotorDirection'</span><span class="p">,</span> <span class="s1">'this way'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when distance %m.lessMore %n'</span><span class="p">,</span> <span class="s1">'whenDistance'</span><span class="p">,</span> <span class="s1">'<'</span><span class="p">,</span> <span class="mi">20</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when tilt %m.eNe %n'</span><span class="p">,</span> <span class="s1">'whenTilt'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'distance'</span><span class="p">,</span> <span class="s1">'getDistance'</span><span class="p">],</span> + <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'tilt'</span><span class="p">,</span> <span class="s1">'getTilt'</span><span class="p">]</span> + <span class="p">],</span> + <span class="nx">menus</span><span class="o">:</span> <span class="p">{</span> + <span class="nx">motorDirection</span><span class="o">:</span> <span class="p">[</span><span class="s1">'this way'</span><span class="p">,</span> <span class="s1">'that way'</span><span class="p">,</span> <span class="s1">'reverse'</span><span class="p">],</span> + <span class="nx">lessMore</span><span class="o">:</span> <span class="p">[</span><span class="s1">'<'</span><span class="p">,</span> <span class="s1">'>'</span><span class="p">],</span> + <span class="nx">eNe</span><span class="o">:</span> <span class="p">[</span><span class="s1">'='</span><span class="p">,</span><span class="s1">'not ='</span><span class="p">]</span> + <span class="p">},</span> + <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://info.scratch.mit.edu/WeDo'</span> +<span class="p">};</span> +</pre></div> + +<h3> +<a name="blocks" class="anchor" href="#blocks"><span class="octicon octicon-link"></span></a>Blocks</h3> + +<p>The blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.</p> + +<p>The full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the <a href="#reporter-blocks-that-wait">Reporter blocks that wait</a> and <a href="#command-blocks-that-wait">Command blocks that wait</a> sections.</p> + +<table> +<thead><tr> +<th>Op Code</th> +<th>Meaning</th> +</tr></thead> +<tbody> +<tr> +<td> +<code>' '</code> (space)</td> +<td>Synchronous command</td> +</tr> +<tr> +<td><code>'w'</code></td> +<td>Asynchronous command</td> +</tr> +<tr> +<td><code>'r'</code></td> +<td>Synchronous reporter</td> +</tr> +<tr> +<td><code>'R'</code></td> +<td>Asynchronous reporter</td> +</tr> +<tr> +<td><code>'h'</code></td> +<td>Hat block (always synchronous)</td> +</tr> +</tbody> +</table><p>Each block argument is identified by a <code>%</code> character and the character following it specifies the type. The types are: <code>%n</code> for number, <code>%s</code> for string, and <code>%m</code> for menu. Menus also identify which menu to use with a period and the name of the menu like this: <code>%m.menuName</code>.</p> + +<h3> +<a name="menus" class="anchor" href="#menus"><span class="octicon octicon-link"></span></a>Menus</h3> + +<p>The <code>menus</code> property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.</p> + +<p>For example, the <code>setMotorDirection</code> block in the example above includes <code>%m.motorDirection</code>, which will cause it to display a menu with <code>'this way'</code>, <code>'that way'</code>, and <code>'reverse'</code> as options.</p> + +<h3> +<a name="url" class="anchor" href="#url"><span class="octicon octicon-link"></span></a>URL</h3> + +<p>The <code>url</code> property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the <code>'About [extension name]...'</code> menu item within Scratch, this is the URL that will be opened.</p> + <h2> <a name="hardware-support" class="anchor" href="#hardware-support"><span class="octicon octicon-link"></span></a>Hardware Support</h2> diff --git a/params.json b/params.json index ccd92c3..a8d1ea9 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From d626efd76e7cdabec8baa2e5925b8f7465c76d53 Mon Sep 17 00:00:00 2001 From: Amos Blanton <amos@scratch.mit.edu> Date: Fri, 1 Aug 2014 13:35:44 -0400 Subject: [PATCH 15/47] Create README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec0f3d3 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +scratch-extension-docs +====================== + +Documentation and sample code for creating extensions with Scratch 2.0. +http://llk.github.io/scratch-extensions/ From 4e6ded0ab8e0c071495a7a6d5c274fdbf329ae6e Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@acm.org> Date: Fri, 1 Aug 2014 10:58:46 -0700 Subject: [PATCH 16/47] Added example hardware extensions --- joystickExtension.js | 76 ++++++++++++++++ picoExtension.js | 202 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 278 insertions(+) create mode 100644 joystickExtension.js create mode 100644 picoExtension.js diff --git a/joystickExtension.js b/joystickExtension.js new file mode 100644 index 0000000..2e72d29 --- /dev/null +++ b/joystickExtension.js @@ -0,0 +1,76 @@ +// joystickExtension.js +// Shane M. Clements, November 2013 +// Joystick Scratch Extension +// +// This is an extension for development and testing of the Scratch Javascript Extension API. + +new (function() { + var device = null; + var input = null; + var poller = null; + var ext = this; + + ext._deviceConnected = function(dev) { + if(device) return; + + device = dev; + device.open(); + + poller = setInterval(function() { + input = device.read(48); + }, 10); + +// setInterval(function() { console.log(input); }, 100); + }; + + ext._deviceRemoved = function(dev) { + if(device != dev) return; + device = null; + stopPolling(); + }; + + function stopPolling() { + if(poller) clearInterval(poller); + poller = null; + } + + ext._shutdown = function() { + if(poller) clearInterval(poller); + poller = null; + + if(device) device.close(); + device = null; + } + + ext._getStatus = function() { + if(!device) return {status: 1, msg: 'Controller disconnected'}; + return {status: 2, msg: 'Controller connected'}; + } + + // Converts a byte into a value of the range -1 -> 1 with two decimal places of precision + function convertByteStr(byte) { return (parseInt(byte, 16) - 128) / 128; } + ext.readJoystick = function(name) { + var retval = null; + switch(name) { + case 'leftX': retval = convertByteStr(input[12] + input[13]); break; + case 'leftY': retval = -convertByteStr(input[14] + input[15]); break; + case 'rightX': retval = convertByteStr(input[16] + input[17]); break; + case 'rightY': retval = -convertByteStr(input[18] + input[19]); break; + } + + // If it's hardly off center then treat it as centered + if(Math.abs(retval) < 0.1) retval = 0; + + return retval.toFixed(2); + } + + var descriptor = { + blocks: [ + ['r', 'get joystick %m.joystickPart', 'readJoystick', 'leftX'] + ], + menus: { + joystickPart: ['leftX', 'leftY', 'rightX', 'rightY'] + } + }; + ScratchExtensions.register('Joystick', descriptor, ext, {type: 'hid', vendor:0x054c, product:0x0268}); +})(); diff --git a/picoExtension.js b/picoExtension.js new file mode 100644 index 0000000..face82d --- /dev/null +++ b/picoExtension.js @@ -0,0 +1,202 @@ +// picoExtension.js +// Shane M. Clements, February 2014 +// PicoBoard Scratch Extension +// +// This is an extension for development and testing of the Scratch Javascript Extension API. + +(function(ext) { + var device = null; + var rawData = null; + + // Sensor states: + var channels = { + slider: 7, + light: 5, + sound: 6, + button: 3, + 'resistance-A': 4, + 'resistance-B': 2, + 'resistance-C': 1, + 'resistance-D': 0 + }; + var inputs = { + slider: 0, + light: 0, + sound: 0, + button: 0, + 'resistance-A': 0, + 'resistance-B': 0, + 'resistance-C': 0, + 'resistance-D': 0 + }; + + ext.resetAll = function(){}; + + // Hats / triggers + ext.whenSensorConnected = function(which) { + return getSensorPressed(which); + }; + + ext.whenSensorPass = function(which, sign, level) { + if (sign == '<') return getSensor(which) < level; + return getSensor(which) > level; + }; + + // Reporters + ext.sensorPressed = function(which) { + return getSensorPressed(which); + }; + + ext.sensor = function(which) { return getSensor(which); }; + + // Private logic + function getSensorPressed(which) { + if (device == null) return false; + if (which == 'button pressed' && getSensor('button') < 1) return true; + if (which == 'A connected' && getSensor('resistance-A') < 10) return true; + if (which == 'B connected' && getSensor('resistance-B') < 10) return true; + if (which == 'C connected' && getSensor('resistance-C') < 10) return true; + if (which == 'D connected' && getSensor('resistance-D') < 10) return true; + return false; + } + + function getSensor(which) { + return inputs[which]; + } + + var inputArray = []; + function processData() { + var bytes = new Uint8Array(rawData); + + inputArray[15] = 0; + + // TODO: make this robust against misaligned packets. + // Right now there's no guarantee that our 18 bytes start at the beginning of a message. + // Maybe we should treat the data as a stream of 2-byte packets instead of 18-byte packets. + // That way we could just check the high bit of each byte to verify that we're aligned. + for(var i=0; i<9; ++i) { + var hb = bytes[i*2] & 127; + var channel = hb >> 3; + var lb = bytes[i*2+1] & 127; + inputArray[channel] = ((hb & 7) << 7) + lb; + } + + if (watchdog && (inputArray[15] == 0x04)) { + // Seems to be a valid PicoBoard. + clearTimeout(watchdog); + watchdog = null; + } + + for(var name in inputs) { + var v = inputArray[channels[name]]; + if(name == 'light') { + v = (v < 25) ? 100 - v : Math.round((1023 - v) * (75 / 998)); + } + else if(name == 'sound') { + //empirically tested noise sensor floor + v = Math.max(0, v - 18) + v = (v < 50) ? v / 2 : + //noise ceiling + 25 + Math.min(75, Math.round((v - 50) * (75 / 580))); + } + else { + v = (100 * v) / 1023; + } + + inputs[name] = v; + } + + //console.log(inputs); + rawData = null; + } + + function appendBuffer( buffer1, buffer2 ) { + var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength ); + tmp.set( new Uint8Array( buffer1 ), 0 ); + tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength ); + return tmp.buffer; + } + + // Extension API interactions + var potentialDevices = []; + ext._deviceConnected = function(dev) { + potentialDevices.push(dev); + + if (!device) { + tryNextDevice(); + } + } + + var poller = null; + var watchdog = null; + function tryNextDevice() { + // If potentialDevices is empty, device will be undefined. + // That will get us back here next time a device is connected. + device = potentialDevices.shift(); + if (!device) return; + + device.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 }); + device.set_receive_handler(function(data) { + //console.log('Received: ' + data.byteLength); + if(!rawData || rawData.byteLength == 18) rawData = new Uint8Array(data); + else rawData = appendBuffer(rawData, data); + + if(rawData.byteLength >= 18) { + //console.log(rawData); + processData(); + //device.send(pingCmd.buffer); + } + }); + + // Tell the PicoBoard to send a input data every 50ms + var pingCmd = new Uint8Array(1); + pingCmd[0] = 1; + poller = setInterval(function() { + device.send(pingCmd.buffer); + }, 50); + watchdog = setTimeout(function() { + // This device didn't get good data in time, so give up on it. Clean up and then move on. + // If we get good data then we'll terminate this watchdog. + clearInterval(poller); + poller = null; + device.set_receive_handler(null); + device.close(); + device = null; + tryNextDevice(); + }, 250); + }; + + ext._deviceRemoved = function(dev) { + if(device != dev) return; + if(poller) poller = clearInterval(poller); + device = null; + }; + + ext._shutdown = function() { + if(device) device.close(); + if(poller) poller = clearInterval(poller); + device = null; + }; + + ext._getStatus = function() { + if(!device) return {status: 1, msg: 'PicoBoard disconnected'}; + if(watchdog) return {status: 1, msg: 'Probing for PicoBoard'}; + return {status: 2, msg: 'PicoBoard connected'}; + } + + var descriptor = { + blocks: [ + ['h', 'when %m.booleanSensor', 'whenSensorConnected', 'button pressed'], + ['h', 'when %m.sensor %m.lessMore %n', 'whenSensorPass', 'slider', '>', 50], + ['b', 'sensor %m.booleanSensor?', 'sensorPressed', 'button pressed'], + ['r', '%m.sensor sensor value', 'sensor', 'slider'] + ], + menus: { + booleanSensor: ['button pressed', 'A connected', 'B connected', 'C connected', 'D connected'], + sensor: ['slider', 'light', 'sound', 'resistance-A', 'resistance-B', 'resistance-C', 'resistance-D'], + lessMore: ['>', '<'] + }, + url: '/info/help/studio/tips/ext/PicoBoard/' + }; + ScratchExtensions.register('PicoBoard', descriptor, ext, {type: 'serial'}); +})({}); From 9bd5ca946030f79acabdc58e0319bf9f350a969d Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@acm.org> Date: Fri, 1 Aug 2014 11:02:08 -0700 Subject: [PATCH 17/47] Updated URL with the name change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec0f3d3..af9c3e5 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ scratch-extension-docs ====================== Documentation and sample code for creating extensions with Scratch 2.0. -http://llk.github.io/scratch-extensions/ +http://llk.github.io/scratch-extension-docs From 1fed704e79bade7f5beb6eb13f74d59a3c1bdb69 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 1 Aug 2014 11:06:24 -0700 Subject: [PATCH 18/47] Create gh-pages branch via GitHub --- index.html | 10 +++++----- params.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index a89fa70..9b483d7 100644 --- a/index.html +++ b/index.html @@ -16,14 +16,14 @@ <!-- HEADER --> <div id="header_wrap" class="outer"> <header class="inner"> - <a id="forkme_banner" href="https://github.com/LLK/scratch-extensions">View on GitHub</a> + <a id="forkme_banner" href="https://github.com/LLK/scratch-extension-docs">View on GitHub</a> <h1 id="project_title">Scratch Extensions</h1> <h2 id="project_tagline">Extensions for Scratch 2.0</h2> <section id="downloads"> - <a class="zip_download_link" href="https://github.com/LLK/scratch-extensions/zipball/master">Download this project as a .zip file</a> - <a class="tar_download_link" href="https://github.com/LLK/scratch-extensions/tarball/master">Download this project as a tar.gz file</a> + <a class="zip_download_link" href="https://github.com/LLK/scratch-extension-docs/zipball/master">Download this project as a .zip file</a> + <a class="tar_download_link" href="https://github.com/LLK/scratch-extension-docs/tarball/master">Download this project as a tar.gz file</a> </section> </header> </div> @@ -428,7 +428,7 @@ <h3> <a name="usb-hid-support" class="anchor" href="#usb-hid-support"><span class="octicon octicon-link"></span></a>USB HID Support</h3> -<p><em>An example HID device extension is available <a href="http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js">here</a>.</em> +<p><em>An example HID device extension is available <a href="joystickExtension.js">here</a>.</em> <em>More information about the HID protocol is available <a href="http://www.usb.org/developers/devclass_docs/HID1_11.pdf">here</a>.</em></p> <p>To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> @@ -483,7 +483,7 @@ <h3> <a name="serial-device-support" class="anchor" href="#serial-device-support"><span class="octicon octicon-link"></span></a>Serial Device Support</h3> -<p><em>An example serial device extension is available <a href="http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js">here</a>.</em></p> +<p><em>An example serial device extension is available <a href="picoExtension.js">here</a>.</em></p> <p>To let the extension system know that your extension is interested in serial devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> diff --git a/params.json b/params.json index a8d1ea9..eba0bef 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/sixaxisExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](http://scratch.mit.edu/scratchr2/static/js/scratch_extensions/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](joystickExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 3c69fe28d47c7d2dc65c7715721dc49b5bfb1bf4 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 1 Aug 2014 11:20:14 -0700 Subject: [PATCH 19/47] Create gh-pages branch via GitHub --- index.html | 4 ++-- params.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 9b483d7..0ac10eb 100644 --- a/index.html +++ b/index.html @@ -428,7 +428,7 @@ <h3> <a name="usb-hid-support" class="anchor" href="#usb-hid-support"><span class="octicon octicon-link"></span></a>USB HID Support</h3> -<p><em>An example HID device extension is available <a href="joystickExtension.js">here</a>.</em> +<p><em>An example HID device extension is available <a href="https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js">here</a>.</em> <em>More information about the HID protocol is available <a href="http://www.usb.org/developers/devclass_docs/HID1_11.pdf">here</a>.</em></p> <p>To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> @@ -483,7 +483,7 @@ <h3> <a name="serial-device-support" class="anchor" href="#serial-device-support"><span class="octicon octicon-link"></span></a>Serial Device Support</h3> -<p><em>An example serial device extension is available <a href="picoExtension.js">here</a>.</em></p> +<p><em>An example serial device extension is available <a href="https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js">here</a>.</em></p> <p>To let the extension system know that your extension is interested in serial devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> diff --git a/params.json b/params.json index eba0bef..2e86c85 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](joystickExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 5861959ac4ab4a48526cd202c4da42e7a031b1a6 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@acm.org> Date: Fri, 1 Aug 2014 20:03:01 -0700 Subject: [PATCH 20/47] Converted site to use Jekyll Most edits should now be done on index.md directly. See the README for more information. --- .gitignore | 1 + Gemfile | 2 + Gemfile.lock | 115 ++++++++ README.md | 47 ++++ _config.yml | 22 ++ _layouts/default.html | 49 ++++ index.html | 596 ------------------------------------------ index.md | 439 +++++++++++++++++++++++++++++++ javascripts/main.js | 1 - params.json | 1 - 10 files changed, 675 insertions(+), 598 deletions(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README.md create mode 100644 _config.yml create mode 100644 _layouts/default.html delete mode 100644 index.html create mode 100644 index.md delete mode 100644 javascripts/main.js delete mode 100644 params.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0baf015 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/_site diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..053c27d --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'github-pages' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..16bc19a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,115 @@ +GEM + remote: https://rubygems.org/ + specs: + RedCloth (4.2.9) + activesupport (4.1.4) + i18n (~> 0.6, >= 0.6.9) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.1) + tzinfo (~> 1.1) + blankslate (2.1.2.4) + celluloid (0.15.2) + timers (~> 1.1.0) + classifier (1.3.4) + fast-stemmer (>= 1.0.0) + coffee-script (2.3.0) + coffee-script-source + execjs + coffee-script-source (1.7.1) + colorator (0.1) + execjs (2.2.1) + fast-stemmer (1.0.2) + ffi (1.9.3) + gemoji (2.0.0) + github-pages (22) + RedCloth (= 4.2.9) + jekyll (= 2.2.0) + jekyll-coffeescript (= 1.0.0) + jekyll-mentions (= 0.1.3) + jekyll-redirect-from (= 0.4.0) + jekyll-sass-converter (= 1.2.0) + jekyll-sitemap (= 0.5.1) + jemoji (= 0.3.0) + kramdown (= 1.3.1) + liquid (= 2.6.1) + maruku (= 0.7.0) + pygments.rb (= 0.6.0) + rdiscount (= 2.1.7) + redcarpet (= 3.1.2) + html-pipeline (1.9.0) + activesupport (>= 2) + nokogiri (~> 1.4) + i18n (0.6.11) + jekyll (2.2.0) + classifier (~> 1.3) + colorator (~> 0.1) + jekyll-coffeescript (~> 1.0) + jekyll-gist (~> 1.0) + jekyll-paginate (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.0) + kramdown (~> 1.3) + liquid (~> 2.6.1) + mercenary (~> 0.3.3) + pygments.rb (~> 0.6.0) + redcarpet (~> 3.1) + safe_yaml (~> 1.0) + toml (~> 0.1.0) + jekyll-coffeescript (1.0.0) + coffee-script (~> 2.2) + jekyll-gist (1.1.0) + jekyll-mentions (0.1.3) + html-pipeline (~> 1.9.0) + jekyll (~> 2.0) + jekyll-paginate (1.0.0) + jekyll-redirect-from (0.4.0) + jekyll (~> 2.0) + jekyll-sass-converter (1.2.0) + sass (~> 3.2) + jekyll-sitemap (0.5.1) + jekyll-watch (1.0.0) + listen (~> 2.7) + jemoji (0.3.0) + gemoji (~> 2.0) + html-pipeline (~> 1.9) + jekyll (~> 2.0) + json (1.8.1) + kramdown (1.3.1) + liquid (2.6.1) + listen (2.7.9) + celluloid (>= 0.15.2) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + maruku (0.7.0) + mercenary (0.3.4) + mini_portile (0.6.0) + minitest (5.4.0) + nokogiri (1.6.3.1) + mini_portile (= 0.6.0) + parslet (1.5.0) + blankslate (~> 2.0) + posix-spawn (0.3.9) + pygments.rb (0.6.0) + posix-spawn (~> 0.3.6) + yajl-ruby (~> 1.1.0) + rb-fsevent (0.9.4) + rb-inotify (0.9.5) + ffi (>= 0.5.0) + rdiscount (2.1.7) + redcarpet (3.1.2) + safe_yaml (1.0.3) + sass (3.3.13) + thread_safe (0.3.4) + timers (1.1.0) + toml (0.1.1) + parslet (~> 1.5.0) + tzinfo (1.2.1) + thread_safe (~> 0.1) + yajl-ruby (1.1.0) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b8bfa9 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +See [Using Jekyll with Pages](https://help.github.com/articles/using-jekyll-with-pages) for help with editing this content. + +== Quick start + +1. Verify that you have Ruby (version 1.9.3 or 2.0.0) +1. Run `gem install bundler` +1. Clone this repository and switch to the `gh-pages` branch +1. In your cloned repository, run `bundle install` +1. Run `bundle exec jekyll serve` to preview your site at + http://localhost:4000 + +== Windows users + +Jekyll isn't really designed with Windows in mind, but it's not too hard to +get it working with Cygwin. Follow the 'Installing Jekyll' steps on the GitHub +help page above after installing Cygwin with the following packages. If you +get errors from the `bundle install` step, you're probably missing a package +-- most likely, a `*-devel` library package. If it's not listed below, please +add it! + +Required Cygwin packages: +* ruby (version 1.9.3 or 2.0.0) +* gcc-core +* libcrypt-devel +* libiconv-devel +* libffi-devel +* make +* patch +* pkg-config + +Even with all the required packages, Jekyll on Windows doesn't seem to like +running in `--watch` mode. This might be fixed by downgrading the `listen` +package, but doing so means downgrading many other packages and potentially +breaking compatibility. + +If you get "permission denied" related to `conftest.exe` while running +`bundle install`, you may need to temporarily disable your virus protection. +Remember to turn it on again after installation! + +If Jekyll fails to build your site, you may need to provide a "fixed" version +of your `COMSPEC` environment variable. The easiest way to do that is: +```Bash +export COMSPEC=`cygpath -u "$COMSPEC"` +``` +You can either run that command in your shell yourself, add it to `.bashrc`, +or add it to a shell script that (for example) runs `bundle exec jekyll serve` +for you. diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..47f8261 --- /dev/null +++ b/_config.yml @@ -0,0 +1,22 @@ +highlighter: pygments +markdown: redcarpet + +kramdown: + input: GFM +redcarpet: + extensions: ["no_intra_emphasis", "tables", "fenced_code_blocks", "autolink", "strikethrough", "lax_spacing", "with_toc_data"] + +# Make relative links stay within our project +# You may want to preview with: bundle exec jekyll serve --baseurl '' +# See http://jekyllrb.com/docs/github-pages/ +baseurl: /scratch-extension-docs + +# The following are fixed by GitHub and cannot be changed by us +safe: true +lsi: false + +gems: +- jekyll-mentions +- jemoji +- jekyll-redirect-from +- jekyll-sitemap diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..f5539c7 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> + + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="chrome=1"> + <meta name="description" content="Scratch Extensions : Extensions for Scratch 2.0"> + + <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css"> + + <title>Scratch Extensions</title> + </head> + + <body> + + <!-- HEADER --> + <div id="header_wrap" class="outer"> + <header class="inner"> + <a id="forkme_banner" href="https://github.com/LLK/scratch-extension-docs">View on GitHub</a> + + <h1 id="project_title">Scratch Extensions</h1> + <h2 id="project_tagline">Extensions for Scratch 2.0</h2> + + <section id="downloads"> + <a class="zip_download_link" href="https://github.com/LLK/scratch-extension-docs/zipball/master">Download this project as a .zip file</a> + <a class="tar_download_link" href="https://github.com/LLK/scratch-extension-docs/tarball/master">Download this project as a tar.gz file</a> + </section> + </header> + </div> + + <!-- MAIN CONTENT --> + <div id="main_content_wrap" class="outer"> + <section id="main_content" class="inner"> + {{ content }} + </section> + </div> + + <!-- FOOTER --> + <div id="footer_wrap" class="outer"> + <footer class="inner"> + <p class="copyright">Scratch Extensions maintained by <a href="https://github.com/LLK">LLK</a></p> + <p>Published with <a href="http://pages.github.com">GitHub Pages</a></p> + </footer> + </div> + + + + </body> +</html> diff --git a/index.html b/index.html deleted file mode 100644 index 0ac10eb..0000000 --- a/index.html +++ /dev/null @@ -1,596 +0,0 @@ -<!DOCTYPE html> -<html> - - <head> - <meta charset='utf-8'> - <meta http-equiv="X-UA-Compatible" content="chrome=1"> - <meta name="description" content="Scratch Extensions : Extensions for Scratch 2.0"> - - <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css"> - - <title>Scratch Extensions</title> - </head> - - <body> - - <!-- HEADER --> - <div id="header_wrap" class="outer"> - <header class="inner"> - <a id="forkme_banner" href="https://github.com/LLK/scratch-extension-docs">View on GitHub</a> - - <h1 id="project_title">Scratch Extensions</h1> - <h2 id="project_tagline">Extensions for Scratch 2.0</h2> - - <section id="downloads"> - <a class="zip_download_link" href="https://github.com/LLK/scratch-extension-docs/zipball/master">Download this project as a .zip file</a> - <a class="tar_download_link" href="https://github.com/LLK/scratch-extension-docs/tarball/master">Download this project as a tar.gz file</a> - </section> - </header> - </div> - - <!-- MAIN CONTENT --> - <div id="main_content_wrap" class="outer"> - <section id="main_content" class="inner"> - <h1> -<a name="contents" class="anchor" href="#contents"><span class="octicon octicon-link"></span></a>Contents</h1> - -<ol> -<li> -<a href="#writing-extensions-for-scratch-20">Writing Extensions for Scratch 2.0</a> - -<ol> -<li> -<a href="#adding-blocks">Adding Blocks</a> - -<ol> -<li><a href="#command-blocks">Command blocks</a></li> -<li><a href="#command-blocks-that-wait">Command blocks that wait</a></li> -<li><a href="#reporter-blocks">Reporter blocks</a></li> -<li><a href="#reporter-blocks-that-wait">Reporter blocks that wait</a></li> -<li><a href="#hat-blocks">Hat blocks</a></li> -</ol> -</li> -<li> -<a href="#the-extension-descriptor">The Extension Descriptor</a> - -<ol> -<li><a href="#blocks">Blocks</a></li> -<li><a href="#menus">Menus</a></li> -<li><a href="#url">URL</a></li> -</ol> -</li> -<li> -<a href="#hardware-support">Hardware Support</a> - -<ol> -<li><a href="#usb-hid-support">USB HID Support</a></li> -<li><a href="#serial-device-support">Serial Device Support</a></li> -</ol> -</li> -</ol> -</li> -</ol><h1> -<a name="writing-extensions-for-scratch-20" class="anchor" href="#writing-extensions-for-scratch-20"><span class="octicon octicon-link"></span></a>Writing Extensions for Scratch 2.0</h1> - -<p>Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h2> -<a name="adding-blocks" class="anchor" href="#adding-blocks"><span class="octicon octicon-link"></span></a>Adding Blocks</h2> - -<p>An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.</p> - -<h3> -<a name="command-blocks" class="anchor" href="#command-blocks"><span class="octicon octicon-link"></span></a>Command blocks</h3> - -<p>To add a simple <em>command</em> block, there needs to be an entry in the <code>descriptors.blocks</code> list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="nx">ext</span><span class="p">.</span><span class="nx">my_first_block</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="c1">// Code that gets executed when the block is run</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="c1">// Block type, block name, function name</span> - <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'my first block'</span><span class="p">,</span> <span class="s1">'my_first_block'</span><span class="p">],</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'My first extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h3> -<a name="command-blocks-that-wait" class="anchor" href="#command-blocks-that-wait"><span class="octicon octicon-link"></span></a>Command blocks that wait</h3> - -<p>Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the <code>console.log</code> statement in the code - most Javascript methods, as well as <a href="http://jquery.com/">jQuery</a> methods will work fine in an extension.</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="c1">// Functions for block with type 'w' will get a callback function as the </span> - <span class="c1">// final argument. This should be called to indicate that the block can</span> - <span class="c1">// stop waiting.</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">wait_random</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">wait</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">();</span> - <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Waiting for '</span> <span class="o">+</span> <span class="nx">wait</span> <span class="o">+</span> <span class="s1">' seconds'</span><span class="p">);</span> - <span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="nx">callback</span><span class="p">();</span> - <span class="p">},</span> <span class="nx">wait</span><span class="o">*</span><span class="mi">1000</span><span class="p">);</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'wait for random time'</span><span class="p">,</span> <span class="s1">'wait_random'</span><span class="p">],</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Random wait extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h3> -<a name="reporter-blocks" class="anchor" href="#reporter-blocks"><span class="octicon octicon-link"></span></a>Reporter blocks</h3> - -<p>Blocks can also return values, and they are called <em>reporter</em> blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="nx">ext</span><span class="p">.</span><span class="nx">power</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">)</span> <span class="p">{</span> - <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">exponent</span><span class="p">);</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="c1">// Block type, block name, function name, param1 default value, param2 default value</span> - <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'%n ^ %n'</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Sample extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h3> -<a name="reporter-blocks-that-wait" class="anchor" href="#reporter-blocks-that-wait"><span class="octicon octicon-link"></span></a>Reporter blocks that wait</h3> - -<p>One common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to <a href="http://openweathermap.org/API">Open Weather Map API</a>. Note that the block type is <em>R</em> instead of <em>r</em> (which is for a non-blocking reporter).</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="nx">ext</span><span class="p">.</span><span class="nx">get_temp</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">location</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> - <span class="c1">// Make an AJAX call to the Open Weather Maps API</span> - <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span> - <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://api.openweathermap.org/data/2.5/weather?q='</span><span class="o">+</span><span class="nx">location</span><span class="o">+</span><span class="s1">'&units=imperial'</span><span class="p">,</span> - <span class="nx">dataType</span><span class="o">:</span> <span class="s1">'jsonp'</span><span class="p">,</span> - <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">weather_data</span> <span class="p">)</span> <span class="p">{</span> - <span class="c1">// Got the data - parse it and return the temperature</span> - <span class="nx">temperature</span> <span class="o">=</span> <span class="nx">weather_data</span><span class="p">[</span><span class="s1">'main'</span><span class="p">][</span><span class="s1">'temp'</span><span class="p">];</span> - <span class="nx">callback</span><span class="p">(</span><span class="nx">temperature</span><span class="p">);</span> - <span class="p">}</span> - <span class="p">});</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">'R'</span><span class="p">,</span> <span class="s1">'current temperature in city %s'</span><span class="p">,</span> <span class="s1">'get_temp'</span><span class="p">,</span> <span class="s1">'Boston, MA'</span><span class="p">],</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Weather extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h3> -<a name="hat-blocks" class="anchor" href="#hat-blocks"><span class="octicon octicon-link"></span></a>Hat blocks</h3> - -<p>Hat blocks go on top of block stacks - examples of Scratch hat blocks include "when green flag clicked" or "when this sprite clicked". To create a hat block through an extension, the block type needs to be set to <em>h</em>, as shown in the example below.</p> - -<div class="highlight highlight-javascript"><pre><span class="k">new</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> - <span class="kd">var</span> <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="c1">// This becomes true after the alarm goes off</span> - - <span class="c1">// Cleanup function when the extension is unloaded</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{};</span> - - <span class="c1">// Status reporting code</span> - <span class="c1">// Use this to report missing hardware, plugin or unsupported browser</span> - <span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Ready'</span><span class="p">};</span> - <span class="p">};</span> - - <span class="nx">ext</span><span class="p">.</span><span class="nx">set_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">time</span><span class="p">)</span> <span class="p">{</span> - <span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> - <span class="p">},</span> <span class="nx">time</span><span class="o">*</span><span class="mi">1000</span><span class="p">);</span> - <span class="p">};</span> - - <span class="nx">ext</span><span class="p">.</span><span class="nx">when_alarm</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="c1">// Reset alarm_went_off if it is true, and return true</span> - <span class="c1">// otherwise, return false.</span> - <span class="k">if</span> <span class="p">(</span><span class="nx">alarm_went_off</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">alarm_went_off</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> - <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> - <span class="p">}</span> - - <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> - <span class="p">};</span> - - <span class="c1">// Block and block menu descriptions</span> - <span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">'run alarm after %n seconds'</span><span class="p">,</span> <span class="s1">'set_alarm'</span><span class="p">,</span> <span class="s1">'2'</span><span class="p">],</span> - <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when alarm goes off'</span><span class="p">,</span> <span class="s1">'when_alarm'</span><span class="p">],</span> - <span class="p">]</span> - <span class="p">};</span> - - <span class="c1">// Register the extension</span> - <span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Alarm extension'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">);</span> -<span class="p">})();</span> -</pre></div> - -<h2> -<a name="the-extension-descriptor" class="anchor" href="#the-extension-descriptor"><span class="octicon octicon-link"></span></a>The Extension Descriptor</h2> - -<p>The extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:</p> - -<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">descriptor</span> <span class="o">=</span> <span class="p">{</span> - <span class="nx">blocks</span><span class="o">:</span> <span class="p">[</span> - <span class="p">[</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'turn motor on for %n secs'</span><span class="p">,</span> <span class="s1">'motorOnFor'</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> - <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'turn motor on'</span><span class="p">,</span> <span class="s1">'allMotorsOn'</span><span class="p">],</span> - <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'turn motor off'</span><span class="p">,</span> <span class="s1">'allMotorsOff'</span><span class="p">],</span> - <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'set motor power %n'</span><span class="p">,</span> <span class="s1">'startMotorPower'</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> - <span class="p">[</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">'set motor direction %m.motorDirection'</span><span class="p">,</span> <span class="s1">'setMotorDirection'</span><span class="p">,</span> <span class="s1">'this way'</span><span class="p">],</span> - <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when distance %m.lessMore %n'</span><span class="p">,</span> <span class="s1">'whenDistance'</span><span class="p">,</span> <span class="s1">'<'</span><span class="p">,</span> <span class="mi">20</span><span class="p">],</span> - <span class="p">[</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'when tilt %m.eNe %n'</span><span class="p">,</span> <span class="s1">'whenTilt'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> - <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'distance'</span><span class="p">,</span> <span class="s1">'getDistance'</span><span class="p">],</span> - <span class="p">[</span><span class="s1">'r'</span><span class="p">,</span> <span class="s1">'tilt'</span><span class="p">,</span> <span class="s1">'getTilt'</span><span class="p">]</span> - <span class="p">],</span> - <span class="nx">menus</span><span class="o">:</span> <span class="p">{</span> - <span class="nx">motorDirection</span><span class="o">:</span> <span class="p">[</span><span class="s1">'this way'</span><span class="p">,</span> <span class="s1">'that way'</span><span class="p">,</span> <span class="s1">'reverse'</span><span class="p">],</span> - <span class="nx">lessMore</span><span class="o">:</span> <span class="p">[</span><span class="s1">'<'</span><span class="p">,</span> <span class="s1">'>'</span><span class="p">],</span> - <span class="nx">eNe</span><span class="o">:</span> <span class="p">[</span><span class="s1">'='</span><span class="p">,</span><span class="s1">'not ='</span><span class="p">]</span> - <span class="p">},</span> - <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://info.scratch.mit.edu/WeDo'</span> -<span class="p">};</span> -</pre></div> - -<h3> -<a name="blocks" class="anchor" href="#blocks"><span class="octicon octicon-link"></span></a>Blocks</h3> - -<p>The blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.</p> - -<p>The full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the <a href="#reporter-blocks-that-wait">Reporter blocks that wait</a> and <a href="#command-blocks-that-wait">Command blocks that wait</a> sections.</p> - -<table> -<thead><tr> -<th>Op Code</th> -<th>Meaning</th> -</tr></thead> -<tbody> -<tr> -<td> -<code>' '</code> (space)</td> -<td>Synchronous command</td> -</tr> -<tr> -<td><code>'w'</code></td> -<td>Asynchronous command</td> -</tr> -<tr> -<td><code>'r'</code></td> -<td>Synchronous reporter</td> -</tr> -<tr> -<td><code>'R'</code></td> -<td>Asynchronous reporter</td> -</tr> -<tr> -<td><code>'h'</code></td> -<td>Hat block (always synchronous)</td> -</tr> -</tbody> -</table><p>Each block argument is identified by a <code>%</code> character and the character following it specifies the type. The types are: <code>%n</code> for number, <code>%s</code> for string, and <code>%m</code> for menu. Menus also identify which menu to use with a period and the name of the menu like this: <code>%m.menuName</code>.</p> - -<h3> -<a name="menus" class="anchor" href="#menus"><span class="octicon octicon-link"></span></a>Menus</h3> - -<p>The <code>menus</code> property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.</p> - -<p>For example, the <code>setMotorDirection</code> block in the example above includes <code>%m.motorDirection</code>, which will cause it to display a menu with <code>'this way'</code>, <code>'that way'</code>, and <code>'reverse'</code> as options.</p> - -<h3> -<a name="url" class="anchor" href="#url"><span class="octicon octicon-link"></span></a>URL</h3> - -<p>The <code>url</code> property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the <code>'About [extension name]...'</code> menu item within Scratch, this is the URL that will be opened.</p> - -<h2> -<a name="hardware-support" class="anchor" href="#hardware-support"><span class="octicon octicon-link"></span></a>Hardware Support</h2> - -<p>Scratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:</p> - -<ul> -<li>Serial devices such as the PicoBoard</li> -<li>USB HID devices such as joysticks or the LEGO WeDo</li> -</ul><p>Extensions that request hardware access are required to implement two additional methods on the extension instance: <code>_deviceConnected()</code> and <code>_deviceRemoved()</code>. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example Name'</span><span class="p">,</span> <span class="nx">descriptor_object</span><span class="p">,</span> <span class="nx">ext_instance</span><span class="p">[,</span> <span class="nx">hardware_info</span><span class="p">]);</span> -</pre></div> - -<p>The <code>_getStatus()</code> method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_getStatus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">device</span><span class="p">)</span> <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Device not connected'</span><span class="p">};</span> - <span class="k">return</span> <span class="p">{</span><span class="nx">status</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">msg</span><span class="o">:</span> <span class="s1">'Device connected'</span><span class="p">};</span> -<span class="p">}</span> -</pre></div> - -<p>The value returned by <code>_getStatus()</code> corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The <code>msg</code> property can be used to provide more specific information.</p> - -<table> -<thead><tr> -<th>Value</th> -<th>Color</th> -<th>Meaning</th> -</tr></thead> -<tbody> -<tr> -<td>0</td> -<td>red</td> -<td>error</td> -</tr> -<tr> -<td>1</td> -<td>yellow</td> -<td>not ready</td> -</tr> -<tr> -<td>2</td> -<td>green</td> -<td>ready</td> -</tr> -</tbody> -</table><p>The details of the <code>hardware_info</code> parameter and the <code>_deviceConnected()</code> and <code>_deviceRemoved()</code> methods are described below in sections specific to each type of device.</p> - -<p><em><em>API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as <code>read()</code> for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available.</em></em></p> - -<h3> -<a name="usb-hid-support" class="anchor" href="#usb-hid-support"><span class="octicon octicon-link"></span></a>USB HID Support</h3> - -<p><em>An example HID device extension is available <a href="https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js">here</a>.</em> -<em>More information about the HID protocol is available <a href="http://www.usb.org/developers/devclass_docs/HID1_11.pdf">here</a>.</em></p> - -<p>To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> - -<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">hid_info</span> <span class="o">=</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">'hid'</span><span class="p">,</span> <span class="nx">vendor</span><span class="o">:</span> <span class="mh">0x0694</span><span class="p">,</span> <span class="nx">product</span><span class="o">:</span> <span class="mh">0x0003</span><span class="p">};</span> -<span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">,</span> <span class="nx">hid_info</span><span class="p">);</span> -</pre></div> - -<p>The <code>vendor</code> and <code>product</code> values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the <code>0x</code> prefix in the JavaScript above.</p> - -<p>If a device is connected with matching vendor and product IDs, Scratch will call the <code>_deviceConnected()</code> method on your extension and pass an object representing that device. Your <code>_deviceConnected()</code> method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:</p> - -<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">poller</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> -<span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceConnected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> - - <span class="nx">device</span> <span class="o">=</span> <span class="nx">dev</span><span class="p">;</span> - <span class="nx">device</span><span class="p">.</span><span class="nx">open</span><span class="p">();</span> - - <span class="nx">poller</span> <span class="o">=</span> <span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="nx">rawData</span> <span class="o">=</span> <span class="nx">device</span><span class="p">.</span><span class="nx">read</span><span class="p">();</span> - <span class="p">},</span> <span class="mi">20</span><span class="p">);</span> -<span class="p">};</span> -</pre></div> - -<p>Once a connection to your device is established, your extension may use the <code>read()</code> and <code>write()</code> methods on the device object to communicate with it. These methods use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays">ArrayBuffer</a> objects to contain data being sent or received.</p> - -<ul> -<li> -<code>device.read(48)</code> will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. <em><em>This method is likely to change soon. See the API Note above.</em></em> -</li> -<li> -<code>device.write(buffer)</code> will send the given ArrayBuffer's data to the device.</li> -</ul><p>Your extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceRemoved</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="nx">device</span> <span class="o">!=</span> <span class="nx">dev</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> - <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> - <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> -<span class="p">};</span> -</pre></div> - -<p>Finally, your extension's <code>_shutdown()</code> method will be executed when the extension itself is shut down. For example:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> - <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="nx">device</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span> - <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> -<span class="p">}</span> -</pre></div> - -<h3> -<a name="serial-device-support" class="anchor" href="#serial-device-support"><span class="octicon octicon-link"></span></a>Serial Device Support</h3> - -<p><em>An example serial device extension is available <a href="https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js">here</a>.</em></p> - -<p>To let the extension system know that your extension is interested in serial devices, pass an object like this for the <code>hardware_info</code> parameter of the <code>register()</code> method:</p> - -<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">serial_info</span> <span class="o">=</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">'serial'</span><span class="p">};</span> -<span class="nx">ScratchExtensions</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">'Example'</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">ext</span><span class="p">,</span> <span class="nx">serial_info</span><span class="p">);</span> -</pre></div> - -<p>Your extension's <code>_deviceConnected()</code> method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your <code>_deviceConnected()</code> will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.</p> - -<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">potentialDevices</span> <span class="o">=</span> <span class="p">[];</span> -<span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceConnected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">potentialDevices</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">dev</span><span class="p">);</span> - - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">device</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">tryNextDevice</span><span class="p">();</span> - <span class="p">}</span> -<span class="p">}</span> -</pre></div> - -<p>To communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on <a href="http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html">Boost.Asio's serial port options</a>. For a PicoBoard:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">device</span><span class="p">.</span><span class="nx">open</span><span class="p">({</span> <span class="nx">stopBits</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">bitRate</span><span class="o">:</span> <span class="mi">38400</span><span class="p">,</span> <span class="nx">ctsFlowControl</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span> -</pre></div> - -<p>The full set of options available for a serial port are as follows:</p> - -<table> -<thead><tr> -<th>Option</th> -<th>Default</th> -<th>Valid values</th> -<th>Description</th> -</tr></thead> -<tbody> -<tr> -<td>bitRate</td> -<td>9600</td> -<td>Any valid baud rate</td> -<td>Up to The bit (or baud) rate at which to communicate.</td> -</tr> -<tr> -<td>bufferSize</td> -<td>4096</td> -<td>Up to 8192</td> -<td>The maximum amount of data that can be received at a time.</td> -</tr> -<tr> -<td>ctsFlowControl</td> -<td>1 (software)</td> -<td>0 (none), 1 (software), 2 (hardware)</td> -<td>The type of flow control to use.</td> -</tr> -<tr> -<td>dataBits</td> -<td>8</td> -<td>5, 6, 7, 8</td> -<td>The number of data bits per character.</td> -</tr> -<tr> -<td>parityBit</td> -<td>0 (none)</td> -<td>0 (none), 1 (odd), 2 (even)</td> -<td>Whether and how to use the parity bit in each character.</td> -</tr> -<tr> -<td>stopBits</td> -<td>1 (1.5 bits)</td> -<td>0 (1 bit), 1 (1.5 bits), 2 (2 bits)</td> -<td>The number of stop bits per character.</td> -</tr> -</tbody> -</table><p>Once a connection to your device is established, your extension may use the <code>send()</code> method to send data to your device, and the <code>set_receive_handler()</code> method to register a function to handle received data. These methods use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays">ArrayBuffer</a> objects to contain data being sent or received.</p> - -<ul> -<li> -<code>device.send(buffer)</code> will send the given ArrayBuffer's data to the device.</li> -<li> -<code>device.set_receive_handler(myReceiveHandler)</code> will result in <code>myReceiveHandler(buffer)</code> being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.</li> -</ul><p>Your extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_deviceRemoved</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">dev</span><span class="p">)</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="nx">device</span> <span class="o">!=</span> <span class="nx">dev</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span> - <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> - <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> -<span class="p">};</span> -</pre></div> - -<p>Finally, your extension's <code>_shutdown()</code> method will be executed when the extension itself is shut down. For example:</p> - -<div class="highlight highlight-javascript"><pre><span class="nx">ext</span><span class="p">.</span><span class="nx">_shutdown</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> - <span class="k">if</span><span class="p">(</span><span class="nx">poller</span><span class="p">)</span> <span class="nx">poller</span> <span class="o">=</span> <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">poller</span><span class="p">);</span> - <span class="k">if</span><span class="p">(</span><span class="nx">device</span><span class="p">)</span> <span class="nx">device</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span> - <span class="nx">device</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> -<span class="p">}</span> -</pre></div> - </section> - </div> - - <!-- FOOTER --> - <div id="footer_wrap" class="outer"> - <footer class="inner"> - <p class="copyright">Scratch Extensions maintained by <a href="https://github.com/LLK">LLK</a></p> - <p>Published with <a href="http://pages.github.com">GitHub Pages</a></p> - </footer> - </div> - - - - </body> -</html> diff --git a/index.md b/index.md new file mode 100644 index 0000000..3bada31 --- /dev/null +++ b/index.md @@ -0,0 +1,439 @@ +--- +title: 'Scratch Extensions' +tagline: 'Extensions for Scratch 2.0' +layout: default +--- +# Contents + +1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20) + 1. [Adding Blocks](#adding-blocks) + 1. [Command blocks](#command-blocks) + 1. [Command blocks that wait](#command-blocks-that-wait) + 1. [Reporter blocks](#reporter-blocks) + 1. [Reporter blocks that wait](#reporter-blocks-that-wait) + 1. [Hat blocks](#hat-blocks) + 1. [The Extension Descriptor](#the-extension-descriptor) + 1. [Blocks](#blocks) + 1. [Menus](#menus) + 1. [URL](#url) + 1. [Hardware Support](#hardware-support) + 1. [USB HID Support](#usb-hid-support) + 1. [Serial Device Support](#serial-device-support) + +# Writing Extensions for Scratch 2.0 + +Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following: + +```javascript +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ] + }; + + // Register the extension + ScratchExtensions.register('Sample extension', descriptor, ext); +})(); +``` + +## Adding Blocks + +An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters. + +### Command blocks + +To add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing). + +```javascript +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.my_first_block = function() { + // Code that gets executed when the block is run + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + // Block type, block name, function name + [' ', 'my first block', 'my_first_block'], + ] + }; + + // Register the extension + ScratchExtensions.register('My first extension', descriptor, ext); +})(); +``` + +### Command blocks that wait + +Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension. + +```javascript +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + // Functions for block with type 'w' will get a callback function as the + // final argument. This should be called to indicate that the block can + // stop waiting. + ext.wait_random = function(callback) { + wait = Math.random(); + console.log('Waiting for ' + wait + ' seconds'); + window.setTimeout(function() { + callback(); + }, wait*1000); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['w', 'wait for random time', 'wait_random'], + ] + }; + + // Register the extension + ScratchExtensions.register('Random wait extension', descriptor, ext); +})(); +``` + +### Reporter blocks + +Blocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters). + +```javascript +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.power = function(base, exponent) { + return Math.pow(base, exponent); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + // Block type, block name, function name, param1 default value, param2 default value + ['r', '%n ^ %n', 'power', 2, 3], + ] + }; + + // Register the extension + ScratchExtensions.register('Sample extension', descriptor, ext); +})(); +``` + +### Reporter blocks that wait + +One common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter). + +```javascript +new (function() { + var ext = this; + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.get_temp = function(location, callback) { + // Make an AJAX call to the Open Weather Maps API + $.ajax({ + url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial', + dataType: 'jsonp', + success: function( weather_data ) { + // Got the data - parse it and return the temperature + temperature = weather_data['main']['temp']; + callback(temperature); + } + }); + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], + ] + }; + + // Register the extension + ScratchExtensions.register('Weather extension', descriptor, ext); +})(); +``` + +### Hat blocks + +Hat blocks go on top of block stacks - examples of Scratch hat blocks include "when green flag clicked" or "when this sprite clicked". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below. + +```javascript +new (function() { + var ext = this; + var alarm_went_off = false; // This becomes true after the alarm goes off + + // Cleanup function when the extension is unloaded + ext._shutdown = function() {}; + + // Status reporting code + // Use this to report missing hardware, plugin or unsupported browser + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + ext.set_alarm = function(time) { + window.setTimeout(function() { + alarm_went_off = true; + }, time*1000); + }; + + ext.when_alarm = function() { + // Reset alarm_went_off if it is true, and return true + // otherwise, return false. + if (alarm_went_off === true) { + alarm_went_off = false; + return true; + } + + return false; + }; + + // Block and block menu descriptions + var descriptor = { + blocks: [ + ['', 'run alarm after %n seconds', 'set_alarm', '2'], + ['h', 'when alarm goes off', 'when_alarm'], + ] + }; + + // Register the extension + ScratchExtensions.register('Alarm extension', descriptor, ext); +})(); +``` + +## The Extension Descriptor + +The extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor: +```javascript +var descriptor = { + blocks: [ + ['w', 'turn motor on for %n secs', 'motorOnFor', 1], + [' ', 'turn motor on', 'allMotorsOn'], + [' ', 'turn motor off', 'allMotorsOff'], + [' ', 'set motor power %n', 'startMotorPower', 100], + [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'], + ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20], + ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1], + ['r', 'distance', 'getDistance'], + ['r', 'tilt', 'getTilt'] + ], + menus: { + motorDirection: ['this way', 'that way', 'reverse'], + lessMore: ['<', '>'], + eNe: ['=','not ='] + }, + url: 'http://info.scratch.mit.edu/WeDo' +}; +``` + +### Blocks + +The blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values. + +The full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections. + +| Op Code | Meaning +| ------- | ------- +| `' '` (space) | Synchronous command +| `'w'` | Asynchronous command +| `'r'` | Synchronous reporter +| `'R'` | Asynchronous reporter +| `'h'` | Hat block (always synchronous) + +Each block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`. + +### Menus + +The `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch. + +For example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options. + +### URL + +The `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened. + +## Hardware Support + +Scratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware: +- Serial devices such as the PicoBoard +- USB HID devices such as joysticks or the LEGO WeDo + +Extensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call: +```javascript +ScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]); +``` + +The `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example: +```javascript +ext._getStatus = function() { + if(!device) return {status: 1, msg: 'Device not connected'}; + return {status: 2, msg: 'Device connected'}; +} +``` + +The value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information. + +| Value | Color | Meaning | +| ----- | ------ | --------- | +| 0 | red | error | +| 1 | yellow | not ready | +| 2 | green | ready | + +The details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device. + +*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._* + +### USB HID Support +_An example HID device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js)._ +_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._ + +To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method: +```javascript +var hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003}; +ScratchExtensions.register('Example', descriptor, ext, hid_info); +``` +The `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above. + +If a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds: +```javascript +var poller = null; +ext._deviceConnected = function(dev) { + if(device) return; + + device = dev; + device.open(); + + poller = setInterval(function() { + rawData = device.read(); + }, 20); +}; +``` + +Once a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received. +* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._* +* `device.write(buffer)` will send the given ArrayBuffer's data to the device. + +Your extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication: +```javascript +ext._deviceRemoved = function(dev) { + if(device != dev) return; + if(poller) poller = clearInterval(poller); + device = null; +}; +``` + +Finally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example: +```javascript +ext._shutdown = function() { + if(poller) poller = clearInterval(poller); + if(device) device.close(); + device = null; +} +``` + +### Serial Device Support +_An example serial device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js)._ + +To let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method: +```javascript +var serial_info = {type: 'serial'}; +ScratchExtensions.register('Example', descriptor, ext, serial_info); +``` + +Your extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port. +```javascript +var potentialDevices = []; +ext._deviceConnected = function(dev) { + potentialDevices.push(dev); + + if (!device) { + tryNextDevice(); + } +} +``` + +To communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard: +```javascript +device.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 }); +``` +The full set of options available for a serial port are as follows: + +| Option | Default | Valid values | Description +| -------------- | ------- | ------------ | ----------- +| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate. +| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time. +| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use. +| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character. +| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character. +| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character. + +Once a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received. +* `device.send(buffer)` will send the given ArrayBuffer's data to the device. +* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data. + +Your extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication: +```javascript +ext._deviceRemoved = function(dev) { + if(device != dev) return; + if(poller) poller = clearInterval(poller); + device = null; +}; +``` + +Finally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example: +```javascript +ext._shutdown = function() { + if(poller) poller = clearInterval(poller); + if(device) device.close(); + device = null; +} +``` diff --git a/javascripts/main.js b/javascripts/main.js deleted file mode 100644 index d8135d3..0000000 --- a/javascripts/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log('This would be the main JS file.'); diff --git a/params.json b/params.json deleted file mode 100644 index 2e86c85..0000000 --- a/params.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Scratch Extensions","tagline":"Extensions for Scratch 2.0","body":"# Contents\r\n\r\n1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20)\r\n 1. [Adding Blocks](#adding-blocks)\r\n 1. [Command blocks](#command-blocks)\r\n 1. [Command blocks that wait](#command-blocks-that-wait)\r\n 1. [Reporter blocks](#reporter-blocks)\r\n 1. [Reporter blocks that wait](#reporter-blocks-that-wait)\r\n 1. [Hat blocks](#hat-blocks)\r\n 1. [The Extension Descriptor](#the-extension-descriptor)\r\n 1. [Blocks](#blocks)\r\n 1. [Menus](#menus)\r\n 1. [URL](#url)\r\n 1. [Hardware Support](#hardware-support)\r\n 1. [USB HID Support](#usb-hid-support)\r\n 1. [Serial Device Support](#serial-device-support)\r\n\r\n# Writing Extensions for Scratch 2.0\r\n\r\nWriting a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following:\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## Adding Blocks\r\n\r\nAn extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters.\r\n\r\n### Command blocks\r\n\r\nTo add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.my_first_block = function() {\r\n // Code that gets executed when the block is run\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name\r\n [' ', 'my first block', 'my_first_block'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('My first extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Command blocks that wait\r\n\r\nSometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a \"random wait\" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n // Functions for block with type 'w' will get a callback function as the \r\n // final argument. This should be called to indicate that the block can\r\n // stop waiting.\r\n ext.wait_random = function(callback) {\r\n wait = Math.random();\r\n console.log('Waiting for ' + wait + ' seconds');\r\n window.setTimeout(function() {\r\n callback();\r\n }, wait*1000);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['w', 'wait for random time', 'wait_random'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Random wait extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks\r\n\r\nBlocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.power = function(base, exponent) {\r\n return Math.pow(base, exponent);\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n // Block type, block name, function name, param1 default value, param2 default value\r\n ['r', '%n ^ %n', 'power', 2, 3],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Sample extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Reporter blocks that wait\r\n\r\nOne common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter).\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.get_temp = function(location, callback) {\r\n // Make an AJAX call to the Open Weather Maps API\r\n $.ajax({\r\n url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial',\r\n dataType: 'jsonp',\r\n success: function( weather_data ) {\r\n // Got the data - parse it and return the temperature\r\n temperature = weather_data['main']['temp'];\r\n callback(temperature);\r\n }\r\n });\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Weather extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n### Hat blocks\r\n\r\nHat blocks go on top of block stacks - examples of Scratch hat blocks include \"when green flag clicked\" or \"when this sprite clicked\". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below.\r\n\r\n```javascript\r\nnew (function() {\r\n var ext = this;\r\n var alarm_went_off = false; // This becomes true after the alarm goes off\r\n\r\n // Cleanup function when the extension is unloaded\r\n ext._shutdown = function() {};\r\n\r\n // Status reporting code\r\n // Use this to report missing hardware, plugin or unsupported browser\r\n ext._getStatus = function() {\r\n return {status: 2, msg: 'Ready'};\r\n };\r\n\r\n ext.set_alarm = function(time) {\r\n window.setTimeout(function() {\r\n alarm_went_off = true;\r\n }, time*1000);\r\n };\r\n\r\n ext.when_alarm = function() {\r\n // Reset alarm_went_off if it is true, and return true\r\n // otherwise, return false.\r\n if (alarm_went_off === true) {\r\n alarm_went_off = false;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Block and block menu descriptions\r\n var descriptor = {\r\n blocks: [\r\n ['', 'run alarm after %n seconds', 'set_alarm', '2'],\r\n ['h', 'when alarm goes off', 'when_alarm'],\r\n ]\r\n };\r\n\r\n // Register the extension\r\n ScratchExtensions.register('Alarm extension', descriptor, ext);\r\n})();\r\n```\r\n\r\n## The Extension Descriptor\r\n\r\nThe extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor:\r\n```javascript\r\nvar descriptor = {\r\n blocks: [\r\n ['w', 'turn motor on for %n secs', 'motorOnFor', 1],\r\n [' ', 'turn motor on', 'allMotorsOn'],\r\n [' ', 'turn motor off', 'allMotorsOff'],\r\n [' ', 'set motor power %n', 'startMotorPower', 100],\r\n [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],\r\n ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20],\r\n ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1],\r\n ['r', 'distance', 'getDistance'],\r\n ['r', 'tilt', 'getTilt']\r\n ],\r\n menus: {\r\n motorDirection: ['this way', 'that way', 'reverse'],\r\n lessMore: ['<', '>'],\r\n eNe: ['=','not =']\r\n },\r\n url: 'http://info.scratch.mit.edu/WeDo'\r\n};\r\n```\r\n\r\n### Blocks\r\n\r\nThe blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values.\r\n\r\nThe full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections.\r\n\r\n| Op Code | Meaning\r\n| ------- | -------\r\n| `' '` (space) | Synchronous command\r\n| `'w'` | Asynchronous command\r\n| `'r'` | Synchronous reporter\r\n| `'R'` | Asynchronous reporter\r\n| `'h'` | Hat block (always synchronous)\r\n\r\nEach block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`.\r\n\r\n### Menus\r\n\r\nThe `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch.\r\n\r\nFor example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options.\r\n\r\n### URL\r\n\r\nThe `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened.\r\n\r\n## Hardware Support\r\n\r\nScratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware:\r\n- Serial devices such as the PicoBoard\r\n- USB HID devices such as joysticks or the LEGO WeDo\r\n\r\nExtensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call:\r\n```javascript\r\nScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]);\r\n```\r\n\r\nThe `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example:\r\n```javascript\r\next._getStatus = function() {\r\n if(!device) return {status: 1, msg: 'Device not connected'};\r\n return {status: 2, msg: 'Device connected'};\r\n}\r\n```\r\n\r\nThe value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information.\r\n\r\n| Value | Color | Meaning |\r\n| ----- | ------ | --------- |\r\n| 0 | red | error |\r\n| 1 | yellow | not ready |\r\n| 2 | green | ready |\r\n\r\nThe details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device.\r\n\r\n*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._*\r\n\r\n### USB HID Support\r\n_An example HID device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js)._\r\n_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._\r\n\r\nTo let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003};\r\nScratchExtensions.register('Example', descriptor, ext, hid_info);\r\n```\r\nThe `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above.\r\n\r\nIf a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds:\r\n```javascript\r\nvar poller = null;\r\next._deviceConnected = function(dev) {\r\n if(device) return;\r\n\r\n device = dev;\r\n device.open();\r\n\r\n poller = setInterval(function() {\r\n rawData = device.read();\r\n }, 20);\r\n};\r\n```\r\n\r\nOnce a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._*\r\n* `device.write(buffer)` will send the given ArrayBuffer's data to the device.\r\n\r\nYour extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n\r\n### Serial Device Support\r\n_An example serial device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js)._\r\n\r\nTo let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method:\r\n```javascript\r\nvar serial_info = {type: 'serial'};\r\nScratchExtensions.register('Example', descriptor, ext, serial_info);\r\n```\r\n\r\nYour extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port.\r\n```javascript\r\nvar potentialDevices = [];\r\next._deviceConnected = function(dev) {\r\n potentialDevices.push(dev);\r\n\r\n if (!device) {\r\n tryNextDevice();\r\n }\r\n}\r\n```\r\n\r\nTo communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard:\r\n```javascript\r\ndevice.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 });\r\n```\r\nThe full set of options available for a serial port are as follows:\r\n\r\n| Option | Default | Valid values | Description\r\n| -------------- | ------- | ------------ | -----------\r\n| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate.\r\n| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time.\r\n| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use.\r\n| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character.\r\n| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character.\r\n| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character.\r\n\r\nOnce a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received.\r\n* `device.send(buffer)` will send the given ArrayBuffer's data to the device.\r\n* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data.\r\n\r\nYour extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication:\r\n```javascript\r\next._deviceRemoved = function(dev) {\r\n if(device != dev) return;\r\n if(poller) poller = clearInterval(poller);\r\n device = null;\r\n};\r\n```\r\n\r\nFinally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example:\r\n```javascript\r\next._shutdown = function() {\r\n if(poller) poller = clearInterval(poller);\r\n if(device) device.close();\r\n device = null;\r\n}\r\n```\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From f00d330570a24855af7e8e60282b1b9a5248515e Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 1 Aug 2014 20:07:12 -0700 Subject: [PATCH 21/47] Fixed some markdown mistakes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4b8bfa9..db7cb0f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ See [Using Jekyll with Pages](https://help.github.com/articles/using-jekyll-with-pages) for help with editing this content. -== Quick start +## Quick start 1. Verify that you have Ruby (version 1.9.3 or 2.0.0) 1. Run `gem install bundler` @@ -9,7 +9,7 @@ See [Using Jekyll with Pages](https://help.github.com/articles/using-jekyll-with 1. Run `bundle exec jekyll serve` to preview your site at http://localhost:4000 -== Windows users +## Windows users Jekyll isn't really designed with Windows in mind, but it's not too hard to get it working with Cygwin. Follow the 'Installing Jekyll' steps on the GitHub @@ -39,7 +39,7 @@ Remember to turn it on again after installation! If Jekyll fails to build your site, you may need to provide a "fixed" version of your `COMSPEC` environment variable. The easiest way to do that is: -```Bash +```sh export COMSPEC=`cygpath -u "$COMSPEC"` ``` You can either run that command in your shell yourself, add it to `.bashrc`, From f2e70f13df1f829b77c210d7290c7d632ecf7599 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Sun, 3 Aug 2014 17:43:04 -0600 Subject: [PATCH 22/47] Polished example js. Added a link to the extension ui video. --- images/add_ext_win.png | Bin 0 -> 26633 bytes index.md | 45 +++++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 24 deletions(-) create mode 100644 images/add_ext_win.png diff --git a/images/add_ext_win.png b/images/add_ext_win.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac19b4c4b7d6fcef658efd687315bcfcc8d6f9d GIT binary patch literal 26633 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 X()&g~r2KyPa~?%`)z@WmCISBimFmQ# literal 0 HcmV?d00001 diff --git a/index.md b/index.md index 3bada31..175ded7 100644 --- a/index.md +++ b/index.md @@ -19,15 +19,14 @@ layout: default 1. [Hardware Support](#hardware-support) 1. [USB HID Support](#usb-hid-support) 1. [Serial Device Support](#serial-device-support) + 1. [Editor Interface](#editor-interface) # Writing Extensions for Scratch 2.0 Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following: ```javascript -new (function() { - var ext = this; - +(function(ext) { // Cleanup function when the extension is unloaded ext._shutdown = function() {}; @@ -45,7 +44,7 @@ new (function() { // Register the extension ScratchExtensions.register('Sample extension', descriptor, ext); -})(); +})({}); ``` ## Adding Blocks @@ -57,9 +56,7 @@ An extension may define a number of blocks, of different types (e.g. a command b To add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing). ```javascript -new (function() { - var ext = this; - +(function(ext) { // Cleanup function when the extension is unloaded ext._shutdown = function() {}; @@ -83,7 +80,7 @@ new (function() { // Register the extension ScratchExtensions.register('My first extension', descriptor, ext); -})(); +})({}); ``` ### Command blocks that wait @@ -91,9 +88,7 @@ new (function() { Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension. ```javascript -new (function() { - var ext = this; - +(function(ext) { // Cleanup function when the extension is unloaded ext._shutdown = function() {}; @@ -123,7 +118,7 @@ new (function() { // Register the extension ScratchExtensions.register('Random wait extension', descriptor, ext); -})(); +})({}); ``` ### Reporter blocks @@ -131,9 +126,7 @@ new (function() { Blocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters). ```javascript -new (function() { - var ext = this; - +(function(ext) { // Cleanup function when the extension is unloaded ext._shutdown = function() {}; @@ -157,7 +150,7 @@ new (function() { // Register the extension ScratchExtensions.register('Sample extension', descriptor, ext); -})(); +})({}); ``` ### Reporter blocks that wait @@ -165,9 +158,7 @@ new (function() { One common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter). ```javascript -new (function() { - var ext = this; - +(function(ext) { // Cleanup function when the extension is unloaded ext._shutdown = function() {}; @@ -199,7 +190,7 @@ new (function() { // Register the extension ScratchExtensions.register('Weather extension', descriptor, ext); -})(); +})({}); ``` ### Hat blocks @@ -207,8 +198,7 @@ new (function() { Hat blocks go on top of block stacks - examples of Scratch hat blocks include "when green flag clicked" or "when this sprite clicked". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below. ```javascript -new (function() { - var ext = this; +(function(ext) { var alarm_went_off = false; // This becomes true after the alarm goes off // Cleanup function when the extension is unloaded @@ -247,7 +237,7 @@ new (function() { // Register the extension ScratchExtensions.register('Alarm extension', descriptor, ext); -})(); +})({}); ``` ## The Extension Descriptor @@ -287,7 +277,7 @@ The full list of block types available to an extension is as follows. Note that | `'w'` | Asynchronous command | `'r'` | Synchronous reporter | `'R'` | Asynchronous reporter -| `'h'` | Hat block (always synchronous) +| `'h'` | Hat block (synchronous, returns boolean, true = run stack) Each block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`. @@ -437,3 +427,10 @@ ext._shutdown = function() { device = null; } ``` + +### Editor Interface +_A demonstration of the interface and workflow can be viewed [here](https://www.youtube.com/watch?v=PLU7enk1tJ0)._ + +Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension. + + From 115221f5195484723c1be5ea6e983836c72493f7 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Sun, 3 Aug 2014 17:48:03 -0600 Subject: [PATCH 23/47] Fixed image URL and size --- images/add_ext_win.png | Bin 26633 -> 11407 bytes index.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/images/add_ext_win.png b/images/add_ext_win.png index 5ac19b4c4b7d6fcef658efd687315bcfcc8d6f9d..26378a837a524f53c69248c3b3444143b49f01d7 100644 GIT binary patch delta 10688 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 delta 26034 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 diff --git a/index.md b/index.md index 175ded7..e64cb21 100644 --- a/index.md +++ b/index.md @@ -433,4 +433,4 @@ _A demonstration of the interface and workflow can be viewed [here](https://www. Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension. - + From 292cacb6578a272bf0fb284870367afcdb78db1d Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Sun, 3 Aug 2014 17:55:56 -0600 Subject: [PATCH 24/47] Added images that show the extension drop-down menu states. --- images/new_ext_menu.png | Bin 0 -> 11068 bytes images/saved_ext_menu.png | Bin 0 -> 13319 bytes index.md | 11 +++++++++++ 3 files changed, 11 insertions(+) create mode 100644 images/new_ext_menu.png create mode 100644 images/saved_ext_menu.png diff --git a/images/new_ext_menu.png b/images/new_ext_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..aa71f244a24d08e4c10ec8b38bb435a3c2cc39d0 GIT binary patch literal 11068 zcmaKSWmFwqlQnKZf`pLZZowhAU*O^n!7lC&7k77ew~M=L(BK3QZow}aoS+}i%)IZ+ zkD0H3bXT2Kd)KZy)oY!#x+9bnq%hDvqrt$yU`PW2DljmxRBv_+3jEuhUi?n(?ePgL z@eQnMZw7WVbTWkzHL*7`C6l%_G&fZ-H8k;X95oeyfq|#ARQm@0CNIZlY;VhK_)iS8 zyRE|;8U{u{*xkX<*xD3KW@Kt^X(vc=-q}MzW@#cwp~)rBD(@g}YGDcVbTU=-R8TYa zv^M57p%4}#6L9ByBd|3E8<M%(+SobsxeHSK2QS~7{m(KB1=)XufUN~7{!`R9c_lJ& zdnZ#eE@mz!V^(%HGHzaGHZD$HHnuNh?5u1YENrYS?7U2DY<!&Dd~9FI{_CQ6%jRTa z#-{?1{I6VZo*;z<80^5u!s6!U#_YzyZ0}^w!p6(X%fiae!p_e07Qy7~VFxyJXR>pq z{1*ej)Y;g{(gAE~Z%6hIqoI+#3s{iiP3eD@VC(R2T07_eYSUZ8SlkUASlF0Z|0(HT zf%5YI|4>`oe@8omRZRa|@Bd2dtmffh%A#WGZ13V^{I+psl>el1;1hQ;H3Zu`soC4x z{Hu#f7WQC!XA64=GI4P-I(b85OS^x3`u_mP%kxRwIfD)Dj7_Bhf)sBQ%$AlWd|x@Z z|LHF$8wU@7jZK16?5*iyVv-z^yrPn<9GqPL!UF7#U2IM5!2iOU{5O{C|HS??3$_k# znE|Fwmae8Il1}!vWdBh!pXL9eMNEu?T@=7A`Nk*qziatVtjYhP<v+1JZ>9VnSe7?2 zEdT86|Jdn&ExnD;Kjy#Z_RabC<eS>Pjl0v^TyvW)tiQc3FiLW25;h*Odr)Y8e*WR* zO?i5ZOK_TmxE3pun4GlH-PK|LK>x|vX=P=__uk=&pFaZv<A?e?US3}o7Z;)1i;azq zW@hHQ>+|)~#|t~qw5(DK3uj1v=FP+3<RGt{oSY9Ih%z%Xqdc5lUETj&Txe_Sl{AlR zpI$D{j-UNGpIzDA{WUVUu$PlxdV9Lx+)$;VYEfF%bbNZ!)-^afx4LwA)m%{wfk1{^ z%MxoResnesjL)?V|B48Y*xK4mD{b4^*<M~=uC8lYTwZR0WDeG3oI$rEQp@MY2NDw# zySuxa+q>omTLt)4^z<AKkDxt$J-VjufnGs}M+c_*))wEibnN1erW<deORvx8Rq4e! zQT|Jd3mqLD`-caoyIal{W`g1-zYk7wlfnuiHEr#US2x#vgA;Dn?h||WM@L6<?U0-M zTWLvy^72whMa|9a&Fb}YZS(hUGT&Cmsz*jgOS_hWGn?IwbPf*>&+eYi&JI&^n<mHl zZS4JGAZ<0Z)qk!oX6BcUPL4O0rbR_$x*MySTAT9n@`4ldD@*f|lk;|V_xgJK9_}ut zRu&JAPn0ylZCxFGOBa68c@smuSs6(K)kUc>u@@_Sg~cUZMe)l!TN9f{08!o7n~mDR zrTx9l{N#k`nW@XGtJ5Rs_4RovB(Jr#O-bIkp}IaJIXyQgb8_@oVPRorX70{JPft$^ z2q05bP!M2my|liyyu3cwQQy+Ho|%)=(eqtSKRPWVV_;%0J3G6kq-3(U?f`l;G&EFL zRCuv7DX!qLy0*H$4Lw|+I669LZU1fo3NI}yl~cC8T%XC$OixQsjg84}tI5l+`o6ip z(>1+eZ|@){W3sfcv9_`#Dre;!RI0=y=oQz{-PUq`e!jlCk(HG-zj0dgeSB@E@9gA6 zK|w`Q8kE=2zqPi!`Flq|!l|pP^I(5JF1K1;Rjs6`tbOx3JSu5ucsv3!FnRu>2$Xnu zc-Z>=d;9lRZC=thMaSEVv%S5&f`WpLjg157p;RAl4Gaubku*S5&3)x02TMft*Gup4 zJ>^+!-<BAUVMB~Cd~m=P@cj=I2Q)%lkIV3ga08Sw0;q^1tCJ>TR=6brgxxmTkf(0< zB0h$qIpY<FT^}c~Trl*x>7y0<eU2A$IA61h+(hl_I`8I{pxXx4LH48If!8@Ra|%BL zq7@C|28uVI6a1nu-{50PRd;XqqePxU55kMDIFZ}DnAL(CAg<JAp%R^FF#gNb5iiBK zfuNLS`N2{U(@hg~{(R&3zA`%0X7k+cUC*kL-|3sfHVoNh378^;bk87;!X$<5krYjf zJQ0a(V|M75!#lZY*q_DW!3on>+5?^;31L+4#e=qEM)fkhuBHWxvFM4$*fOQLOJg8w zZ3CzxIPM&(Ax1RwQz6WgBz$u8$w9v18QZ?(9~n)Y9={h*4gl!}b*T}cwo==X%#$NB z2}H4^q6w8>g0jLyGpnIoTa)+%4((zA0Rbv>KVnts-lI&@%vk52NMW=E0;sKui(sPB z(YwC4Kc^>PW+>6AF{C`p#4Ch!nDIo{aVo7!DIG0eR7CFgiUN&>w0&Xb;x<op-!GnK z(He&%8cBjOSEKU*B~_&fn}+EJVmf;#_~vK1xK5|hUw9S2D6yNeqpa}mo#u3E@RqVY zB5rti@aBJpPj(btR^bnX4<t35iQS$2Kufe$wZ$Kw*m|yS{QfR4y<zD2I5nhOgE7SO z@xkt^cAoRb+}+RWy)=v@e$8#~kLNw}^^G)R&nQ+77yH(mG#eY4TX^4sDo-CJ(TI5; zWhk_(J+!UP87;(P?1!zT>ecE?XUnts;~~-9R^7Gv&!3xj@Ww}JCfSbI=SS=<GiDmZ z+S`hYsaHnh|9a?7WW<vaFRD=y^w{F%9Pd6weCMLJ;5w})Xl%ppc9GVaq(43+gMRUS zXR4xT_`R8H(6d6Dzk<9R8mmg3${jjHb?E#^K=Cts_B)xGnJ$$udBx7Wy3~vNL*y@1 zWmVj73Ze1Cw`H@4;EwvT;>Xlx-WVK*NWW^DA;vQXX6ng=&4$r(Hdu4T_O9CsW4kdG znyH6HQop^*N=ZQ~cLJ(&qM}25&w3wO*$DIgyU849nFamRuiiz}Cu+NyO*+oZge7N| zaux+tAyiFUT^0+Xj+#LX3vs1Vh+UtbOX5>?76=3#7k|}VeA!WrHH;{Keh&b59r4_V z#*-|+JO5hN(F*rcE`~-FOl8`|cOa#EdRv*M!9`P5|L9%(7db(}1jf>5etcI`8R(J2 zC2V)(PT7YrT%=W-#m43AJ<j!*&Y^RFusc10VO}lJ7UOb?;5S-6GVU5LGJ0=$6o+L4 zbY}>(JL6YF_(i66jiG|VUZ$yp4OUEtv#EIBB=n)(I?Y|+QVIMZb8#<>6tQ|cG$y<0 z#nSzdlcXarcfq7_=ec0o$z7!>mticIuMYZ(7bFT@Oy|g3OwVQvkLnQkn@L69U?(~s zTkYI&WjQn%<J>Vk1qE67{>5XY(?ZXt`V_!CWi|cSBO*f$K$ya>XOmm%3*bPtAhG!~ z6a_#5VKib_1B0dN*b%TJdQ&U#)nS>Gqsk1qNLVNWGsXGKDvWTK$!e7jj|`|Ski=md z3^vi!bV5=Ba13Or7{H<KT|%HcQI!_r5<QnOUt`nxjCyisqT0`CIkTcxvCd7dCIP8b zw<v#qEpgAk4C{9h;#L(ozDUl1ty5KZ#>%L@(G%bOT=|S{T9q#_zl`^B{|<-fTCA`? zRZk6ID+&qR5uFyFra(g^u}p+_op*=J<!kJ36#c0K{FOpJ-@#`fb5ms}_J_mc$j4z& ztRj`nvNuRvJ)b|n!W<_J4_Db@WJ@*-OVAxqxyl__3&*lPN?cq{7KsP1AGf$Tdlp6| z*dPHKZ>sqEh_hl@kb9PNz&?lEP<|C=BOt*M*Uhwddw|#bGAY%+C$v$ZGY=A)g`1+5 zihGc&yuH*c2G)-Fq%#9tBAd1>y6<dk6#5PRT#JdxM5zn7z^?`lBv_Xp)ld-7hb*fl z009)7<nz#AbSpg#F3=BEV^bSxfeA(=S0XVk3pGF#x~(IASVypw4FhxFMR>R>o<4O2 z9R>bJNBjn?RD4_mz&q!TrLA6xE(!{g&~iXTFkt%YATE_VLaOujvKmF{p?FAUxCt2c zih(DWvbJCNGY)}dDhMw;>8cl9A~kIoPh?byg*y&bS5nf69ihwGQ0KEa9iSTGfsPck zN;96sWGeHC9XRwJn3N%tpBy3D4Ew5s4h;iPyK;RPUzJr4zW;(sD940CK_R*hT9cSK zg7ee*YHz4|AqGkcFB%$S2WqkMe8Hs6Rl`6c`N|@$M@w&)h*#O!L51+`Cu68OYr+p@ zTs5Z;6E!=%2yKxfk;q*V4DDS&4BT)%qQZ){rdZ_2rm|%*3KkFufEU4z(&e5K9`mdj zFC`{+pdCa=oo?eilPrSzm8^9Br(e58!6ZyLju)2PjWV%Sgk2pp0w*W+FeF%NS7(U` zt~;5`Dc-^CatWgjabnzp?yRB$SGoB<Xz&7rW0Zpeq9gZbcQ7any=TT|+1cv1n!fSJ zuGiK(X;%`P2$c0eXbDdj{niFifFLzf<0PQjQM?ZqAUF-yW8h+wElf#5u?ZGeGncM# zuRxDA$uqyX{?eW~5^6}`E#XLv?LF9k^cY(FsOwML1@p%Mh-L+K!4YlNo>!|DBH#9p z1*mJv9?fII;2?+0la*HnVW$s|($%cKlcYfnJB1-*vT=G33pD862YXQ9fVku)R2<bV zY0~q@0+oU9INoD_8Kb}}-;VeNaG2~JHorh&XcN6gtJMn-gOkwvVWlispDCzU9H}`_ z2YGi+#&BCTS$0=NLO^m}_t_thM`gSfD>N86M+BmQ8~IDX=zB1ClI9*+gTJU-C8Ne4 zz#-HxqC#vpUb&!O7DXO2KgDtW)IwHeQMT97qTEI$WCgYcMjl8FXD%X*U!RQ3LJk82 znDC)j0?-nGdh!Tu*q8x&XrwB5<^hJ7AyjaslUNlJkAPpF0AH1<u{{E7%hKipo`g^> zq}A2c(HwH;;prWy;9%b*C0|xtV4NBdDVOgev?VJc1ohCzQPK|Xpi0<W%K^wtdFmKZ z)RbsO6T@Ld6f|*bWfl6#)J+pIS2%##p|gd|)1M4e0Exef_kTt7E@PycIPf?m=-LLf zNFzi`<B%vTC=KJz6S4ldFo@08J4GdnK)EpR#*q%+ib8b=m5}83M~G^2D#Q;(_W9MR zJ*#?Z$485r-3VYMNUQuDZU8U~QdQGTL&0)0%?A~t*okFQ6<&Bn5asGt4o!Na5O`Ng zl#v$uQ}^lxN~j6cR{|$%0zLFDa9S)1!rMp`sVEGZ;xsiqDrQvq;66HTsi3aKV=Lmh z6wr>lH!pAmW&TE0ct@0;BT9rd>E!UiN&zpxXZtsLb?JdVmSyjqgrJEHF``YtFfz_O zxjv#x1sio>`%Jh7w>B9(GtWNRQJ0(^+mR4OIGjZ<A(wa#xs7{YHyq=jZUO8gL-m=p z3x6+YCE#=Tt*G&=YG^PN4^6;#Wc62jm$>o1f2)96$sD@JAbfLZB=%E&RJGDp81b&Z z2J9{PPP0H&^eIQrI4|g19u4H>1zCJHXO|TPD?ut{)7D!vr^2fn$hNk>aTx|B*@bh+ z`v6pw!Sj2`x)$GN52($#3OD{3bsj8EHiW$eiu!&-xQ|Wr@{lr0i!M!PwlTp#A>G#m z*ETIS-!~*+Q^%#`G^32<Qrcernf%C!QCa`d%$edS^Nt}UovCcT)_GQWd*l7EA(&-z z16i6*&h|LE=*qd%mfXzADQh~b4`}AUAD=eCV+1prnDP9q<m9w*c10ZVp7QNncC8S5 z)47is5hv#;V`B6<K#5EOcUIus*G#+bI$!xGkOk5*aNFkJNS-|I`t==$-c^m-djryQ zkwl4-xMa&lhmK0}xqa^vYjccALGxz1!3^w<Vo%t~oS9I|ehIUPco8x|9A=pW?Q)xp z+5|i0h58RupCI$ugG~Glcfq-LEa63SvKyez@J*vLjwl8DzIL5YurZzTy6>J>9#WKv zeZ7S?r9CS`gpgY^W){M&EUwq`0ri~oaf%1}t_9V6ou}Gs>Q@IgF*@{k2Q~+3dpBOC zF<gbn6Wg`gq#hpl&rPIzmsJv_t+Q_6+0Ml|ehvHaEx(=+{M!wtHL!21EYW1n=$HJI z_ZI8Ttxj&cd+jp|-#;c2)-{L3UM*)5YCL#1Qxyk*?<&D}U1~rjgC3*hq0_|;w%Z(j zu93O5+h^OIXgb65>Ds}NPiGnXMx>n7eFXJWK4Iqyw;aL)CfbA58U20{Pt31PzjL)v zdAfY&W9yqp^=Te27C8m6n4qy7^e1WT=FPg3AS+X_Lj|VF=y4uAkh;aWRi1MU<8nT7 zd*RcWV|{vu*;t`V9iOG(>jVtd;~D)EaZtQWNiFGtmAdL**%ng2L1!e?>`rpR$F<nS zSgBmh0_3U^x47XHt&5pdPPe0q>TCZ%TM+qmER(A2sqB%(`lg)FCq*6Q02gk?Oh;m- zlhc4R{M)@1YkJ8x+;;va{FJ&pZs4<S*<5!>Zs*Wn)~^nEe3sVDKdlYZPuJoUru0Ng zci>#ltO{zcP)EN<W6o9LJol!9RFFKvHfAjYvss*+pDdnI&*+<Cvk{NoIj?39Fmdwn z+CK9nO=OFx%P?`&Er?7%%{6HUE&mi2<!*g%l~a(#5LkVupmK`+5tBZ_141!ay6n#= zm!qM~zZ!B?Kd(dfK1wh03ByiX#@S9A9~5wRgw+X++ls~nJ|7nLoKU#7qo|^?g~-tC z{#3hdWy2r~jb_t<F=MjTrNhGEFk!b3_?Aj*eETj1&R%Zd{X29ea}^{fxq28QPZo9P zRa@mB%o|KhOtn)|{ww-FcgPnN@9VNUOUp4ZdYdYqw{pH~{$71ObQ3iCAcFcsgokj# zIR$CyMhXV*fnDT)T!tJ---m~2kz7U(B%qsNBoIaAt1wLC2t-9!g5hUYgJ9t#f|Eta z956Ae&<v|(0=k>wQJHQ7qz-h|(dH3!U_@nR$Ue1*K#1#xC_#EjVR~!uRhb5gh#!Qp zZR!s{uUI9_%FS$je6F`#10utbbfNigre$<VQOY-Fde?p5D1hx*>?`R0{u~^Hf9_D2 z8|h{-9k?IhKNOmuTy{fN-<lgazv$N0uu<>~@PW@g+Hwf2kdVJM1zlLXmDQG7-E})} z{}AmeG>oWTz4&w^s!!6b?guwN|CJ{@{ddZe#}fb^uKQpsFBEU-<Jz4Xxl5DJ81oG| zw=XA0PrtK%Nu-+NMpeJjQ{RMlT63|0q7}{*$LQv)kw8acCxX0*8S!Uss3(QTyASg` z%^xcry`>}fj`B)%a{IHi5@{$o8W|WCNHjUAmiN_y6+tQYH`UM&sj5SZL8l%tmW3G- zp&6$4CS9&z5tWnUwx#s?A2|Zlb9M6g4+U6%Th>*yriSP<mMvYcBGKOoWhP5rYN6Sp zlluKJNIaILvu)Oji_*H44?i&)>dG<aTF&XJA0C*~Peq&0q<?Xh^|A>!-7Vg2FD=86 zHr+MhXT0w>^e|Ff8KMUnc=11FIlPj5^jkj5ZFE1vJ+#xcM=?4|_$rtFAYo6wghi=! z?l~(|+EhHdOTt}vIz&$|Sle!wjWdlagz9-37<M2hUiq#d%v<2HaeeDYz0T_0X`MK( zwa=_)6=u#T^pe<XV{>xQWy+&bU^b*4A5sN_^-;W19Cnnsr6Bi(kdSyK$=g`~{)C}h zP`A@OGVQ8sD+YgV3h8m|tE<NHklpB5g%}B;3Ii^VGvfEHynM}C6jqOK%YVcI(u-O< zd7InsR|oBK4vD<>N}HbS4???8ZRI^{mzPcZcyub0DL+Io!@3suOp^Ex-{sW5dlvQd zI)>UbY)1R%IBg1Qb|)`)nL9r<U0HDqon{d=PB$v;wB!RS?fDdW*qDe`(w0bkX-By4 zbt>(vhVq_T!-fx96`r!8vXYe?pZHq^zEUwGd`K)&6tH~RH5r&f^I5mOTli$=Y6qGm zQH|}EcgP`Z2>RW+o28kJb)I=>bMqVVGM66KHK*>?+WHO-$Xw^ww~NW|WDbu;fBgh` z`lFq7k!D^y`K2S*=VHgB_EYE-4^#8sk}G%Q`LZDJ3hTZ9FRubp8;3g-42)%SjRYQf zzVm6hlrg0d-?g(LwalD}m`D@#%$5zt5<bgcj96bdxqjnTUW;~|-c2I8Ikj15N{o>t z9<Pn^pFDMC>v?<jPS5bN`3u~os<y<exo+%!#~`-okBqlX+BC+l1K)(Ks;a28&TGd^ z1%sTM6KThUZc*-j(s$GiZ)Xj7@h6%WtlRFSuEZ?%Jgw0Fq^4dy?Z}ZG%gvenBfT3) zDmK*_`3oZsQF=)uJ$bx>NMM(i97^NK;=-TqVS2jpF!y$XXACmDDe&uih$YlXo7etQ zpTdTQ`O92Jvxj45Gv3khokJ8&Nj~c9bhC5|ViM%*g+4pMSBlrb3s5t@*+f)<4vn5x zR>p`yaHS6)Av=625hV3tw|O1&mA8juAdGw!%8PAdyKAo_cU@0G4O%09IY2rqsFe9p z4w_L+#YUqSw}&8s#Sr@^MPv-8u*!;UY(MA}Fqu*c4;0cc6f)Vu)#Rn^z7Nz?BX_5e z1IR49TP0~%BGKQABhCi@5=rd^grvqu&G*9f-KvBvYNS*cCIo6fz^ZT&n^CG&qu4By zlC4BnP(=VQ4s`v=fzikL#DWiPbMiXKxPA@P^my(JpGhDp7xPH0h9YHXPoNVtpw(kv zkO7WpaUfJu+>1XD)Zx#`se~OIsi{;Bgx7{&SDJ}pPPh$4LWl#wAPY5%gmIFoqaijE zk5i!4MIi}fN-+8piAlIc_z?l)4T#3dJ_vfN$<;3^@qPa=o{@P-*Ibg7emHi{K5Hu< z2KLm!!T+s{9s*wp&NOr+6$I7Ss0Dn$P}4McBq%FsV@c=!R@JDEUinB6Pw?T%`0&u$ zN(BVM+<+c3!aesk>_IIUDBv`^%7|>KuBNKx!$qQ$DC4KKj#_A{X|TWLgkK))@|}qS zN0SPtL+7=-E!D?7uIls>42O#by1GsjJx5E2viE<e4<S%Hx=Ngqxk<vy?6K7*J%1ZY znw*OZ@i6TtWZ&abUI$72PJtfN_$;yam^_4a(wLE~-)3E0AzDJg8jOe1d&3|aui)B_ zKg@ft-TU@5UQcr=PeQ|jDZHt-f*EqYuSMLWVb#cFT%mexInSu9N93E6H1@+x@DYjw zIIAZ@&!-#>VR;!nzjZ&K9UP$JxSB<U|J__<oHO=*#r~T}=y$c)G{PPyLG5~FH7dDj z9#$2(-W=GKPecrUdE9?&N*nze>KxazYj$?z`g2QttwFKJDb7dFmHN^8CCm9#YlwKV z-jQia%Z>lDWu&O~?dS{J>*cf5nHdap?)9m4f{9|t?gWq5Hl$>KZ3vNZ<Q5w~-U<dH z9X7#j|9rYxE7^lg_UY%VTNO*XbEx;tvhc0nZ{|NS%~RA3QqAwrU1_dr4hrMPxW5Bl zu8W+{>XAqEuk>F{UO#r{vAiz68qqS|_l$_dacGO??tP0DrBDPV2r4>0tsLk1x)?gv z6p)_zea#rnNjqJmA(?u<>l`;8xnhpDr_N4itJnjK>&375c7%EeT^Uc(>D?Q)AYan5 zIH4`SO6;%fT}}NZ`ey4lX*0u%!!-09CV>s3@|Sm2;ekPO{AxeVUV`tFgrc_p<K`(T zgOzWmu66rYw_gi;Swin_h5smiZhns2L|=Y63BNr{rBcWRd7!$$j>Rb#%Ii>S862rc zOl~v4Vr$resYi;S^2$|Uuy$%U{R*dG<aW6Hvj4iyLBsR6FG-iO%6Rx@BatTc41Q*K z3WS3yBV|3Fi)%4j)*w4L%w_O2J%b|h3&jZR6t=sdNU>K+X%W1)^@INhD+JIUwlc_j zi^kASqeGgvB`Z7}LgIKthku?M+DY!1B#n1Xr>qdvc;8uaeF%QtuzWFqy@#PXXOd%4 zl=1D|o;!SBF!9?C_-wT7;`t*fg$*~&Dwh!0cQ|+k=Xe<aS(8;voFO>6LXiH5vc;ZW z`#yFuc`6%q!|BAigy`q^9^bkW>@AkpPa--IE-6tlb5trJ5OdmY>8%iQ{28XgXJCe< zt0HjL|5{}3+S{d|PM)V)Y1tL>e%wR9tF_sqwczvKi8(Hgr-y|VgQpmdEU7BkoGXR| z_*p)GPw{(Z*576^4F3Y&N819)pc2peYRP<FYppWq2P-r-jEc`di%<mh!;SB70VRK+ z7;7EjI7ta<Pd`k`Tf0+}=SGC#_c&*B5>3&ybPnNm*ipREyaw4n8M_v6@-B>Y*|=5w z+Qls9E<uKiWVYgrkFM`r%<3~}vP2t<A0qr&!fvvm_yOmm5uHA{9=Dg1(daJ@hfO;h zR8|`uBA=BpvE4ns1(LgmuI6I;*{_6Cv(ox4%T+g3eJP^6d6Ru9A-U$I1VqqZC(P+x zKcq5uoGdzQW1~V4ZqI)@Dm&_7dbIDiIS4eWa4A-H(ub5si#0|pI<zM!%6$W|$8@Ix zgyEZ+K)csRM3K!GtM8&WyG?E7p>_4GC92Hlx&}FaDjnads_c=>D0mp3rQFE5y+-Iz zq^&NdJ`pUcTwrQzsCQg!nWkep-r(Q6-<e|XQw^fBt6UO+RgIv<L+^bWhwO%lt|&k) z<i0ic-m8fz!D7%ZFDNS+pI8#(<@z&rj%26Q8QJz{2J%Gm8&56lS!*!5-?j_+&WOIF z;1Dd@1Xn_1i?T1GaxF~053%2ryR@ne4ewXc5~)PG!%$7H6GVN?*|0l#^j&L49FpA6 zGJbaAe=?Jkr~9PH62;Y@a%$G`tIM0wjpJ`jFs67}622f;BL%rr=y&70z(iB$Q`v>N zV+#w{^+241meK=9jz@);Sc_3sI4pZ9tWb!hb(8DZ#y!KJrB}rH<L%<cjA-Gxj>(HC z29hPL|NO1A{ChM@w&EbR)%~uOjSeAlw^3w5cgLY_<7XVYV;hTPYSM}L69#EK>s)*) zHe*kdy{!bSiFu^CAY=>#xhoxH9B9Xu?XiRLgcA3#7b{hnvuTZ%F~+1%rwh%BpF=L{ zIy2{$Z7gvP>d-r#4$azVQJvW_=Um1ChLfVTPrSZQv04kqCr}~P`;6P67Oyo8kke)O z_|2w~kk4W};7m2>$4O@>7ZqzfAm8x4UK2u05Fk0rzqK3{{{wI8ID=Hd#AZ_&4kP@P zUtLUiZx!YAo`3lDLO>+;LuVH2JPT~}2)|Q{esf83m${k>VWL3};d_Om>FOAL)OtI| zE{#-%mdGflm0SaP$HcSlCFw>xHc4bV>mBbRmzD_+N${PZh%{TxJ(*mukJUPpVv0`r zJ3hOy;yMaS#(GUo9tq`d)ynO$(BWw{52ak}&mJ6qx8>v7T4VQA7+7FkI2j}R#m0-$ z(t=h}pjm~5ltoUkQxL(2m$80IW(l*u6YY{i#9GZ0jmQvw&BZ-gw~r2LshhV}EqLlr z{vBzWz~-y|PH%J=_!^7?=DaLbrR2-p`>}xjjT~-2Al^y0iiw67<UFjj4Xuuo11BU| zh}5lM*h*K#cs`aXYJ)TTZb~}Bn6|d9*EU+nT*u-L^_BW^Ef|GUyCM2Xx+Y1@o$*q> z>~woL)Og2e5@P1{Ljn<U7X4U@Yn-b;wi*#LBZ?lg;em?F6TI!QI)KA{3!-X8ENNj& z7sEhE{)niu^#z2W&@|L}3S>x{p#kVg*dyW2<|A!`*tAh}NBcqXH)rzS@A1emqEhqY z<z8-7rWTS8yf<U|#bg@qYj!1TO*2_WJG*J89>3n+kDCZ<@S5R!9jBdmgzDR`5<NQJ zF2xz^4>Db`Ci!#+InGU<R!)sHw#0OzOYS*FBS(Kcq$*krQFEsvFuF#uKdic5vN~JZ zw9o$prAGSc6aVcno*$2?PfRB7<hADHk5hJzl>TJRdGYOmQN2Y3RH?}XRJa=YGtc+t zd=QUQ+sXRHyuMr3p3kr0u+i;cLVw4Kz`EymfiK9fLefIIq%}SyU}`^d?0dY48Q$Er z#&p~ZcWVjPe*eKvsv&tX%h=kO@ri()Pm@JRyesp91>*7u;G;@p@w1rgYTeH^n`6zI zS`{2vNVUG6dry`5La432&u!e^>sX5uay$W65P~+G|2%tu%z{8x@>$4_k<y|Azoc_t za<6y=U&$6qcwpnLpP`rg-;eyB{iu$N%!TB|&bvxzpP4dV+1synLsl!AIYeZg^s<jn z!n}Nnz{cVA=V!;(&ca?FMJ|C<VNbZ8KcZnpGWmXI6oXl)M!eRjzx;8nqPkK7+u=AR zl3GsaZ&*#%X7|v``C80q?k6bIR&$4VD9b4|mZ={du94kSMzTF~UrBs%MzhoEn<8am z8D<J-mDs*dsiu}D9GbyoBY~ARmflxPXDxs(L%<&)y&}3tv&kb)^Y1t#So>;FU|$pf z2n3KZdB*yCDGvZ2olG2Sd$30o%^pp!Prn>XN?MjAU@P@gjOcg(Nt>L7F3gD$s@9Nu z*+@wNlVyJ}u1U-v?2@gu#n5iHPc=lmhVkXXaKO2<C%$|)6}~_4_3x5<*TAe+Mk|q$ zYqRx472@yMX7n03@xH;Hse>P=ISbzL7P!og)1n0hG3k4SBUIL<avJudJ85Xt?F~@1 zwYT%$+cYW!y1?P2QquL!nduVybN;F1j_$`u6ImtbfXL_NU!`6@*7^=GpGVU5w0<Fu zQ35?*6tIU*$BJf(;Jn-~h%?pl9ep@X_|PG)Sy$6(*ptVZRiGx78ST-){yRY|o6m3} zxHT20!}BNY6Y8g(CHBH-g>bdLfrX?8bB+RUuDnYVYQEWvf=dnT*XpHK8jFgJ4jIR% z9j9NONV$9}v(wW`)C?3{SV54J^E)#!73SL{9Nl8jr+dMhu)R?8l)zpy*;#RF61nKa z1k?o+uC)}2hXIwoAazQ5Ey&YWckd${tfEH#*TaJT6Ip6=$5|S=!((O4$HCi8rs(df z?gSs6X+dGXDdGp=$n%b0z_`mhVJeZof6U1v?AJ!7#wg}!>qbM$*XD(9z7&_DqVm9Q z!+t`dQqQ|Y6|xkawpm_X(?q#*hL`H2<ZX-AOjJ1fu_im9bmXfvN7&H~JEzzA71byf zhPptc_d|TwD3uEN-E!EEs`d9;%i5@rU%@F<3ghq%v>A>$Q)24XB{T_A<mcG=!I&4^ z3~C>^5vGKw%&tO#3tK8Kyo}{7=e+^&&B7TM$VKo_?5YgP*&P_#z9!55nLh~GCLR#x z?Bv*Wy#B&nBQZnumZP%}3whEcMuXe9=tJLvBR2Bq1aqn9jA3QND7%!PkL|^2`W;|e zJ9aSdYPtpNj+Sq#io>5BfdO<n(hGEsbz;~O_{BToD3f&`{X{!S{!n%!Cd*wCo*M+x z1a27Atg5#!ao+f?UEWK?K=>F`5u<26U_e}P*MXJ{JQJ!85?`y$;|t0)CRKcQ)Aj%_ zw4-dNEchCLY=^G$;MOKLxqC>kc{(mj(-##RBCp5?mCenzyM&u{0B$}WB#9d_6QuC8 zF8f4!<p`YTeH^it*BAMW300Ac$MUGJ_W~mSmAPFcwe@W^o0BEsqJdVkkYR{2yq@j- zAU%0<I3tHOX)PkB&T4%*=uF$M=CmYsiHDPVKU@EL{5So{F8%yg-SsPOT<w)!*K23m z2)PC1bU9@H={gt0$4XP}@XRCJwL1FJI#-iw{WB-}c1rlJcx`@H%T78qZcqHkXSZ6Y z^%{A6UsSl9i#;)9Qc-TYGlrplN!kR$ti;}-J-b6sy0AV?xI895?Ue|2BP?*Ef{lST zp3=tnWBr8zT7rT!tD(%Q*2KPso4rj`59hwFvO;4F+{CxIOhG;K>|k>Z&mROG1P@-~ zfu6J)nCl=Dr&96))uaHOSUO0{d=EDjv$(+7tPUR=+b1hE8f;^5M>t#ZQ}Gm0QR&N) zWl1QQ7#GJ<*Yrm(&R#m(^)ciN*<vlJK{%qH7Z8rlR>U(uA`NM0{#wWhtE6dsN60Js zWehoe9D-X!SyWU+skM(hn+rYYc@2qAj&F0&CXct&J=C%ho`Rz)ZXli2BTpGtGs4Os z_z-_x<9Mw475P|a2XjIEv1a8?v?Iy8<kPb>@Btpy4}F#{vByEq6BddH`4|rp`7h%| z1^6H^AS5^@@_aT!=`%uZy6KEee}5;|@T4Q+IkW!n!2e-<#)yBA5~g}iirC-$KJ+|L zv`^b6>|43aL4Npb$BlF@XT9Lusoj|Ch4gsM80N}Zb^Awe<K7Pz31&H37QO^N75vZt OtkMz+fEqD_!2bufENM9a literal 0 HcmV?d00001 diff --git a/images/saved_ext_menu.png b/images/saved_ext_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc3c4e37bc38a4be6ef64e2e701497b1233a296 GIT binary patch literal 13319 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 Z>x`#;v;vR7e}2u85S10F64LYk{{R&ABWnNv literal 0 HcmV?d00001 diff --git a/index.md b/index.md index e64cb21..70868de 100644 --- a/index.md +++ b/index.md @@ -434,3 +434,14 @@ _A demonstration of the interface and workflow can be viewed [here](https://www. Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension.  + +Before an extension is first uploaded to the Scratch servers, the extension menu looks like this: + + + +Extensions saved to the server and/or loaded from the server, have these options: + + + +When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. + From 814614aa4b8f74be083c323621dd2412295eb052 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Mon, 4 Aug 2014 08:51:44 -0600 Subject: [PATCH 25/47] Added an introduction section --- index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/index.md b/index.md index 70868de..44b7a70 100644 --- a/index.md +++ b/index.md @@ -5,6 +5,7 @@ layout: default --- # Contents +1. [Introduction](#intro) 1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20) 1. [Adding Blocks](#adding-blocks) 1. [Command blocks](#command-blocks) @@ -21,6 +22,16 @@ layout: default 1. [Serial Device Support](#serial-device-support) 1. [Editor Interface](#editor-interface) +# Introduction + +For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). **In this document the word _extension_ will only refer to Scratch 2.0 Javascript extensions.** + +Javascript extensions let you create any kind of block you can find in the Scratch language. Need to delay? They can do that too. As you may expect, extensions have access to web browser APIs. We even added an API for extensions to communicate with serial and HID hardware. This API requires a web browser plugin to use online but the offline editor will have it built-in (on Mac and Windows) with the next release. + +With the updates to Scratch in August 2014, extensions are now uploaded to and loaded from the Scratch servers. However, when creating an extension, your code will be initially loaded from a local file before being uploaded to the server and accessible by projects. With these updates developers now have control over their uploaded extensions in the _Extension Library_. From there developers can create, update, or download their extensions. + +For more information about the editor updates see [Editor Interface](#editor-interface). + # Writing Extensions for Scratch 2.0 Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following: From e39d1393495189efb58ed1e3bdef2c7a39c27d0a Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Mon, 4 Aug 2014 08:53:40 -0600 Subject: [PATCH 26/47] Added link to the browser plugin. --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 44b7a70..6e32485 100644 --- a/index.md +++ b/index.md @@ -26,7 +26,7 @@ layout: default For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). **In this document the word _extension_ will only refer to Scratch 2.0 Javascript extensions.** -Javascript extensions let you create any kind of block you can find in the Scratch language. Need to delay? They can do that too. As you may expect, extensions have access to web browser APIs. We even added an API for extensions to communicate with serial and HID hardware. This API requires a web browser plugin to use online but the offline editor will have it built-in (on Mac and Windows) with the next release. +Javascript extensions let you create any kind of block you can find in the Scratch language. Need to delay? They can do that too. As you may expect, extensions have access to web browser APIs. We even added an API for extensions to communicate with serial and HID hardware. This API requires a [web browser plugin](http://scratch.mit.edu/scratchr2/static/ext/download.html) to use online but the offline editor will have it built-in (on Mac and Windows) with the next release. With the updates to Scratch in August 2014, extensions are now uploaded to and loaded from the Scratch servers. However, when creating an extension, your code will be initially loaded from a local file before being uploaded to the server and accessible by projects. With these updates developers now have control over their uploaded extensions in the _Extension Library_. From there developers can create, update, or download their extensions. From 7341035996d6f9ab21f9c7d4131a8ad36aa83645 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Mon, 4 Aug 2014 08:54:36 -0600 Subject: [PATCH 27/47] Fixed typo --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 6e32485..d2593f1 100644 --- a/index.md +++ b/index.md @@ -24,7 +24,7 @@ layout: default # Introduction -For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). **In this document the word _extension_ will only refer to Scratch 2.0 Javascript extensions.** +For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). **In this document the word _extension_ will only refer to Scratch 2.0 Javascript Extensions.** Javascript extensions let you create any kind of block you can find in the Scratch language. Need to delay? They can do that too. As you may expect, extensions have access to web browser APIs. We even added an API for extensions to communicate with serial and HID hardware. This API requires a [web browser plugin](http://scratch.mit.edu/scratchr2/static/ext/download.html) to use online but the offline editor will have it built-in (on Mac and Windows) with the next release. From 54658eced9b990e76fc7155716e6a846ab9332b8 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Tue, 5 Aug 2014 16:26:32 -0600 Subject: [PATCH 28/47] Improved the editor UI documentation --- images/loaded_ext_menu.png | Bin 0 -> 10050 bytes index.md | 11 +++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 images/loaded_ext_menu.png diff --git a/images/loaded_ext_menu.png b/images/loaded_ext_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7988cda39aa33cee959207ea89e8aeaf564732 GIT binary patch literal 10050 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 a9AGeLz!AW^TK0EWo2;agM5&l@!2bb^07a_+ literal 0 HcmV?d00001 diff --git a/index.md b/index.md index d2593f1..e8a419b 100644 --- a/index.md +++ b/index.md @@ -30,7 +30,7 @@ Javascript extensions let you create any kind of block you can find in the Scrat With the updates to Scratch in August 2014, extensions are now uploaded to and loaded from the Scratch servers. However, when creating an extension, your code will be initially loaded from a local file before being uploaded to the server and accessible by projects. With these updates developers now have control over their uploaded extensions in the _Extension Library_. From there developers can create, update, or download their extensions. -For more information about the editor updates see [Editor Interface](#editor-interface). +For more information about the editor updates see [Editor Interface](#editor-interface). We've created a [forum](http://scratch.mit.edu/discuss/41/) on Scratch for approved developers to discuss extensions, ask questions, and make suggestions. # Writing Extensions for Scratch 2.0 @@ -446,13 +446,16 @@ Scratchers with access to the extension development UI will see new options in t  -Before an extension is first uploaded to the Scratch servers, the extension menu looks like this: +Extensions can be in three states while editing them. Before a new extension is first uploaded to the Scratch servers, the extension menu looks like this:  -Extensions saved to the server and/or loaded from the server, have these options: +When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. These are the options for an extension that has been saved to the server and is still connected to a local file:  -When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. +Lastly, here are the options for an extension that has been loaded with a project but is not connected to a local file: + + + From 07bcff925212b975c1795e1ea6b4fa896b01c8bb Mon Sep 17 00:00:00 2001 From: Amos Blanton <amos@scratch.mit.edu> Date: Wed, 6 Aug 2014 14:53:19 -0400 Subject: [PATCH 29/47] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index af9c3e5..43d55ec 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ scratch-extension-docs ====================== -Documentation and sample code for creating extensions with Scratch 2.0. -http://llk.github.io/scratch-extension-docs +Sample code for creating extensions with Scratch 2.0. + +See http://llk.github.io/scratch-extension-docs for documentation. + +Questions? See the Scratch extension developer's forum: +http://scratch.mit.edu/discuss/41/ From f065ced4a6a918e5aca93547e80607ff30b486a7 Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Wed, 6 Aug 2014 15:51:32 -0400 Subject: [PATCH 30/47] Added image of wedo blocks --- images/LEGO_WeDo_Extension.png | Bin 0 -> 15004 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/LEGO_WeDo_Extension.png diff --git a/images/LEGO_WeDo_Extension.png b/images/LEGO_WeDo_Extension.png new file mode 100644 index 0000000000000000000000000000000000000000..e76e449b103b7ea8dfdd8ef4618c1e8b1a2c3d34 GIT binary patch literal 15004 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 CI;uke literal 0 HcmV?d00001 From 1b9af254e1b16a4ecc56a21dd39ee2d7259c3afd Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Wed, 6 Aug 2014 16:53:49 -0400 Subject: [PATCH 31/47] New intro with copy from Amos --- index.md | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/index.md b/index.md index e8a419b..819d217 100644 --- a/index.md +++ b/index.md @@ -6,6 +6,7 @@ layout: default # Contents 1. [Introduction](#intro) +1. [Editor Interface](#editor-interface) 1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20) 1. [Adding Blocks](#adding-blocks) 1. [Command blocks](#command-blocks) @@ -20,17 +21,37 @@ layout: default 1. [Hardware Support](#hardware-support) 1. [USB HID Support](#usb-hid-support) 1. [Serial Device Support](#serial-device-support) - 1. [Editor Interface](#editor-interface) # Introduction -For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). **In this document the word _extension_ will only refer to Scratch 2.0 Javascript Extensions.** +Scratch extensions make it possible to connect Scratch projects with external hardware and information on the web through custom blocks. The sample extension code in [this github repository](https://github.com/LLK/scratch-extension-docs/) shows how to pull weather information from openweathermap.org, get input from a USB joystick, and other examples that demonstrate the range of possibilities. -Javascript extensions let you create any kind of block you can find in the Scratch language. Need to delay? They can do that too. As you may expect, extensions have access to web browser APIs. We even added an API for extensions to communicate with serial and HID hardware. This API requires a [web browser plugin](http://scratch.mit.edu/scratchr2/static/ext/download.html) to use online but the offline editor will have it built-in (on Mac and Windows) with the next release. + -With the updates to Scratch in August 2014, extensions are now uploaded to and loaded from the Scratch servers. However, when creating an extension, your code will be initially loaded from a local file before being uploaded to the server and accessible by projects. With these updates developers now have control over their uploaded extensions in the _Extension Library_. From there developers can create, update, or download their extensions. +This document explains how members of the Scratch Developer Program can develop and test extensions using their Scratch accounts. Membership in the Scratch Developer Program is currently invite only, but will be open to new members soon. We’re also developing criteria and workflow for making polished and vetted Scratch extensions publicly available to all users on the Scratch website, which we plan to publish in 2015. -For more information about the editor updates see [Editor Interface](#editor-interface). We've created a [forum](http://scratch.mit.edu/discuss/41/) on Scratch for approved developers to discuss extensions, ask questions, and make suggestions. +The UI, workflow, and protocols for developing extensions should be considered *alpha* - and subject to change as we continue to refine them and act on feedback from the developer community. Members of the Scratch developer’s program are invited to ask questions and give feedback in the [Extension Developer’s discussion forum](http://scratch.mit.edu/discuss/41/) on the Scratch website. (This forum is currently only visible to members of the developer program.) + +( For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). In this document the word extension will only refer to Scratch 2.0 Javascript Extensions. ) + +### Editor Interface +_A demonstration of the interface and workflow can be viewed [here](https://www.youtube.com/watch?v=PLU7enk1tJ0)._ + +Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension. + + + +Extensions can be in three states while editing them. Before a new extension is first uploaded to the Scratch servers, the extension menu looks like this: + + + +When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. These are the options for an extension that has been saved to the server and is still connected to a local file: + + + +Lastly, here are the options for an extension that has been loaded with a project but is not connected to a local file: + + # Writing Extensions for Scratch 2.0 @@ -439,23 +460,4 @@ ext._shutdown = function() { } ``` -### Editor Interface -_A demonstration of the interface and workflow can be viewed [here](https://www.youtube.com/watch?v=PLU7enk1tJ0)._ - -Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension. - - - -Extensions can be in three states while editing them. Before a new extension is first uploaded to the Scratch servers, the extension menu looks like this: - - - -When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. These are the options for an extension that has been saved to the server and is still connected to a local file: - - - -Lastly, here are the options for an extension that has been loaded with a project but is not connected to a local file: - - - From ee12b14db0f75138c11da81dce419a862e1bff2a Mon Sep 17 00:00:00 2001 From: "Shane M. Clements" <shanemc@media.mit.edu> Date: Thu, 7 Aug 2014 09:56:45 -0400 Subject: [PATCH 32/47] Added browser extension --- browser_extension.js | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 browser_extension.js diff --git a/browser_extension.js b/browser_extension.js new file mode 100644 index 0000000..3169774 --- /dev/null +++ b/browser_extension.js @@ -0,0 +1,45 @@ +// Scratch Extension to demonstrate some simple web browser functionality +// 2014 Shane M. Clements + +(function(ext) { + ext.alert = function(message) { + alert(message); + }; + + ext.confirm = function(question) { + return confirm(question); + }; + + ext.ask = function(question) { + return prompt(question); + }; + + ext.setTitle = function(title) { + window.document.title = title; + }; + + ext.openTab = function(location) { + window.open(location, '_blank'); + }; + + ext._shutdown = function() { + console.log('Shutting down...'); + }; + + ext._getStatus = function() { + return {status: 2, msg: 'Ready'}; + }; + + var descriptor = { + blocks: [ + [' ', 'alert %s', 'alert', ''], + ['r', 'confirm %s', 'confirm', 'Are you sure?'], + ['r', 'ask %s', 'ask', 'How are you?'], + [' ', 'set window title to %s', 'setTitle', 'title'], + [' ', 'open tab with %s', 'openTab', 'https://twitter.com/scratchteam'] + ] + }; + + ScratchExtensions.register('Browser Stuff', descriptor, ext); +})({}); + From 91ae39873522b79f36891fcc7c6d5994249b198a Mon Sep 17 00:00:00 2001 From: Amos Blanton <amos@scratch.mit.edu> Date: Tue, 23 Sep 2014 15:54:26 -0400 Subject: [PATCH 33/47] Add developer's FAQ. --- index.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 819d217..9566192 100644 --- a/index.md +++ b/index.md @@ -21,6 +21,8 @@ layout: default 1. [Hardware Support](#hardware-support) 1. [USB HID Support](#usb-hid-support) 1. [Serial Device Support](#serial-device-support) +1. [Frequently Asked Questions](#frequently-asked-questions) + # Introduction @@ -459,5 +461,26 @@ ext._shutdown = function() { device = null; } ``` - - +# Frequently Asked Questions +####What is the Scratch Developer Program? +The Scratch Developer Program consists of software developers who are interested in new technical initiatives within the Scratch ecosystem. Members of the Scratch Developer Program gain early access to initiatives such as the Scratch Extensions project. Members also have access to the Scratch extension developer forum. +####How do I join the Scratch Developer Program? +Membership in the Scratch Developer Program is currently invite only, but will be open to new members next year. This program is for programmers with knowledge of Javascript. +####What are Scratch Extensions? +Scratch extensions make it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Extensions are written in JavaScript for the online Scratch project editor. +####How do I create a Scratch extension? +You can learn more about how to create a Scratch extension here: http://llk.github.io/scratch-extension-docs/ +####Why can’t I share projects that use unpublished extensions? +Until we have an approval process in place to ensure that all extensions meet security and quality standards, it won’t be possible to “share” projects that use extensions on the Scratch website. You can download the project using the file menu, and send the .sb2 project file to others who can use the file menu to load it into the Scratch editor and try it out. +####How can I make my extension available to everyone who uses Scratch? +We’re working on an approval process for publishing Scratch extensions. We’ll make an announcement on the Scratch Extensions developer forums when we’re ready to accept submissions. Keep in mind we’re likely to choose only one official extension per functionality (hardware, web API). Here are some of the criteria we’ll be using to decide whether or not to accept an extension: + * Security + * Ease of Use + * Quality (documentation, design, code) + * Requirements (browsers, operating system, hardware, etc) + * Content (age-appropriate, copyright infringement) + +####I’m having trouble creating my extension - where can I get help? +Publish your code someplace publicly viewable, like Github, and then post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/41/) asking other developers for help. +####How do I request new features or submit bugs? +We would love to hear your thoughts and suggestions. Submit them as issues against this repository. From db4679703205c29fe780404d058fa22741564c5c Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Thu, 16 Apr 2015 10:58:00 -0700 Subject: [PATCH 34/47] Update README.md Added workaround instructions for build failure with Nokogiri 1.6.6.2 on Cygwin --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index db7cb0f..7a0f648 100644 --- a/README.md +++ b/README.md @@ -27,16 +27,39 @@ Required Cygwin packages: * make * patch * pkg-config +* zlib-devel + +Note that `bundle install` will likely take quite a while, and may appear to hang. Even with all the required packages, Jekyll on Windows doesn't seem to like running in `--watch` mode. This might be fixed by downgrading the `listen` package, but doing so means downgrading many other packages and potentially breaking compatibility. +### Troubleshooting + +#### Nokogiri fails to build + +This appears to be a bug related to Cygwin and certain versions of Nokogiri. As a workaround, you'll need to install a few more Cygwin packages: +* libxml2-devel +* libxslt-devel +* ruby-nokogiri + +Then, run this command: +```sh +bundle config build.nokogiri --use-system-libraries +``` + +After this, `bundle install` will use the version of Nokogiri installed by Cygwin rather than trying to download and build a new one. + +#### Permission denied + If you get "permission denied" related to `conftest.exe` while running `bundle install`, you may need to temporarily disable your virus protection. Remember to turn it on again after installation! +#### Jekyll fails to build your site + If Jekyll fails to build your site, you may need to provide a "fixed" version of your `COMSPEC` environment variable. The easiest way to do that is: ```sh From c720ca02515a639926fa2a6f5494b47d39e79bc6 Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 13:34:22 -0400 Subject: [PATCH 35/47] Test commit to the scratchx branch --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 9566192..31e39cf 100644 --- a/index.md +++ b/index.md @@ -26,7 +26,7 @@ layout: default # Introduction -Scratch extensions make it possible to connect Scratch projects with external hardware and information on the web through custom blocks. The sample extension code in [this github repository](https://github.com/LLK/scratch-extension-docs/) shows how to pull weather information from openweathermap.org, get input from a USB joystick, and other examples that demonstrate the range of possibilities. +Scratch extensions make it possible to connect Scratch projects with external hardware and information on the web through custom blocks. The sample extension code in [this github repository](https://github.com/LLK/scratch-extension-docs/) shows how to pull weather information from openweathermap.org, get input from a USB joystick, and other examples that demonstrate the range of possibilities. There are a lot.  From 84d85ba3b88ebfb5a9c0e01b46fd264d46eaa070 Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 16:44:16 -0400 Subject: [PATCH 36/47] scratchx documentation content --- .DS_Store | Bin 0 -> 8196 bytes images/.DS_Store | Bin 0 -> 6148 bytes images/link_to_github.png | Bin 0 -> 73681 bytes images/link_to_js_menu.png | Bin 0 -> 39028 bytes images/load_ext_buttons.png | Bin 0 -> 90301 bytes ...ension.png => old_LEGO_WeDo_Extension.png} | Bin .../{add_ext_win.png => old_add_ext_win.png} | Bin images/{bg_hr.png => old_bg_hr.png} | Bin images/{blacktocat.png => old_blacktocat.png} | Bin ...con_download.png => old_icon_download.png} | Bin ...d_ext_menu.png => old_loaded_ext_menu.png} | Bin ...{new_ext_menu.png => old_new_ext_menu.png} | Bin ...ed_ext_menu.png => old_saved_ext_menu.png} | Bin ...e_download.png => old_sprite_download.png} | Bin images/open_ext_files.png | Bin 0 -> 23126 bytes images/open_ext_url.png | Bin 0 -> 34050 bytes index.md | 151 +++++++++++++----- 17 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 .DS_Store create mode 100644 images/.DS_Store create mode 100644 images/link_to_github.png create mode 100644 images/link_to_js_menu.png create mode 100644 images/load_ext_buttons.png rename images/{LEGO_WeDo_Extension.png => old_LEGO_WeDo_Extension.png} (100%) rename images/{add_ext_win.png => old_add_ext_win.png} (100%) rename images/{bg_hr.png => old_bg_hr.png} (100%) rename images/{blacktocat.png => old_blacktocat.png} (100%) rename images/{icon_download.png => old_icon_download.png} (100%) rename images/{loaded_ext_menu.png => old_loaded_ext_menu.png} (100%) rename images/{new_ext_menu.png => old_new_ext_menu.png} (100%) rename images/{saved_ext_menu.png => old_saved_ext_menu.png} (100%) rename images/{sprite_download.png => old_sprite_download.png} (100%) create mode 100644 images/open_ext_files.png create mode 100644 images/open_ext_url.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f37e27ae0485c8c69b050e11ccf36f46c15d3d12 GIT binary patch literal 8196 zcmeHMTWl0n82<lKU}g&Rv_ol2U0BmLQY=^j*;c@8Z(M|irY*fuU1oQNc4T&@*_rLd z+N8$IgCU@a4}=Fbpkg2~n!t+>Mq?yKjF*HMYSb6sd@}Kgr~02WvrTskFA$N$Ih%9- zbI$zVoO8bU&i;F50RY>w`jY@v03cE3mX%O(hs3Y*yet(3JsgLG2RI2PjKX%9hV(M; zup?w3WFTZ9WFTZ9WZ+?7fMPaJ(p}=de>E&a20{k@mkjXlhbU!k<AI&?t@!GoLL33e z7E`xKRHt)*z(fNZ5A2+81(fdTpB^xPVsOMjA5Pb!+?{MZuyelk;eb9IFc=ww6AFsa z2^SUafN|f3WynCtz;Xt7>@R@?q`(0?@BD5ZvYb@Xa+2i1H`RX1TNXs38h<5_01Gra z>pPGI58ML(?+W}^!vQepy#RklV1beEjXee4Yx2G6oq|Q<q~KHm?p6VA72Q2evl^wb z3TMPuaE>xAEKmuM=bM~#$Ai`0PL5lq>oqmaW6_G@m8(`uvQol7tW0^Xcg&gW^)xT* zwrQE;qGjqvGN^ZJ-dL{Q=Q!44T}$?x#$<x6Z+C1@Gi@WY1UfQc+PX8@=45T%9qIM& zH(=`CSb|k_XN(Dgc5AlLZ@OmEv`lYWlKCgWs%B<(#9A7oJDOW&8>2I^SW{zk*Us4N zEc-%|Y8swu?HU@NedEH#_dodX(nnu?EtU-!e20SSw-?Lng``;SM7K{$(R7ZKTT4h$ z+dDdy1S{tgJUZ@~j_vjv8JBE=mAb^#p_F3>3m8Z_RyJ+B309WUtW?(0JfqdJdd(LN zchEDYJYE}ios8Em90yIp^1cLPS=Z<>2w+Ya9Rzb3%9qzvY}{14W!sM3dv2~>SIWxD zRb`l%vpw^qX=IK~a{7ieH)YtmX^##}aPBOl&(_jL88%AtO}4Idtx~B}%j}vwqSI}= z9Gzozale{MRXxso+cO50x+ID2%~4h9b7@vgqg(KS>*^Jy?-V^i=E{Cg!&XH-W@$;o zV!G_Zwm+e$0~0<q>~PSzvs_UJQ%*WflXio?ShK1=&xbvtx!%!n!!~sG4UN5b-!p5~ zO0_k&j>7dx(hx_r>N-ueHonDwrg_V%jW_wdGVR@J+EH;h2qUyl#%T|qhBI&$&cj9c z7_P$Sa2;;I_wWP!2=nj@{0hIppYS&<Ac+SREX6V`M-?BzN3j;`upYPLF5HbVY{phR zgop76c40pz@C0i30#4%$zJ#;*I-bF|@f~~@-^0sz1+U_l_^m&wqMRrX`0ZSYH>j4k zQ%RJ;PA$^zB+5uf=l=gll=Eu>DXy;&+KlauFFxRcr@B;ILQuY9gpzVf5n|1IhBr4< zR#k7TQ6k4kaK==j3UcaTt4ZRdDDJ&E8i_DTh=@1q>Zw`8u92pAvtesQVJn1~d6RS+ zVJn4fd2{D3MPbE4*u2@?LRVJ_{qp9%8o~l?gX+qv4NAQt%ksTT?*d$b&xGuLf}i1c z_yhie+a$P^B(_SdCaFbm6F!Cw_&7G=HWFJiK8<^DFLvSqlH9W-x;~QJAP(U$rqIAq z977W`=-~uT;uOA&ui&fr8cFahzKL()dAx+56o~I&PIkV<PsvIYQf$y^qfF7JNrRpr zf`A9Qb4voF3_Z{Zt<V8oWbc3w!EPy{1Y8QB(>yFvZH!7|c|b)T>XxGXDc(o9!pBze z-vFI=fB%0UBZSb9fslcRodGQF=<R5uS>{4;;e`2FJ4*QkWuCa-oNon$3hu)D#c`bM m;va@oj|SJ`ft~X$U7_^AUj+P{KT5;+f6qTX!}$MT<NrTkJ<BHm literal 0 HcmV?d00001 diff --git a/images/.DS_Store b/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a3dd8922246b1930fd36aa14a9c74c446b36f6bb GIT binary patch literal 6148 zcmeH~-)_?|6vmIYUQ{4Z#m1Pln_O~*v^R*RZU_kpiCu6RmadGk&`fKy?lO<TL-7E- zP5B+$$=o)rxIzf|NcQJAK3|SM|BFS$oK%;`A_EcWlN5VT$U02lYg)4%U-KL^mLrpy zl#<DnT(7l`6;Xkxz`v$|uH6?>uwEx}!^(YJzccwNmE`h9Zh3e0t|&)&QRcMQ&Ekyo znzXZ6kc;fCaeR|0eBWh^ceR1#C!Qh8J}jkN$R(a*c_5mM2r5wHn!wl@jrq93vq$T~ zvM5)`Hn%<PX8Gk=jPKL4mL+FL%h2Pl`}<an9}8=6sG`mHbK<y=5!z}GMwDk8I8=*} z<7LZnji2^DqbH@zDK#o}_e0ePnT}ef_i`$4<pWHg(053EMvdyMqclYu{Z2QlsuQxl zYFV3T#!E_XA9?1F=?9AKw`>z)nG;tt{@Zy_ZHecg<(Z=OJuKnqZ{^ZiWb~lh_2d88 z!zpXv4s}$gKOF`1T8d2P#4Y|hj!oabz*+FLVP5OJG7m)5tg=A|M@3{s_n3*Q6Z%6H z7-zOx|Ea^6M+Kq+QGr$g-5(N?V(PJWXtxeBdj$Y{R9mC0zX$4*cuYOk4tawa=L$Mk z<F6RTxl^C`cB#kOp>r4GFCWH#*>2plF!t+U!UJYf3o(ldL<Lq9*mchXJ^xQP-~U&< z;$u`GD)2ukV0y#z;R!wRXX{$u^sG%tpGj)ku6Af$$oz3^3wnn-Bw6EKq6IMZSUaQ! Qi$4NZhL}YK{;C4M0h^)irT_o{ literal 0 HcmV?d00001 diff --git a/images/link_to_github.png b/images/link_to_github.png new file mode 100644 index 0000000000000000000000000000000000000000..52515ce297b2a673f01fac008f6eb5c120515190 GIT binary patch literal 73681 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 literal 0 HcmV?d00001 diff --git a/images/link_to_js_menu.png b/images/link_to_js_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..10371ec9d3111a2645dc7800e80f314a28c70d8a GIT binary patch literal 39028 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	SR9TR9+75}nxIsH@piXh@c<(ESO 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 PaIf<wNaIQ)^xb~}u;dF4 literal 0 HcmV?d00001 diff --git a/images/load_ext_buttons.png b/images/load_ext_buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..ede4798c8aeeeac6f874ded0e6aeda526c62c509 GIT binary patch literal 90301 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 literal 0 HcmV?d00001 diff --git a/images/LEGO_WeDo_Extension.png b/images/old_LEGO_WeDo_Extension.png similarity index 100% rename from images/LEGO_WeDo_Extension.png rename to images/old_LEGO_WeDo_Extension.png diff --git a/images/add_ext_win.png b/images/old_add_ext_win.png similarity index 100% rename from images/add_ext_win.png rename to images/old_add_ext_win.png diff --git a/images/bg_hr.png b/images/old_bg_hr.png similarity index 100% rename from images/bg_hr.png rename to images/old_bg_hr.png diff --git a/images/blacktocat.png b/images/old_blacktocat.png similarity index 100% rename from images/blacktocat.png rename to images/old_blacktocat.png diff --git a/images/icon_download.png b/images/old_icon_download.png similarity index 100% rename from images/icon_download.png rename to images/old_icon_download.png diff --git a/images/loaded_ext_menu.png b/images/old_loaded_ext_menu.png similarity index 100% rename from images/loaded_ext_menu.png rename to images/old_loaded_ext_menu.png diff --git a/images/new_ext_menu.png b/images/old_new_ext_menu.png similarity index 100% rename from images/new_ext_menu.png rename to images/old_new_ext_menu.png diff --git a/images/saved_ext_menu.png b/images/old_saved_ext_menu.png similarity index 100% rename from images/saved_ext_menu.png rename to images/old_saved_ext_menu.png diff --git a/images/sprite_download.png b/images/old_sprite_download.png similarity index 100% rename from images/sprite_download.png rename to images/old_sprite_download.png diff --git a/images/open_ext_files.png b/images/open_ext_files.png new file mode 100644 index 0000000000000000000000000000000000000000..337e77dd244b7dcd7a0356d042ee635560db7dc3 GIT binary patch literal 23126 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 aA?n~XKAI_|e{^f{prxk&tX#$F^Zx+NnBT_$ literal 0 HcmV?d00001 diff --git a/images/open_ext_url.png b/images/open_ext_url.png new file mode 100644 index 0000000000000000000000000000000000000000..52e34c3062886c9914f2fc268599a88bab3f0ecc GIT binary patch literal 34050 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 literal 0 HcmV?d00001 diff --git a/index.md b/index.md index 31e39cf..221a8ba 100644 --- a/index.md +++ b/index.md @@ -5,9 +5,12 @@ layout: default --- # Contents -1. [Introduction](#intro) -1. [Editor Interface](#editor-interface) -1. [Writing Extensions for Scratch 2.0](#writing-extensions-for-scratch-20) +1. [Introduction](#introduction) +1. [Using ScratchX](#using-scratchx) + 1. [Link to JavaScript file](#link-to-a-js-file-on-github) + 1. [Open an SBX file](#open-an-sbx-file) + 1. [Open a ScratchX link](#open-a-scratchx-link) +1. [Writing Extensions for ScratchX](#writing-extensions-for-scratchx) 1. [Adding Blocks](#adding-blocks) 1. [Command blocks](#command-blocks) 1. [Command blocks that wait](#command-blocks-that-wait) @@ -21,41 +24,59 @@ layout: default 1. [Hardware Support](#hardware-support) 1. [USB HID Support](#usb-hid-support) 1. [Serial Device Support](#serial-device-support) -1. [Frequently Asked Questions](#frequently-asked-questions) +1. [Sharing Extensions](#sharing-extensions) +1. [Developer FAQ](#developer-faq) # Introduction -Scratch extensions make it possible to connect Scratch projects with external hardware and information on the web through custom blocks. The sample extension code in [this github repository](https://github.com/LLK/scratch-extension-docs/) shows how to pull weather information from openweathermap.org, get input from a USB joystick, and other examples that demonstrate the range of possibilities. There are a lot. +ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](https://scratch.mit.edu). This experimental functionality, which we call Experimental Extensions, makes it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Some Experimental Extensions enable Scratch to connect with physical hardware, such as robots or programmable devices. Other Experimental Extensions connect web-based data and services to Scratch, such as weather data or text-to-speech services. Extensions are written in JavaScript for the online ScratchX project editor. - - -This document explains how members of the Scratch Developer Program can develop and test extensions using their Scratch accounts. Membership in the Scratch Developer Program is currently invite only, but will be open to new members soon. We’re also developing criteria and workflow for making polished and vetted Scratch extensions publicly available to all users on the Scratch website, which we plan to publish in 2015. - -The UI, workflow, and protocols for developing extensions should be considered *alpha* - and subject to change as we continue to refine them and act on feedback from the developer community. Members of the Scratch developer’s program are invited to ask questions and give feedback in the [Extension Developer’s discussion forum](http://scratch.mit.edu/discuss/41/) on the Scratch website. (This forum is currently only visible to members of the developer program.) +This documentation serves as a guide for developers who want to create Experimental Extensions for Scratch and run them on the ScratchX platform. If you are not a developer and have have questions about using ScratchX or Experimental Extensions, please read our [FAQ for non-developers](scratchx.org/faq) *missing. If you are looking for Official Extensions within Scratch, such as the LEGO WeDo, you can learn more about Scratch 2.0 extensions on the [Scratch Wiki](http://wiki.scratch.mit.edu/wiki/Scratch_Extension). ( For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). In this document the word extension will only refer to Scratch 2.0 Javascript Extensions. ) -### Editor Interface -_A demonstration of the interface and workflow can be viewed [here](https://www.youtube.com/watch?v=PLU7enk1tJ0)._ +# Using ScratchX -Scratchers with access to the extension development UI will see new options in the _Extension Library_ window and the extension drop-down menus. In the _Extension Library_ there is a button called _My Extensions_ which will load a list of the user's own extensions. The first item in this list is an option for creating a new extension. +The ScratchX interface is very similar to the Scratch 2.0 interface with the exception of a set of features for loading Experimental Extensions. You can load your extension into ScratchX in the following ways: - +## Link to a .JS file on Github -Extensions can be in three states while editing them. Before a new extension is first uploaded to the Scratch servers, the extension menu looks like this: +ScratchX does not host JavaScript extensions. Instead, we provide a way to link ScratchX to a publicly-hosted JS file. - +In order to link a .JS file, you must first put your file on to Github, a web-based Git repository hosting service. This requires you set up a [Github](http://github.com) account if you don’t already have, and push your JS file to a [Github page](https://pages.github.com/). -When editing an extension, the editor will load and watch (we call it 'connecting' to a file) a local file. This allows the editor to detect changes to the file and display a reload button when changes are available for loading. These are the options for an extension that has been saved to the server and is still connected to a local file: +_Need information about crossdomain.xml here, and encourage people to think about backwards compatibility_ - +Next, to link ScratchX to your hosted file, right-click or shift-click on the ‘Load Experimental Extension’ from within the ‘More Blocks’ category in the blocks menu: -Lastly, here are the options for an extension that has been loaded with a project but is not connected to a local file: + - +This launches a dialogue that prompts you to link to your Github page. You’ll need to copy the link to your publicly-hosted JS file on Github and then paste it into the box on the dialogue: -# Writing Extensions for Scratch 2.0 + + +## Open an SBX File + +You can load an SBX (.sbx) file that contains a pointer to your extension from the homepage directly through this element: + + + +The same dialogue can be launched from within Scratch by clicking on the green ‘Load Experimental Extension’ in the top right or from within the ‘More Blocks’ section of the blocks menu: + + + +For help on creating SBX files / projects with pointers to Github-hosted JS files, see our [documentation on sharing here](#sharing-extensions). + +## Open a ScratchX link + +Developers who have hosted their extensions (.js file) or sample projects (.sbx file) on Github can create a ScratchX url that points directly to their extension. This link can then be shared with the public. Learn how to generate the ScratchX link later on in [this documentation](#sharing-extensions). + +Users can then visit that URL directly in their browsers or enter it into the homepage element on ScratchX.org: + + + +# Writing Extensions for ScratchX Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following: @@ -461,26 +482,68 @@ ext._shutdown = function() { device = null; } ``` -# Frequently Asked Questions -####What is the Scratch Developer Program? -The Scratch Developer Program consists of software developers who are interested in new technical initiatives within the Scratch ecosystem. Members of the Scratch Developer Program gain early access to initiatives such as the Scratch Extensions project. Members also have access to the Scratch extension developer forum. -####How do I join the Scratch Developer Program? -Membership in the Scratch Developer Program is currently invite only, but will be open to new members next year. This program is for programmers with knowledge of Javascript. -####What are Scratch Extensions? -Scratch extensions make it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Extensions are written in JavaScript for the online Scratch project editor. -####How do I create a Scratch extension? -You can learn more about how to create a Scratch extension here: http://llk.github.io/scratch-extension-docs/ -####Why can’t I share projects that use unpublished extensions? -Until we have an approval process in place to ensure that all extensions meet security and quality standards, it won’t be possible to “share” projects that use extensions on the Scratch website. You can download the project using the file menu, and send the .sb2 project file to others who can use the file menu to load it into the Scratch editor and try it out. -####How can I make my extension available to everyone who uses Scratch? -We’re working on an approval process for publishing Scratch extensions. We’ll make an announcement on the Scratch Extensions developer forums when we’re ready to accept submissions. Keep in mind we’re likely to choose only one official extension per functionality (hardware, web API). Here are some of the criteria we’ll be using to decide whether or not to accept an extension: - * Security - * Ease of Use - * Quality (documentation, design, code) - * Requirements (browsers, operating system, hardware, etc) - * Content (age-appropriate, copyright infringement) - -####I’m having trouble creating my extension - where can I get help? -Publish your code someplace publicly viewable, like Github, and then post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/41/) asking other developers for help. -####How do I request new features or submit bugs? -We would love to hear your thoughts and suggestions. Submit them as issues against this repository. + +# Sharing Extensions + +ScratchX does not host JavaScript extensions. Instead, we provide a way to link ScratchX to a Github-hosted JavaScript extension. ScratchX can also point to a Github-hosted project file (.sbx) that in turn points to a Github-hosted JavaScript (.js) file. This is particularly useful if you’d like to share a demo project that makes use of an experimental extension. + +The first step is to set up a [Github account](https://github.com/) if you don’t already have one, and push your JS file and/or SBX file to a [Github page](https://pages.github.com/). + +Next, paste the public URL of your JavaScript (.js) and/or project (.sbx) file into the URL generator below: + +_Need to create this for the public!_ + + +Clicking on this URL will open a Scratch editor with your extension and/or project data loaded from Github. You can now share that link with the world! + + +# Developer FAQ + +##What is ScratchX? +ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](#https://scratch.mit.edu). + +##What’s the difference between Scratch and ScratchX? +[Scratch](#https://scratch.mit.edu) is a programming language and online community where you can create your own interactive stories, games, and animations. ScratchX is a separate experimental platform built to test experimental Scratch features, also known as Experimental Extensions. There is no login or community component to ScratchX, and projects created within ScratchX can only be run on ScratchX. + +##What are Scratch Extensions? +Scratch extensions make it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Extensions are written in JavaScript for the ScratchX project editor. + +##What is the difference between Experimental and Official Extensions? +Experimental Extensions are extensions created for Scratch by the community; they are not managed or endorsed by Scratch in any way. Experimental Extensions can run only in the ScratchX environment. Official Extensions can be found and run from within Scratch 2.0 (both [online](#https://scratch.mit.edu) and [offline](#https://scratch.mit.edu/scratch2download/_) editors), accessible in the ‘More Blocks’ section of the blocks menu. + +##How can I make my extension Official? +At this time, we’re focused on building a library of Experimental Extensions on the ScratchX platform. We plan to work with developers over time to bring many of these Experimental Extensions into Scratch as official extensions. If you’d like to suggest your extension be highlighted on ScratchX, please email us at: scratch-extensions@media.mit.edu + +##What are the criteria for being added to the ScratchX library? +Here are some of the criteria we’ll be using to decide whether or not to add an extension to the library: + +* Security +* Ease of Use +* Quality (documentation, design, code) +* Requirements (browsers, operating system, hardware, etc) +* Content (age-appropriate, copyright infringement) + +##Where can I find example Experimental Extensions to play around with? +We have linked to a few example extensions on the [ScratchX](#http://scratchx.org) homepage. We plan to highlight additional extensions in the coming months in a ScratchX library. + +##Who can make an extension? +Developers with a [GitHub](#https://github.com) account and a knowledge of JavaScript can create and test Experimental Extensions on ScratchX. To learn more about how to make extensions, see our [documentation here](#writing-extensions-for-scratchx) + +##How do I create a Scratch extension? +You can learn more about how to create a Scratch extension [in our documentation here](#sharing-extensions) + +##How do I share my Experimental Extensions? +The easiest way to share your experimental extension is to create a scratchx.org url that points to your extension (hosted on GitHub). You can learn more about [sharing your extension here](#sharing-extensions). + +##Why can’t I open .sbx files in Scratch 2.0 or the offline editor? +Experimental Extensions are extensions created for Scratch by the community and are not managed or endorsed by Scratch in any way. Because of this, we do not allow Experimental Extensions to run on the larger Scratch site. + +##I’m having trouble creating my extension - where can I get help? +Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](#http://scratch.mit.edu/discuss/41/) asking other developers for help. + +##What is going to happen to the older Experimental Extension tools in Scratch 2.0? +We plan to phase out the older Experimental Extensions platform on Scratch 2.0 at the end of November 2015. We encourage everyone to migrate their extensions out of Scratch 2.0 and into GitHub for use in ScratchX before November 2015. + +##How do I request new features or submit bugs? +We would love to hear your thoughts and suggestions. Submit them as issues here on our [GitHub repository](#https://github.com/LLK/scratchx/issues). + From bf7c7ff1a88b2c1c1f68f09d6a1dcf1bf79aa691 Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 16:49:37 -0400 Subject: [PATCH 37/47] fix images --- .DS_Store | Bin 8196 -> 8196 bytes images/link_to_github.png | Bin 73681 -> 39222 bytes images/open_ext_files.png | Bin 23126 -> 37877 bytes images/open_ext_url.png | Bin 34050 -> 35433 bytes index.md | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.DS_Store b/.DS_Store index f37e27ae0485c8c69b050e11ccf36f46c15d3d12..59dea6c314159d20dd22c01bc9c47270cbc59a63 100644 GIT binary patch delta 20 bcmZp1XmQwZPLSQwLPx>K*l6=rL47^|NQMSU delta 20 bcmZp1XmQwZPLSQ)Qb)na!gBLfL47^|NX7<K diff --git a/images/link_to_github.png b/images/link_to_github.png index 52515ce297b2a673f01fac008f6eb5c120515190..a6995ce6ab67a6fc572b2dde967fee750aa625d2 100644 GIT binary patch literal 39222 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 literal 73681 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 diff --git a/images/open_ext_files.png b/images/open_ext_files.png index 337e77dd244b7dcd7a0356d042ee635560db7dc3..2c724167b72b0bd0385a90d4b2cca3107dee251b 100644 GIT binary patch literal 37877 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 TLy-KtQCk`IO1@0i#P7cV;Hx;i literal 23126 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 aA?n~XKAI_|e{^f{prxk&tX#$F^Zx+NnBT_$ diff --git a/images/open_ext_url.png b/images/open_ext_url.png index 52e34c3062886c9914f2fc268599a88bab3f0ecc..952e5427ef66a33bdfb3510ae01f2b388f476cb2 100644 GIT binary patch literal 35433 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%0AJn{Etab9Z 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 literal 34050 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 diff --git a/index.md b/index.md index 221a8ba..fcce2ae 100644 --- a/index.md +++ b/index.md @@ -60,7 +60,7 @@ This launches a dialogue that prompts you to link to your Github page. You’ll You can load an SBX (.sbx) file that contains a pointer to your extension from the homepage directly through this element: - + The same dialogue can be launched from within Scratch by clicking on the green ‘Load Experimental Extension’ in the top right or from within the ‘More Blocks’ section of the blocks menu: @@ -74,7 +74,7 @@ Developers who have hosted their extensions (.js file) or sample projects (.sbx Users can then visit that URL directly in their browsers or enter it into the homepage element on ScratchX.org: - + # Writing Extensions for ScratchX From bba0d1663748d23ffeb832ae002f6f4cb68167ae Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 16:51:32 -0400 Subject: [PATCH 38/47] fix images again --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index fcce2ae..a0937fd 100644 --- a/index.md +++ b/index.md @@ -60,7 +60,7 @@ This launches a dialogue that prompts you to link to your Github page. You’ll You can load an SBX (.sbx) file that contains a pointer to your extension from the homepage directly through this element: - + The same dialogue can be launched from within Scratch by clicking on the green ‘Load Experimental Extension’ in the top right or from within the ‘More Blocks’ section of the blocks menu: From 074920ed56df0eb1693861fd1c7c5cc588ec09e1 Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 20:07:32 -0400 Subject: [PATCH 39/47] added FAQs --- .DS_Store | Bin 8196 -> 8196 bytes index.md | 3 +++ 2 files changed, 3 insertions(+) diff --git a/.DS_Store b/.DS_Store index 59dea6c314159d20dd22c01bc9c47270cbc59a63..77040ccd7dac4b3d5ab9d45869ea8f8193e5ddc3 100644 GIT binary patch delta 16 XcmZp1XmQwZNsw9B!eH}NL47^|G!+Gk delta 16 XcmZp1XmQwZNs!sd*l6=rL47^|G$sX% diff --git a/index.md b/index.md index a0937fd..6b53b65 100644 --- a/index.md +++ b/index.md @@ -535,6 +535,9 @@ You can learn more about how to create a Scratch extension [in our documentation ##How do I share my Experimental Extensions? The easiest way to share your experimental extension is to create a scratchx.org url that points to your extension (hosted on GitHub). You can learn more about [sharing your extension here](#sharing-extensions). +##What is an .sbx file? +The SBX (.sbx) ScratchX file format is the file format used to encode ScratchX projects when they are downloaded to a user's computer. SBX files can only be used on the ScratchX site. Other Scratch environments use different formats, including the .sb2 format for Scratch 2.0 (read more [here](#http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%282.0%29)) and .sb format for Scratch 1.4 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%281.4%29)) + ##Why can’t I open .sbx files in Scratch 2.0 or the offline editor? Experimental Extensions are extensions created for Scratch by the community and are not managed or endorsed by Scratch in any way. Because of this, we do not allow Experimental Extensions to run on the larger Scratch site. From f3a3c59879c8249b13a7df7896ccecad1b7de370 Mon Sep 17 00:00:00 2001 From: Kasia Chmielinski <kaschm@media.mit.edu> Date: Thu, 7 May 2015 20:10:26 -0400 Subject: [PATCH 40/47] fixed urls --- index.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/index.md b/index.md index 6b53b65..fbfa4c2 100644 --- a/index.md +++ b/index.md @@ -500,16 +500,16 @@ Clicking on this URL will open a Scratch editor with your extension and/or proje # Developer FAQ ##What is ScratchX? -ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](#https://scratch.mit.edu). +ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](https://scratch.mit.edu). ##What’s the difference between Scratch and ScratchX? -[Scratch](#https://scratch.mit.edu) is a programming language and online community where you can create your own interactive stories, games, and animations. ScratchX is a separate experimental platform built to test experimental Scratch features, also known as Experimental Extensions. There is no login or community component to ScratchX, and projects created within ScratchX can only be run on ScratchX. +[Scratch](https://scratch.mit.edu) is a programming language and online community where you can create your own interactive stories, games, and animations. ScratchX is a separate experimental platform built to test experimental Scratch features, also known as Experimental Extensions. There is no login or community component to ScratchX, and projects created within ScratchX can only be run on ScratchX. ##What are Scratch Extensions? Scratch extensions make it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Extensions are written in JavaScript for the ScratchX project editor. ##What is the difference between Experimental and Official Extensions? -Experimental Extensions are extensions created for Scratch by the community; they are not managed or endorsed by Scratch in any way. Experimental Extensions can run only in the ScratchX environment. Official Extensions can be found and run from within Scratch 2.0 (both [online](#https://scratch.mit.edu) and [offline](#https://scratch.mit.edu/scratch2download/_) editors), accessible in the ‘More Blocks’ section of the blocks menu. +Experimental Extensions are extensions created for Scratch by the community; they are not managed or endorsed by Scratch in any way. Experimental Extensions can run only in the ScratchX environment. Official Extensions can be found and run from within Scratch 2.0 (both [online](https://scratch.mit.edu) and [offline](https://scratch.mit.edu/scratch2download/_) editors), accessible in the ‘More Blocks’ section of the blocks menu. ##How can I make my extension Official? At this time, we’re focused on building a library of Experimental Extensions on the ScratchX platform. We plan to work with developers over time to bring many of these Experimental Extensions into Scratch as official extensions. If you’d like to suggest your extension be highlighted on ScratchX, please email us at: scratch-extensions@media.mit.edu @@ -524,10 +524,10 @@ Here are some of the criteria we’ll be using to decide whether or not to add a * Content (age-appropriate, copyright infringement) ##Where can I find example Experimental Extensions to play around with? -We have linked to a few example extensions on the [ScratchX](#http://scratchx.org) homepage. We plan to highlight additional extensions in the coming months in a ScratchX library. +We have linked to a few example extensions on the [ScratchX](http://scratchx.org) homepage. We plan to highlight additional extensions in the coming months in a ScratchX library. ##Who can make an extension? -Developers with a [GitHub](#https://github.com) account and a knowledge of JavaScript can create and test Experimental Extensions on ScratchX. To learn more about how to make extensions, see our [documentation here](#writing-extensions-for-scratchx) +Developers with a [GitHub](https://github.com) account and a knowledge of JavaScript can create and test Experimental Extensions on ScratchX. To learn more about how to make extensions, see our [documentation here](#writing-extensions-for-scratchx) ##How do I create a Scratch extension? You can learn more about how to create a Scratch extension [in our documentation here](#sharing-extensions) @@ -536,17 +536,17 @@ You can learn more about how to create a Scratch extension [in our documentation The easiest way to share your experimental extension is to create a scratchx.org url that points to your extension (hosted on GitHub). You can learn more about [sharing your extension here](#sharing-extensions). ##What is an .sbx file? -The SBX (.sbx) ScratchX file format is the file format used to encode ScratchX projects when they are downloaded to a user's computer. SBX files can only be used on the ScratchX site. Other Scratch environments use different formats, including the .sb2 format for Scratch 2.0 (read more [here](#http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%282.0%29)) and .sb format for Scratch 1.4 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%281.4%29)) +The SBX (.sbx) ScratchX file format is the file format used to encode ScratchX projects when they are downloaded to a user's computer. SBX files can only be used on the ScratchX site. Other Scratch environments use different formats, including the .sb2 format for Scratch 2.0 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%282.0%29)) and .sb format for Scratch 1.4 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%281.4%29)) ##Why can’t I open .sbx files in Scratch 2.0 or the offline editor? Experimental Extensions are extensions created for Scratch by the community and are not managed or endorsed by Scratch in any way. Because of this, we do not allow Experimental Extensions to run on the larger Scratch site. ##I’m having trouble creating my extension - where can I get help? -Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](#http://scratch.mit.edu/discuss/41/) asking other developers for help. +Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/41/) asking other developers for help. ##What is going to happen to the older Experimental Extension tools in Scratch 2.0? We plan to phase out the older Experimental Extensions platform on Scratch 2.0 at the end of November 2015. We encourage everyone to migrate their extensions out of Scratch 2.0 and into GitHub for use in ScratchX before November 2015. ##How do I request new features or submit bugs? -We would love to hear your thoughts and suggestions. Submit them as issues here on our [GitHub repository](#https://github.com/LLK/scratchx/issues). +We would love to hear your thoughts and suggestions. Submit them as issues here on our [GitHub repository](https://github.com/LLK/scratchx/issues). From c498f089fb1c0d6320ff3ea677c6eb51563ca658 Mon Sep 17 00:00:00 2001 From: Sayamindu Dasgupta <sayamindu@gmail.com> Date: Fri, 8 May 2015 16:33:03 -0400 Subject: [PATCH 41/47] Clean up section on loading JS files. --- index.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/index.md b/index.md index fbfa4c2..46ef6f3 100644 --- a/index.md +++ b/index.md @@ -7,7 +7,7 @@ layout: default 1. [Introduction](#introduction) 1. [Using ScratchX](#using-scratchx) - 1. [Link to JavaScript file](#link-to-a-js-file-on-github) + 1. [Load a JavaScript extension file](#load-a-javascript-file-hosted-on-github) 1. [Open an SBX file](#open-an-sbx-file) 1. [Open a ScratchX link](#open-a-scratchx-link) 1. [Writing Extensions for ScratchX](#writing-extensions-for-scratchx) @@ -40,19 +40,26 @@ This documentation serves as a guide for developers who want to create Experimen The ScratchX interface is very similar to the Scratch 2.0 interface with the exception of a set of features for loading Experimental Extensions. You can load your extension into ScratchX in the following ways: -## Link to a .JS file on Github +## Load a JavaScript file hosted on Github -ScratchX does not host JavaScript extensions. Instead, we provide a way to link ScratchX to a publicly-hosted JS file. +ScratchX does not host JavaScript extensions directly. Instead, we provide a way to load a publicly-accessible JavaScript extensions within the ScratchX editor. Currently hosts for JavaScript extensions are restricted to the `github.io` domain. -In order to link a .JS file, you must first put your file on to Github, a web-based Git repository hosting service. This requires you set up a [Github](http://github.com) account if you don’t already have, and push your JS file to a [Github page](https://pages.github.com/). +To create a publicly accessible JavaScript extension, you need to +* Create a public repository on [Github](https://github.com) +* Create a `gh-pages` branch in that repository +* Clone the branch locally and then `git add` and `git commit` the JavaScript files to the `gh-pages` branch. +* Push the updated branch to Github +This will utilize the [Pages](https://pages.github.com/) service of GitHub to make the JavaScript files available over <your_github_username>.github.io/<repository_name>. Details on how to use Github Pages is available [here](https://pages.github.com/). + +You will also need to add a crossdomain.xml file _Need information about crossdomain.xml here, and encourage people to think about backwards compatibility_ -Next, to link ScratchX to your hosted file, right-click or shift-click on the ‘Load Experimental Extension’ from within the ‘More Blocks’ category in the blocks menu: +Next, to link ScratchX to your hosted file, click on the ‘Load Experimental Extension’ from within the ‘More Blocks’ category in the blocks menu:  -This launches a dialogue that prompts you to link to your Github page. You’ll need to copy the link to your publicly-hosted JS file on Github and then paste it into the box on the dialogue: +This launches a dialogue that prompts you to link to the JavaScript file hosted on Github.io. You’ll need to copy the link to your publicly-hosted JS file on Github and then paste it into the box on the dialogue:  From a02b3e2b9499b63aaf61b8838ef426988445cdf4 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 8 May 2015 19:06:23 -0700 Subject: [PATCH 42/47] Added crossdomain.xml instructions --- index.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/index.md b/index.md index 46ef6f3..ea728c0 100644 --- a/index.md +++ b/index.md @@ -50,10 +50,11 @@ To create a publicly accessible JavaScript extension, you need to * Clone the branch locally and then `git add` and `git commit` the JavaScript files to the `gh-pages` branch. * Push the updated branch to Github -This will utilize the [Pages](https://pages.github.com/) service of GitHub to make the JavaScript files available over <your_github_username>.github.io/<repository_name>. Details on how to use Github Pages is available [here](https://pages.github.com/). +This will utilize the [Pages](https://pages.github.com/) service of GitHub to make the JavaScript files available over <your_github_username>.github.io/<repository_name>. Details on how to use Github Pages are available [here](https://pages.github.com/). -You will also need to add a crossdomain.xml file -_Need information about crossdomain.xml here, and encourage people to think about backwards compatibility_ +You will also need to [set up a crossdomain.xml file](#user-content-setting-up-crossdomainxml). + +_Need to encourage people to think about backwards compatibility_ Next, to link ScratchX to your hosted file, click on the ‘Load Experimental Extension’ from within the ‘More Blocks’ category in the blocks menu: @@ -494,7 +495,7 @@ ext._shutdown = function() { ScratchX does not host JavaScript extensions. Instead, we provide a way to link ScratchX to a Github-hosted JavaScript extension. ScratchX can also point to a Github-hosted project file (.sbx) that in turn points to a Github-hosted JavaScript (.js) file. This is particularly useful if you’d like to share a demo project that makes use of an experimental extension. -The first step is to set up a [Github account](https://github.com/) if you don’t already have one, and push your JS file and/or SBX file to a [Github page](https://pages.github.com/). +The first step is to set up a [Github account](https://github.com/) if you don’t already have one, and push your JS file and/or SBX file to a [Github page](https://pages.github.com/). You will also need to [set up a crossdomain.xml file](#user-content-setting-up-crossdomainxml). Next, paste the public URL of your JavaScript (.js) and/or project (.sbx) file into the URL generator below: @@ -503,6 +504,27 @@ _Need to create this for the public!_ Clicking on this URL will open a Scratch editor with your extension and/or project data loaded from Github. You can now share that link with the world! +## Setting up crossdomain.xml + +In order for ScratchX to load your extensions and sample projects from GitHub Pages, you will need to put a file called `crossdomain.xml` into your user or organization repository. This security file lets Flash know that it is allowed to load resources from your site. It will grant Flash access to files on your public repositories, but will not grant access to any private repositories. For more information about crossdomain.xml, please see [this article on Adobe Developer Connection](http://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html). + +Please note that the `crossdomain.xml` file must be in the root of the host. That is, if your extension file is at `http://user.github.io/repository/extension.js` then Flash will look for `http://user.github.io/crossdomain.xml`. This means that the `crossdomain.xml` file cannot be a part of a project repository. + +Follow these steps to set up a basic `crossdomain.xml` that will grant access only to ScratchX: + +1. Follow the instructions on the [GitHub Pages site](https://pages.github.com/) to **create a user or organization repository** and then **clone the repository**. +2. Instead of (or in addition to) creating an `index.html` file, create a file called `crossdomain.xml` -- see example below. +3. Commit the `crossdomain.xml` file and push or sync it to GitHub as shown in the GitHub Pages instructions. + +Here is an example `crossdomain.xml` suitable for use with ScratchX: +```XML +<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> + <site-control permitted-cross-domain-policies="master-only"/> + <allow-access-from domain="scratchx.org"/> + <allow-access-from domain="llk.github.io"/> +</cross-domain-policy> +``` + # Developer FAQ From 86477a32f4398830bd8355e8708cad6659804081 Mon Sep 17 00:00:00 2001 From: Chris Willis-Ford <cwillisf@users.noreply.github.com> Date: Fri, 8 May 2015 19:17:53 -0700 Subject: [PATCH 43/47] Added URL instructions --- index.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index ea728c0..dab4992 100644 --- a/index.md +++ b/index.md @@ -497,12 +497,17 @@ ScratchX does not host JavaScript extensions. Instead, we provide a way to link The first step is to set up a [Github account](https://github.com/) if you don’t already have one, and push your JS file and/or SBX file to a [Github page](https://pages.github.com/). You will also need to [set up a crossdomain.xml file](#user-content-setting-up-crossdomainxml). -Next, paste the public URL of your JavaScript (.js) and/or project (.sbx) file into the URL generator below: +ScratchX can automatically load an extension or project specified on its URL. To do this, simply add `?url=http://...` to the end of the ScratchX URL. For example, if your extension is at `http://user.github.io/repository/extension.js` then your ScratchX URL would be: -_Need to create this for the public!_ +`http://scratchx.org/?url=http://user.github.io/repository/extension.js` +Just as saving a project from Scratch keeps track of the extensions used by the project, saving a project .sbx file from ScratchX keeps track of the GitHub URLs of the experimental extensions in use. As an extension author, this means that you can save an example project and share that .sbx file to give others an idea of what can be done with your extension. -Clicking on this URL will open a Scratch editor with your extension and/or project data loaded from Github. You can now share that link with the world! +You can construct a URL for a project .sbx file the same way as for an extension. For example, if your project is at `http://user.github.io/repository/example.sbx` then your ScratchX URL would be: + +`http://scratchx.org/?url=http://user.github.io/repository/example.sbx` + +Clicking on these URLs will open a ScratchX editor with your extension and/or project data loaded from Github. You can now share that link with the world! ## Setting up crossdomain.xml From 661797432cdcfc605bfeafe5520f95e0fa83bb3e Mon Sep 17 00:00:00 2001 From: Tim <blob8108@gmail.com> Date: Wed, 13 May 2015 23:03:17 +0100 Subject: [PATCH 44/47] Fix discussion forum link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43d55ec..4bfcc55 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ Sample code for creating extensions with Scratch 2.0. See http://llk.github.io/scratch-extension-docs for documentation. Questions? See the Scratch extension developer's forum: -http://scratch.mit.edu/discuss/41/ +http://scratch.mit.edu/discuss/48/ From edbedb4e1277b975b1d9f07bece2ec6d3da59291 Mon Sep 17 00:00:00 2001 From: Ray Schamp <rschamp@users.noreply.github.com> Date: Fri, 15 May 2015 10:00:38 -0400 Subject: [PATCH 45/47] Update forum link in FAQ --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index dab4992..4d2b05e 100644 --- a/index.md +++ b/index.md @@ -576,7 +576,7 @@ The SBX (.sbx) ScratchX file format is the file format used to encode ScratchX p Experimental Extensions are extensions created for Scratch by the community and are not managed or endorsed by Scratch in any way. Because of this, we do not allow Experimental Extensions to run on the larger Scratch site. ##I’m having trouble creating my extension - where can I get help? -Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/41/) asking other developers for help. +Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/48/) asking other developers for help. ##What is going to happen to the older Experimental Extension tools in Scratch 2.0? We plan to phase out the older Experimental Extensions platform on Scratch 2.0 at the end of November 2015. We encourage everyone to migrate their extensions out of Scratch 2.0 and into GitHub for use in ScratchX before November 2015. From ec1a2f54be22cc0641fa96b851383d6390617705 Mon Sep 17 00:00:00 2001 From: Ray Schamp <ray@scratch.mit.edu> Date: Fri, 15 May 2015 13:56:53 -0400 Subject: [PATCH 46/47] Redirect traffic to ScratchX --- index.md | 581 +------------------------------------------------------ 1 file changed, 2 insertions(+), 579 deletions(-) diff --git a/index.md b/index.md index 4d2b05e..292b642 100644 --- a/index.md +++ b/index.md @@ -3,584 +3,7 @@ title: 'Scratch Extensions' tagline: 'Extensions for Scratch 2.0' layout: default --- -# Contents -1. [Introduction](#introduction) -1. [Using ScratchX](#using-scratchx) - 1. [Load a JavaScript extension file](#load-a-javascript-file-hosted-on-github) - 1. [Open an SBX file](#open-an-sbx-file) - 1. [Open a ScratchX link](#open-a-scratchx-link) -1. [Writing Extensions for ScratchX](#writing-extensions-for-scratchx) - 1. [Adding Blocks](#adding-blocks) - 1. [Command blocks](#command-blocks) - 1. [Command blocks that wait](#command-blocks-that-wait) - 1. [Reporter blocks](#reporter-blocks) - 1. [Reporter blocks that wait](#reporter-blocks-that-wait) - 1. [Hat blocks](#hat-blocks) - 1. [The Extension Descriptor](#the-extension-descriptor) - 1. [Blocks](#blocks) - 1. [Menus](#menus) - 1. [URL](#url) - 1. [Hardware Support](#hardware-support) - 1. [USB HID Support](#usb-hid-support) - 1. [Serial Device Support](#serial-device-support) -1. [Sharing Extensions](#sharing-extensions) -1. [Developer FAQ](#developer-faq) - - -# Introduction - -ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](https://scratch.mit.edu). This experimental functionality, which we call Experimental Extensions, makes it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Some Experimental Extensions enable Scratch to connect with physical hardware, such as robots or programmable devices. Other Experimental Extensions connect web-based data and services to Scratch, such as weather data or text-to-speech services. Extensions are written in JavaScript for the online ScratchX project editor. - -This documentation serves as a guide for developers who want to create Experimental Extensions for Scratch and run them on the ScratchX platform. If you are not a developer and have have questions about using ScratchX or Experimental Extensions, please read our [FAQ for non-developers](scratchx.org/faq) *missing. If you are looking for Official Extensions within Scratch, such as the LEGO WeDo, you can learn more about Scratch 2.0 extensions on the [Scratch Wiki](http://wiki.scratch.mit.edu/wiki/Scratch_Extension). - -( For information about Scratch 2.0 HTTP extensions please see [this page](http://wiki.scratch.mit.edu/wiki/Scratch_Extension_Protocol_(2.0)#HTTP_Extensions). In this document the word extension will only refer to Scratch 2.0 Javascript Extensions. ) - -# Using ScratchX - -The ScratchX interface is very similar to the Scratch 2.0 interface with the exception of a set of features for loading Experimental Extensions. You can load your extension into ScratchX in the following ways: - -## Load a JavaScript file hosted on Github - -ScratchX does not host JavaScript extensions directly. Instead, we provide a way to load a publicly-accessible JavaScript extensions within the ScratchX editor. Currently hosts for JavaScript extensions are restricted to the `github.io` domain. - -To create a publicly accessible JavaScript extension, you need to -* Create a public repository on [Github](https://github.com) -* Create a `gh-pages` branch in that repository -* Clone the branch locally and then `git add` and `git commit` the JavaScript files to the `gh-pages` branch. -* Push the updated branch to Github - -This will utilize the [Pages](https://pages.github.com/) service of GitHub to make the JavaScript files available over <your_github_username>.github.io/<repository_name>. Details on how to use Github Pages are available [here](https://pages.github.com/). - -You will also need to [set up a crossdomain.xml file](#user-content-setting-up-crossdomainxml). - -_Need to encourage people to think about backwards compatibility_ - -Next, to link ScratchX to your hosted file, click on the ‘Load Experimental Extension’ from within the ‘More Blocks’ category in the blocks menu: - - - -This launches a dialogue that prompts you to link to the JavaScript file hosted on Github.io. You’ll need to copy the link to your publicly-hosted JS file on Github and then paste it into the box on the dialogue: - - - -## Open an SBX File - -You can load an SBX (.sbx) file that contains a pointer to your extension from the homepage directly through this element: - - - -The same dialogue can be launched from within Scratch by clicking on the green ‘Load Experimental Extension’ in the top right or from within the ‘More Blocks’ section of the blocks menu: - - - -For help on creating SBX files / projects with pointers to Github-hosted JS files, see our [documentation on sharing here](#sharing-extensions). - -## Open a ScratchX link - -Developers who have hosted their extensions (.js file) or sample projects (.sbx file) on Github can create a ScratchX url that points directly to their extension. This link can then be shared with the public. Learn how to generate the ScratchX link later on in [this documentation](#sharing-extensions). - -Users can then visit that URL directly in their browsers or enter it into the homepage element on ScratchX.org: - - - -# Writing Extensions for ScratchX - -Writing a Javascript extension for Scratch 2.0 starts with some boilerplate code, which looks like the following: - -```javascript -(function(ext) { - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ] - }; - - // Register the extension - ScratchExtensions.register('Sample extension', descriptor, ext); -})({}); -``` - -## Adding Blocks - -An extension may define a number of blocks, of different types (e.g. a command block, or a hat block, or a reporter block). Blocks can take in parameters. - -### Command blocks - -To add a simple _command_ block, there needs to be an entry in the ``descriptors.blocks`` list, and a corresponding function for it. The simplest block possible is shown below (it does nothing). - -```javascript -(function(ext) { - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.my_first_block = function() { - // Code that gets executed when the block is run - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - // Block type, block name, function name - [' ', 'my first block', 'my_first_block'], - ] - }; - - // Register the extension - ScratchExtensions.register('My first extension', descriptor, ext); -})({}); -``` - -### Command blocks that wait - -Sometimes it is necessary to have a command block that waits (e.g. if a block plays a sound, it may be a good idea to wait till the sound playback finishes). The sample extension below implements a "random wait" block to show how that can be done. Note the use of the ``console.log`` statement in the code - most Javascript methods, as well as [jQuery](http://jquery.com/) methods will work fine in an extension. - -```javascript -(function(ext) { - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - // Functions for block with type 'w' will get a callback function as the - // final argument. This should be called to indicate that the block can - // stop waiting. - ext.wait_random = function(callback) { - wait = Math.random(); - console.log('Waiting for ' + wait + ' seconds'); - window.setTimeout(function() { - callback(); - }, wait*1000); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['w', 'wait for random time', 'wait_random'], - ] - }; - - // Register the extension - ScratchExtensions.register('Random wait extension', descriptor, ext); -})({}); -``` - -### Reporter blocks - -Blocks can also return values, and they are called _reporter_ blocks. The corresponding JavaScript function for a reporter block needs to return a value, as shown in the example below (note that this example also shows how to make blocks accept parameters). - -```javascript -(function(ext) { - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.power = function(base, exponent) { - return Math.pow(base, exponent); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - // Block type, block name, function name, param1 default value, param2 default value - ['r', '%n ^ %n', 'power', 2, 3], - ] - }; - - // Register the extension - ScratchExtensions.register('Sample extension', descriptor, ext); -})({}); -``` - -### Reporter blocks that wait - -One common use-case for reporter blocks is getting data from online web-services, where the blocks need to wait for the web-api call to complete. The following example shows how to fetch the current temperature of a city using an AJAX call to [Open Weather Map API](http://openweathermap.org/API). Note that the block type is _R_ instead of _r_ (which is for a non-blocking reporter). - -```javascript -(function(ext) { - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.get_temp = function(location, callback) { - // Make an AJAX call to the Open Weather Maps API - $.ajax({ - url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial', - dataType: 'jsonp', - success: function( weather_data ) { - // Got the data - parse it and return the temperature - temperature = weather_data['main']['temp']; - callback(temperature); - } - }); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], - ] - }; - - // Register the extension - ScratchExtensions.register('Weather extension', descriptor, ext); -})({}); -``` - -### Hat blocks - -Hat blocks go on top of block stacks - examples of Scratch hat blocks include "when green flag clicked" or "when this sprite clicked". To create a hat block through an extension, the block type needs to be set to _h_, as shown in the example below. - -```javascript -(function(ext) { - var alarm_went_off = false; // This becomes true after the alarm goes off - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.set_alarm = function(time) { - window.setTimeout(function() { - alarm_went_off = true; - }, time*1000); - }; - - ext.when_alarm = function() { - // Reset alarm_went_off if it is true, and return true - // otherwise, return false. - if (alarm_went_off === true) { - alarm_went_off = false; - return true; - } - - return false; - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['', 'run alarm after %n seconds', 'set_alarm', '2'], - ['h', 'when alarm goes off', 'when_alarm'], - ] - }; - - // Register the extension - ScratchExtensions.register('Alarm extension', descriptor, ext); -})({}); -``` - -## The Extension Descriptor - -The extension descriptor can be used for more than just listing the blocks offered by your extension. Here is an example of a more complex descriptor: -```javascript -var descriptor = { - blocks: [ - ['w', 'turn motor on for %n secs', 'motorOnFor', 1], - [' ', 'turn motor on', 'allMotorsOn'], - [' ', 'turn motor off', 'allMotorsOff'], - [' ', 'set motor power %n', 'startMotorPower', 100], - [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'], - ['h', 'when distance %m.lessMore %n', 'whenDistance', '<', 20], - ['h', 'when tilt %m.eNe %n', 'whenTilt', '=', 1], - ['r', 'distance', 'getDistance'], - ['r', 'tilt', 'getTilt'] - ], - menus: { - motorDirection: ['this way', 'that way', 'reverse'], - lessMore: ['<', '>'], - eNe: ['=','not ='] - }, - url: 'http://info.scratch.mit.edu/WeDo' -}; -``` - -### Blocks - -The blocks property is an array of block definitions. Each block definition is an array of three or more items. The required items are: op code, formatted label, and method name. These may optionally be followed by default block argument values. - -The full list of block types available to an extension is as follows. Note that any operation that will run for more than a few milliseconds or will wait for an external event should be run asynchronously, as described above in the [Reporter blocks that wait](#reporter-blocks-that-wait) and [Command blocks that wait](#command-blocks-that-wait) sections. - -| Op Code | Meaning -| ------- | ------- -| `' '` (space) | Synchronous command -| `'w'` | Asynchronous command -| `'r'` | Synchronous reporter -| `'R'` | Asynchronous reporter -| `'h'` | Hat block (synchronous, returns boolean, true = run stack) - -Each block argument is identified by a `%` character and the character following it specifies the type. The types are: `%n` for number, `%s` for string, and `%m` for menu. Menus also identify which menu to use with a period and the name of the menu like this: `%m.menuName`. - -### Menus - -The `menus` property is an object whose properties define the menus used by block arguments in the extension. The property name is the menu name as it is used in the block definition(s). The property value is an array of options to display in the menu dropdown interface in Scratch. - -For example, the `setMotorDirection` block in the example above includes `%m.motorDirection`, which will cause it to display a menu with `'this way'`, `'that way'`, and `'reverse'` as options. - -### URL - -The `url` property refers to a web page which describes the extension. Ideally, this page would describe each block, give examples, and identify any hardware or software required to use the extension. If the user clicks the `'About [extension name]...'` menu item within Scratch, this is the URL that will be opened. - -## Hardware Support - -Scratch provides its own set of APIs in order to allow extensions to access certain types of hardware. Currently, Scratch extensions may access the following types of hardware: -- Serial devices such as the PicoBoard -- USB HID devices such as joysticks or the LEGO WeDo - -Extensions that request hardware access are required to implement two additional methods on the extension instance: `_deviceConnected()` and `_deviceRemoved()`. Both methods receive a device instance. To use the integrated hardware functions of the Scratch Extension API you pass the hardware information in the registration call: -```javascript -ScratchExtensions.register('Example Name', descriptor_object, ext_instance[, hardware_info]); -``` - -The `_getStatus()` method of your extension can be used to indicate whether your extension has successfully communicated with a hardware device. For example: -```javascript -ext._getStatus = function() { - if(!device) return {status: 1, msg: 'Device not connected'}; - return {status: 2, msg: 'Device connected'}; -} -``` - -The value returned by `_getStatus()` corresponds to the color of the status 'light' in Scratch and indicates the general state of your extension. The `msg` property can be used to provide more specific information. - -| Value | Color | Meaning | -| ----- | ------ | --------- | -| 0 | red | error | -| 1 | yellow | not ready | -| 2 | green | ready | - -The details of the `hardware_info` parameter and the `_deviceConnected()` and `_deviceRemoved()` methods are described below in sections specific to each type of device. - -*_API Note: The hardware API is still somewhat experimental and may change in the future. In particular, we will soon be making a change to methods that return hardware data, such as `read()` for HID devices: these methods will take a callback in instead of returning data directly. This change is necessary to improve compatibility and allow us to expand the variety of environments in which hardware extensions are available._* - -### USB HID Support -_An example HID device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/joystickExtension.js)._ -_More information about the HID protocol is available [here](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)._ - -To let the extension system know that your extension is interested in USB HID devices, pass an object like this for the `hardware_info` parameter of the `register()` method: -```javascript -var hid_info = {type: 'hid', vendor: 0x0694, product: 0x0003}; -ScratchExtensions.register('Example', descriptor, ext, hid_info); -``` -The `vendor` and `product` values indicate the USB vendor and product ID of the device your extension supports. These values are frequently expressed as four-digit hexadecimal values, as indicated with the `0x` prefix in the JavaScript above. - -If a device is connected with matching vendor and product IDs, Scratch will call the `_deviceConnected()` method on your extension and pass an object representing that device. Your `_deviceConnected()` method should keep track of the device object and set up communication as necessary for your needs. For example, this will start polling the device for new HID data every 20 milliseconds: -```javascript -var poller = null; -ext._deviceConnected = function(dev) { - if(device) return; - - device = dev; - device.open(); - - poller = setInterval(function() { - rawData = device.read(); - }, 20); -}; -``` - -Once a connection to your device is established, your extension may use the `read()` and `write()` methods on the device object to communicate with it. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received. -* `device.read(48)` will attempt to read 48 bytes of data and return an ArrayBuffer containing any data successfully read. Note that one packet of HID data is 48 bytes. *_This method is likely to change soon. See the API Note above._* -* `device.write(buffer)` will send the given ArrayBuffer's data to the device. - -Your extension will also be notified if a matching device is disconnected, allowing your extension a chance to stop communication: -```javascript -ext._deviceRemoved = function(dev) { - if(device != dev) return; - if(poller) poller = clearInterval(poller); - device = null; -}; -``` - -Finally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example: -```javascript -ext._shutdown = function() { - if(poller) poller = clearInterval(poller); - if(device) device.close(); - device = null; -} -``` - -### Serial Device Support -_An example serial device extension is available [here](https://github.com/LLK/scratch-extension-docs/blob/master/picoExtension.js)._ - -To let the extension system know that your extension is interested in serial devices, pass an object like this for the `hardware_info` parameter of the `register()` method: -```javascript -var serial_info = {type: 'serial'}; -ScratchExtensions.register('Example', descriptor, ext, serial_info); -``` - -Your extension's `_deviceConnected()` method will be called for each serial port present on the computer. Your extension is responsible for checking if a suitable device is attached to that port and continuing on to the next port if necessary. Do not assume that the first time Scratch calls your `_deviceConnected()` will correspond to your device's serial port. The PicoBoard extension shows an example of how to deal with this situation: if no valid PicoBoard communication is received on a given port withing a particular timeout, the extension assumes that there is no PicoBoard on that port and continues scanning to the next port. -```javascript -var potentialDevices = []; -ext._deviceConnected = function(dev) { - potentialDevices.push(dev); - - if (!device) { - tryNextDevice(); - } -} -``` - -To communicate with a given serial port, your extension should open it with whichever options are appropriate for your device. These parameters are based on [Boost.Asio's serial port options](http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/serial_port_base.html). For a PicoBoard: -```javascript -device.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 }); -``` -The full set of options available for a serial port are as follows: - -| Option | Default | Valid values | Description -| -------------- | ------- | ------------ | ----------- -| bitRate | 9600 | Any valid baud rate | Up to The bit (or baud) rate at which to communicate. -| bufferSize | 4096 | Up to 8192 | The maximum amount of data that can be received at a time. -| ctsFlowControl | 1 (software) | 0 (none), 1 (software), 2 (hardware) | The type of flow control to use. -| dataBits | 8 | 5, 6, 7, 8 | The number of data bits per character. -| parityBit | 0 (none) | 0 (none), 1 (odd), 2 (even) | Whether and how to use the parity bit in each character. -| stopBits | 1 (1.5 bits) | 0 (1 bit), 1 (1.5 bits), 2 (2 bits) | The number of stop bits per character. - -Once a connection to your device is established, your extension may use the `send()` method to send data to your device, and the `set_receive_handler()` method to register a function to handle received data. These methods use [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) objects to contain data being sent or received. -* `device.send(buffer)` will send the given ArrayBuffer's data to the device. -* `device.set_receive_handler(myReceiveHandler)` will result in `myReceiveHandler(buffer)` being called any time Scratch receives data from the device. Your receive handler will be supplied an ArrayBuffer containing the received data. - -Your extension will also be notified if a device is disconnected, allowing your extension a chance to stop communication: -```javascript -ext._deviceRemoved = function(dev) { - if(device != dev) return; - if(poller) poller = clearInterval(poller); - device = null; -}; -``` - -Finally, your extension's `_shutdown()` method will be executed when the extension itself is shut down. For example: -```javascript -ext._shutdown = function() { - if(poller) poller = clearInterval(poller); - if(device) device.close(); - device = null; -} -``` - -# Sharing Extensions - -ScratchX does not host JavaScript extensions. Instead, we provide a way to link ScratchX to a Github-hosted JavaScript extension. ScratchX can also point to a Github-hosted project file (.sbx) that in turn points to a Github-hosted JavaScript (.js) file. This is particularly useful if you’d like to share a demo project that makes use of an experimental extension. - -The first step is to set up a [Github account](https://github.com/) if you don’t already have one, and push your JS file and/or SBX file to a [Github page](https://pages.github.com/). You will also need to [set up a crossdomain.xml file](#user-content-setting-up-crossdomainxml). - -ScratchX can automatically load an extension or project specified on its URL. To do this, simply add `?url=http://...` to the end of the ScratchX URL. For example, if your extension is at `http://user.github.io/repository/extension.js` then your ScratchX URL would be: - -`http://scratchx.org/?url=http://user.github.io/repository/extension.js` - -Just as saving a project from Scratch keeps track of the extensions used by the project, saving a project .sbx file from ScratchX keeps track of the GitHub URLs of the experimental extensions in use. As an extension author, this means that you can save an example project and share that .sbx file to give others an idea of what can be done with your extension. - -You can construct a URL for a project .sbx file the same way as for an extension. For example, if your project is at `http://user.github.io/repository/example.sbx` then your ScratchX URL would be: - -`http://scratchx.org/?url=http://user.github.io/repository/example.sbx` - -Clicking on these URLs will open a ScratchX editor with your extension and/or project data loaded from Github. You can now share that link with the world! - -## Setting up crossdomain.xml - -In order for ScratchX to load your extensions and sample projects from GitHub Pages, you will need to put a file called `crossdomain.xml` into your user or organization repository. This security file lets Flash know that it is allowed to load resources from your site. It will grant Flash access to files on your public repositories, but will not grant access to any private repositories. For more information about crossdomain.xml, please see [this article on Adobe Developer Connection](http://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html). - -Please note that the `crossdomain.xml` file must be in the root of the host. That is, if your extension file is at `http://user.github.io/repository/extension.js` then Flash will look for `http://user.github.io/crossdomain.xml`. This means that the `crossdomain.xml` file cannot be a part of a project repository. - -Follow these steps to set up a basic `crossdomain.xml` that will grant access only to ScratchX: - -1. Follow the instructions on the [GitHub Pages site](https://pages.github.com/) to **create a user or organization repository** and then **clone the repository**. -2. Instead of (or in addition to) creating an `index.html` file, create a file called `crossdomain.xml` -- see example below. -3. Commit the `crossdomain.xml` file and push or sync it to GitHub as shown in the GitHub Pages instructions. - -Here is an example `crossdomain.xml` suitable for use with ScratchX: -```XML -<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> - <site-control permitted-cross-domain-policies="master-only"/> - <allow-access-from domain="scratchx.org"/> - <allow-access-from domain="llk.github.io"/> -</cross-domain-policy> -``` - - -# Developer FAQ - -##What is ScratchX? -ScratchX is a platform that enables people to test experimental functionality built by developers for the visual programming language [Scratch](https://scratch.mit.edu). - -##What’s the difference between Scratch and ScratchX? -[Scratch](https://scratch.mit.edu) is a programming language and online community where you can create your own interactive stories, games, and animations. ScratchX is a separate experimental platform built to test experimental Scratch features, also known as Experimental Extensions. There is no login or community component to ScratchX, and projects created within ScratchX can only be run on ScratchX. - -##What are Scratch Extensions? -Scratch extensions make it possible for Scratch to interface with external hardware and information outside of the Scratch website through new blocks. Extensions are written in JavaScript for the ScratchX project editor. - -##What is the difference between Experimental and Official Extensions? -Experimental Extensions are extensions created for Scratch by the community; they are not managed or endorsed by Scratch in any way. Experimental Extensions can run only in the ScratchX environment. Official Extensions can be found and run from within Scratch 2.0 (both [online](https://scratch.mit.edu) and [offline](https://scratch.mit.edu/scratch2download/_) editors), accessible in the ‘More Blocks’ section of the blocks menu. - -##How can I make my extension Official? -At this time, we’re focused on building a library of Experimental Extensions on the ScratchX platform. We plan to work with developers over time to bring many of these Experimental Extensions into Scratch as official extensions. If you’d like to suggest your extension be highlighted on ScratchX, please email us at: scratch-extensions@media.mit.edu - -##What are the criteria for being added to the ScratchX library? -Here are some of the criteria we’ll be using to decide whether or not to add an extension to the library: - -* Security -* Ease of Use -* Quality (documentation, design, code) -* Requirements (browsers, operating system, hardware, etc) -* Content (age-appropriate, copyright infringement) - -##Where can I find example Experimental Extensions to play around with? -We have linked to a few example extensions on the [ScratchX](http://scratchx.org) homepage. We plan to highlight additional extensions in the coming months in a ScratchX library. - -##Who can make an extension? -Developers with a [GitHub](https://github.com) account and a knowledge of JavaScript can create and test Experimental Extensions on ScratchX. To learn more about how to make extensions, see our [documentation here](#writing-extensions-for-scratchx) - -##How do I create a Scratch extension? -You can learn more about how to create a Scratch extension [in our documentation here](#sharing-extensions) - -##How do I share my Experimental Extensions? -The easiest way to share your experimental extension is to create a scratchx.org url that points to your extension (hosted on GitHub). You can learn more about [sharing your extension here](#sharing-extensions). - -##What is an .sbx file? -The SBX (.sbx) ScratchX file format is the file format used to encode ScratchX projects when they are downloaded to a user's computer. SBX files can only be used on the ScratchX site. Other Scratch environments use different formats, including the .sb2 format for Scratch 2.0 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%282.0%29)) and .sb format for Scratch 1.4 (read more [here](http://wiki.scratch.mit.edu/wiki/Scratch_File_Format_%281.4%29)) - -##Why can’t I open .sbx files in Scratch 2.0 or the offline editor? -Experimental Extensions are extensions created for Scratch by the community and are not managed or endorsed by Scratch in any way. Because of this, we do not allow Experimental Extensions to run on the larger Scratch site. - -##I’m having trouble creating my extension - where can I get help? -Once you’ve published your code on Github, post a link to it in the [Scratch extension developers forum](http://scratch.mit.edu/discuss/48/) asking other developers for help. - -##What is going to happen to the older Experimental Extension tools in Scratch 2.0? -We plan to phase out the older Experimental Extensions platform on Scratch 2.0 at the end of November 2015. We encourage everyone to migrate their extensions out of Scratch 2.0 and into GitHub for use in ScratchX before November 2015. - -##How do I request new features or submit bugs? -We would love to hear your thoughts and suggestions. Submit them as issues here on our [GitHub repository](https://github.com/LLK/scratchx/issues). +# Documentation has moved +The extensions documentation has moved to the [ScratchX Wiki](https://github.com/LLK/scratchx/wiki) \ No newline at end of file From 0c2d604be47bd571a4f8337f6e6bf0408cb537a7 Mon Sep 17 00:00:00 2001 From: Ray Schamp <ray@scratch.mit.edu> Date: Fri, 15 May 2015 14:01:20 -0400 Subject: [PATCH 47/47] Redirect traffic to ScratchX --- README.md | 11 +- alarm_extension.js | 44 ------- browser_extension.js | 45 ------- joystickExtension.js | 76 ----------- localstorage_extension.js | 46 ------- picoExtension.js | 202 ----------------------------- power_extension.js | 30 ----- random_wait_extension.js | 36 ----- speech_to_text_extension.js | 39 ------ text_to_speech_extension.js | 51 -------- text_to_speech_simple_extension.js | 30 ----- weather_extension.js | 39 ------ 12 files changed, 3 insertions(+), 646 deletions(-) delete mode 100644 alarm_extension.js delete mode 100644 browser_extension.js delete mode 100644 joystickExtension.js delete mode 100644 localstorage_extension.js delete mode 100644 picoExtension.js delete mode 100644 power_extension.js delete mode 100644 random_wait_extension.js delete mode 100644 speech_to_text_extension.js delete mode 100644 text_to_speech_extension.js delete mode 100644 text_to_speech_simple_extension.js delete mode 100644 weather_extension.js diff --git a/README.md b/README.md index 4bfcc55..ce62abb 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,4 @@ -scratch-extension-docs -====================== +This repository has moved +========================= -Sample code for creating extensions with Scratch 2.0. - -See http://llk.github.io/scratch-extension-docs for documentation. - -Questions? See the Scratch extension developer's forum: -http://scratch.mit.edu/discuss/48/ +Please find [documentation](https://github.com/LLK/scratchx/wiki), [example extensions](https://github.com/LLK/scratchx/wiki/Example-Extensions) and more at the [ScratchX repository](https://github.com/LLK/scratchx/). diff --git a/alarm_extension.js b/alarm_extension.js deleted file mode 100644 index 89239d6..0000000 --- a/alarm_extension.js +++ /dev/null @@ -1,44 +0,0 @@ -/* Extension demonstrating a hat block */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ - -new (function() { - var ext = this; - var alarm_went_off = false; // This becomes true after the alarm goes off - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.set_alarm = function(time) { - window.setTimeout(function() { - alarm_went_off = true; - }, time*1000); - }; - - ext.when_alarm = function() { - // Reset alarm_went_off if it is true, and return true - // otherwise, return false. - if (alarm_went_off === true) { - alarm_went_off = false; - return true; - } - - return false; - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['', 'run alarm after %n seconds', 'set_alarm', '2'], - ['h', 'when alarm goes off', 'when_alarm'], - ] - }; - - // Register the extension - ScratchExtensions.register('Alarm extension', descriptor, ext); -})(); \ No newline at end of file diff --git a/browser_extension.js b/browser_extension.js deleted file mode 100644 index 3169774..0000000 --- a/browser_extension.js +++ /dev/null @@ -1,45 +0,0 @@ -// Scratch Extension to demonstrate some simple web browser functionality -// 2014 Shane M. Clements - -(function(ext) { - ext.alert = function(message) { - alert(message); - }; - - ext.confirm = function(question) { - return confirm(question); - }; - - ext.ask = function(question) { - return prompt(question); - }; - - ext.setTitle = function(title) { - window.document.title = title; - }; - - ext.openTab = function(location) { - window.open(location, '_blank'); - }; - - ext._shutdown = function() { - console.log('Shutting down...'); - }; - - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - var descriptor = { - blocks: [ - [' ', 'alert %s', 'alert', ''], - ['r', 'confirm %s', 'confirm', 'Are you sure?'], - ['r', 'ask %s', 'ask', 'How are you?'], - [' ', 'set window title to %s', 'setTitle', 'title'], - [' ', 'open tab with %s', 'openTab', 'https://twitter.com/scratchteam'] - ] - }; - - ScratchExtensions.register('Browser Stuff', descriptor, ext); -})({}); - diff --git a/joystickExtension.js b/joystickExtension.js deleted file mode 100644 index 2e72d29..0000000 --- a/joystickExtension.js +++ /dev/null @@ -1,76 +0,0 @@ -// joystickExtension.js -// Shane M. Clements, November 2013 -// Joystick Scratch Extension -// -// This is an extension for development and testing of the Scratch Javascript Extension API. - -new (function() { - var device = null; - var input = null; - var poller = null; - var ext = this; - - ext._deviceConnected = function(dev) { - if(device) return; - - device = dev; - device.open(); - - poller = setInterval(function() { - input = device.read(48); - }, 10); - -// setInterval(function() { console.log(input); }, 100); - }; - - ext._deviceRemoved = function(dev) { - if(device != dev) return; - device = null; - stopPolling(); - }; - - function stopPolling() { - if(poller) clearInterval(poller); - poller = null; - } - - ext._shutdown = function() { - if(poller) clearInterval(poller); - poller = null; - - if(device) device.close(); - device = null; - } - - ext._getStatus = function() { - if(!device) return {status: 1, msg: 'Controller disconnected'}; - return {status: 2, msg: 'Controller connected'}; - } - - // Converts a byte into a value of the range -1 -> 1 with two decimal places of precision - function convertByteStr(byte) { return (parseInt(byte, 16) - 128) / 128; } - ext.readJoystick = function(name) { - var retval = null; - switch(name) { - case 'leftX': retval = convertByteStr(input[12] + input[13]); break; - case 'leftY': retval = -convertByteStr(input[14] + input[15]); break; - case 'rightX': retval = convertByteStr(input[16] + input[17]); break; - case 'rightY': retval = -convertByteStr(input[18] + input[19]); break; - } - - // If it's hardly off center then treat it as centered - if(Math.abs(retval) < 0.1) retval = 0; - - return retval.toFixed(2); - } - - var descriptor = { - blocks: [ - ['r', 'get joystick %m.joystickPart', 'readJoystick', 'leftX'] - ], - menus: { - joystickPart: ['leftX', 'leftY', 'rightX', 'rightY'] - } - }; - ScratchExtensions.register('Joystick', descriptor, ext, {type: 'hid', vendor:0x054c, product:0x0268}); -})(); diff --git a/localstorage_extension.js b/localstorage_extension.js deleted file mode 100644 index 2f42433..0000000 --- a/localstorage_extension.js +++ /dev/null @@ -1,46 +0,0 @@ -/* Extension using the JavaScript localStorage API */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ - -new (function() { - var ext = this; - - ext.set_localstorage = function (data) { - localStorage.setItem(app.projectModel.id.toString(), data); - }; - - ext.change_localstorage = function(change) { - var data = localStorage.getItem(app.projectModel.id.toString()); - if (!isNaN(parseFloat(data))) { - localStorage.setItem(app.projectModel.id.toString(), parseFloat(data) + change); - } - }; - - ext.get_localstorage = function () { - return localStorage.getItem(app.projectModel.id.toString()); - }; - - ext._shutdown = function() {}; - - - ext._getStatus = function() { - var test = 'test'; - try { - localStorage.setItem(test, test); - localStorage.removeItem(test); - } catch(e) { - return {status: 1, msg: 'Your browser does not support the localStorage API'}; - } - - return {status: 2, msg: 'Ready'}; - }; - - var descriptor = { - blocks: [ - ['', 'set local data to %s', 'set_localstorage', '0'], - ['', 'change local data by %d', 'change_localstorage', 1], - ['r', 'local data', 'get_localstorage'], - ], - }; - - ScratchExtensions.register('Local Storage', descriptor, ext); -})(); \ No newline at end of file diff --git a/picoExtension.js b/picoExtension.js deleted file mode 100644 index face82d..0000000 --- a/picoExtension.js +++ /dev/null @@ -1,202 +0,0 @@ -// picoExtension.js -// Shane M. Clements, February 2014 -// PicoBoard Scratch Extension -// -// This is an extension for development and testing of the Scratch Javascript Extension API. - -(function(ext) { - var device = null; - var rawData = null; - - // Sensor states: - var channels = { - slider: 7, - light: 5, - sound: 6, - button: 3, - 'resistance-A': 4, - 'resistance-B': 2, - 'resistance-C': 1, - 'resistance-D': 0 - }; - var inputs = { - slider: 0, - light: 0, - sound: 0, - button: 0, - 'resistance-A': 0, - 'resistance-B': 0, - 'resistance-C': 0, - 'resistance-D': 0 - }; - - ext.resetAll = function(){}; - - // Hats / triggers - ext.whenSensorConnected = function(which) { - return getSensorPressed(which); - }; - - ext.whenSensorPass = function(which, sign, level) { - if (sign == '<') return getSensor(which) < level; - return getSensor(which) > level; - }; - - // Reporters - ext.sensorPressed = function(which) { - return getSensorPressed(which); - }; - - ext.sensor = function(which) { return getSensor(which); }; - - // Private logic - function getSensorPressed(which) { - if (device == null) return false; - if (which == 'button pressed' && getSensor('button') < 1) return true; - if (which == 'A connected' && getSensor('resistance-A') < 10) return true; - if (which == 'B connected' && getSensor('resistance-B') < 10) return true; - if (which == 'C connected' && getSensor('resistance-C') < 10) return true; - if (which == 'D connected' && getSensor('resistance-D') < 10) return true; - return false; - } - - function getSensor(which) { - return inputs[which]; - } - - var inputArray = []; - function processData() { - var bytes = new Uint8Array(rawData); - - inputArray[15] = 0; - - // TODO: make this robust against misaligned packets. - // Right now there's no guarantee that our 18 bytes start at the beginning of a message. - // Maybe we should treat the data as a stream of 2-byte packets instead of 18-byte packets. - // That way we could just check the high bit of each byte to verify that we're aligned. - for(var i=0; i<9; ++i) { - var hb = bytes[i*2] & 127; - var channel = hb >> 3; - var lb = bytes[i*2+1] & 127; - inputArray[channel] = ((hb & 7) << 7) + lb; - } - - if (watchdog && (inputArray[15] == 0x04)) { - // Seems to be a valid PicoBoard. - clearTimeout(watchdog); - watchdog = null; - } - - for(var name in inputs) { - var v = inputArray[channels[name]]; - if(name == 'light') { - v = (v < 25) ? 100 - v : Math.round((1023 - v) * (75 / 998)); - } - else if(name == 'sound') { - //empirically tested noise sensor floor - v = Math.max(0, v - 18) - v = (v < 50) ? v / 2 : - //noise ceiling - 25 + Math.min(75, Math.round((v - 50) * (75 / 580))); - } - else { - v = (100 * v) / 1023; - } - - inputs[name] = v; - } - - //console.log(inputs); - rawData = null; - } - - function appendBuffer( buffer1, buffer2 ) { - var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength ); - tmp.set( new Uint8Array( buffer1 ), 0 ); - tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength ); - return tmp.buffer; - } - - // Extension API interactions - var potentialDevices = []; - ext._deviceConnected = function(dev) { - potentialDevices.push(dev); - - if (!device) { - tryNextDevice(); - } - } - - var poller = null; - var watchdog = null; - function tryNextDevice() { - // If potentialDevices is empty, device will be undefined. - // That will get us back here next time a device is connected. - device = potentialDevices.shift(); - if (!device) return; - - device.open({ stopBits: 0, bitRate: 38400, ctsFlowControl: 0 }); - device.set_receive_handler(function(data) { - //console.log('Received: ' + data.byteLength); - if(!rawData || rawData.byteLength == 18) rawData = new Uint8Array(data); - else rawData = appendBuffer(rawData, data); - - if(rawData.byteLength >= 18) { - //console.log(rawData); - processData(); - //device.send(pingCmd.buffer); - } - }); - - // Tell the PicoBoard to send a input data every 50ms - var pingCmd = new Uint8Array(1); - pingCmd[0] = 1; - poller = setInterval(function() { - device.send(pingCmd.buffer); - }, 50); - watchdog = setTimeout(function() { - // This device didn't get good data in time, so give up on it. Clean up and then move on. - // If we get good data then we'll terminate this watchdog. - clearInterval(poller); - poller = null; - device.set_receive_handler(null); - device.close(); - device = null; - tryNextDevice(); - }, 250); - }; - - ext._deviceRemoved = function(dev) { - if(device != dev) return; - if(poller) poller = clearInterval(poller); - device = null; - }; - - ext._shutdown = function() { - if(device) device.close(); - if(poller) poller = clearInterval(poller); - device = null; - }; - - ext._getStatus = function() { - if(!device) return {status: 1, msg: 'PicoBoard disconnected'}; - if(watchdog) return {status: 1, msg: 'Probing for PicoBoard'}; - return {status: 2, msg: 'PicoBoard connected'}; - } - - var descriptor = { - blocks: [ - ['h', 'when %m.booleanSensor', 'whenSensorConnected', 'button pressed'], - ['h', 'when %m.sensor %m.lessMore %n', 'whenSensorPass', 'slider', '>', 50], - ['b', 'sensor %m.booleanSensor?', 'sensorPressed', 'button pressed'], - ['r', '%m.sensor sensor value', 'sensor', 'slider'] - ], - menus: { - booleanSensor: ['button pressed', 'A connected', 'B connected', 'C connected', 'D connected'], - sensor: ['slider', 'light', 'sound', 'resistance-A', 'resistance-B', 'resistance-C', 'resistance-D'], - lessMore: ['>', '<'] - }, - url: '/info/help/studio/tips/ext/PicoBoard/' - }; - ScratchExtensions.register('PicoBoard', descriptor, ext, {type: 'serial'}); -})({}); diff --git a/power_extension.js b/power_extension.js deleted file mode 100644 index f4b3870..0000000 --- a/power_extension.js +++ /dev/null @@ -1,30 +0,0 @@ -/* Extension demonstrating a reporter block */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ - -new (function() { - var ext = this; - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.power = function(base, exponent) { - return Math.pow(base, exponent); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - // Block type, block name, function name, param1 default value, param2 default value - ['r', '%n ^ %n', 'power', 2, 3], - ] - }; - - // Register the extension - ScratchExtensions.register('Sample extension', descriptor, ext); -})(); \ No newline at end of file diff --git a/random_wait_extension.js b/random_wait_extension.js deleted file mode 100644 index 23b5f71..0000000 --- a/random_wait_extension.js +++ /dev/null @@ -1,36 +0,0 @@ -/* Extension demonstrating a blocking command block */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ - -new (function() { - var ext = this; - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - // Functions for block with type 'w' will get a callback function as the - // final argument. This should be called to indicate that the block can - // stop waiting. - ext.wait_random = function(callback) { - wait = Math.random(); - console.log('Waiting for ' + wait + ' seconds'); - window.setTimeout(function() { - callback(); - }, wait*1000); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['w', 'wait for random time', 'wait_random'], - ] - }; - - // Register the extension - ScratchExtensions.register('Random wait extension', descriptor, ext); -})(); \ No newline at end of file diff --git a/speech_to_text_extension.js b/speech_to_text_extension.js deleted file mode 100644 index 38fb956..0000000 --- a/speech_to_text_extension.js +++ /dev/null @@ -1,39 +0,0 @@ -/* Extension using the JavaScript Speech API for speech to text */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ - -new (function() { - var ext = this; - - var recognized_speech = ''; - - ext.recognize_speech = function (callback) { - var recognition = new webkitSpeechRecognition(); - recognition.onresult = function(event) { - if (event.results.length > 0) { - recognized_speech = event.results[0][0].transcript; - if (typeof callback=="function") callback(); - } - }; - recognition.start(); - }; - - ext.recognized_speech = function () {return recognized_speech;}; - - ext._shutdown = function() {}; - - ext._getStatus = function() { - if (window.webkitSpeechRecognition === undefined) { - return {status: 1, msg: 'Your browser does not support speech recognition. Try using Google Chrome.'}; - } - return {status: 2, msg: 'Ready'}; - }; - - var descriptor = { - blocks: [ - ['w', 'wait and recognize speech', 'recognize_speech'], - ['r', 'recognized speech', 'recognized_speech'] - ], - }; - - ScratchExtensions.register('Speech To Text', descriptor, ext); -})(); \ No newline at end of file diff --git a/text_to_speech_extension.js b/text_to_speech_extension.js deleted file mode 100644 index fd26964..0000000 --- a/text_to_speech_extension.js +++ /dev/null @@ -1,51 +0,0 @@ -/* Extension using the JavaScript Speech API for text to speech */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, April 2014 */ - -new (function() { - var ext = this; - - /*function _get_voices() { - var ret = []; - var voices = speechSynthesis.getVoices(); - - for(var i = 0; i < voices.length; i++ ) { - ret.push(voices[i].name); - console.log(voices.toString()); - } - - return ret; - } - - ext.set_voice = function() { - };*/ - - ext.speak_text = function (text, callback) { - var u = new SpeechSynthesisUtterance(text.toString()); - u.onend = function(event) { - if (typeof callback=="function") callback(); - }; - - speechSynthesis.speak(u); - }; - - ext._shutdown = function() {}; - - ext._getStatus = function() { - if (window.SpeechSynthesisUtterance === undefined) { - return {status: 1, msg: 'Your browser does not support text to speech. Try using Google Chrome or Safari.'}; - } - return {status: 2, msg: 'Ready'}; - }; - - var descriptor = { - blocks: [ - //['', 'set voice to %m.voices', 'set_voice', ''], - ['w', 'speak %s', 'speak_text', 'Hello!'], - ], - /*menus: { - voices: _get_voices(), - },*/ - }; - - ScratchExtensions.register('Text to Speech', descriptor, ext); -})(); \ No newline at end of file diff --git a/text_to_speech_simple_extension.js b/text_to_speech_simple_extension.js deleted file mode 100644 index fd02d0f..0000000 --- a/text_to_speech_simple_extension.js +++ /dev/null @@ -1,30 +0,0 @@ -/* Extension demonstrating a simple version of the Text to Speech block */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ - -new (function() { - var ext = this; - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.speak = function(text) { - msg = new SpeechSynthesisUtterance(text); - window.speechSynthesis.speak(msg); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['', 'speak %s', 'speak', "Hello!"], - ] - }; - - // Register the extension - ScratchExtensions.register('Simple text to speech extension', descriptor, ext); -})(); \ No newline at end of file diff --git a/weather_extension.js b/weather_extension.js deleted file mode 100644 index d530045..0000000 --- a/weather_extension.js +++ /dev/null @@ -1,39 +0,0 @@ -/* Extension demonstrating a blocking reporter block */ -/* Sayamindu Dasgupta <sayamindu@media.mit.edu>, May 2014 */ - - -new (function() { - var ext = this; - - // Cleanup function when the extension is unloaded - ext._shutdown = function() {}; - - // Status reporting code - // Use this to report missing hardware, plugin or unsupported browser - ext._getStatus = function() { - return {status: 2, msg: 'Ready'}; - }; - - ext.get_temp = function(location, callback) { - // Make an AJAX call to the Open Weather Maps API - $.ajax({ - url: 'http://api.openweathermap.org/data/2.5/weather?q='+location+'&units=imperial', - dataType: 'jsonp', - success: function( weather_data ) { - // Got the data - parse it and return the temperature - temperature = weather_data['main']['temp']; - callback(temperature); - } - }); - }; - - // Block and block menu descriptions - var descriptor = { - blocks: [ - ['R', 'current temperature in city %s', 'get_temp', 'Boston, MA'], - ] - }; - - // Register the extension - ScratchExtensions.register('Weather extension', descriptor, ext); -})(); \ No newline at end of file