-
Notifications
You must be signed in to change notification settings - Fork 1
/
BoardInfoView.java
156 lines (131 loc) · 6.54 KB
/
BoardInfoView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.pi4j.boardinfoservice.views;
import com.pi4j.boardinfo.definition.BoardModel;
import com.pi4j.boardinfoservice.views.header.HeaderLegend;
import com.pi4j.boardinfoservice.views.header.HeaderPinView;
import com.vaadin.flow.component.AttachEvent;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.Unit;
import com.vaadin.flow.component.html.*;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.sidenav.SideNav;
import com.vaadin.flow.component.sidenav.SideNavItem;
import com.vaadin.flow.component.splitlayout.SplitLayout;
import com.vaadin.flow.router.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.time.format.TextStyle;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
import java.util.stream.Collectors;
@PageTitle("Raspberry Pi Board Information")
@Route(value = "board-information", layout = BaseLayout.class)
@RouteAlias(value = "", layout = BaseLayout.class)
public class BoardInfoView extends VerticalLayout implements HasUrlParameter<String> {
private static final Logger logger = LogManager.getLogger(BoardInfoView.class);
private final VerticalLayout holder = new VerticalLayout();
private final SideNav items = new SideNav();
private BoardModel selectedBoard;
public BoardInfoView() {
setSpacing(false);
setSizeFull();
setJustifyContentMode(JustifyContentMode.START);
add(new Paragraph(
new Span("Information about all the Raspberry Pi boards. This info is based on the "),
new Anchor("https://pi4j.com/documentation/board-info", "board info", AnchorTarget.BLANK),
new Span(" provided by the Pi4J library.")));
holder.setPadding(true);
holder.setMargin(false);
holder.setSpacing(true);
items.setMinWidth(250, Unit.PIXELS);
var split = new SplitLayout(items, holder);
split.setHeightFull();
split.setWidthFull();
add(split);
}
@Override
public void setParameter(BeforeEvent event, @OptionalParameter String parameter) {
selectedBoard = Arrays.stream(BoardModel.values())
.filter(bm -> bm.name().equalsIgnoreCase(parameter == null ? "" : parameter))
.findFirst()
.orElse(BoardModel.UNKNOWN);
UI.getCurrent().access(() -> {
showBoard(selectedBoard);
});
}
@Override
public void onAttach(AttachEvent event) {
var listWithoutUnknown = Arrays.stream(BoardModel.values())
.filter(bm -> bm != BoardModel.UNKNOWN)
.sorted(Comparator.comparing(BoardModel::getLabel))
.toList();
UI.getCurrent().access(() -> {
for (BoardModel boardModel : listWithoutUnknown) {
var item = new SideNavItem(boardModel.getLabel(), "/board-information/" + boardModel.getName());
items.addItem(item);
if (boardModel == selectedBoard) {
showBoard(boardModel);
}
}
});
}
private void showBoard(BoardModel boardModel) {
holder.removeAll();
if (boardModel == null || boardModel == BoardModel.UNKNOWN) {
return;
}
logger.info("Board selected: {}", boardModel.name());
// Use access to prevent long-running load board on top of the screen
UI.getCurrent().access(() -> {
holder.add(new H2(boardModel.getLabel()));
var img = new Image("/boards/" + boardModel.name() + ".jpg", boardModel.getLabel());
img.setHeight(200, Unit.PIXELS);
img.setMaxHeight(350, Unit.PIXELS);
holder.add(img);
var picturesNote = new Paragraph("Pictures only as illustration, still searching for a complete list of good pictures...");
picturesNote.getStyle().set("font-style", "italic");
picturesNote.getStyle().set("font-size", "0.8em");
holder.add(picturesNote);
holder.add(new H3("Board info"));
holder.add(getLabelValue("Board type", boardModel.getBoardType().name()));
var formattedDate = boardModel.getReleaseDate().getMonth().getDisplayName(TextStyle.FULL, Locale.UK)
+ " " + boardModel.getReleaseDate().getYear();
holder.add(getLabelValue("Released", formattedDate));
holder.add(getLabelValue("Model", boardModel.getModel().name()));
holder.add(getLabelValue("Header version", boardModel.getHeaderVersion().getLabel()));
holder.add(getLabelValue("Release date", boardModel.getReleaseDate().toString()));
holder.add(getLabelValue("SOC", boardModel.getSoc().name()
+ " / " + boardModel.getSoc().getInstructionSet().getLabel()));
holder.add(getLabelValue("CPU", boardModel.getNumberOfCpu()
+ "x " + boardModel.getCpu().getLabel()
+ " @ " + (boardModel.getVersionsProcessorSpeedInMhz().isEmpty() ? "" :
boardModel.getVersionsProcessorSpeedInMhz().stream()
.map(String::valueOf)
.collect(Collectors.joining(", "))) + "Mhz"));
holder.add(getLabelValue("Memory in GB", boardModel.getVersionsMemoryInGb().isEmpty() ? "" :
boardModel.getVersionsMemoryInGb().stream()
.map(String::valueOf)
.collect(Collectors.joining(", "))));
holder.add(getLabelValue("Remarks", boardModel.getRemarks().isEmpty() ? "" :
String.join(", ", boardModel.getRemarks())));
holder.add(new H3("Header(s)"));
if (boardModel.getHeaderVersion().getHeaderPins() != null
&& !boardModel.getHeaderVersion().getHeaderPins().isEmpty()) {
boardModel.getHeaderVersion().getHeaderPins().forEach(hp -> {
holder.add(new H4(hp.getLabel()));
holder.add(new HeaderPinView(hp));
});
holder.add(new HeaderLegend());
}
});
}
private HorizontalLayout getLabelValue(String label, String value) {
var lbl = new Span(label);
lbl.setWidth(250, Unit.PIXELS);
var labelValueHolder = new HorizontalLayout(lbl, new Span(value));
labelValueHolder.setMargin(false);
labelValueHolder.setPadding(false);
return labelValueHolder;
}
}