From 88275e95e229b3c41c45c05910969d372a639f8d Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sun, 17 Feb 2019 01:37:37 +0100 Subject: [PATCH] wiring analysys, ground work --- .../org/diylc/common/INetlistSummarizer.java | 21 ++++ .../src/org/diylc/netlist/Group.java | 4 + .../src/org/diylc/netlist/Node.java | 6 +- diylc/diylc-library/lib/diylc-core.jar | Bin 258033 -> 258064 bytes .../netlist/AbstractNetlistSummarizer.java | 117 ++++++++++++++++++ .../netlist/GuitarDiagramSummarizer.java | 75 ++++++++++- diylc/diylc-swing/lib/diylc-core.jar | Bin 258033 -> 258064 bytes diylc/diylc-swing/library/main.jar | Bin 602360 -> 605771 bytes 8 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java diff --git a/diylc/diylc-core/src/org/diylc/common/INetlistSummarizer.java b/diylc/diylc-core/src/org/diylc/common/INetlistSummarizer.java index 7e9d0738..bba1da98 100644 --- a/diylc/diylc-core/src/org/diylc/common/INetlistSummarizer.java +++ b/diylc/diylc-core/src/org/diylc/common/INetlistSummarizer.java @@ -1,3 +1,24 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ package org.diylc.common; import java.util.List; diff --git a/diylc/diylc-core/src/org/diylc/netlist/Group.java b/diylc/diylc-core/src/org/diylc/netlist/Group.java index 666eba44..5843691a 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Group.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Group.java @@ -35,6 +35,10 @@ import java.util.Set; public class Group implements Comparable { private Set nodes = new HashSet(); + + public Group() { + + } public Group(Node node1, Node node2) { nodes.add(node1); diff --git a/diylc/diylc-core/src/org/diylc/netlist/Node.java b/diylc/diylc-core/src/org/diylc/netlist/Node.java index 29eee7b6..16905c9d 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Node.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Node.java @@ -46,6 +46,10 @@ public class Node implements Comparable { public int getPointIndex() { return pointIndex; } + + public String getDisplayName() { + return component.getControlPointNodeName(pointIndex); + } @Override public int hashCode() { @@ -77,7 +81,7 @@ public class Node implements Comparable { @Override public String toString() { - return component.getName() + "." + component.getControlPointNodeName(pointIndex) /*+ " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")"*/; + return component.getName() + "." + getDisplayName() /*+ " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")"*/; } @Override diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 30022924cf4b97cfaed9ed895cde4816249f6ebf..7a98c1fc6cb66d9b1ad942bfb81a352c0576127b 100644 GIT binary patch delta 7687 zcmZWu2{=`27e0G`ro@qX$XrT9NJU91N+d*5rZfo6B`QUP5}Kr4h?Jp7hU8QtLm4s; zkp@G9q?Dn16Ak}2ocrJF-k#_5uJ2uIy=#5LK4@EwKcTZi zGiYC-v-5tz|D)$o$_Um`(`Y}T=pafT0f*8;&_n4Wkfj$OaG*629HZwU2%_YpcQmob z2}cjnI8Oy=qYzsNP&$Y}4#3jy!F=SK!efkJ6ORsp7@nCBZkO?#p%Jd(FXBbCr0`n= zW5PcW`PiDj;9Z!uY9RE#Imc&18 zQ=i=d;~gm!&*Y~A$!H6$UKks#uRV%VbY_X7l<1{8c(_Q{fFIEZ4Vti$)qH7;9t&1s z%r_#PJ~KXxJKeT85u=dlK0K44JXek|dTvYy0;vm42>LF(K%y0lEe?{4 z-H0(D{`f@1^Ivzt;vN}om|t{@4;NXUC5y)!b4an%wSB8;wi z(25|ra0IC)6yYk-bjeRNq)N#S$dyT85uL}17;P$6;IkE1U4lhj>jyD!+w=;H>$H%w z^scoO`)@q|jQy8h1z^8y=P!cY1=!#EHVyj&-*;f%?SlqB2@wN1m^U6S#PxoD`+&yL zy`#yfy;EbPyzOrs#^Ir4gy$felX+>Nk$@T1t&!#$!442pcmkVOJ>2WEB;OW9n?EWtfq&r|PiLvzE#r zo#$(vEn5#*tToIao04IESAhwfhfdUH9H!<*ox=+E+$j^xjBTdIFf+21x`K^ZZ)znU zD%ZQ43MZQ4!E%dJpyn0E&5)L1tKX8q#1j-yU z-;=1-n6XNxX5jP#*C_>TFgK}6yvpu{R0EEgT}<_1L#d3rS=!~4G1l2xMIFLMUkzo9 zvou~&ODCXycJ)xDWd83}FIlXE^S5UPZD<*eLm#yh=alzT53zB4kP^p6{8!2m8-ISI z?66@uMjgS%lV99TfM-DkGj_c63<^~W;G<_@CTjvMfQ@@X^j>UeO`?$n zT;9i0GNBZU6+$s?ytFiP;W=P4A-uF0W2r+6F;{tMQ;wPet%dXL4e1+L@wXA3jSaZD zG1xFSrNgk%u$bUTcsvnmz()I)1^}G!cM>D z+VY%5W{XCw#zIB*FDrQx*=*e(8Ccx;dS%*3{AMtfNALFg_#^ehMfLt2-wfjd6Mp|O z@96OEP3Fp3?sLOfL$+V9HJlb1ND8|rGrD_5n5wpBjpUre$=&I(SzZ@U2fDMq%P1Is zuGoKmH0P+$I9m>wh8L#zZ&&#>#;O6PrIFMrU%vWQX%ZBW{q`<7L zlM}qQREII*Coa^cXZj1bO)}sAxySO9Q>{bISnK-MxklAD{oBpTt0a5dn0Y&zH3fL0 zZ^Y3_s`GfXr=A`%d~z#(%9=8#!0l=V=T|CN=r-?IFgHhB$idgS{`!c@@dYm}dBo=& zsXVZ~q4K_~+b)H(?=MTssQZsTzsy^hpPaRx&%gYn%s09FW~GgrHS=reMuYjmB%C7NcQ4GH?yuzmfO@+Tr?I;_g2S0Dju_{bA3*WDCTJJqu;}?<`#$+SfAMGX7KRp0ObbtwPte zM~|g@%f^M8enFScj@5C-MeQOhB}7T&+1bfmiakRYnfr~hY8EVZ9+X) zS0_rS=hbVAwg#3C$u6rjFrPdt)!HL^X3h5}Y(B>q;%Y-e+Sv(vf*xO5E+aM~YUeC8 z(WtyCLZwG%XttfK;;YhUdp&}E-c*bD{!aPXQns*k4^N_IK1csSX7}Z-25H@|e#h!{ z`4zu6Hru&o|BAW^qt@HId1Ge3-e>Ca)%KdPMyx|xM`=V{03+&TRrOQkue)#oco)t& z?Mhqo;O~r;$-i^8;Ft9dJ{C)!d}pM00KvdedndbQ6Nz8>UX#~LU0-6G^wKojDoC|M z>x#_-`*(U^{xR#2xpu)SH+Jm)nl9O9enU)TP{ z`Jq+7@1K8yVu7Ag&+^>@dbdt&Nmg9D$LiUwh<9O;aT_11z44V%5sG-TV2MSWyZ%b{ zrX{k0(qdYEd#ugH^`>pvEVIOLTc+owSg+YW#&;}2?Og-6yBfpd9_tV3 zLVKLW){7m{OEvV+sn$KZIIOap?Kx0!r>nt~QS}vjXdkt2>&k-7vh2rKZJ0VwBY&gB z(lVRsN9%^Ea)l|>X8Nv5uy@Y&O9#VBMjFkRAM-zEuH>0(5g0J6_`N-NMbze&T;CJD z-d!^f^$PFev*I%z6<<3w@!GC%k@p`|o}07JW-915Eim7f=5n=gMLTVGE^c5(j+MEa za=@)^(+z!+UhFeiDtB$+mBXQ5_6grSUL)OT`O*DiUU%`uE3FH5PT}A4QvIqx<=h{} zhyUFD)89Se;JZJ@DpXwpb0mX0f@U6B;&?)m=R&%#m)Fev?gMVAcR-O#`r>n<(xKTd zJQ*iXhd=4HI5ea6fy8W!p(*sQsJCpoDQxv(ofY-`NmB!tB>3(drk)3=SO|#m#jEyp z7%JL>4^93_Bi}5&Ol;T#i#(IQTE$0J70yV0Fym{$a?d^0{a%y*5RzOpa9cRfMlvdI zO@qCHaN)#+;e*FF8C(&Fk-O0qIlH%#Cn?OxzGZ2sM58J1)(q#n$tl06aaWk02knh+ zzc~qBG=9S2$Zw}}FjK#a=0SJjoTt0#%b4-;p%-D}jvo#9kn8>tdLw2OgXl#lm~jiH z8<9uv7=2V68F?3I6)e-n&>GkPmuMwyOpT?R(Y-w9dpuo+nW6;R1~ZeAX#8NrQNBh? zVrE_n9fysUG`bWU7t`q!Y%I#8C2$vOvS|+1Vdv8K&~qB6s+iuQhzy-hT0#sN%LeHo z95a8I*2auCFEGP8IsAZw4R1lvj$_P(fI4P&u|YUCMkfLMFvU484)CKRCsGQCVppOJ zD4~SW9Zq)hz3Qp(S)qWj5dvzA^(Vm3xg-Z4@^MS@fL@D?+I=7!Gl9OK8JDv^0Q7~C z>trb4!!tT}0>C?2$gm^9WAwz&d3qMKJedgQBEL%#kY_p);oRUr;0joXaQPLm7~#n)z!G8G6@Xr9FcL{%IYO9Z ziV()jGY^x13L3ml0_ZITqk0u0tgw-bxI)oYQla-Mus}ij*T5=-A=hAA5X-LtBZNH3 zzyYCiGH^xsfQ#}e04)@=KLywztl*B7Q^|O5Dp-T~s#KycnFg%Tcyk(9i7+>f%;a|( z(O-KV?8G|PfhR)U8(=lUP%gIL0FG!pJDuos(L&)I}p1KQGpz+GP#DD%S>AUYP z(OGzptXs@I((ku>WPMlNC-b;|pUj)Tfaq@IVqpQ9uj~VY`?=Wo0Bk|^3<|+^gsFuj zk18U%jzwgAyNJ~1dq{YfhorCD4@q6&V#04OChKsAi+m+y-cBW?@7pCLZ$c@_+f+){ z>vkzwPyRA8URy@$rI!(1_zJ)ZT`V?_;JQG(_y}HE5IY{ha{y82F~Q)+Fb|HOK889F z)ylzAgx=-w3kzaSIXo{Af0dJb(+YwoD~N6r7v(D9d4+Kvl_W2-lEe*j(Xa|$;m{vk zMdIqJNWRn)xPOp$e?sc#aFMEp^N0MpYLa)Aiyy0rzFrMnH|RfB1J?`Uvl^nOTuaci zmc(V%lKhcc(vNW+S(m6fGOy=#q@QW^1ozgHK1%C}j$i{kXHeh1f#}6G5dKXA$=7Lw z`vCnRjc}hJK5ry`)g}_})kNa*o8WZ`{XETNY}-t94IjNt^9e;mL;^BJBGj1<{CYo&I3liM?f;bgklHxmFlH&O< zF@NC|IRlojh~~vtU>Saq`u9^j^XV1&1<~vP@*v8UW(GIX5{zpHkWoRuhU4zt;mhE^ z{v`)>Y{an&%!F(pq=aG*NN>s4hWGg@@IGJpuRw^&L1s*62bhH}>q(ukOpX^$6=#-o z0$IemAa>SvE^D%#7GchSt^t3aIT>IBNT*3*>rGB&VQ2dt$#u2wIj z)J1-x+`E80ecXpp?gGk8Vi!FdJ9wDR?8bIO_+348B{ zpM~S*P{EYECOP!@dY#y3}_AA-qA8t}@OQF!>Yw7>yH=y7YGz`ZEO6 zjkM;){>=(9jVY%D2w(}w=u zf}ZqjSH<+MPveI<)8UIDt#Nsc2{>;$^WrT)ca+S)TiC;tB+P0v3*V7VwtNTK+1F@B z_ZqFuT!bv1n~is{z-p*_{6D%DDO}xMDKtNOd_N4;1J&NAaU+)Zkjl=8%}D364e2yL zbEAh_=1^wLi?wxA++9Jwg9f4|7 z#|bX&gcn99t%eU3UNfr!iI`NlhhcC!I^$y34RXad3`6mwgS5bZI!`$KTj?z77klJm@=d_I&{8z&#k{zrWFU-3>6 zpx6S&-~CU#u;@SH!ADYA<|C{eEB=3v2;=gRY|%F4NtF7(M}WD(%_%~jT$z7(>Se%x z&ZX!l7`0#SA5rk(LL7gc83!MpQRcv61=Roh%6rKKeFA!T;`gpNNpFS|0lfd-+OB;_ zRD=2X2}oeQ{{3cn)9Z{#^fr=NV|@9Kx`Y(0Q7)tNi}^chGp zS)pL!%<&hO?W*pL9*V|L*5*Io@+l`!njB;GncIcKS?{kAuvycIESBQ9ol;?reg^1| zsZ7>qAW!u&HJ{-V799S7Lr``eFeT@~bVj3)th~(^7_@-d@dfCipd>VmVv4>1Exu0) Iuou?<07kleuK)l5 delta 7425 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 diff --git a/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java b/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java new file mode 100644 index 00000000..42034bd7 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java @@ -0,0 +1,117 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.netlist; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public abstract class AbstractNetlistSummarizer { + + public AbstractNetlistSummarizer() { + } + + protected List trace(Set typeNames, String nodeName, Netlist netlist) { + List res = new ArrayList(); + for (Group g : netlist.getGroups()) { + for (Node n : g.getNodes()) { + if (typeNames.contains(n.getComponent().getClass().getCanonicalName()) && + (nodeName == null || n.getDisplayName().equalsIgnoreCase(nodeName))) { + res.add(g); + break; + } + } + } + return res; + } + + protected List find(Set typeNames, String nodeName, Netlist netlist, List inGroupWith) { + List res = new ArrayList(); + for (Group g : netlist.getGroups()) { + + boolean inGroup; + if (inGroupWith == null) { + inGroup = true; + } else { + inGroup = true; + for (Node n1 : inGroupWith) + if (!g.getNodes().contains(n1)) { + inGroup = false; + break; + } + } + + for (Node n : g.getNodes()) { + if (inGroup && typeNames.contains(n.getComponent().getClass().getCanonicalName()) && + (nodeName == null || n.getDisplayName().equalsIgnoreCase(nodeName))) { + res.add(n); + } + } + } + return res; + } + + protected Netlist eliminate(Netlist netlist, Set nodes) { + Netlist res = new Netlist(); + res.getSwitchSetup().addAll(netlist.getSwitchSetup()); + + Group merged = new Group(); + + for (Group g : netlist.getGroups()) { + boolean needsMerging = false; + for (Node n : nodes) { + if (g.getNodes().contains(n)) { + needsMerging = true; + break; + } + } + if (needsMerging) { + for (Node n : g.getNodes()) { + if (!nodes.contains(n)) + merged.getNodes().add(n); + } + } else { + res.getGroups().add(g); + } + } + + if (!merged.getNodes().isEmpty()) + res.getGroups().add(merged); + + return res; + } + + protected boolean intersect(List groups, Node node) { + for (Group g : groups) + if (g.getNodes().contains(node)) + return true; + return false; + } + + protected Node intersect(List groups, Group group) { + for (Group g : groups) + for (Node node : group.getNodes()) + if (g.getNodes().contains(node)) + return node; + return null; + } +} diff --git a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java index 09fa6dcf..95e22b23 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java @@ -1,11 +1,58 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ package org.diylc.netlist; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.diylc.common.INetlistSummarizer; +import org.diylc.components.electromechanical.ClosedJack1_4; +import org.diylc.components.electromechanical.OpenJack1_4; +import org.diylc.components.guitar.HumbuckerPickup; +import org.diylc.components.guitar.JazzBassPickup; +import org.diylc.components.guitar.P90Pickup; +import org.diylc.components.guitar.PBassPickup; +import org.diylc.components.guitar.SingleCoilPickup; +import org.diylc.components.passive.PotentiometerPanel; -public class GuitarDiagramSummarizer implements INetlistSummarizer { +public class GuitarDiagramSummarizer extends AbstractNetlistSummarizer implements INetlistSummarizer { + + private static Set JACK_TYPES = new HashSet(); + private static Set POT_TYPES = new HashSet(); + private static Set PICKUP_TYPES = new HashSet(); + static { + JACK_TYPES.add(OpenJack1_4.class.getCanonicalName()); + JACK_TYPES.add(ClosedJack1_4.class.getCanonicalName()); + + POT_TYPES.add(PotentiometerPanel.class.getCanonicalName()); + + PICKUP_TYPES.add(SingleCoilPickup.class.getCanonicalName()); + PICKUP_TYPES.add(HumbuckerPickup.class.getCanonicalName()); + PICKUP_TYPES.add(P90Pickup.class.getCanonicalName()); + PICKUP_TYPES.add(JazzBassPickup.class.getCanonicalName()); + PICKUP_TYPES.add(PBassPickup.class.getCanonicalName()); + } @Override public String getName() { @@ -27,8 +74,32 @@ public class GuitarDiagramSummarizer implements INetlistSummarizer { private Summary summarize(Netlist netlist, Node preferredOutput) { List notes = new ArrayList(); - notes.add("test"); + List jackTipNodes = find(JACK_TYPES, "Tip", netlist, null); + List jackSleeveNodes = find(JACK_TYPES, "Sleeve", netlist, null); + + netlist = findAndEliminateVolumePot(netlist, jackTipNodes, jackSleeveNodes, notes); + return new Summary(netlist, notes); } + private Netlist findAndEliminateVolumePot(Netlist netlist, List jackTipGroups, List jackSleeveGroups, List notes) { + List potTipNodes = find(POT_TYPES, null, netlist, jackTipGroups); + List potSleeveNodes = find(POT_TYPES, null, netlist, jackSleeveGroups); + if (!potTipNodes.isEmpty() && !potSleeveNodes.isEmpty()) { + if (potTipNodes.size() == 1 && potTipNodes.get(0).getDisplayName().equals("2") && + potSleeveNodes.size() == 1 && potSleeveNodes.get(0).getDisplayName().equals("3")) { + notes.add("Volume pot detected: " + potTipNodes.get(0).getComponent().getName()); + + Set toEliminate = new HashSet(potTipNodes); + toEliminate.addAll(potSleeveNodes); + return eliminate(netlist, toEliminate); + } else if (potTipNodes.size() > 1 || potSleeveNodes.size() > 1) { + notes.add("Detected multiple volume pots, test inconclusive."); + return netlist; + } + } + + notes.add("No volume pot detected."); + return netlist; + } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 30022924cf4b97cfaed9ed895cde4816249f6ebf..7a98c1fc6cb66d9b1ad942bfb81a352c0576127b 100644 GIT binary patch delta 7687 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 Iuou?<07kleuK)l5 delta 7425 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 diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 91281ef655b99e45e5171f70ea927766b22eb733..c4618835ade7364af05ecb6aec670d4484a2c0dc 100644 GIT binary patch delta 9315 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 z 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