diff --git a/sim/dalboard.ts b/sim/dalboard.ts
index f95ff7a8..8abb98a2 100644
--- a/sim/dalboard.ts
+++ b/sim/dalboard.ts
@@ -1,43 +1,6 @@
///
namespace pxsim {
- export class CoreBoard extends BaseBoard {
- id: string;
-
- // the bus
- bus: pxsim.EventBus;
-
- // updates
- updateSubscribers: (() => void)[];
-
- // builtin
- builtinParts: Map;
- builtinVisuals: Map<() => visuals.IBoardPart>;
- builtinPartVisuals: Map<(xy: visuals.Coord) => visuals.SVGElAndSize>;
-
- constructor() {
- super()
- this.id = "b" + Math_.random(2147483647);
- this.bus = new pxsim.EventBus(runtime);
-
- // updates
- this.updateSubscribers = []
- this.updateView = () => {
- this.updateSubscribers.forEach(sub => sub());
- }
-
- this.builtinParts = {};
- this.builtinVisuals = {};
- this.builtinPartVisuals = {};
- }
-
- kill() {
- super.kill();
- AudioContextManager.stop();
- }
- }
-
-
export class DalBoard extends CoreBoard {
// state & update logic for component services
ledMatrixState: LedMatrixState;
@@ -103,15 +66,15 @@ namespace pxsim {
initAsync(msg: SimulatorRunMessage): Promise {
super.initAsync(msg);
- let options = (msg.options || {}) as RuntimeOptions;
+ const options = (msg.options || {}) as RuntimeOptions;
- let boardDef = CURRENT_BOARD; //TODO: read from pxt.json/pxttarget.json
+ const boardDef = CURRENT_BOARD; //TODO: read from pxt.json/pxttarget.json
- let cmpsList = msg.parts;
- let cmpDefs = msg.partDefinitions || {}; //TODO: read from pxt.json/pxttarget.json
- let fnArgs = msg.fnArgs;
+ const cmpsList = msg.parts;
+ const cmpDefs = msg.partDefinitions || {}; //TODO: read from pxt.json/pxttarget.json
+ const fnArgs = msg.fnArgs;
- let viewHost = new visuals.BoardHost({
+ const opts : visuals.BoardHostOpts = {
state: this,
boardDef: boardDef,
partsList: cmpsList,
@@ -119,7 +82,8 @@ namespace pxsim {
fnArgs: fnArgs,
maxWidth: "100%",
maxHeight: "100%",
- });
+ };
+ const viewHost = new visuals.BoardHost(pxsim.visuals.mkBoardView(opts), opts);
document.body.innerHTML = ""; // clear children
document.body.appendChild(viewHost.getView());
diff --git a/sim/instructions.ts b/sim/instructions.ts
index acf6e25e..9a226073 100644
--- a/sim/instructions.ts
+++ b/sim/instructions.ts
@@ -354,8 +354,8 @@ namespace pxsim.instructions {
};
}
function mkBlankBoardAndBreadboard(boardDef: BoardDefinition, cmpDefs: Map, fnArgs: any, width: number, buildMode: boolean = false): visuals.BoardHost {
- let state = runtime.board as pxsim.CoreBoard;
- let boardHost = new visuals.BoardHost({
+ const state = runtime.board as pxsim.CoreBoard;
+ const opts : visuals.BoardHostOpts = {
state: state,
boardDef: boardDef,
forceBreadboard: true,
@@ -363,7 +363,8 @@ namespace pxsim.instructions {
maxWidth: `${width}px`,
fnArgs: fnArgs,
wireframe: buildMode,
- });
+ };
+ let boardHost = new visuals.BoardHost(pxsim.visuals.mkBoardView(opts), opts);
let view = boardHost.getView();
svg.addClass(view, "board-svg");
diff --git a/sim/visuals/boardhost.ts b/sim/visuals/boardhost.ts
deleted file mode 100644
index 6f64d44d..00000000
--- a/sim/visuals/boardhost.ts
+++ /dev/null
@@ -1,214 +0,0 @@
-namespace pxsim.visuals {
- export interface BoardHostOpts {
- state: CoreBoard,
- boardDef: BoardDefinition,
- partsList?: string[],
- partDefs: Map,
- fnArgs: any,
- forceBreadboard?: boolean,
- maxWidth?: string,
- maxHeight?: string
- wireframe?: boolean
- }
- export class BoardHost {
- private parts: IBoardPart[] = [];
- private wireFactory: WireFactory;
- private breadboard: Breadboard;
- private fromBBCoord: (xy: Coord) => Coord;
- private fromMBCoord: (xy: Coord) => Coord;
- private boardView: BoardView;
- private view: SVGSVGElement;
- private partGroup: SVGGElement;
- private partOverGroup: SVGGElement;
- private style: SVGStyleElement;
- private defs: SVGDefsElement;
- private state: CoreBoard;
- private useCrocClips: boolean;
-
- constructor(opts: BoardHostOpts) {
- this.state = opts.state;
- let onboardCmps = opts.boardDef.onboardComponents || [];
- let activeComponents = (opts.partsList || []).filter(c => onboardCmps.indexOf(c) < 0);
- activeComponents.sort();
- this.useCrocClips = opts.boardDef.useCrocClips;
-
- if (opts.boardDef.visual === "microbit") {
- this.boardView = new visuals.MicrobitBoardSvg({
- runtime: runtime,
- theme: visuals.randomTheme(),
- disableTilt: false,
- wireframe: opts.wireframe,
- });
- } else {
- let boardVis = opts.boardDef.visual as BoardImageDefinition;
- this.boardView = new visuals.GenericBoardSvg({
- visualDef: boardVis,
- wireframe: opts.wireframe,
- });
- }
-
- let useBreadboard = 0 < activeComponents.length || opts.forceBreadboard;
- if (useBreadboard) {
- this.breadboard = new Breadboard({
- wireframe: opts.wireframe,
- });
- let bMarg = opts.boardDef.marginWhenBreadboarding || [0, 0, 40, 0];
- let composition = composeSVG({
- el1: this.boardView.getView(),
- scaleUnit1: this.boardView.getPinDist(),
- el2: this.breadboard.getSVGAndSize(),
- scaleUnit2: this.breadboard.getPinDist(),
- margin: [bMarg[0], bMarg[1], 20, bMarg[3]],
- middleMargin: bMarg[2],
- maxWidth: opts.maxWidth,
- maxHeight: opts.maxHeight,
- });
- let under = composition.under;
- let over = composition.over;
- this.view = composition.host;
- let edges = composition.edges;
- this.fromMBCoord = composition.toHostCoord1;
- this.fromBBCoord = composition.toHostCoord2;
- let pinDist = composition.scaleUnit;
- this.partGroup = over;
- this.partOverGroup = svg.child(this.view, "g");
-
- this.style = svg.child(this.view, "style", {});
- this.defs = svg.child(this.view, "defs", {});
-
- this.wireFactory = new WireFactory(under, over, edges, this.style, this.getLocCoord.bind(this));
-
- let allocRes = allocateDefinitions({
- boardDef: opts.boardDef,
- partDefs: opts.partDefs,
- fnArgs: opts.fnArgs,
- getBBCoord: this.breadboard.getCoord.bind(this.breadboard),
- partsList: activeComponents,
- });
-
- this.addAll(allocRes);
- } else {
- let el = this.boardView.getView().el;
- this.view = el;
- this.partGroup = svg.child(this.view, "g");
- this.partOverGroup = svg.child(this.view, "g");
- if (opts.maxWidth)
- svg.hydrate(this.view, { width: opts.maxWidth });
- if (opts.maxHeight)
- svg.hydrate(this.view, { height: opts.maxHeight });
- }
-
- this.state.updateSubscribers.push(() => this.updateState());
- }
-
- public highlightBoardPin(pinNm: string) {
- this.boardView.highlightPin(pinNm);
- }
-
- public highlightBreadboardPin(rowCol: BBLoc) {
- this.breadboard.highlightLoc(rowCol);
- }
-
- public highlightWire(wire: Wire) {
- //TODO: move to wiring.ts
- //underboard wires
- wire.wires.forEach(e => {
- svg.addClass(e, "highlight");
- (e).style["visibility"] = "visible";
- });
-
- //un greyed out
- svg.addClass(wire.endG, "highlight");
- }
-
- public getView(): SVGElement {
- return this.view;
- }
-
- private updateState() {
- this.parts.forEach(c => c.updateState());
- }
-
- private getBBCoord(rowCol: BBLoc) {
- let bbCoord = this.breadboard.getCoord(rowCol);
- return this.fromBBCoord(bbCoord);
- }
- private getPinCoord(pin: string) {
- let boardCoord = this.boardView.getCoord(pin);
- return this.fromMBCoord(boardCoord);
- }
- public getLocCoord(loc: Loc): Coord {
- let coord: Coord;
- if (loc.type === "breadboard") {
- let rowCol = (loc);
- coord = this.getBBCoord(rowCol);
- } else {
- let pinNm = (loc).pin;
- coord = this.getPinCoord(pinNm);
- }
- if (!coord) {
- console.error("Unknown location: " + name)
- return [0, 0];
- }
- return coord;
- }
-
- public addPart(partInst: PartInst): IBoardPart {
- let part: IBoardPart = null;
- let colOffset = 0;
- if (partInst.simulationBehavior) {
- //TODO: seperate simulation behavior from builtin visual
- let builtinBehavior = partInst.simulationBehavior;
- let cnstr = this.state.builtinVisuals[builtinBehavior];
- let stateFn = this.state.builtinParts[builtinBehavior];
- part = cnstr();
- part.init(this.state.bus, stateFn, this.view, partInst.params);
- } else {
- let vis = partInst.visual as PartVisualDefinition;
- part = new GenericPart(vis);
- }
- this.parts.push(part);
- this.partGroup.appendChild(part.element);
- if (part.overElement)
- this.partOverGroup.appendChild(part.overElement);
- if (part.defs)
- part.defs.forEach(d => this.defs.appendChild(d));
- this.style.textContent += part.style || "";
- let colIdx = partInst.startColumnIdx;
- let rowIdx = partInst.startRowIdx;
- let row = getRowName(rowIdx);
- let col = getColumnName(colIdx);
- let xOffset = partInst.bbFit.xOffset / partInst.visual.pinDistance;
- let yOffset = partInst.bbFit.yOffset / partInst.visual.pinDistance;
- let rowCol = {
- type: "breadboard",
- row: row,
- col: col,
- xOffset: xOffset,
- yOffset: yOffset
- };
- let coord = this.getBBCoord(rowCol);
- part.moveToCoord(coord);
- let getCmpClass = (type: string) => `sim-${type}-cmp`;
- let cls = getCmpClass(partInst.name);
- svg.addClass(part.element, cls);
- svg.addClass(part.element, "sim-cmp");
- part.updateTheme();
- part.updateState();
- return part;
- }
- public addWire(inst: WireInst): Wire {
- return this.wireFactory.addWire(inst.start, inst.end, inst.color, this.useCrocClips);
- }
- public addAll(allocRes: AllocatorResult) {
- allocRes.partsAndWires.forEach(pAndWs => {
- let part = pAndWs.part;
- if (part)
- this.addPart(part)
- let wires = pAndWs.wires;
- if (wires)
- wires.forEach(w => this.addWire(w));
- })
- }
- }
-}
\ No newline at end of file
diff --git a/sim/visuals/boardview.ts b/sim/visuals/boardview.ts
new file mode 100644
index 00000000..0bdc3d75
--- /dev/null
+++ b/sim/visuals/boardview.ts
@@ -0,0 +1,19 @@
+namespace pxsim.visuals {
+ export function mkBoardView(opts: BoardHostOpts): BoardView {
+ if (opts.boardDef.visual === "microbit") {
+ return new visuals.MicrobitBoardSvg({
+ runtime: runtime,
+ theme: visuals.randomTheme(),
+ disableTilt: false,
+ wireframe: opts.wireframe,
+ });
+ } else {
+ let boardVis = opts.boardDef.visual as BoardImageDefinition;
+ return new visuals.GenericBoardSvg({
+ visualDef: boardVis,
+ wireframe: opts.wireframe,
+ });
+ }
+
+ }
+}
\ No newline at end of file