pxt-microbit 4.1.23 → 4.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/built/hexcache/{38f5afc7bfbf3b7025f36f6387d636994b161ec828b5f14d7de5ab4cd1cc33fd.hex → 15cf89efb10e1534aca2800db1c6d0d3ae906333f66684e7ae236bd69d5e6e50.hex} +0 -0
- package/built/hexcache/{f90d36a5042a5d2c5770f6f83317c0a89c8141ad426d5da91dea991b5516e699.hex → 59d35551f2b44631972a3d427c94f81a3df457bfb6ba0fcf2a5807b139d9a32d.hex} +0 -0
- package/built/hexcache/{becf72e02ed99aecb1bc9054dce656fb3379778d5ec7f16a4715d4addf05f02c.hex → e4cbdcaceec2f2ce3e23b0bd91cc6dee3dcc1a55867ad24124562b2a62325a49.hex} +0 -0
- package/built/hexcache/{5baf884ee3e3fc309ebe20fbf09f5de9780cf9183a1da685e3688194d4074c11.hex → f13cee981c6efbc97d49a7e4362956b88e3a61e457b65e49ee7d0bba51d641fd.hex} +0 -0
- package/built/sim.js +1 -1
- package/built/target.js +157 -50
- package/built/target.json +157 -50
- package/built/targetlight.json +5 -5
- package/built/web/blockly.css +1 -1
- package/built/web/react-common-authcode.css +169 -11
- package/built/web/react-common-skillmap.css +1 -1
- package/built/web/rtlblockly.css +1 -1
- package/built/web/rtlreact-common-skillmap.css +1 -1
- package/built/web/rtlsemantic.css +1 -1
- package/built/web/semantic.css +1 -1
- package/docs/reference/input/set-sound-threshold.md +8 -0
- package/docs/reference/input/sound-level.md +10 -2
- package/package.json +3 -3
- package/targetconfig.json +1476 -2
package/built/target.js
CHANGED
|
@@ -2663,11 +2663,11 @@ var pxtTargetBundle = {
|
|
|
2663
2663
|
},
|
|
2664
2664
|
"uploadDocs": true,
|
|
2665
2665
|
"versions": {
|
|
2666
|
-
"branch": "v4.1.
|
|
2667
|
-
"tag": "v4.1.
|
|
2668
|
-
"commits": "https://github.com/microsoft/pxt-microbit/commits/
|
|
2669
|
-
"target": "4.1.
|
|
2670
|
-
"pxt": "7.5.
|
|
2666
|
+
"branch": "v4.1.26",
|
|
2667
|
+
"tag": "v4.1.26",
|
|
2668
|
+
"commits": "https://github.com/microsoft/pxt-microbit/commits/8e52fbaa54225431f38e20eb9de4e35bd29a8dc3",
|
|
2669
|
+
"target": "4.1.26",
|
|
2670
|
+
"pxt": "7.5.21"
|
|
2671
2671
|
},
|
|
2672
2672
|
"blocksprj": {
|
|
2673
2673
|
"id": "blocksprj",
|
|
@@ -2751,7 +2751,7 @@ var pxtTargetBundle = {
|
|
|
2751
2751
|
"loops.ts": "namespace loops {\n /**\n * Repeats the code forever in the background.\n * After each iteration, allows other codes to run for a set duration\n * so that it runs on a timer\n * @param interval time (in ms) to wait between each iteration of the action.\n * @param body code to execute\n */\n //% weight=45 blockAllowMultiple=1\n //% interval.shadow=longTimePicker\n //% afterOnStart=true help=loops/every-interval\n //% blockId=every_interval block=\"every $interval ms\"\n export function everyInterval(interval: number, a: () => void): void {\n control.runInParallel(() => {\n while (true) {\n control.runInParallel(a);\n pause(interval);\n }\n });\n }\n\n /**\n * Get the time field editor\n * @param ms time duration in milliseconds, eg: 500, 1000\n */\n //% blockId=longTimePicker block=\"%ms\"\n //% blockHidden=true shim=TD_ID\n //% colorSecondary=\"#FFFFFF\"\n //% ms.fieldEditor=\"numberdropdown\" ms.fieldOptions.decompileLiterals=true\n //% ms.fieldOptions.data='[[\"100 ms\", 100], [\"200 ms\", 200], [\"500 ms\", 500], [\"1 second\", 1000], [\"1 minute\", 60000], [\"1 hour\", 3600000]]'\n export function __timePicker(ms: number): number {\n return ms;\n }\n}",
|
|
2752
2752
|
"math.ts": "namespace Math {\n\n export const E = 2.718281828459045;\n export const LN2 = 0.6931471805599453;\n export const LN10 = 2.302585092994046;\n export const LOG2E = 1.4426950408889634;\n export const LOG10E = 0.4342944819032518;\n export const PI = 3.141592653589793;\n export const SQRT1_2 = 0.7071067811865476;\n export const SQRT2 = 1.4142135623730951;\n\n /**\n * Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.\n * @param value value to map in ranges\n * @param fromLow the lower bound of the value's current range\n * @param fromHigh the upper bound of the value's current range, eg: 1023\n * @param toLow the lower bound of the value's target range\n * @param toHigh the upper bound of the value's target range, eg: 4\n */\n //% help=math/map weight=10 blockGap=8\n //% blockId=math_map block=\"map %value|from low %fromLow|high %fromHigh|to low %toLow|high %toHigh\"\n //% inlineInputMode=inline\n export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number {\n return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow;\n } \n\n /**\n * Constrains a number to be within a range\n * @param x the number to constrain, all data types\n * @param y the lower end of the range, all data types\n * @param z the upper end of the range, all data types\n */\n //% help=math/constrain weight=11 blockGap=8\n //% blockId=\"math_constrain_value\" block=\"constrain %value|between %low|and %high\"\n export function constrain(value: number, low: number, high: number): number {\n return value < low ? low : value > high ? high : value;\n }\n\n const b_m16: number[] = [0, 49, 49, 41, 90, 27, 117, 10]\n /**\n * Returns the sine of an input angle. This is an 8-bit approximation.\n * @param theta input angle from 0-255\n */\n //% help=math/isin weight=11 advanced=true blockGap=8\n export function isin(theta: number) {\n //reference: based on FASTLed's sin approximation method: [https://github.com/FastLED/FastLED](MIT)\n let offset = theta;\n if( theta & 0x40 ) {\n offset = 255 - offset;\n }\n offset &= 0x3F; // 0..63\n\n let secoffset = offset & 0x0F; // 0..15\n if( theta & 0x40) secoffset++;\n\n let section = offset >> 4; // 0..3\n let s2 = section * 2;\n\n let b = b_m16[s2];\n let m16 = b_m16[s2+1];\n let mx = (m16 * secoffset) >> 4;\n \n let y = mx + b;\n if( theta & 0x80 ) y = -y;\n\n y += 128;\n\n return y;\n }\n\n /**\n * Returns the cosine of an input angle. This is an 8-bit approximation. \n * @param theta input angle from 0-255\n */\n //% help=math/icos weight=10 advanced=true blockGap=8\n export function icos(theta: number) {\n return isin(theta + 16384);\n }\n}\n\nnamespace Number {\n export const EPSILON = 2.220446049250313e-16;\n}",
|
|
2753
2753
|
"melodies.ts": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2013-2016 The MicroPython-on-micro:bit Developers, as listed\nin the accompanying AUTHORS file\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n// Melodies from file microbitmusictunes.c https://github.com/bbcmicrobit/MicroPython\n\nenum Melodies {\n //% block=\"dadadum\" blockIdentity=music.builtInMelody\n Dadadadum = 0,\n //% block=\"entertainer\" blockIdentity=music.builtInMelody\n Entertainer,\n //% block=\"prelude\" blockIdentity=music.builtInMelody\n Prelude,\n //% block=\"ode\" blockIdentity=music.builtInMelody\n Ode,\n //% block=\"nyan\" blockIdentity=music.builtInMelody\n Nyan,\n //% block=\"ringtone\" blockIdentity=music.builtInMelody\n Ringtone,\n //% block=\"funk\" blockIdentity=music.builtInMelody\n Funk,\n //% block=\"blues\" blockIdentity=music.builtInMelody\n Blues,\n //% block=\"birthday\" blockIdentity=music.builtInMelody\n Birthday,\n //% block=\"wedding\" blockIdentity=music.builtInMelody\n Wedding,\n //% block=\"funeral\" blockIdentity=music.builtInMelody\n Funeral,\n //% block=\"punchline\" blockIdentity=music.builtInMelody\n Punchline,\n //% block=\"baddy\" blockIdentity=music.builtInMelody\n Baddy,\n //% block=\"chase\" blockIdentity=music.builtInMelody\n Chase,\n //% block=\"ba ding\" blockIdentity=music.builtInMelody\n BaDing,\n //% block=\"wawawawaa\" blockIdentity=music.builtInMelody\n Wawawawaa,\n //% block=\"jump up\" blockIdentity=music.builtInMelody\n JumpUp,\n //% block=\"jump down\" blockIdentity=music.builtInMelody\n JumpDown,\n //% block=\"power up\" blockIdentity=music.builtInMelody\n PowerUp,\n //% block=\"power down\" blockIdentity=music.builtInMelody\n PowerDown,\n}\n\nnamespace music {\n export function getMelody(melody: Melodies): string[] {\n return _bufferToMelody(_getMelodyBuffer(melody));\n }\n\n // The buffer format is 2 bytes per note. First note byte is midi\n // note number, second byte is duration in quarter beats. The note\n // number 0 is reserved for rests\n export function _getMelodyBuffer(melody: Melodies) {\n switch (melody) {\n case Melodies.Dadadadum:\n return hex`00024f024f024f024b0800024d024d024d024a08`;\n case Melodies.Entertainer:\n return hex`4a014b014c0154024c0154024c0154035401560157015801540156015802530156025404`;\n case Melodies.Prelude:\n return hex`48014c014f01540158014f015401580148014c014f01540158014f015401580148014a014f01560159014f015601590148014a014f01560159014f015601590147014a014f01560159014f015601590147014a014f01560159014f015601590148014c014f01540158014f015401580148014c014f01540158014f0154015801`;\n case Melodies.Ode:\n return hex`4c044c044d044f044f044d044c044a04480448044a044c044c064a024a084c044c044d044f044f044d044c044a04480448044a044c044a0648024808`;\n case Melodies.Nyan:\n return hex`5a025c02550157025301560155015302530255025602560155015301550157015a015c0157015a015501560153015501530157025a025c0157015a0155015701530156015701560155015301550156025301550157015a01550156015501530155025302550253024e01500153024e01500153015501570153015801570158015a01530253024e01500153014e0158015701550153014e014b014c014e0153024e01500153024e015001530153015501570153014e0150014e0153025301520153014e01500153015801570158015a0153025502`;\n case Melodies.Ringtone:\n return hex`48014a014c024f024a014c014d0251024c014d014f0253025404`;\n case Melodies.Funk:\n return hex`300230023302300135023001350236023702300230023702300136023001360235023302`;\n case Melodies.Blues:\n return hex`30023402370239023a0239023702340230023402370239023a02390237023402350239023c023e023f023e023c02390230023402370239023a0239023702340237023b023e024102350239023c023f0230023402370234023702350234023202`;\n case Melodies.Birthday:\n return hex`480348014a0448044d044c08480348014a0448044f044d0848034801540451044d044c044a045203520151044d044f044d08`;\n case Melodies.Wedding:\n return hex`48044d034d014d0848044f034c014d0848044d035101540451034d014d044c034d014f08`;\n case Melodies.Funeral:\n return hex`3c043c033c013c043f033e013e033c013c033b013c04`;\n case Melodies.Punchline:\n return hex`480343014201430144034303000347034803`;\n case Melodies.Baddy:\n return hex`3c0300033e023f0200023c0200024208`;\n case Melodies.Chase:\n return hex`5101530154015301510200025101530154015301510200025102580257025802590258025702580253015401560154015302000253015401560154015302000253025802570258025902580257025802`;\n case Melodies.BaDing:\n return hex`5f016403`;\n case Melodies.Wawawawaa:\n return hex`400300013f0300013e0400013d08`;\n case Melodies.JumpUp:\n return hex`54015601580159015b01`;\n case Melodies.JumpDown:\n return hex`5b015901580156015401`;\n case Melodies.PowerUp:\n return hex`4f01540158015b0258015b03`;\n case Melodies.PowerDown:\n return hex`5b01570154014f0253015403`;\n\n default: return undefined;\n }\n }\n}",
|
|
2754
|
-
"music.cpp": "#include \"pxt.h\"\n\nnamespace pins {\n void analogSetPitchVolume(int volume);\n int analogPitchVolume();\n}\n\nnamespace music {\n/**\n * Set the default output volume of the sound synthesizer.\n * @param volume the volume 0...255\n */\n//% blockId=synth_set_volume block=\"set volume %volume\"\n//% volume.min=0 volume.max=255\n//% volume.defl=127\n//% help=music/set-volume\n//% weight=70\n//% group=\"Volume\"\n//% blockGap=8\nvoid setVolume(int volume) {\n#if MICROBIT_CODAL\n uBit.audio.setVolume(max(0, min(255, volume)));\n#else\n pins::analogSetPitchVolume(volume);\n#endif\n}\n\n/**\n * Returns the current output volume of the sound synthesizer.\n */\n//% blockId=synth_get_volume block=\"volume\"\n//% help=music/volume\n//% weight=69\n//% group=\"Volume\"\n//% blockGap=8\nint volume() {\n#if MICROBIT_CODAL\n return uBit.audio.getVolume();\n#else\n return pins::analogPitchVolume();\n#endif\n}\n\n/**\n* Turn the built-in speaker on or off.\n* Disabling the speaker resets the sound pin to the default of P0.\n* @param enabled whether the built-in speaker is enabled in addition to the sound pin\n*/\n//% blockId=music_set_built_in_speaker_enable block=\"set built-in speaker $enabled\"\n//%
|
|
2754
|
+
"music.cpp": "#include \"pxt.h\"\n\nnamespace pins {\n void analogSetPitchVolume(int volume);\n int analogPitchVolume();\n}\n\nnamespace music {\n/**\n * Set the default output volume of the sound synthesizer.\n * @param volume the volume 0...255\n */\n//% blockId=synth_set_volume block=\"set volume %volume\"\n//% volume.min=0 volume.max=255\n//% volume.defl=127\n//% help=music/set-volume\n//% weight=70\n//% group=\"Volume\"\n//% blockGap=8\nvoid setVolume(int volume) {\n#if MICROBIT_CODAL\n uBit.audio.setVolume(max(0, min(255, volume)));\n#else\n pins::analogSetPitchVolume(volume);\n#endif\n}\n\n/**\n * Returns the current output volume of the sound synthesizer.\n */\n//% blockId=synth_get_volume block=\"volume\"\n//% help=music/volume\n//% weight=69\n//% group=\"Volume\"\n//% blockGap=8\nint volume() {\n#if MICROBIT_CODAL\n return uBit.audio.getVolume();\n#else\n return pins::analogPitchVolume();\n#endif\n}\n\n/**\n* Turn the built-in speaker on or off.\n* Disabling the speaker resets the sound pin to the default of P0.\n* @param enabled whether the built-in speaker is enabled in addition to the sound pin\n*/\n//% blockId=music_set_built_in_speaker_enable block=\"set built-in speaker $enabled\"\n//% group=\"micro:bit (V2)\"\n//% parts=builtinspeaker\n//% help=music/set-built-in-speaker-enabled\n//% enabled.shadow=toggleOnOff\n//% weight=0\nvoid setBuiltInSpeakerEnabled(bool enabled) {\n#if MICROBIT_CODAL\n uBit.audio.setSpeakerEnabled(enabled);\n#else\n // don't crash if user asks to turn it off\n if (enabled) {\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n }\n#endif\n}\n\n/**\n * Defines an optional sample level to generate during periods of silence.\n **/\n//% group=\"micro:bit (V2)\"\n//% help=music/set-silence-level\n//% level.min=0\n//% level.max=1024\n//% level.defl=0\n//% weight=1\nvoid setSilenceLevel(int level) {\n#if MICROBIT_CODAL\n uBit.audio.mixer.setSilenceLevel(level);\n#else\n // this is an optimization\n // ignore in V1\n#endif\n}\n\n}",
|
|
2755
2755
|
"music.ts": "enum Note {\n //% blockIdentity=music.noteFrequency enumval=262\n C = 262,\n //% block=C#\n //% blockIdentity=music.noteFrequency enumval=277\n CSharp = 277,\n //% blockIdentity=music.noteFrequency enumval=294\n D = 294,\n //% blockIdentity=music.noteFrequency enumval=311\n Eb = 311,\n //% blockIdentity=music.noteFrequency enumval=330\n E = 330,\n //% blockIdentity=music.noteFrequency enumval=349\n F = 349,\n //% block=F#\n //% blockIdentity=music.noteFrequency enumval=370\n FSharp = 370,\n //% blockIdentity=music.noteFrequency enumval=392\n G = 392,\n //% block=G#\n //% blockIdentity=music.noteFrequency enumval=415\n GSharp = 415,\n //% blockIdentity=music.noteFrequency enumval=440\n A = 440,\n //% blockIdentity=music.noteFrequency enumval=466\n Bb = 466,\n //% blockIdentity=music.noteFrequency enumval=494\n B = 494,\n //% blockIdentity=music.noteFrequency enumval=131\n C3 = 131,\n //% block=C#3\n //% blockIdentity=music.noteFrequency enumval=139\n CSharp3 = 139,\n //% blockIdentity=music.noteFrequency enumval=147\n D3 = 147,\n //% blockIdentity=music.noteFrequency enumval=156\n Eb3 = 156,\n //% blockIdentity=music.noteFrequency enumval=165\n E3 = 165,\n //% blockIdentity=music.noteFrequency enumval=175\n F3 = 175,\n //% block=F#3\n //% blockIdentity=music.noteFrequency enumval=185\n FSharp3 = 185,\n //% blockIdentity=music.noteFrequency enumval=196\n G3 = 196,\n //% block=G#3\n //% blockIdentity=music.noteFrequency enumval=208\n GSharp3 = 208,\n //% blockIdentity=music.noteFrequency enumval=220\n A3 = 220,\n //% blockIdentity=music.noteFrequency enumval=233\n Bb3 = 233,\n //% blockIdentity=music.noteFrequency enumval=247\n B3 = 247,\n //% blockIdentity=music.noteFrequency enumval=262\n C4 = 262,\n //% block=C#4\n //% blockIdentity=music.noteFrequency enumval=277\n CSharp4 = 277,\n //% blockIdentity=music.noteFrequency enumval=294\n D4 = 294,\n //% blockIdentity=music.noteFrequency enumval=311\n Eb4 = 311,\n //% blockIdentity=music.noteFrequency enumval=330\n E4 = 330,\n //% blockIdentity=music.noteFrequency enumval=349\n F4 = 349,\n //% block=F#4\n //% blockIdentity=music.noteFrequency enumval=370\n FSharp4 = 370,\n //% blockIdentity=music.noteFrequency enumval=392\n G4 = 392,\n //% block=G#4\n //% blockIdentity=music.noteFrequency enumval=415\n GSharp4 = 415,\n //% blockIdentity=music.noteFrequency enumval=440\n A4 = 440,\n //% blockIdentity=music.noteFrequency enumval=466\n Bb4 = 466,\n //% blockIdentity=music.noteFrequency enumval=494\n B4 = 494,\n //% blockIdentity=music.noteFrequency enumval=523\n C5 = 523,\n //% block=C#5\n //% blockIdentity=music.noteFrequency enumval=555\n CSharp5 = 555,\n //% blockIdentity=music.noteFrequency enumval=587\n D5 = 587,\n //% blockIdentity=music.noteFrequency enumval=622\n Eb5 = 622,\n //% blockIdentity=music.noteFrequency enumval=659\n E5 = 659,\n //% blockIdentity=music.noteFrequency enumval=698\n F5 = 698,\n //% block=F#5\n //% blockIdentity=music.noteFrequency enumval=740\n FSharp5 = 740,\n //% blockIdentity=music.noteFrequency enumval=784\n G5 = 784,\n //% block=G#5\n //% blockIdentity=music.noteFrequency enumval=831\n GSharp5 = 831,\n //% blockIdentity=music.noteFrequency enumval=880\n A5 = 880,\n //% blockIdentity=music.noteFrequency enumval=932\n Bb5 = 932,\n //% blockIdentity=music.noteFrequency enumval=988\n B5 = 988,\n}\n\nenum BeatFraction {\n //% block=1\n Whole = 1,\n //% block=\"1/2\"\n Half = 2,\n //% block=\"1/4\"\n Quarter = 4,\n //% block=\"1/8\"\n Eighth = 8,\n //% block=\"1/16\"\n Sixteenth = 16,\n //% block=\"2\"\n Double = 32,\n //% block=\"4\",\n Breve = 64\n}\n\nenum MelodyOptions {\n //% block=\"once\"\n Once = 1,\n //% block=\"forever\"\n Forever = 2,\n //% block=\"once in background\"\n OnceInBackground = 4,\n //% block=\"forever in background\"\n ForeverInBackground = 8\n}\n\nenum MelodyStopOptions {\n //% block=\"all\"\n All = MelodyOptions.Once | MelodyOptions.OnceInBackground,\n //% block=\"foreground\"\n Foreground = MelodyOptions.Once,\n //% block=\"background\"\n Background = MelodyOptions.OnceInBackground\n}\n\nenum MusicEvent {\n //% block=\"melody note played\"\n MelodyNotePlayed = 1,\n //% block=\"melody started\"\n MelodyStarted = 2,\n //% block=\"melody ended\"\n MelodyEnded = 3,\n //% block=\"melody repeated\"\n MelodyRepeated = 4,\n //% block=\"background melody note played\"\n BackgroundMelodyNotePlayed = MelodyNotePlayed | 0xf0,\n //% block=\"background melody started\"\n BackgroundMelodyStarted = MelodyStarted | 0xf0,\n //% block=\"background melody ended\"\n BackgroundMelodyEnded = MelodyEnded | 0xf0,\n //% block=\"background melody repeated\"\n BackgroundMelodyRepeated = MelodyRepeated | 0xf0,\n //% block=\"background melody paused\"\n BackgroundMelodyPaused = 5 | 0xf0,\n //% block=\"background melody resumed\"\n BackgroundMelodyResumed = 6 | 0xf0\n}\n\n/**\n * Generation of music tones.\n */\n//% color=#E63022 weight=106 icon=\"\\uf025\"\n//% groups='[\"Melody\", \"Tone\", \"Volume\", \"Tempo\", \"Melody Advanced\"]'\nnamespace music {\n const INTERNAL_MELODY_ENDED = 5;\n\n let beatsPerMinute: number = 120;\n //% whenUsed\n const freqs = hex`\n 1f00210023002500270029002c002e003100340037003a003e004100450049004e00520057005c00620068006e00\n 75007b0083008b0093009c00a500af00b900c400d000dc00e900f70006011501260137014a015d01720188019f01\n b801d201ee010b022a024b026e029302ba02e40210033f037003a403dc03170455049704dd0427057505c8052006\n 7d06e0064907b8072d08a9082d09b9094d0aea0a900b400cfa0cc00d910e6f0f5a1053115b1272139a14d4152017\n 8018f519801b231dde1e`;\n let _playTone: (frequency: number, duration: number) => void;\n const MICROBIT_MELODY_ID = 2000;\n\n /**\n * Plays a tone through pin ``P0`` for the given duration.\n * @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C\n * @param ms tone duration in milliseconds (ms)\n */\n //% help=music/play-tone weight=90\n //% blockId=device_play_note block=\"play|tone %note=device_note|for %duration=device_beat\" blockGap=8\n //% parts=\"headphone\"\n //% useEnumVal=1\n //% group=\"Tone\"\n export function playTone(frequency: number, ms: number): void {\n if (_playTone) _playTone(frequency, ms);\n else pins.analogPitch(frequency, ms);\n }\n\n /**\n * Plays a tone through pin ``P0``.\n * @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C\n */\n //% help=music/ring-tone weight=80\n //% blockId=device_ring block=\"ring tone (Hz)|%note=device_note\" blockGap=8\n //% parts=\"headphone\"\n //% useEnumVal=1\n //% group=\"Tone\"\n export function ringTone(frequency: number): void {\n playTone(frequency, 0);\n }\n\n /**\n * Rests (plays nothing) for a specified time through pin ``P0``.\n * @param ms rest duration in milliseconds (ms)\n */\n //% help=music/rest weight=79\n //% blockId=device_rest block=\"rest(ms)|%duration=device_beat\"\n //% parts=\"headphone\"\n //% group=\"Tone\"\n export function rest(ms: number): void {\n playTone(0, ms);\n }\n\n\n /**\n * Gets the frequency of a note.\n * @param name the note name\n */\n //% weight=50 help=music/note-frequency\n //% blockId=device_note block=\"%name\"\n //% shim=TD_ID color=\"#FFFFFF\" colorSecondary=\"#FFFFFF\"\n //% name.fieldEditor=\"note\" name.defl=\"262\"\n //% name.fieldOptions.decompileLiterals=true\n //% useEnumVal=1\n //% group=\"Tone\"\n //% blockGap=8\n export function noteFrequency(name: Note): number {\n return name;\n }\n\n function init() {\n if (beatsPerMinute <= 0) beatsPerMinute = 120;\n }\n\n /**\n * Returns the duration of a beat in milli-seconds\n */\n //% help=music/beat weight=49\n //% blockId=device_beat block=\"%fraction|beat\"\n //% group=\"Tempo\"\n //% blockGap=8\n export function beat(fraction?: BeatFraction): number {\n init();\n if (fraction == null) fraction = BeatFraction.Whole;\n let beat = Math.idiv(60000, beatsPerMinute);\n switch (fraction) {\n case BeatFraction.Half: return beat >> 1;\n case BeatFraction.Quarter: return beat >> 2;\n case BeatFraction.Eighth: return beat >> 3;\n case BeatFraction.Sixteenth: return beat >> 4;\n case BeatFraction.Double: return beat << 1;\n case BeatFraction.Breve: return beat << 2;\n default: return beat;\n }\n }\n\n /**\n * Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.\n */\n //% help=music/tempo weight=40\n //% blockId=device_tempo block=\"tempo (bpm)\" blockGap=8\n //% group=\"Tempo\"\n export function tempo(): number {\n init();\n return beatsPerMinute;\n }\n\n /**\n * Change the tempo by the specified amount\n * @param bpm The change in beats per minute to the tempo, eg: 20\n */\n //% help=music/change-tempo-by weight=39\n //% blockId=device_change_tempo block=\"change tempo by (bpm)|%value\" blockGap=8\n //% group=\"Tempo\"\n //% weight=100\n export function changeTempoBy(bpm: number): void {\n init();\n setTempo(beatsPerMinute + bpm);\n }\n\n /**\n * Sets the tempo to the specified amount\n * @param bpm The new tempo in beats per minute, eg: 120\n */\n //% help=music/set-tempo weight=38\n //% blockId=device_set_tempo block=\"set tempo to (bpm)|%value\"\n //% bpm.min=4 bpm.max=400\n //% group=\"Tempo\"\n //% weight=99\n export function setTempo(bpm: number): void {\n init();\n if (bpm > 0) {\n beatsPerMinute = Math.max(1, bpm);\n }\n }\n\n let currentMelody: Melody;\n let currentBackgroundMelody: Melody;\n\n /**\n * Gets the melody array of a built-in melody.\n * @param name the note name, eg: Note.C\n */\n //% weight=50 help=music/builtin-melody\n //% blockId=device_builtin_melody block=\"%melody\"\n //% blockHidden=true\n //% group=\"Melody Advanced\"\n export function builtInMelody(melody: Melodies): string[] {\n return getMelody(melody);\n }\n\n /**\n * Registers code to run on various melody events\n */\n //% blockId=melody_on_event block=\"music on %value\"\n //% help=music/on-event weight=59 blockGap=32\n //% group=\"Melody Advanced\"\n export function onEvent(value: MusicEvent, handler: () => void) {\n control.onEvent(MICROBIT_MELODY_ID, value, handler);\n }\n\n /**\n * Use startMelody instead\n */\n //% hidden=1 deprecated=1\n //% parts=\"headphone\"\n //% group=\"Melody Advanced\"\n export function beginMelody(melodyArray: string[], options: MelodyOptions = 1) {\n return startMelody(melodyArray, options);\n }\n\n /**\n * Starts playing a melody.\n * Notes are expressed as a string of characters with this format: NOTE[octave][:duration]\n * @param melodyArray the melody array to play\n * @param options melody options, once / forever, in the foreground / background\n */\n //% help=music/begin-melody weight=60 blockGap=16\n //% blockId=device_start_melody block=\"start melody %melody=device_builtin_melody| repeating %options\"\n //% parts=\"headphone\"\n //% group=\"Melody Advanced\"\n export function startMelody(melodyArray: string[], options: MelodyOptions = 1) {\n init();\n const isBackground = options & (MelodyOptions.OnceInBackground | MelodyOptions.ForeverInBackground);\n if (currentMelody != undefined) {\n if (!isBackground && currentMelody.background) {\n currentBackgroundMelody = currentMelody;\n currentMelody = null;\n control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyPaused);\n }\n if (currentMelody)\n control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background | MusicEvent.MelodyEnded);\n currentMelody = new Melody(melodyArray, options);\n control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background | MusicEvent.MelodyStarted);\n } else {\n currentMelody = new Melody(melodyArray, options);\n control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background | MusicEvent.MelodyStarted);\n // Only start the fiber once\n control.inBackground(() => {\n while (currentMelody.hasNextNote()) {\n playNextNote(currentMelody);\n if (!currentMelody.hasNextNote() && currentBackgroundMelody) {\n // Swap the background melody back\n currentMelody = currentBackgroundMelody;\n currentBackgroundMelody = null;\n control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.MelodyEnded);\n control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyResumed);\n control.raiseEvent(MICROBIT_MELODY_ID, INTERNAL_MELODY_ENDED);\n }\n }\n control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background | MusicEvent.MelodyEnded);\n if (!currentMelody.background)\n control.raiseEvent(MICROBIT_MELODY_ID, INTERNAL_MELODY_ENDED);\n currentMelody = null;\n })\n }\n }\n\n\n /**\n * Play a melody from the melody editor.\n * @param melody - string of up to eight notes [C D E F G A B C5] or rests [-] separated by spaces, which will be played one at a time, ex: \"E D G F B A C5 B \"\n * @param tempo - number in beats per minute (bpm), dictating how long each note will play for\n */\n //% block=\"play melody $melody at tempo $tempo|(bpm)\" blockId=playMelody\n //% weight=85 blockGap=8 help=music/play-melody\n //% melody.shadow=\"melody_editor\"\n //% tempo.min=40 tempo.max=500\n //% tempo.defl=120\n //% parts=headphone\n //% group=\"Melody\"\n export function playMelody(melody: string, tempo: number) {\n melody = melody || \"\";\n setTempo(tempo);\n let notes: string[] = melody.split(\" \").filter(n => !!n);\n let newOctave = false;\n\n // build melody string, replace '-' with 'R' and add tempo\n // creates format like \"C5-174 B4 A G F E D C \"\n for (let i = 0; i < notes.length; i++) {\n if (notes[i] === \"-\") {\n notes[i] = \"R\";\n } else if (notes[i] === \"C5\") {\n newOctave = true;\n } else if (newOctave) { // change the octave if necesary\n notes[i] += \"4\";\n newOctave = false;\n }\n }\n\n music.startMelody(notes, MelodyOptions.Once)\n control.waitForEvent(MICROBIT_MELODY_ID, INTERNAL_MELODY_ENDED);\n }\n\n /**\n * Create a melody with the melody editor.\n * @param melody\n */\n //% block=\"$melody\" blockId=melody_editor\n //% blockHidden = true\n //% weight=85 blockGap=8\n //% duplicateShadowOnDrag\n //% melody.fieldEditor=\"melody\"\n //% melody.fieldOptions.decompileLiterals=true\n //% melody.fieldOptions.decompileIndirectFixedInstances=\"true\"\n //% melody.fieldOptions.onParentBlock=\"true\"\n //% shim=TD_ID\n //% group=\"Melody\"\n export function melodyEditor(melody: string): string {\n return melody;\n }\n\n /**\n * Stops the melodies\n * @param options which melody to stop\n */\n //% help=music/stop-melody weight=59 blockGap=16\n //% blockId=device_stop_melody block=\"stop melody $options\"\n //% parts=\"headphone\"\n //% group=\"Melody Advanced\"\n export function stopMelody(options: MelodyStopOptions) {\n if (options & MelodyStopOptions.Background)\n startMelody([], MelodyOptions.OnceInBackground);\n if (options & MelodyStopOptions.Foreground)\n startMelody([], MelodyOptions.Once);\n }\n\n /**\n * Stop all sounds and melodies currently playing.\n */\n //% help=music/stop-all-sounds\n //% blockId=music_stop_all_sounds block=\"stop all sounds\"\n //% weight=10\n //% group=\"Volume\"\n export function stopAllSounds() {\n rest(0);\n stopMelody(MelodyStopOptions.All);\n music.__stopSoundExpressions();\n }\n\n\n /**\n * Sets a custom playTone function for playing melodies\n */\n //% help=music/set-play-tone\n //% advanced=true\n //% group=\"Tone\"\n export function setPlayTone(f: (frequency: number, duration: number) => void) {\n _playTone = f;\n }\n\n /**\n * Converts an octave and note offset into an integer frequency.\n * Returns 0 if the note is out of range.\n *\n * @param octave The octave of the note (1 - 8)\n * @param note The offset of the note within the octave\n * @returns A frequency in HZ or 0 if out of range\n */\n export function getFrequencyForNote(octave: number, note: number) {\n return freqs.getNumber(NumberFormat.UInt16LE, (note + (12 * (octave - 1))) * 2) || 0;\n }\n\n function playNextNote(melody: Melody): void {\n // cache elements\n let currNote = melody.nextNote();\n let currentPos = melody.currentPos;\n let currentDuration = melody.currentDuration;\n let currentOctave = melody.currentOctave;\n\n let note: number;\n let isrest: boolean = false;\n let beatPos: number;\n let parsingOctave: boolean = true;\n let prevNote: boolean = false;\n\n for (let pos = 0; pos < currNote.length; pos++) {\n let noteChar = currNote.charAt(pos);\n switch (noteChar) {\n case 'c': case 'C': note = 1; prevNote = true; break;\n case 'd': case 'D': note = 3; prevNote = true; break;\n case 'e': case 'E': note = 5; prevNote = true; break;\n case 'f': case 'F': note = 6; prevNote = true; break;\n case 'g': case 'G': note = 8; prevNote = true; break;\n case 'a': case 'A': note = 10; prevNote = true; break;\n case 'B': note = 12; prevNote = true; break;\n case 'r': case 'R': isrest = true; prevNote = false; break;\n case '#': note++; prevNote = false; break;\n case 'b': if (prevNote) note--; else { note = 12; prevNote = true; } break;\n case ':': parsingOctave = false; beatPos = pos; prevNote = false; break;\n default: prevNote = false; if (parsingOctave) currentOctave = parseInt(noteChar);\n }\n }\n if (!parsingOctave) {\n currentDuration = parseInt(currNote.substr(beatPos + 1, currNote.length - beatPos));\n }\n let beat = Math.idiv(60000, beatsPerMinute) >> 2;\n if (isrest) {\n music.rest(currentDuration * beat)\n } else {\n music.playTone(getFrequencyForNote(currentOctave, note), currentDuration * beat);\n }\n melody.currentDuration = currentDuration;\n melody.currentOctave = currentOctave;\n const repeating = melody.repeating && currentPos == melody.melodyArray.length - 1;\n melody.currentPos = repeating ? 0 : currentPos + 1;\n\n control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyNotePlayed);\n if (repeating)\n control.raiseEvent(MICROBIT_MELODY_ID, melody.background | MusicEvent.MelodyRepeated);\n }\n\n class Melody {\n public melodyArray: string[];\n public currentDuration: number;\n public currentOctave: number;\n public currentPos: number;\n public repeating: boolean;\n\n // This is bitwise or'd with the events. 0 is not in background, 0xf0 if in background\n public background: number;\n\n constructor(melodyArray: string[], options: MelodyOptions) {\n this.melodyArray = melodyArray;\n this.repeating = !!(options & (MelodyOptions.Forever | MelodyOptions.ForeverInBackground));\n this.background = (options & (MelodyOptions.OnceInBackground | MelodyOptions.ForeverInBackground)) ? 0xf0 : 0;\n this.currentDuration = 4; //Default duration (Crotchet)\n this.currentOctave = 4; //Middle octave\n this.currentPos = 0;\n }\n\n hasNextNote() {\n return this.repeating || this.currentPos < this.melodyArray.length;\n }\n\n nextNote(): string {\n const currentNote = this.melodyArray[this.currentPos];\n return currentNote;\n }\n }\n\n export function _bufferToMelody(melody: Buffer) {\n if (!melody) return [];\n\n let currentDuration = 4;\n let currentOctave = -1;\n const out: string[] = [];\n\n const notes = \"c#d#ef#g#a#b\"\n let current = \"\";\n\n // The buffer format is 2 bytes per note. First note byte is midi\n // note number, second byte is duration in quarter beats. The note\n // number 0 is reserved for rests\n for (let i = 0; i < melody.length; i += 2) {\n let octave = 4;\n const note = melody[i] % 12;\n if (melody[i] === 0) {\n current = \"r\"\n }\n else {\n current = notes.charAt(note);\n if (current === \"#\") current = notes.charAt(note - 1) + current\n\n octave = Math.idiv((melody[i] - 23), 12)\n }\n\n const duration = melody[i + 1];\n\n if (octave !== currentOctave) {\n current += octave\n currentOctave = octave;\n }\n\n if (duration !== currentDuration) {\n current += \":\" + duration;\n currentDuration = duration;\n }\n\n out.push(current);\n }\n\n return out;\n }\n}\n",
|
|
2756
2756
|
"parts/headphone.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"142\" height=\"180\" viewBox=\"0 0 142 180\"><rect ry=\".3\" rx=\"1\" y=\"58.615\" x=\"-8.878\" height=\"23.571\" width=\"17.143\" transform=\"rotate(-45)\" fill=\"#b3b3b3\"/><rect ry=\".3\" rx=\"1\" y=\"32.043\" x=\"-8.878\" height=\"23.571\" width=\"17.143\" transform=\"rotate(-45)\" fill=\"#b3b3b3\"/><path d=\"M.346 7.296c-.394.39-.31 4.797-.18 4.898l13.404 10.18c.117.12.337 4.76.73 4.368l5.506-5.56.01.01 6.51-6.444c.39-.392-4.25-.614-4.366-.73L11.777.612c-.1-.132-4.51-.215-4.898.18L4.087 3.636l-.01-.01-3.73 3.67z\" fill=\"#b3b3b3\"/><rect ry=\"6.85\" rx=\"4.571\" y=\"84.758\" x=\"-20.128\" height=\"75.571\" width=\"39.643\" transform=\"rotate(-45)\"/><rect ry=\".374\" rx=\"1.038\" y=\"29.442\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\".374\" rx=\"1.038\" y=\"55.939\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\".374\" rx=\"1.038\" y=\"82.392\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\"2.317\" rx=\"2.183\" y=\"158.876\" x=\"-9.774\" height=\"25.568\" width=\"18.935\" transform=\"rotate(-45)\"/><path d=\"M128.588 128.82s14.97 11.165 7.547 26.35c-8.426 17.24-25.57 20.653-25.57 20.653\" fill=\"none\" stroke=\"#000\" stroke-width=\"6.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
|
|
2757
2757
|
"parts/speaker.svg": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg viewBox=\"0 0 500 500\" xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"matrix(1, 0, 0, 1, -0.00023, -58.230297)\">\n <ellipse style=\"fill: rgb(70, 70, 70);\" cx=\"250.58\" cy=\"308.81\" rx=\"215\" ry=\"215\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 1.000001, -232.069031, 248.780606)\" cx=\"482.069\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -232.067871, 110.041956)\" cx=\"482.067\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"389.12\" cy=\"308.23\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"110.88\" cy=\"308.23\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"169.393\" rx=\"23.028\" ry=\"23.028\"/>\n <g transform=\"matrix(1, 0, 0, 1, -0.000009, 0.000015)\">\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n </g>\n <g transform=\"matrix(0.866026, 0.5, -0.5, 0.866026, 7.386552, -105.261086)\">\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(0.999999, 0, 0, 0.999999, -65.212313, 177.387415)\" cx=\"482.068\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"555.975\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"277.735\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"416.855\" cy=\"97.999\" rx=\"23.028\" ry=\"23.028\"/>\n </g>\n <g transform=\"matrix(0.5, 0.866026, -0.866026, 0.5, 246.635941, -171.170502)\">\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(0.999999, 0, 0, 0.999999, -65.212313, 177.387415)\" cx=\"482.068\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"555.975\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"277.735\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"416.855\" cy=\"97.999\" rx=\"23.028\" ry=\"23.028\"/>\n </g>\n <g transform=\"matrix(-0.5, 0.866026, -0.866026, -0.5, 641.934998, 245.84082)\">\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n </g>\n <g transform=\"matrix(-0.500001, -0.866026, 0.866026, -0.500001, 108.063393, 678.85083)\">\n <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n </g>\n </g>\n</svg>",
|
|
@@ -2767,7 +2767,7 @@ var pxtTargetBundle = {
|
|
|
2767
2767
|
"pxt-python.d.ts": "/// <reference no-default-lib=\"true\"/>\n\ndeclare namespace _py {\n interface Array {\n //% py2tsOverride=\"push($0)\"\n append(value: any): void;\n\n //% py2tsOverride=\"concat($0)\"\n extend(other: Array): void;\n\n //% py2tsOverride=\"insertAt($0, $1)\"\n insert(index: number, value: any): void;\n\n //% py2tsOverride=\"removeElement($0)\"\n remove(value: any): void;\n\n //% py2tsOverride=\"sort($0?)\"\n sort(sorter?: (a: any, b: any) => number): void;\n\n //% py2tsOverride=\"reverse()\"\n reverse(): void;\n\n //% py2tsOverride=\"slice()\"\n copy(): void;\n\n //% pyHelper=\"py_array_pop\"\n pop(index?: number): any;\n\n //% pyHelper=\"py_array_clear\"\n clear(): void;\n\n //% pyHelper=\"py_array_index\"\n index(value: any, start?: number, end?: number): number;\n\n //% pyHelper=\"py_array_count\"\n count(value: any): number;\n }\n\n interface String {\n //% pyHelper=\"py_string_capitalize\"\n capitalize(): string;\n\n //% pyHelper=\"py_string_casefold\"\n casefold(): string;\n\n //% pyHelper=\"py_string_center\"\n center(width: number, fillChar?: string): string;\n\n //% pyHelper=\"py_string_count\"\n count(sub: string, start?: number, end?: number): number;\n\n //% pyHelper=\"py_string_endswith\"\n endswith(suffix: string, start?: number, end?: number): boolean;\n\n //% pyHelper=\"py_string_find\"\n find(sub: string, start?: number, end?: number): number;\n\n //% pyHelper=\"py_string_index\"\n index(sub: string, start?: number, end?: number): number;\n\n //% pyHelper=\"py_string_isalnum\"\n isalnum(): boolean;\n\n //% pyHelper=\"py_string_isalpha\"\n isalpha(): boolean;\n\n //% pyHelper=\"py_string_isascii\"\n isascii(): boolean;\n\n //% pyHelper=\"py_string_isdigit\"\n isdigit(): boolean;\n\n //% pyHelper=\"py_string_isnumeric\"\n isnumeric(): boolean;\n\n //% pyHelper=\"py_string_isspace\"\n isspace(): boolean;\n\n //% pyHelper=\"py_string_isdecimal\"\n isdecimal(): boolean;\n\n //% pyHelper=\"py_string_isidentifier\"\n isidentifier(): boolean;\n\n //% pyHelper=\"py_string_islower\"\n islower(): boolean;\n\n //% pyHelper=\"py_string_isprintable\"\n isprintable(): boolean;\n\n //% pyHelper=\"py_string_istitle\"\n istitle(): boolean;\n\n //% pyHelper=\"py_string_isupper\"\n isupper(): boolean;\n\n //% pyHelper=\"py_string_join\"\n join(iterable: any[]): string;\n\n //% pyHelper=\"py_string_ljust\"\n ljust(width: number, fillChar?: string): string;\n\n //% pyHelper=\"py_string_lower\"\n lower(): string;\n\n //% pyHelper=\"py_string_lstrip\"\n lstrip(chars?: string): string;\n\n //% py2tsOverride=\"replace($0, $1)\"\n replace(oldString: string, newString: string): string;\n\n //% pyHelper=\"py_string_rfind\"\n rfind(sub: string, start?: number, end?: number): number;\n\n //% pyHelper=\"py_string_rindex\"\n rindex(sub: string, start?: number, end?: number): number;\n\n //% pyHelper=\"py_string_rjust\"\n rjust(width: number, fillChar?: string): string;\n\n //% pyHelper=\"py_string_rsplit\"\n rsplit(sep?: string, maxSplit?: number): string[];\n\n //% pyHelper=\"py_string_rstrip\"\n rstrip(chars?: string): string;\n\n //% pyHelper=\"py_string_split\"\n split(sep?: string, maxsplit?: number): string[];\n\n //% pyHelper=\"py_string_splitlines\"\n splitlines(keepends?: boolean): string[];\n\n //% pyHelper=\"py_string_startswith\"\n startswith(prefix: string, start?: number, end?: number): boolean;\n\n //% pyHelper=\"py_string_strip\"\n strip(chars?: string): string;\n\n //% pyHelper=\"py_string_swapcase\"\n swapcase(): string;\n\n //% pyHelper=\"py_string_title\"\n title(): string;\n\n //% pyHelper=\"py_string_upper\"\n upper(): string;\n\n //% pyHelper=\"py_string_zfill\"\n zfill(width: number): string;\n }\n\n interface Dict {\n clear(): void;\n copy(): void;\n get(key: string, defaultValue?: any): any;\n // items(): [string, any][];\n keys(): string[];\n pop(key: string, defaultValue?: any): any;\n // popitem(): [string, any];\n setdefault(key: string, defaultValue?: any): any;\n update(other: Dict): void;\n values(): any[];\n }\n\n interface Set {\n isdisjoint(other: Set): boolean;\n issubset(other: Set): boolean;\n issuperset(other: Set): boolean;\n union(other: Set): Set;\n intersection(other: Set): Set;\n difference(other: Set): Set;\n symmetric_difference(other: Set): Set;\n copy(): Set;\n update(other: Set): void;\n intersection_update(other: Set): void;\n difference_update(other: Set): void;\n symmetric_difference_update(other: Set): void;\n add(elem: any): void;\n remove(elem: any): void;\n discard(elem: any): void;\n pop(): any;\n clear(): void;\n }\n}",
|
|
2768
2768
|
"pxt.cpp": "#include \"pxtbase.h\"\n\nusing namespace std;\n\nnamespace pxt {\n\nAction mkAction(int totallen, RefAction *act) {\n check(getVTable(act)->classNo == BuiltInType::RefAction, PANIC_INVALID_BINARY_HEADER, 1);\n#ifdef PXT_VM\n check(act->initialLen <= totallen, PANIC_INVALID_BINARY_HEADER, 13);\n#endif\n\n if (totallen == 0) {\n return (TValue)act; // no closure needed\n }\n\n void *ptr = gcAllocate(sizeof(RefAction) + totallen * sizeof(void *));\n RefAction *r = new (ptr) RefAction();\n r->len = totallen;\n#ifdef PXT_VM\n r->numArgs = act->numArgs;\n r->initialLen = act->initialLen;\n r->flags = 0;\n#endif\n r->func = act->func;\n memset(r->fields, 0, r->len * sizeof(void *));\n\n MEMDBG(\"mkAction: start=%p => %p\", act, r);\n\n return (Action)r;\n}\n\nRefRecord *mkClassInstance(VTable *vtable) {\n intcheck(vtable->methods[0] == &RefRecord_destroy, PANIC_SIZE, 3);\n // intcheck(vtable->methods[1] == &RefRecord_print, PANIC_SIZE, 4);\n\n void *ptr = gcAllocate(vtable->numbytes);\n RefRecord *r = new (ptr) RefRecord(vtable);\n memset(r->fields, 0, vtable->numbytes - sizeof(RefRecord));\n MEMDBG(\"mkClass: vt=%p => %p\", vtable, r);\n return r;\n}\n\nTValue RefRecord::ld(int idx) {\n // intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 1);\n return fields[idx];\n}\n\nTValue RefRecord::ldref(int idx) {\n // DMESG(\"LD %p len=%d reflen=%d idx=%d\", this, len, reflen, idx);\n // intcheck(0 <= idx && idx < reflen, PANIC_OUT_OF_BOUNDS, 2);\n return fields[idx];\n}\n\nvoid RefRecord::st(int idx, TValue v) {\n // intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 3);\n fields[idx] = v;\n}\n\nvoid RefRecord::stref(int idx, TValue v) {\n // DMESG(\"ST %p len=%d reflen=%d idx=%d\", this, len, reflen, idx);\n // intcheck(0 <= idx && idx < reflen, PANIC_OUT_OF_BOUNDS, 4);\n fields[idx] = v;\n}\n\nvoid RefObject::destroyVT() {\n ((RefObjectMethod)getVTable(this)->methods[0])(this);\n}\n\n//%\nvoid deleteRefObject(RefObject *obj) {\n obj->destroyVT();\n}\n\nvoid RefObject::printVT() {\n ((RefObjectMethod)getVTable(this)->methods[1])(this);\n}\n\nvoid RefRecord_destroy(RefRecord *) {}\n\nvoid RefRecord_print(RefRecord *r) {\n DMESG(\"RefRecord %p size=%d bytes\", r, getVTable(r)->numbytes);\n}\n\nvoid Segment::set(unsigned i, TValue value) {\n if (i < size) {\n data[i] = value;\n } else if (i < Segment::MaxSize) {\n growByMin(i + 1);\n data[i] = value;\n } else {\n return;\n }\n if (length <= i) {\n length = i + 1;\n }\n\n#ifdef DEBUG_BUILD\n DMESG(\"In Segment::set\");\n this->print();\n#endif\n\n return;\n}\n\nstatic inline int growthFactor(int size) {\n if (size == 0) {\n return 4;\n }\n if (size < 64) {\n return size * 2; // Double\n }\n if (size < 512) {\n return size * 5 / 3; // Grow by 1.66 rate\n }\n // Grow by constant rate\n if ((unsigned)size + 256 < Segment::MaxSize)\n return size + 256;\n else\n return Segment::MaxSize;\n}\n\nvoid LLSegment::setLength(unsigned newLen) {\n if (newLen > Segment::MaxSize)\n return;\n\n if (newLen > size) {\n int newSize = growthFactor(size);\n if (newSize < (int)newLen)\n newSize = newLen;\n\n // this will throw if unable to allocate\n TValue *tmp = (TValue *)(xmalloc(newSize * sizeof(TValue)));\n\n // Copy existing data\n if (size) {\n memcpy(tmp, data, size * sizeof(TValue));\n }\n // fill the rest with default value\n memset(tmp + size, 0, (newSize - size) * sizeof(TValue));\n\n // free older segment;\n xfree(data);\n\n data = tmp;\n size = newSize;\n } else if (newLen < length) {\n memset(data + newLen, 0, (length - newLen) * sizeof(TValue));\n }\n\n length = newLen;\n}\n\nvoid LLSegment::set(unsigned idx, TValue v) {\n if (idx >= Segment::MaxSize)\n return;\n if (idx >= length)\n setLength(idx + 1);\n data[idx] = v;\n}\n\nTValue LLSegment::pop() {\n if (length > 0) {\n --length;\n TValue value = data[length];\n data[length] = 0;\n return value;\n }\n return 0;\n}\n\nvoid LLSegment::destroy() {\n length = size = 0;\n xfree(data);\n data = nullptr;\n}\n\nvoid Segment::growByMin(ramint_t minSize) {\n ramint_t newSize = max(minSize, (ramint_t)growthFactor(size));\n\n if (size < newSize) {\n // this will throw if unable to allocate\n TValue *tmp = (TValue *)(gcAllocateArray(newSize * sizeof(TValue)));\n\n // Copy existing data\n if (size)\n memcpy(tmp, data, size * sizeof(TValue));\n // fill the rest with default value\n memset(tmp + size, 0, (newSize - size) * sizeof(TValue));\n\n data = tmp;\n size = newSize;\n\n#ifdef DEBUG_BUILD\n DMESG(\"growBy - after reallocation\");\n this->print();\n#endif\n }\n // else { no shrinking yet; }\n return;\n}\n\nvoid Segment::ensure(ramint_t newSize) {\n if (newSize < size) {\n return;\n }\n growByMin(newSize);\n}\n\nvoid Segment::setLength(unsigned newLength) {\n if (newLength > size) {\n ensure(newLength);\n }\n length = newLength;\n return;\n}\n\nTValue Segment::pop() {\n#ifdef DEBUG_BUILD\n DMESG(\"In Segment::pop\");\n this->print();\n#endif\n\n if (length > 0) {\n --length;\n TValue value = data[length];\n data[length] = Segment::DefaultValue;\n return value;\n }\n return Segment::DefaultValue;\n}\n\n// this function removes an element at index i and shifts the rest of the elements to\n// left to fill the gap\nTValue Segment::remove(unsigned i) {\n#ifdef DEBUG_BUILD\n DMESG(\"In Segment::remove index:%d\", i);\n this->print();\n#endif\n if (i < length) {\n // value to return\n TValue ret = data[i];\n if (i + 1 < length) {\n // Move the rest of the elements to fill in the gap.\n memmove(data + i, data + i + 1, (length - i - 1) * sizeof(void *));\n }\n length--;\n data[length] = Segment::DefaultValue;\n#ifdef DEBUG_BUILD\n DMESG(\"After Segment::remove index:%d\", i);\n this->print();\n#endif\n return ret;\n }\n return Segment::DefaultValue;\n}\n\n// this function inserts element value at index i by shifting the rest of the elements right.\nvoid Segment::insert(unsigned i, TValue value) {\n#ifdef DEBUG_BUILD\n DMESG(\"In Segment::insert index:%d value:%d\", i, value);\n this->print();\n#endif\n\n if (i < length) {\n ensure(length + 1);\n\n // Move the rest of the elements to fill in the gap.\n memmove(data + i + 1, data + i, (length - i) * sizeof(void *));\n\n data[i] = value;\n length++;\n } else {\n // This is insert beyond the length, just call set which will adjust the length\n set(i, value);\n }\n#ifdef DEBUG_BUILD\n DMESG(\"After Segment::insert index:%d\", i);\n this->print();\n#endif\n}\n\nvoid Segment::print() {\n DMESG(\"Segment: %p, length: %d, size: %d\", data, (unsigned)length, (unsigned)size);\n for (unsigned i = 0; i < size; i++) {\n DMESG(\"-> %d\", (unsigned)(uintptr_t)data[i]);\n }\n}\n\nvoid Segment::destroy() {\n#ifdef DEBUG_BUILD\n DMESG(\"In Segment::destroy\");\n this->print();\n#endif\n length = size = 0;\n data = nullptr;\n}\n\nPXT_VTABLE_CTOR(RefCollection) {}\n\nvoid RefCollection::destroy(RefCollection *t) {\n t->head.destroy();\n}\n\nvoid RefCollection::print(RefCollection *t) {\n DMESG(\"RefCollection %p size=%d\", t, t->head.getLength());\n t->head.print();\n}\n\nPXT_VTABLE(RefAction, ValType::Function)\nRefAction::RefAction() : PXT_VTABLE_INIT(RefAction) {}\n\n// fields[] contain captured locals\nvoid RefAction::destroy(RefAction *t) {}\n\nvoid RefAction::print(RefAction *t) {\n#ifdef PXT_VM\n DMESG(\"RefAction %p pc=%X size=%d\", t, (uint32_t)t->func, t->len);\n#else\n DMESG(\"RefAction %p pc=%X size=%d\", t, (const uint8_t *)t->func - (const uint8_t *)bytecode,\n t->len);\n#endif\n}\n\nPXT_VTABLE_CTOR(RefRefLocal) {\n v = 0;\n}\n\nvoid RefRefLocal::print(RefRefLocal *t) {\n DMESG(\"RefRefLocal %p v=%p\", t, (void *)t->v);\n}\n\nvoid RefRefLocal::destroy(RefRefLocal *t) {\n decr(t->v);\n}\n\nPXT_VTABLE_CTOR(RefMap) {}\n\nvoid RefMap::destroy(RefMap *t) {\n t->keys.destroy();\n t->values.destroy();\n}\n\nint RefMap::findIdx(String key) {\n auto len = keys.getLength();\n auto data = (String *)keys.getData();\n\n // fast path\n for (unsigned i = 0; i < len; ++i) {\n if (data[i] == key)\n return i;\n }\n\n // slow path\n auto keylen = key->getUTF8Size();\n auto keydata = key->getUTF8Data();\n for (unsigned i = 0; i < len; ++i) {\n auto s = data[i];\n if (s->getUTF8Size() == keylen && memcmp(keydata, s->getUTF8Data(), keylen) == 0)\n return i;\n }\n\n return -1;\n}\n\nvoid RefMap::print(RefMap *t) {\n DMESG(\"RefMap %p size=%d\", t, t->keys.getLength());\n}\n\nvoid debugMemLeaks() {}\n\nvoid error(PXT_PANIC code, int subcode) {\n DMESG(\"Error: %d [%d]\", code, subcode);\n target_panic(code);\n}\n\n#ifndef PXT_VM\nuint16_t *bytecode;\n#endif\nTValue *globals;\n\nvoid checkStr(bool cond, const char *msg) {\n if (!cond) {\n while (true) {\n // uBit.display.scroll(msg, 100);\n // uBit.sleep(100);\n }\n }\n}\n\n#ifdef PXT_VM\nint templateHash() {\n return *(int*)&vmImg->infoHeader->hexHash;\n}\n\nint programHash() {\n return *(int*)&vmImg->infoHeader->programHash;\n}\n\nint getNumGlobals() {\n return (int)vmImg->infoHeader->allocGlobals;\n}\n\nString programName() {\n return mkString((char *)vmImg->infoHeader->name);\n}\n#else\nint templateHash() {\n return ((int *)bytecode)[4];\n}\n\nint programHash() {\n return ((int *)bytecode)[6];\n}\n\nint getNumGlobals() {\n return bytecode[16];\n}\n\nString programName() {\n return ((String *)bytecode)[15];\n}\n#endif\n\n#ifndef PXT_VM\nvoid variantNotSupported(const char *v) {\n DMESG(\"variant not supported: %s\", v);\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n}\n\nvoid exec_binary(unsigned *pc) {\n // XXX re-enable once the calibration code is fixed and [editor/embedded.ts]\n // properly prepends a call to [internal_main].\n // ::touch_develop::internal_main();\n\n // unique group for radio based on source hash\n // ::touch_develop::micro_bit::radioDefaultGroup = programHash();\n\n unsigned ver = *pc++;\n checkStr(ver == 0x4210, \":( Bad runtime version\");\n\n bytecode = *((uint16_t **)pc++); // the actual bytecode is here\n\n if (((uint32_t *)bytecode)[0] == 0x923B8E71) {\n variantNotSupported((const char *)bytecode + 16);\n return;\n }\n\n globals = (TValue *)app_alloc(sizeof(TValue) * getNumGlobals());\n memset(globals, 0, sizeof(TValue) * getNumGlobals());\n\n // can be any valid address, best in RAM for speed\n globals[0] = (TValue)&globals;\n\n // just compare the first word\n // TODO\n checkStr(((uint32_t *)bytecode)[0] == 0x923B8E70 && (unsigned)templateHash() == *pc,\n \":( Failed partial flash\");\n\n uintptr_t startptr = (uintptr_t)bytecode;\n\n startptr += 64; // header\n\n initPerfCounters();\n\n initRuntime();\n\n runAction0((Action)startptr);\n\n pxt::releaseFiber();\n}\n\nvoid start() {\n exec_binary((unsigned *)functionsAndBytecode);\n}\n#endif\n\n} // namespace pxt\n\nnamespace Array_ {\n//%\nbool isArray(TValue arr) {\n auto vt = getAnyVTable(arr);\n return vt && vt->classNo == BuiltInType::RefCollection;\n}\n} // namespace Array_\n\nnamespace pxtrt {\n//% expose\nRefCollection *keysOf(TValue v) {\n auto r = NEW_GC(RefCollection);\n MEMDBG(\"mkColl[keys]: => %p\", r);\n if (getAnyVTable(v) != &RefMap_vtable)\n return r;\n auto rm = (RefMap *)v;\n auto len = rm->keys.getLength();\n if (!len)\n return r;\n registerGCObj(r);\n r->setLength(len);\n auto dst = r->getData();\n memcpy(dst, rm->keys.getData(), len * sizeof(TValue));\n unregisterGCObj(r);\n return r;\n}\n//% expose\nTValue mapDeleteByString(RefMap *map, String key) {\n if (getAnyVTable((TValue)map) != &RefMap_vtable)\n soft_panic(PANIC_DELETE_ON_CLASS);\n int i = map->findIdx(key);\n if (i >= 0) {\n map->keys.remove(i);\n map->values.remove(i);\n }\n return TAG_TRUE;\n}\n\n} // namespace pxtrt\n",
|
|
2769
2769
|
"pxt.h": "#ifndef __PXT_H\n#define __PXT_H\n\n//#define DEBUG_MEMLEAKS 1\n\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n\n#include \"pxtbase.h\"\n\nnamespace pxt {\n\nclass RefMImage : public RefObject {\n public:\n ImageData *img;\n\n RefMImage(ImageData *d);\n void makeWritable();\n static void destroy(RefMImage *map);\n static void print(RefMImage *map);\n static void scan(RefMImage *t);\n static unsigned gcsize(RefMImage *t);\n};\n\n#define MSTR(s) ManagedString((s)->getUTF8Data(), (s)->getUTF8Size())\n\nstatic inline String PSTR(ManagedString s) {\n return mkString(s.toCharArray(), s.length());\n}\n\ntypedef uint32_t ImageLiteral_;\n\nstatic inline ImageData *imageBytes(ImageLiteral_ lit) {\n return (ImageData *)lit;\n}\n\n#if MICROBIT_CODAL\n// avoid clashes with codal-defined classes\n#define Image MImage\n#define Button MButton\n#endif\n\ntypedef MicroBitPin DevicePin;\n\ntypedef RefMImage *Image;\n\nextern MicroBit uBit;\nextern MicroBitEvent lastEvent;\nextern bool serialLoggingDisabled;\n\nMicroBitPin *getPin(int id);\n\nstatic inline int min_(int a, int b) {\n if (a < b)\n return a;\n else\n return b;\n}\n\nstatic inline int max_(int a, int b) {\n if (a > b)\n return a;\n else\n return b;\n}\n\nvoid initMicrobitGC();\n\n} // namespace pxt\n\nusing namespace pxt;\n\n#define DEVICE_EVT_ANY 0\n\n#undef PXT_MAIN\n#define PXT_MAIN \\\n int main() { \\\n pxt::initMicrobitGC(); \\\n pxt::start(); \\\n return 0; \\\n }\n\n#endif\n\n// vim: ts=2 sw=2 expandtab\n",
|
|
2770
|
-
"pxt.json": "{\n \"name\": \"core\",\n \"description\": \"The microbit core library\",\n \"dependencies\": {},\n \"files\": [\n \"README.md\",\n \"platform.h\",\n \"pxt.cpp\",\n \"pxt.h\",\n \"pxtbase.h\",\n \"pxtcore.h\",\n \"math.ts\",\n \"dal.d.ts\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"pxt-core.d.ts\",\n \"core.cpp\",\n \"pxt-helpers.ts\",\n \"helpers.ts\",\n \"pxt-python.d.ts\",\n \"pxt-python-helpers.ts\",\n \"pinscompat.ts\",\n \"configkeys.h\",\n \"gc.cpp\",\n \"codal.cpp\",\n \"images.cpp\",\n \"basic.cpp\",\n \"basic.ts\",\n \"icons.ts\",\n \"icons.jres\",\n \"input.cpp\",\n \"input.ts\",\n \"gestures.jres\",\n \"control.ts\",\n \"control.cpp\",\n \"controlgc.cpp\",\n \"perfcounters.ts\",\n \"interval.ts\",\n \"gcstats.ts\",\n \"console.ts\",\n \"game.ts\",\n \"led.cpp\",\n \"led.ts\",\n \"music.cpp\",\n \"music.ts\",\n \"melodies.ts\",\n \"pins.cpp\",\n \"pins.ts\",\n \"serial.cpp\",\n \"serial.ts\",\n \"buffer.cpp\",\n \"buffer.ts\",\n \"json.ts\",\n \"poll.ts\",\n \"controlmessage.ts\",\n \"pxtparts.json\",\n \"advmath.cpp\",\n \"trig.cpp\",\n \"fixed.ts\",\n \"templates.ts\",\n \"sendbuffer.s\",\n \"sendbuffernrf52.s\",\n \"sendbufferbrightness.s\",\n \"light.cpp\",\n \"logo.cpp\",\n \"loops.ts\",\n \"touchmode.cpp\",\n \"soundexpressions.ts\",\n \"soundexpressions.cpp\",\n \"parts/speaker.svg\",\n \"parts/headphone.svg\"\n ],\n \"testFiles\": [],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2770
|
+
"pxt.json": "{\n \"name\": \"core\",\n \"description\": \"The microbit core library\",\n \"dependencies\": {},\n \"files\": [\n \"README.md\",\n \"platform.h\",\n \"pxt.cpp\",\n \"pxt.h\",\n \"pxtbase.h\",\n \"pxtcore.h\",\n \"math.ts\",\n \"dal.d.ts\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"pxt-core.d.ts\",\n \"core.cpp\",\n \"pxt-helpers.ts\",\n \"helpers.ts\",\n \"pxt-python.d.ts\",\n \"pxt-python-helpers.ts\",\n \"pinscompat.ts\",\n \"configkeys.h\",\n \"gc.cpp\",\n \"codal.cpp\",\n \"images.cpp\",\n \"basic.cpp\",\n \"basic.ts\",\n \"icons.ts\",\n \"icons.jres\",\n \"input.cpp\",\n \"input.ts\",\n \"gestures.jres\",\n \"control.ts\",\n \"control.cpp\",\n \"controlgc.cpp\",\n \"perfcounters.ts\",\n \"interval.ts\",\n \"gcstats.ts\",\n \"console.ts\",\n \"game.ts\",\n \"led.cpp\",\n \"led.ts\",\n \"music.cpp\",\n \"music.ts\",\n \"melodies.ts\",\n \"pins.cpp\",\n \"pins.ts\",\n \"serial.cpp\",\n \"serial.ts\",\n \"buffer.cpp\",\n \"buffer.ts\",\n \"json.ts\",\n \"poll.ts\",\n \"controlmessage.ts\",\n \"pxtparts.json\",\n \"advmath.cpp\",\n \"trig.cpp\",\n \"fixed.ts\",\n \"templates.ts\",\n \"sendbuffer.s\",\n \"sendbuffernrf52.s\",\n \"sendbufferbrightness.s\",\n \"light.cpp\",\n \"logo.cpp\",\n \"loops.ts\",\n \"touchmode.cpp\",\n \"soundexpressions.ts\",\n \"soundexpressions.cpp\",\n \"parts/speaker.svg\",\n \"parts/headphone.svg\"\n ],\n \"testFiles\": [],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"dalDTS\": {\n \"compileServiceVariant\": \"mbcodal\",\n \"includeDirs\": [\n \"libraries/codal-core/inc\",\n \"libraries/codal-microbit-v2/inc\",\n \"libraries/codal-microbit-v2/model\",\n \"libraries/codal-microbit-v2/inc/compat\",\n \"pxtapp\"\n ],\n \"excludePrefix\": [\n \"USB_\",\n \"REQUEST_\",\n \"LIS3DH_\",\n \"FXOS8700_\",\n \"MMA8\",\n \"LSM303_\",\n \"MAG_\",\n \"MPU6050_\",\n \"REF_TAG_\",\n \"HF2_\",\n \"PXT_REF_TAG_\",\n \"MS_\",\n \"SCSI_\"\n ]\n },\n \"yotta\": {\n \"config\": {\n \"microbit-dal\": {\n \"fiber_user_data\": 1,\n \"pxt\": 1\n }\n },\n \"optionalConfig\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"private_addressing\": 0,\n \"advertising_timeout\": 0,\n \"tx_power\": 6,\n \"dfu_service\": 1,\n \"event_service\": 1,\n \"device_info_service\": 1,\n \"eddystone_url\": 1,\n \"eddystone_uid\": 1,\n \"open\": 0,\n \"pairing_mode\": 1,\n \"whitelist\": 1,\n \"security_level\": \"SECURITY_MODE_ENCRYPTION_NO_MITM\",\n \"partial_flashing\": 1\n }\n }\n },\n \"userConfigs\": [\n {\n \"description\": \"No Pairing Required: Anyone can connect via Bluetooth.\",\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"open\": 1,\n \"whitelist\": 0,\n \"security_level\": null\n }\n }\n }\n },\n {\n \"description\": \"JustWorks pairing (default): Pairing is automatic once the pairing is initiated.\",\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"open\": 0,\n \"whitelist\": 1,\n \"security_level\": \"SECURITY_MODE_ENCRYPTION_NO_MITM\"\n }\n }\n }\n },\n {\n \"description\": \"Passkey pairing: Pairing requires 6 digit key to pair.\",\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"open\": 0,\n \"whitelist\": 1,\n \"security_level\": \"SECURITY_MODE_ENCRYPTION_WITH_MITM\"\n }\n }\n }\n }\n ]\n },\n \"partial\": true\n}\n",
|
|
2771
2771
|
"pxtbase.h": "#ifndef __PXTBASE_H\n#define __PXTBASE_H\n\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#pragma GCC diagnostic ignored \"-Wformat\"\n#pragma GCC diagnostic ignored \"-Warray-bounds\"\n\n// needed for gcc6; not sure why\n#undef min\n#undef max\n\n#define NOLOG(...) \\\n do { \\\n } while (0)\n\n#define MEMDBG NOLOG\n//#define MEMDBG DMESG\n#define MEMDBG2 NOLOG\n\n#include \"pxtconfig.h\"\n#include \"configkeys.h\"\n\n#ifndef PXT_UTF8\n#define PXT_UTF8 0\n#endif\n\n#if defined(PXT_VM)\n#include <stdint.h>\n#if UINTPTR_MAX == 0xffffffff\n#define PXT32 1\n#elif UINTPTR_MAX == 0xffffffffffffffff\n#define PXT64 1\n#else\n#error \"UINTPTR_MAX has invalid value\"\n#endif\n#endif\n\n#define intcheck(...) check(__VA_ARGS__)\n//#define intcheck(...) do {} while (0)\n\n#ifdef PXT_USE_FLOAT\n#define NUMBER float\n#else\n#define NUMBER double\n#endif\n\n#include <string.h>\n#include <stdint.h>\n#include <math.h>\n\n#ifdef POKY\nvoid *operator new(size_t size, void *ptr);\nvoid *operator new(size_t size);\n#else\n#include <new>\n#endif\n\n#include \"platform.h\"\n#include \"pxtcore.h\"\n\n#ifndef PXT_REGISTER_RESET\n#define PXT_REGISTER_RESET(fn) ((void)0)\n#endif\n\n#define PXT_REFCNT_FLASH 0xfffe\n\n#define CONCAT_1(a, b) a##b\n#define CONCAT_0(a, b) CONCAT_1(a, b)\n// already provided in some platforms, like mbedos\n#ifndef STATIC_ASSERT\n#define STATIC_ASSERT(e) enum { CONCAT_0(_static_assert_, __LINE__) = 1 / ((e) ? 1 : 0) };\n#endif\n\n#ifndef ramint_t\n// this type limits size of arrays\n#if defined(__linux__) || defined(PXT_VM)\n// TODO fix the inline array accesses to take note of this!\n#define ramint_t uint32_t\n#else\n#define ramint_t uint16_t\n#endif\n#endif\n\n#ifndef PXT_IN_ISR\n#define PXT_IN_ISR() (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk)\n#endif\n\n#ifdef POKY\ninline void *operator new(size_t, void *p) {\n return p;\n}\ninline void *operator new[](size_t, void *p) {\n return p;\n}\n#endif\n\nnamespace pxt {\n\ntemplate <typename T> inline const T &max(const T &a, const T &b) {\n if (a < b)\n return b;\n return a;\n}\n\ntemplate <typename T> inline const T &min(const T &a, const T &b) {\n if (a < b)\n return a;\n return b;\n}\n\ntemplate <typename T> inline void swap(T &a, T &b) {\n T tmp = a;\n a = b;\n b = tmp;\n}\n\n//\n// Tagged values (assume 4 bytes for now, Cortex-M0)\n//\nstruct TValueStruct {};\ntypedef TValueStruct *TValue;\n\ntypedef TValue TNumber;\ntypedef TValue Action;\ntypedef TValue ImageLiteral;\n\n// To be implemented by the target\nextern \"C\" void target_panic(int error_code);\nextern \"C\" void target_reset();\nvoid sleep_ms(unsigned ms);\nvoid sleep_us(uint64_t us);\nvoid releaseFiber();\nuint64_t current_time_us();\nint current_time_ms();\nvoid initRuntime();\nvoid initSystemTimer();\nvoid sendSerial(const char *data, int len);\nvoid setSendToUART(void (*f)(const char *, int));\nuint64_t getLongSerialNumber();\nvoid registerWithDal(int id, int event, Action a, int flags = 16); // EVENT_LISTENER_DEFAULT_FLAGS\nvoid runInParallel(Action a);\nvoid runForever(Action a);\nvoid waitForEvent(int id, int event);\n//%\nunsigned afterProgramPage();\n//%\nvoid dumpDmesg();\nuint32_t hash_fnv1(const void *data, unsigned len);\n\n// also defined DMESG macro\n// end\n\n#define TAGGED_SPECIAL(n) (TValue)(void *)((n << 2) | 2)\n#define TAG_FALSE TAGGED_SPECIAL(2) // 10\n#define TAG_TRUE TAGGED_SPECIAL(16) // 66\n#define TAG_UNDEFINED (TValue)0\n#define TAG_NULL TAGGED_SPECIAL(1) // 6\n#define TAG_NAN TAGGED_SPECIAL(3) // 14\n#define TAG_NUMBER(n) (TNumber)(void *)(((uintptr_t)(uint32_t)(n) << 1) | 1)\n#define TAG_NON_VALUE TAGGED_SPECIAL(4) // 18; doesn't represent any JS value\n\n#ifdef PXT_VM\ninline bool isEncodedDouble(uint64_t v) {\n return (v >> 48) != 0;\n}\n#endif\n\ninline bool isDouble(TValue v) {\n#ifdef PXT64\n return ((uintptr_t)v >> 48) != 0;\n#else\n (void)v;\n return false;\n#endif\n}\n\ninline bool isPointer(TValue v) {\n return !isDouble(v) && v != 0 && ((intptr_t)v & 3) == 0;\n}\n\ninline bool isTagged(TValue v) {\n return (!isDouble(v) && ((intptr_t)v & 3)) || !v;\n}\n\ninline bool isInt(TValue v) {\n return !isDouble(v) && ((intptr_t)v & 1);\n}\n\ninline bool isSpecial(TValue v) {\n return !isDouble(v) && ((intptr_t)v & 2);\n}\n\ninline bool bothNumbers(TValue a, TValue b) {\n return !isDouble(a) && !isDouble(b) && ((intptr_t)a & (intptr_t)b & 1);\n}\n\ninline int numValue(TValue n) {\n return (int)((intptr_t)n >> 1);\n}\n\ninline bool canBeTagged(int v) {\n (void)v;\n#ifdef PXT_BOX_DEBUG\n return false;\n#elif defined(PXT64)\n return true;\n#else\n return (v << 1) >> 1 == v;\n#endif\n}\n\n// see https://anniecherkaev.com/the-secret-life-of-nan\n\n#define NanBoxingOffset 0x1000000000000LL\n\ntemplate <typename TO, typename FROM> TO bitwise_cast(FROM in) {\n STATIC_ASSERT(sizeof(TO) == sizeof(FROM));\n union {\n FROM from;\n TO to;\n } u;\n u.from = in;\n return u.to;\n}\n\ninline double decodeDouble(uint64_t v) {\n return bitwise_cast<double>(v - NanBoxingOffset);\n}\n\n#ifdef PXT64\nSTATIC_ASSERT(sizeof(void *) == 8);\ninline double doubleVal(TValue v) {\n return bitwise_cast<double>((uint64_t)v - NanBoxingOffset);\n}\n\ninline TValue tvalueFromDouble(double d) {\n return (TValue)(bitwise_cast<uint64_t>(d) + NanBoxingOffset);\n}\n#else\nSTATIC_ASSERT(sizeof(void *) == 4);\n#endif\n\n// keep in sym with sim/control.ts\ntypedef enum {\n PANIC_CODAL_OOM = 20,\n PANIC_GC_OOM = 21,\n PANIC_GC_TOO_BIG_ALLOCATION = 22,\n PANIC_CODAL_HEAP_ERROR = 30,\n PANIC_CODAL_NULL_DEREFERENCE = 40,\n PANIC_CODAL_USB_ERROR = 50,\n PANIC_CODAL_HARDWARE_CONFIGURATION_ERROR = 90,\n\n PANIC_INVALID_BINARY_HEADER = 901,\n PANIC_OUT_OF_BOUNDS = 902,\n PANIC_REF_DELETED = 903,\n PANIC_SIZE = 904,\n PANIC_INVALID_VTABLE = 905,\n PANIC_INTERNAL_ERROR = 906,\n PANIC_NO_SUCH_CONFIG = 907,\n PANIC_NO_SUCH_PIN = 908,\n PANIC_INVALID_ARGUMENT = 909,\n PANIC_MEMORY_LIMIT_EXCEEDED = 910,\n PANIC_SCREEN_ERROR = 911,\n PANIC_MISSING_PROPERTY = 912,\n PANIC_INVALID_IMAGE = 913,\n PANIC_CALLED_FROM_ISR = 914,\n PANIC_HEAP_DUMPED = 915,\n PANIC_STACK_OVERFLOW = 916,\n PANIC_BLOCKING_TO_STRING = 917,\n PANIC_VM_ERROR = 918,\n PANIC_SETTINGS_CLEARED = 920,\n PANIC_SETTINGS_OVERLOAD = 921,\n PANIC_SETTINGS_SECRET_MISSING = 922,\n PANIC_DELETE_ON_CLASS = 923,\n PANIC_OUT_OF_TIMERS = 924,\n PANIC_JACDAC = 925,\n PANIC_MICROPHONE_MISSING = 926,\n PANIC_VARIANT_NOT_SUPPORTED = 927,\n\n PANIC_CAST_FIRST = 980,\n PANIC_CAST_FROM_UNDEFINED = 980,\n PANIC_CAST_FROM_BOOLEAN = 981,\n PANIC_CAST_FROM_NUMBER = 982,\n PANIC_CAST_FROM_STRING = 983,\n PANIC_CAST_FROM_OBJECT = 984,\n PANIC_CAST_FROM_FUNCTION = 985,\n PANIC_CAST_FROM_NULL = 989,\n\n PANIC_UNHANDLED_EXCEPTION = 999,\n\n} PXT_PANIC;\n\nextern const uintptr_t functionsAndBytecode[];\nextern TValue *globals;\nextern uint16_t *bytecode;\nclass RefRecord;\n\n// Utility functions\n\ntypedef TValue (*RunActionType)(Action a, TValue arg0, TValue arg1, TValue arg2);\n\n#define asmRunAction3 ((RunActionType)(((uintptr_t *)bytecode)[12]))\n\nstatic inline TValue runAction3(Action a, TValue arg0, TValue arg1, TValue arg2) {\n return asmRunAction3(a, arg0, arg1, 0);\n}\nstatic inline TValue runAction2(Action a, TValue arg0, TValue arg1) {\n return asmRunAction3(a, arg0, arg1, 0);\n}\nstatic inline TValue runAction1(Action a, TValue arg0) {\n return asmRunAction3(a, arg0, 0, 0);\n}\nstatic inline TValue runAction0(Action a) {\n return asmRunAction3(a, 0, 0, 0);\n}\n\nclass RefAction;\nclass BoxedString;\nstruct VTable;\n\n//%\nAction mkAction(int totallen, RefAction *act);\n//% expose\nint templateHash();\n//% expose\nint programHash();\n//% expose\nBoxedString *programName();\n//% expose\nunsigned programSize();\n//%\nint getNumGlobals();\n//%\nRefRecord *mkClassInstance(VTable *vt);\n//%\nvoid debugMemLeaks();\n//%\nvoid anyPrint(TValue v);\n\n//%\nint getConfig(int key, int defl = -1);\n\n//%\nint toInt(TNumber v);\n//%\nunsigned toUInt(TNumber v);\n//%\nNUMBER toDouble(TNumber v);\n//%\nfloat toFloat(TNumber v);\n//%\nTNumber fromDouble(NUMBER r);\n//%\nTNumber fromFloat(float r);\n\n//%\nTNumber fromInt(int v);\n//%\nTNumber fromUInt(unsigned v);\n//%\nTValue fromBool(bool v);\n//%\nbool eq_bool(TValue a, TValue b);\n//%\nbool eqq_bool(TValue a, TValue b);\n\n//%\nvoid failedCast(TValue v, void *addr = NULL);\n//%\nvoid missingProperty(TValue v);\n\nvoid error(PXT_PANIC code, int subcode = 0);\nvoid exec_binary(unsigned *pc);\nvoid start();\n\nstruct HandlerBinding {\n HandlerBinding *next;\n int source;\n int value;\n Action action;\n#ifndef PXT_CODAL\n uint32_t flags;\n struct Event *pending;\n#endif\n};\nHandlerBinding *findBinding(int source, int value);\nHandlerBinding *nextBinding(HandlerBinding *curr, int source, int value);\nvoid setBinding(int source, int value, Action act);\n\n// Legacy stuff; should no longer be used\n//%\nTValue incr(TValue e);\n//%\nvoid decr(TValue e);\n\ninline TValue incr(TValue e) {\n return e;\n}\ninline void decr(TValue e) {}\n\nclass RefObject;\n\nstatic inline RefObject *incrRC(RefObject *r) {\n return r;\n}\nstatic inline void decrRC(RefObject *) {}\n\ninline void *ptrOfLiteral(int offset) {\n return &bytecode[offset];\n}\n\n// Checks if object is ref-counted, and has a custom PXT vtable in front\n// TODO\ninline bool isRefCounted(TValue e) {\n return isPointer(e);\n}\n\ninline void check(int cond, PXT_PANIC code, int subcode = 0) {\n if (!cond)\n error(code, subcode);\n}\n\ninline void oops(int subcode = 0) {\n target_panic(800 + subcode);\n}\n\nclass RefObject;\n\ntypedef void (*RefObjectMethod)(RefObject *self);\ntypedef unsigned (*RefObjectSizeMethod)(RefObject *self);\ntypedef void *PVoid;\ntypedef void **PPVoid;\n\ntypedef void *Object_;\n\n#define VTABLE_MAGIC 0xF9\n#define VTABLE_MAGIC2 0xF8\n\nenum class ValType : uint8_t {\n Undefined,\n Boolean,\n Number,\n String,\n Object,\n Function,\n};\n\n// keep in sync with pxt-core (search for the type name)\nenum class BuiltInType : uint16_t {\n BoxedString = 1,\n BoxedNumber = 2,\n BoxedBuffer = 3,\n RefAction = 4,\n RefImage = 5,\n RefCollection = 6,\n RefRefLocal = 7,\n RefMap = 8,\n RefMImage = 9, // microbit-specific\n MMap = 10, // linux, mostly ev3\n BoxedString_SkipList = 11, // used by VM bytecode representation only\n BoxedString_ASCII = 12, // ditto\n ZPin = 13,\n User0 = 16,\n};\n\nstruct VTable {\n uint16_t numbytes;\n ValType objectType;\n uint8_t magic;\n#ifdef PXT_VM\n uint16_t ifaceHashEntries;\n BuiltInType lastClassNo;\n#else\n PVoid *ifaceTable;\n#endif\n BuiltInType classNo;\n uint16_t reserved;\n uint32_t ifaceHashMult;\n\n // we only use the first few methods here; pxt will generate more\n PVoid methods[8];\n};\n\n//%\nextern const VTable string_inline_ascii_vt;\n#if PXT_UTF8\n//%\nextern const VTable string_inline_utf8_vt;\n//%\nextern const VTable string_cons_vt;\n//%\nextern const VTable string_skiplist16_vt;\n//%\nextern const VTable string_skiplist16_packed_vt;\n#endif\n//%\nextern const VTable buffer_vt;\n//%\nextern const VTable number_vt;\n//%\nextern const VTable RefAction_vtable;\n\n#ifndef PXT_IS_READONLY\n// assume ARM - ram addresses are 0x2000_0000+; flash is either 0x0+ or 0x0800_0000+\n#define PXT_IS_READONLY(v) (isTagged(v) || !((uintptr_t)v >> 28))\n#endif\n\ninline bool isReadOnly(TValue v) {\n return PXT_IS_READONLY(v);\n}\n\n// A base abstract class for ref-counted objects.\nclass RefObject {\n public:\n const VTable *vtable;\n\n RefObject(const VTable *vt) {\n#if defined(PXT32) && defined(PXT_VM) && !defined(PXT_ESP32)\n if ((uint32_t)vt & 0xf0000000)\n target_panic(PANIC_INVALID_VTABLE);\n#endif\n vtable = vt;\n }\n\n void destroyVT();\n void printVT();\n\n inline uintptr_t vt() { return (uintptr_t)vtable; }\n inline void setVT(uintptr_t v) { vtable = (const VTable *)v; }\n\n inline void ref() {}\n inline void unref() {}\n inline bool isReadOnly() { return pxt::isReadOnly((TValue)this); }\n};\n\nclass Segment {\n private:\n TValue *data;\n ramint_t length;\n ramint_t size;\n\n // this just gives max value of ramint_t\n void growByMin(ramint_t minSize);\n void ensure(ramint_t newSize);\n\n public:\n static constexpr ramint_t MaxSize = (((1U << (8 * sizeof(ramint_t) - 1)) - 1) << 1) + 1;\n static constexpr TValue DefaultValue = TAG_UNDEFINED; // == NULL\n\n Segment() : data(nullptr), length(0), size(0) {}\n\n TValue get(unsigned i) { return i < length ? data[i] : NULL; }\n void set(unsigned i, TValue value);\n\n unsigned getLength() { return length; };\n void setLength(unsigned newLength);\n\n void push(TValue value) { set(length, value); }\n TValue pop();\n\n TValue remove(unsigned i);\n void insert(unsigned i, TValue value);\n\n void destroy();\n\n void print();\n\n TValue *getData() { return data; }\n};\n\n// Low-Level segment using system malloc\nclass LLSegment {\n private:\n TValue *data;\n ramint_t length;\n ramint_t size;\n\n public:\n LLSegment() : data(nullptr), length(0), size(0) {}\n\n void set(unsigned idx, TValue v);\n void push(TValue value) { set(length, value); }\n TValue pop();\n void destroy();\n void setLength(unsigned newLen);\n\n TValue get(unsigned i) { return i < length ? data[i] : NULL; }\n unsigned getLength() { return length; };\n TValue *getData() { return data; }\n};\n\n// A ref-counted collection of either primitive or ref-counted objects (String, Image,\n// user-defined record, another collection)\nclass RefCollection : public RefObject {\n public:\n Segment head;\n\n RefCollection();\n\n static void destroy(RefCollection *coll);\n static void scan(RefCollection *coll);\n static unsigned gcsize(RefCollection *coll);\n static void print(RefCollection *coll);\n\n unsigned length() { return head.getLength(); }\n void setLength(unsigned newLength) { head.setLength(newLength); }\n TValue getAt(int i) { return head.get(i); }\n TValue *getData() { return head.getData(); }\n};\n\nclass RefMap : public RefObject {\n public:\n Segment keys;\n Segment values;\n\n RefMap();\n static void destroy(RefMap *map);\n static void scan(RefMap *map);\n static unsigned gcsize(RefMap *coll);\n static void print(RefMap *map);\n int findIdx(BoxedString *key);\n};\n\n// A ref-counted, user-defined JS object.\nclass RefRecord : public RefObject {\n public:\n // The object is allocated, so that there is space at the end for the fields.\n TValue fields[];\n\n RefRecord(VTable *v) : RefObject(v) {}\n\n TValue ld(int idx);\n TValue ldref(int idx);\n void st(int idx, TValue v);\n void stref(int idx, TValue v);\n};\n\nstatic inline VTable *getVTable(RefObject *r) {\n return (VTable *)(r->vt() & ~1);\n}\n\nstatic inline VTable *getAnyVTable(TValue v) {\n if (!isRefCounted(v))\n return NULL;\n auto vt = getVTable((RefObject *)v);\n if (vt->magic == VTABLE_MAGIC)\n return vt;\n return NULL;\n}\n\n// these are needed when constructing vtables for user-defined classes\n//%\nvoid RefRecord_destroy(RefRecord *r);\n//%\nvoid RefRecord_print(RefRecord *r);\n//%\nvoid RefRecord_scan(RefRecord *r);\n//%\nunsigned RefRecord_gcsize(RefRecord *r);\n\ntypedef TValue (*ActionCB)(TValue *captured, TValue arg0, TValue arg1, TValue arg2);\n\n// Ref-counted function pointer.\nclass RefAction : public RefObject {\n public:\n uint16_t len;\n uint16_t numArgs;\n#ifdef PXT_VM\n uint16_t initialLen;\n uint16_t flags;\n uintptr_t func;\n#else\n ActionCB func; // The function pointer\n#endif\n // fields[] contain captured locals\n TValue fields[];\n\n static void destroy(RefAction *act);\n static void scan(RefAction *act);\n static unsigned gcsize(RefAction *coll);\n static void print(RefAction *act);\n\n RefAction();\n\n inline void stCore(int idx, TValue v) {\n // DMESG(\"ST [%d] = %d \", idx, v); this->print();\n intcheck(0 <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 10);\n intcheck(fields[idx] == 0, PANIC_OUT_OF_BOUNDS, 11); // only one assignment permitted\n fields[idx] = v;\n }\n};\n\n// These two are used to represent locals written from inside inline functions\nclass RefRefLocal : public RefObject {\n public:\n TValue v;\n static void destroy(RefRefLocal *l);\n static void scan(RefRefLocal *l);\n static unsigned gcsize(RefRefLocal *l);\n static void print(RefRefLocal *l);\n RefRefLocal();\n};\n\ntypedef int color;\n\n// note: this is hardcoded in PXT (hexfile.ts)\n\nclass BoxedNumber : public RefObject {\n public:\n NUMBER num;\n BoxedNumber() : RefObject(&number_vt) {}\n} __attribute__((packed));\n\nclass BoxedString : public RefObject {\n public:\n union {\n struct {\n uint16_t length; // ==size\n char data[0];\n } ascii;\n#if PXT_UTF8\n struct {\n uint16_t size;\n char data[0];\n } utf8;\n struct {\n BoxedString *left;\n BoxedString *right;\n } cons;\n struct {\n uint16_t size; // in bytes\n uint16_t length; // in characters\n uint16_t *list;\n } skip;\n struct {\n uint16_t size; // in bytes\n uint16_t length; // in characters\n uint16_t list[0];\n } skip_pack;\n#endif\n };\n\n#if PXT_UTF8\n uintptr_t runMethod(int idx) {\n return ((uintptr_t(*)(BoxedString *))vtable->methods[idx])(this);\n }\n const char *getUTF8Data() { return (const char *)runMethod(4); }\n uint32_t getUTF8Size() { return (uint32_t)runMethod(5); }\n // in characters\n uint32_t getLength() { return (uint32_t)runMethod(6); }\n const char *getUTF8DataAt(uint32_t pos) {\n auto meth = ((const char *(*)(BoxedString *, uint32_t))vtable->methods[7]);\n return meth(this, pos);\n }\n#else\n const char *getUTF8Data() { return ascii.data; }\n uint32_t getUTF8Size() { return ascii.length; }\n uint32_t getLength() { return ascii.length; }\n const char *getUTF8DataAt(uint32_t pos) { return pos < ascii.length ? ascii.data + pos : NULL; }\n#endif\n\n TNumber charCodeAt(int pos);\n\n BoxedString(const VTable *vt) : RefObject(vt) {}\n};\n\n// cross version compatible way of accessing string data\n#ifndef PXT_STRING_DATA\n#define PXT_STRING_DATA(str) str->getUTF8Data()\n#endif\n\n// cross version compatible way of accessing string length\n#ifndef PXT_STRING_DATA_LENGTH\n#define PXT_STRING_DATA_LENGTH(str) str->getUTF8Size()\n#endif\n\nclass BoxedBuffer : public RefObject {\n public:\n // data needs to be word-aligned, so we use 32 bits for length\n int length;\n uint8_t data[0];\n BoxedBuffer() : RefObject(&buffer_vt) {}\n\n static bool isInstance(TValue v);\n};\n\n// cross version compatible way of access data field\n#ifndef PXT_BUFFER_DATA\n#define PXT_BUFFER_DATA(buffer) buffer->data\n#endif\n\n// cross version compatible way of access data length\n#ifndef PXT_BUFFER_LENGTH\n#define PXT_BUFFER_LENGTH(buffer) buffer->length\n#endif\n\n#ifndef PXT_CREATE_BUFFER\n#define PXT_CREATE_BUFFER(data, len) pxt::mkBuffer(data, len)\n#endif\n\n// Legacy format:\n// the first byte of data indicates the format - currently 0xE1 or 0xE4 to 1 or 4 bit bitmaps\n// second byte indicates width in pixels\n// third byte indicates the height (which should also match the size of the buffer)\n// just like ordinary buffers, these can be layed out in flash\n\n// Current format:\n// 87 BB WW WW HH HH 00 00 DATA\n// that is: 0x87, 0x01 or 0x04 - bpp, width in little endian, height, 0x00, 0x00 followed by data\n// for 4 bpp images, rows are word-aligned (as in legacy)\n\n#define IMAGE_HEADER_MAGIC 0x87\n\nstruct ImageHeader {\n uint8_t magic;\n uint8_t bpp;\n uint16_t width;\n uint16_t height;\n uint16_t padding;\n uint8_t pixels[0];\n};\n\nclass RefImage : public RefObject {\n public:\n BoxedBuffer *buffer;\n uint32_t revision;\n\n RefImage(BoxedBuffer *buf);\n RefImage(uint32_t sz);\n\n void setBuffer(BoxedBuffer *b);\n\n uint8_t *data() { return buffer->data; }\n int length() { return (int)buffer->length; }\n\n ImageHeader *header() { return (ImageHeader *)buffer->data; }\n int pixLength() { return length() - sizeof(ImageHeader); }\n\n int width() { return header()->width; }\n int height() { return header()->height; }\n int wordHeight();\n int bpp() { return header()->bpp; }\n\n bool hasPadding() { return (height() & 0x7) != 0; }\n\n uint8_t *pix() { return header()->pixels; }\n\n int byteHeight() {\n if (bpp() == 1)\n return (height() + 7) >> 3;\n else if (bpp() == 4)\n return ((height() * 4 + 31) >> 5) << 2;\n else {\n oops(21);\n return -1;\n }\n }\n\n uint8_t *pix(int x, int y) {\n uint8_t *d = &pix()[byteHeight() * x];\n if (y) {\n if (bpp() == 1)\n d += y >> 3;\n else if (bpp() == 4)\n d += y >> 1;\n }\n return d;\n }\n\n uint8_t fillMask(color c);\n bool inRange(int x, int y);\n void clamp(int *x, int *y);\n void makeWritable();\n\n static void destroy(RefImage *t);\n static void scan(RefImage *t);\n static unsigned gcsize(RefImage *t);\n static void print(RefImage *t);\n};\n\nRefImage *mkImage(int w, int h, int bpp);\n\ntypedef BoxedBuffer *Buffer;\ntypedef BoxedString *String;\ntypedef RefImage *Image_;\n\nuint32_t toRealUTF8(String str, uint8_t *dst);\n\n// keep in sync with github/pxt/pxtsim/libgeneric.ts\nenum class NumberFormat {\n Int8LE = 1,\n UInt8LE,\n Int16LE,\n UInt16LE,\n Int32LE,\n Int8BE,\n UInt8BE,\n Int16BE,\n UInt16BE,\n Int32BE,\n\n UInt32LE,\n UInt32BE,\n Float32LE,\n Float64LE,\n Float32BE,\n Float64BE,\n};\n\n// this will, unlike mkStringCore, UTF8-canonicalize the data\nString mkString(const char *data, int len = -1);\n// data can be NULL in both cases\nBuffer mkBuffer(const void *data, int len);\nString mkStringCore(const char *data, int len = -1);\n\nTNumber getNumberCore(uint8_t *buf, int size, NumberFormat format);\nvoid setNumberCore(uint8_t *buf, int size, NumberFormat format, TNumber value);\n\nvoid seedRandom(unsigned seed);\nvoid seedAddRandom(unsigned seed);\n// max is inclusive\nunsigned getRandom(unsigned max);\n\nValType valType(TValue v);\n\n// this is equivalent to JS `throw v`; it will leave\n// the current function(s), all the way until the nearest try block and\n// ignore all destructors (think longjmp())\nvoid throwValue(TValue v);\n\nvoid registerGC(TValue *root, int numwords = 1);\nvoid unregisterGC(TValue *root, int numwords = 1);\nvoid registerGCPtr(TValue ptr);\nvoid unregisterGCPtr(TValue ptr);\nstatic inline void registerGCObj(RefObject *ptr) {\n registerGCPtr((TValue)ptr);\n}\nstatic inline void unregisterGCObj(RefObject *ptr) {\n unregisterGCPtr((TValue)ptr);\n}\nvoid gc(int flags);\n\nstruct StackSegment {\n void *top;\n void *bottom;\n StackSegment *next;\n};\n\n#define NUM_TRY_FRAME_REGS 3\nstruct TryFrame {\n TryFrame *parent;\n uintptr_t registers[NUM_TRY_FRAME_REGS];\n};\n\nstruct ThreadContext {\n TValue *globals;\n StackSegment stack;\n TryFrame *tryFrame;\n TValue thrownValue;\n#ifdef PXT_GC_THREAD_LIST\n ThreadContext *next;\n ThreadContext *prev;\n#endif\n};\n\n#ifdef PXT_GC_THREAD_LIST\nextern ThreadContext *threadContexts;\nvoid *threadAddressFor(ThreadContext *, void *sp);\n#endif\n\nvoid releaseThreadContext(ThreadContext *ctx);\nThreadContext *getThreadContext();\nvoid setThreadContext(ThreadContext *ctx);\n\n#ifndef PXT_GC_THREAD_LIST\nvoid gcProcessStacks(int flags);\n#endif\n\nvoid gcProcess(TValue v);\nvoid gcFreeze();\n\n#ifdef PXT_VM\nvoid gcStartup();\nvoid gcPreStartup();\n#endif\n\nvoid coreReset();\nvoid gcReset();\nvoid systemReset();\n\nvoid doNothing();\n\nvoid *gcAllocate(int numbytes);\nvoid *gcAllocateArray(int numbytes);\nextern \"C\" void *app_alloc(int numbytes);\nextern \"C\" void *app_free(void *ptr);\nextern \"C\" void *app_alloc_at(void *at, int numbytes);\nvoid gcPreAllocateBlock(uint32_t sz);\n\nint redirectSamples(int16_t *dst, int numsamples, int samplerate);\n\n#ifdef PXT64\n#define TOWORDS(bytes) (((bytes) + 7) >> 3)\n#else\n#define TOWORDS(bytes) (((bytes) + 3) >> 2)\n#endif\n\n#ifndef PXT_VM\n#define soft_panic target_panic\n#endif\n\nextern int debugFlags;\n\nenum class PerfCounters {\n GC,\n};\n\n#ifdef PXT_PROFILE\n#ifndef PERF_NOW\n#error \"missing platform timer support\"\n#endif\n\nstruct PerfCounter {\n uint32_t value;\n uint32_t numstops;\n uint32_t start;\n};\n\nextern struct PerfCounter *perfCounters;\n\nvoid initPerfCounters();\n//%\nvoid dumpPerfCounters();\n//%\nvoid startPerfCounter(PerfCounters n);\n//%\nvoid stopPerfCounter(PerfCounters n);\n#else\ninline void startPerfCounter(PerfCounters n) {}\ninline void stopPerfCounter(PerfCounters n) {}\ninline void initPerfCounters() {}\ninline void dumpPerfCounters() {}\n#endif\n\n// Handling of built-in string literals (like \"[Object]\", \"true\" etc.).\n\n// This has the same layout as BoxedString, but has statically allocated buffer\ntemplate <size_t N> struct BoxedStringLayout {\n const void *vtable;\n uint16_t size;\n const char data[N];\n};\n\ntemplate <size_t N> constexpr size_t _boxedStringLen(char const (&)[N]) {\n return N;\n}\n\n// strings defined here as used as (String)name\n#define PXT_DEF_STRING(name, val) \\\n const BoxedStringLayout<_boxedStringLen(val)> name[1] = { \\\n {&pxt::string_inline_ascii_vt, _boxedStringLen(val) - 1, val}};\n\n// bigger value - less memory, but slower\n// 16/20 keeps s.length and s.charCodeAt(i) at about 200 cycles (for actual unicode strings),\n// which is similar to amortized allocation time\n#define PXT_STRING_SKIP_INCR 16 // needs to be power of 2; needs to be kept in sync with compiler\n#define PXT_STRING_MIN_SKIP \\\n 20 // min. size of string to use skip list; static code has its own limit\n\n#define PXT_NUM_SKIP_ENTRIES(p) ((p)->skip.length / PXT_STRING_SKIP_INCR)\n#define PXT_SKIP_DATA_IND(p) ((const char *)(p->skip.list + PXT_NUM_SKIP_ENTRIES(p)))\n#define PXT_SKIP_DATA_PACK(p) ((const char *)(p->skip_pack.list + PXT_NUM_SKIP_ENTRIES(p)))\n\n} // namespace pxt\n\nusing namespace pxt;\n\nnamespace numops {\n//%\nString toString(TValue v);\n//%\nint toBool(TValue v);\n//%\nint toBoolDecr(TValue v);\n} // namespace numops\n\nnamespace pxt {\ninline bool toBoolQuick(TValue v) {\n if (v == TAG_TRUE)\n return true;\n if (v == TAG_FALSE || v == TAG_UNDEFINED || v == TAG_NULL)\n return false;\n return numops::toBool(v);\n}\n} // namespace pxt\n\nnamespace pxtrt {\n//%\nRefMap *mkMap();\n//%\nTValue mapGetByString(RefMap *map, String key);\n//%\nint lookupMapKey(String key);\n//%\nTValue mapGet(RefMap *map, unsigned key);\n//% expose\nvoid mapSetByString(RefMap *map, String key, TValue val);\n//%\nvoid mapSet(RefMap *map, unsigned key, TValue val);\n} // namespace pxtrt\n\nnamespace pins {\nBuffer createBuffer(int size);\n}\n\nnamespace String_ {\n//%\nint compare(String a, String b);\n} // namespace String_\n\nnamespace Array_ {\n//%\nRefCollection *mk();\n//%\nint length(RefCollection *c);\n//%\nvoid setLength(RefCollection *c, int newLength);\n//%\nvoid push(RefCollection *c, TValue x);\n//%\nTValue pop(RefCollection *c);\n//%\nTValue getAt(RefCollection *c, int x);\n//%\nvoid setAt(RefCollection *c, int x, TValue y);\n//%\nTValue removeAt(RefCollection *c, int x);\n//%\nvoid insertAt(RefCollection *c, int x, TValue value);\n//%\nint indexOf(RefCollection *c, TValue x, int start);\n//%\nbool removeElement(RefCollection *c, TValue x);\n} // namespace Array_\n\n#define NEW_GC(T, ...) new (gcAllocate(sizeof(T))) T(__VA_ARGS__)\n\n// The ARM Thumb generator in the JavaScript code is parsing\n// the hex file and looks for the magic numbers as present here.\n//\n// Then it fetches function pointer addresses from there.\n//\n// The vtable pointers are there, so that the ::emptyData for various types\n// can be patched with the right vtable.\n//\n#define PXT_SHIMS_BEGIN \\\n namespace pxt { \\\n const uintptr_t functionsAndBytecode[] \\\n __attribute__((aligned(0x20))) = {0x08010801, 0x42424242, 0x08010801, 0x8de9d83e,\n\n#define PXT_SHIMS_END \\\n } \\\n ; \\\n }\n\n#if !defined(X86_64) && !defined(PXT_VM)\n#pragma GCC diagnostic ignored \"-Wpmf-conversions\"\n#endif\n\n#ifdef PXT_VM\n#define DEF_VTABLE(name, tp, valtype, ...) \\\n const VTable name = {sizeof(tp), valtype, VTABLE_MAGIC, 0, BuiltInType::tp, BuiltInType::tp, \\\n 0, 0, {__VA_ARGS__}};\n#define DEF_VTABLE_EXT(name, tp, valtype, ...) \\\n const VTable name = {sizeof(tp), valtype, VTABLE_MAGIC2, 0, BuiltInType::tp, BuiltInType::tp, \\\n 0, 0, {__VA_ARGS__}};\n#else\n#define DEF_VTABLE(name, tp, valtype, ...) \\\n const VTable name = {sizeof(tp), valtype, VTABLE_MAGIC, 0, BuiltInType::tp, \\\n 0, 0, {__VA_ARGS__}};\n#define DEF_VTABLE_EXT(name, tp, valtype, ...) \\\n const VTable name = {sizeof(tp), valtype, VTABLE_MAGIC2, 0, BuiltInType::tp, \\\n 0, 0, {__VA_ARGS__}};\n#endif\n\n#define PXT_VTABLE(classname, valtp) \\\n DEF_VTABLE(classname##_vtable, classname, valtp, (void *)&classname::destroy, \\\n (void *)&classname::print, (void *)&classname::scan, (void *)&classname::gcsize)\n\n#define PXT_EXT_VTABLE(classname) \\\n static int classname##_gcsize() { return sizeof(classname); } \\\n DEF_VTABLE_EXT(classname##_vtable, classname, ValType::Object, (void *)&pxt::doNothing, \\\n (void *)&pxt::anyPrint, (void *)&pxt::doNothing, (void *)&classname##_gcsize)\n\n#define PXT_VTABLE_INIT(classname) RefObject(&classname##_vtable)\n\n#define PXT_VTABLE_CTOR(classname) \\\n PXT_VTABLE(classname, ValType::Object) \\\n classname::classname() : PXT_VTABLE_INIT(classname)\n\n#define PXT_MAIN \\\n int main() { \\\n pxt::start(); \\\n return 0; \\\n }\n\n#define PXT_FNPTR(x) (uintptr_t)(void *)(x)\n\n#define PXT_ABI(...)\n\n#define JOIN(a, b) a##b\n/// Defines getClassName() function to fetch the singleton\n#define SINGLETON(ClassName) \\\n static ClassName *JOIN(inst, ClassName); \\\n ClassName *JOIN(get, ClassName)() { \\\n if (!JOIN(inst, ClassName)) \\\n JOIN(inst, ClassName) = new ClassName(); \\\n return JOIN(inst, ClassName); \\\n }\n\n/// Defines getClassName() function to fetch the singleton if PIN present\n#define SINGLETON_IF_PIN(ClassName, pin) \\\n static ClassName *JOIN(inst, ClassName); \\\n ClassName *JOIN(get, ClassName)() { \\\n if (!JOIN(inst, ClassName) && LOOKUP_PIN(pin)) \\\n JOIN(inst, ClassName) = new ClassName(); \\\n return JOIN(inst, ClassName); \\\n }\n\n#ifdef PXT_VM\n#include \"vm.h\"\n#endif\n\n#endif\n",
|
|
2772
2772
|
"pxtcore.h": "#ifndef __PXTCORE_H\n#define __PXTCORE_H\n\n#include \"MicroBit.h\"\n#include \"MicroBitImage.h\"\n#include \"ManagedString.h\"\n#include \"ManagedType.h\"\n\nnamespace pxt {\nvoid debuglog(const char *format, ...);\n}\n\n// #define GC_GET_HEAP_SIZE() device_heap_size(0)\n#define xmalloc malloc\n#define xfree free\n\n#define GC_MAX_ALLOC_SIZE 9000\n\n#define NON_GC_HEAP_RESERVATION 1024\n\n#ifdef CODAL_CONFIG_H\n#define MICROBIT_CODAL 1\n#else\n#define MICROBIT_CODAL 0\n#define GC_BLOCK_SIZE 256\n#endif\n\n#if !MICROBIT_CODAL\n#undef DMESG\n#define DMESG NOLOG\n#endif\n\n#undef BYTES_TO_WORDS\n\n#endif\n",
|
|
2773
2773
|
"pxtparts.json": "{\n \"buttonpair\": {\n \"simulationBehavior\": \"buttonpair\",\n \"visual\": {\n \"builtIn\": \"buttonpair\",\n \"width\": 75,\n \"height\": 45,\n \"pinDistance\": 15,\n \"pinLocations\": [\n {\n \"x\": 0,\n \"y\": 0\n },\n {\n \"x\": 30,\n \"y\": 45\n },\n {\n \"x\": 45,\n \"y\": 0\n },\n {\n \"x\": 75,\n \"y\": 45\n }\n ]\n },\n \"numberOfPins\": 4,\n \"pinDefinitions\": [\n {\n \"target\": \"P14\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n },\n {\n \"target\": \"P15\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n }\n ],\n \"instantiation\": {\n \"kind\": \"singleton\"\n },\n \"assembly\": [\n {\n \"part\": true\n },\n {\n \"pinIndices\": [\n 0,\n 1\n ]\n },\n {\n \"pinIndices\": [\n 2,\n 3\n ]\n }\n ]\n },\n \"microservo\": {\n \"simulationBehavior\": \"microservo\",\n \"visual\": {\n \"builtIn\": \"microservo\",\n \"width\": 74.85,\n \"height\": 200,\n \"pinDistance\": 10,\n \"pinLocations\": [\n {\n \"x\": 30,\n \"y\": 5\n },\n {\n \"x\": 37,\n \"y\": 5\n },\n {\n \"x\": 45,\n \"y\": 5\n }\n ]\n },\n \"numberOfPins\": 3,\n \"pinDefinitions\": [\n {\n \"target\": {\n \"pinInstantiationIdx\": 0\n },\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n },\n {\n \"target\": \"threeVolt\",\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n }\n ],\n \"instantiations\": [\n {\n \"kind\": \"function\",\n \"fullyQualifiedName\": \"pins.servoWritePin,pins.servoSetPulse,PwmOnlyPin.servoWrite,PwmOnlyPin.servoSetPulse,servos.Servo.setAngle,servos.Servo.run,servos.Servo.setPulse\",\n \"argumentRoles\": [\n {\n \"pinInstantiationIdx\": 0,\n \"partParameter\": \"name\"\n }\n ]\n }\n ],\n \"assembly\": [\n {\n \"part\": true,\n \"pinIndices\": [\n 2\n ]\n },\n {\n \"pinIndices\": [\n 0,\n 1\n ]\n }\n ]\n },\n \"neopixel\": {\n \"simulationBehavior\": \"neopixel\",\n \"visual\": {\n \"builtIn\": \"neopixel\",\n \"width\": 58,\n \"height\": 113,\n \"pinDistance\": 9,\n \"pinLocations\": [\n {\n \"x\": 10,\n \"y\": 0\n },\n {\n \"x\": 19,\n \"y\": 0\n },\n {\n \"x\": 28,\n \"y\": 0\n }\n ]\n },\n \"numberOfPins\": 3,\n \"pinDefinitions\": [\n {\n \"target\": {\n \"pinInstantiationIdx\": 0\n },\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n },\n {\n \"target\": \"threeVolt\",\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"croc\",\n \"orientation\": \"+Z\"\n }\n ],\n \"instantiation\": {\n \"kind\": \"function\",\n \"fullyQualifiedName\": \"neopixel.create\",\n \"argumentRoles\": [\n {\n \"pinInstantiationIdx\": 0,\n \"partParameter\": \"pin\"\n },\n {\n \"partParameter\": \"mode\"\n }\n ]\n },\n \"assembly\": [\n {\n \"part\": true,\n \"pinIndices\": [\n 2\n ]\n },\n {\n \"pinIndices\": [\n 0,\n 1\n ]\n }\n ]\n },\n \"ledmatrix\": {\n \"visual\": {\n \"builtIn\": \"ledmatrix\",\n \"width\": 105,\n \"height\": 105,\n \"pinDistance\": 15,\n \"pinLocations\": [\n {\n \"x\": 0,\n \"y\": 0\n },\n {\n \"x\": 15,\n \"y\": 0\n },\n {\n \"x\": 30,\n \"y\": 0\n },\n {\n \"x\": 45,\n \"y\": 0\n },\n {\n \"x\": 105,\n \"y\": 105\n },\n {\n \"x\": 0,\n \"y\": 105\n },\n {\n \"x\": 15,\n \"y\": 105\n },\n {\n \"x\": 30,\n \"y\": 105\n },\n {\n \"x\": 45,\n \"y\": 105\n },\n {\n \"x\": 60,\n \"y\": 0\n }\n ]\n },\n \"simulationBehavior\": \"ledmatrix\",\n \"numberOfPins\": 10,\n \"instantiation\": {\n \"kind\": \"singleton\"\n },\n \"pinDefinitions\": [\n {\n \"target\": \"P6\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 0\n },\n {\n \"target\": \"P7\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 0\n },\n {\n \"target\": \"P8\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 0\n },\n {\n \"target\": \"P9\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 0\n },\n {\n \"target\": \"P10\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 0\n },\n {\n \"target\": \"P12\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 1\n },\n {\n \"target\": \"P13\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 1\n },\n {\n \"target\": \"P16\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 1\n },\n {\n \"target\": \"P19\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 1\n },\n {\n \"target\": \"P20\",\n \"style\": \"male\",\n \"orientation\": \"-Z\",\n \"colorGroup\": 1\n }\n ],\n \"assembly\": [\n {\n \"part\": true\n },\n {\n \"pinIndices\": [\n 0,\n 1,\n 2,\n 3,\n 4\n ]\n },\n {\n \"pinIndices\": [\n 5,\n 6,\n 7,\n 8,\n 9\n ]\n }\n ]\n },\n \"headphone\": {\n \"numberOfPins\": 2,\n \"visual\": {\n \"image\": \"parts/headphone.svg\",\n \"width\": 142,\n \"height\": 180,\n \"pinDistance\": 20,\n \"pinLocations\": [\n {\n \"x\": 17,\n \"y\": 11\n },\n {\n \"x\": 55,\n \"y\": 50\n }\n ]\n },\n \"pinDefinitions\": [\n {\n \"target\": \"P0\",\n \"style\": \"croc\",\n \"orientation\": \"Y\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"croc\",\n \"orientation\": \"Y\"\n }\n ],\n \"instantiation\": {\n \"kind\": \"singleton\"\n },\n \"assembly\": [\n {\n \"part\": true,\n \"pinIndices\": [\n 0\n ]\n },\n {\n \"pinIndices\": [\n 1\n ]\n }\n ]\n },\n \"speaker\": {\n \"numberOfPins\": 2,\n \"visual\": {\n \"image\": \"parts/speaker.svg\",\n \"width\": 500,\n \"height\": 500,\n \"pinDistance\": 70,\n \"pinLocations\": [\n {\n \"x\": 180,\n \"y\": 135\n },\n {\n \"x\": 320,\n \"y\": 135\n }\n ]\n },\n \"pinDefinitions\": [\n {\n \"target\": \"P0\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n },\n {\n \"target\": \"ground\",\n \"style\": \"male\",\n \"orientation\": \"-Z\"\n }\n ],\n \"instantiation\": {\n \"kind\": \"singleton\"\n },\n \"assembly\": [\n {\n \"part\": true,\n \"pinIndices\": [\n 0\n ]\n },\n {\n \"pinIndices\": [\n 1\n ]\n }\n ]\n }\n}",
|
|
@@ -2776,9 +2776,9 @@ var pxtTargetBundle = {
|
|
|
2776
2776
|
"sendbuffernrf52.s": ".syntax unified\n\n#ifndef NRF51\n\n// put it in RAM\n.section .data.neopixel_send_buffer_nrf52\n.global neopixel_send_buffer_nrf52\n.thumb\n.type neopixel_send_buffer_nrf52, %function\n\n\n\n\nneopixel_send_buffer_nrf52:\n push {r4,r5,r6,r7,lr}\n \n lsrs r7, r1, #20 // r7 - brightness\n ands r1, #0xff\n movs r4, #1\n lsls r1, r4, r1 // r1 - mask\n\n mov r4, r2 // ptr\n mov r5, r3 // len\n mov r3, r0 // port+0x500\n \n b .start\n.nextbit:\n str r1, [r3, #0x8] // pin := hi\n\n movs r2, #8\n tst r6, r0\n it eq\n movseq r2, #3\n\n.d1:\n subs r2, #1\n bne .d1\n\n str r1, [r3, #0xC] // pin := lo\n\n movs r2, #4\n tst r6, r0\n it eq\n movseq r2, #6\n\n lsrs r6, r6, #1 // r6 >>= 1 \n beq .reload\n\n nop\n nop\n nop\n\n.d0:\n subs r2, #1\n bne .d0\n\n b .nextbit\n\n.reload: \n subs r2, #2 // offset following operations\n.d2:\n subs r2, #1\n bne .d2\n\n // not just a bit - need new byte\n adds r4, #1 // r4++ \n subs r5, #1 // r5-- \n ble .stop // if (r5<=0) goto .stop \n.start:\n movs r6, #0x80 // reset mask\n ldrb r0, [r4, #0] // r0 := *r4 \n muls r0, r7 \n lsrs r0, r0, #8 // r0 >>= 8\n str r1, [r3, #0xC] // pin := lo \n b .nextbit //\n\n.stop: \n str r1, [r3, #0xC] // pin := lo\n\n pop {r4,r5,r6,r7,pc}\n\n#endif\n",
|
|
2777
2777
|
"serial.cpp": "#include \"pxt.h\"\n\n#define MICROBIT_SERIAL_READ_BUFFER_LENGTH 64\n\n// make sure USB_TX and USB_RX don't overlap with other pin ids\n// also, 1001,1002 need to be kept in sync with getPin() function\nenum SerialPin {\n P0 = MICROBIT_ID_IO_P0,\n P1 = MICROBIT_ID_IO_P1,\n P2 = MICROBIT_ID_IO_P2,\n P8 = MICROBIT_ID_IO_P8,\n P12 = MICROBIT_ID_IO_P12,\n P13 = MICROBIT_ID_IO_P13,\n P14 = MICROBIT_ID_IO_P14,\n P15 = MICROBIT_ID_IO_P15,\n P16 = MICROBIT_ID_IO_P16,\n USB_TX = 1001,\n USB_RX = 1002\n};\n\nenum BaudRate {\n //% block=115200\n BaudRate115200 = 115200,\n //% block=57600\n BaudRate57600 = 57600,\n //% block=38400\n BaudRate38400 = 38400,\n //% block=31250\n BaudRate31250 = 31250,\n //% block=28800\n BaudRate28800 = 28800,\n //% block=19200\n BaudRate19200 = 19200,\n //% block=14400\n BaudRate14400 = 14400,\n //% block=9600\n BaudRate9600 = 9600,\n //% block=4800\n BaudRate4800 = 4800,\n //% block=2400\n BaudRate2400 = 2400,\n //% block=1200\n BaudRate1200 = 1200\n};\n\n//% weight=2 color=#002050 icon=\"\\uf287\"\n//% advanced=true\nnamespace serial {\n // note that at least one // followed by % is needed per declaration!\n\n /**\n * Read a line of text from the serial port and return the buffer when the delimiter is met.\n * @param delimiter text delimiter that separates each text chunk\n */\n //% help=serial/read-until\n //% blockId=serial_read_until block=\"serial|read until %delimiter=serial_delimiter_conv\"\n //% weight=19\n String readUntil(String delimiter) {\n return PSTR(uBit.serial.readUntil(MSTR(delimiter)));\n }\n\n /**\n * Read the buffered received data as a string\n */\n //% help=serial/read-string\n //% blockId=serial_read_buffer block=\"serial|read string\"\n //% weight=18\n String readString() {\n int n = uBit.serial.getRxBufferSize();\n if (n == 0) return mkString(\"\", 0);\n return PSTR(uBit.serial.read(n, MicroBitSerialMode::ASYNC));\n }\n\n /**\n * Register an event to be fired when one of the delimiter is matched.\n * @param delimiters the characters to match received characters against.\n */\n //% help=serial/on-data-received\n //% weight=18 blockId=serial_on_data_received block=\"serial|on data received %delimiters=serial_delimiter_conv\"\n void onDataReceived(String delimiters, Action body) {\n uBit.serial.eventOn(MSTR(delimiters));\n registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body);\n // lazy initialization of serial buffers\n uBit.serial.read(MicroBitSerialMode::ASYNC);\n }\n\n /**\n * Send a piece of text through the serial connection.\n */\n //% help=serial/write-string\n //% weight=87 blockGap=8\n //% blockId=serial_writestring block=\"serial|write string %text\"\n //% text.shadowOptions.toString=true\n void writeString(String text) {\n if (!text) return;\n\n uBit.serial.send(MSTR(text));\n }\n\n /**\n * Send a buffer through serial connection\n */\n //% blockId=serial_writebuffer block=\"serial|write buffer %buffer=serial_readbuffer\"\n //% help=serial/write-buffer advanced=true weight=6\n void writeBuffer(Buffer buffer) {\n if (!buffer) return;\n\n uBit.serial.send(buffer->data, buffer->length);\n }\n\n /**\n * Read multiple characters from the receive buffer. \n * If length is positive, pauses until enough characters are present.\n * @param length default buffer length\n */\n //% blockId=serial_readbuffer block=\"serial|read buffer %length\"\n //% help=serial/read-buffer advanced=true weight=5\n Buffer readBuffer(int length) {\n auto mode = SYNC_SLEEP;\n if (length <= 0) {\n length = uBit.serial.getRxBufferSize();\n mode = ASYNC;\n }\n\n auto buf = mkBuffer(NULL, length);\n auto res = buf;\n registerGCObj(buf); // make sure buffer is pinned, while we wait for data\n int read = uBit.serial.read(buf->data, buf->length, mode);\n if (read != length) {\n res = mkBuffer(buf->data, read);\n }\n unregisterGCObj(buf);\n\n return res;\n }\n\n bool tryResolvePin(SerialPin p, PinName& name) {\n switch(p) {\n#if !MICROBIT_CODAL\n case SerialPin::USB_TX: name = USBTX; return true;\n case SerialPin::USB_RX: name = USBRX; return true;\n#endif\n default: \n auto pin = getPin(p); \n if (NULL != pin) {\n name = (PinName)pin->name;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Set the serial input and output to use pins instead of the USB connection.\n * @param tx the new transmission pin, eg: SerialPin.P0\n * @param rx the new reception pin, eg: SerialPin.P1\n * @param rate the new baud rate. eg: 115200\n */\n //% weight=10\n //% help=serial/redirect\n //% blockId=serial_redirect block=\"serial|redirect to|TX %tx|RX %rx|at baud rate %rate\"\n //% blockExternalInputs=1\n //% tx.fieldEditor=\"gridpicker\" tx.fieldOptions.columns=3\n //% tx.fieldOptions.tooltips=\"false\"\n //% rx.fieldEditor=\"gridpicker\" rx.fieldOptions.columns=3\n //% rx.fieldOptions.tooltips=\"false\"\n //% blockGap=8\n void redirect(SerialPin tx, SerialPin rx, BaudRate rate) {\n#if MICROBIT_CODAL\n if (getPin(tx) && getPin(rx))\n uBit.serial.redirect(*getPin(tx), *getPin(rx));\n uBit.serial.setBaud(rate);\n#else\n PinName txn;\n PinName rxn;\n if (tryResolvePin(tx, txn) && tryResolvePin(rx, rxn))\n uBit.serial.redirect(txn, rxn);\n uBit.serial.baud((int)rate);\n#endif\n }\n\n /**\n Set the baud rate of the serial port\n */\n //% weight=10\n //% blockId=serial_setbaudrate block=\"serial|set baud rate %rate\"\n //% blockGap=8 inlineInputMode=inline\n //% help=serial/set-baud-rate\n //% group=\"Configuration\" advanced=true\n void setBaudRate(BaudRate rate) {\n#if MICROBIT_CODAL\n uBit.serial.setBaud(rate);\n#else\n uBit.serial.baud((int)rate);\n#endif\n }\n\n\n /**\n * Direct the serial input and output to use the USB connection.\n */\n //% weight=9 help=serial/redirect-to-usb\n //% blockId=serial_redirect_to_usb block=\"serial|redirect to USB\"\n void redirectToUSB() {\n#if MICROBIT_CODAL\n uBit.serial.redirect(uBit.io.usbTx, uBit.io.usbRx);\n uBit.serial.setBaud(115200);\n#else\n uBit.serial.redirect(USBTX, USBRX);\n uBit.serial.baud(115200);\n#endif\n }\n\n /**\n * Sets the size of the RX buffer in bytes\n * @param size length of the rx buffer in bytes, eg: 32\n */\n //% help=serial/set-rx-buffer-size\n //% blockId=serialSetRxBufferSize block=\"serial set rx buffer size to $size\"\n //% advanced=true\n void setRxBufferSize(uint8_t size) {\n uBit.serial.setRxBufferSize(size);\n }\n\n /**\n * Sets the size of the TX buffer in bytes\n * @param size length of the tx buffer in bytes, eg: 32\n */\n //% help=serial/set-tx-buffer-size\n //% blockId=serialSetTxBufferSize block=\"serial set tx buffer size to $size\"\n //% advanced=true\n void setTxBufferSize(uint8_t size) {\n uBit.serial.setTxBufferSize(size);\n }\n}\n",
|
|
2778
2778
|
"serial.ts": "const enum Delimiters {\n //% block=\"new line (\\n)\"\n NewLine = 10,\n //% block=\",\"\n Comma = 44,\n //% block=\"$\"\n Dollar = 36,\n //% block=\":\"\n Colon = 58,\n //% block=\".\"\n Fullstop = 46,\n //% block=\"#\"\n Hash = 35,\n //% block=\"carriage return (\\r)\"\n CarriageReturn = 13,\n //% block=\"space\"\n Space = 32,\n //% block=\"tab (\\t)\"\n Tab = 9,\n //% block=\"|\"\n Pipe = 124,\n //% block=\";\"\n SemiColon = 59,\n}\n\n/**\n * Reading and writing data over a serial connection.\n */\n//% weight=2 color=#002050 icon=\"\\uf287\"\n//% advanced=true\nnamespace serial {\n /**\n * The string used to mark a new line, default is \\r\\n\n */\n export let NEW_LINE = \"\\r\\n\";\n export let NEW_LINE_DELIMITER: Delimiters = Delimiters.NewLine;\n let writeLinePadding = 32;\n\n /**\n * Print a line of text to the serial port\n * @param value to send over serial\n */\n //% weight=90\n //% help=serial/write-line blockGap=8\n //% blockId=serial_writeline block=\"serial|write line %text\"\n //% text.shadowOptions.toString=true\n export function writeLine(text: string): void {\n if (!text) text = \"\";\n serial.writeString(text);\n // pad data to the 32 byte boundary\n // to ensure apps receive the packet\n if (writeLinePadding > 0) {\n let r = (writeLinePadding - (text.length + NEW_LINE.length) % writeLinePadding) % writeLinePadding;\n for (let i = 0; i < r; ++i)\n serial.writeString(\" \");\n }\n serial.writeString(NEW_LINE);\n }\n\n /**\n * Sets the padding length for lines sent with \"write line\".\n * @param length the number of bytes alignment, eg: 0\n *\n */\n //% weight=1\n //% help=serial/set-write-line-padding\n //% blockId=serialWriteNewLinePadding block=\"serial set write line padding to $length\"\n //% advanced=true\n //% length.min=0 length.max=128\n export function setWriteLinePadding(length: number) {\n writeLinePadding = length | 0;\n }\n\n /**\n * Print a numeric value to the serial port\n */\n //% help=serial/write-number\n //% weight=89 blockGap=8\n //% blockId=serial_writenumber block=\"serial|write number %value\"\n export function writeNumber(value: number): void {\n writeString(value.toString());\n }\n\n /**\n * Print an array of numeric values as CSV to the serial port\n */\n //% help=serial/write-numbers\n //% weight=86\n //% blockId=serial_writenumbers block=\"serial|write numbers %values\"\n export function writeNumbers(values: number[]): void {\n if (!values) return;\n for (let i = 0; i < values.length; ++i) {\n if (i > 0) writeString(\",\");\n writeNumber(values[i]);\n }\n writeLine(\"\")\n }\n\n /**\n * Write a name:value pair as a line to the serial port.\n * @param name name of the value stream, eg: x\n * @param value to write\n */\n //% weight=88 blockGap=8\n //% help=serial/write-value\n //% blockId=serial_writevalue block=\"serial|write value %name|= %value\"\n export function writeValue(name: string, value: number): void {\n writeLine((name ? name + \":\" : \"\") + value);\n }\n\n /**\n * Read a line of text from the serial port.\n */\n //% help=serial/read-line\n //% blockId=serial_read_line block=\"serial|read line\"\n //% weight=20 blockGap=8\n export function readLine(): string {\n return serial.readUntil(delimiters(NEW_LINE_DELIMITER));\n }\n\n /**\n * Return the corresponding delimiter string\n */\n //% blockId=\"serial_delimiter_conv\" block=\"%del\"\n //% weight=1 blockHidden=true\n export function delimiters(del: Delimiters): string {\n return String.fromCharCode(del as number);\n }\n}\n",
|
|
2779
|
-
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n /**\n * Creation, manipulation and display of LED images.\n */\n //% color=#7600A8 weight=31 icon=\"\\uf03e\"\n //% advanced=true\ndeclare namespace images {\n\n /**\n * Creates an image that fits on the LED screen.\n */\n //% weight=75 help=images/create-image\n //% blockId=device_build_image block=\"create image\"\n //% parts=\"ledmatrix\" imageLiteral=1 shim=images::createImage\n function createImage(leds: string): Image;\n\n /**\n * Creates an image with 2 frames.\n */\n //% weight=74 help=images/create-big-image\n //% blockId=device_build_big_image block=\"create big image\" imageLiteral=2\n //% parts=\"ledmatrix\" shim=images::createBigImage\n function createBigImage(leds: string): Image;\n}\n\n\ndeclare interface Image {\n /**\n * Plots the image at a given column to the screen\n */\n //% help=images/plot-image\n //% parts=\"ledmatrix\" xOffset.defl=0 shim=ImageMethods::plotImage\n plotImage(xOffset?: int32): void;\n\n /**\n * Shows an frame from the image at offset ``x offset``.\n * @param xOffset column index to start displaying the image\n * @param interval time in milliseconds to pause after drawing\n */\n //% help=images/show-image weight=80 blockNamespace=images\n //% blockId=device_show_image_offset block=\"show image %sprite(myImage)|at offset %offset ||and interval (ms) %interval\"\n //%\n //% blockGap=8 parts=\"ledmatrix\" async interval.defl=400 shim=ImageMethods::showImage\n showImage(xOffset: int32, interval?: int32): void;\n\n /**\n * Draws the ``index``-th frame of the image on the screen.\n * @param xOffset column index to start displaying the image\n */\n //% help=images/plot-frame weight=80\n //% parts=\"ledmatrix\" shim=ImageMethods::plotFrame\n plotFrame(xOffset: int32): void;\n\n /**\n * Scrolls an image .\n * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5\n * @param interval time between each animation step in milli seconds, eg: 200\n */\n //% help=images/scroll-image weight=79 async blockNamespace=images\n //% blockId=device_scroll_image\n //% block=\"scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %delay\"\n //% blockGap=8 parts=\"ledmatrix\" shim=ImageMethods::scrollImage\n scrollImage(frameOffset: int32, interval: int32): void;\n\n /**\n * Sets all pixels off.\n */\n //% help=images/clear\n //% parts=\"ledmatrix\" shim=ImageMethods::clear\n clear(): void;\n\n /**\n * Sets a specific pixel brightness at a given position\n */\n //%\n //% parts=\"ledmatrix\" shim=ImageMethods::setPixelBrightness\n setPixelBrightness(x: int32, y: int32, value: int32): void;\n\n /**\n * Gets the pixel brightness ([0..255]) at a given position\n */\n //%\n //% parts=\"ledmatrix\" shim=ImageMethods::pixelBrightness\n pixelBrightness(x: int32, y: int32): int32;\n\n /**\n * Gets the width in columns\n */\n //% help=functions/width shim=ImageMethods::width\n width(): int32;\n\n /**\n * Gets the height in rows (always 5)\n */\n //% shim=ImageMethods::height\n height(): int32;\n\n /**\n * Set a pixel state at position ``(x,y)``\n * @param x pixel column\n * @param y pixel row\n * @param value pixel state\n */\n //% help=images/set-pixel\n //% parts=\"ledmatrix\" shim=ImageMethods::setPixel\n setPixel(x: int32, y: int32, value: boolean): void;\n\n /**\n * Get the pixel state at position ``(x,y)``\n * @param x pixel column\n * @param y pixel row\n */\n //% help=images/pixel\n //% parts=\"ledmatrix\" shim=ImageMethods::pixel\n pixel(x: int32, y: int32): boolean;\n\n /**\n * Show a particular frame of the image strip.\n * @param frame image frame to show\n */\n //% weight=70 help=images/show-frame\n //% parts=\"ledmatrix\" interval.defl=400 shim=ImageMethods::showFrame\n showFrame(frame: int32, interval?: int32): void;\n}\n\n\n /**\n * Provides access to basic micro:bit functionality.\n */\n //% color=#1E90FF weight=116 icon=\"\\uf00a\"\ndeclare namespace basic {\n\n /**\n * Draws an image on the LED screen.\n * @param leds the pattern of LED to turn on/off\n * @param interval time in milliseconds to pause after drawing\n */\n //% help=basic/show-leds\n //% weight=95 blockGap=8\n //% imageLiteral=1 async\n //% blockId=device_show_leds\n //% block=\"show leds\" icon=\"\\uf00a\"\n //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showLeds\n function showLeds(leds: string, interval?: int32): void;\n\n /**\n * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.\n * @param text the text to scroll on the screen, eg: \"Hello!\"\n * @param interval how fast to shift characters; eg: 150, 100, 200, -100\n */\n //% help=basic/show-string\n //% weight=87 blockGap=16\n //% block=\"show|string %text\"\n //% async\n //% blockId=device_print_message\n //% parts=\"ledmatrix\"\n //% text.shadowOptions.toString=true interval.defl=150 shim=basic::showString\n function showString(text: string, interval?: int32): void;\n\n /**\n * Turn off all LEDs\n */\n //% help=basic/clear-screen weight=79\n //% blockId=device_clear_display block=\"clear screen\"\n //% parts=\"ledmatrix\" shim=basic::clearScreen\n function clearScreen(): void;\n\n /**\n * Shows a sequence of LED screens as an animation.\n * @param leds pattern of LEDs to turn on/off\n * @param interval time in milliseconds between each redraw\n */\n //% help=basic/show-animation imageLiteral=1 async\n //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showAnimation\n function showAnimation(leds: string, interval?: int32): void;\n\n /**\n * Draws an image on the LED screen.\n * @param leds pattern of LEDs to turn on/off\n */\n //% help=basic/plot-leds weight=80\n //% parts=\"ledmatrix\" imageLiteral=1 shim=basic::plotLeds\n function plotLeds(leds: string): void;\n\n /**\n * Repeats the code forever in the background. On each iteration, allows other codes to run.\n * @param body code to execute\n */\n //% help=basic/forever weight=55 blockGap=16 blockAllowMultiple=1 afterOnStart=true\n //% blockId=device_forever block=\"forever\" icon=\"\\uf01e\" shim=basic::forever\n function forever(a: () => void): void;\n\n /**\n * Pause for the specified time in milliseconds\n * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000\n */\n //% help=basic/pause weight=54\n //% async block=\"pause (ms) %pause\" blockGap=16\n //% blockId=device_pause icon=\"\\uf110\"\n //% pause.shadow=timePicker shim=basic::pause\n function pause(ms: int32): void;\n}\n\n\n\n //% color=#D400D4 weight=111 icon=\"\\uf192\"\ndeclare namespace input {\n\n /**\n * Do something when a button (A, B or both A+B) is pushed down and released again.\n * @param button the button that needs to be pressed\n * @param body code to run when event is raised\n */\n //% help=input/on-button-pressed weight=85 blockGap=16\n //% blockId=device_button_event block=\"on button|%NAME|pressed\"\n //% parts=\"buttonpair\" shim=input::onButtonPressed\n function onButtonPressed(button: Button, body: () => void): void;\n\n /**\n * Do something when when a gesture is done (like shaking the micro:bit).\n * @param gesture the type of gesture to track, eg: Gesture.Shake\n * @param body code to run when gesture is raised\n */\n //% help=input/on-gesture weight=84 blockGap=16\n //% blockId=device_gesture_event block=\"on |%NAME\"\n //% parts=\"accelerometer\"\n //% NAME.fieldEditor=\"gestures\" NAME.fieldOptions.columns=4 shim=input::onGesture\n function onGesture(gesture: Gesture, body: () => void): void;\n\n /**\n * Tests if a gesture is currently detected.\n * @param gesture the type of gesture to detect, eg: Gesture.Shake\n */\n //% help=input/is-gesture weight=10 blockGap=8\n //% blockId=deviceisgesture block=\"is %gesture gesture\"\n //% parts=\"accelerometer\"\n //% gesture.fieldEditor=\"gestures\" gesture.fieldOptions.columns=4 shim=input::isGesture\n function isGesture(gesture: Gesture): boolean;\n\n /**\n * Do something when a pin is touched and released again (while also touching the GND pin).\n * @param name the pin that needs to be pressed, eg: TouchPin.P0\n * @param body the code to run when the pin is pressed\n */\n //% help=input/on-pin-pressed weight=83 blockGap=32\n //% blockId=device_pin_event block=\"on pin %name|pressed\" shim=input::onPinPressed\n function onPinPressed(name: TouchPin, body: () => void): void;\n\n /**\n * Do something when a pin is released.\n * @param name the pin that needs to be released, eg: TouchPin.P0\n * @param body the code to run when the pin is released\n */\n //% help=input/on-pin-released weight=6 blockGap=16\n //% blockId=device_pin_released block=\"on pin %NAME|released\"\n //% advanced=true shim=input::onPinReleased\n function onPinReleased(name: TouchPin, body: () => void): void;\n\n /**\n * Get the button state (pressed or not) for ``A`` and ``B``.\n * @param button the button to query the request, eg: Button.A\n */\n //% help=input/button-is-pressed weight=60\n //% block=\"button|%NAME|is pressed\"\n //% blockId=device_get_button2\n //% icon=\"\\uf192\" blockGap=8\n //% parts=\"buttonpair\" shim=input::buttonIsPressed\n function buttonIsPressed(button: Button): boolean;\n\n /**\n * Get the pin state (pressed or not). Requires to hold the ground to close the circuit.\n * @param name pin used to detect the touch, eg: TouchPin.P0\n */\n //% help=input/pin-is-pressed weight=58\n //% blockId=\"device_pin_is_pressed\" block=\"pin %NAME|is pressed\"\n //% blockGap=8 shim=input::pinIsPressed\n function pinIsPressed(name: TouchPin): boolean;\n\n /**\n * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)\n * @param dimension x, y, or z dimension, eg: Dimension.X\n */\n //% help=input/acceleration weight=58\n //% blockId=device_acceleration block=\"acceleration (mg)|%NAME\" blockGap=8\n //% parts=\"accelerometer\" shim=input::acceleration\n function acceleration(dimension: Dimension): int32;\n\n /**\n * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.\n */\n //% help=input/light-level weight=57\n //% blockId=device_get_light_level block=\"light level\" blockGap=8\n //% parts=\"ledmatrix\" shim=input::lightLevel\n function lightLevel(): int32;\n\n /**\n * Get the current compass heading in degrees.\n */\n //% help=input/compass-heading\n //% weight=56\n //% blockId=device_heading block=\"compass heading (°)\" blockGap=8\n //% parts=\"compass\" shim=input::compassHeading\n function compassHeading(): int32;\n\n /**\n * Gets the temperature in Celsius degrees (°C).\n */\n //% weight=55\n //% help=input/temperature\n //% blockId=device_temperature block=\"temperature (°C)\" blockGap=8\n //% parts=\"thermometer\" shim=input::temperature\n function temperature(): int32;\n\n /**\n * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.\n * @param kind pitch or roll\n */\n //% help=input/rotation weight=52\n //% blockId=device_get_rotation block=\"rotation (°)|%NAME\" blockGap=8\n //% parts=\"accelerometer\" advanced=true shim=input::rotation\n function rotation(kind: Rotation): int32;\n\n /**\n * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.\n * @param dimension the x, y, or z dimension, eg: Dimension.X\n */\n //% help=input/magnetic-force weight=51\n //% blockId=device_get_magnetic_force block=\"magnetic force (µT)|%NAME\" blockGap=8\n //% parts=\"compass\"\n //% advanced=true shim=input::magneticForce\n function magneticForce(dimension: Dimension): number;\n\n /**\n * Obsolete, compass calibration is automatic.\n */\n //% help=input/calibrate-compass advanced=true\n //% blockId=\"input_compass_calibrate\" block=\"calibrate compass\"\n //% weight=45 shim=input::calibrateCompass\n function calibrateCompass(): void;\n\n /**\n * Sets the accelerometer sample range in gravities.\n * @param range a value describe the maximum strengh of acceleration measured\n */\n //% help=input/set-accelerometer-range\n //% blockId=device_set_accelerometer_range block=\"set accelerometer|range %range\"\n //% weight=5\n //% parts=\"accelerometer\"\n //% advanced=true shim=input::setAccelerometerRange\n function setAccelerometerRange(range: AcceleratorRange): void;\n}\n\n\n\n //% weight=1 color=\"#333333\"\n //% advanced=true\ndeclare namespace control {\n\n /**\n * Gets the number of milliseconds elapsed since power on.\n */\n //% help=control/millis weight=50\n //% blockId=control_running_time block=\"millis (ms)\" shim=control::millis\n function millis(): int32;\n\n /**\n * Gets current time in microseconds. Overflows every ~18 minutes.\n */\n //% shim=control::micros\n function micros(): int32;\n\n /**\n * Schedules code that run in the background.\n */\n //% help=control/in-background blockAllowMultiple=1 afterOnStart=true\n //% blockId=\"control_in_background\" block=\"run in background\" blockGap=8 shim=control::inBackground\n function inBackground(a: () => void): void;\n\n /**\n * Blocks the calling thread until the specified event is raised.\n */\n //% help=control/wait-for-event async\n //% blockId=control_wait_for_event block=\"wait for event|from %src|with value %value\" shim=control::waitForEvent\n function waitForEvent(src: int32, value: int32): void;\n\n /**\n * Resets the BBC micro:bit.\n */\n //% weight=30 async help=control/reset blockGap=8\n //% blockId=\"control_reset\" block=\"reset\" shim=control::reset\n function reset(): void;\n\n /**\n * Blocks the current fiber for the given microseconds\n * @param micros number of micro-seconds to wait. eg: 4\n */\n //% help=control/wait-micros weight=29 async\n //% blockId=\"control_wait_us\" block=\"wait (µs)%micros\"\n //% micros.min=0 micros.max=6000 shim=control::waitMicros\n function waitMicros(micros: int32): void;\n\n /**\n * Raises an event in the event bus.\n * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.\n * @param value Component specific code indicating the cause of the event.\n * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE).\n */\n //% weight=21 blockGap=12 blockId=\"control_raise_event\" block=\"raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\" blockExternalInputs=1\n //% help=control/raise-event\n //% mode.defl=1 shim=control::raiseEvent\n function raiseEvent(src: int32, value: int32, mode?: EventCreationMode): void;\n\n /**\n * Registers an event handler.\n */\n //% weight=20 blockGap=8 blockId=\"control_on_event\" block=\"on event|from %src=control_event_source_id|with value %value=control_event_value_id\"\n //% help=control/on-event\n //% blockExternalInputs=1 flags.defl=0 shim=control::onEvent\n function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;\n\n /**\n * Gets the value of the last event executed on the bus\n */\n //% blockId=control_event_value\" block=\"event value\"\n //% help=control/event-value\n //% weight=18 shim=control::eventValue\n function eventValue(): int32;\n\n /**\n * Gets the timestamp of the last event executed on the bus\n */\n //% blockId=control_event_timestamp\" block=\"event timestamp\"\n //% help=control/event-timestamp\n //% weight=19 blockGap=8 shim=control::eventTimestamp\n function eventTimestamp(): int32;\n\n /**\n * Make a friendly name for the device based on its serial number\n */\n //% blockId=\"control_device_name\" block=\"device name\" weight=10 blockGap=8\n //% help=control/device-name\n //% advanced=true shim=control::deviceName\n function deviceName(): string;\n\n /**\n * Returns the major version of the microbit\n */\n //% help=control/hardware-version shim=control::_hardwareVersion\n function _hardwareVersion(): string;\n\n /**\n * Derive a unique, consistent serial number of this device from internal data.\n */\n //% blockId=\"control_device_serial_number\" block=\"device serial number\" weight=9\n //% help=control/device-serial-number\n //% advanced=true shim=control::deviceSerialNumber\n function deviceSerialNumber(): int32;\n\n /**\n * Derive a unique, consistent 64-bit serial number of this device from internal data.\n */\n //% help=control/device-long-serial-number\n //% advanced=true shim=control::deviceLongSerialNumber\n function deviceLongSerialNumber(): Buffer;\n\n /**\n * Informs simulator/runtime of a MIDI message\n * Internal function to support the simulator.\n */\n //% part=midioutput blockHidden=1 shim=control::__midiSend\n function __midiSend(buffer: Buffer): void;\n\n /**\n *\n */\n //% shim=control::__log\n function __log(priority: int32, text: string): void;\n\n /**\n * Allocates the next user notification event\n */\n //% help=control/allocate-notify-event shim=control::allocateNotifyEvent\n function allocateNotifyEvent(): int32;\n\n /** Write a message to DMESG debugging buffer. */\n //% shim=control::dmesg\n function dmesg(s: string): void;\n\n /** Write a message and value (pointer) to DMESG debugging buffer. */\n //% shim=control::dmesgPtr\n function dmesgPtr(str: string, ptr: Object): void;\n}\ndeclare namespace control {\n\n /**\n * Force GC and dump basic information about heap.\n */\n //% shim=control::gc\n function gc(): void;\n\n /**\n * Force GC and halt waiting for debugger to do a full heap dump.\n */\n //% shim=control::heapDump\n function heapDump(): void;\n\n /**\n * Set flags used when connecting an external debugger.\n */\n //% shim=control::setDebugFlags\n function setDebugFlags(flags: int32): void;\n\n /**\n * Record a heap snapshot to debug memory leaks.\n */\n //% shim=control::heapSnapshot\n function heapSnapshot(): void;\n\n /**\n * Return true if profiling is enabled in the current build.\n */\n //% shim=control::profilingEnabled\n function profilingEnabled(): boolean;\n}\n\n\n\n //% color=#7600A8 weight=101 icon=\"\\uf205\"\ndeclare namespace led {\n\n /**\n * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED starting at 0\n * @param y the vertical coordinate of the LED starting at 0\n */\n //% help=led/plot weight=78\n //% blockId=device_plot block=\"plot|x %x|y %y\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::plot\n function plot(x: int32, y: int32): void;\n\n /**\n * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED starting at 0\n * @param y the vertical coordinate of the LED starting at 0\n * @param brightness the brightness from 0 (off) to 255 (bright), eg:255\n */\n //% help=led/plot-brightness weight=78\n //% blockId=device_plot_brightness block=\"plot|x %x|y %y|brightness %brightness\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1\n //% advanced=true shim=led::plotBrightness\n function plotBrightness(x: int32, y: int32, brightness: int32): void;\n\n /**\n * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED\n * @param y the vertical coordinate of the LED\n */\n //% help=led/unplot weight=77\n //% blockId=device_unplot block=\"unplot|x %x|y %y\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::unplot\n function unplot(x: int32, y: int32): void;\n\n /**\n * Get the brightness state of the specified LED using x, y coordinates. (0,0) is upper left.\n * @param x the horizontal coordinate of the LED\n * @param y the vertical coordinate of the LED\n */\n //% help=led/point-brightness weight=76\n //% blockId=device_point_brightness block=\"point|x %x|y %y brightness\"\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1\n //% advanced=true shim=led::pointBrightness\n function pointBrightness(x: int32, y: int32): int32;\n\n /**\n * Get the screen brightness from 0 (off) to 255 (full bright).\n */\n //% help=led/brightness weight=60\n //% blockId=device_get_brightness block=\"brightness\" blockGap=8\n //% parts=\"ledmatrix\"\n //% advanced=true shim=led::brightness\n function brightness(): int32;\n\n /**\n * Set the screen brightness from 0 (off) to 255 (full bright).\n * @param value the brightness value, eg:255, 127, 0\n */\n //% help=led/set-brightness weight=59\n //% blockId=device_set_brightness block=\"set brightness %value\"\n //% parts=\"ledmatrix\"\n //% advanced=true\n //% value.min=0 value.max=255 shim=led::setBrightness\n function setBrightness(value: int32): void;\n\n /**\n * Cancels the current animation and clears other pending animations.\n */\n //% weight=50 help=led/stop-animation\n //% blockId=device_stop_animation block=\"stop animation\"\n //% parts=\"ledmatrix\"\n //% advanced=true shim=led::stopAnimation\n function stopAnimation(): void;\n\n /**\n * Sets the display mode between black and white and greyscale for rendering LEDs.\n * @param mode mode the display mode in which the screen operates\n */\n //% weight=1 help=led/set-display-mode\n //% parts=\"ledmatrix\" advanced=true weight=1\n //% blockId=\"led_set_display_mode\" block=\"set display mode $mode\" shim=led::setDisplayMode\n function setDisplayMode(mode: DisplayMode): void;\n\n /**\n * Gets the current display mode\n */\n //% weight=1 parts=\"ledmatrix\" advanced=true shim=led::displayMode\n function displayMode(): DisplayMode;\n\n /**\n * Turns on or off the display\n */\n //% help=led/enable blockId=device_led_enable block=\"led enable %on\"\n //% advanced=true parts=\"ledmatrix\" shim=led::enable\n function enable(on: boolean): void;\n\n /**\n * Takes a screenshot of the LED screen and returns an image.\n */\n //% help=led/screenshot\n //% parts=\"ledmatrix\" shim=led::screenshot\n function screenshot(): Image;\n}\ndeclare namespace music {\n\n /**\n * Set the default output volume of the sound synthesizer.\n * @param volume the volume 0...255\n */\n //% blockId=synth_set_volume block=\"set volume %volume\"\n //% volume.min=0 volume.max=255\n //%\n //% help=music/set-volume\n //% weight=70\n //% group=\"Volume\"\n //% blockGap=8 volume.defl=127 shim=music::setVolume\n function setVolume(volume?: int32): void;\n\n /**\n * Returns the current output volume of the sound synthesizer.\n */\n //% blockId=synth_get_volume block=\"volume\"\n //% help=music/volume\n //% weight=69\n //% group=\"Volume\"\n //% blockGap=8 shim=music::volume\n function volume(): int32;\n\n /**\n * Turn the built-in speaker on or off.\n * Disabling the speaker resets the sound pin to the default of P0.\n * @param enabled whether the built-in speaker is enabled in addition to the sound pin\n */\n //% blockId=music_set_built_in_speaker_enable block=\"set built-in speaker $enabled\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n //% help=music/set-built-in-speaker-enabled\n //% enabled.shadow=toggleOnOff shim=music::setBuiltInSpeakerEnabled\n function setBuiltInSpeakerEnabled(enabled: boolean): void;\n\n /**\n * Defines an optional sample level to generate during periods of silence.\n **/\n //% group=\"micro:bit (V2)\"\n //% help=music/set-silence-level\n //% level.min=0\n //% level.max=1024\n //%\n //% weight=1 level.defl=0 shim=music::setSilenceLevel\n function setSilenceLevel(level?: int32): void;\n}\ndeclare namespace pins {\n\n /**\n * Read the specified pin or connector as either 0 or 1\n * @param name pin to read from, eg: DigitalPin.P0\n */\n //% help=pins/digital-read-pin weight=30\n //% blockId=device_get_digital_pin block=\"digital read|pin %name\" blockGap=8\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::digitalReadPin\n function digitalReadPin(name: DigitalPin): int32;\n\n /**\n * Set a pin or connector value to either 0 or 1.\n * @param name pin to write to, eg: DigitalPin.P0\n * @param value value to set on the pin, 1 eg,0\n */\n //% help=pins/digital-write-pin weight=29\n //% blockId=device_set_digital_pin block=\"digital write|pin %name|to %value\"\n //% value.min=0 value.max=1\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::digitalWritePin\n function digitalWritePin(name: DigitalPin, value: int32): void;\n\n /**\n * Read the connector value as analog, that is, as a value comprised between 0 and 1023.\n * @param name pin to write to, eg: AnalogPin.P0\n */\n //% help=pins/analog-read-pin weight=25\n //% blockId=device_get_analog_pin block=\"analog read|pin %name\" blockGap=\"8\"\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::analogReadPin\n function analogReadPin(name: AnalogPin): int32;\n\n /**\n * Set the connector value as analog. Value must be comprised between 0 and 1023.\n * @param name pin name to write to, eg: AnalogPin.P0\n * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0\n */\n //% help=pins/analog-write-pin weight=24\n //% blockId=device_set_analog_pin block=\"analog write|pin %name|to %value\" blockGap=8\n //% value.min=0 value.max=1023\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::analogWritePin\n function analogWritePin(name: AnalogPin, value: int32): void;\n\n /**\n * Configure the pulse-width modulation (PWM) period of the analog output in microseconds.\n * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.\n * @param name analog pin to set period to, eg: AnalogPin.P0\n * @param micros period in micro seconds. eg:20000\n */\n //% help=pins/analog-set-period weight=23 blockGap=8\n //% blockId=device_set_analog_period block=\"analog set period|pin %pin|to (µs)%micros\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" shim=pins::analogSetPeriod\n function analogSetPeriod(name: AnalogPin, micros: int32): void;\n\n /**\n * Configure the pin as a digital input and generate an event when the pin is pulsed either high or low.\n * @param name digital pin to register to, eg: DigitalPin.P0\n * @param pulse the value of the pulse, eg: PulseValue.High\n */\n //% help=pins/on-pulsed advanced=true\n //% blockId=pins_on_pulsed block=\"on|pin %pin|pulsed %pulse\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pulse\"\n //% weight=25\n //% blockGap=8 shim=pins::onPulsed\n function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void;\n\n /**\n * Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler.\n */\n //% help=pins/pulse-duration advanced=true\n //% blockId=pins_pulse_duration block=\"pulse duration (µs)\"\n //% group=\"Pulse\"\n //% weight=24\n //% blockGap=8 shim=pins::pulseDuration\n function pulseDuration(): int32;\n\n /**\n * Return the duration of a pulse at a pin in microseconds.\n * @param name the pin which measures the pulse, eg: DigitalPin.P0\n * @param value the value of the pulse, eg: PulseValue.High\n * @param maximum duration in microseconds\n */\n //% blockId=\"pins_pulse_in\" block=\"pulse in (µs)|pin %name|pulsed %value\"\n //% advanced=true\n //% help=pins/pulse-in\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Pulse\"\n //% weight=23\n //% blockGap=8 maxDuration.defl=2000000 shim=pins::pulseIn\n function pulseIn(name: DigitalPin, value: PulseValue, maxDuration?: int32): int32;\n\n /**\n * Write a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).\n * @param name pin to write to, eg: AnalogPin.P0\n * @param value angle or rotation speed, eg:180,90,0\n */\n //% help=pins/servo-write-pin weight=20\n //% blockId=device_set_servo_pin block=\"servo write|pin %name|to %value\" blockGap=8\n //% parts=microservo trackArgs=0\n //% value.min=0 value.max=180\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Servo\" shim=pins::servoWritePin\n function servoWritePin(name: AnalogPin, value: int32): void;\n\n /**\n * Specifies that a continuous servo is connected.\n */\n //% shim=pins::servoSetContinuous\n function servoSetContinuous(name: AnalogPin, value: boolean): void;\n\n /**\n * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds.\n * @param name pin name\n * @param micros pulse duration in micro seconds, eg:1500\n */\n //% help=pins/servo-set-pulse weight=19\n //% blockId=device_set_servo_pulse block=\"servo set pulse|pin %value|to (µs) %micros\"\n //% value.fieldEditor=\"gridpicker\" value.fieldOptions.columns=4\n //% value.fieldOptions.tooltips=\"false\" value.fieldOptions.width=\"250\"\n //% group=\"Servo\" shim=pins::servoSetPulse\n function servoSetPulse(name: AnalogPin, micros: int32): void;\n\n /**\n * Set the pin used when using analog pitch or music.\n * @param name pin to modulate pitch from\n */\n //% blockId=device_analog_set_pitch_pin block=\"analog set pitch pin %name\"\n //% help=pins/analog-set-pitch-pin advanced=true\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=12\n //% blockGap=8 shim=pins::analogSetPitchPin\n function analogSetPitchPin(name: AnalogPin): void;\n\n /**\n * Sets the volume on the pitch pin\n * @param volume the intensity of the sound from 0..255\n */\n //% blockId=device_analog_set_pitch_volume block=\"analog set pitch volume $volume\"\n //% help=pins/analog-set-pitch-volume weight=3 advanced=true\n //% volume.min=0 volume.max=255\n //% deprecated shim=pins::analogSetPitchVolume\n function analogSetPitchVolume(volume: int32): void;\n\n /**\n * Gets the volume the pitch pin from 0..255\n */\n //% blockId=device_analog_pitch_volume block=\"analog pitch volume\"\n //% help=pins/analog-pitch-volume weight=3 advanced=true\n //% deprecated shim=pins::analogPitchVolume\n function analogPitchVolume(): int32;\n\n /**\n * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.\n * @param frequency frequency to modulate in Hz.\n * @param ms duration of the pitch in milli seconds.\n */\n //% blockId=device_analog_pitch block=\"analog pitch %frequency|for (ms) %ms\"\n //% help=pins/analog-pitch async advanced=true\n //% group=\"Pins\"\n //% weight=14\n //% blockGap=8 shim=pins::analogPitch\n function analogPitch(frequency: int32, ms: int32): void;\n\n /**\n * Configure the pull direction of of a pin.\n * @param name pin to set the pull mode on, eg: DigitalPin.P0\n * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp\n */\n //% help=pins/set-pull advanced=true\n //% blockId=device_set_pull block=\"set pull|pin %pin|to %pull\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=15\n //% blockGap=8 shim=pins::setPull\n function setPull(name: DigitalPin, pull: PinPullMode): void;\n\n /**\n * Configure the events emitted by this pin. Events can be subscribed to\n * using ``control.onEvent()``.\n * @param name pin to set the event mode on, eg: DigitalPin.P0\n * @param type the type of events for this pin to emit, eg: PinEventType.Edge\n */\n //% help=pins/set-events advanced=true\n //% blockId=device_set_pin_events block=\"set pin %pin|to emit %type|events\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=13\n //% blockGap=8 shim=pins::setEvents\n function setEvents(name: DigitalPin, type: PinEventType): void;\n\n /**\n * Create a new zero-initialized buffer.\n * @param size number of bytes in the buffer\n */\n //% shim=pins::createBuffer\n function createBuffer(size: int32): Buffer;\n\n /**\n * Set the matrix width for Neopixel strip (already assigned to a pin).\n * Should be used in conjunction with `set matrix width` from Neopixel package.\n * @param name pin of Neopixel strip, eg: DigitalPin.P1\n * @param value width of matrix (at least ``2``)\n */\n //% help=pins/neopixel-matrix-width advanced=true\n //% blockId=pin_neopixel_matrix_width block=\"neopixel matrix width|pin %pin %width\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% width.min=2\n //% group=\"Pins\"\n //% weight=11\n //% blockGap=8 width.defl=5 shim=pins::setMatrixWidth\n function setMatrixWidth(pin: DigitalPin, width?: int32): void;\n\n /**\n * Read `size` bytes from a 7-bit I2C `address`.\n */\n //% repeat.defl=0 shim=pins::i2cReadBuffer\n function i2cReadBuffer(address: int32, size: int32, repeat?: boolean): Buffer;\n\n /**\n * Write bytes to a 7-bit I2C `address`.\n */\n //% repeat.defl=0 shim=pins::i2cWriteBuffer\n function i2cWriteBuffer(address: int32, buf: Buffer, repeat?: boolean): int32;\n\n /**\n * Write to the SPI slave and return the response\n * @param value Data to be sent to the SPI slave\n */\n //% help=pins/spi-write advanced=true\n //% blockId=spi_write block=\"spi write %value\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=53 shim=pins::spiWrite\n function spiWrite(value: int32): int32;\n\n /**\n * Write to and read from the SPI slave at the same time\n * @param command Data to be sent to the SPI slave (can be null)\n * @param response Data received from the SPI slave (can be null)\n */\n //% help=pins/spi-transfer argsNullable shim=pins::spiTransfer\n function spiTransfer(command: Buffer, response: Buffer): void;\n\n /**\n * Set the SPI frequency\n * @param frequency the clock frequency, eg: 1000000\n */\n //% help=pins/spi-frequency advanced=true\n //% blockId=spi_frequency block=\"spi frequency %frequency\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=55 shim=pins::spiFrequency\n function spiFrequency(frequency: int32): void;\n\n /**\n * Set the SPI bits and mode\n * @param bits the number of bits, eg: 8\n * @param mode the mode, eg: 3\n */\n //% help=pins/spi-format advanced=true\n //% blockId=spi_format block=\"spi format|bits %bits|mode %mode\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=54 shim=pins::spiFormat\n function spiFormat(bits: int32, mode: int32): void;\n\n /**\n * Set the MOSI, MISO, SCK pins used by the SPI connection\n *\n */\n //% help=pins/spi-pins advanced=true\n //% blockId=spi_pins block=\"spi set pins|MOSI %mosi|MISO %miso|SCK %sck\"\n //% mosi.fieldEditor=\"gridpicker\" mosi.fieldOptions.columns=4\n //% mosi.fieldOptions.tooltips=\"false\" mosi.fieldOptions.width=\"250\"\n //% miso.fieldEditor=\"gridpicker\" miso.fieldOptions.columns=4\n //% miso.fieldOptions.tooltips=\"false\" miso.fieldOptions.width=\"250\"\n //% sck.fieldEditor=\"gridpicker\" sck.fieldOptions.columns=4\n //% sck.fieldOptions.tooltips=\"false\" sck.fieldOptions.width=\"250\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=51 shim=pins::spiPins\n function spiPins(mosi: DigitalPin, miso: DigitalPin, sck: DigitalPin): void;\n\n /**\n * Mounts a push button on the given pin\n */\n //% help=pins/push-button advanced=true shim=pins::pushButton\n function pushButton(pin: DigitalPin): void;\n\n /**\n * Set the pin used when producing sounds and melodies. Default is P0.\n * @param name pin to modulate pitch from\n */\n //% blockId=pin_set_audio_pin block=\"set audio pin $name\"\n //% help=pins/set-audio-pin\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% weight=1\n //% blockGap=8 shim=pins::setAudioPin\n function setAudioPin(name: AnalogPin): void;\n\n /**\n * Sets whether or not audio will be output using a pin on the edge\n * connector.\n */\n //% blockId=pin_set_audio_pin_enabled\n //% block=\"set audio pin enabled $enabled\"\n //% weight=0 shim=pins::setAudioPinEnabled\n function setAudioPinEnabled(enabled: boolean): void;\n}\n\n\n\n //% weight=2 color=#002050 icon=\"\\uf287\"\n //% advanced=true\ndeclare namespace serial {\n\n /**\n * Read a line of text from the serial port and return the buffer when the delimiter is met.\n * @param delimiter text delimiter that separates each text chunk\n */\n //% help=serial/read-until\n //% blockId=serial_read_until block=\"serial|read until %delimiter=serial_delimiter_conv\"\n //% weight=19 shim=serial::readUntil\n function readUntil(delimiter: string): string;\n\n /**\n * Read the buffered received data as a string\n */\n //% help=serial/read-string\n //% blockId=serial_read_buffer block=\"serial|read string\"\n //% weight=18 shim=serial::readString\n function readString(): string;\n\n /**\n * Register an event to be fired when one of the delimiter is matched.\n * @param delimiters the characters to match received characters against.\n */\n //% help=serial/on-data-received\n //% weight=18 blockId=serial_on_data_received block=\"serial|on data received %delimiters=serial_delimiter_conv\" shim=serial::onDataReceived\n function onDataReceived(delimiters: string, body: () => void): void;\n\n /**\n * Send a piece of text through the serial connection.\n */\n //% help=serial/write-string\n //% weight=87 blockGap=8\n //% blockId=serial_writestring block=\"serial|write string %text\"\n //% text.shadowOptions.toString=true shim=serial::writeString\n function writeString(text: string): void;\n\n /**\n * Send a buffer through serial connection\n */\n //% blockId=serial_writebuffer block=\"serial|write buffer %buffer=serial_readbuffer\"\n //% help=serial/write-buffer advanced=true weight=6 shim=serial::writeBuffer\n function writeBuffer(buffer: Buffer): void;\n\n /**\n * Read multiple characters from the receive buffer. \n * If length is positive, pauses until enough characters are present.\n * @param length default buffer length\n */\n //% blockId=serial_readbuffer block=\"serial|read buffer %length\"\n //% help=serial/read-buffer advanced=true weight=5 shim=serial::readBuffer\n function readBuffer(length: int32): Buffer;\n\n /**\n * Set the serial input and output to use pins instead of the USB connection.\n * @param tx the new transmission pin, eg: SerialPin.P0\n * @param rx the new reception pin, eg: SerialPin.P1\n * @param rate the new baud rate. eg: 115200\n */\n //% weight=10\n //% help=serial/redirect\n //% blockId=serial_redirect block=\"serial|redirect to|TX %tx|RX %rx|at baud rate %rate\"\n //% blockExternalInputs=1\n //% tx.fieldEditor=\"gridpicker\" tx.fieldOptions.columns=3\n //% tx.fieldOptions.tooltips=\"false\"\n //% rx.fieldEditor=\"gridpicker\" rx.fieldOptions.columns=3\n //% rx.fieldOptions.tooltips=\"false\"\n //% blockGap=8 shim=serial::redirect\n function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void;\n\n /**\n Set the baud rate of the serial port\n */\n //% weight=10\n //% blockId=serial_setbaudrate block=\"serial|set baud rate %rate\"\n //% blockGap=8 inlineInputMode=inline\n //% help=serial/set-baud-rate\n //% group=\"Configuration\" advanced=true shim=serial::setBaudRate\n function setBaudRate(rate: BaudRate): void;\n\n /**\n * Direct the serial input and output to use the USB connection.\n */\n //% weight=9 help=serial/redirect-to-usb\n //% blockId=serial_redirect_to_usb block=\"serial|redirect to USB\" shim=serial::redirectToUSB\n function redirectToUSB(): void;\n\n /**\n * Sets the size of the RX buffer in bytes\n * @param size length of the rx buffer in bytes, eg: 32\n */\n //% help=serial/set-rx-buffer-size\n //% blockId=serialSetRxBufferSize block=\"serial set rx buffer size to $size\"\n //% advanced=true shim=serial::setRxBufferSize\n function setRxBufferSize(size: uint8): void;\n\n /**\n * Sets the size of the TX buffer in bytes\n * @param size length of the tx buffer in bytes, eg: 32\n */\n //% help=serial/set-tx-buffer-size\n //% blockId=serialSetTxBufferSize block=\"serial set tx buffer size to $size\"\n //% advanced=true shim=serial::setTxBufferSize\n function setTxBufferSize(size: uint8): void;\n}\n\n\n\n //% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte\ndeclare interface Buffer {\n /**\n * Reads an unsigned byte at a particular location\n */\n //% shim=BufferMethods::getUint8\n getUint8(off: int32): int32;\n\n /**\n * Returns false when the buffer can be written to.\n */\n //% shim=BufferMethods::isReadOnly\n isReadOnly(): boolean;\n\n /**\n * Writes an unsigned byte at a particular location\n */\n //% shim=BufferMethods::setUint8\n setUint8(off: int32, v: int32): void;\n\n /**\n * Write a number in specified format in the buffer.\n */\n //% shim=BufferMethods::setNumber\n setNumber(format: NumberFormat, offset: int32, value: number): void;\n\n /**\n * Read a number in specified format from the buffer.\n */\n //% shim=BufferMethods::getNumber\n getNumber(format: NumberFormat, offset: int32): number;\n\n /** Returns the length of a Buffer object. */\n //% property shim=BufferMethods::length\n length: int32;\n\n /**\n * Fill (a fragment) of the buffer with given value.\n */\n //% offset.defl=0 length.defl=-1 shim=BufferMethods::fill\n fill(value: int32, offset?: int32, length?: int32): void;\n\n /**\n * Return a copy of a fragment of a buffer.\n */\n //% offset.defl=0 length.defl=-1 shim=BufferMethods::slice\n slice(offset?: int32, length?: int32): Buffer;\n\n /**\n * Shift buffer left in place, with zero padding.\n * @param offset number of bytes to shift; use negative value to shift right\n * @param start start offset in buffer. Default is 0.\n * @param length number of elements in buffer. If negative, length is set as the buffer length minus\n * start. eg: -1\n */\n //% start.defl=0 length.defl=-1 shim=BufferMethods::shift\n shift(offset: int32, start?: int32, length?: int32): void;\n\n /**\n * Convert a buffer to string assuming UTF8 encoding\n */\n //% shim=BufferMethods::toString\n toString(): string;\n\n /**\n * Convert a buffer to its hexadecimal representation.\n */\n //% shim=BufferMethods::toHex\n toHex(): string;\n\n /**\n * Rotate buffer left in place.\n * @param offset number of bytes to shift; use negative value to shift right\n * @param start start offset in buffer. Default is 0.\n * @param length number of elements in buffer. If negative, length is set as the buffer length minus\n * start. eg: -1\n */\n //% start.defl=0 length.defl=-1 shim=BufferMethods::rotate\n rotate(offset: int32, start?: int32, length?: int32): void;\n\n /**\n * Write contents of `src` at `dstOffset` in current buffer.\n */\n //% shim=BufferMethods::write\n write(dstOffset: int32, src: Buffer): void;\n\n /**\n * Compute k-bit FNV-1 non-cryptographic hash of the buffer.\n */\n //% shim=BufferMethods::hash\n hash(bits: int32): uint32;\n}\ndeclare namespace control {\n\n /**\n * Create a new zero-initialized buffer.\n * @param size number of bytes in the buffer\n */\n //% deprecated=1 shim=control::createBuffer\n function createBuffer(size: int32): Buffer;\n\n /**\n * Create a new buffer with UTF8-encoded string\n * @param str the string to put in the buffer\n */\n //% deprecated=1 shim=control::createBufferFromUTF8\n function createBufferFromUTF8(str: string): Buffer;\n}\ndeclare namespace light {\n\n /**\n * Sends a color buffer to a light strip\n **/\n //% advanced=true shim=light::sendWS2812Buffer\n function sendWS2812Buffer(buf: Buffer, pin: int32): void;\n\n /**\n * Sends a color buffer to a light strip\n **/\n //% advanced=true shim=light::sendWS2812BufferWithBrightness\n function sendWS2812BufferWithBrightness(buf: Buffer, pin: int32, brightness: int32): void;\n\n /**\n * Sets the light mode of a pin\n **/\n //% advanced=true\n //% shim=light::setMode\n function setMode(pin: int32, mode: int32): void;\n}\ndeclare namespace input {\n\n /**\n * Do something when the logo is touched and released again.\n * @param body the code to run when the logo is pressed\n */\n //% weight=83 blockGap=32\n //% blockId=input_logo_event block=\"on logo $action\"\n //% group=\"micro:bit (V2)\"\n //% parts=\"logotouch\"\n //% help=\"input/on-logo-event\" shim=input::onLogoEvent\n function onLogoEvent(action: TouchButtonEvent, body: () => void): void;\n\n /**\n * Get the logo state (pressed or not).\n */\n //% weight=58\n //% blockId=\"input_logo_is_pressed\" block=\"logo is pressed\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\"\n //% parts=\"logotouch\"\n //% help=\"input/logo-is-pressed\" shim=input::logoIsPressed\n function logoIsPressed(): boolean;\n}\ndeclare namespace pins {\n\n /**\n * Configure the touch detection for the pins and logo.\n * P0, P1, P2 use resistive touch by default.\n * The logo uses capacitative touch by default.\n * @param name target to change the touch mode for\n * @param mode the touch mode to use\n */\n //% weight=60\n //% blockId=device_touch_set_type block=\"set %name to touch mode %mode\"\n //% advanced=true\n //% group=\"micro:bit (V2)\"\n //% help=pins/touch-set-mode shim=pins::touchSetMode\n function touchSetMode(name: TouchTarget, mode: TouchTargetMode): void;\n}\ndeclare namespace music {\n\n /**\n * Internal use only\n **/\n //% async shim=music::__playSoundExpression\n function __playSoundExpression(nodes: string, waitTillDone: boolean): void;\n\n /**\n * Internal use only\n */\n //% shim=music::__stopSoundExpressions\n function __stopSoundExpressions(): void;\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2779
|
+
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n /**\n * Creation, manipulation and display of LED images.\n */\n //% color=#7600A8 weight=31 icon=\"\\uf03e\"\n //% advanced=true\ndeclare namespace images {\n\n /**\n * Creates an image that fits on the LED screen.\n */\n //% weight=75 help=images/create-image\n //% blockId=device_build_image block=\"create image\"\n //% parts=\"ledmatrix\" imageLiteral=1 shim=images::createImage\n function createImage(leds: string): Image;\n\n /**\n * Creates an image with 2 frames.\n */\n //% weight=74 help=images/create-big-image\n //% blockId=device_build_big_image block=\"create big image\" imageLiteral=2\n //% parts=\"ledmatrix\" shim=images::createBigImage\n function createBigImage(leds: string): Image;\n}\n\n\ndeclare interface Image {\n /**\n * Plots the image at a given column to the screen\n */\n //% help=images/plot-image\n //% parts=\"ledmatrix\" xOffset.defl=0 shim=ImageMethods::plotImage\n plotImage(xOffset?: int32): void;\n\n /**\n * Shows an frame from the image at offset ``x offset``.\n * @param xOffset column index to start displaying the image\n * @param interval time in milliseconds to pause after drawing\n */\n //% help=images/show-image weight=80 blockNamespace=images\n //% blockId=device_show_image_offset block=\"show image %sprite(myImage)|at offset %offset ||and interval (ms) %interval\"\n //%\n //% blockGap=8 parts=\"ledmatrix\" async interval.defl=400 shim=ImageMethods::showImage\n showImage(xOffset: int32, interval?: int32): void;\n\n /**\n * Draws the ``index``-th frame of the image on the screen.\n * @param xOffset column index to start displaying the image\n */\n //% help=images/plot-frame weight=80\n //% parts=\"ledmatrix\" shim=ImageMethods::plotFrame\n plotFrame(xOffset: int32): void;\n\n /**\n * Scrolls an image .\n * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5\n * @param interval time between each animation step in milli seconds, eg: 200\n */\n //% help=images/scroll-image weight=79 async blockNamespace=images\n //% blockId=device_scroll_image\n //% block=\"scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %delay\"\n //% blockGap=8 parts=\"ledmatrix\" shim=ImageMethods::scrollImage\n scrollImage(frameOffset: int32, interval: int32): void;\n\n /**\n * Sets all pixels off.\n */\n //% help=images/clear\n //% parts=\"ledmatrix\" shim=ImageMethods::clear\n clear(): void;\n\n /**\n * Sets a specific pixel brightness at a given position\n */\n //%\n //% parts=\"ledmatrix\" shim=ImageMethods::setPixelBrightness\n setPixelBrightness(x: int32, y: int32, value: int32): void;\n\n /**\n * Gets the pixel brightness ([0..255]) at a given position\n */\n //%\n //% parts=\"ledmatrix\" shim=ImageMethods::pixelBrightness\n pixelBrightness(x: int32, y: int32): int32;\n\n /**\n * Gets the width in columns\n */\n //% help=functions/width shim=ImageMethods::width\n width(): int32;\n\n /**\n * Gets the height in rows (always 5)\n */\n //% shim=ImageMethods::height\n height(): int32;\n\n /**\n * Set a pixel state at position ``(x,y)``\n * @param x pixel column\n * @param y pixel row\n * @param value pixel state\n */\n //% help=images/set-pixel\n //% parts=\"ledmatrix\" shim=ImageMethods::setPixel\n setPixel(x: int32, y: int32, value: boolean): void;\n\n /**\n * Get the pixel state at position ``(x,y)``\n * @param x pixel column\n * @param y pixel row\n */\n //% help=images/pixel\n //% parts=\"ledmatrix\" shim=ImageMethods::pixel\n pixel(x: int32, y: int32): boolean;\n\n /**\n * Show a particular frame of the image strip.\n * @param frame image frame to show\n */\n //% weight=70 help=images/show-frame\n //% parts=\"ledmatrix\" interval.defl=400 shim=ImageMethods::showFrame\n showFrame(frame: int32, interval?: int32): void;\n}\n\n\n /**\n * Provides access to basic micro:bit functionality.\n */\n //% color=#1E90FF weight=116 icon=\"\\uf00a\"\ndeclare namespace basic {\n\n /**\n * Draws an image on the LED screen.\n * @param leds the pattern of LED to turn on/off\n * @param interval time in milliseconds to pause after drawing\n */\n //% help=basic/show-leds\n //% weight=95 blockGap=8\n //% imageLiteral=1 async\n //% blockId=device_show_leds\n //% block=\"show leds\" icon=\"\\uf00a\"\n //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showLeds\n function showLeds(leds: string, interval?: int32): void;\n\n /**\n * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.\n * @param text the text to scroll on the screen, eg: \"Hello!\"\n * @param interval how fast to shift characters; eg: 150, 100, 200, -100\n */\n //% help=basic/show-string\n //% weight=87 blockGap=16\n //% block=\"show|string %text\"\n //% async\n //% blockId=device_print_message\n //% parts=\"ledmatrix\"\n //% text.shadowOptions.toString=true interval.defl=150 shim=basic::showString\n function showString(text: string, interval?: int32): void;\n\n /**\n * Turn off all LEDs\n */\n //% help=basic/clear-screen weight=79\n //% blockId=device_clear_display block=\"clear screen\"\n //% parts=\"ledmatrix\" shim=basic::clearScreen\n function clearScreen(): void;\n\n /**\n * Shows a sequence of LED screens as an animation.\n * @param leds pattern of LEDs to turn on/off\n * @param interval time in milliseconds between each redraw\n */\n //% help=basic/show-animation imageLiteral=1 async\n //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showAnimation\n function showAnimation(leds: string, interval?: int32): void;\n\n /**\n * Draws an image on the LED screen.\n * @param leds pattern of LEDs to turn on/off\n */\n //% help=basic/plot-leds weight=80\n //% parts=\"ledmatrix\" imageLiteral=1 shim=basic::plotLeds\n function plotLeds(leds: string): void;\n\n /**\n * Repeats the code forever in the background. On each iteration, allows other codes to run.\n * @param body code to execute\n */\n //% help=basic/forever weight=55 blockGap=16 blockAllowMultiple=1 afterOnStart=true\n //% blockId=device_forever block=\"forever\" icon=\"\\uf01e\" shim=basic::forever\n function forever(a: () => void): void;\n\n /**\n * Pause for the specified time in milliseconds\n * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000\n */\n //% help=basic/pause weight=54\n //% async block=\"pause (ms) %pause\" blockGap=16\n //% blockId=device_pause icon=\"\\uf110\"\n //% pause.shadow=timePicker shim=basic::pause\n function pause(ms: int32): void;\n}\n\n\n\n //% color=#D400D4 weight=111 icon=\"\\uf192\"\ndeclare namespace input {\n\n /**\n * Do something when a button (A, B or both A+B) is pushed down and released again.\n * @param button the button that needs to be pressed\n * @param body code to run when event is raised\n */\n //% help=input/on-button-pressed weight=85 blockGap=16\n //% blockId=device_button_event block=\"on button|%NAME|pressed\"\n //% parts=\"buttonpair\" shim=input::onButtonPressed\n function onButtonPressed(button: Button, body: () => void): void;\n\n /**\n * Do something when when a gesture is done (like shaking the micro:bit).\n * @param gesture the type of gesture to track, eg: Gesture.Shake\n * @param body code to run when gesture is raised\n */\n //% help=input/on-gesture weight=84 blockGap=16\n //% blockId=device_gesture_event block=\"on |%NAME\"\n //% parts=\"accelerometer\"\n //% NAME.fieldEditor=\"gestures\" NAME.fieldOptions.columns=4 shim=input::onGesture\n function onGesture(gesture: Gesture, body: () => void): void;\n\n /**\n * Tests if a gesture is currently detected.\n * @param gesture the type of gesture to detect, eg: Gesture.Shake\n */\n //% help=input/is-gesture weight=10 blockGap=8\n //% blockId=deviceisgesture block=\"is %gesture gesture\"\n //% parts=\"accelerometer\"\n //% gesture.fieldEditor=\"gestures\" gesture.fieldOptions.columns=4 shim=input::isGesture\n function isGesture(gesture: Gesture): boolean;\n\n /**\n * Do something when a pin is touched and released again (while also touching the GND pin).\n * @param name the pin that needs to be pressed, eg: TouchPin.P0\n * @param body the code to run when the pin is pressed\n */\n //% help=input/on-pin-pressed weight=83 blockGap=32\n //% blockId=device_pin_event block=\"on pin %name|pressed\" shim=input::onPinPressed\n function onPinPressed(name: TouchPin, body: () => void): void;\n\n /**\n * Do something when a pin is released.\n * @param name the pin that needs to be released, eg: TouchPin.P0\n * @param body the code to run when the pin is released\n */\n //% help=input/on-pin-released weight=6 blockGap=16\n //% blockId=device_pin_released block=\"on pin %NAME|released\"\n //% advanced=true shim=input::onPinReleased\n function onPinReleased(name: TouchPin, body: () => void): void;\n\n /**\n * Get the button state (pressed or not) for ``A`` and ``B``.\n * @param button the button to query the request, eg: Button.A\n */\n //% help=input/button-is-pressed weight=60\n //% block=\"button|%NAME|is pressed\"\n //% blockId=device_get_button2\n //% icon=\"\\uf192\" blockGap=8\n //% parts=\"buttonpair\" shim=input::buttonIsPressed\n function buttonIsPressed(button: Button): boolean;\n\n /**\n * Get the pin state (pressed or not). Requires to hold the ground to close the circuit.\n * @param name pin used to detect the touch, eg: TouchPin.P0\n */\n //% help=input/pin-is-pressed weight=58\n //% blockId=\"device_pin_is_pressed\" block=\"pin %NAME|is pressed\"\n //% blockGap=8 shim=input::pinIsPressed\n function pinIsPressed(name: TouchPin): boolean;\n\n /**\n * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)\n * @param dimension x, y, or z dimension, eg: Dimension.X\n */\n //% help=input/acceleration weight=58\n //% blockId=device_acceleration block=\"acceleration (mg)|%NAME\" blockGap=8\n //% parts=\"accelerometer\" shim=input::acceleration\n function acceleration(dimension: Dimension): int32;\n\n /**\n * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.\n */\n //% help=input/light-level weight=57\n //% blockId=device_get_light_level block=\"light level\" blockGap=8\n //% parts=\"ledmatrix\" shim=input::lightLevel\n function lightLevel(): int32;\n\n /**\n * Get the current compass heading in degrees.\n */\n //% help=input/compass-heading\n //% weight=56\n //% blockId=device_heading block=\"compass heading (°)\" blockGap=8\n //% parts=\"compass\" shim=input::compassHeading\n function compassHeading(): int32;\n\n /**\n * Gets the temperature in Celsius degrees (°C).\n */\n //% weight=55\n //% help=input/temperature\n //% blockId=device_temperature block=\"temperature (°C)\" blockGap=8\n //% parts=\"thermometer\" shim=input::temperature\n function temperature(): int32;\n\n /**\n * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.\n * @param kind pitch or roll\n */\n //% help=input/rotation weight=52\n //% blockId=device_get_rotation block=\"rotation (°)|%NAME\" blockGap=8\n //% parts=\"accelerometer\" advanced=true shim=input::rotation\n function rotation(kind: Rotation): int32;\n\n /**\n * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.\n * @param dimension the x, y, or z dimension, eg: Dimension.X\n */\n //% help=input/magnetic-force weight=51\n //% blockId=device_get_magnetic_force block=\"magnetic force (µT)|%NAME\" blockGap=8\n //% parts=\"compass\"\n //% advanced=true shim=input::magneticForce\n function magneticForce(dimension: Dimension): number;\n\n /**\n * Obsolete, compass calibration is automatic.\n */\n //% help=input/calibrate-compass advanced=true\n //% blockId=\"input_compass_calibrate\" block=\"calibrate compass\"\n //% weight=45 shim=input::calibrateCompass\n function calibrateCompass(): void;\n\n /**\n * Sets the accelerometer sample range in gravities.\n * @param range a value describe the maximum strengh of acceleration measured\n */\n //% help=input/set-accelerometer-range\n //% blockId=device_set_accelerometer_range block=\"set accelerometer|range %range\"\n //% weight=5\n //% parts=\"accelerometer\"\n //% advanced=true shim=input::setAccelerometerRange\n function setAccelerometerRange(range: AcceleratorRange): void;\n}\n\n\n\n //% weight=1 color=\"#333333\"\n //% advanced=true\ndeclare namespace control {\n\n /**\n * Gets the number of milliseconds elapsed since power on.\n */\n //% help=control/millis weight=50\n //% blockId=control_running_time block=\"millis (ms)\" shim=control::millis\n function millis(): int32;\n\n /**\n * Gets current time in microseconds. Overflows every ~18 minutes.\n */\n //% shim=control::micros\n function micros(): int32;\n\n /**\n * Schedules code that run in the background.\n */\n //% help=control/in-background blockAllowMultiple=1 afterOnStart=true\n //% blockId=\"control_in_background\" block=\"run in background\" blockGap=8 shim=control::inBackground\n function inBackground(a: () => void): void;\n\n /**\n * Blocks the calling thread until the specified event is raised.\n */\n //% help=control/wait-for-event async\n //% blockId=control_wait_for_event block=\"wait for event|from %src|with value %value\" shim=control::waitForEvent\n function waitForEvent(src: int32, value: int32): void;\n\n /**\n * Resets the BBC micro:bit.\n */\n //% weight=30 async help=control/reset blockGap=8\n //% blockId=\"control_reset\" block=\"reset\" shim=control::reset\n function reset(): void;\n\n /**\n * Blocks the current fiber for the given microseconds\n * @param micros number of micro-seconds to wait. eg: 4\n */\n //% help=control/wait-micros weight=29 async\n //% blockId=\"control_wait_us\" block=\"wait (µs)%micros\"\n //% micros.min=0 micros.max=6000 shim=control::waitMicros\n function waitMicros(micros: int32): void;\n\n /**\n * Raises an event in the event bus.\n * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.\n * @param value Component specific code indicating the cause of the event.\n * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE).\n */\n //% weight=21 blockGap=12 blockId=\"control_raise_event\" block=\"raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\" blockExternalInputs=1\n //% help=control/raise-event\n //% mode.defl=1 shim=control::raiseEvent\n function raiseEvent(src: int32, value: int32, mode?: EventCreationMode): void;\n\n /**\n * Registers an event handler.\n */\n //% weight=20 blockGap=8 blockId=\"control_on_event\" block=\"on event|from %src=control_event_source_id|with value %value=control_event_value_id\"\n //% help=control/on-event\n //% blockExternalInputs=1 flags.defl=0 shim=control::onEvent\n function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;\n\n /**\n * Gets the value of the last event executed on the bus\n */\n //% blockId=control_event_value\" block=\"event value\"\n //% help=control/event-value\n //% weight=18 shim=control::eventValue\n function eventValue(): int32;\n\n /**\n * Gets the timestamp of the last event executed on the bus\n */\n //% blockId=control_event_timestamp\" block=\"event timestamp\"\n //% help=control/event-timestamp\n //% weight=19 blockGap=8 shim=control::eventTimestamp\n function eventTimestamp(): int32;\n\n /**\n * Make a friendly name for the device based on its serial number\n */\n //% blockId=\"control_device_name\" block=\"device name\" weight=10 blockGap=8\n //% help=control/device-name\n //% advanced=true shim=control::deviceName\n function deviceName(): string;\n\n /**\n * Returns the major version of the microbit\n */\n //% help=control/hardware-version shim=control::_hardwareVersion\n function _hardwareVersion(): string;\n\n /**\n * Derive a unique, consistent serial number of this device from internal data.\n */\n //% blockId=\"control_device_serial_number\" block=\"device serial number\" weight=9\n //% help=control/device-serial-number\n //% advanced=true shim=control::deviceSerialNumber\n function deviceSerialNumber(): int32;\n\n /**\n * Derive a unique, consistent 64-bit serial number of this device from internal data.\n */\n //% help=control/device-long-serial-number\n //% advanced=true shim=control::deviceLongSerialNumber\n function deviceLongSerialNumber(): Buffer;\n\n /**\n * Informs simulator/runtime of a MIDI message\n * Internal function to support the simulator.\n */\n //% part=midioutput blockHidden=1 shim=control::__midiSend\n function __midiSend(buffer: Buffer): void;\n\n /**\n *\n */\n //% shim=control::__log\n function __log(priority: int32, text: string): void;\n\n /**\n * Allocates the next user notification event\n */\n //% help=control/allocate-notify-event shim=control::allocateNotifyEvent\n function allocateNotifyEvent(): int32;\n\n /** Write a message to DMESG debugging buffer. */\n //% shim=control::dmesg\n function dmesg(s: string): void;\n\n /** Write a message and value (pointer) to DMESG debugging buffer. */\n //% shim=control::dmesgPtr\n function dmesgPtr(str: string, ptr: Object): void;\n}\ndeclare namespace control {\n\n /**\n * Force GC and dump basic information about heap.\n */\n //% shim=control::gc\n function gc(): void;\n\n /**\n * Force GC and halt waiting for debugger to do a full heap dump.\n */\n //% shim=control::heapDump\n function heapDump(): void;\n\n /**\n * Set flags used when connecting an external debugger.\n */\n //% shim=control::setDebugFlags\n function setDebugFlags(flags: int32): void;\n\n /**\n * Record a heap snapshot to debug memory leaks.\n */\n //% shim=control::heapSnapshot\n function heapSnapshot(): void;\n\n /**\n * Return true if profiling is enabled in the current build.\n */\n //% shim=control::profilingEnabled\n function profilingEnabled(): boolean;\n}\n\n\n\n //% color=#7600A8 weight=101 icon=\"\\uf205\"\ndeclare namespace led {\n\n /**\n * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED starting at 0\n * @param y the vertical coordinate of the LED starting at 0\n */\n //% help=led/plot weight=78\n //% blockId=device_plot block=\"plot|x %x|y %y\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::plot\n function plot(x: int32, y: int32): void;\n\n /**\n * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED starting at 0\n * @param y the vertical coordinate of the LED starting at 0\n * @param brightness the brightness from 0 (off) to 255 (bright), eg:255\n */\n //% help=led/plot-brightness weight=78\n //% blockId=device_plot_brightness block=\"plot|x %x|y %y|brightness %brightness\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1\n //% advanced=true shim=led::plotBrightness\n function plotBrightness(x: int32, y: int32, brightness: int32): void;\n\n /**\n * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n * @param x the horizontal coordinate of the LED\n * @param y the vertical coordinate of the LED\n */\n //% help=led/unplot weight=77\n //% blockId=device_unplot block=\"unplot|x %x|y %y\" blockGap=8\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::unplot\n function unplot(x: int32, y: int32): void;\n\n /**\n * Get the brightness state of the specified LED using x, y coordinates. (0,0) is upper left.\n * @param x the horizontal coordinate of the LED\n * @param y the vertical coordinate of the LED\n */\n //% help=led/point-brightness weight=76\n //% blockId=device_point_brightness block=\"point|x %x|y %y brightness\"\n //% parts=\"ledmatrix\"\n //% x.min=0 x.max=4 y.min=0 y.max=4\n //% x.fieldOptions.precision=1 y.fieldOptions.precision=1\n //% advanced=true shim=led::pointBrightness\n function pointBrightness(x: int32, y: int32): int32;\n\n /**\n * Get the screen brightness from 0 (off) to 255 (full bright).\n */\n //% help=led/brightness weight=60\n //% blockId=device_get_brightness block=\"brightness\" blockGap=8\n //% parts=\"ledmatrix\"\n //% advanced=true shim=led::brightness\n function brightness(): int32;\n\n /**\n * Set the screen brightness from 0 (off) to 255 (full bright).\n * @param value the brightness value, eg:255, 127, 0\n */\n //% help=led/set-brightness weight=59\n //% blockId=device_set_brightness block=\"set brightness %value\"\n //% parts=\"ledmatrix\"\n //% advanced=true\n //% value.min=0 value.max=255 shim=led::setBrightness\n function setBrightness(value: int32): void;\n\n /**\n * Cancels the current animation and clears other pending animations.\n */\n //% weight=50 help=led/stop-animation\n //% blockId=device_stop_animation block=\"stop animation\"\n //% parts=\"ledmatrix\"\n //% advanced=true shim=led::stopAnimation\n function stopAnimation(): void;\n\n /**\n * Sets the display mode between black and white and greyscale for rendering LEDs.\n * @param mode mode the display mode in which the screen operates\n */\n //% weight=1 help=led/set-display-mode\n //% parts=\"ledmatrix\" advanced=true weight=1\n //% blockId=\"led_set_display_mode\" block=\"set display mode $mode\" shim=led::setDisplayMode\n function setDisplayMode(mode: DisplayMode): void;\n\n /**\n * Gets the current display mode\n */\n //% weight=1 parts=\"ledmatrix\" advanced=true shim=led::displayMode\n function displayMode(): DisplayMode;\n\n /**\n * Turns on or off the display\n */\n //% help=led/enable blockId=device_led_enable block=\"led enable %on\"\n //% advanced=true parts=\"ledmatrix\" shim=led::enable\n function enable(on: boolean): void;\n\n /**\n * Takes a screenshot of the LED screen and returns an image.\n */\n //% help=led/screenshot\n //% parts=\"ledmatrix\" shim=led::screenshot\n function screenshot(): Image;\n}\ndeclare namespace music {\n\n /**\n * Set the default output volume of the sound synthesizer.\n * @param volume the volume 0...255\n */\n //% blockId=synth_set_volume block=\"set volume %volume\"\n //% volume.min=0 volume.max=255\n //%\n //% help=music/set-volume\n //% weight=70\n //% group=\"Volume\"\n //% blockGap=8 volume.defl=127 shim=music::setVolume\n function setVolume(volume?: int32): void;\n\n /**\n * Returns the current output volume of the sound synthesizer.\n */\n //% blockId=synth_get_volume block=\"volume\"\n //% help=music/volume\n //% weight=69\n //% group=\"Volume\"\n //% blockGap=8 shim=music::volume\n function volume(): int32;\n\n /**\n * Turn the built-in speaker on or off.\n * Disabling the speaker resets the sound pin to the default of P0.\n * @param enabled whether the built-in speaker is enabled in addition to the sound pin\n */\n //% blockId=music_set_built_in_speaker_enable block=\"set built-in speaker $enabled\"\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n //% help=music/set-built-in-speaker-enabled\n //% enabled.shadow=toggleOnOff\n //% weight=0 shim=music::setBuiltInSpeakerEnabled\n function setBuiltInSpeakerEnabled(enabled: boolean): void;\n\n /**\n * Defines an optional sample level to generate during periods of silence.\n **/\n //% group=\"micro:bit (V2)\"\n //% help=music/set-silence-level\n //% level.min=0\n //% level.max=1024\n //%\n //% weight=1 level.defl=0 shim=music::setSilenceLevel\n function setSilenceLevel(level?: int32): void;\n}\ndeclare namespace pins {\n\n /**\n * Read the specified pin or connector as either 0 or 1\n * @param name pin to read from, eg: DigitalPin.P0\n */\n //% help=pins/digital-read-pin weight=30\n //% blockId=device_get_digital_pin block=\"digital read|pin %name\" blockGap=8\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::digitalReadPin\n function digitalReadPin(name: DigitalPin): int32;\n\n /**\n * Set a pin or connector value to either 0 or 1.\n * @param name pin to write to, eg: DigitalPin.P0\n * @param value value to set on the pin, 1 eg,0\n */\n //% help=pins/digital-write-pin weight=29\n //% blockId=device_set_digital_pin block=\"digital write|pin %name|to %value\"\n //% value.min=0 value.max=1\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::digitalWritePin\n function digitalWritePin(name: DigitalPin, value: int32): void;\n\n /**\n * Read the connector value as analog, that is, as a value comprised between 0 and 1023.\n * @param name pin to write to, eg: AnalogPin.P0\n */\n //% help=pins/analog-read-pin weight=25\n //% blockId=device_get_analog_pin block=\"analog read|pin %name\" blockGap=\"8\"\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::analogReadPin\n function analogReadPin(name: AnalogPin): int32;\n\n /**\n * Set the connector value as analog. Value must be comprised between 0 and 1023.\n * @param name pin name to write to, eg: AnalogPin.P0\n * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0\n */\n //% help=pins/analog-write-pin weight=24\n //% blockId=device_set_analog_pin block=\"analog write|pin %name|to %value\" blockGap=8\n //% value.min=0 value.max=1023\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\" shim=pins::analogWritePin\n function analogWritePin(name: AnalogPin, value: int32): void;\n\n /**\n * Configure the pulse-width modulation (PWM) period of the analog output in microseconds.\n * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.\n * @param name analog pin to set period to, eg: AnalogPin.P0\n * @param micros period in micro seconds. eg:20000\n */\n //% help=pins/analog-set-period weight=23 blockGap=8\n //% blockId=device_set_analog_period block=\"analog set period|pin %pin|to (µs)%micros\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" shim=pins::analogSetPeriod\n function analogSetPeriod(name: AnalogPin, micros: int32): void;\n\n /**\n * Configure the pin as a digital input and generate an event when the pin is pulsed either high or low.\n * @param name digital pin to register to, eg: DigitalPin.P0\n * @param pulse the value of the pulse, eg: PulseValue.High\n */\n //% help=pins/on-pulsed advanced=true\n //% blockId=pins_on_pulsed block=\"on|pin %pin|pulsed %pulse\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pulse\"\n //% weight=25\n //% blockGap=8 shim=pins::onPulsed\n function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void;\n\n /**\n * Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler.\n */\n //% help=pins/pulse-duration advanced=true\n //% blockId=pins_pulse_duration block=\"pulse duration (µs)\"\n //% group=\"Pulse\"\n //% weight=24\n //% blockGap=8 shim=pins::pulseDuration\n function pulseDuration(): int32;\n\n /**\n * Return the duration of a pulse at a pin in microseconds.\n * @param name the pin which measures the pulse, eg: DigitalPin.P0\n * @param value the value of the pulse, eg: PulseValue.High\n * @param maximum duration in microseconds\n */\n //% blockId=\"pins_pulse_in\" block=\"pulse in (µs)|pin %name|pulsed %value\"\n //% advanced=true\n //% help=pins/pulse-in\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Pulse\"\n //% weight=23\n //% blockGap=8 maxDuration.defl=2000000 shim=pins::pulseIn\n function pulseIn(name: DigitalPin, value: PulseValue, maxDuration?: int32): int32;\n\n /**\n * Write a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).\n * @param name pin to write to, eg: AnalogPin.P0\n * @param value angle or rotation speed, eg:180,90,0\n */\n //% help=pins/servo-write-pin weight=20\n //% blockId=device_set_servo_pin block=\"servo write|pin %name|to %value\" blockGap=8\n //% parts=microservo trackArgs=0\n //% value.min=0 value.max=180\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Servo\" shim=pins::servoWritePin\n function servoWritePin(name: AnalogPin, value: int32): void;\n\n /**\n * Specifies that a continuous servo is connected.\n */\n //% shim=pins::servoSetContinuous\n function servoSetContinuous(name: AnalogPin, value: boolean): void;\n\n /**\n * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds.\n * @param name pin name\n * @param micros pulse duration in micro seconds, eg:1500\n */\n //% help=pins/servo-set-pulse weight=19\n //% blockId=device_set_servo_pulse block=\"servo set pulse|pin %value|to (µs) %micros\"\n //% value.fieldEditor=\"gridpicker\" value.fieldOptions.columns=4\n //% value.fieldOptions.tooltips=\"false\" value.fieldOptions.width=\"250\"\n //% group=\"Servo\" shim=pins::servoSetPulse\n function servoSetPulse(name: AnalogPin, micros: int32): void;\n\n /**\n * Set the pin used when using analog pitch or music.\n * @param name pin to modulate pitch from\n */\n //% blockId=device_analog_set_pitch_pin block=\"analog set pitch pin %name\"\n //% help=pins/analog-set-pitch-pin advanced=true\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=12\n //% blockGap=8 shim=pins::analogSetPitchPin\n function analogSetPitchPin(name: AnalogPin): void;\n\n /**\n * Sets the volume on the pitch pin\n * @param volume the intensity of the sound from 0..255\n */\n //% blockId=device_analog_set_pitch_volume block=\"analog set pitch volume $volume\"\n //% help=pins/analog-set-pitch-volume weight=3 advanced=true\n //% volume.min=0 volume.max=255\n //% deprecated shim=pins::analogSetPitchVolume\n function analogSetPitchVolume(volume: int32): void;\n\n /**\n * Gets the volume the pitch pin from 0..255\n */\n //% blockId=device_analog_pitch_volume block=\"analog pitch volume\"\n //% help=pins/analog-pitch-volume weight=3 advanced=true\n //% deprecated shim=pins::analogPitchVolume\n function analogPitchVolume(): int32;\n\n /**\n * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.\n * @param frequency frequency to modulate in Hz.\n * @param ms duration of the pitch in milli seconds.\n */\n //% blockId=device_analog_pitch block=\"analog pitch %frequency|for (ms) %ms\"\n //% help=pins/analog-pitch async advanced=true\n //% group=\"Pins\"\n //% weight=14\n //% blockGap=8 shim=pins::analogPitch\n function analogPitch(frequency: int32, ms: int32): void;\n\n /**\n * Configure the pull direction of of a pin.\n * @param name pin to set the pull mode on, eg: DigitalPin.P0\n * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp\n */\n //% help=pins/set-pull advanced=true\n //% blockId=device_set_pull block=\"set pull|pin %pin|to %pull\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=15\n //% blockGap=8 shim=pins::setPull\n function setPull(name: DigitalPin, pull: PinPullMode): void;\n\n /**\n * Configure the events emitted by this pin. Events can be subscribed to\n * using ``control.onEvent()``.\n * @param name pin to set the event mode on, eg: DigitalPin.P0\n * @param type the type of events for this pin to emit, eg: PinEventType.Edge\n */\n //% help=pins/set-events advanced=true\n //% blockId=device_set_pin_events block=\"set pin %pin|to emit %type|events\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% group=\"Pins\"\n //% weight=13\n //% blockGap=8 shim=pins::setEvents\n function setEvents(name: DigitalPin, type: PinEventType): void;\n\n /**\n * Create a new zero-initialized buffer.\n * @param size number of bytes in the buffer\n */\n //% shim=pins::createBuffer\n function createBuffer(size: int32): Buffer;\n\n /**\n * Set the matrix width for Neopixel strip (already assigned to a pin).\n * Should be used in conjunction with `set matrix width` from Neopixel package.\n * @param name pin of Neopixel strip, eg: DigitalPin.P1\n * @param value width of matrix (at least ``2``)\n */\n //% help=pins/neopixel-matrix-width advanced=true\n //% blockId=pin_neopixel_matrix_width block=\"neopixel matrix width|pin %pin %width\"\n //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"250\"\n //% width.min=2\n //% group=\"Pins\"\n //% weight=11\n //% blockGap=8 width.defl=5 shim=pins::setMatrixWidth\n function setMatrixWidth(pin: DigitalPin, width?: int32): void;\n\n /**\n * Read `size` bytes from a 7-bit I2C `address`.\n */\n //% repeat.defl=0 shim=pins::i2cReadBuffer\n function i2cReadBuffer(address: int32, size: int32, repeat?: boolean): Buffer;\n\n /**\n * Write bytes to a 7-bit I2C `address`.\n */\n //% repeat.defl=0 shim=pins::i2cWriteBuffer\n function i2cWriteBuffer(address: int32, buf: Buffer, repeat?: boolean): int32;\n\n /**\n * Write to the SPI slave and return the response\n * @param value Data to be sent to the SPI slave\n */\n //% help=pins/spi-write advanced=true\n //% blockId=spi_write block=\"spi write %value\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=53 shim=pins::spiWrite\n function spiWrite(value: int32): int32;\n\n /**\n * Write to and read from the SPI slave at the same time\n * @param command Data to be sent to the SPI slave (can be null)\n * @param response Data received from the SPI slave (can be null)\n */\n //% help=pins/spi-transfer argsNullable shim=pins::spiTransfer\n function spiTransfer(command: Buffer, response: Buffer): void;\n\n /**\n * Set the SPI frequency\n * @param frequency the clock frequency, eg: 1000000\n */\n //% help=pins/spi-frequency advanced=true\n //% blockId=spi_frequency block=\"spi frequency %frequency\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=55 shim=pins::spiFrequency\n function spiFrequency(frequency: int32): void;\n\n /**\n * Set the SPI bits and mode\n * @param bits the number of bits, eg: 8\n * @param mode the mode, eg: 3\n */\n //% help=pins/spi-format advanced=true\n //% blockId=spi_format block=\"spi format|bits %bits|mode %mode\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=54 shim=pins::spiFormat\n function spiFormat(bits: int32, mode: int32): void;\n\n /**\n * Set the MOSI, MISO, SCK pins used by the SPI connection\n *\n */\n //% help=pins/spi-pins advanced=true\n //% blockId=spi_pins block=\"spi set pins|MOSI %mosi|MISO %miso|SCK %sck\"\n //% mosi.fieldEditor=\"gridpicker\" mosi.fieldOptions.columns=4\n //% mosi.fieldOptions.tooltips=\"false\" mosi.fieldOptions.width=\"250\"\n //% miso.fieldEditor=\"gridpicker\" miso.fieldOptions.columns=4\n //% miso.fieldOptions.tooltips=\"false\" miso.fieldOptions.width=\"250\"\n //% sck.fieldEditor=\"gridpicker\" sck.fieldOptions.columns=4\n //% sck.fieldOptions.tooltips=\"false\" sck.fieldOptions.width=\"250\"\n //% group=\"SPI\"\n //% blockGap=8\n //% weight=51 shim=pins::spiPins\n function spiPins(mosi: DigitalPin, miso: DigitalPin, sck: DigitalPin): void;\n\n /**\n * Mounts a push button on the given pin\n */\n //% help=pins/push-button advanced=true shim=pins::pushButton\n function pushButton(pin: DigitalPin): void;\n\n /**\n * Set the pin used when producing sounds and melodies. Default is P0.\n * @param name pin to modulate pitch from\n */\n //% blockId=pin_set_audio_pin block=\"set audio pin $name\"\n //% help=pins/set-audio-pin\n //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"250\"\n //% weight=1\n //% blockGap=8 shim=pins::setAudioPin\n function setAudioPin(name: AnalogPin): void;\n\n /**\n * Sets whether or not audio will be output using a pin on the edge\n * connector.\n */\n //% blockId=pin_set_audio_pin_enabled\n //% block=\"set audio pin enabled $enabled\"\n //% weight=0 shim=pins::setAudioPinEnabled\n function setAudioPinEnabled(enabled: boolean): void;\n}\n\n\n\n //% weight=2 color=#002050 icon=\"\\uf287\"\n //% advanced=true\ndeclare namespace serial {\n\n /**\n * Read a line of text from the serial port and return the buffer when the delimiter is met.\n * @param delimiter text delimiter that separates each text chunk\n */\n //% help=serial/read-until\n //% blockId=serial_read_until block=\"serial|read until %delimiter=serial_delimiter_conv\"\n //% weight=19 shim=serial::readUntil\n function readUntil(delimiter: string): string;\n\n /**\n * Read the buffered received data as a string\n */\n //% help=serial/read-string\n //% blockId=serial_read_buffer block=\"serial|read string\"\n //% weight=18 shim=serial::readString\n function readString(): string;\n\n /**\n * Register an event to be fired when one of the delimiter is matched.\n * @param delimiters the characters to match received characters against.\n */\n //% help=serial/on-data-received\n //% weight=18 blockId=serial_on_data_received block=\"serial|on data received %delimiters=serial_delimiter_conv\" shim=serial::onDataReceived\n function onDataReceived(delimiters: string, body: () => void): void;\n\n /**\n * Send a piece of text through the serial connection.\n */\n //% help=serial/write-string\n //% weight=87 blockGap=8\n //% blockId=serial_writestring block=\"serial|write string %text\"\n //% text.shadowOptions.toString=true shim=serial::writeString\n function writeString(text: string): void;\n\n /**\n * Send a buffer through serial connection\n */\n //% blockId=serial_writebuffer block=\"serial|write buffer %buffer=serial_readbuffer\"\n //% help=serial/write-buffer advanced=true weight=6 shim=serial::writeBuffer\n function writeBuffer(buffer: Buffer): void;\n\n /**\n * Read multiple characters from the receive buffer. \n * If length is positive, pauses until enough characters are present.\n * @param length default buffer length\n */\n //% blockId=serial_readbuffer block=\"serial|read buffer %length\"\n //% help=serial/read-buffer advanced=true weight=5 shim=serial::readBuffer\n function readBuffer(length: int32): Buffer;\n\n /**\n * Set the serial input and output to use pins instead of the USB connection.\n * @param tx the new transmission pin, eg: SerialPin.P0\n * @param rx the new reception pin, eg: SerialPin.P1\n * @param rate the new baud rate. eg: 115200\n */\n //% weight=10\n //% help=serial/redirect\n //% blockId=serial_redirect block=\"serial|redirect to|TX %tx|RX %rx|at baud rate %rate\"\n //% blockExternalInputs=1\n //% tx.fieldEditor=\"gridpicker\" tx.fieldOptions.columns=3\n //% tx.fieldOptions.tooltips=\"false\"\n //% rx.fieldEditor=\"gridpicker\" rx.fieldOptions.columns=3\n //% rx.fieldOptions.tooltips=\"false\"\n //% blockGap=8 shim=serial::redirect\n function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void;\n\n /**\n Set the baud rate of the serial port\n */\n //% weight=10\n //% blockId=serial_setbaudrate block=\"serial|set baud rate %rate\"\n //% blockGap=8 inlineInputMode=inline\n //% help=serial/set-baud-rate\n //% group=\"Configuration\" advanced=true shim=serial::setBaudRate\n function setBaudRate(rate: BaudRate): void;\n\n /**\n * Direct the serial input and output to use the USB connection.\n */\n //% weight=9 help=serial/redirect-to-usb\n //% blockId=serial_redirect_to_usb block=\"serial|redirect to USB\" shim=serial::redirectToUSB\n function redirectToUSB(): void;\n\n /**\n * Sets the size of the RX buffer in bytes\n * @param size length of the rx buffer in bytes, eg: 32\n */\n //% help=serial/set-rx-buffer-size\n //% blockId=serialSetRxBufferSize block=\"serial set rx buffer size to $size\"\n //% advanced=true shim=serial::setRxBufferSize\n function setRxBufferSize(size: uint8): void;\n\n /**\n * Sets the size of the TX buffer in bytes\n * @param size length of the tx buffer in bytes, eg: 32\n */\n //% help=serial/set-tx-buffer-size\n //% blockId=serialSetTxBufferSize block=\"serial set tx buffer size to $size\"\n //% advanced=true shim=serial::setTxBufferSize\n function setTxBufferSize(size: uint8): void;\n}\n\n\n\n //% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte\ndeclare interface Buffer {\n /**\n * Reads an unsigned byte at a particular location\n */\n //% shim=BufferMethods::getUint8\n getUint8(off: int32): int32;\n\n /**\n * Returns false when the buffer can be written to.\n */\n //% shim=BufferMethods::isReadOnly\n isReadOnly(): boolean;\n\n /**\n * Writes an unsigned byte at a particular location\n */\n //% shim=BufferMethods::setUint8\n setUint8(off: int32, v: int32): void;\n\n /**\n * Write a number in specified format in the buffer.\n */\n //% shim=BufferMethods::setNumber\n setNumber(format: NumberFormat, offset: int32, value: number): void;\n\n /**\n * Read a number in specified format from the buffer.\n */\n //% shim=BufferMethods::getNumber\n getNumber(format: NumberFormat, offset: int32): number;\n\n /** Returns the length of a Buffer object. */\n //% property shim=BufferMethods::length\n length: int32;\n\n /**\n * Fill (a fragment) of the buffer with given value.\n */\n //% offset.defl=0 length.defl=-1 shim=BufferMethods::fill\n fill(value: int32, offset?: int32, length?: int32): void;\n\n /**\n * Return a copy of a fragment of a buffer.\n */\n //% offset.defl=0 length.defl=-1 shim=BufferMethods::slice\n slice(offset?: int32, length?: int32): Buffer;\n\n /**\n * Shift buffer left in place, with zero padding.\n * @param offset number of bytes to shift; use negative value to shift right\n * @param start start offset in buffer. Default is 0.\n * @param length number of elements in buffer. If negative, length is set as the buffer length minus\n * start. eg: -1\n */\n //% start.defl=0 length.defl=-1 shim=BufferMethods::shift\n shift(offset: int32, start?: int32, length?: int32): void;\n\n /**\n * Convert a buffer to string assuming UTF8 encoding\n */\n //% shim=BufferMethods::toString\n toString(): string;\n\n /**\n * Convert a buffer to its hexadecimal representation.\n */\n //% shim=BufferMethods::toHex\n toHex(): string;\n\n /**\n * Rotate buffer left in place.\n * @param offset number of bytes to shift; use negative value to shift right\n * @param start start offset in buffer. Default is 0.\n * @param length number of elements in buffer. If negative, length is set as the buffer length minus\n * start. eg: -1\n */\n //% start.defl=0 length.defl=-1 shim=BufferMethods::rotate\n rotate(offset: int32, start?: int32, length?: int32): void;\n\n /**\n * Write contents of `src` at `dstOffset` in current buffer.\n */\n //% shim=BufferMethods::write\n write(dstOffset: int32, src: Buffer): void;\n\n /**\n * Compute k-bit FNV-1 non-cryptographic hash of the buffer.\n */\n //% shim=BufferMethods::hash\n hash(bits: int32): uint32;\n}\ndeclare namespace control {\n\n /**\n * Create a new zero-initialized buffer.\n * @param size number of bytes in the buffer\n */\n //% deprecated=1 shim=control::createBuffer\n function createBuffer(size: int32): Buffer;\n\n /**\n * Create a new buffer with UTF8-encoded string\n * @param str the string to put in the buffer\n */\n //% deprecated=1 shim=control::createBufferFromUTF8\n function createBufferFromUTF8(str: string): Buffer;\n}\ndeclare namespace light {\n\n /**\n * Sends a color buffer to a light strip\n **/\n //% advanced=true shim=light::sendWS2812Buffer\n function sendWS2812Buffer(buf: Buffer, pin: int32): void;\n\n /**\n * Sends a color buffer to a light strip\n **/\n //% advanced=true shim=light::sendWS2812BufferWithBrightness\n function sendWS2812BufferWithBrightness(buf: Buffer, pin: int32, brightness: int32): void;\n\n /**\n * Sets the light mode of a pin\n **/\n //% advanced=true\n //% shim=light::setMode\n function setMode(pin: int32, mode: int32): void;\n}\ndeclare namespace input {\n\n /**\n * Do something when the logo is touched and released again.\n * @param body the code to run when the logo is pressed\n */\n //% weight=83 blockGap=32\n //% blockId=input_logo_event block=\"on logo $action\"\n //% group=\"micro:bit (V2)\"\n //% parts=\"logotouch\"\n //% help=\"input/on-logo-event\" shim=input::onLogoEvent\n function onLogoEvent(action: TouchButtonEvent, body: () => void): void;\n\n /**\n * Get the logo state (pressed or not).\n */\n //% weight=58\n //% blockId=\"input_logo_is_pressed\" block=\"logo is pressed\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\"\n //% parts=\"logotouch\"\n //% help=\"input/logo-is-pressed\" shim=input::logoIsPressed\n function logoIsPressed(): boolean;\n}\ndeclare namespace pins {\n\n /**\n * Configure the touch detection for the pins and logo.\n * P0, P1, P2 use resistive touch by default.\n * The logo uses capacitative touch by default.\n * @param name target to change the touch mode for\n * @param mode the touch mode to use\n */\n //% weight=60\n //% blockId=device_touch_set_type block=\"set %name to touch mode %mode\"\n //% advanced=true\n //% group=\"micro:bit (V2)\"\n //% help=pins/touch-set-mode shim=pins::touchSetMode\n function touchSetMode(name: TouchTarget, mode: TouchTargetMode): void;\n}\ndeclare namespace music {\n\n /**\n * Internal use only\n **/\n //% async shim=music::__playSoundExpression\n function __playSoundExpression(nodes: string, waitTillDone: boolean): void;\n\n /**\n * Internal use only\n */\n //% shim=music::__stopSoundExpressions\n function __stopSoundExpressions(): void;\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2780
2780
|
"soundexpressions.cpp": "#include \"pxt.h\"\r\n\r\nnamespace music {\r\n /**\r\n * Internal use only\r\n **/\r\n //% async\r\n void __playSoundExpression(String nodes, bool waitTillDone) {\r\n#if MICROBIT_CODAL\r\n if (waitTillDone)\r\n uBit.audio.soundExpressions.play(MSTR(nodes));\r\n else\r\n uBit.audio.soundExpressions.playAsync(MSTR(nodes));\r\n#else\r\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\r\n#endif\r\n }\r\n\r\n /**\r\n * Internal use only\r\n */\r\n //% \r\n void __stopSoundExpressions() {\r\n#if MICROBIT_CODAL\r\n uBit.audio.soundExpressions.stop();\r\n#endif\r\n }\r\n}",
|
|
2781
|
-
"soundexpressions.ts": "/**\n * A sound expression.\n */\n//% fixedInstances\n//% blockNamespace=music\n//% group=\"micro:bit (V2)\"\nclass SoundExpression {\n constructor(private notes: string) {\n }\n\n /**\n * Starts to play a sound expression.\n */\n //% block=\"play sound $this\"\n //% weight=80\n //% blockGap=8\n //% help=music/play\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n play() {\n music.__playSoundExpression(this.notes, false)\n }\n\n /**\n * Plays a sound expression until finished\n */\n //% block=\"play sound $this until done\"\n //% weight=81\n //% blockGap=8\n //% help=music/play-until-done\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n playUntilDone() {\n music.__playSoundExpression(this.notes, true)\n }\n}\n\nenum WaveShape {\n Sine = 0,\n Sawtooth = 1,\n Triangle = 2,\n Square = 3,\n Noise = 4\n}\n\nenum InterpolationCurve {\n None,\n Linear,\n Curve,\n Logarithmic\n}\n\nenum SoundExpressionEffect {\n None = 0,\n Vibrato = 1,\n Tremolo = 2,\n Warble = 3\n}\n\nnamespace soundExpression {\n //% fixedInstance whenUsed block=\"{id:soundexpression}giggle\"\n export const giggle = new SoundExpression(\"giggle\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}happy\"\n export const happy = new SoundExpression(\"happy\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}hello\"\n export const hello = new SoundExpression(\"hello\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}mysterious\"\n export const mysterious = new SoundExpression(\"mysterious\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}sad\"\n export const sad = new SoundExpression(\"sad\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}slide\"\n export const slide = new SoundExpression(\"slide\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}soaring\"\n export const soaring = new SoundExpression(\"soaring\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}spring\"\n export const spring = new SoundExpression(\"spring\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}twinkle\"\n export const twinkle = new SoundExpression(\"twinkle\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}yawn\"\n export const yawn = new SoundExpression(\"yawn\");\n\n export enum InterpolationEffect {\n None = 0,\n Linear = 1,\n Curve = 2,\n ExponentialRising = 5,\n ExponentialFalling = 6,\n ArpeggioRisingMajor = 8,\n ArpeggioRisingMinor = 10,\n ArpeggioRisingDiminished = 12,\n ArpeggioRisingChromatic = 14,\n ArpeggioRisingWholeTone = 16,\n ArpeggioFallingMajor = 9,\n ArpeggioFallingMinor = 11,\n ArpeggioFallingDiminished = 13,\n ArpeggioFallingChromatic = 15,\n ArpeggioFallingWholeTone = 17,\n Logarithmic = 18\n }\n\n export class Sound {\n src: string;\n\n constructor() {\n this.src = \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n }\n\n get wave(): WaveShape {\n return this.getValue(0, 1);\n }\n\n set wave(value: WaveShape) {\n this.setValue(0, Math.constrain(value, 0, 4), 1);\n }\n\n get volume() {\n return this.getValue(1, 4);\n }\n\n set volume(value: number) {\n this.setValue(1, Math.constrain(value, 0, 1023), 4);\n }\n\n get frequency() {\n return this.getValue(5, 4);\n }\n\n set frequency(value: number) {\n this.setValue(5, value, 4);\n }\n\n get duration() {\n return this.getValue(9, 4);\n }\n\n set duration(value: number) {\n this.setValue(9, value, 4);\n }\n\n get shape(): InterpolationEffect {\n return this.getValue(13, 2);\n }\n\n set shape(value: InterpolationEffect) {\n this.setValue(13, value, 2);\n }\n\n get endFrequency() {\n return this.getValue(18, 4);\n }\n\n set endFrequency(value: number) {\n this.setValue(18, value, 4);\n }\n\n get endVolume() {\n return this.getValue(26, 4);\n }\n\n set endVolume(value: number) {\n this.setValue(26, Math.constrain(value, 0, 1023), 4);\n }\n\n get steps() {\n return this.getValue(30, 4);\n }\n\n set steps(value: number) {\n this.setValue(30, value, 4);\n }\n\n get fx(): SoundExpressionEffect {\n return this.getValue(34, 2);\n }\n\n set fx(value: SoundExpressionEffect) {\n this.setValue(34, Math.constrain(value, 0, 3), 2);\n }\n\n get fxParam() {\n return this.getValue(36, 4);\n }\n\n set fxParam(value: number) {\n this.setValue(36, value, 4);\n }\n\n get fxnSteps() {\n return this.getValue(40, 4);\n }\n\n set fxnSteps(value: number) {\n this.setValue(40, value, 4);\n }\n\n get frequencyRandomness() {\n return this.getValue(44, 4);\n }\n\n set frequencyRandomness(value: number) {\n this.setValue(44, value, 4);\n }\n\n get endFrequencyRandomness() {\n return this.getValue(48, 4);\n }\n\n set endFrequencyRandomness(value: number) {\n this.setValue(48, value, 4);\n }\n\n get volumeRandomness() {\n return this.getValue(52, 4);\n }\n\n set volumeRandomness(value: number) {\n this.setValue(52, value, 4);\n }\n\n get endVolumeRandomness() {\n return this.getValue(56, 4);\n }\n\n set endVolumeRandomness(value: number) {\n this.setValue(56, value, 4);\n }\n\n get durationRandomness() {\n return this.getValue(60, 4);\n }\n\n set durationRandomness(value: number) {\n this.setValue(60, value, 4);\n }\n\n get fxParamRandomness() {\n return this.getValue(64, 4);\n }\n\n set fxParamRandomness(value: number) {\n this.setValue(64, value, 4);\n }\n\n get fxnStepsRandomness() {\n return this.getValue(68, 4);\n }\n\n set fxnStepsRandomness(value: number) {\n this.setValue(68, value, 4);\n }\n\n copy() {\n const result = new Sound();\n result.src = this.src.slice(0);\n return result;\n }\n\n protected setValue(offset: number, value: number, length: number) {\n value = Math.constrain(value | 0, 0, Math.pow(10, length) - 1);\n this.src = this.src.substr(0, offset) + formatNumber(value, length) + this.src.substr(offset + length);\n }\n\n protected getValue(offset: number, length: number) {\n return parseInt(this.src.substr(offset, length));\n }\n }\n\n function formatNumber(num: number, length: number) {\n let result = num + \"\";\n while (result.length < length) result = \"0\" + result;\n return result;\n }\n\n export function playSound(toPlay: Sound | Sound[]) {\n let src = \"\";\n if (Array.isArray(toPlay)) {\n src = (toPlay as Sound[]).map(s => s.src).join(\",\");\n }\n else {\n src = (toPlay as Sound).src;\n }\n\n new SoundExpression(src).playUntilDone();\n }\n\n //% blockId=soundExpression_playSoundEffect\n //% blockNamespace=music\n //% block=\"play sound $sound\"\n //% sound.shadow=soundExpression_createSoundEffect\n //% weight=101\n //% blockGap=8\n export function playSoundEffect(sound: soundExpression.Sound) {\n soundExpression.playSound(sound);\n }\n\n //% blockId=soundExpression_createSoundEffect\n //% blockNamespace=music\n //% block=\"$waveShape|| start frequency $startFrequency end frequency $endFrequency duration $duration start volume $startVolume end volume $endVolume effect $effect interpolation $interpolation\"\n //% waveShape.defl=WaveShape.Sine\n //% waveShape.fieldEditor=soundeffect\n //% startFrequency.defl=2000\n //% endFrequency.defl=0\n //% startVolume.defl=1023\n //% endVolume.defl=0\n //% duration.defl=500\n //% effect.defl=SoundExpressionEffect.None\n //% interpolation.defl=InterpolationCurve.Linear\n //% compileHiddenArguments=true\n //% inlineInputMode=\"variable\"\n export function createSoundEffect(waveShape: WaveShape, startFrequency: number, endFrequency: number, startVolume: number, endVolume: number, duration: number, effect: SoundExpressionEffect, interpolation: InterpolationCurve) {\n const sound = new soundExpression.Sound();\n sound.wave = waveShape;\n sound.frequency = startFrequency;\n sound.volume = startVolume;\n sound.endFrequency = endFrequency;\n sound.endVolume = endVolume;\n sound.duration = duration;\n sound.fx = effect;\n\n switch (interpolation) {\n case InterpolationCurve.None:\n sound.shape = soundExpression.InterpolationEffect.None;\n sound.steps = 128;\n break;\n case InterpolationCurve.Linear:\n sound.shape = soundExpression.InterpolationEffect.Linear;\n sound.steps = 128;\n break;\n case InterpolationCurve.Curve:\n sound.shape = soundExpression.InterpolationEffect.Curve;\n sound.steps = 90;\n break;\n case InterpolationCurve.Logarithmic:\n sound.shape = soundExpression.InterpolationEffect.Logarithmic;\n sound.steps = 90;\n break;\n }\n\n switch (sound.fx) {\n case SoundExpressionEffect.Vibrato:\n sound.fxnSteps = 512;\n sound.fxParam = 2;\n break;\n case SoundExpressionEffect.Tremolo:\n sound.fxnSteps = 900;\n sound.fxParam = 3;\n break;\n case SoundExpressionEffect.Warble:\n sound.fxnSteps = 700;\n sound.fxParam = 2;\n break;\n }\n\n return sound;\n }\n}",
|
|
2781
|
+
"soundexpressions.ts": "/**\n * A sound expression.\n */\n//% fixedInstances\n//% blockNamespace=music\n//% group=\"micro:bit (V2)\"\nclass SoundExpression {\n constructor(private notes: string) {\n }\n\n /**\n * Starts to play a sound expression.\n */\n //% block=\"play sound $this\"\n //% weight=80\n //% blockGap=8\n //% help=music/play\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n //% deprecated=1\n play() {\n music.__playSoundExpression(this.notes, false)\n }\n\n /**\n * Plays a sound expression until finished\n */\n //% block=\"play sound $this until done\"\n //% weight=81\n //% blockGap=8\n //% help=music/play-until-done\n //% group=\"micro:bit (V2)\"\n //% parts=builtinspeaker\n //% deprecated=1\n playUntilDone() {\n music.__playSoundExpression(this.notes, true)\n }\n\n getNotes() {\n return this.notes;\n }\n}\n\nenum WaveShape {\n Sine = 0,\n Sawtooth = 1,\n Triangle = 2,\n Square = 3,\n Noise = 4\n}\n\nenum InterpolationCurve {\n Linear,\n Curve,\n Logarithmic\n}\n\nenum SoundExpressionEffect {\n None = 0,\n Vibrato = 1,\n Tremolo = 2,\n Warble = 3\n}\n\nenum SoundExpressionPlayMode {\n //% block=\"until done\"\n UntilDone,\n //% block=\"in background\"\n InBackground\n}\n\nnamespace soundExpression {\n //% fixedInstance whenUsed block=\"{id:soundexpression}giggle\"\n export const giggle = new SoundExpression(\"giggle\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}happy\"\n export const happy = new SoundExpression(\"happy\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}hello\"\n export const hello = new SoundExpression(\"hello\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}mysterious\"\n export const mysterious = new SoundExpression(\"mysterious\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}sad\"\n export const sad = new SoundExpression(\"sad\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}slide\"\n export const slide = new SoundExpression(\"slide\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}soaring\"\n export const soaring = new SoundExpression(\"soaring\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}spring\"\n export const spring = new SoundExpression(\"spring\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}twinkle\"\n export const twinkle = new SoundExpression(\"twinkle\");\n //% fixedInstance whenUsed block=\"{id:soundexpression}yawn\"\n export const yawn = new SoundExpression(\"yawn\");\n\n export enum InterpolationEffect {\n None = 0,\n Linear = 1,\n Curve = 2,\n ExponentialRising = 5,\n ExponentialFalling = 6,\n ArpeggioRisingMajor = 8,\n ArpeggioRisingMinor = 10,\n ArpeggioRisingDiminished = 12,\n ArpeggioRisingChromatic = 14,\n ArpeggioRisingWholeTone = 16,\n ArpeggioFallingMajor = 9,\n ArpeggioFallingMinor = 11,\n ArpeggioFallingDiminished = 13,\n ArpeggioFallingChromatic = 15,\n ArpeggioFallingWholeTone = 17,\n Logarithmic = 18\n }\n\n export class Sound {\n src: string;\n\n constructor() {\n this.src = \"000000000000000000000000000000000000000000000000000000000000000000000000\"\n }\n\n get wave(): WaveShape {\n return this.getValue(0, 1);\n }\n\n set wave(value: WaveShape) {\n this.setValue(0, Math.constrain(value, 0, 4), 1);\n }\n\n get volume() {\n return this.getValue(1, 4);\n }\n\n set volume(value: number) {\n this.setValue(1, Math.constrain(value, 0, 1023), 4);\n }\n\n get frequency() {\n return this.getValue(5, 4);\n }\n\n set frequency(value: number) {\n this.setValue(5, value, 4);\n }\n\n get duration() {\n return this.getValue(9, 4);\n }\n\n set duration(value: number) {\n this.setValue(9, value, 4);\n }\n\n get shape(): InterpolationEffect {\n return this.getValue(13, 2);\n }\n\n set shape(value: InterpolationEffect) {\n this.setValue(13, value, 2);\n }\n\n get endFrequency() {\n return this.getValue(18, 4);\n }\n\n set endFrequency(value: number) {\n this.setValue(18, value, 4);\n }\n\n get endVolume() {\n return this.getValue(26, 4);\n }\n\n set endVolume(value: number) {\n this.setValue(26, Math.constrain(value, 0, 1023), 4);\n }\n\n get steps() {\n return this.getValue(30, 4);\n }\n\n set steps(value: number) {\n this.setValue(30, value, 4);\n }\n\n get fx(): SoundExpressionEffect {\n return this.getValue(34, 2);\n }\n\n set fx(value: SoundExpressionEffect) {\n this.setValue(34, Math.constrain(value, 0, 3), 2);\n }\n\n get fxParam() {\n return this.getValue(36, 4);\n }\n\n set fxParam(value: number) {\n this.setValue(36, value, 4);\n }\n\n get fxnSteps() {\n return this.getValue(40, 4);\n }\n\n set fxnSteps(value: number) {\n this.setValue(40, value, 4);\n }\n\n get frequencyRandomness() {\n return this.getValue(44, 4);\n }\n\n set frequencyRandomness(value: number) {\n this.setValue(44, value, 4);\n }\n\n get endFrequencyRandomness() {\n return this.getValue(48, 4);\n }\n\n set endFrequencyRandomness(value: number) {\n this.setValue(48, value, 4);\n }\n\n get volumeRandomness() {\n return this.getValue(52, 4);\n }\n\n set volumeRandomness(value: number) {\n this.setValue(52, value, 4);\n }\n\n get endVolumeRandomness() {\n return this.getValue(56, 4);\n }\n\n set endVolumeRandomness(value: number) {\n this.setValue(56, value, 4);\n }\n\n get durationRandomness() {\n return this.getValue(60, 4);\n }\n\n set durationRandomness(value: number) {\n this.setValue(60, value, 4);\n }\n\n get fxParamRandomness() {\n return this.getValue(64, 4);\n }\n\n set fxParamRandomness(value: number) {\n this.setValue(64, value, 4);\n }\n\n get fxnStepsRandomness() {\n return this.getValue(68, 4);\n }\n\n set fxnStepsRandomness(value: number) {\n this.setValue(68, value, 4);\n }\n\n copy() {\n const result = new Sound();\n result.src = this.src.slice(0);\n return result;\n }\n\n protected setValue(offset: number, value: number, length: number) {\n value = Math.constrain(value | 0, 0, Math.pow(10, length) - 1);\n this.src = this.src.substr(0, offset) + formatNumber(value, length) + this.src.substr(offset + length);\n }\n\n protected getValue(offset: number, length: number) {\n return parseInt(this.src.substr(offset, length));\n }\n }\n\n function formatNumber(num: number, length: number) {\n let result = num + \"\";\n while (result.length < length) result = \"0\" + result;\n return result;\n }\n\n export function playSound(toPlay: Sound | Sound[]) {\n let src = \"\";\n if (Array.isArray(toPlay)) {\n src = (toPlay as Sound[]).map(s => s.src).join(\",\");\n }\n else {\n src = (toPlay as Sound).src;\n }\n\n new SoundExpression(src).playUntilDone();\n }\n}\n\nnamespace music {\n //% blockId=soundExpression_playSoundEffect\n //% block=\"play sound $sound $mode\"\n //% sound.shadow=soundExpression_createSoundEffect\n //% weight=100\n //% blockGap=8\n //% group=\"micro:bit (V2)\"\n export function playSoundEffect(sound: string, mode: SoundExpressionPlayMode) {\n if (mode === SoundExpressionPlayMode.InBackground) {\n new SoundExpression(sound).play();\n }\n else {\n new SoundExpression(sound).playUntilDone();\n }\n }\n\n //% blockId=soundExpression_createSoundEffect\n //% block=\"$waveShape|| start frequency $startFrequency end frequency $endFrequency duration $duration start volume $startVolume end volume $endVolume effect $effect interpolation $interpolation\"\n //% waveShape.defl=WaveShape.Sine\n //% waveShape.fieldEditor=soundeffect\n //% startFrequency.defl=2000\n //% endFrequency.defl=0\n //% startVolume.defl=1023\n //% endVolume.defl=0\n //% duration.defl=500\n //% effect.defl=SoundExpressionEffect.None\n //% interpolation.defl=InterpolationCurve.Linear\n //% compileHiddenArguments=true\n //% inlineInputMode=\"variable\"\n //% group=\"micro:bit (V2)\"\n export function createSoundEffect(waveShape: WaveShape, startFrequency: number, endFrequency: number, startVolume: number, endVolume: number, duration: number, effect: SoundExpressionEffect, interpolation: InterpolationCurve): string {\n const sound = new soundExpression.Sound();\n sound.wave = waveShape;\n sound.frequency = startFrequency;\n sound.volume = startVolume;\n sound.endFrequency = endFrequency;\n sound.endVolume = endVolume;\n sound.duration = duration;\n sound.fx = effect;\n\n switch (interpolation) {\n case InterpolationCurve.Linear:\n sound.shape = soundExpression.InterpolationEffect.Linear;\n sound.steps = 128;\n break;\n case InterpolationCurve.Curve:\n sound.shape = soundExpression.InterpolationEffect.Curve;\n sound.steps = 90;\n break;\n case InterpolationCurve.Logarithmic:\n sound.shape = soundExpression.InterpolationEffect.Logarithmic;\n sound.steps = 90;\n break;\n }\n\n switch (sound.fx) {\n case SoundExpressionEffect.Vibrato:\n sound.fxnSteps = 512;\n sound.fxParam = 2;\n break;\n case SoundExpressionEffect.Tremolo:\n sound.fxnSteps = 900;\n sound.fxParam = 3;\n break;\n case SoundExpressionEffect.Warble:\n sound.fxnSteps = 700;\n sound.fxParam = 2;\n break;\n }\n\n return sound.src;\n }\n\n //% blockId=soundExpression_builtinSoundEffect\n //% block=\"$soundExpression\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\"\n //% toolboxParent=soundExpression_playSoundEffect\n //% toolboxParentArgument=sound\n //% weight=102\n export function builtinSoundEffect(soundExpression: SoundExpression) {\n return soundExpression.getNotes();\n }\n}",
|
|
2782
2782
|
"templates.ts": "/**\n * Tagged hex literal converter\n */\n//% shim=@hex\nfunction hex(lits: any, ...args: any[]): Buffer { return null }\n",
|
|
2783
2783
|
"touchmode.cpp": "#include \"pxt.h\"\n\n#if MICROBIT_CODAL\n#else\n#define MICROBIT_ID_LOGO 121\n#endif\n\nenum class TouchTargetMode {\n //% block=\"capacitive\"\n Capacitive = 1,\n //% block=\"resistive\"\n Resistive = 0\n};\n\nenum class TouchTarget {\n //% block=\"P0\"\n P0 = MICROBIT_ID_IO_P0,\n //% block=\"P1\"\n P1 = MICROBIT_ID_IO_P1,\n //% block=\"P2\"\n P2 = MICROBIT_ID_IO_P2,\n //% block=\"logo\"\n LOGO = MICROBIT_ID_LOGO\n};\n\nnamespace pins {\n\n /**\n * Configure the touch detection for the pins and logo.\n * P0, P1, P2 use resistive touch by default.\n * The logo uses capacitative touch by default.\n * @param name target to change the touch mode for\n * @param mode the touch mode to use\n */\n //% weight=60\n //% blockId=device_touch_set_type block=\"set %name to touch mode %mode\"\n //% advanced=true\n //% group=\"micro:bit (V2)\"\n //% help=pins/touch-set-mode\n void touchSetMode(TouchTarget name, TouchTargetMode mode) {\n #if MICROBIT_CODAL\n const auto pin = name == TouchTarget::LOGO \n ? &uBit.io.logo : getPin((int)name);\n if (pin) {\n pin->isTouched(mode == TouchTargetMode::Capacitive \n ? codal::TouchMode::Capacitative : codal::TouchMode::Resistive);\n }\n #else\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n #endif\n }\n\n}",
|
|
2784
2784
|
"trig.cpp": "#include \"pxtbase.h\"\n#include <limits.h>\n#include <stdlib.h>\n\nusing namespace std;\n\nnamespace Math_ {\n\n#define SINGLE(op) return fromDouble(::op(toDouble(x)));\n\n//%\nTNumber atan2(TNumber y, TNumber x) {\n return fromDouble(::atan2(toDouble(y), toDouble(x)));\n}\n\n//%\nTNumber tan(TNumber x){SINGLE(tan)}\n\n//%\nTNumber sin(TNumber x){SINGLE(sin)}\n\n//%\nTNumber cos(TNumber x){SINGLE(cos)}\n\n//%\nTNumber atan(TNumber x){SINGLE(atan)}\n\n//%\nTNumber asin(TNumber x){SINGLE(asin)}\n\n//%\nTNumber acos(TNumber x){SINGLE(acos)}\n\n//%\nTNumber sqrt(TNumber x){SINGLE(sqrt)}\n\n}"
|
|
@@ -2786,7 +2786,7 @@ var pxtTargetBundle = {
|
|
|
2786
2786
|
"radio": {
|
|
2787
2787
|
"README.md": "# radio\n\nThe radio library.\n\n",
|
|
2788
2788
|
"enums.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace radio {\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2789
|
-
"pxt.json": "{\n \"name\": \"radio\",\n \"description\": \"The radio services\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"shims.d.ts\",\n \"enums.d.ts\",\n \"radio.cpp\",\n \"radio.ts\",\n \"targetoverrides.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2789
|
+
"pxt.json": "{\n \"name\": \"radio\",\n \"description\": \"The radio services\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"shims.d.ts\",\n \"enums.d.ts\",\n \"radio.cpp\",\n \"radio.ts\",\n \"targetoverrides.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"yotta\": {\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"enabled\": 0\n }\n }\n }\n },\n \"icon\": \"/static/libs/radio.png\"\n}\n",
|
|
2790
2790
|
"radio.cpp": "#include \"pxt.h\"\n\n// micro:bit dal\n#if defined(MICROBIT_H) \n\n#define CODAL_RADIO MicroBitRadio\n#define DEVICE_OK MICROBIT_OK\n#define DEVICE_NOT_SUPPORTED MICROBIT_NOT_SUPPORTED\n#define CODAL_EVENT MicroBitEvent\n#define CODAL_RADIO_MICROBIT_DAL 1\n\n// any other NRF52 board\n#elif defined(NRF52_SERIES)\n\n#include \"NRF52Radio.h\"\n#define CODAL_RADIO codal::NRF52Radio\n#define CODAL_EVENT codal::Event\n\n#endif\n\nusing namespace pxt;\n\n#ifndef MICROBIT_RADIO_MAX_PACKET_SIZE\n#define MICROBIT_RADIO_MAX_PACKET_SIZE 32\n#endif\n\n#ifndef DEVICE_RADIO_MAX_PACKET_SIZE\n#define DEVICE_RADIO_MAX_PACKET_SIZE MICROBIT_RADIO_MAX_PACKET_SIZE\n#endif\n\n#ifndef MICROBIT_ID_RADIO\n#define MICROBIT_ID_RADIO 29\n#endif\n\n#ifndef DEVICE_ID_RADIO\n#define DEVICE_ID_RADIO MICROBIT_ID_RADIO\n#endif\n\n#ifndef MICROBIT_RADIO_EVT_DATAGRAM\n#define MICROBIT_RADIO_EVT_DATAGRAM 1 // Event to signal that a new datagram has been received.\n#endif\n\n#ifndef DEVICE_RADIO_EVT_DATAGRAM\n#define DEVICE_RADIO_EVT_DATAGRAM MICROBIT_RADIO_EVT_DATAGRAM\n#endif\n\n//% color=#E3008C weight=96 icon=\"\\uf012\"\nnamespace radio {\n \n#if CODAL_RADIO_MICROBIT_DAL\n CODAL_RADIO* getRadio() {\n return &uBit.radio;\n }\n#elif defined(CODAL_RADIO)\nclass RadioWrap {\n CODAL_RADIO radio;\n public:\n RadioWrap() \n : radio()\n {}\n\n CODAL_RADIO* getRadio() {\n return &radio;\n }\n};\nSINGLETON(RadioWrap);\nCODAL_RADIO* getRadio() {\n auto wrap = getRadioWrap();\n if (NULL != wrap)\n return wrap->getRadio(); \n return NULL;\n}\n#endif // #else\n\n bool radioEnabled = false;\n bool init = false;\n int radioEnable() {\n#ifdef CODAL_RADIO\n auto radio = getRadio();\n if (NULL == radio) \n return DEVICE_NOT_SUPPORTED;\n\n if (init && !radioEnabled) {\n //If radio was explicitly disabled from a call to off API\n //We don't want to enable it here. User needs to call on API first.\n return DEVICE_NOT_SUPPORTED;\n }\n\n int r = radio->enable();\n if (r != DEVICE_OK) {\n target_panic(43);\n return r;\n }\n if (!init) {\n getRadio()->setGroup(0); //Default group zero. This used to be pxt::programHash()\n getRadio()->setTransmitPower(6); // start with high power by default\n init = true;\n }\n radioEnabled = true;\n return r;\n#else\n return DEVICE_NOT_SUPPORTED;\n#endif\n }\n\n /**\n * Disables the radio for use as a multipoint sender/receiver.\n * Disabling radio will help conserve battery power when it is not in use.\n */\n //% help=radio/off\n void off() {\n#ifdef CODAL_RADIO\n auto radio = getRadio();\n if (NULL == radio)\n return;\n\n int r = radio->disable();\n if (r != DEVICE_OK) {\n target_panic(43);\n } else {\n radioEnabled = false;\n }\n#else\n return;\n#endif\n }\n\n /**\n * Initialises the radio for use as a multipoint sender/receiver\n * Only useful when the radio.off() is used beforehand.\n */\n //% help=radio/on\n void on() {\n#ifdef CODAL_RADIO\n auto radio = getRadio();\n if (NULL == radio)\n return;\n\n int r = radio->enable();\n if (r != DEVICE_OK) {\n target_panic(43);\n } else {\n radioEnabled = true;\n }\n#else\n return;\n#endif\n }\n\n /**\n * Sends an event over radio to neigboring devices\n */\n //% blockId=radioRaiseEvent block=\"radio raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\"\n //% blockExternalInputs=1\n //% advanced=true\n //% weight=1\n //% help=radio/raise-event\n void raiseEvent(int src, int value) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return;\n\n getRadio()->event.eventReceived(CODAL_EVENT(src, value, CREATE_ONLY));\n#endif \n }\n\n /**\n * Internal use only. Takes the next packet from the radio queue and returns its contents + RSSI in a Buffer.\n * @returns NULL if no packet available\n */\n //%\n Buffer readRawPacket() {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return NULL;\n\n auto p = getRadio()->datagram.recv();\n#if CODAL_RADIO_MICROBIT_DAL\n if (p == PacketBuffer::EmptyPacket)\n return NULL;\n int rssi = p.getRSSI();\n auto length = p.length();\n auto bytes = p.getBytes();\n#else\n // TODO: RSSI support\n int rssi = -73; \n auto length = p.length();\n auto bytes = p.getBytes();\n if (length == 0)\n return NULL;\n#endif\n\n uint8_t buf[DEVICE_RADIO_MAX_PACKET_SIZE + sizeof(int)]; // packet length + rssi\n memset(buf, 0, sizeof(buf));\n memcpy(buf, bytes, length); // data\n memcpy(buf + DEVICE_RADIO_MAX_PACKET_SIZE, &rssi, sizeof(int)); // RSSi - assumes Int32LE layout\n return mkBuffer(buf, sizeof(buf));\n#else\n return NULL;\n#endif \n }\n\n /**\n * Internal use only. Sends a raw packet through the radio (assumes RSSI appened to packet)\n */\n //% async\n void sendRawPacket(Buffer msg) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK || NULL == msg) return;\n\n // don't send RSSI data; and make sure no buffer underflow\n int len = msg->length - sizeof(int);\n if (len > 0)\n getRadio()->datagram.send(msg->data, len);\n#endif \n }\n\n /**\n * Used internally by the library.\n */\n //% help=radio/on-data-received\n //% weight=0\n //% blockId=radio_datagram_received_event block=\"radio on data received\" blockGap=8\n //% deprecated=true blockHidden=1\n void onDataReceived(Action body) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return;\n\n registerWithDal(DEVICE_ID_RADIO, DEVICE_RADIO_EVT_DATAGRAM, body);\n getRadio()->datagram.recv(); // wake up read code\n#endif \n }\n\n /**\n * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\n * @param id the group id between ``0`` and ``255``, eg: 1\n */\n //% help=radio/set-group\n //% weight=100\n //% blockId=radio_set_group block=\"radio set group %ID\"\n //% id.min=0 id.max=255\n //% group=\"Group\"\n void setGroup(int id) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return;\n\n getRadio()->setGroup(id);\n#endif \n }\n\n /**\n * Change the output power level of the transmitter to the given value.\n * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7\n */\n //% help=radio/set-transmit-power\n //% weight=9 blockGap=8\n //% blockId=radio_set_transmit_power block=\"radio set transmit power %power\"\n //% power.min=0 power.max=7\n //% advanced=true\n void setTransmitPower(int power) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return;\n\n getRadio()->setTransmitPower(power);\n#endif \n }\n\n /**\n * Change the transmission and reception band of the radio to the given channel\n * @param band a frequency band in the range 0 - 83. Each step is 1MHz wide, based at 2400MHz.\n **/\n //% help=radio/set-frequency-band\n //% weight=8 blockGap=8\n //% blockId=radio_set_frequency_band block=\"radio set frequency band %band\"\n //% band.min=0 band.max=83\n //% advanced=true\n void setFrequencyBand(int band) {\n#ifdef CODAL_RADIO \n if (radioEnable() != DEVICE_OK) return;\n getRadio()->setFrequencyBand(band);\n#endif \n }\n}\n",
|
|
2791
2791
|
"radio.ts": "\nenum RadioPacketProperty {\n //% blockIdentity=radio._packetProperty\n //% block=\"signal strength\"\n SignalStrength = 2,\n //% blockIdentity=radio._packetProperty\n //% block=\"time\"\n Time = 0,\n //% block=\"serial number\"\n //% blockIdentity=radio._packetProperty\n SerialNumber = 1\n}\n\n/**\n * Communicate data using radio packets\n */\n//% color=#E3008C weight=96 icon=\"\\uf012\" groups='[\"Group\", \"Broadcast\", \"Send\", \"Receive\"]'\nnamespace radio {\n\n // keep in sync with CODAL\n const RADIO_MAX_PACKET_SIZE = 32;\n const MAX_FIELD_DOUBLE_NAME_LENGTH = 8;\n const MAX_PAYLOAD_LENGTH = 20;\n const PACKET_PREFIX_LENGTH = 9;\n const VALUE_PACKET_NAME_LEN_OFFSET = 13;\n const DOUBLE_VALUE_PACKET_NAME_LEN_OFFSET = 17;\n\n // Packet Spec:\n // | 0 | 1 ... 4 | 5 ... 8 | 9 ... 28\n // ----------------------------------------------------------------\n // | packet type | system time | serial number | payload\n //\n // Serial number defaults to 0 unless enabled by user\n\n // payload: number (9 ... 12)\n export const PACKET_TYPE_NUMBER = 0;\n // payload: number (9 ... 12), name length (13), name (14 ... 26)\n export const PACKET_TYPE_VALUE = 1;\n // payload: string length (9), string (10 ... 28)\n export const PACKET_TYPE_STRING = 2;\n // payload: buffer length (9), buffer (10 ... 28)\n export const PACKET_TYPE_BUFFER = 3;\n // payload: number (9 ... 16)\n export const PACKET_TYPE_DOUBLE = 4;\n // payload: number (9 ... 16), name length (17), name (18 ... 26)\n export const PACKET_TYPE_DOUBLE_VALUE = 5;\n\n let transmittingSerial: boolean;\n let initialized = false;\n\n export let lastPacket: RadioPacket;\n let onReceivedNumberHandler: (receivedNumber: number) => void;\n let onReceivedValueHandler: (name: string, value: number) => void;\n let onReceivedStringHandler: (receivedString: string) => void;\n let onReceivedBufferHandler: (receivedBuffer: Buffer) => void;\n\n function init() {\n if (initialized) return;\n initialized = true;\n onDataReceived(handleDataReceived);\n }\n\n function handleDataReceived() {\n let buffer: Buffer = readRawPacket();\n while (buffer) {\n lastPacket = RadioPacket.getPacket(buffer);\n switch (lastPacket.packetType) {\n case PACKET_TYPE_NUMBER:\n case PACKET_TYPE_DOUBLE:\n if (onReceivedNumberHandler)\n onReceivedNumberHandler(lastPacket.numberPayload);\n break;\n case PACKET_TYPE_VALUE:\n case PACKET_TYPE_DOUBLE_VALUE:\n if (onReceivedValueHandler)\n onReceivedValueHandler(lastPacket.stringPayload, lastPacket.numberPayload);\n break;\n case PACKET_TYPE_BUFFER:\n if (onReceivedBufferHandler)\n onReceivedBufferHandler(lastPacket.bufferPayload);\n break;\n case PACKET_TYPE_STRING:\n if (onReceivedStringHandler)\n onReceivedStringHandler(lastPacket.stringPayload);\n break;\n }\n // read next packet if any\n buffer = readRawPacket();\n }\n }\n\n /**\n * Registers code to run when the radio receives a number.\n */\n //% help=radio/on-received-number\n //% blockId=radio_on_number_drag block=\"on radio received\" blockGap=16\n //% useLoc=\"radio.onDataPacketReceived\" draggableParameters=reporter\n //% group=\"Receive\"\n //% weight=20\n export function onReceivedNumber(cb: (receivedNumber: number) => void) {\n init();\n onReceivedNumberHandler = cb;\n }\n\n /**\n * Registers code to run when the radio receives a key value pair.\n */\n //% help=radio/on-received-value\n //% blockId=radio_on_value_drag block=\"on radio received\" blockGap=16\n //% useLoc=\"radio.onDataPacketReceived\" draggableParameters=reporter\n //% group=\"Receive\"\n //% weight=19\n export function onReceivedValue(cb: (name: string, value: number) => void) {\n init();\n onReceivedValueHandler = cb;\n }\n\n /**\n * Registers code to run when the radio receives a string.\n */\n //% help=radio/on-received-string\n //% blockId=radio_on_string_drag block=\"on radio received\" blockGap=16\n //% useLoc=\"radio.onDataPacketReceived\" draggableParameters=reporter\n //% group=\"Receive\"\n //% weight=18\n export function onReceivedString(cb: (receivedString: string) => void) {\n init();\n onReceivedStringHandler = cb;\n }\n\n /**\n * Registers code to run when the radio receives a buffer.\n */\n //% help=radio/on-received-buffer blockHidden=1\n //% blockId=radio_on_buffer_drag block=\"on radio received\" blockGap=16\n //% useLoc=\"radio.onDataPacketReceived\" draggableParameters=reporter\n export function onReceivedBuffer(cb: (receivedBuffer: Buffer) => void) {\n init();\n onReceivedBufferHandler = cb;\n }\n\n /**\n * Returns properties of the last radio packet received.\n * @param type the type of property to retrieve from the last packet\n */\n //% help=radio/received-packet\n //% blockGap=8\n //% blockId=radio_received_packet block=\"received packet %type=radio_packet_property\" blockGap=16\n //% group=\"Receive\"\n //% weight=16\n export function receivedPacket(type: number) {\n if (lastPacket) {\n switch (type) {\n case RadioPacketProperty.Time: return lastPacket.time;\n case RadioPacketProperty.SerialNumber: return lastPacket.serial;\n case RadioPacketProperty.SignalStrength: return lastPacket.signal;\n }\n }\n return 0;\n }\n\n /**\n * Gets a packet property.\n * @param type the packet property type, eg: PacketProperty.time\n */\n //% blockId=radio_packet_property block=\"%note\"\n //% shim=TD_ID blockHidden=1\n export function _packetProperty(type: RadioPacketProperty): number {\n return type;\n }\n\n export class RadioPacket {\n public static getPacket(data: Buffer) {\n if (!data) return undefined;\n // last 4 bytes is RSSi\n return new RadioPacket(data);\n }\n\n public static mkPacket(packetType: number) {\n const res = new RadioPacket();\n res.data[0] = packetType;\n return res;\n }\n\n private constructor(public readonly data?: Buffer) {\n if (!data) this.data = control.createBuffer(RADIO_MAX_PACKET_SIZE + 4);\n }\n\n get signal() {\n return this.data.getNumber(NumberFormat.Int32LE, this.data.length - 4);\n }\n\n get packetType() {\n return this.data[0];\n }\n\n get time() {\n return this.data.getNumber(NumberFormat.Int32LE, 1);\n }\n\n set time(val: number) {\n this.data.setNumber(NumberFormat.Int32LE, 1, val);\n }\n\n get serial() {\n return this.data.getNumber(NumberFormat.Int32LE, 5);\n }\n\n set serial(val: number) {\n this.data.setNumber(NumberFormat.Int32LE, 5, val);\n }\n\n get stringPayload() {\n const offset = getStringOffset(this.packetType) as number;\n return offset ? this.data.slice(offset + 1, this.data[offset]).toString() : undefined;\n }\n\n set stringPayload(val: string) {\n const offset = getStringOffset(this.packetType) as number;\n if (offset) {\n const buf = control.createBufferFromUTF8(truncateString(val, getMaxStringLength(this.packetType)));\n this.data[offset] = buf.length;\n this.data.write(offset + 1, buf);\n }\n }\n\n get numberPayload() {\n switch (this.packetType) {\n case PACKET_TYPE_NUMBER:\n case PACKET_TYPE_VALUE:\n return this.data.getNumber(NumberFormat.Int32LE, PACKET_PREFIX_LENGTH);\n case PACKET_TYPE_DOUBLE:\n case PACKET_TYPE_DOUBLE_VALUE:\n return this.data.getNumber(NumberFormat.Float64LE, PACKET_PREFIX_LENGTH);\n }\n return undefined;\n }\n\n set numberPayload(val: number) {\n switch (this.packetType) {\n case PACKET_TYPE_NUMBER:\n case PACKET_TYPE_VALUE:\n this.data.setNumber(NumberFormat.Int32LE, PACKET_PREFIX_LENGTH, val);\n break;\n case PACKET_TYPE_DOUBLE:\n case PACKET_TYPE_DOUBLE_VALUE:\n this.data.setNumber(NumberFormat.Float64LE, PACKET_PREFIX_LENGTH, val);\n break;\n }\n }\n\n get bufferPayload() {\n const len = this.data[PACKET_PREFIX_LENGTH];\n return this.data.slice(PACKET_PREFIX_LENGTH + 1, len);\n }\n\n set bufferPayload(b: Buffer) {\n const len = Math.min(b.length, MAX_PAYLOAD_LENGTH - 1);\n this.data[PACKET_PREFIX_LENGTH] = len;\n this.data.write(PACKET_PREFIX_LENGTH + 1, b.slice(0, len));\n }\n\n hasString() {\n return this.packetType === PACKET_TYPE_STRING ||\n this.packetType === PACKET_TYPE_VALUE ||\n this.packetType === PACKET_TYPE_DOUBLE_VALUE;\n }\n\n hasNumber() {\n return this.packetType === PACKET_TYPE_NUMBER ||\n this.packetType === PACKET_TYPE_DOUBLE ||\n this.packetType === PACKET_TYPE_VALUE ||\n this.packetType === PACKET_TYPE_DOUBLE_VALUE;\n }\n }\n\n /**\n * Broadcasts a number over radio to any connected micro:bit in the group.\n */\n //% help=radio/send-number\n //% weight=60\n //% blockId=radio_datagram_send block=\"radio send number %value\" blockGap=8\n //% group=\"Send\"\n export function sendNumber(value: number) {\n let packet: RadioPacket;\n\n if (value === (value | 0)) {\n packet = RadioPacket.mkPacket(PACKET_TYPE_NUMBER);\n }\n else {\n packet = RadioPacket.mkPacket(PACKET_TYPE_DOUBLE);\n }\n\n packet.numberPayload = value;\n sendPacket(packet);\n }\n\n /**\n * Broadcasts a name / value pair along with the device serial number\n * and running time to any connected micro:bit in the group. The name can\n * include no more than 8 characters.\n * @param name the field name (max 8 characters), eg: \"name\"\n * @param value the numeric value\n */\n //% help=radio/send-value\n //% weight=59\n //% blockId=radio_datagram_send_value block=\"radio send|value %name|= %value\" blockGap=8\n //% group=\"Send\"\n export function sendValue(name: string, value: number) {\n let packet: RadioPacket;\n\n if (value === (value | 0)) {\n packet = RadioPacket.mkPacket(PACKET_TYPE_VALUE);\n }\n else {\n packet = RadioPacket.mkPacket(PACKET_TYPE_DOUBLE_VALUE);\n }\n\n packet.numberPayload = value;\n packet.stringPayload = name;\n sendPacket(packet);\n }\n\n /**\n * Broadcasts a string along with the device serial number\n * and running time to any connected micro:bit in the group.\n */\n //% help=radio/send-string\n //% weight=58\n //% blockId=radio_datagram_send_string block=\"radio send string %msg\"\n //% msg.shadowOptions.toString=true\n //% group=\"Send\"\n export function sendString(value: string) {\n const packet = RadioPacket.mkPacket(PACKET_TYPE_STRING);\n packet.stringPayload = value;\n sendPacket(packet);\n }\n\n /**\n * Broadcasts a buffer (up to 19 bytes long) along with the device serial number\n * and running time to any connected micro:bit in the group.\n */\n //% help=radio/send-buffer\n //% weight=57\n //% advanced=true\n export function sendBuffer(msg: Buffer) {\n const packet = RadioPacket.mkPacket(PACKET_TYPE_BUFFER);\n packet.bufferPayload = msg;\n sendPacket(packet);\n }\n\n /**\n * Set the radio to transmit the serial number in each message.\n * @param transmit value indicating if the serial number is transmitted, eg: true\n */\n //% help=radio/set-transmit-serial-number\n //% weight=8 blockGap=8\n //% blockId=radio_set_transmit_serial_number block=\"radio set transmit serial number %transmit\"\n //% advanced=true\n export function setTransmitSerialNumber(transmit: boolean) {\n transmittingSerial = transmit;\n }\n\n function sendPacket(packet: RadioPacket) {\n packet.time = control.millis();\n packet.serial = transmittingSerial ? control.deviceSerialNumber() : 0;\n radio.sendRawPacket(packet.data);\n }\n\n function truncateString(str: string, bytes: number) {\n str = str.substr(0, bytes);\n let buff = control.createBufferFromUTF8(str);\n\n while (buff.length > bytes) {\n str = str.substr(0, str.length - 1);\n buff = control.createBufferFromUTF8(str);\n }\n\n return str;\n }\n\n function getStringOffset(packetType: number) {\n switch (packetType) {\n case PACKET_TYPE_STRING:\n return PACKET_PREFIX_LENGTH;\n case PACKET_TYPE_VALUE:\n return VALUE_PACKET_NAME_LEN_OFFSET;\n case PACKET_TYPE_DOUBLE_VALUE:\n return DOUBLE_VALUE_PACKET_NAME_LEN_OFFSET;\n default:\n return undefined;\n }\n }\n\n function getMaxStringLength(packetType: number) {\n switch (packetType) {\n case PACKET_TYPE_STRING:\n return MAX_PAYLOAD_LENGTH - 2;\n case PACKET_TYPE_VALUE:\n case PACKET_TYPE_DOUBLE_VALUE:\n return MAX_FIELD_DOUBLE_NAME_LENGTH;\n default:\n return undefined;\n }\n }\n}",
|
|
2792
2792
|
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n\n //% color=#E3008C weight=96 icon=\"\\uf012\"\ndeclare namespace radio {\n\n /**\n * Disables the radio for use as a multipoint sender/receiver.\n * Disabling radio will help conserve battery power when it is not in use.\n */\n //% help=radio/off shim=radio::off\n function off(): void;\n\n /**\n * Initialises the radio for use as a multipoint sender/receiver\n * Only useful when the radio.off() is used beforehand.\n */\n //% help=radio/on shim=radio::on\n function on(): void;\n\n /**\n * Sends an event over radio to neigboring devices\n */\n //% blockId=radioRaiseEvent block=\"radio raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\"\n //% blockExternalInputs=1\n //% advanced=true\n //% weight=1\n //% help=radio/raise-event shim=radio::raiseEvent\n function raiseEvent(src: int32, value: int32): void;\n\n /**\n * Internal use only. Takes the next packet from the radio queue and returns its contents + RSSI in a Buffer.\n * @returns NULL if no packet available\n */\n //% shim=radio::readRawPacket\n function readRawPacket(): Buffer;\n\n /**\n * Internal use only. Sends a raw packet through the radio (assumes RSSI appened to packet)\n */\n //% async shim=radio::sendRawPacket\n function sendRawPacket(msg: Buffer): void;\n\n /**\n * Used internally by the library.\n */\n //% help=radio/on-data-received\n //% weight=0\n //% blockId=radio_datagram_received_event block=\"radio on data received\" blockGap=8\n //% deprecated=true blockHidden=1 shim=radio::onDataReceived\n function onDataReceived(body: () => void): void;\n\n /**\n * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\n * @param id the group id between ``0`` and ``255``, eg: 1\n */\n //% help=radio/set-group\n //% weight=100\n //% blockId=radio_set_group block=\"radio set group %ID\"\n //% id.min=0 id.max=255\n //% group=\"Group\" shim=radio::setGroup\n function setGroup(id: int32): void;\n\n /**\n * Change the output power level of the transmitter to the given value.\n * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7\n */\n //% help=radio/set-transmit-power\n //% weight=9 blockGap=8\n //% blockId=radio_set_transmit_power block=\"radio set transmit power %power\"\n //% power.min=0 power.max=7\n //% advanced=true shim=radio::setTransmitPower\n function setTransmitPower(power: int32): void;\n\n /**\n * Change the transmission and reception band of the radio to the given channel\n * @param band a frequency band in the range 0 - 83. Each step is 1MHz wide, based at 2400MHz.\n **/\n //% help=radio/set-frequency-band\n //% weight=8 blockGap=8\n //% blockId=radio_set_frequency_band block=\"radio set frequency band %band\"\n //% band.min=0 band.max=83\n //% advanced=true shim=radio::setFrequencyBand\n function setFrequencyBand(band: int32): void;\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
@@ -2797,7 +2797,7 @@ var pxtTargetBundle = {
|
|
|
2797
2797
|
"devices.cpp": "#include \"pxt.h\"\n#include \"MESEvents.h\"\n\nusing namespace pxt;\n\nenum class MesCameraEvent {\n //% block=\"take photo\"\n TakePhoto = MES_CAMERA_EVT_TAKE_PHOTO,\n //% block=\"start video capture\"\n StartVideoCapture = MES_CAMERA_EVT_START_VIDEO_CAPTURE,\n //% block=\"stop video capture\"\n StopVideoCapture = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,\n //% block=\"toggle front-rear\"\n ToggleFrontRear = MES_CAMERA_EVT_TOGGLE_FRONT_REAR,\n //% block=\"launch photo mode\"\n LaunchPhotoMode = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,\n //% block=\"launch video mode\"\n LaunchVideoMode = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,\n //% block=\"stop photo mode\"\n StopPhotoMode = MES_CAMERA_EVT_STOP_PHOTO_MODE,\n //% block=\"stop video mode\"\n StopVideoMode = MES_CAMERA_EVT_STOP_VIDEO_MODE,\n};\n\nenum class MesAlertEvent {\n //% block=\"display toast\"\n DisplayToast = MES_ALERT_EVT_DISPLAY_TOAST,\n //% block=\"vibrate\"\n Vibrate = MES_ALERT_EVT_VIBRATE,\n //% block=\"play sound\"\n PlaySound = MES_ALERT_EVT_PLAY_SOUND,\n //% block=\"play ring tone\"\n PlayRingtone = MES_ALERT_EVT_PLAY_RINGTONE,\n //% block=\"find my phone\"\n FindMyPhone = MES_ALERT_EVT_FIND_MY_PHONE,\n //% block=\"ring alarm\"\n RingAlarm = MES_ALERT_EVT_ALARM1,\n //% block=\"ring alarm 2\"\n RingAlarm2 = MES_ALERT_EVT_ALARM2,\n //% block=\"ring alarm 3\"\n RingAlarm3 = MES_ALERT_EVT_ALARM3,\n //% block=\"ring alarm 4\"\n RingAlarm4 = MES_ALERT_EVT_ALARM4,\n //% block=\"ring alarm 5\"\n RingAlarm5 = MES_ALERT_EVT_ALARM5,\n //% block=\"ring alarm 6\"\n RingAlarm6 = MES_ALERT_EVT_ALARM6,\n};\n\nenum class MesDeviceInfo {\n //% block=\"incoming call\"\n IncomingCall = MES_DEVICE_INCOMING_CALL,\n //% block=\"incoming message\"\n IncomingMessage = MES_DEVICE_INCOMING_MESSAGE,\n //% block=\"orientation landscape\"\n OrientationLandscape = MES_DEVICE_ORIENTATION_LANDSCAPE,\n //% block=\"orientation portrait\"\n OrientationPortrait = MES_DEVICE_ORIENTATION_PORTRAIT,\n //% block=\"shaken\"\n Shaken = MES_DEVICE_GESTURE_DEVICE_SHAKEN,\n //% block=\"display off\"\n DisplayOff = MES_DEVICE_DISPLAY_OFF,\n //% block=\"display on\"\n DisplayOn = MES_DEVICE_DISPLAY_ON,\n};\n\nenum class MesRemoteControlEvent {\n //% block=\"play\"\n play = MES_REMOTE_CONTROL_EVT_PLAY,\n //% block=\"pause\"\n pause = MES_REMOTE_CONTROL_EVT_PAUSE,\n //% block=\"stop\"\n stop = MES_REMOTE_CONTROL_EVT_STOP,\n //% block=\"next track\"\n nextTrack = MES_REMOTE_CONTROL_EVT_NEXTTRACK,\n //% block=\"previous track\"\n previousTrack = MES_REMOTE_CONTROL_EVT_PREVTRACK,\n //% block=\"forward\"\n forward = MES_REMOTE_CONTROL_EVT_FORWARD,\n //% block=\"rewind\"\n rewind = MES_REMOTE_CONTROL_EVT_REWIND,\n //% block=\"volume up\"\n volumeUp = MES_REMOTE_CONTROL_EVT_VOLUMEUP,\n //% block=\"volume down\"\n volumeDown = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,\n};\n\n/**\n * Control a phone with the BBC micro:bit via Bluetooth.\n */\n//% color=#008272 weight=80 icon=\"\\uf10b\"\nnamespace devices {\n\n static int _signalStrength = -1;\n static void signalStrengthHandler(MicroBitEvent ev) { \n // keep in sync with MESEvents.h\n _signalStrength = ev.value - 1; \n }\n static void initSignalStrength() {\n if (_signalStrength < 0) {\n _signalStrength = 0;\n uBit.messageBus.listen(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, signalStrengthHandler);\n } \n }\n \n /**\n * Returns the last signal strength reported by the paired device.\n */\n //% help=devices/signal-strength weight=24\n //% blockId=devices_signal_strength block=\"signal strength\" blockGap=14 icon=\"\\uf012\" blockGap=14\n int signalStrength() {\n initSignalStrength();\n return _signalStrength;\n }\n\n /**\n * Registers code to run when the device notifies about a change of signal strength.\n * @param body Code run when the signal strength changes.\n */\n //% weight=23 help=devices/on-signal-strength-changed\n //% blockId=devices_signal_strength_changed_event block=\"on signal strength changed\" icon=\"\\uf012\"\n void onSignalStrengthChanged(Action body) {\n initSignalStrength(); \n registerWithDal(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, body);\n }\n}\n",
|
|
2798
2798
|
"devices.ts": "\nnamespace devices {\n /**\n * Sends a ``camera`` command to the parent device.\n * @param event event description\n */\n //% weight=30 help=devices/tell-camera-to\n //% blockId=devices_camera icon=\"\\uf030\" block=\"tell camera to|%property\" blockGap=8\n export function tellCameraTo(event: MesCameraEvent) {\n control.raiseEvent(DAL.MES_CAMERA_ID, event);\n }\n\n /**\n * Sends a ``remote control`` command to the parent device.\n * @param event event description\n */\n //% weight=29 help=devices/tell-remote-control-to\n //% blockId=devices_remote_control block=\"tell remote control to|%property\" blockGap=14 icon=\"\\uf144\"\n export function tellRemoteControlTo(event: MesRemoteControlEvent) {\n control.raiseEvent(DAL.MES_REMOTE_CONTROL_ID, event);\n }\n\n /**\n * Sends an ``alert`` command to the parent device.\n * @param event event description\n */\n //% weight=27 help=devices/raise-alert-to\n //% blockId=devices_alert block=\"raise alert to|%property\" icon=\"\\uf0f3\"\n export function raiseAlertTo(event: MesAlertEvent) {\n control.raiseEvent(DAL.MES_ALERTS_ID, event);\n }\n\n /**\n * Registers code to run when the device notifies about a particular event.\n * @param event event description\n * @param body code handler when event is triggered\n */\n //% help=devices/on-notified weight=26\n //% blockId=devices_device_info_event block=\"on notified|%event\" icon=\"\\uf10a\"\n export function onNotified(event: MesDeviceInfo, body: () => void) {\n control.onEvent(DAL.MES_DEVICE_INFO_ID, event, body);\n }\n\n /**\n * Register code to run when the micro:bit receives a command from the paired gamepad.\n * @param name button name\n * @param body code to run when button is pressed\n */\n //% help=devices/on-gamepad-button weight=40\n //% weight=25\n //% blockId=devices_gamepad_event block=\"on gamepad button|%NAME\" icon=\"\\uf11b\"\n export function onGamepadButton(name: MesDpadButtonInfo, body: () => void) {\n control.onEvent(DAL.MES_DPAD_CONTROLLER_ID, name, body);\n }\n}",
|
|
2799
2799
|
"enums.d.ts": "// Auto-generated. Do not edit.\n\n\n declare const enum MesCameraEvent {\n //% block=\"take photo\"\n TakePhoto = 3, // MES_CAMERA_EVT_TAKE_PHOTO\n //% block=\"start video capture\"\n StartVideoCapture = 4, // MES_CAMERA_EVT_START_VIDEO_CAPTURE\n //% block=\"stop video capture\"\n StopVideoCapture = 5, // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE\n //% block=\"toggle front-rear\"\n ToggleFrontRear = 8, // MES_CAMERA_EVT_TOGGLE_FRONT_REAR\n //% block=\"launch photo mode\"\n LaunchPhotoMode = 1, // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE\n //% block=\"launch video mode\"\n LaunchVideoMode = 2, // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE\n //% block=\"stop photo mode\"\n StopPhotoMode = 6, // MES_CAMERA_EVT_STOP_PHOTO_MODE\n //% block=\"stop video mode\"\n StopVideoMode = 7, // MES_CAMERA_EVT_STOP_VIDEO_MODE\n }\n\n\n declare const enum MesAlertEvent {\n //% block=\"display toast\"\n DisplayToast = 1, // MES_ALERT_EVT_DISPLAY_TOAST\n //% block=\"vibrate\"\n Vibrate = 2, // MES_ALERT_EVT_VIBRATE\n //% block=\"play sound\"\n PlaySound = 3, // MES_ALERT_EVT_PLAY_SOUND\n //% block=\"play ring tone\"\n PlayRingtone = 4, // MES_ALERT_EVT_PLAY_RINGTONE\n //% block=\"find my phone\"\n FindMyPhone = 5, // MES_ALERT_EVT_FIND_MY_PHONE\n //% block=\"ring alarm\"\n RingAlarm = 6, // MES_ALERT_EVT_ALARM1\n //% block=\"ring alarm 2\"\n RingAlarm2 = 7, // MES_ALERT_EVT_ALARM2\n //% block=\"ring alarm 3\"\n RingAlarm3 = 8, // MES_ALERT_EVT_ALARM3\n //% block=\"ring alarm 4\"\n RingAlarm4 = 9, // MES_ALERT_EVT_ALARM4\n //% block=\"ring alarm 5\"\n RingAlarm5 = 10, // MES_ALERT_EVT_ALARM5\n //% block=\"ring alarm 6\"\n RingAlarm6 = 11, // MES_ALERT_EVT_ALARM6\n }\n\n\n declare const enum MesDeviceInfo {\n //% block=\"incoming call\"\n IncomingCall = 7, // MES_DEVICE_INCOMING_CALL\n //% block=\"incoming message\"\n IncomingMessage = 8, // MES_DEVICE_INCOMING_MESSAGE\n //% block=\"orientation landscape\"\n OrientationLandscape = 1, // MES_DEVICE_ORIENTATION_LANDSCAPE\n //% block=\"orientation portrait\"\n OrientationPortrait = 2, // MES_DEVICE_ORIENTATION_PORTRAIT\n //% block=\"shaken\"\n Shaken = 4, // MES_DEVICE_GESTURE_DEVICE_SHAKEN\n //% block=\"display off\"\n DisplayOff = 5, // MES_DEVICE_DISPLAY_OFF\n //% block=\"display on\"\n DisplayOn = 6, // MES_DEVICE_DISPLAY_ON\n }\n\n\n declare const enum MesRemoteControlEvent {\n //% block=\"play\"\n play = 1, // MES_REMOTE_CONTROL_EVT_PLAY\n //% block=\"pause\"\n pause = 2, // MES_REMOTE_CONTROL_EVT_PAUSE\n //% block=\"stop\"\n stop = 3, // MES_REMOTE_CONTROL_EVT_STOP\n //% block=\"next track\"\n nextTrack = 4, // MES_REMOTE_CONTROL_EVT_NEXTTRACK\n //% block=\"previous track\"\n previousTrack = 5, // MES_REMOTE_CONTROL_EVT_PREVTRACK\n //% block=\"forward\"\n forward = 6, // MES_REMOTE_CONTROL_EVT_FORWARD\n //% block=\"rewind\"\n rewind = 7, // MES_REMOTE_CONTROL_EVT_REWIND\n //% block=\"volume up\"\n volumeUp = 8, // MES_REMOTE_CONTROL_EVT_VOLUMEUP\n //% block=\"volume down\"\n volumeDown = 9, // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN\n }\ndeclare namespace devices {\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2800
|
-
"pxt.json": "{\n \"name\": \"devices\",\n \"description\": \"BETA - Camera, remote control and other Bluetooth services. App required.\",\n \"dependencies\": {\n \"core\": \"*\",\n \"bluetooth\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"devices.cpp\",\n \"devices.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2800
|
+
"pxt.json": "{\n \"name\": \"devices\",\n \"description\": \"BETA - Camera, remote control and other Bluetooth services. App required.\",\n \"dependencies\": {\n \"core\": \"*\",\n \"bluetooth\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"devices.cpp\",\n \"devices.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"icon\": \"./static/packages/devices/icon.png\",\n \"hidden\": true\n}\n",
|
|
2801
2801
|
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n /**\n * Control a phone with the BBC micro:bit via Bluetooth.\n */\n //% color=#008272 weight=80 icon=\"\\uf10b\"\ndeclare namespace devices {\n\n /**\n * Returns the last signal strength reported by the paired device.\n */\n //% help=devices/signal-strength weight=24\n //% blockId=devices_signal_strength block=\"signal strength\" blockGap=14 icon=\"\\uf012\" blockGap=14 shim=devices::signalStrength\n function signalStrength(): int32;\n\n /**\n * Registers code to run when the device notifies about a change of signal strength.\n * @param body Code run when the signal strength changes.\n */\n //% weight=23 help=devices/on-signal-strength-changed\n //% blockId=devices_signal_strength_changed_event block=\"on signal strength changed\" icon=\"\\uf012\" shim=devices::onSignalStrengthChanged\n function onSignalStrengthChanged(body: () => void): void;\n}\n\n// Auto-generated. Do not edit. Really.\n"
|
|
2802
2802
|
},
|
|
2803
2803
|
"bluetooth": {
|
|
@@ -2807,18 +2807,18 @@ var pxtTargetBundle = {
|
|
|
2807
2807
|
"bluetooth.cpp": "#include \"pxt.h\"\n#include \"MESEvents.h\"\n#include \"MicroBitUARTService.h\"\n#include \"BLEHF2Service.h\"\n\nusing namespace pxt;\n\n/**\n * Support for additional Bluetooth services.\n */\n//% color=#0082FB weight=96 icon=\"\\uf294\"\nnamespace bluetooth {\n MicroBitUARTService *uart = NULL;\n BLEHF2Service* pHF2 = NULL;\n\n //%\n void __log(int priority, String msg) {\n if (NULL == pHF2)\n pHF2 = new BLEHF2Service(*uBit.ble);\n pHF2->sendSerial(msg->getUTF8Data(), msg->getUTF8Size(), false);\n }\n\n /**\n * Starts the Bluetooth accelerometer service\n */\n //% help=bluetooth/start-accelerometer-service\n //% blockId=bluetooth_start_accelerometer_service block=\"bluetooth accelerometer service\"\n //% parts=\"bluetooth\" weight=90 blockGap=8\n void startAccelerometerService() {\n new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer); \n } \n\n /**\n * Starts the Bluetooth button service\n */\n //% help=bluetooth/start-button-service\n //% blockId=bluetooth_start_button_service block=\"bluetooth button service\" blockGap=8\n //% parts=\"bluetooth\" weight=89\n void startButtonService() {\n new MicroBitButtonService(*uBit.ble); \n }\n\n /**\n * Starts the Bluetooth IO pin service.\n */\n //% help=bluetooth/start-io-pin-service\n //% blockId=bluetooth_start_io_pin_service block=\"bluetooth io pin service\" blockGap=8\n //% parts=\"bluetooth\" weight=88\n void startIOPinService() {\n new MicroBitIOPinService(*uBit.ble, uBit.io);\n }\n\n /**\n * Starts the Bluetooth LED service\n */\n //% help=bluetooth/start-led-service\n //% blockId=bluetooth_start_led_service block=\"bluetooth led service\" blockGap=8\n //% parts=\"bluetooth\" weight=87\n void startLEDService() {\n new MicroBitLEDService(*uBit.ble, uBit.display);\n }\n\n /**\n * Starts the Bluetooth temperature service\n */\n //% help=bluetooth/start-temperature-service\n //% blockId=bluetooth_start_temperature_service block=\"bluetooth temperature service\" blockGap=8\n //% parts=\"bluetooth\" weight=86\n void startTemperatureService() { \n new MicroBitTemperatureService(*uBit.ble, uBit.thermometer); \n }\n\n /**\n * Starts the Bluetooth magnetometer service\n */\n //% help=bluetooth/start-magnetometer-service\n //% blockId=bluetooth_start_magnetometer_service block=\"bluetooth magnetometer service\"\n //% parts=\"bluetooth\" weight=85\n void startMagnetometerService() { \n new MicroBitMagnetometerService(*uBit.ble, uBit.compass); \n }\n\n\n /**\n * Starts the Bluetooth UART service\n */\n //% help=bluetooth/start-uart-service\n //% blockId=bluetooth_start_uart_service block=\"bluetooth uart service\"\n //% parts=\"bluetooth\" advanced=true\n void startUartService() {\n if (uart) return;\n // 61 octet buffer size is 3 x (MTU - 3) + 1\n // MTU on nRF51822 is 23 octets. 3 are used by Attribute Protocol header data leaving 20 octets for payload\n // So we allow a RX buffer that can contain 3 x max length messages plus one octet for a terminator character\n uart = new MicroBitUARTService(*uBit.ble, 61, 60);\n }\n \n //%\n void uartWriteString(String data) {\n startUartService();\n \tuart->send(MSTR(data));\n } \n\n //%\n String uartReadUntil(String del) {\n startUartService();\n return PSTR(uart->readUntil(MSTR(del)));\n } \n\n\n /**\n * Sends a buffer of data via Bluetooth UART\n */\n //%\n void uartWriteBuffer(Buffer buffer) {\n startUartService();\n uart->send(buffer->data, buffer->length);\n }\n\n /**\n * Reads buffered UART data into a buffer\n */\n //%\n Buffer uartReadBuffer() {\n startUartService();\n int bytes = uart->rxBufferedSize();\n auto buffer = mkBuffer(NULL, bytes);\n auto res = buffer;\n registerGCObj(buffer);\n int read = uart->read(buffer->data, buffer->length);\n // read failed\n if (read < 0) {\n res = mkBuffer(NULL, 0);\n } else if (read != buffer->length) {\n // could not fill the buffer\n res = mkBuffer(buffer->data, read); \n }\n unregisterGCObj(buffer);\n return res;\n }\n\n /**\n * Registers an event to be fired when one of the delimiter is matched.\n * @param delimiters the characters to match received characters against.\n */\n //% help=bluetooth/on-uart-data-received\n //% weight=18 blockId=bluetooth_on_data_received block=\"bluetooth|on data received %delimiters=serial_delimiter_conv\"\n void onUartDataReceived(String delimiters, Action body) {\n startUartService();\n uart->eventOn(MSTR(delimiters));\n registerWithDal(MICROBIT_ID_BLE_UART, MICROBIT_UART_S_EVT_DELIM_MATCH, body);\n }\n\n /**\n * Register code to run when the micro:bit is connected to over Bluetooth\n * @param body Code to run when a Bluetooth connection is established\n */\n //% help=bluetooth/on-bluetooth-connected weight=20\n //% blockId=bluetooth_on_connected block=\"on bluetooth connected\" blockGap=8\n //% parts=\"bluetooth\"\n void onBluetoothConnected(Action body) {\n registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, body);\n } \n\n /**\n * Register code to run when a bluetooth connection to the micro:bit is lost\n * @param body Code to run when a Bluetooth connection is lost\n */\n //% help=bluetooth/on-bluetooth-disconnected weight=19\n //% blockId=bluetooth_on_disconnected block=\"on bluetooth disconnected\"\n //% parts=\"bluetooth\"\n void onBluetoothDisconnected(Action body) {\n registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, body);\n } \n\n const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10};\n /**\n * Advertise an Eddystone URL\n\t* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://makecode.com\"\n\t* @param power power level between 0 and 7, eg: 7\n * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n */\n //% blockId=eddystone_advertise_url block=\"bluetooth advertise url %url|with power %power|connectable %connectable\"\n //% parts=bluetooth weight=11 blockGap=8\n //% help=bluetooth/advertise-url blockExternalInputs=1\n //% hidden=1 deprecated=1\n void advertiseUrl(String url, int power, bool connectable) {\n#if CONFIG_ENABLED(MICROBIT_BLE_EDDYSTONE_URL)\n power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));\n int8_t level = CALIBRATED_POWERS[power];\n uBit.bleManager.advertiseEddystoneUrl(MSTR(url), level, connectable);\n uBit.bleManager.setTransmitPower(power);\n#endif\n }\n\n /**\n * Advertise an Eddystone UID\n\t* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)\n\t* @param power power level between 0 and 7, eg: 7\n * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n */\n //% parts=bluetooth weight=12 advanced=true deprecated=1\n void advertiseUidBuffer(Buffer nsAndInstance, int power, bool connectable) {\n#if CONFIG_ENABLED(MICROBIT_BLE_EDDYSTONE_UID) \n auto buf = nsAndInstance;\n if (buf->length != 16) return;\n\n power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));\n int8_t level = CALIBRATED_POWERS[power];\n uBit.bleManager.advertiseEddystoneUid((const char*)buf->data, (const char*)buf->data + 10, level, connectable);\n#endif\n }\n\n /**\n * Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).\n * @param power power level between 0 (minimal) and 7 (maximum), eg: 7.\n */\n //% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true\n //% blockId=bluetooth_settransmitpower block=\"bluetooth set transmit power %power\"\n void setTransmitPower(int power) {\n uBit.bleManager.setTransmitPower(min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power)));\n }\n\n /**\n * Stops advertising Eddystone end points\n */\n //% blockId=eddystone_stop_advertising block=\"bluetooth stop advertising\"\n //% parts=bluetooth weight=10\n //% help=bluetooth/stop-advertising advanced=true\n //% hidden=1 deprecated=1\n void stopAdvertising() {\n uBit.bleManager.stopAdvertising();\n } \n}",
|
|
2808
2808
|
"bluetooth.ts": "/// <reference no-default-lib=\"true\"/>\n/**\n * Support for additional Bluetooth services.\n */\n//% color=#007EF4 weight=96 icon=\"\\uf294\"\nnamespace bluetooth {\n export let NEW_LINE = \"\\r\\n\";\n\n /**\n * Internal use\n */\n //% shim=bluetooth::__log\n export function __log(priority: number, msg: string) {\n return;\n }\n console.addListener(function (_pri, msg) { __log(_pri, msg) });\n\n /**\n * Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.\n */\n //% help=bluetooth/uart-write-string weight=80\n //% blockId=bluetooth_uart_write block=\"bluetooth uart|write string %data\" blockGap=8\n //% parts=\"bluetooth\" shim=bluetooth::uartWriteString advanced=true\n export function uartWriteString(data: string): void {\n console.log(data)\n }\n\n /**\n * Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.\n */\n //% help=bluetooth/uart-write-line weight=79\n //% blockId=bluetooth_uart_line block=\"bluetooth uart|write line %data\" blockGap=8\n //% parts=\"bluetooth\" advanced=true\n export function uartWriteLine(data: string): void {\n uartWriteString(data + serial.NEW_LINE);\n }\n\n /**\n * Prints a numeric value to the serial\n */\n //% help=bluetooth/uart-write-number weight=79\n //% weight=89 blockGap=8 advanced=true\n //% blockId=bluetooth_uart_writenumber block=\"bluetooth uart|write number %value\"\n export function uartWriteNumber(value: number): void {\n uartWriteString(value.toString());\n }\n\n /**\n * Writes a ``name: value`` pair line to the serial.\n * @param name name of the value stream, eg: x\n * @param value to write\n */\n //% weight=88 weight=78\n //% help=bluetooth/uart-write-value advanced=true\n //% blockId=bluetooth_uart_writevalue block=\"bluetooth uart|write value %name|= %value\"\n export function uartWriteValue(name: string, value: number): void {\n uartWriteString((name ? name + \":\" : \"\") + value + NEW_LINE);\n }\n\n /**\n * Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered.\n */\n //% help=bluetooth/uart-read-until weight=75\n //% blockId=bluetooth_uart_read block=\"bluetooth uart|read until %del=serial_delimiter_conv\"\n //% parts=\"bluetooth\" shim=bluetooth::uartReadUntil advanced=true\n export function uartReadUntil(del: string): string {\n // dummy implementation for simulator\n return \"\"\n }\n\n /**\n * Advertise an Eddystone UID\n * @param ns 4 last bytes of the namespace uid\n * @param instance 4 last bytes of the instance uid\n * @param power power level between 0 and 7, eg: 7\n * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n */\n //% blockId=eddystone_advertise_uid block=\"bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable\"\n //% parts=bluetooth weight=12 blockGap=8\n //% help=bluetooth/advertise-uid blockExternalInputs=1\n //% hidden=1 deprecated=1\n export function advertiseUid(ns: number, instance: number, power: number, connectable: boolean) {\n const buf = pins.createBuffer(16);\n buf.setNumber(NumberFormat.Int32BE, 6, ns);\n buf.setNumber(NumberFormat.Int32BE, 12, instance);\n bluetooth.advertiseUidBuffer(buf, power, connectable);\n }\n}\n",
|
|
2809
2809
|
"enums.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace bluetooth {\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2810
|
-
"pxt.json": "{\n \"name\": \"bluetooth\",\n \"description\": \"Bluetooth services\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"bluetooth.ts\",\n \"bluetooth.cpp\",\n \"BLEHF2Service.h\",\n \"BLEHF2Service.cpp\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2810
|
+
"pxt.json": "{\n \"name\": \"bluetooth\",\n \"description\": \"Bluetooth services\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"bluetooth.ts\",\n \"bluetooth.cpp\",\n \"BLEHF2Service.h\",\n \"BLEHF2Service.cpp\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"weight\": 10,\n \"searchOnly\": true,\n \"icon\": \"./static/packages/bluetooth/icon.png\",\n \"yotta\": {\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"enabled\": 1\n }\n }\n },\n \"optionalConfig\": {\n \"microbit-dal\": {\n \"stack_size\": 1280,\n \"gatt_table_size\": \"0x700\"\n }\n },\n \"userConfigs\": [\n {\n \"description\": \"Disable Bluetooth Event Service\",\n \"config\": {\n \"microbit-dal\": {\n \"bluetooth\": {\n \"event_service\": 0\n }\n }\n }\n }\n ]\n }\n}\n",
|
|
2811
2811
|
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n /**\n * Support for additional Bluetooth services.\n */\n //% color=#0082FB weight=96 icon=\"\\uf294\"\ndeclare namespace bluetooth {\n\n /**\n * Starts the Bluetooth accelerometer service\n */\n //% help=bluetooth/start-accelerometer-service\n //% blockId=bluetooth_start_accelerometer_service block=\"bluetooth accelerometer service\"\n //% parts=\"bluetooth\" weight=90 blockGap=8 shim=bluetooth::startAccelerometerService\n function startAccelerometerService(): void;\n\n /**\n * Starts the Bluetooth button service\n */\n //% help=bluetooth/start-button-service\n //% blockId=bluetooth_start_button_service block=\"bluetooth button service\" blockGap=8\n //% parts=\"bluetooth\" weight=89 shim=bluetooth::startButtonService\n function startButtonService(): void;\n\n /**\n * Starts the Bluetooth IO pin service.\n */\n //% help=bluetooth/start-io-pin-service\n //% blockId=bluetooth_start_io_pin_service block=\"bluetooth io pin service\" blockGap=8\n //% parts=\"bluetooth\" weight=88 shim=bluetooth::startIOPinService\n function startIOPinService(): void;\n\n /**\n * Starts the Bluetooth LED service\n */\n //% help=bluetooth/start-led-service\n //% blockId=bluetooth_start_led_service block=\"bluetooth led service\" blockGap=8\n //% parts=\"bluetooth\" weight=87 shim=bluetooth::startLEDService\n function startLEDService(): void;\n\n /**\n * Starts the Bluetooth temperature service\n */\n //% help=bluetooth/start-temperature-service\n //% blockId=bluetooth_start_temperature_service block=\"bluetooth temperature service\" blockGap=8\n //% parts=\"bluetooth\" weight=86 shim=bluetooth::startTemperatureService\n function startTemperatureService(): void;\n\n /**\n * Starts the Bluetooth magnetometer service\n */\n //% help=bluetooth/start-magnetometer-service\n //% blockId=bluetooth_start_magnetometer_service block=\"bluetooth magnetometer service\"\n //% parts=\"bluetooth\" weight=85 shim=bluetooth::startMagnetometerService\n function startMagnetometerService(): void;\n\n /**\n * Starts the Bluetooth UART service\n */\n //% help=bluetooth/start-uart-service\n //% blockId=bluetooth_start_uart_service block=\"bluetooth uart service\"\n //% parts=\"bluetooth\" advanced=true shim=bluetooth::startUartService\n function startUartService(): void;\n\n /**\n * Sends a buffer of data via Bluetooth UART\n */\n //% shim=bluetooth::uartWriteBuffer\n function uartWriteBuffer(buffer: Buffer): void;\n\n /**\n * Reads buffered UART data into a buffer\n */\n //% shim=bluetooth::uartReadBuffer\n function uartReadBuffer(): Buffer;\n\n /**\n * Registers an event to be fired when one of the delimiter is matched.\n * @param delimiters the characters to match received characters against.\n */\n //% help=bluetooth/on-uart-data-received\n //% weight=18 blockId=bluetooth_on_data_received block=\"bluetooth|on data received %delimiters=serial_delimiter_conv\" shim=bluetooth::onUartDataReceived\n function onUartDataReceived(delimiters: string, body: () => void): void;\n\n /**\n * Register code to run when the micro:bit is connected to over Bluetooth\n * @param body Code to run when a Bluetooth connection is established\n */\n //% help=bluetooth/on-bluetooth-connected weight=20\n //% blockId=bluetooth_on_connected block=\"on bluetooth connected\" blockGap=8\n //% parts=\"bluetooth\" shim=bluetooth::onBluetoothConnected\n function onBluetoothConnected(body: () => void): void;\n\n /**\n * Register code to run when a bluetooth connection to the micro:bit is lost\n * @param body Code to run when a Bluetooth connection is lost\n */\n //% help=bluetooth/on-bluetooth-disconnected weight=19\n //% blockId=bluetooth_on_disconnected block=\"on bluetooth disconnected\"\n //% parts=\"bluetooth\" shim=bluetooth::onBluetoothDisconnected\n function onBluetoothDisconnected(body: () => void): void;\n\n /**\n * Advertise an Eddystone URL\n * @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://makecode.com\"\n * @param power power level between 0 and 7, eg: 7\n * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n */\n //% blockId=eddystone_advertise_url block=\"bluetooth advertise url %url|with power %power|connectable %connectable\"\n //% parts=bluetooth weight=11 blockGap=8\n //% help=bluetooth/advertise-url blockExternalInputs=1\n //% hidden=1 deprecated=1 shim=bluetooth::advertiseUrl\n function advertiseUrl(url: string, power: int32, connectable: boolean): void;\n\n /**\n * Advertise an Eddystone UID\n * @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)\n * @param power power level between 0 and 7, eg: 7\n * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n */\n //% parts=bluetooth weight=12 advanced=true deprecated=1 shim=bluetooth::advertiseUidBuffer\n function advertiseUidBuffer(nsAndInstance: Buffer, power: int32, connectable: boolean): void;\n\n /**\n * Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).\n * @param power power level between 0 (minimal) and 7 (maximum), eg: 7.\n */\n //% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true\n //% blockId=bluetooth_settransmitpower block=\"bluetooth set transmit power %power\" shim=bluetooth::setTransmitPower\n function setTransmitPower(power: int32): void;\n\n /**\n * Stops advertising Eddystone end points\n */\n //% blockId=eddystone_stop_advertising block=\"bluetooth stop advertising\"\n //% parts=bluetooth weight=10\n //% help=bluetooth/stop-advertising advanced=true\n //% hidden=1 deprecated=1 shim=bluetooth::stopAdvertising\n function stopAdvertising(): void;\n}\n\n// Auto-generated. Do not edit. Really.\n"
|
|
2812
2812
|
},
|
|
2813
2813
|
"servo": {
|
|
2814
2814
|
"README.md": "# Servo\n\nA small micro-servo library.",
|
|
2815
2815
|
"ns.ts": "/**\n * Control micro servos\n */\n//% color=\"#03AA74\" weight=88 icon=\"\\uf021\"\nnamespace servos {\n}",
|
|
2816
|
-
"pxt.json": "{\n \"name\": \"servo\",\n \"description\": \"A micro-servo library\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"servo.ts\",\n \"ns.ts\",\n \"targetoverrides.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2816
|
+
"pxt.json": "{\n \"name\": \"servo\",\n \"description\": \"A micro-servo library\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"servo.ts\",\n \"ns.ts\",\n \"targetoverrides.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"icon\": \"/static/libs/servo.png\"\n}\n",
|
|
2817
2817
|
"servo.ts": "/**\n * Control micro servos\n */\n//% color=\"#03AA74\" weight=88 icon=\"\\uf021\" blockGap=8\n//% groups='[\"Positional\", \"Continuous\", \"Configuration\"]'\nnamespace servos {\n //% fixedInstances\n export class Servo {\n private _minAngle: number;\n private _maxAngle: number;\n private _stopOnNeutral: boolean;\n private _angle: number;\n\n constructor() {\n this._angle = undefined;\n this._minAngle = 0;\n this._maxAngle = 180;\n this._stopOnNeutral = false;\n }\n\n private clampDegrees(degrees: number): number {\n degrees = degrees | 0;\n degrees = Math.clamp(this._minAngle, this._maxAngle, degrees);\n return degrees;\n }\n\n /**\n * Set the servo angle\n */\n //% weight=100 help=servos/set-angle\n //% blockId=servoservosetangle block=\"set %servo angle to %degrees=protractorPicker °\"\n //% degrees.defl=90\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n //% blockGap=8\n //% parts=microservo trackArgs=0\n //% group=\"Positional\"\n setAngle(degrees: number) {\n degrees = this.clampDegrees(degrees);\n this.internalSetContinuous(false);\n this._angle = this.internalSetAngle(degrees);\n }\n\n get angle() {\n return this._angle || 90;\n }\n\n protected internalSetContinuous(continuous: boolean): void {\n\n }\n\n protected internalSetAngle(angle: number): number {\n return 0;\n }\n\n /**\n * Set the throttle on a continuous servo\n * @param speed the throttle of the motor from -100% to 100%\n */\n //% weight=99 help=servos/run\n //% blockId=servoservorun block=\"continuous %servo run at %speed=speedPicker \\\\%\"\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n //% parts=microservo trackArgs=0\n //% group=\"Continuous\"\n //% blockGap=8\n run(speed: number): void {\n const degrees = this.clampDegrees(Math.map(speed, -100, 100, this._minAngle, this._maxAngle));\n const neutral = (this.maxAngle - this.minAngle) >> 1;\n this.internalSetContinuous(true);\n if (this._stopOnNeutral && degrees == neutral)\n this.stop();\n else\n this._angle = this.internalSetAngle(degrees);\n }\n\n /**\n * Set the pulse width to the servo in microseconds\n * @param micros the width of the pulse in microseconds\n */\n\n //% weight=10 help=servos/set-pulse\n //% blockId=servoservosetpulse block=\"set %servo pulse to %micros μs\"\n //% micros.min=500 micros.max=2500\n //% micros.defl=1500\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n //% parts=microservo trackArgs=0\n //% group=\"Configuration\"\n //% blockGap=8\n setPulse(micros: number) {\n micros = micros | 0;\n micros = Math.clamp(500, 2500, micros);\n this.internalSetPulse(micros);\n }\n\n protected internalSetPulse(micros: number): void {\n\n }\n\n /**\n * Stop sending commands to the servo so that its rotation will stop at the current position.\n */\n // On a normal servo this will stop the servo where it is, rather than return it to neutral position.\n // It will also not provide any holding force.\n //% weight=10 help=servos/stop\n //% blockId=servoservostop block=\"stop %servo\"\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n //% parts=microservo trackArgs=0\n //% group=\"Continuous\"\n //% blockGap=8\n stop() {\n if (this._angle !== undefined)\n this.internalStop();\n }\n\n /**\n * Gets the minimum angle for the servo\n */\n public get minAngle() {\n return this._minAngle;\n }\n\n /**\n * Gets the maximum angle for the servo\n */\n public get maxAngle() {\n return this._maxAngle;\n }\n\n /**\n * Set the possible rotation range angles for the servo between 0 and 180\n * @param minAngle the minimum angle from 0 to 90\n * @param maxAngle the maximum angle from 90 to 180\n */\n //% help=servos/set-range\n //% blockId=servosetrange block=\"set %servo range from %minAngle to %maxAngle\"\n //% minAngle.min=0 minAngle.max=90\n //% maxAngle.min=90 maxAngle.max=180 maxAngle.defl=180\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n //% parts=microservo trackArgs=0\n //% group=\"Configuration\"\n //% blockGap=8\n public setRange(minAngle: number, maxAngle: number) {\n this._minAngle = Math.max(0, Math.min(90, minAngle | 0));\n this._maxAngle = Math.max(90, Math.min(180, maxAngle | 0));\n }\n\n /**\n * Set a servo stop mode so it will stop when the rotation angle is in the neutral position, 90 degrees.\n * @param on true to enable this mode\n */\n //% help=servos/set-stop-on-neutral\n //% blockId=servostoponneutral block=\"set %servo stop on neutral %enabled\"\n //% enabled.shadow=toggleOnOff\n //% group=\"Configuration\"\n //% blockGap=8\n //% servo.fieldEditor=\"gridpicker\"\n //% servo.fieldOptions.width=220\n //% servo.fieldOptions.columns=2\n public setStopOnNeutral(enabled: boolean) {\n this._stopOnNeutral = enabled;\n }\n\n protected internalStop() { }\n }\n\n export class PinServo extends Servo {\n private _pin: PwmOnlyPin;\n\n constructor(pin: PwmOnlyPin) {\n super();\n this._pin = pin;\n }\n\n protected internalSetAngle(angle: number): number {\n this._pin.servoWrite(angle);\n return angle;\n }\n\n protected internalSetContinuous(continuous: boolean): void {\n this._pin.servoSetContinuous(continuous);\n }\n\n protected internalSetPulse(micros: number): void {\n this._pin.servoSetPulse(micros);\n }\n\n protected internalStop() {\n this._pin.digitalRead();\n this._pin.setPull(PinPullMode.PullNone);\n }\n }\n}\n",
|
|
2818
2818
|
"targetoverrides.ts": "namespace servos {\n //% block=\"servo P0\" fixedInstance whenUsed\n export const P0 = new servos.PinServo(pins.P0);\n //% block=\"servo P1\" fixedInstance whenUsed\n export const P1 = new servos.PinServo(pins.P1);\n //% block=\"servo P2\" fixedInstance whenUsed\n export const P2 = new servos.PinServo(pins.P2);\n}"
|
|
2819
2819
|
},
|
|
2820
2820
|
"radio-broadcast": {
|
|
2821
|
-
"pxt.json": "{\n \"name\": \"radio-broadcast\",\n \"description\": \"Adds new blocks for message communication in the radio category\",\n \"dependencies\": {\n \"core\": \"*\",\n \"radio\": \"*\"\n },\n \"files\": [\n \"radio-broadcast.ts\"\n ],\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2821
|
+
"pxt.json": "{\n \"name\": \"radio-broadcast\",\n \"description\": \"Adds new blocks for message communication in the radio category\",\n \"dependencies\": {\n \"core\": \"*\",\n \"radio\": \"*\"\n },\n \"files\": [\n \"radio-broadcast.ts\"\n ],\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"icon\": \"/static/libs/radio-broadcast.png\"\n}\n",
|
|
2822
2822
|
"radio-broadcast.ts": "namespace radio {\n const BROADCAST_GENERAL_ID = 2000;\n\n /**\n * Gets the message code\n */\n //% blockHidden=1 shim=ENUM_GET\n //% blockId=radioMessageCode block=\"$msg\" enumInitialMembers=\"message1\"\n //% enumName=RadioMessage enumMemberName=msg enumPromptHint=\"e.g. Start, Stop, Jump...\"\n //% enumIsHash=1\n export function __message(msg: number): number {\n return msg;\n }\n\n /**\n * Broadcasts a message over radio\n * @param msg \n */\n //% blockId=radioBroadcastMessage block=\"radio send $msg\"\n //% msg.shadow=radioMessageCode draggableParameters\n //% weight=200\n //% blockGap=8\n //% help=radio/send-message\n //% group=\"Broadcast\"\n export function sendMessage(msg: number): void {\n // 0 is MICROBIT_EVT_ANY, shifting by 1\n radio.raiseEvent(BROADCAST_GENERAL_ID, msg + 1);\n }\n\n /**\n * Registers code to run for a particular message\n * @param msg \n * @param handler \n */\n //% blockId=radioOnMessageReceived block=\"on radio $msg received\"\n //% msg.shadow=radioMessageCode draggableParameters\n //% weight=199\n //% help=radio/on-received-message\n //% group=\"Broadcast\"\n export function onReceivedMessage(msg: number, handler: () => void) {\n control.onEvent(BROADCAST_GENERAL_ID, msg + 1, handler);\n }\n}"
|
|
2823
2823
|
},
|
|
2824
2824
|
"microphone": {
|
|
@@ -2826,7 +2826,7 @@ var pxtTargetBundle = {
|
|
|
2826
2826
|
"enums.d.ts": "// Auto-generated. Do not edit.\n\n\n declare const enum DetectedSound {\n //% block=\"loud\"\n Loud = 2,\n //% block=\"quiet\"\n Quiet = 1,\n }\n\n\n declare const enum SoundThreshold {\n //% block=\"loud\"\n Loud = 2,\n //% block=\"quiet\"\n Quiet = 1,\n }\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2827
2827
|
"microphone.cpp": "#include \"pxt.h\"\n\n#if MICROBIT_CODAL\n#include \"LevelDetector.h\"\n#include \"LevelDetectorSPL.h\"\n#endif\n\n#define MICROPHONE_MIN 52.0f\n#define MICROPHONE_MAX 120.0f\n\nenum class DetectedSound {\n //% block=\"loud\"\n Loud = 2,\n //% block=\"quiet\"\n Quiet = 1\n};\n\nenum class SoundThreshold {\n //% block=\"loud\"\n Loud = 2,\n //% block=\"quiet\"\n Quiet = 1\n};\n\nnamespace pxt {\n#if MICROBIT_CODAL\n codal::LevelDetectorSPL* getMicrophoneLevel();\n#endif\n}\n\nnamespace input {\n\n/**\n* Registers an event that runs when a sound is detected\n*/\n//% help=input/on-sound\n//% blockId=input_on_sound block=\"on %sound sound\"\n//% parts=\"microphone\"\n//% weight=88 blockGap=12\n//% group=\"micro:bit (V2)\"\nvoid onSound(DetectedSound sound, Action handler) {\n#if MICROBIT_CODAL\n pxt::getMicrophoneLevel(); // wake up service\n const auto thresholdType = sound == DetectedSound::Loud ? LEVEL_THRESHOLD_HIGH : LEVEL_THRESHOLD_LOW;\n registerWithDal(DEVICE_ID_MICROPHONE, thresholdType, handler);\n#else\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n#endif\n}\n\n/**\n* Reads the loudness through the microphone from 0 (silent) to 255 (loud)\n*/\n//% help=input/sound-level\n//% blockId=device_get_sound_level block=\"sound level\"\n//% parts=\"microphone\"\n//% weight=34 blockGap=8\n//% group=\"micro:bit (V2)\"\nint soundLevel() {\n#if MICROBIT_CODAL\n auto level = pxt::getMicrophoneLevel();\n if (NULL == level)\n return 0;\n const int micValue = level->getValue();\n const int scaled = max(MICROPHONE_MIN, min(micValue, MICROPHONE_MAX)) - MICROPHONE_MIN;\n return min(0xff, scaled * 0xff / (MICROPHONE_MAX - MICROPHONE_MIN));\n#else\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n return 0;\n#endif\n}\n\n/**\n* Sets the threshold for a sound type.\n*/\n//% help=input/set-sound-threshold\n//% blockId=input_set_sound_threshold block=\"set %sound sound threshold to %value\"\n//% parts=\"microphone\"\n//% threshold.min=0 threshold.max=255 threshold.defl=128\n//% weight=14 blockGap=8\n//% advanced=true\n//% group=\"micro:bit (V2)\"\nvoid setSoundThreshold(SoundThreshold sound, int threshold) {\n#if MICROBIT_CODAL\n auto level = pxt::getMicrophoneLevel();\n if (NULL == level)\n return;\n\n threshold = max(0, min(0xff, threshold));\n const int scaled = MICROPHONE_MIN + threshold * (MICROPHONE_MAX - MICROPHONE_MIN) / 0xff;\n if (SoundThreshold::Loud == sound)\n level->setHighThreshold(scaled);\n else\n level->setLowThreshold(scaled);\n#else\n target_panic(PANIC_VARIANT_NOT_SUPPORTED);\n#endif\n}\n}",
|
|
2828
2828
|
"microphonehw.cpp": "// The fallback logic below still requires level detection.\n// It's only kept with a view to syncing with the common-packages in future.\n\n#include \"pxt.h\"\n\n#if MICROBIT_CODAL\n#include \"LevelDetector.h\"\n#include \"LevelDetectorSPL.h\"\n#include \"DataStream.h\"\n\n#ifndef MIC_DEVICE\n// STM?\nclass DummyDataSource : public codal::DataSource {\n public:\n DummyDataSource() {}\n};\nclass PanicPDM {\n public:\n uint8_t level;\n DummyDataSource source;\n codal::DataStream output;\n\n PanicPDM(Pin &sd, Pin &sck) : output(source) { target_panic(PANIC_MICROPHONE_MISSING); }\n void enable() {}\n void disable() {}\n};\n#define MIC_DEVICE PanicPDM\n#endif\n\n#ifndef MIC_INIT\n#define MIC_INIT \\\n : microphone(*LOOKUP_PIN(MIC_DATA), *LOOKUP_PIN(MIC_CLOCK)) \\\n , level(microphone.output, 95.0, 75.0, 9, 52, DEVICE_ID_MICROPHONE)\n#endif\n\n#ifndef MIC_ENABLE\n#define MIC_ENABLE microphone.enable()\n#endif\n\nnamespace pxt {\n\nclass WMicrophone {\n public:\n MIC_DEVICE microphone;\n LevelDetectorSPL level;\n WMicrophone() MIC_INIT { MIC_ENABLE; }\n};\nSINGLETON(WMicrophone);\n\ncodal::LevelDetectorSPL *getMicrophoneLevel() {\n auto wmic = getWMicrophone();\n return wmic ? &(wmic->level) : NULL;\n}\n\n} // namespace pxt\n#endif",
|
|
2829
|
-
"pxt.json": "{\n \"name\": \"microphone\",\n \"description\": \"The microphone library\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"microphone.cpp\",\n \"microphonehw.cpp\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"targetoverrides.ts\"\n ],\n \"testFiles\": [\n \"test.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2829
|
+
"pxt.json": "{\n \"name\": \"microphone\",\n \"description\": \"The microphone library\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"microphone.cpp\",\n \"microphonehw.cpp\",\n \"enums.d.ts\",\n \"shims.d.ts\",\n \"targetoverrides.ts\"\n ],\n \"testFiles\": [\n \"test.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"icon\": \"/static/libs/microphone.png\"\n}\n",
|
|
2830
2830
|
"shims.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace input {\n\n /**\n * Registers an event that runs when a sound is detected\n */\n //% help=input/on-sound\n //% blockId=input_on_sound block=\"on %sound sound\"\n //% parts=\"microphone\"\n //% weight=88 blockGap=12\n //% group=\"micro:bit (V2)\" shim=input::onSound\n function onSound(sound: DetectedSound, handler: () => void): void;\n\n /**\n * Reads the loudness through the microphone from 0 (silent) to 255 (loud)\n */\n //% help=input/sound-level\n //% blockId=device_get_sound_level block=\"sound level\"\n //% parts=\"microphone\"\n //% weight=34 blockGap=8\n //% group=\"micro:bit (V2)\" shim=input::soundLevel\n function soundLevel(): int32;\n\n /**\n * Sets the threshold for a sound type.\n */\n //% help=input/set-sound-threshold\n //% blockId=input_set_sound_threshold block=\"set %sound sound threshold to %value\"\n //% parts=\"microphone\"\n //% threshold.min=0 threshold.max=255\n //% weight=14 blockGap=8\n //% advanced=true\n //% group=\"micro:bit (V2)\" threshold.defl=128 shim=input::setSoundThreshold\n function setSoundThreshold(sound: SoundThreshold, threshold?: int32): void;\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2831
2831
|
"targetoverrides.ts": "// target specific code",
|
|
2832
2832
|
"test.ts": "// tests"
|
|
@@ -2840,7 +2840,7 @@ var pxtTargetBundle = {
|
|
|
2840
2840
|
"RP2040Flash.cpp": "#include \"pxt.h\"\n#include \"Flash.h\"\n\n//#define LOG DMESG\n#define LOG NOLOG\n\n#ifdef PICO_BOARD\n#include \"hardware/flash.h\"\n\n#define XIP_BIAS 0x10000000\n\nnamespace codal {\n\nint ZFlash::pageSize(uintptr_t address) {\n return FLASH_SECTOR_SIZE;\n}\n\nint ZFlash::totalSize() {\n#ifndef PICO_FLASH_SIZE_BYTES\n return 2*1024*1024;\n#else\n return PICO_FLASH_SIZE_BYTES;\n#endif\n}\n\nint ZFlash::erasePage(uintptr_t address) {\n // address should be aligned to 4096\n if (address % 4096 == 0){\n target_disable_irq();\n flash_range_erase(address - XIP_BIAS, FLASH_SECTOR_SIZE); \n target_enable_irq();\n }\n return 0;\n}\n\nint ZFlash::writeBytes(uintptr_t dst, const void *src, uint32_t len) {\n if (len != FLASH_PAGE_SIZE || (dst & (FLASH_PAGE_SIZE - 1))) return -1;\n // should be aligned to 256\n target_disable_irq();\n flash_range_program(dst - XIP_BIAS, (const uint8_t*)src, FLASH_PAGE_SIZE);\n target_enable_irq();\n \n return 0;\n}\n\n\n\n\n}\n\n#endif\n",
|
|
2841
2841
|
"SAMDFlash.cpp": "#include \"pxt.h\"\n#include \"Flash.h\"\n\n//#define LOG DMESG\n#define LOG NOLOG\n\n#if defined(SAMD51) || defined(SAMD21)\nnamespace codal {\n\n#ifdef SAMD51\n#define waitForLast() \\\n while (NVMCTRL->STATUS.bit.READY == 0) \\\n ;\n#else\n#define waitForLast() \\\n while (NVMCTRL->INTFLAG.bit.READY == 0) \\\n ;\n#endif\n\nstatic void unlock() {\n#ifdef SAMD51\n // see errata 2.14.1\n NVMCTRL->CTRLA.bit.CACHEDIS0 = true;\n NVMCTRL->CTRLA.bit.CACHEDIS1 = true;\n\n CMCC->CTRL.bit.CEN = 0;\n while (CMCC->SR.bit.CSTS) {\n }\n CMCC->MAINT0.bit.INVALL = 1;\n#endif\n}\n\nstatic void lock() {\n#ifdef SAMD51\n // re-enable cache\n NVMCTRL->CTRLA.bit.CACHEDIS0 = false;\n NVMCTRL->CTRLA.bit.CACHEDIS1 = false;\n\n // re-enable cortex-m cache - it's a separate one\n CMCC->CTRL.bit.CEN = 0;\n while (CMCC->SR.bit.CSTS) {\n }\n CMCC->MAINT0.bit.INVALL = 1;\n CMCC->CTRL.bit.CEN = 1;\n#endif\n}\n\nint ZFlash::totalSize() {\n return (8 << NVMCTRL->PARAM.bit.PSZ) * NVMCTRL->PARAM.bit.NVMP;\n}\n\n// this returns the size of \"page\" that can be erased (\"row\" in datasheet)\nint ZFlash::pageSize(uintptr_t address) {\n#ifdef SAMD51\n if (address < (uintptr_t)totalSize())\n return NVMCTRL_BLOCK_SIZE; // 8k\n#else\n if (address < (uintptr_t)totalSize())\n return 256;\n#endif\n target_panic(DEVICE_FLASH_ERROR);\n return 0;\n}\n\n#ifdef SAMD51\n#define CMD(D21, D51) NVMCTRL->CTRLB.reg = NVMCTRL_CTRLB_CMDEX_KEY | D51\n#else\n#define CMD(D21, D51) NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | D21\n#endif\n\nint ZFlash::erasePage(uintptr_t address) {\n LOG(\"Erase %x\", address);\n#ifdef SAMD51\n NVMCTRL->CTRLA.bit.WMODE = NVMCTRL_CTRLA_WMODE_MAN_Val;\n#else\n NVMCTRL->CTRLB.bit.MANW = 1;\n#endif\n waitForLast();\n unlock();\n#ifdef SAMD51\n NVMCTRL->ADDR.reg = address;\n#else\n // yeah... /2\n NVMCTRL->ADDR.reg = address / 2;\n#endif\n CMD(NVMCTRL_CTRLA_CMD_ER, NVMCTRL_CTRLB_CMD_EB);\n waitForLast();\n lock();\n return 0;\n}\n\n#if 0\n#define CHECK_ECC() \\\n if (NVMCTRL->INTFLAG.bit.ECCSE || NVMCTRL->INTFLAG.bit.ECCDE) \\\n return -10\n#else\n#define CHECK_ECC() ((void)0)\n#endif\n\nint ZFlash::writeBytes(uintptr_t dst, const void *src, uint32_t len) {\n#ifdef SAMD51\n CHECK_ECC();\n\n // only allow writing double word at a time\n if (len & 7)\n return -1;\n if (dst & 7)\n return -2;\n\n // every double-word can only be written once, otherwise we get ECC errors\n // and no, ECC cannot be disabled\n for (unsigned i = 0; i < (len >> 3); ++i)\n if (((uint64_t *)dst)[i] != 0xffffffffffffffff &&\n ((uint64_t *)src)[i] != 0xffffffffffffffff)\n return -3;\n#define WRITE_SIZE 16\n#else\n if ((dst & 3) || (len & 3))\n return -1;\n\n for (unsigned i = 0; i < len; ++i)\n if (((uint8_t *)dst)[i] != 0xff && ((uint8_t *)src)[i] != 0xff)\n return -3;\n#define WRITE_SIZE 64\n#endif\n\n uint32_t writeBuf[WRITE_SIZE >> 2];\n uint32_t idx = 0;\n\n waitForLast();\n unlock();\n __DMB();\n\n while (idx < len) {\n uint32_t off = dst & (WRITE_SIZE - 1);\n uint32_t n = WRITE_SIZE - off;\n if (n > len - idx)\n n = len - idx;\n uint32_t *sp;\n volatile uint32_t *dp;\n if (n != WRITE_SIZE) {\n memset(writeBuf, 0xff, WRITE_SIZE);\n memcpy((uint8_t *)writeBuf + off, src, n);\n sp = writeBuf;\n dp = (uint32_t *)(dst - off);\n } else {\n sp = (uint32_t *)src;\n dp = (uint32_t *)dst;\n }\n\n bool need = false;\n for (unsigned i = 0; i < (WRITE_SIZE >> 2); ++i)\n if (sp[i] != 0xffffffff) {\n need = true;\n break;\n }\n\n if (need) {\n CMD(NVMCTRL_CTRLA_CMD_PBC, NVMCTRL_CTRLB_CMD_PBC);\n waitForLast();\n\n uint32_t q = WRITE_SIZE >> 2;\n\n target_disable_irq();\n while (q--) {\n auto v = *sp++;\n *dp = v;\n dp++;\n }\n\n CMD(NVMCTRL_CTRLA_CMD_WP, NVMCTRL_CTRLB_CMD_WQW);\n target_enable_irq();\n waitForLast();\n }\n\n src = (uint8_t *)src + n;\n dst += n;\n idx += n;\n }\n\n CHECK_ECC();\n\n lock();\n\n return 0;\n}\n} // namespace codal\n#endif\n",
|
|
2842
2842
|
"STM32Flash.cpp": "#include \"pxt.h\"\n#include \"Flash.h\"\n\n//#define LOG DMESG\n#define LOG NOLOG\n\n#ifdef STM32F4\nnamespace codal {\nstatic void waitForLast() {\n while ((FLASH->SR & FLASH_SR_BSY) == FLASH_SR_BSY)\n ;\n}\n\nstatic void unlock() {\n FLASH->CR |= FLASH_CR_LOCK;\n FLASH->KEYR = FLASH_KEY1;\n FLASH->KEYR = FLASH_KEY2;\n}\n\nstatic void lock() {\n FLASH->CR |= FLASH_CR_LOCK;\n}\n\nint ZFlash::pageSize(uintptr_t address) {\n address |= 0x08000000;\n if (address < 0x08010000)\n return 16 * 1024;\n if (address < 0x08020000)\n return 64 * 1024;\n if (address < 0x08100000)\n return 128 * 1024;\n target_panic(DEVICE_FLASH_ERROR);\n return 0;\n}\n\nint ZFlash::totalSize() {\n return *((uint16_t *)0x1FFF7A22) * 1024;\n}\n\nint ZFlash::erasePage(uintptr_t address) {\n waitForLast();\n unlock();\n\n address |= 0x08000000;\n uintptr_t ptr = 0x08000000;\n int sectNum = 0;\n while (1) {\n ptr += pageSize(ptr);\n if (ptr > address)\n break;\n sectNum++;\n }\n\n FLASH->CR = FLASH_CR_PSIZE_1 | (sectNum << FLASH_CR_SNB_Pos) | FLASH_CR_SER;\n FLASH->CR |= FLASH_CR_STRT;\n\n waitForLast();\n\n FLASH->CR = FLASH_CR_PSIZE_1;\n lock();\n\n // cache flushing only required after erase, not programming (3.5.4)\n __HAL_FLASH_DATA_CACHE_DISABLE();\n __HAL_FLASH_DATA_CACHE_RESET();\n __HAL_FLASH_DATA_CACHE_ENABLE();\n\n // we skip instruction cache, as we're not expecting to erase that\n\n return 0;\n}\n\nint ZFlash::writeBytes(uintptr_t dst, const void *src, uint32_t len) {\n LOG(\"WR flash at %p len=%d\", (void *)dst, len);\n\n if ((dst & 3) || ((uintptr_t)src & 3) || (len & 3))\n return -1;\n\n for (unsigned i = 0; i < len; ++i)\n if (((uint8_t *)dst)[i] != 0xff && ((uint8_t *)src)[i] != 0xff)\n return -3;\n\n waitForLast();\n unlock();\n\n dst |= 0x08000000;\n\n FLASH->CR = FLASH_CR_PSIZE_1 | FLASH_CR_PG;\n\n volatile uint32_t *sp = (uint32_t *)src;\n volatile uint32_t *dp = (uint32_t *)dst;\n len >>= 2;\n\n while (len-- > 0) {\n uint32_t v = *sp++;\n if (v != 0xffffffff) {\n *dp++ = v;\n waitForLast();\n } else {\n dp++;\n }\n }\n\n FLASH->CR = FLASH_CR_PSIZE_1;\n lock();\n\n LOG(\"WR flash OK\");\n\n return 0;\n}\n} // namespace codal\n#endif\n",
|
|
2843
|
-
"pxt.json": "{\n \"name\": \"settings\",\n \"description\": \"Settings storage in internal flash\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"RAFFS.cpp\",\n \"RAFFS.h\",\n \"Flash.h\",\n \"STM32Flash.cpp\",\n \"SAMDFlash.cpp\",\n \"NRF52Flash.cpp\",\n \"RP2040Flash.cpp\",\n \"settings.cpp\",\n \"settings.ts\",\n \"shims.d.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2843
|
+
"pxt.json": "{\n \"name\": \"settings\",\n \"description\": \"Settings storage in internal flash\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"RAFFS.cpp\",\n \"RAFFS.h\",\n \"Flash.h\",\n \"STM32Flash.cpp\",\n \"SAMDFlash.cpp\",\n \"NRF52Flash.cpp\",\n \"RP2040Flash.cpp\",\n \"settings.cpp\",\n \"settings.ts\",\n \"shims.d.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"hidden\": true,\n \"disablesVariants\": [\n \"mbdal\"\n ]\n}\n",
|
|
2844
2844
|
"settings.cpp": "\n#include \"pxt.h\"\n#include \"RAFFS.h\"\n#include \"GhostFAT.h\"\n\nusing namespace pxt::raffs;\nusing namespace codal;\n\nnamespace settings {\n\n#if defined(SAMD21)\n#define SETTINGS_SIZE (2 * 1024)\n#else\n#define SETTINGS_SIZE (32 * 1024)\n#endif\n\nclass WStorage {\n public:\n CODAL_FLASH flash;\n FS fs;\n bool isMounted;\n\n WStorage()\n : flash(),\n#if defined(STM32F4)\n fs(flash, 0x8008000, SETTINGS_SIZE),\n#elif defined(SAMD51)\n fs(flash, 512 * 1024 - SETTINGS_SIZE, SETTINGS_SIZE),\n#elif defined(SAMD21)\n fs(flash, 256 * 1024 - SETTINGS_SIZE, SETTINGS_SIZE),\n#elif defined(NRF52_SERIES)\n#define NRF_BOOTLOADER_START *(uint32_t *)0x10001014\n fs(flash,\n 128 * 1024 < NRF_BOOTLOADER_START && NRF_BOOTLOADER_START < (uint32_t)flash.totalSize()\n ? NRF_BOOTLOADER_START - SETTINGS_SIZE\n : flash.totalSize() - SETTINGS_SIZE,\n SETTINGS_SIZE),\n#elif defined(PICO_BOARD)\n // XIP bias 0x10000000\n fs(flash, 0x10000000 + flash.totalSize() - SETTINGS_SIZE, SETTINGS_SIZE),\n#else\n fs(flash),\n#endif\n isMounted(false) {\n fs.minGCSpacing = 10000;\n }\n};\nSINGLETON(WStorage);\n\nstatic WStorage *mountedStorage() {\n auto s = getWStorage();\n if (s->fs.tryMount())\n return s;\n s->fs.exists(\"foobar\"); // forces mount and possibly format\n return s;\n}\n\n// large store is area for storing large binary objects, eg ML models\n// it may be already occupied by the user program, in which case largeStoreStart() will return 0\nsize_t largeStoreSize() {\n#if defined(SAMD21)\n return 64 * 1024;\n#else\n return 128 * 1024;\n#endif\n}\n\nuintptr_t largeStoreStart() {\n auto s = getWStorage();\n uintptr_t r;\n#if defined(STM32F4)\n r = 0x08000000 + s->flash.totalSize() - largeStoreSize();\n#else\n r = s->fs.baseAddr - s->fs.bytes - largeStoreSize();\n#endif\n\n if (r < afterProgramPage())\n return 0;\n\n return r;\n}\n\nCODAL_FLASH *largeStoreFlash() {\n return &getWStorage()->flash;\n}\n\n//%\nint _set(String key, Buffer data) {\n auto s = mountedStorage();\n return s->fs.write(key->getUTF8Data(), data->data, data->length);\n}\n\n//%\nint _remove(String key) {\n auto s = mountedStorage();\n return s->fs.remove(key->getUTF8Data());\n}\n\n//%\nbool _exists(String key) {\n auto s = mountedStorage();\n return s->fs.exists(key->getUTF8Data());\n}\n\n//%\nBuffer _get(String key) {\n auto s = mountedStorage();\n auto sz = s->fs.read(key->getUTF8Data(), NULL, 0);\n if (sz < 0)\n return NULL;\n auto ret = mkBuffer(NULL, sz);\n registerGCObj(ret);\n s->fs.read(NULL, ret->data, ret->length);\n unregisterGCObj(ret);\n return ret;\n}\n\nstatic bool isSystem(const char *fn) {\n return fn[0] == '#';\n}\n\n//%\nvoid _userClean() {\n auto s = mountedStorage();\n DMESG(\"clearing user files\");\n s->fs.forceGC(isSystem);\n // if system files take more than 25% of storage size, we reformat\n // it likely means user code has written some 'system' files\n if (s->fs.freeSize() < 3 * s->fs.totalSize() / 4) {\n s->fs.format();\n }\n}\n\n//%\nRefCollection *_list(String prefix) {\n auto st = mountedStorage();\n st->fs.dirRewind();\n auto res = Array_::mk();\n registerGCObj(res);\n\n auto prefData = prefix->getUTF8Data();\n auto prefLen = prefix->getUTF8Size();\n auto wantsInternal = prefData[0] == '#';\n\n for (;;) {\n auto d = st->fs.dirRead();\n if (!d)\n break;\n if (!wantsInternal && d->name[0] == '#')\n continue;\n if (memcmp(d->name, prefData, prefLen) != 0)\n continue;\n auto str = mkString(d->name, -1);\n registerGCObj(str);\n res->head.push((TValue)str);\n unregisterGCObj(str);\n }\n unregisterGCObj(res);\n return res;\n}\n\n} // namespace settings\n",
|
|
2845
2845
|
"settings.ts": "namespace settings {\n const RUN_KEY = \"#run\";\n const SCOPE_KEY = \"#scope\";\n const DEVICE_SECRETS_KEY = \"#secrets\";\n const SECRETS_KEY = \"__secrets\";\n\n //% shim=pxt::seedAddRandom\n declare function seedAddRandom(n: number): void;\n\n //% shim=settings::_set\n declare function _set(key: string, data: Buffer): int32;\n\n //% shim=settings::_remove\n declare function _remove(key: string): int32;\n\n //% shim=settings::_exists\n declare function _exists(key: string): boolean;\n\n //% shim=settings::_get\n declare function _get(key: string): Buffer;\n\n //% shim=settings::_userClean\n declare function _userClean(): void;\n\n //% shim=settings::_list\n declare function _list(prefix: string): string[];\n\n export function runNumber() {\n return readNumber(RUN_KEY) || 0\n }\n\n function setScope(scope: string) {\n if (!scope || scope.length > 100)\n control.panic(922)\n const currScope = readString(SCOPE_KEY)\n if (currScope != scope) {\n _userClean()\n writeString(SCOPE_KEY, scope)\n }\n }\n\n function initScopes() {\n const rn = runNumber() + 1\n writeNumber(RUN_KEY, rn)\n\n seedAddRandom(control.deviceSerialNumber() & 0x7fffffff)\n seedAddRandom(rn)\n\n setScope(control.programName())\n }\n\n initScopes()\n\n /** \n * Delete all non-system settings.\n */\n export function clear(): void {\n _userClean()\n }\n\n /**\n * Set named setting to a given buffer.\n */\n export function writeBuffer(key: string, value: Buffer) {\n if (_set(key, value)) {\n // if we're out of space, clear user storage\n _userClean()\n // and panic - reset should hopefully recreate needed files\n control.panic(920)\n }\n }\n\n /**\n * Set named settings to a given string.\n */\n export function writeString(key: string, value: string) {\n writeBuffer(key, control.createBufferFromUTF8(value))\n }\n\n /**\n * Set named settings to a given JSON object.\n */\n export function writeJSON(key: string, value: any) {\n writeString(key, JSON.stringify(value))\n }\n\n /**\n * Set named settings to a given number.\n */\n export function writeNumber(key: string, value: number) {\n writeBuffer(key, msgpack.packNumberArray([value]))\n }\n\n /**\n * Set named settings to a given array of numbers.\n */\n export function writeNumberArray(key: string, value: number[]) {\n writeBuffer(key, msgpack.packNumberArray(value))\n }\n\n /**\n * Read named setting as a buffer. Returns undefined when setting not found.\n */\n export function readBuffer(key: string) {\n return _get(key)\n }\n\n /**\n * Read named setting as a string.\n */\n export function readString(key: string) {\n const buf = readBuffer(key)\n if (!buf)\n return undefined\n else\n return buf.toString()\n }\n\n /**\n * Read named setting as a JSON object.\n */\n export function readJSON(key: string) {\n const s = readString(key)\n if (s)\n return JSON.parse(s)\n return undefined\n }\n\n /**\n * Read named setting as a number.\n */\n export function readNumber(key: string) {\n const buf = readBuffer(key)\n if (!buf)\n return undefined\n else {\n const nums = msgpack.unpackNumberArray(buf)\n if (nums && nums.length >= 1)\n return nums[0]\n return undefined\n }\n }\n\n /**\n * Read named setting as a number.\n */\n export function readNumberArray(key: string) {\n const buf = readBuffer(key)\n if (!buf)\n return undefined\n else\n return msgpack.unpackNumberArray(buf)\n }\n\n /**\n * Return a list of settings starting with a given prefix.\n */\n export function list(prefix?: string) {\n if (!prefix) prefix = \"\"\n return _list(prefix)\n }\n\n /**\n * Remove named setting.\n */\n export function remove(key: string) {\n _remove(key)\n }\n\n /**\n * Check if a named setting exists.\n */\n export function exists(key: string) {\n return _exists(key)\n }\n\n function clone(v: any): any {\n if (v == null) return null\n return JSON.parse(JSON.stringify(v))\n }\n\n function isKV(v: any) {\n return !!v && typeof v === \"object\" && !Array.isArray(v)\n }\n\n function jsonMergeFrom(trg: any, src: any) {\n if (!src) return;\n const keys = Object.keys(src)\n keys.forEach(k => {\n const srck = src[k];\n if (isKV(trg[k]) && isKV(srck))\n jsonMergeFrom(trg[k], srck);\n else\n trg[k] = clone(srck);\n });\n }\n\n //% fixedInstances\n export class SecretStore {\n constructor(private key: string) { }\n\n setSecret(name: string, value: any) {\n const secrets = this.readSecrets();\n secrets[name] = value;\n writeJSON(this.key, secrets);\n }\n\n updateSecret(name: string, value: any) {\n const secrets = this.readSecrets();\n const secret = secrets[name];\n if (secret === undefined)\n secrets[name] = value;\n else jsonMergeFrom(secret, value);\n writeJSON(this.key, secrets)\n }\n\n readSecret(name: string, ensure: boolean = false): any {\n const secrets = this.readSecrets();\n const secret = secrets[name];\n if (ensure && !secret)\n throw \"missing secret \" + name;\n return secret;\n }\n\n clearSecrets() {\n writeString(this.key, \"{}\");\n }\n\n readSecrets(): any {\n try {\n return readJSON(this.key) || {}\n } catch {\n control.dmesg(\"invalid secret format\")\n return {};\n }\n }\n }\n\n /**\n * Secrets shared by any program on the device\n */\n //% fixedInstance whenUsed block=\"device secrets\"\n export const deviceSecrets = new SecretStore(DEVICE_SECRETS_KEY);\n\n /**\n * Program secrets\n */\n //% fixedInstance whenUsed block=\"program secrets\"\n export const programSecrets = new SecretStore(SECRETS_KEY);\n}\n",
|
|
2846
2846
|
"shims.d.ts": "\n"
|
|
@@ -2849,13 +2849,13 @@ var pxtTargetBundle = {
|
|
|
2849
2849
|
"README.md": "# datalog\n",
|
|
2850
2850
|
"enums.d.ts": "// Auto-generated. Do not edit.\n\n\n declare const enum FlashLogTimeStampFormat\n {\n //% block=\"none\"\n None = 0,\n //% block=\"milliseconds\"\n Milliseconds = 1,\n //% block=\"seconds\"\n Seconds = 10,\n //% block=\"minutes\"\n Minutes = 600,\n //% block=\"hours\"\n Hours = 36000,\n //% block=\"days\"\n Days = 864000,\n }\ndeclare namespace flashlog {\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2851
2851
|
"flashlog.cpp": "#include \"pxt.h\"\n\n#if MICROBIT_CODAL\n#include \"MicroBitLog.h\"\n#endif\n\nenum class FlashLogTimeStampFormat\n{\n //% block=\"none\"\n None = 0,\n //% block=\"milliseconds\"\n Milliseconds = 1,\n //% block=\"seconds\"\n Seconds = 10,\n //% block=\"minutes\"\n Minutes = 600,\n //% block=\"hours\"\n Hours = 36000,\n //% block=\"days\"\n Days = 864000\n};\n\n/**\n * Storing structured data in flash.\n */\n//%\nnamespace flashlog {\n\n/**\n* Creates a new row in the log, ready to be populated by logData()\n**/\n//% help=flashlog/begin-row\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nint beginRow() {\n#if MICROBIT_CODAL\n return uBit.log.beginRow();\n#else\n return DEVICE_NOT_SUPPORTED;\n#endif\n}\n\n/**\n* Populates the current row with the given key/value pair.\n**/\n//% help=flashlog/log-data\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nint logData(String key, String value) {\n if (NULL == key || NULL == value)\n return DEVICE_INVALID_PARAMETER;\n#if MICROBIT_CODAL\n return uBit.log.logData(MSTR(key), MSTR(value));\n#else\n return DEVICE_NOT_SUPPORTED;\n#endif\n}\n\n/**\n* Inject the given row into the log as text, ignoring key/value pairs.\n**/\n//% help=flashlog/log-string\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nint logString(String value) {\n if (NULL == value)\n return DEVICE_INVALID_PARAMETER;\n#if MICROBIT_CODAL\n return uBit.log.logString(MSTR(value));\n#else\n return DEVICE_NOT_SUPPORTED;\n#endif\n}\n\n/**\n* Complete a row in the log, and pushes to persistent storage.\n**/\n//% help=flashlog/end-row\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nint endRow() {\n#if MICROBIT_CODAL\n return uBit.log.endRow();\n#else\n return DEVICE_NOT_SUPPORTED;\n#endif\n}\n\n/**\n* Resets all data stored in persistent storage.\n**/\n//% help=flashlog/clear\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nvoid clear(bool fullErase) {\n#if MICROBIT_CODAL\n uBit.log.clear(fullErase);\n#endif\n}\n\n/**\n* Determines the format of the timestamp data to be added (if any).\n* If requested, time stamps will be automatically added to each row of data\n* as an integer value rounded down to the unit specified.\n*\n* @param format The format of timestamp to use.\n*/\n//% help=flashlog/set-timestamp\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nvoid setTimeStamp(FlashLogTimeStampFormat format) {\n#if MICROBIT_CODAL\n return uBit.log.setTimeStamp((codal::TimeStampFormat)format);\n#endif\n}\n\n/**\n * Defines if data logging should also be streamed over the serial port.\n *\n * @param enable True to enable serial port streaming, false to disable.\n*/\n//% help=flashlog/set-serial-mirroring\n//% parts=\"flashlog\"\n//% blockGap=8\n//% group=\"micro:bit (V2)\"\nvoid setSerialMirroring(bool enable) {\n#if MICROBIT_CODAL\n return uBit.log.setSerialMirroring(enable);\n#endif\n}\n\n}\n",
|
|
2852
|
-
"pxt.json": "{\n \"name\": \"flashlog\",\n \"description\": \"Data logging to flash.\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"flashlog.cpp\",\n \"shims.d.ts\",\n \"enums.d.ts\"\n ],\n \"testFiles\": [\n \"test.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2852
|
+
"pxt.json": "{\n \"name\": \"flashlog\",\n \"description\": \"Data logging to flash.\",\n \"dependencies\": {\n \"core\": \"*\"\n },\n \"files\": [\n \"README.md\",\n \"flashlog.cpp\",\n \"shims.d.ts\",\n \"enums.d.ts\"\n ],\n \"testFiles\": [\n \"test.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"searchOnly\": true,\n \"disablesVariants\": [\n \"mbdal\"\n ],\n \"icon\": \"/static/libs/flashlog.png\"\n}\n",
|
|
2853
2853
|
"shims.d.ts": "// Auto-generated. Do not edit.\n\n\n /**\n * Storing structured data in flash.\n */\n //%\ndeclare namespace flashlog {\n\n /**\n * Creates a new row in the log, ready to be populated by logData()\n **/\n //% help=flashlog/begin-row\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::beginRow\n function beginRow(): int32;\n\n /**\n * Populates the current row with the given key/value pair.\n **/\n //% help=flashlog/log-data\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::logData\n function logData(key: string, value: string): int32;\n\n /**\n * Inject the given row into the log as text, ignoring key/value pairs.\n **/\n //% help=flashlog/log-string\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::logString\n function logString(value: string): int32;\n\n /**\n * Complete a row in the log, and pushes to persistent storage.\n **/\n //% help=flashlog/end-row\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::endRow\n function endRow(): int32;\n\n /**\n * Resets all data stored in persistent storage.\n **/\n //% help=flashlog/clear\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::clear\n function clear(fullErase: boolean): void;\n\n /**\n * Determines the format of the timestamp data to be added (if any).\n * If requested, time stamps will be automatically added to each row of data\n * as an integer value rounded down to the unit specified.\n *\n * @param format The format of timestamp to use.\n */\n //% help=flashlog/set-timestamp\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::setTimeStamp\n function setTimeStamp(format: FlashLogTimeStampFormat): void;\n\n /**\n * Defines if data logging should also be streamed over the serial port.\n *\n * @param enable True to enable serial port streaming, false to disable.\n */\n //% help=flashlog/set-serial-mirroring\n //% parts=\"flashlog\"\n //% blockGap=8\n //% group=\"micro:bit (V2)\" shim=flashlog::setSerialMirroring\n function setSerialMirroring(enable: boolean): void;\n}\n\n// Auto-generated. Do not edit. Really.\n",
|
|
2854
2854
|
"test.ts": "input.onButtonPressed(Button.AB, function() {\n flashlog.clear()\n})\nflashlog.setTimeStamp(FlashLogTimeStampFormat.Milliseconds)\nbasic.forever(function () {\n led.toggle(0, 0)\n const ax = input.acceleration(Dimension.X)\n\tflashlog.beginRow()\n flashlog.logData(`a.x`, ax)\n flashlog.logData(`a.y`, input.acceleration(Dimension.Y))\n flashlog.endRow()\n})\n"
|
|
2855
2855
|
},
|
|
2856
2856
|
"datalogger": {
|
|
2857
2857
|
"datalogger.ts": "/**\n * Log data to flash storage\n */\n//% block=\"Data Logger\"\n//% icon=\"\\uf0ce\"\n//% color=\"#378273\"\nnamespace datalogger {\n export enum DeleteType {\n //% block=\"fast\"\n Fast,\n //% block=\"full\"\n Full\n }\n\n let onLogFullHandler: () => void;\n let _disabled = false;\n\n let initialized = false;\n function init() {\n if (initialized)\n return;\n initialized = true;\n\n includeTimestamp(FlashLogTimeStampFormat.Seconds);\n mirrorToSerial(true);\n\n control.onEvent(DAL.MICROBIT_ID_LOG, DAL.MICROBIT_LOG_EVT_LOG_FULL, () => {\n _disabled = true;\n if (onLogFullHandler) {\n onLogFullHandler();\n } else {\n basic.showLeds(`\n # . . . #\n # # . # #\n . . . . .\n . # # # .\n # . . . #\n `);\n basic.pause(1000);\n basic.clearScreen();\n basic.showString(\"928\");\n }\n });\n }\n\n export class ColumnValue {\n public value: string;\n constructor(\n public column: string,\n value: any\n ) {\n this.value = \"\" + value;\n }\n }\n\n /**\n * A column and value to log to flash storage\n * @param column the column to set\n * @param value the value to set.\n * @returns A new value that can be stored in flash storage using log data\n */\n //% block=\"column $column value $value\"\n //% value.shadow=math_number\n //% blockId=dataloggercreatecolumnvalue\n //% group=\"micro:bit (V2)\"\n //% weight=80 help=datalogger/create-cv\n export function createCV(column: string, value: any): ColumnValue {\n return new ColumnValue(column, value);\n }\n\n /**\n * Log data to flash storage\n * @param data Array of data to be logged to flash storage\n */\n //% block=\"log data $data\"\n //% blockId=dataloggerlogdata\n //% data.shadow=lists_create_with\n //% data.defl=dataloggercreatecolumnvalue\n //% group=\"micro:bit (V2)\"\n //% weight=100 help=datalogger/log-data\n export function logData(data: ColumnValue[]): void {\n if (!data || !data.length)\n return;\n init();\n\n if (_disabled)\n return;\n\n flashlog.beginRow();\n for (const cv of data) {\n flashlog.logData(cv.column, cv.value);\n }\n flashlog.endRow();\n }\n\n /**\n * Set the columns for future data logging\n * @param cols Array of the columns that will be logged.\n */\n //% block=\"set columns $cols\"\n //% blockId=dataloggersetcolumns\n //% data.shadow=list_create_with\n //% group=\"micro:bit (V2)\"\n //% weight=70 help=datalogger/set-columns\n export function setColumns(cols: string[]): void {\n if (!cols)\n return;\n\n logData(cols.map(col => createCV(col, \"\")));\n }\n\n /**\n * Delete all existing logs, including column headers. By default this only marks the log as\n * overwriteable / deletable in the future.\n * @param deleteType optional set whether a deletion will be fast or full\n */\n //% block=\"delete log||$deleteType\"\n //% blockId=dataloggerdeletelog\n //% group=\"micro:bit (V2)\"\n //% weight=60 help=datalogger/delete-log\n export function deleteLog(deleteType?: DeleteType): void {\n init();\n flashlog.clear(deleteType === DeleteType.Full);\n _disabled = false;\n }\n\n /**\n * Register an event to run when no more data can be logged.\n * @param handler code to run when the log is full and no more data can be stored.\n */\n //% block=\"on log full\"\n //% blockId=\"on log full\"\n //% group=\"micro:bit (V2)\"\n //% weight=40 help=datalogger/on-log-full\n export function onLogFull(handler: () => void): void {\n init();\n onLogFullHandler = handler;\n }\n\n /**\n * Set the format for timestamps\n * @param format Format in which to show the timestamp. Setting FlashLogTimeStampFormat.None will disable the timestamp.\n */\n //% block=\"set timestamp $format\"\n //% blockId=dataloggertoggleincludetimestamp\n //% format.defl=FlashLogTimeStampFormat.None\n //% group=\"micro:bit (V2)\"\n //% weight=30 help=datalogger/include-timestamp\n export function includeTimestamp(format: FlashLogTimeStampFormat): void {\n init();\n flashlog.setTimeStamp(format);\n }\n\n /**\n * Set whether data is mirrored to serial or not.\n * @param on if true, data that is logged will be mirrored to serial\n */\n //% block=\"mirror data to serial $on\"\n //% blockId=dataloggertogglemirrortoserial\n //% on.shadow=toggleOnOff\n //% on.defl=false\n //% weight=25 help=datalogger/mirror-to-serial\n export function mirrorToSerial(on: boolean): void {\n // TODO:/note intentionally does not have group, as having the same group for all\n // blocks in a category causes the group to be elided.\n init();\n flashlog.setSerialMirroring(on);\n }\n}",
|
|
2858
|
-
"pxt.json": "{\n \"name\": \"datalogger\",\n \"description\": \"Data logging to flash memory. micro:bit (V2) only.\",\n \"dependencies\": {\n \"core\": \"*\",\n \"flashlog\": \"*\"\n },\n \"files\": [\n \"datalogger.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.
|
|
2858
|
+
"pxt.json": "{\n \"name\": \"datalogger\",\n \"description\": \"Data logging to flash memory. micro:bit (V2) only.\",\n \"dependencies\": {\n \"core\": \"*\",\n \"flashlog\": \"*\"\n },\n \"files\": [\n \"datalogger.ts\"\n ],\n \"public\": true,\n \"targetVersions\": {\n \"target\": \"4.1.26\",\n \"pxt\": \"7.5.21\"\n },\n \"disablesVariants\": [\n \"mbdal\"\n ],\n \"icon\": \"/static/libs/datalogger.png\"\n}\n"
|
|
2859
2859
|
}
|
|
2860
2860
|
},
|
|
2861
2861
|
"apiInfo": {
|
|
@@ -9509,13 +9509,13 @@ var pxtTargetBundle = {
|
|
|
9509
9509
|
"attributes": {
|
|
9510
9510
|
"blockId": "music_set_built_in_speaker_enable",
|
|
9511
9511
|
"block": "set built-in speaker $enabled",
|
|
9512
|
-
"blockGap": "8",
|
|
9513
9512
|
"group": "micro:bit (V2)",
|
|
9514
9513
|
"parts": "builtinspeaker",
|
|
9515
9514
|
"help": "music/set-built-in-speaker-enabled",
|
|
9516
9515
|
"_shadowOverrides": {
|
|
9517
9516
|
"enabled": "toggleOnOff"
|
|
9518
9517
|
},
|
|
9518
|
+
"weight": 0,
|
|
9519
9519
|
"paramHelp": {
|
|
9520
9520
|
"enabled": "whether the built-in speaker is enabled in addition to the sound pin"
|
|
9521
9521
|
},
|
|
@@ -28045,6 +28045,7 @@ var pxtTargetBundle = {
|
|
|
28045
28045
|
"help": "music/play",
|
|
28046
28046
|
"group": "micro:bit (V2)",
|
|
28047
28047
|
"parts": "builtinspeaker",
|
|
28048
|
+
"deprecated": "1",
|
|
28048
28049
|
"jsDoc": "Starts to play a sound expression.",
|
|
28049
28050
|
"_def": {
|
|
28050
28051
|
"parts": [
|
|
@@ -28080,6 +28081,7 @@ var pxtTargetBundle = {
|
|
|
28080
28081
|
"help": "music/play-until-done",
|
|
28081
28082
|
"group": "micro:bit (V2)",
|
|
28082
28083
|
"parts": "builtinspeaker",
|
|
28084
|
+
"deprecated": "1",
|
|
28083
28085
|
"jsDoc": "Plays a sound expression until finished",
|
|
28084
28086
|
"_def": {
|
|
28085
28087
|
"parts": [
|
|
@@ -28112,6 +28114,13 @@ var pxtTargetBundle = {
|
|
|
28112
28114
|
"isInstance": true,
|
|
28113
28115
|
"pyQName": "SoundExpression.play_until_done"
|
|
28114
28116
|
},
|
|
28117
|
+
"SoundExpression.getNotes": {
|
|
28118
|
+
"kind": -1,
|
|
28119
|
+
"retType": "string",
|
|
28120
|
+
"parameters": [],
|
|
28121
|
+
"isInstance": true,
|
|
28122
|
+
"pyQName": "SoundExpression.get_notes"
|
|
28123
|
+
},
|
|
28115
28124
|
"WaveShape": {
|
|
28116
28125
|
"kind": 6,
|
|
28117
28126
|
"retType": "WaveShape",
|
|
@@ -28168,14 +28177,6 @@ var pxtTargetBundle = {
|
|
|
28168
28177
|
"Number"
|
|
28169
28178
|
]
|
|
28170
28179
|
},
|
|
28171
|
-
"InterpolationCurve.None": {
|
|
28172
|
-
"retType": "InterpolationCurve.None",
|
|
28173
|
-
"extendsTypes": [
|
|
28174
|
-
"InterpolationCurve.None",
|
|
28175
|
-
"Number"
|
|
28176
|
-
],
|
|
28177
|
-
"pyQName": "InterpolationCurve.NONE"
|
|
28178
|
-
},
|
|
28179
28180
|
"InterpolationCurve.Linear": {
|
|
28180
28181
|
"retType": "InterpolationCurve.Linear",
|
|
28181
28182
|
"extendsTypes": [
|
|
@@ -28240,6 +28241,56 @@ var pxtTargetBundle = {
|
|
|
28240
28241
|
],
|
|
28241
28242
|
"pyQName": "SoundExpressionEffect.WARBLE"
|
|
28242
28243
|
},
|
|
28244
|
+
"SoundExpressionPlayMode": {
|
|
28245
|
+
"kind": 6,
|
|
28246
|
+
"retType": "SoundExpressionPlayMode",
|
|
28247
|
+
"extendsTypes": [
|
|
28248
|
+
"SoundExpressionPlayMode",
|
|
28249
|
+
"Number"
|
|
28250
|
+
]
|
|
28251
|
+
},
|
|
28252
|
+
"SoundExpressionPlayMode.UntilDone": {
|
|
28253
|
+
"retType": "SoundExpressionPlayMode.UntilDone",
|
|
28254
|
+
"attributes": {
|
|
28255
|
+
"block": "until done",
|
|
28256
|
+
"_def": {
|
|
28257
|
+
"parts": [
|
|
28258
|
+
{
|
|
28259
|
+
"kind": "label",
|
|
28260
|
+
"text": "until done",
|
|
28261
|
+
"style": []
|
|
28262
|
+
}
|
|
28263
|
+
],
|
|
28264
|
+
"parameters": []
|
|
28265
|
+
}
|
|
28266
|
+
},
|
|
28267
|
+
"extendsTypes": [
|
|
28268
|
+
"SoundExpressionPlayMode.UntilDone",
|
|
28269
|
+
"Number"
|
|
28270
|
+
],
|
|
28271
|
+
"pyQName": "SoundExpressionPlayMode.UNTIL_DONE"
|
|
28272
|
+
},
|
|
28273
|
+
"SoundExpressionPlayMode.InBackground": {
|
|
28274
|
+
"retType": "SoundExpressionPlayMode.InBackground",
|
|
28275
|
+
"attributes": {
|
|
28276
|
+
"block": "in background",
|
|
28277
|
+
"_def": {
|
|
28278
|
+
"parts": [
|
|
28279
|
+
{
|
|
28280
|
+
"kind": "label",
|
|
28281
|
+
"text": "in background",
|
|
28282
|
+
"style": []
|
|
28283
|
+
}
|
|
28284
|
+
],
|
|
28285
|
+
"parameters": []
|
|
28286
|
+
}
|
|
28287
|
+
},
|
|
28288
|
+
"extendsTypes": [
|
|
28289
|
+
"SoundExpressionPlayMode.InBackground",
|
|
28290
|
+
"Number"
|
|
28291
|
+
],
|
|
28292
|
+
"pyQName": "SoundExpressionPlayMode.IN_BACKGROUND"
|
|
28293
|
+
},
|
|
28243
28294
|
"soundExpression": {
|
|
28244
28295
|
"kind": 5,
|
|
28245
28296
|
"retType": ""
|
|
@@ -28821,17 +28872,17 @@ var pxtTargetBundle = {
|
|
|
28821
28872
|
],
|
|
28822
28873
|
"pyQName": "soundExpression.play_sound"
|
|
28823
28874
|
},
|
|
28824
|
-
"
|
|
28875
|
+
"music.playSoundEffect": {
|
|
28825
28876
|
"kind": -3,
|
|
28826
28877
|
"attributes": {
|
|
28827
28878
|
"blockId": "soundExpression_playSoundEffect",
|
|
28828
|
-
"
|
|
28829
|
-
"block": "play sound $sound",
|
|
28879
|
+
"block": "play sound $sound $mode",
|
|
28830
28880
|
"_shadowOverrides": {
|
|
28831
28881
|
"sound": "soundExpression_createSoundEffect"
|
|
28832
28882
|
},
|
|
28833
|
-
"weight":
|
|
28883
|
+
"weight": 100,
|
|
28834
28884
|
"blockGap": "8",
|
|
28885
|
+
"group": "micro:bit (V2)",
|
|
28835
28886
|
"_def": {
|
|
28836
28887
|
"parts": [
|
|
28837
28888
|
{
|
|
@@ -28844,6 +28895,16 @@ var pxtTargetBundle = {
|
|
|
28844
28895
|
"name": "sound",
|
|
28845
28896
|
"shadowBlockId": "soundExpression_createSoundEffect",
|
|
28846
28897
|
"ref": true
|
|
28898
|
+
},
|
|
28899
|
+
{
|
|
28900
|
+
"kind": "label",
|
|
28901
|
+
"text": " ",
|
|
28902
|
+
"style": []
|
|
28903
|
+
},
|
|
28904
|
+
{
|
|
28905
|
+
"kind": "param",
|
|
28906
|
+
"name": "mode",
|
|
28907
|
+
"ref": true
|
|
28847
28908
|
}
|
|
28848
28909
|
],
|
|
28849
28910
|
"parameters": [
|
|
@@ -28852,6 +28913,11 @@ var pxtTargetBundle = {
|
|
|
28852
28913
|
"name": "sound",
|
|
28853
28914
|
"shadowBlockId": "soundExpression_createSoundEffect",
|
|
28854
28915
|
"ref": true
|
|
28916
|
+
},
|
|
28917
|
+
{
|
|
28918
|
+
"kind": "param",
|
|
28919
|
+
"name": "mode",
|
|
28920
|
+
"ref": true
|
|
28855
28921
|
}
|
|
28856
28922
|
]
|
|
28857
28923
|
}
|
|
@@ -28859,14 +28925,19 @@ var pxtTargetBundle = {
|
|
|
28859
28925
|
"parameters": [
|
|
28860
28926
|
{
|
|
28861
28927
|
"name": "sound",
|
|
28862
|
-
"type": "
|
|
28928
|
+
"type": "string"
|
|
28929
|
+
},
|
|
28930
|
+
{
|
|
28931
|
+
"name": "mode",
|
|
28932
|
+
"type": "SoundExpressionPlayMode",
|
|
28933
|
+
"isEnum": true
|
|
28863
28934
|
}
|
|
28864
28935
|
],
|
|
28865
|
-
"pyQName": "
|
|
28936
|
+
"pyQName": "music.play_sound_effect"
|
|
28866
28937
|
},
|
|
28867
|
-
"
|
|
28938
|
+
"music.createSoundEffect": {
|
|
28868
28939
|
"kind": -3,
|
|
28869
|
-
"retType": "
|
|
28940
|
+
"retType": "string",
|
|
28870
28941
|
"attributes": {
|
|
28871
28942
|
"paramDefl": {
|
|
28872
28943
|
"waveShape": "WaveShape.Sine",
|
|
@@ -28879,7 +28950,6 @@ var pxtTargetBundle = {
|
|
|
28879
28950
|
"interpolation": "InterpolationCurve.Linear"
|
|
28880
28951
|
},
|
|
28881
28952
|
"blockId": "soundExpression_createSoundEffect",
|
|
28882
|
-
"blockNamespace": "music",
|
|
28883
28953
|
"block": "$waveShape|| start frequency $startFrequency end frequency $endFrequency duration $duration start volume $startVolume end volume $endVolume effect $effect interpolation $interpolation",
|
|
28884
28954
|
"explicitDefaults": [
|
|
28885
28955
|
"waveShape",
|
|
@@ -28896,6 +28966,7 @@ var pxtTargetBundle = {
|
|
|
28896
28966
|
},
|
|
28897
28967
|
"compileHiddenArguments": true,
|
|
28898
28968
|
"inlineInputMode": "variable",
|
|
28969
|
+
"group": "micro:bit (V2)",
|
|
28899
28970
|
"_def": {
|
|
28900
28971
|
"parts": [
|
|
28901
28972
|
{
|
|
@@ -29072,11 +29143,47 @@ var pxtTargetBundle = {
|
|
|
29072
29143
|
"isEnum": true
|
|
29073
29144
|
}
|
|
29074
29145
|
],
|
|
29075
|
-
"pyQName": "
|
|
29146
|
+
"pyQName": "music.create_sound_effect"
|
|
29147
|
+
},
|
|
29148
|
+
"music.builtinSoundEffect": {
|
|
29149
|
+
"kind": -3,
|
|
29150
|
+
"retType": "string",
|
|
29151
|
+
"attributes": {
|
|
29152
|
+
"blockId": "soundExpression_builtinSoundEffect",
|
|
29153
|
+
"block": "$soundExpression",
|
|
29154
|
+
"blockGap": "8",
|
|
29155
|
+
"group": "micro:bit (V2)",
|
|
29156
|
+
"toolboxParent": "soundExpression_playSoundEffect",
|
|
29157
|
+
"toolboxParentArgument": "sound",
|
|
29158
|
+
"weight": 102,
|
|
29159
|
+
"_def": {
|
|
29160
|
+
"parts": [
|
|
29161
|
+
{
|
|
29162
|
+
"kind": "param",
|
|
29163
|
+
"name": "soundExpression",
|
|
29164
|
+
"ref": true
|
|
29165
|
+
}
|
|
29166
|
+
],
|
|
29167
|
+
"parameters": [
|
|
29168
|
+
{
|
|
29169
|
+
"kind": "param",
|
|
29170
|
+
"name": "soundExpression",
|
|
29171
|
+
"ref": true
|
|
29172
|
+
}
|
|
29173
|
+
]
|
|
29174
|
+
}
|
|
29175
|
+
},
|
|
29176
|
+
"parameters": [
|
|
29177
|
+
{
|
|
29178
|
+
"name": "soundExpression",
|
|
29179
|
+
"type": "SoundExpression"
|
|
29180
|
+
}
|
|
29181
|
+
],
|
|
29182
|
+
"pyQName": "music.builtin_sound_effect"
|
|
29076
29183
|
}
|
|
29077
29184
|
}
|
|
29078
29185
|
},
|
|
29079
|
-
"sha": "
|
|
29186
|
+
"sha": "21d292920e544c5e6fac0541c1253d766455dd4c83740becf99419b4a272efdd"
|
|
29080
29187
|
},
|
|
29081
29188
|
"libs/radio": {
|
|
29082
29189
|
"apis": {
|
|
@@ -30525,7 +30632,7 @@ var pxtTargetBundle = {
|
|
|
30525
30632
|
}
|
|
30526
30633
|
}
|
|
30527
30634
|
},
|
|
30528
|
-
"sha": "
|
|
30635
|
+
"sha": "faf0d85df2f114942f495cf419684cbabb552e34a5818b69192134543647d936"
|
|
30529
30636
|
},
|
|
30530
30637
|
"libs/devices": {
|
|
30531
30638
|
"apis": {
|
|
@@ -32572,7 +32679,7 @@ var pxtTargetBundle = {
|
|
|
32572
32679
|
}
|
|
32573
32680
|
}
|
|
32574
32681
|
},
|
|
32575
|
-
"sha": "
|
|
32682
|
+
"sha": "7de75d030a4eae5ce012a645b9e303a135a25d538293ee1e1e71ddbe8d916e6d"
|
|
32576
32683
|
},
|
|
32577
32684
|
"libs/bluetooth": {
|
|
32578
32685
|
"apis": {
|
|
@@ -33533,7 +33640,7 @@ var pxtTargetBundle = {
|
|
|
33533
33640
|
}
|
|
33534
33641
|
}
|
|
33535
33642
|
},
|
|
33536
|
-
"sha": "
|
|
33643
|
+
"sha": "71ab92cbcafae550be92e0ef38037cef71c194227e948d8eb13e61fedaeaf388"
|
|
33537
33644
|
},
|
|
33538
33645
|
"libs/servo": {
|
|
33539
33646
|
"apis": {
|
|
@@ -34175,7 +34282,7 @@ var pxtTargetBundle = {
|
|
|
34175
34282
|
}
|
|
34176
34283
|
}
|
|
34177
34284
|
},
|
|
34178
|
-
"sha": "
|
|
34285
|
+
"sha": "3b123e200d8ed7789a9a214330026c4c6057661e975f910e38101245907deb46"
|
|
34179
34286
|
},
|
|
34180
34287
|
"libs/radio-broadcast": {
|
|
34181
34288
|
"apis": {
|
|
@@ -35769,7 +35876,7 @@ var pxtTargetBundle = {
|
|
|
35769
35876
|
}
|
|
35770
35877
|
}
|
|
35771
35878
|
},
|
|
35772
|
-
"sha": "
|
|
35879
|
+
"sha": "cc06348b1eeaf84e69ccaf7a6a1b4ee2b6d9ed9a0c21df3d05764da6c2b80ba5"
|
|
35773
35880
|
},
|
|
35774
35881
|
"libs/microphone": {
|
|
35775
35882
|
"apis": {
|
|
@@ -36047,7 +36154,7 @@ var pxtTargetBundle = {
|
|
|
36047
36154
|
}
|
|
36048
36155
|
}
|
|
36049
36156
|
},
|
|
36050
|
-
"sha": "
|
|
36157
|
+
"sha": "f9a50ce772eeb27726da02419b93370cc1a9a90db670e598eb539797649d086d"
|
|
36051
36158
|
},
|
|
36052
36159
|
"libs/settings": {
|
|
36053
36160
|
"apis": {
|
|
@@ -36384,7 +36491,7 @@ var pxtTargetBundle = {
|
|
|
36384
36491
|
}
|
|
36385
36492
|
}
|
|
36386
36493
|
},
|
|
36387
|
-
"sha": "
|
|
36494
|
+
"sha": "955d2873e4aba04b829aaca4619efc5658e4022db1282d59b66fd88c17d3247f"
|
|
36388
36495
|
},
|
|
36389
36496
|
"libs/flashlog": {
|
|
36390
36497
|
"apis": {
|
|
@@ -36649,7 +36756,7 @@ var pxtTargetBundle = {
|
|
|
36649
36756
|
}
|
|
36650
36757
|
}
|
|
36651
36758
|
},
|
|
36652
|
-
"sha": "
|
|
36759
|
+
"sha": "4f7859c7f7dab45fa73268921037f1a18090a1e4da85a88c84d5635bfc448d9f"
|
|
36653
36760
|
},
|
|
36654
36761
|
"libs/datalogger": {
|
|
36655
36762
|
"apis": {
|
|
@@ -37370,7 +37477,7 @@ var pxtTargetBundle = {
|
|
|
37370
37477
|
}
|
|
37371
37478
|
}
|
|
37372
37479
|
},
|
|
37373
|
-
"sha": "
|
|
37480
|
+
"sha": "5272379c7779cf5346751e10fafe939eeb973006981208981101ec756c4493a6"
|
|
37374
37481
|
},
|
|
37375
37482
|
"libs/blocksprj": {
|
|
37376
37483
|
"apis": {
|
|
@@ -39090,7 +39197,7 @@ var pxtTargetBundle = {
|
|
|
39090
39197
|
}
|
|
39091
39198
|
}
|
|
39092
39199
|
},
|
|
39093
|
-
"sha": "
|
|
39200
|
+
"sha": "142aa861ffc281395f544e2567364e392598a2832d31af76682a1e3ded4d6cbe"
|
|
39094
39201
|
},
|
|
39095
39202
|
"libs/bluetoothprj": {
|
|
39096
39203
|
"apis": {
|
|
@@ -40322,7 +40429,7 @@ var pxtTargetBundle = {
|
|
|
40322
40429
|
}
|
|
40323
40430
|
}
|
|
40324
40431
|
},
|
|
40325
|
-
"sha": "
|
|
40432
|
+
"sha": "caf190375507716a1a108b362f2566e5b6ca5461d93911561e9ae418f193787a"
|
|
40326
40433
|
},
|
|
40327
40434
|
"libs/tsprj": {
|
|
40328
40435
|
"apis": {
|
|
@@ -42042,7 +42149,7 @@ var pxtTargetBundle = {
|
|
|
42042
42149
|
}
|
|
42043
42150
|
}
|
|
42044
42151
|
},
|
|
42045
|
-
"sha": "
|
|
42152
|
+
"sha": "99b9a74364680472f11ab6c59f00a2cd194885e9b33493fce9bf8e7de5ba3780"
|
|
42046
42153
|
}
|
|
42047
42154
|
}
|
|
42048
42155
|
}
|