Created SimpleRectangularHardcodedGUIComponent
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / modeladapter / componentadapters / SimpleRectangularHardcodedGUIComponentAdapter.java
1 package net.mograsim.logic.model.modeladapter.componentadapters;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.function.BiConsumer;
6 import java.util.function.Function;
7
8 import net.mograsim.logic.core.LogicObserver;
9 import net.mograsim.logic.core.timeline.Timeline;
10 import net.mograsim.logic.core.wires.Wire;
11 import net.mograsim.logic.core.wires.Wire.ReadEnd;
12 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
13 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
14 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent.Usage;
15 import net.mograsim.logic.model.model.wires.Pin;
16 import net.mograsim.logic.model.modeladapter.LogicModelParameters;
17
18 public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedGUIComponent>
19 {
20         private final Function<SimpleRectangularHardcodedGUIComponent, BiConsumer<Map<String, ReadEnd>, Map<String, ReadWriteEnd>>> recalculateFunctionGenerator;
21
22         public SimpleRectangularHardcodedGUIComponentAdapter(
23                         Function<SimpleRectangularHardcodedGUIComponent, BiConsumer<Map<String, ReadEnd>, Map<String, ReadWriteEnd>>> recalculateFunctionGenerator)
24         {
25                 this.recalculateFunctionGenerator = recalculateFunctionGenerator;
26         }
27
28         @Override
29         public Class<SimpleRectangularHardcodedGUIComponent> getSupportedClass()
30         {
31                 return SimpleRectangularHardcodedGUIComponent.class;
32         }
33
34         @Override
35         public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularHardcodedGUIComponent guiComponent,
36                         Map<Pin, Wire> logicWiresPerPin)
37         {
38                 BiConsumer<Map<String, ReadEnd>, Map<String, ReadWriteEnd>> recalculate = recalculateFunctionGenerator.apply(guiComponent);
39                 Map<String, ReadEnd> readEnds = new HashMap<>();
40                 Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
41
42                 LogicObserver logicObs = c -> recalculate.accept(readEnds, readWriteEnds);
43
44                 for (Pin pin : guiComponent.getPins().values())
45                 {
46                         Wire wire = logicWiresPerPin.get(pin);
47                         ReadEnd end;
48                         if (guiComponent.getPinUsage(pin) != Usage.INPUT)
49                         {
50                                 ReadWriteEnd rwEnd = wire.createReadWriteEnd();
51                                 readWriteEnds.put(pin.name, rwEnd);
52                                 end = rwEnd;
53                         } else
54                                 end = wire.createReadOnlyEnd();
55                         readEnds.put(pin.name, end);
56                         if (guiComponent.getPinUsage(pin) != Usage.OUTPUT)
57                                 end.registerObserver(logicObs);
58                 }
59         }
60 }