new part definitions (#247)
* working on new part definitions * draft of new part definitions * updates comments * starting new allocator * starting from the old allocator * alloc internals renaming * alloc minor renaming * alloc internal renaming * progress on new parts definition * progress on new part defs allocator * refactors BBLoc; progress on new allocator * more progress on new allocator * finishing new allocator * deleting old allocator * moves new allocator and part definitions * porting to new part definitions * refactors instructions for new definitions * debugging new allocator * fixes ground and power wire colros * fixing new part definition bugs * fixes wire end offsets; fixes NeoPixel placement * fixes colorGroup issue * fixes led matrix wiring * naming tweaks * fixes instructions regressions * typo
This commit is contained in:
committed by
Peli de Halleux
parent
d8fc11a688
commit
c63e2c85f1
@ -20,7 +20,7 @@ namespace pxsim.instructions {
|
||||
const LBL_LEFT_PAD = 5;
|
||||
const REQ_WIRE_HEIGHT = 45;
|
||||
const REQ_CMP_HEIGHT = 55;
|
||||
const REQ_CMP_SCALE = 0.5 * 4;
|
||||
const REQ_CMP_SCALE = 0.5 * 3;
|
||||
type Orientation = "landscape" | "portrait";
|
||||
const ORIENTATION: Orientation = "portrait";
|
||||
const PPI = 96.0;
|
||||
@ -284,18 +284,18 @@ namespace pxsim.instructions {
|
||||
div.appendChild(svgEl);
|
||||
return div;
|
||||
}
|
||||
function mkCmpDiv(cmp: "wire" | string | PartVisualDefinition, opts: mkCmpDivOpts): HTMLElement {
|
||||
function mkCmpDiv(cmp: "wire" | PartVisualDefinition, opts: mkCmpDivOpts): HTMLElement {
|
||||
let el: visuals.SVGElAndSize;
|
||||
if (cmp == "wire") {
|
||||
//TODO: support non-croc wire parts
|
||||
el = visuals.mkWirePart([0, 0], opts.wireClr || "red", opts.crocClips);
|
||||
} else if (typeof cmp == "string") {
|
||||
let builtinVis = <string>cmp;
|
||||
let cnstr = builtinComponentPartVisual[builtinVis];
|
||||
el = cnstr([0, 0]);
|
||||
} else {
|
||||
let partVis = <PartVisualDefinition>cmp;
|
||||
el = visuals.mkGenericPartSVG(partVis);
|
||||
if (typeof partVis.builtIn == "string") {
|
||||
let cnstr = builtinComponentPartVisual[partVis.builtIn];
|
||||
el = cnstr([0, 0]);
|
||||
} else {
|
||||
el = visuals.mkGenericPartSVG(partVis);
|
||||
}
|
||||
}
|
||||
return wrapSvg(el, opts);
|
||||
}
|
||||
@ -305,40 +305,33 @@ namespace pxsim.instructions {
|
||||
fnArgs: any,
|
||||
allAlloc: AllocatorResult,
|
||||
stepToWires: WireInst[][],
|
||||
stepToCmps: CmpInst[][]
|
||||
stepToCmps: PartInst[][]
|
||||
allWires: WireInst[],
|
||||
allCmps: CmpInst[],
|
||||
allCmps: PartInst[],
|
||||
lastStep: number,
|
||||
colorToWires: Map<WireInst[]>,
|
||||
allWireColors: string[],
|
||||
};
|
||||
function mkBoardProps(allocOpts: AllocatorOpts): BoardProps {
|
||||
let allocRes = allocateDefinitions(allocOpts);
|
||||
let {powerWires, components} = allocRes;
|
||||
let stepToWires: WireInst[][] = [];
|
||||
let stepToCmps: CmpInst[][] = [];
|
||||
powerWires.forEach(w => {
|
||||
let step = w.assemblyStep + 1;
|
||||
(stepToWires[step] || (stepToWires[step] = [])).push(w)
|
||||
});
|
||||
let getMaxStep = (ns: { assemblyStep: number }[]) => ns.reduce((m, n) => Math.max(m, n.assemblyStep), 0);
|
||||
let stepOffset = powerWires.length > 0 ? getMaxStep(powerWires) + 2 : 1;
|
||||
components.forEach(cAndWs => {
|
||||
let {component, wires} = cAndWs;
|
||||
let cStep = component.assemblyStep + stepOffset;
|
||||
let arr = stepToCmps[cStep] || (stepToCmps[cStep] = []);
|
||||
arr.push(component);
|
||||
let wSteps = wires.map(w => w.assemblyStep + stepOffset);
|
||||
wires.forEach((w, i) => {
|
||||
let wStep = wSteps[i];
|
||||
let arr = stepToWires[wStep] || (stepToWires[wStep] = []);
|
||||
arr.push(w);
|
||||
let stepToCmps: PartInst[][] = [];
|
||||
let stepOffset = 0;
|
||||
allocRes.partsAndWires.forEach(cAndWs => {
|
||||
let part = cAndWs.part;
|
||||
let wires = cAndWs.wires;
|
||||
cAndWs.assembly.forEach((step, idx) => {
|
||||
if (step.part && part)
|
||||
stepToCmps[stepOffset + idx] = [part]
|
||||
if (step.wireIndices && step.wireIndices.length > 0 && wires)
|
||||
stepToWires[stepOffset + idx] = step.wireIndices.map(i => wires[i])
|
||||
})
|
||||
stepOffset = Math.max(cStep, wSteps.reduce((m, n) => Math.max(m, n), 0)) + 1;
|
||||
stepOffset += cAndWs.assembly.length;
|
||||
});
|
||||
let lastStep = stepOffset - 1;
|
||||
let allCmps = components.map(p => p.component);
|
||||
let allWires = powerWires.concat(components.map(p => p.wires).reduce((p, n) => p.concat(n), []));
|
||||
let numSteps = stepOffset;
|
||||
let lastStep = numSteps - 1;
|
||||
let allCmps = allocRes.partsAndWires.map(r => r.part).filter(p => !!p);
|
||||
let allWires = allocRes.partsAndWires.map(r => r.wires || []).reduce((p, n) => p.concat(n), []);
|
||||
let colorToWires: Map<WireInst[]> = {}
|
||||
let allWireColors: string[] = [];
|
||||
allWires.forEach(w => {
|
||||
@ -350,7 +343,7 @@ namespace pxsim.instructions {
|
||||
});
|
||||
return {
|
||||
boardDef: allocOpts.boardDef,
|
||||
cmpDefs: allocOpts.cmpDefs,
|
||||
cmpDefs: allocOpts.partDefs,
|
||||
fnArgs: allocOpts.fnArgs,
|
||||
allAlloc: allocRes,
|
||||
stepToWires: stepToWires,
|
||||
@ -368,7 +361,7 @@ namespace pxsim.instructions {
|
||||
state: state,
|
||||
boardDef: boardDef,
|
||||
forceBreadboard: true,
|
||||
cmpDefs: cmpDefs,
|
||||
partDefs: cmpDefs,
|
||||
maxWidth: `${width}px`,
|
||||
fnArgs: fnArgs,
|
||||
wireframe: buildMode,
|
||||
@ -397,6 +390,19 @@ namespace pxsim.instructions {
|
||||
}
|
||||
|
||||
for (let i = 0; i <= step; i++) {
|
||||
let cmps = props.stepToCmps[i];
|
||||
if (cmps) {
|
||||
cmps.forEach(partInst => {
|
||||
let cmp = board.addPart(partInst)
|
||||
//last step
|
||||
if (i === step) {
|
||||
//highlight locations pins
|
||||
partInst.breadboardConnections.forEach(bbLoc => board.highlightBreadboardPin(bbLoc));
|
||||
svg.addClass(cmp.element, "notgrayed");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let wires = props.stepToWires[i];
|
||||
if (wires) {
|
||||
wires.forEach(w => {
|
||||
@ -405,13 +411,12 @@ namespace pxsim.instructions {
|
||||
if (i === step) {
|
||||
//location highlights
|
||||
if (w.start.type == "breadboard") {
|
||||
let lbls = board.highlightBreadboardPin((<BBLoc>w.start).rowCol);
|
||||
let lbls = board.highlightBreadboardPin((<BBLoc>w.start));
|
||||
} else {
|
||||
board.highlightBoardPin((<BoardLoc>w.start).pin);
|
||||
}
|
||||
if (w.end.type == "breadboard") {
|
||||
let [row, col] = (<BBLoc>w.end).rowCol;
|
||||
let lbls = board.highlightBreadboardPin((<BBLoc>w.end).rowCol);
|
||||
let lbls = board.highlightBreadboardPin((<BBLoc>w.end));
|
||||
} else {
|
||||
board.highlightBoardPin((<BoardLoc>w.end).pin);
|
||||
}
|
||||
@ -420,24 +425,6 @@ namespace pxsim.instructions {
|
||||
}
|
||||
});
|
||||
}
|
||||
let cmps = props.stepToCmps[i];
|
||||
if (cmps) {
|
||||
cmps.forEach(cmpInst => {
|
||||
let cmp = board.addComponent(cmpInst)
|
||||
let colOffset = (<any>cmpInst.visual).breadboardStartColIdx || 0;
|
||||
let rowCol: BBRowCol = [`${cmpInst.breadboardStartRow}`, `${colOffset + cmpInst.breadboardStartColumn}`];
|
||||
//last step
|
||||
if (i === step) {
|
||||
board.highlightBreadboardPin(rowCol);
|
||||
if (cmpInst.visual === "buttonpair") {
|
||||
//TODO: don't specialize this
|
||||
let rowCol2: BBRowCol = [`${cmpInst.breadboardStartRow}`, `${cmpInst.breadboardStartColumn + 3}`];
|
||||
board.highlightBreadboardPin(rowCol2);
|
||||
}
|
||||
svg.addClass(cmp.element, "notgrayed");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
function mkPanel() {
|
||||
@ -463,7 +450,7 @@ namespace pxsim.instructions {
|
||||
cmps.forEach(c => {
|
||||
let quant = 1;
|
||||
// TODO: don't special case this
|
||||
if (c.visual === "buttonpair") {
|
||||
if (c.visual.builtIn === "buttonpair") {
|
||||
quant = 2;
|
||||
}
|
||||
let cmp = mkCmpDiv(c.visual, {
|
||||
@ -516,7 +503,7 @@ namespace pxsim.instructions {
|
||||
let wires = (props.stepToWires[step] || []);
|
||||
let mkLabel = (loc: Loc) => {
|
||||
if (loc.type === "breadboard") {
|
||||
let [row, col] = (<BBLoc>loc).rowCol;
|
||||
let {row, col} = (<BBLoc>loc);
|
||||
return `(${row},${col})`
|
||||
} else
|
||||
return (<BoardLoc>loc).pin;
|
||||
@ -536,17 +523,23 @@ namespace pxsim.instructions {
|
||||
});
|
||||
let cmps = (props.stepToCmps[step] || []);
|
||||
cmps.forEach(c => {
|
||||
let l: BBRowCol = [`${c.breadboardStartRow}`, `${c.breadboardStartColumn}`];
|
||||
let locs = [l];
|
||||
if (c.visual === "buttonpair") {
|
||||
let locs: BBLoc[];
|
||||
if (c.visual.builtIn === "buttonpair") {
|
||||
//TODO: don't special case this
|
||||
let l2: BBRowCol = [`${c.breadboardStartRow}`, `${c.breadboardStartColumn + 3}`];
|
||||
locs.push(l2);
|
||||
locs = [c.breadboardConnections[0], c.breadboardConnections[2]]
|
||||
} else {
|
||||
locs = [c.breadboardConnections[0]];
|
||||
}
|
||||
locs.forEach((l, i) => {
|
||||
let [row, col] = l;
|
||||
let topLbl: string;
|
||||
if (l) {
|
||||
let {row, col} = l;
|
||||
topLbl = `(${row},${col})`;
|
||||
} else {
|
||||
topLbl = "";
|
||||
}
|
||||
let cmp = mkCmpDiv(c.visual, {
|
||||
top: `(${row},${col})`,
|
||||
top: topLbl,
|
||||
topSize: LOC_LBL_SIZE,
|
||||
cmpHeight: REQ_CMP_HEIGHT,
|
||||
cmpScale: REQ_CMP_SCALE
|
||||
@ -656,8 +649,8 @@ ${tsPackage}
|
||||
activeComponents.sort();
|
||||
let props = mkBoardProps({
|
||||
boardDef: boardDef,
|
||||
cmpDefs: cmpDefs,
|
||||
cmpList: activeComponents,
|
||||
partDefs: cmpDefs,
|
||||
partsList: activeComponents,
|
||||
fnArgs: fnArgs,
|
||||
getBBCoord: dummyBreadboard.getCoord.bind(dummyBreadboard)
|
||||
});
|
||||
|
Reference in New Issue
Block a user