From 5f146144091bde2bee38a03255b4351ebff29f35 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Wed, 3 Jun 2026 17:31:25 -0700 Subject: [PATCH 01/11] start on requirements --- PSIM_SPEC.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 PSIM_SPEC.md diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md new file mode 100644 index 00000000000..2cf4ecca10f --- /dev/null +++ b/PSIM_SPEC.md @@ -0,0 +1,65 @@ +# PSIM: The Physical Simulator for MakeCode + +## Context + +Micro:bits are meant to move around, inside and outside the classroom. They are small, battery-powered, and can be attached to people, things, etc. They can detect motion, as well as sound, light and temperature levels.  They have a radio so they can be connected wirelessly into adhoc networks (with a limited ability to detect proximity to other microbits). The success/failure of radio transmission depends on the location of micro:bits. More complex projects may use multiple microbits moving in an environment, sensing, reacting, and communicating with one another. Debugging such little distributed systems can be difficult.  + +## High-level goal + +We want to create a new simulator of multiple microbits in a physical environment (PSIM), building off of the PXT framework, which already features a microbit simulator that makes most of the functions of the microbit available to the end user on the left side of the app.  This should help users gain a better understanding of the behavior of their system. + +## Assumptions + +We assume each micro:bit will run the same user program, so micro:bits can be put into different modes by the user using micro:bit buttons (or radio messages) - in the future, one should be able to load different programs into PSIM. +No micro:bit accessories (for now). + +## Launching and basic view + +PSIM is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx) and takes over the editor (like serialEditor: serial.Editor) +The physical simulator is populated with a single micro:bit to start, which is running the user's program.  It represents the micro:bits in a plane (2D only).  + +## Micro:bit metadata + +Each micro:bit is shown using a small image of micro:bit (shows state of the LED matrix, should reuse the mbit SVG) and has a set of properties, including: +- Friendly name +- X and Y coordinates in the plane +- Associated PXT simulator (frame) + +## PSIM features + +Toolbar allows you to + +- Back out of PSIM, as in the serialeditor +- Create a new micro:bit, running a new (named) instance of the user's program; per the PXT framework, +this sim will have its own iframe, but it should be kept invisible (we need to generalize the sim framework to allow an arbitrary number of sims); + +Actions on the canvas: + +- When you select a micro:bit in the PSIM canvas, the microbit simulator (sidepanel) switches to show the state of that microbit and allows you to interact with it manually as usual. + +- You can move a micro:bit around in the PSIM to change its (x,y) location + +Simulation physical aspects + +The PSIM models the radio transmission of packets from micro:bits (which are messages send to and received from the iframe) in physical space and determines which micro:bits can hear others (based on signal strength). As a bonus, it show animations of microbits sending/receiving radio packets. Also need to add info from physical space into the radio packet (especially signalstrength).  + +## Test drivers for PSIM + +We want to be able to code against the named microbits to generate the user-level events (using the CODAL events) as well as to intercept outputs/events generated by the microbit (such as radio messages) and decide what to do with them.  + +We will start with using plain TypeScript (not Static TypeScript) to give us more access to simulator state and features. In the future, maybe provide bindings so test automation can be written as part of PXT project in Static TypeScript. + +We also want to program how the micro:bits move in space. + +## Implementation details + +- Files to consult + - Webapp/src/{app.tsx, sidepanel.tsx} + - pxtsim/simdriver.ts + +- Need to generalize sim framework to allow arbitrary number of micro:bits (not just 2 max, as now) +- Need to route PSIM generated events to correct sim +- PSIM should be added under a feature flag as an experiment (see experiments.ts) +- The robot sim from Eric Anderson could be a starting point for the 2d physics simulator + + From 4e974b436a517ac32acda6bd4ea5cf60d3d33cb6 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Wed, 3 Jun 2026 17:38:53 -0700 Subject: [PATCH 02/11] minor updates --- PSIM_SPEC.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index 2cf4ecca10f..a5c6cd8d6f4 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -6,32 +6,33 @@ Micro:bits are meant to move around, inside and outside the classroom. They are ## High-level goal -We want to create a new simulator of multiple microbits in a physical environment (PSIM), building off of the PXT framework, which already features a microbit simulator that makes most of the functions of the microbit available to the end user on the left side of the app.  This should help users gain a better understanding of the behavior of their system. +We want to create a new simulator of multiple microbits in a physical environment (PSIM), building off of the PXT framework (which already features a microbit simulator that makes most of the functions of the microbit available to the end user on the left side of the app).  This should help users gain a better understanding of the behavior of their system. ## Assumptions -We assume each micro:bit will run the same user program, so micro:bits can be put into different modes by the user using micro:bit buttons (or radio messages) - in the future, one should be able to load different programs into PSIM. -No micro:bit accessories (for now). +We assume +- each micro:bit will run the same user program, so micro:bits can be put into different modes by the user using micro:bit buttons (or radio messages); in the future, one should be able to load different programs into PSIM. +- No micro:bit accessories (for now). ## Launching and basic view PSIM is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx) and takes over the editor (like serialEditor: serial.Editor) -The physical simulator is populated with a single micro:bit to start, which is running the user's program.  It represents the micro:bits in a plane (2D only).  +The physical simulator is populated with a single micro:bit to start, which is running the user's program.  It represents the micro:bits in a plane (2D only). Each micro:bit is shown using a small image of micro:bit (shows state of the LED matrix, should reuse the mbit SVG). ## Micro:bit metadata -Each micro:bit is shown using a small image of micro:bit (shows state of the LED matrix, should reuse the mbit SVG) and has a set of properties, including: -- Friendly name +Each simulated micro:bit has a set of properties, including: +- Friendly name (for referring to it and sending it events) - X and Y coordinates in the plane - Associated PXT simulator (frame) ## PSIM features -Toolbar allows you to +The PSIM toolbar allows you to -- Back out of PSIM, as in the serialeditor -- Create a new micro:bit, running a new (named) instance of the user's program; per the PXT framework, -this sim will have its own iframe, but it should be kept invisible (we need to generalize the sim framework to allow an arbitrary number of sims); +- back out of PSIM, as in the serialeditor +- create a new micro:bit, running a new (named) instance of the user's program; +per the PXT framework, this sim will have its own iframe Actions on the canvas: From 84fde7745ebf290aaab3a8966eb93fa54db263c8 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Wed, 3 Jun 2026 23:42:58 -0700 Subject: [PATCH 03/11] more --- PSIM_SPEC.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index a5c6cd8d6f4..bd8acd4836d 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -24,7 +24,7 @@ The physical simulator is populated with a single micro:bit to start, which is r Each simulated micro:bit has a set of properties, including: - Friendly name (for referring to it and sending it events) - X and Y coordinates in the plane -- Associated PXT simulator (frame) +- Associated PXT simulator (iframe) ## PSIM features @@ -55,10 +55,14 @@ We also want to program how the micro:bits move in space. ## Implementation details - Files to consult - - Webapp/src/{app.tsx, sidepanel.tsx} - - pxtsim/simdriver.ts - -- Need to generalize sim framework to allow arbitrary number of micro:bits (not just 2 max, as now) + - pxt/ + - webapp/src/{app.tsx, sidepanel.tsx} + - pxtsim/simdriver.ts + - pxt-common-packages/ + - lib/radio + - pxt-microbit/ + +- Need to generalize sim framework to allow arbitrary number of micro:bits (not just 2 max, as now) and message to start a new one - Need to route PSIM generated events to correct sim - PSIM should be added under a feature flag as an experiment (see experiments.ts) - The robot sim from Eric Anderson could be a starting point for the 2d physics simulator From c18754dda17c67e52c86f18a25137301d38641c7 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Thu, 4 Jun 2026 14:14:01 -0700 Subject: [PATCH 04/11] more thoughts --- PSIM_SPEC.md | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index bd8acd4836d..609557cfc0b 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -10,18 +10,17 @@ We want to create a new simulator of multiple microbits in a physical environmen ## Assumptions -We assume -- each micro:bit will run the same user program, so micro:bits can be put into different modes by the user using micro:bit buttons (or radio messages); in the future, one should be able to load different programs into PSIM. -- No micro:bit accessories (for now). +We assume that each micro:bit will run the same user program, so micro:bits can be put into different modes by the user using micro:bit buttons (or radio messages); in the future, one should be able to load different programs into PSIM. ## Launching and basic view PSIM is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx) and takes over the editor (like serialEditor: serial.Editor) -The physical simulator is populated with a single micro:bit to start, which is running the user's program.  It represents the micro:bits in a plane (2D only). Each micro:bit is shown using a small image of micro:bit (shows state of the LED matrix, should reuse the mbit SVG). +The physical simulator is populated with a single micro:bit to start, which is running the user's program.  It represents the micro:bits in a +plane (2D only). Each micro:bit is shown using a micro:bit sprite (shows state of the LED matrix, should reuse the mbit SVG). ## Micro:bit metadata -Each simulated micro:bit has a set of properties, including: +Each micro:bit sprite has a set of properties, including: - Friendly name (for referring to it and sending it events) - X and Y coordinates in the plane - Associated PXT simulator (iframe) @@ -31,27 +30,44 @@ Each simulated micro:bit has a set of properties, including: The PSIM toolbar allows you to - back out of PSIM, as in the serialeditor -- create a new micro:bit, running a new (named) instance of the user's program; -per the PXT framework, this sim will have its own iframe +- create a new micro:bit sprite and associated simulator, running a new (named) instance of the user's program; + per the PXT framework, each new microbit simulator is hosted in a new iframe in the side panel Actions on the canvas: -- When you select a micro:bit in the PSIM canvas, the microbit simulator (sidepanel) switches to show the state of that microbit and allows you to interact with it manually as usual. +- When you select a micro:bit sprite in the PSIM canvas, the sidepanel focus on the sprite's corresponding iframe -- You can move a micro:bit around in the PSIM to change its (x,y) location +- You can move a micro:bit sprite around in the PSIM to change its (x,y) location -Simulation physical aspects +Modelling wireless radio messages -The PSIM models the radio transmission of packets from micro:bits (which are messages send to and received from the iframe) in physical space and determines which micro:bits can hear others (based on signal strength). As a bonus, it show animations of microbits sending/receiving radio packets. Also need to add info from physical space into the radio packet (especially signalstrength).  +The PSIM models the radio transmission of packets from micro:bits (which are messages send to and received from the iframe) +in physical space and determines which micro:bits can hear others (based on signal strength). As a bonus, it show animations +of microbits sending/receiving radio packets. Also need to add info from physical space into the radio packet (especially signalstrength).  ## Test drivers for PSIM -We want to be able to code against the named microbits to generate the user-level events (using the CODAL events) as well as to intercept outputs/events generated by the microbit (such as radio messages) and decide what to do with them.  +We want to be able to code against the named microbits to generate the user-level events (using the CODAL events) as well as to +intercept outputs/events generated by the microbit (such as radio messages) and decide what to do with them.  -We will start with using plain TypeScript (not Static TypeScript) to give us more access to simulator state and features. In the future, maybe provide bindings so test automation can be written as part of PXT project in Static TypeScript. +We will start with using plain TypeScript (not Static TypeScript) to give us more access to simulator state and features. +In the future, maybe provide bindings so test automation can be written as part of PXT project in Static TypeScript. We also want to program how the micro:bits move in space. +## Work plan + +- 1. add feature flag for PSIM (see experiments.ts) +- 2. update pxt/pxtsim framework to allow an arbitrary number of board sims (not just 2 max, as now) and a message to start a new one +- 3. create new PhysicalSimulator (PSIM) class that is an Editor and is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx); the button should be disabled once the PhysicalSimulator is live; PSIM should have mapping from friendly names meta data for each simulated micro:bit, which includes the iframe that contains the micro:bit simulator +- 4. display each microbit using SVG, scaled down - call this the microbit sprite; tag each microbit spriate with its friendly name; allow microbit sprites to be selected and moved around with mouse; on selection of a microbit sprite in the PSIM, bring focus to the corresponding iframe (micro:bit simulator) +- 5. the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation in the PSIM around the corresponding microbit sprite +- 6. We want the PSIM to determine which microbit sprites can "hear" a radio message sent by a microbit, depending on the radio strength of each microbit and the Euclidean distance between microbit sprites in the PSIM; it then will determine which microbit sprites will receive the message and send it to the corresponding simulators +- 7. Create a test framework that allows us to program against the microbits in the PSIM. This includes APIs for + - creating a new microbit and naming it (same API as for PSIM toolbar button) + - send a CODAL event to the named microbit + - intercept all microbit outputs (not clear how we do this yet; may need to instrument simulator thunks and send messages out of iframe; could probably use compiler support to do this automagically for everything that has a shim annotation) + ## Implementation details - Files to consult @@ -62,9 +78,3 @@ We also want to program how the micro:bits move in space. - lib/radio - pxt-microbit/ -- Need to generalize sim framework to allow arbitrary number of micro:bits (not just 2 max, as now) and message to start a new one -- Need to route PSIM generated events to correct sim -- PSIM should be added under a feature flag as an experiment (see experiments.ts) -- The robot sim from Eric Anderson could be a starting point for the 2d physics simulator - - From a8c485e2e483640c145761b5be063fdabc5015e1 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Mon, 8 Jun 2026 18:10:25 -0700 Subject: [PATCH 05/11] update --- PSIM_SPEC.md | 8 +++++++- docs/static/experiments/physicalSimulator.png | Bin 0 -> 128096 bytes pxtarget.json | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 docs/static/experiments/physicalSimulator.png diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index 609557cfc0b..7a12c8bde2c 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -62,10 +62,16 @@ We also want to program how the micro:bits move in space. - 3. create new PhysicalSimulator (PSIM) class that is an Editor and is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx); the button should be disabled once the PhysicalSimulator is live; PSIM should have mapping from friendly names meta data for each simulated micro:bit, which includes the iframe that contains the micro:bit simulator - 4. display each microbit using SVG, scaled down - call this the microbit sprite; tag each microbit spriate with its friendly name; allow microbit sprites to be selected and moved around with mouse; on selection of a microbit sprite in the PSIM, bring focus to the corresponding iframe (micro:bit simulator) - 5. the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation in the PSIM around the corresponding microbit sprite + - this requires quite a bit of new plumbing: + - we need to intercept SimulatorBroadcastMessages posted to simdriver by one of the simFrames, + identified by srcFrameIndex + - instead of passing them down to simFrames, need to pass them up and out to the PSIM, which will then + determine which ones to pass back (and who to address them to) + - we already have logic for passing message up to parentWindow, but we also pass the same message down - 6. We want the PSIM to determine which microbit sprites can "hear" a radio message sent by a microbit, depending on the radio strength of each microbit and the Euclidean distance between microbit sprites in the PSIM; it then will determine which microbit sprites will receive the message and send it to the corresponding simulators - 7. Create a test framework that allows us to program against the microbits in the PSIM. This includes APIs for - creating a new microbit and naming it (same API as for PSIM toolbar button) - - send a CODAL event to the named microbit + - send a CODAL event to the named microbit (the EventBus for the particular sim) - intercept all microbit outputs (not clear how we do this yet; may need to instrument simulator thunks and send messages out of iframe; could probably use compiler support to do this automagically for everything that has a shim annotation) ## Implementation details diff --git a/docs/static/experiments/physicalSimulator.png b/docs/static/experiments/physicalSimulator.png new file mode 100644 index 0000000000000000000000000000000000000000..98533f7cdb2844854be43912448ad5b8c8d4c750 GIT binary patch literal 128096 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 AV*mgE literal 0 HcmV?d00001 diff --git a/pxtarget.json b/pxtarget.json index 90f4ceeb06a..5d0d8a8e8ba 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -437,7 +437,8 @@ "debugExtensionCode", "bluetoothUartConsole", "bluetoothPartialFlashing", - "forceEnableAiErrorHelp" + "forceEnableAiErrorHelp", + "physicalSimualator" ], "supportedExperiences": [ "code-eval" From 871512b0494fac07e8c88d857881dd39579a68f8 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Wed, 10 Jun 2026 15:03:20 -0700 Subject: [PATCH 06/11] enable PSIM experiment --- pxtarget.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pxtarget.json b/pxtarget.json index 5d0d8a8e8ba..cf55cf35a14 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -438,7 +438,7 @@ "bluetoothUartConsole", "bluetoothPartialFlashing", "forceEnableAiErrorHelp", - "physicalSimualator" + "physicalSimulator" ], "supportedExperiences": [ "code-eval" From 49289dbaf438463341d47ce42cc3061bb92f3045 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Tue, 23 Jun 2026 19:16:27 -0700 Subject: [PATCH 07/11] Add radio signal strength information and instrumented function list to PSIM specification --- PSIM_SPEC.md | 256 ++++++++++++++++++++++++++++++++++++++++++++++---- pxtarget.json | 13 +++ 2 files changed, 250 insertions(+), 19 deletions(-) diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index 7a12c8bde2c..c9a134de9b0 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -30,7 +30,7 @@ Each micro:bit sprite has a set of properties, including: The PSIM toolbar allows you to - back out of PSIM, as in the serialeditor -- create a new micro:bit sprite and associated simulator, running a new (named) instance of the user's program; +- create a new micro:bit sprite and associapted simulator, running a new (named) instance of the user's program; per the PXT framework, each new microbit simulator is hosted in a new iframe in the side panel Actions on the canvas: @@ -45,6 +45,36 @@ The PSIM models the radio transmission of packets from micro:bits (which are mes in physical space and determines which micro:bits can hear others (based on signal strength). As a bonus, it show animations of microbits sending/receiving radio packets. Also need to add info from physical space into the radio packet (especially signalstrength).  +## Relevant info on radio + +### Make the ``radio`` signal of the @boardname@ stronger or weaker. + +```sig +radio.setTransmitPower(7); +``` + +The signal can be as weak as `0` and as strong as `7`. Default is ``6``. + +The scientific name for the strength of the ``radio`` signal is +**dBm**, or **decibel-milliwatts**. A signal strength of `0` +can be measured as -30 dBm, and a strength of `7` can be +measured as +4 dBm. + +If your @boardname@ is sending with a strength of `7`, and you are in +an open area without many other computers around, the @boardname@ signal +can reach as far as 70 meters (about 230 feet). + + +### Get the signal strength of the last received packet. + +``` +let ss = radio.receivedPacket(RadioPacketProperty.SignalStrength) +``` + +### related work + +- https://github.com/behbad/Bluetooth-Low-Energy-5-System-Level-Simulator-BLE5 + ## Test drivers for PSIM We want to be able to code against the named microbits to generate the user-level events (using the CODAL events) as well as to @@ -57,30 +87,218 @@ We also want to program how the micro:bits move in space. ## Work plan -- 1. add feature flag for PSIM (see experiments.ts) -- 2. update pxt/pxtsim framework to allow an arbitrary number of board sims (not just 2 max, as now) and a message to start a new one -- 3. create new PhysicalSimulator (PSIM) class that is an Editor and is launched by a new button in the micro:bit simulator toolbar (simtoolbar.tsx); the button should be disabled once the PhysicalSimulator is live; PSIM should have mapping from friendly names meta data for each simulated micro:bit, which includes the iframe that contains the micro:bit simulator -- 4. display each microbit using SVG, scaled down - call this the microbit sprite; tag each microbit spriate with its friendly name; allow microbit sprites to be selected and moved around with mouse; on selection of a microbit sprite in the PSIM, bring focus to the corresponding iframe (micro:bit simulator) -- 5. the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation in the PSIM around the corresponding microbit sprite +- PSIM should have mapping from friendly names meta data for each simulated micro:bit, which includes the id of the + iframe that contains the micro:bit simulator +- display each microbit using image, scaled down, as part of microbit sprite + X tag each microbit sprite with its friendly name + X allow microbit sprites to be selected and moved around with mouse + - on selection of a microbit sprite in the PSIM, bring focus to the corresponding iframe (micro:bit simulator) +- deal with updates to relevent mbit state + - radio transmit strength (maps to circle around microbit, modelling its transmit range) + - LED matrix update + - color of the microbit + - microbit makes a soiund (animation) + - radio send message (anumation) +- the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation + in the PSIM around the corresponding microbit sprite - this requires quite a bit of new plumbing: - - we need to intercept SimulatorBroadcastMessages posted to simdriver by one of the simFrames, - identified by srcFrameIndex + - intercept SimulatorBroadcastMessages posted to simdriver by one of the simFrames, identified by srcFrameIndex - instead of passing them down to simFrames, need to pass them up and out to the PSIM, which will then determine which ones to pass back (and who to address them to) - we already have logic for passing message up to parentWindow, but we also pass the same message down -- 6. We want the PSIM to determine which microbit sprites can "hear" a radio message sent by a microbit, depending on the radio strength of each microbit and the Euclidean distance between microbit sprites in the PSIM; it then will determine which microbit sprites will receive the message and send it to the corresponding simulators -- 7. Create a test framework that allows us to program against the microbits in the PSIM. This includes APIs for +- We want the PSIM to determine which microbit sprites can "hear" a radio message sent by a microbit, + depending on the radio transmit strength of each microbit and the Euclidean distance between microbit sprites + in the PSIM; it then will determine which microbit sprites will receive the message and send it to the + corresponding simulators +- Create a test framework that allows us to program against the microbits in the PSIM. This includes APIs for - creating a new microbit and naming it (same API as for PSIM toolbar button) - send a CODAL event to the named microbit (the EventBus for the particular sim) - - intercept all microbit outputs (not clear how we do this yet; may need to instrument simulator thunks and send messages out of iframe; could probably use compiler support to do this automagically for everything that has a shim annotation) + - intercept all microbit outputs (not clear how we do this yet; may need to instrument + simulator thunks and send messages out of iframe; could probably use compiler support + to do this automagically for everything that has a shim annotation) +- Allow multiple MakeCode programs to be loaded into the PSIM + + +## Helpful plumbing + +- for testing, we need to be able to intercept calls from user code to libraries (ala SLIC?) +- instrumentation can easily be done in JavaScript for the simulator + +### Example + +We want to capture the number sent to the display via `basic.showNumber(i)`, where +the function is declared as follows: +``` +namespace basic { + ... + export function showNumber(value: number, interval?: number) { ... } + ... +} +``` + +This is supported by the simulator as follows: +``` +namespace pxsim.basic { + export function showNumber(x: number, interval: number) { ... } +} +``` +So, there are two ways we could proceed +- instrument the user code (caller instrumentation) by adding support in the compiler +- instrument the pxsim code (callee instrumentation) by reflection + +### output functions + +#### The basic ones dealing with the LED screen + +``` +basic.showNumber(0) +basic.showLeds(` + # . . . # + . # . # . + . . # . . + . . . . . + . . . . . + `) +basic.showIcon(IconNames.Heart) +basic.showString("Hello!") +basic.showArrow(ArrowNames.North) +basic.clearScreen() +``` + +#### plotting to the LED screen + +``` +led.plot(0, 0) +led.toggle(0, 0) +led.unplot(0, 0) +led.plotBarGraph(0, 0) +led.plotBrightness(0, 0, 255) +led.setBrightness(255) +led.enable(false) +led.stopAnimation() +``` + +#### speaker + +``` +music.stopAllSounds() +music.setBuiltInSpeakerEnabled(false) +music.setVolume(127) +music.ringTone(Note.C) +``` + +#### radio + +``` +radio.sendNumber(0) +radio.sendValue("name", 0) +radio.sendString("") +radio.setGroup(1) +radio.setTransmitPower(7) +radio.setTransmitSerialNumber(true) +radio.setFrequencyBand(0). /// ? +``` + +### pins + +``` +pins.digitalWritePin(DigitalPin.P0, 0) +pins.analogWritePin(AnalogPin.P0, 1023) +``` + + +## instrumening JavaScript + +Got it — you want to instrument JavaScript code using reflection. +In JavaScript, "reflection" generally refers to using the Reflect API and Proxy objects to inspect and intercept operations at runtime. This is useful for instrumentation — e.g., logging, profiling, or modifying behavior without changing the original code directly. +Below is a complete, runnable example showing how to instrument method calls and property access using reflection. + +Example: Instrumenting with Proxy + Reflect +Javascript// Instrumentation function that wraps an object +``` +/** + * Wraps all functions in a namespace with instrumentation logic. + * @param {object} namespace - The object containing functions to instrument. + * @param {function} logger - Optional logger function (default: console.log). + * @returns {object} - A new namespace with instrumented functions. + */ +function instrumentNamespace(namespace, logger = console.log) { + if (typeof namespace !== 'object' || namespace === null) { + throw new TypeError('Namespace must be a non-null object'); + } + + // Create a proxy to intercept function calls + return new Proxy(namespace, { + get(target, prop, receiver) { + const value = Reflect.get(target, prop, receiver); + + // If it's a function, wrap it + if (typeof value === 'function') { + return function (...args) { + const start = performance.now(); + logger(`[CALL] ${String(prop)}(${args.map(a => JSON.stringify(a)).join(', ')})`); + try { + const result = value.apply(this, args); + if (result instanceof Promise) { + // Handle async functions + return result.finally(() => { + const end = performance.now(); + logger(`[DONE] ${String(prop)} took ${(end - start).toFixed(2)} ms`); + }); + } else { + const end = performance.now(); + logger(`[DONE] ${String(prop)} took ${(end - start).toFixed(2)} ms`); + return result; + } + } catch (err) { + logger(`[ERROR] ${String(prop)} threw:`, err); + throw err; + } + }; + } + + // Otherwise, return the value as-is + return value; + } + }); +} + +// Example namespace +const mathUtils = { + add(a, b) { return a + b; }, + multiply(a, b) { return a * b; }, + async slowAdd(a, b) { + return new Promise(resolve => setTimeout(() => resolve(a + b), 500)); + } +}; + +// Instrument the namespace +const instrumentedMath = instrumentNamespace(mathUtils); + +// Test calls +console.log('Result:', instrumentedMath.add(2, 3)); +console.log('Result:', instrumentedMath.multiply(4, 5)); + +instrumentedMath.slowAdd(10, 20).then(result => { + console.log('Async Result:', result); +}); +``` + +How This Works + +Proxy intercepts operations on the object. +Reflect is used to forward the intercepted operation to the original target safely. +We log each intercepted action — this is the instrumentation. +This approach works without modifying the original object’s code. + + +Benefits of Using Reflection for Instrumentation -## Implementation details +Non-invasive: No need to rewrite the original functions. +Dynamic: Can be applied at runtime to any object. +Granular control: Intercept only the operations you care about. +Safe forwarding: Reflect ensures correct default behavior. -- Files to consult - - pxt/ - - webapp/src/{app.tsx, sidepanel.tsx} - - pxtsim/simdriver.ts - - pxt-common-packages/ - - lib/radio - - pxt-microbit/ +If you want, I can also show you how to instrument all functions in a module automatically using reflection so you can profile execution times without touching the original source. +Do you want me to prepare that advanced version? diff --git a/pxtarget.json b/pxtarget.json index cf55cf35a14..23a9f036ce5 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -367,6 +367,19 @@ 80, 0 ] + }, + "instrument": { + "callees": [ + "basic.showNumber", "basic.showString", "basic.showLeds(", + "basic.showIcon", "basic.showArrow", "basic.clearScreen", + "led.plot", "led.toggle", "led.unplot", "led.plotBarGraph", + "led.plotBrightness", "led.setBrightness", "led.enable", "led.stopAnimation", + "music.stopAllSounds","music.setBuiltInSpeakerEnabled", + "music.setVolume", "music.ringTone", + "radio.sendNumber", "radio.sendValue", "radio.sendString", + "radio.setGroup", "radio.setTransmitPower", + "pins.digitalWritePin", "pins.analogWritePin", + ] } }, "serial": { From 7a6b25ba938467795f14272602daa70d756c9290 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Tue, 23 Jun 2026 21:27:58 -0700 Subject: [PATCH 08/11] fix syntax error --- pxtarget.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pxtarget.json b/pxtarget.json index 23a9f036ce5..e69bb49723c 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -378,7 +378,7 @@ "music.setVolume", "music.ringTone", "radio.sendNumber", "radio.sendValue", "radio.sendString", "radio.setGroup", "radio.setTransmitPower", - "pins.digitalWritePin", "pins.analogWritePin", + "pins.digitalWritePin", "pins.analogWritePin" ] } }, From 2aa13ce8813278e0331d77ea3d2f4bfb1cc77ec5 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Fri, 26 Jun 2026 13:05:02 -0700 Subject: [PATCH 09/11] renaming --- PSIM_SPEC.md | 111 ++------------------- libs/core/_locales/core-jsdoc-strings.json | 22 ++++ libs/core/_locales/core-strings.json | 9 +- pxtarget.json | 4 +- 4 files changed, 39 insertions(+), 107 deletions(-) diff --git a/PSIM_SPEC.md b/PSIM_SPEC.md index c9a134de9b0..04eeee0af9d 100644 --- a/PSIM_SPEC.md +++ b/PSIM_SPEC.md @@ -99,13 +99,13 @@ We also want to program how the micro:bits move in space. - color of the microbit - microbit makes a soiund (animation) - radio send message (anumation) -- the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation +X the PSIM should intercept radio messages sent from the micro:bit simulator iframes and create an animation in the PSIM around the corresponding microbit sprite - - this requires quite a bit of new plumbing: - - intercept SimulatorBroadcastMessages posted to simdriver by one of the simFrames, identified by srcFrameIndex - - instead of passing them down to simFrames, need to pass them up and out to the PSIM, which will then + X this requires quite a bit of new plumbing: + X intercept SimulatorBroadcastMessages posted to simdriver by one of the simFrames, identified by srcFrameIndex + X instead of passing them down to simFrames, need to pass them up and out to the PSIM, which will then determine which ones to pass back (and who to address them to) - - we already have logic for passing message up to parentWindow, but we also pass the same message down + X we already have logic for passing message up to parentWindow, but we also pass the same message down - We want the PSIM to determine which microbit sprites can "hear" a radio message sent by a microbit, depending on the radio transmit strength of each microbit and the Euclidean distance between microbit sprites in the PSIM; it then will determine which microbit sprites will receive the message and send it to the @@ -113,7 +113,7 @@ We also want to program how the micro:bits move in space. - Create a test framework that allows us to program against the microbits in the PSIM. This includes APIs for - creating a new microbit and naming it (same API as for PSIM toolbar button) - send a CODAL event to the named microbit (the EventBus for the particular sim) - - intercept all microbit outputs (not clear how we do this yet; may need to instrument + X intercept all microbit outputs (not clear how we do this yet; may need to instrument simulator thunks and send messages out of iframe; could probably use compiler support to do this automagically for everything that has a shim annotation) - Allow multiple MakeCode programs to be loaded into the PSIM @@ -122,7 +122,7 @@ We also want to program how the micro:bits move in space. ## Helpful plumbing - for testing, we need to be able to intercept calls from user code to libraries (ala SLIC?) -- instrumentation can easily be done in JavaScript for the simulator +X instrumentation can easily be done in JavaScript for the simulator ### Example @@ -205,100 +205,3 @@ radio.setFrequencyBand(0). /// ? pins.digitalWritePin(DigitalPin.P0, 0) pins.analogWritePin(AnalogPin.P0, 1023) ``` - - -## instrumening JavaScript - -Got it — you want to instrument JavaScript code using reflection. -In JavaScript, "reflection" generally refers to using the Reflect API and Proxy objects to inspect and intercept operations at runtime. This is useful for instrumentation — e.g., logging, profiling, or modifying behavior without changing the original code directly. -Below is a complete, runnable example showing how to instrument method calls and property access using reflection. - -Example: Instrumenting with Proxy + Reflect -Javascript// Instrumentation function that wraps an object -``` -/** - * Wraps all functions in a namespace with instrumentation logic. - * @param {object} namespace - The object containing functions to instrument. - * @param {function} logger - Optional logger function (default: console.log). - * @returns {object} - A new namespace with instrumented functions. - */ -function instrumentNamespace(namespace, logger = console.log) { - if (typeof namespace !== 'object' || namespace === null) { - throw new TypeError('Namespace must be a non-null object'); - } - - // Create a proxy to intercept function calls - return new Proxy(namespace, { - get(target, prop, receiver) { - const value = Reflect.get(target, prop, receiver); - - // If it's a function, wrap it - if (typeof value === 'function') { - return function (...args) { - const start = performance.now(); - logger(`[CALL] ${String(prop)}(${args.map(a => JSON.stringify(a)).join(', ')})`); - try { - const result = value.apply(this, args); - if (result instanceof Promise) { - // Handle async functions - return result.finally(() => { - const end = performance.now(); - logger(`[DONE] ${String(prop)} took ${(end - start).toFixed(2)} ms`); - }); - } else { - const end = performance.now(); - logger(`[DONE] ${String(prop)} took ${(end - start).toFixed(2)} ms`); - return result; - } - } catch (err) { - logger(`[ERROR] ${String(prop)} threw:`, err); - throw err; - } - }; - } - - // Otherwise, return the value as-is - return value; - } - }); -} - -// Example namespace -const mathUtils = { - add(a, b) { return a + b; }, - multiply(a, b) { return a * b; }, - async slowAdd(a, b) { - return new Promise(resolve => setTimeout(() => resolve(a + b), 500)); - } -}; - -// Instrument the namespace -const instrumentedMath = instrumentNamespace(mathUtils); - -// Test calls -console.log('Result:', instrumentedMath.add(2, 3)); -console.log('Result:', instrumentedMath.multiply(4, 5)); - -instrumentedMath.slowAdd(10, 20).then(result => { - console.log('Async Result:', result); -}); -``` - -How This Works - -Proxy intercepts operations on the object. -Reflect is used to forward the intercepted operation to the original target safely. -We log each intercepted action — this is the instrumentation. -This approach works without modifying the original object’s code. - - -Benefits of Using Reflection for Instrumentation - -Non-invasive: No need to rewrite the original functions. -Dynamic: Can be applied at runtime to any object. -Granular control: Intercept only the operations you care about. -Safe forwarding: Reflect ensures correct default behavior. - - -If you want, I can also show you how to instrument all functions in a module automatically using reflection so you can profile execution times without touching the original source. -Do you want me to prepare that advanced version? diff --git a/libs/core/_locales/core-jsdoc-strings.json b/libs/core/_locales/core-jsdoc-strings.json index 9b296a2d54b..4d7055343ed 100644 --- a/libs/core/_locales/core-jsdoc-strings.json +++ b/libs/core/_locales/core-jsdoc-strings.json @@ -151,6 +151,9 @@ "Math.ceil": "Returns the smallest number greater than or equal to its numeric argument.", "Math.ceil|param|x": "A numeric expression.", "Math.constrain": "Constrains a number to be within a range", + "Math.convert": "Converts a value from one unit to another. For example, degrees to radians, fahrenheit to celsius, etc.", + "Math.convert|param|type": "The type of conversion to perform.", + "Math.convert|param|value": "The value to convert.", "Math.cos": "Returns the cosine of a number.", "Math.cos|param|x": "An angle in radians", "Math.exp": "Returns returns ``e^x``.", @@ -275,6 +278,25 @@ "basic.showString": "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.", "basic.showString|param|interval": "how fast to shift characters; eg: 150, 100, 200, -100", "basic.showString|param|text": "the text to scroll on the screen, eg: \"Hello!\"", + "colorHelpers.cmyk": "Converts a CMYK color into a single color number.\n*\n\n\n\n\n@returns The combined color as a single number", + "colorHelpers.cmyk|param|black": "The black component of the color, between 0 and 100", + "colorHelpers.cmyk|param|cyan": "The cyan component of the color, between 0 and 100", + "colorHelpers.cmyk|param|magenta": "The magenta component of the color, between 0 and 100", + "colorHelpers.cmyk|param|yellow": "The yellow component of the color, between 0 and 100", + "colorHelpers.hex": "Converts a hexadecimal color string into a single color number. The hexadecimal string can be in the short\n3-digit form (\"#f0a\") or the full 6-digit form (\"#ff00aa\").\n*\n\n@returns The combined color as a single number", + "colorHelpers.hex|param|hex": "A hexadecimal color string, optionally starting with \"#\" and either in 3-digit or 6-digit format", + "colorHelpers.hsl": "Converts a hue, saturation, and lightness (HSL) color into a single color number.\n*\n\n\n\n@returns The combined color as a single number", + "colorHelpers.hsl|param|hue": "The hue component of the color, between 0 and 360", + "colorHelpers.hsl|param|lightness": "The lightness component of the color, between 0 and 100", + "colorHelpers.hsl|param|saturation": "The saturation component of the color, between 0 and 100", + "colorHelpers.hsv": "Converts a hue, saturation, and value (HSV) color into a single color number.\n*\n\n\n\n@returns The combined color as a single number", + "colorHelpers.hsv|param|hue": "The hue component of the color, between 0 and 360", + "colorHelpers.hsv|param|saturation": "The saturation component of the color, between 0 and 100", + "colorHelpers.hsv|param|value": "The value component of the color, between 0 and 100", + "colorHelpers.rgb": "Converts a red, green, and blue color value into a single color number.\n*\n\n\n\n@returns The combined color as a single number", + "colorHelpers.rgb|param|blue": "The blue component of the color, between 0 and 255", + "colorHelpers.rgb|param|green": "The green component of the color, between 0 and 255", + "colorHelpers.rgb|param|red": "The red component of the color, between 0 and 255", "console": "Reading and writing data to the console output.", "console.addListener": "Adds a listener for the log messages", "console.inspect": "Convert any object or value to a string representation", diff --git a/libs/core/_locales/core-strings.json b/libs/core/_locales/core-strings.json index be22fb1780d..8e0cc48e564 100644 --- a/libs/core/_locales/core-strings.json +++ b/libs/core/_locales/core-strings.json @@ -155,6 +155,7 @@ "Math.SQRT2|block": "√2", "Math._constant|block": "$MEMBER", "Math.constrain|block": "constrain %value|between %low|and %high", + "Math.convert|block": "convert $value|from $type", "Math.map|block": "map %value|from low %fromLow|high %fromHigh|to low %toLow|high %toHigh", "Math.randomBoolean|block": "pick random true or false", "Math.randomRange|block": "pick random %min|to %limit", @@ -270,6 +271,10 @@ "TouchTarget.P2|block": "P2", "TouchTargetMode.Capacitive|block": "capacitive", "TouchTargetMode.Resistive|block": "resistive", + "UnitConversion.CelsiusToFahrenheit|block": "celsius to fahrenheit", + "UnitConversion.DegreesToRadians|block": "degrees to radians", + "UnitConversion.FahrenheitToCelsius|block": "fahrenheit to celsius", + "UnitConversion.RadiansToDegrees|block": "radians to degrees", "WaveShape.Noise|block": "noise", "WaveShape.Sawtooth|block": "sawtooth", "WaveShape.Sine|block": "sine", @@ -285,6 +290,7 @@ "basic.showNumber|block": "show|number %number", "basic.showString|block": "show|string %text", "basic|block": "basic", + "colorHelpers|block": "colorHelpers", "console|block": "console", "control.deviceName|block": "device name", "control.deviceSerialNumber|block": "device serial number", @@ -364,7 +370,7 @@ "led.stopAnimation|block": "stop animation", "led.toggle|block": "toggle|x %x|y %y", "led.unplot|block": "unplot|x %x|y %y", - "led|block": "led", + "led|block": "LED", "light|block": "light", "loops.everyInterval|block": "every $interval ms", "loops|block": "loops", @@ -474,6 +480,7 @@ "{id:category}Basic": "Basic", "{id:category}Boolean": "Boolean", "{id:category}Buffer": "Buffer", + "{id:category}ColorHelpers": "ColorHelpers", "{id:category}Console": "Console", "{id:category}Control": "Control", "{id:category}DigitalInOutPin": "DigitalInOutPin", diff --git a/pxtarget.json b/pxtarget.json index e69bb49723c..56ab4375232 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -369,8 +369,8 @@ ] }, "instrument": { - "callees": [ - "basic.showNumber", "basic.showString", "basic.showLeds(", + "output": [ + "basic.showNumber", "basic.showString", "basic.showLeds", "basic.showIcon", "basic.showArrow", "basic.clearScreen", "led.plot", "led.toggle", "led.unplot", "led.plotBarGraph", "led.plotBrightness", "led.setBrightness", "led.enable", "led.stopAnimation", From a9de52de006878298fb1bbe5f8a7eb54fa6e10a4 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Mon, 29 Jun 2026 12:16:34 -0700 Subject: [PATCH 10/11] title plumbing in place --- sim/dalboard.ts | 3 +++ sim/visuals/microbit.ts | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/sim/dalboard.ts b/sim/dalboard.ts index c4af045ef57..1b9b440356d 100644 --- a/sim/dalboard.ts +++ b/sim/dalboard.ts @@ -132,6 +132,9 @@ namespace pxsim { } } + setTitle(title: string) { + this.viewHost.setTitle(title); + } initAsync(msg: SimulatorRunMessage): Promise { super.initAsync(msg); diff --git a/sim/visuals/microbit.ts b/sim/visuals/microbit.ts index 939b41943f7..2cb65115cd6 100644 --- a/sim/visuals/microbit.ts +++ b/sim/visuals/microbit.ts @@ -346,6 +346,8 @@ path.sim-board { private leds: SVGElement[]; private microphoneLed: SVGElement; private systemLed: SVGCircleElement; + private title: string | undefined; + private titleElement: SVGTextElement; private antenna: SVGElement; private antennaInitialized = false; private rssi: SVGTextElement; @@ -840,6 +842,11 @@ path.sim-board { svg.animate(this.systemLed, "sim-flash") } } + + public setTitle(title: string) { + this.title = title; + this.buildTitleElement(); + } private lastAntennaFlash: number = 0; public flashAntenna() { @@ -1101,6 +1108,7 @@ path.sim-board { // Order of construction affects tab ordering this.buildLightLevelElement(); + this.buildTitleElement(); this.buildAntennaElement(); this.buildHeadElement(); this.buildThermometerElement(); @@ -1110,6 +1118,14 @@ path.sim-board { this.buildPinElements(); } + // build a name element in the upper left corner of the board + private buildTitleElement() { + if (!this.titleElement) { + this.titleElement = svg.child(this.g, "text", { class: "sim-text", x: 10, y: 30 }) as SVGTextElement; + } + this.titleElement.textContent = this.title || ""; + } + private buildAntennaElement() { this.antenna = svg.child(this.g, "g", { class: "sim-antenna-outer" }); From c2dd4fc7b1054ed605f1126340f80bdf9e35dd28 Mon Sep 17 00:00:00 2001 From: Thomas Ball Date: Tue, 30 Jun 2026 08:45:20 -0700 Subject: [PATCH 11/11] update as well as build --- sim/visuals/microbit.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sim/visuals/microbit.ts b/sim/visuals/microbit.ts index 2cb65115cd6..8ffd6f56a9c 100644 --- a/sim/visuals/microbit.ts +++ b/sim/visuals/microbit.ts @@ -492,6 +492,7 @@ path.sim-board { this.updateTilt(); this.updateHeading(); this.updateLightLevel(); + this.updateTitleElement() this.updateTemperature(); this.updateButtonAB(); this.updateGestures(); @@ -1121,11 +1122,15 @@ path.sim-board { // build a name element in the upper left corner of the board private buildTitleElement() { if (!this.titleElement) { - this.titleElement = svg.child(this.g, "text", { class: "sim-text", x: 10, y: 30 }) as SVGTextElement; + this.titleElement = svg.child(this.g, "text", { class: "sim-text", x: 200, y: 30 }) as SVGTextElement; } this.titleElement.textContent = this.title || ""; } + private updateTitleElement() { + this.buildTitleElement(); + } + private buildAntennaElement() { this.antenna = svg.child(this.g, "g", { class: "sim-antenna-outer" });