From e5d985dbf1a47a921bfc9b1a78c73ea3d7dc9d0c Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 13 Sep 2016 09:59:34 -0700 Subject: [PATCH] moving boardhost to pxt --- sim/dalboard.ts | 52 ++-------- sim/instructions.ts | 7 +- sim/visuals/boardhost.ts | 214 --------------------------------------- sim/visuals/boardview.ts | 19 ++++ 4 files changed, 31 insertions(+), 261 deletions(-) delete mode 100644 sim/visuals/boardhost.ts create mode 100644 sim/visuals/boardview.ts 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