diff --git a/sim/dalboard.ts b/sim/dalboard.ts index 295e6f48..f95ff7a8 100644 --- a/sim/dalboard.ts +++ b/sim/dalboard.ts @@ -10,8 +10,10 @@ namespace pxsim { // updates updateSubscribers: (() => void)[]; - // builtin state + // builtin builtinParts: Map; + builtinVisuals: Map<() => visuals.IBoardPart>; + builtinPartVisuals: Map<(xy: visuals.Coord) => visuals.SVGElAndSize>; constructor() { super() @@ -25,6 +27,8 @@ namespace pxsim { } this.builtinParts = {}; + this.builtinVisuals = {}; + this.builtinPartVisuals = {}; } kill() { @@ -67,6 +71,14 @@ namespace pxsim { this.builtinParts["lightsensor"] = this.lightSensorState = new LightSensorState(); this.builtinParts["compass"] = this.compassState = new CompassState(); this.builtinParts["neopixel"] = this.neopixelState = new NeoPixelState(); + + this.builtinVisuals["buttonpair"] = () => new visuals.ButtonPairView(); + this.builtinVisuals["ledmatrix"] = () => new visuals.LedMatrixView(); + this.builtinVisuals["neopixel"] = () => new visuals.NeoPixelView(); + + this.builtinPartVisuals["buttonpair"] = (xy: visuals.Coord) => visuals.mkBtnSvg(xy); + this.builtinPartVisuals["ledmatrix"] = (xy: visuals.Coord) => visuals.mkLedMatrixSvg(xy, 8, 8); + this.builtinPartVisuals["neopixel"] = (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy); } receiveMessage(msg: SimulatorMessage) { diff --git a/sim/definitions.ts b/sim/definitions.ts index 8e553c4b..b48976e3 100644 --- a/sim/definitions.ts +++ b/sim/definitions.ts @@ -53,16 +53,6 @@ namespace pxsim { marginWhenBreadboarding: [0, 0, 80, 0], } - export const builtinComponentSimVisual: Map<() => visuals.IBoardPart> = { - "buttonpair": () => new visuals.ButtonPairView(), - "ledmatrix": () => new visuals.LedMatrixView(), - "neopixel": () => new visuals.NeoPixelView(), - }; - export const builtinComponentPartVisual: Map<(xy: visuals.Coord) => visuals.SVGElAndSize> = { - "buttonpair": (xy: visuals.Coord) => visuals.mkBtnSvg(xy), - "ledmatrix": (xy: visuals.Coord) => visuals.mkLedMatrixSvg(xy, 8, 8), - "neopixel": (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy), - }; //TODO: add multiple board support export const CURRENT_BOARD = MICROBIT_DEF; diff --git a/sim/instructions.ts b/sim/instructions.ts index 055215c7..acf6e25e 100644 --- a/sim/instructions.ts +++ b/sim/instructions.ts @@ -282,13 +282,14 @@ namespace pxsim.instructions { return div; } function mkCmpDiv(cmp: "wire" | PartVisualDefinition, opts: mkCmpDivOpts): HTMLElement { + let state = runtime.board as pxsim.CoreBoard; let el: visuals.SVGElAndSize; if (cmp == "wire") { el = visuals.mkWirePart([0, 0], opts.wireClr || "red", opts.crocClips); } else { let partVis = cmp; if (typeof partVis.builtIn == "string") { - let cnstr = builtinComponentPartVisual[partVis.builtIn]; + let cnstr = state.builtinPartVisuals[partVis.builtIn]; el = cnstr([0, 0]); } else { el = visuals.mkGenericPartSVG(partVis); diff --git a/sim/visuals/boardhost.ts b/sim/visuals/boardhost.ts index 172670a3..6f64d44d 100644 --- a/sim/visuals/boardhost.ts +++ b/sim/visuals/boardhost.ts @@ -159,7 +159,7 @@ namespace pxsim.visuals { if (partInst.simulationBehavior) { //TODO: seperate simulation behavior from builtin visual let builtinBehavior = partInst.simulationBehavior; - let cnstr = builtinComponentSimVisual[builtinBehavior]; + let cnstr = this.state.builtinVisuals[builtinBehavior]; let stateFn = this.state.builtinParts[builtinBehavior]; part = cnstr(); part.init(this.state.bus, stateFn, this.view, partInst.params);