From 4554eb339fd4f71e65850ffa5d6bf9225b324a90 Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Fri, 11 Oct 2024 18:31:50 +0200 Subject: [PATCH] feat: add GPS Mode selector in modem UI (#5424) --- .../META-INF/MANIFEST.MF | 2 +- .../web/client/ui/network/TabModemGpsUi.java | 79 +++++++++++++++---- .../client/ui/network/TabModemGpsUi.ui.xml | 8 ++ .../GwtNetInterfaceConfigBuilder.java | 1 + ...NetworkConfigurationServiceProperties.java | 10 +++ ...ConfigurationServicePropertiesBuilder.java | 1 + .../status/NetworkStatusServiceAdapter.java | 2 + .../shared/model/GwtModemInterfaceConfig.java | 16 ++++ .../web/client/messages/Messages.properties | 4 +- 9 files changed, 107 insertions(+), 16 deletions(-) diff --git a/kura/org.eclipse.kura.web2/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.web2/META-INF/MANIFEST.MF index 5ca6aa81455..8eaa98a713e 100644 --- a/kura/org.eclipse.kura.web2/META-INF/MANIFEST.MF +++ b/kura/org.eclipse.kura.web2/META-INF/MANIFEST.MF @@ -68,7 +68,7 @@ Import-Package: com.eclipsesource.json;version="0.9.5", org.eclipse.kura.net.modem;version="[2.2,3.0)", org.eclipse.kura.net.status;version="[1.0,2.0)", org.eclipse.kura.net.status.ethernet;version="[1.0,2.0)", - org.eclipse.kura.net.status.modem;version="[1.0,2.0)", + org.eclipse.kura.net.status.modem;version="[1.1,2.0)", org.eclipse.kura.net.status.vlan;version="[1.0,2.0)", org.eclipse.kura.net.status.wifi;version="[1.0,2.0)", org.eclipse.kura.net.vlan;version="[1.0,2.0)", diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.java index bfd9164c414..4e0ee60ca13 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.java @@ -12,6 +12,9 @@ *******************************************************************************/ package org.eclipse.kura.web.client.ui.network; +import java.util.Arrays; +import java.util.List; + import org.eclipse.kura.web.client.messages.Messages; import org.eclipse.kura.web.client.util.HelpButton; import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig; @@ -20,6 +23,7 @@ import org.gwtbootstrap3.client.ui.FieldSet; import org.gwtbootstrap3.client.ui.FormLabel; import org.gwtbootstrap3.client.ui.InlineRadio; +import org.gwtbootstrap3.client.ui.ListBox; import org.gwtbootstrap3.client.ui.PanelHeader; import org.gwtbootstrap3.client.ui.html.Span; @@ -39,6 +43,13 @@ interface TabModemGpsUiUiBinder extends UiBinder { private static final Messages MSGS = GWT.create(Messages.class); + // Note: index of AVAIL_GPS_MODES and CONFIG_GPS_MODES must match! + // Strings used for the dropdown (item text) and that match the ModemGpsMode enum in the Kura API + private static final List AVAIL_GPS_MODES = Arrays.asList("UNMANAGED", "MANAGED_GPS"); + // Strings used for the configuration (i.e. that will be written in the sanpshot) and set as dropdown values + private static final List CONFIG_GPS_MODES = Arrays.asList("kuraModemGpsModeUnmanaged", + "kuraModemGpsModeManagedGps"); + private final GwtSession session; private final NetworkTabsUi tabs; private boolean dirty; @@ -47,12 +58,17 @@ interface TabModemGpsUiUiBinder extends UiBinder { @UiField FormLabel labelGps; + @UiField + FormLabel labelGpsMode; @UiField InlineRadio radio1; @UiField InlineRadio radio2; + @UiField + ListBox gpsMode; + @UiField PanelHeader helpTitle; @@ -65,6 +81,9 @@ interface TabModemGpsUiUiBinder extends UiBinder { @UiField HelpButton gpsHelp; + @UiField + HelpButton gpsModeHelp; + public TabModemGpsUi(GwtSession currentSession, NetworkTabsUi tabs) { initWidget(uiBinder.createAndBindUi(this)); this.session = currentSession; @@ -105,9 +124,11 @@ public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf) { GwtModemInterfaceConfig updatedModemNetIf = (GwtModemInterfaceConfig) updatedNetIf; if (this.formInitialized) { updatedModemNetIf.setGpsEnabled(this.radio1.getValue()); + updatedModemNetIf.setGpsMode(this.gpsMode.getSelectedValue()); } else { // initForm hasn't been called yet updatedModemNetIf.setGpsEnabled(this.selectedModemIfConfig.isGpsEnabled()); + updatedModemNetIf.setGpsMode(this.selectedModemIfConfig.getGpsMode()); } } @@ -146,14 +167,38 @@ private void initForm() { } }); this.radio2.addMouseOutHandler(event -> resetHelp()); - this.radio1.addValueChangeHandler(event -> setDirty(true)); - this.radio2.addValueChangeHandler(event -> setDirty(true)); + this.radio1.addValueChangeHandler(event -> { + setDirty(true); + this.gpsMode.setEnabled(this.radio1.getValue()); + }); + this.radio2.addValueChangeHandler(event -> { + setDirty(true); + this.gpsMode.setEnabled(this.radio1.getValue()); + }); this.helpTitle.setText(MSGS.netHelpTitle()); this.radio1.setText(MSGS.trueLabel()); this.radio2.setText(MSGS.falseLabel()); this.radio1.setValue(true); this.radio2.setValue(false); + + // GPS Mode + this.labelGpsMode.setText(MSGS.netModemGpsMode()); + this.gpsMode.clear(); + + for (String mode : AVAIL_GPS_MODES) { + this.gpsMode.addItem(mode, CONFIG_GPS_MODES.get(AVAIL_GPS_MODES.indexOf(mode))); + this.gpsMode.getElement().getElementsByTagName("option").getItem(AVAIL_GPS_MODES.indexOf(mode)) + .setAttribute("disabled", "disabled"); + } + + this.gpsMode.addMouseOverHandler(event -> { + TabModemGpsUi.this.helpText.clear(); + TabModemGpsUi.this.helpText.add(new Span(MSGS.netModemToolTipGpsMode())); + }); + this.gpsMode.addMouseOutHandler(event -> resetHelp()); + this.gpsMode.addChangeHandler(event -> setDirty(true)); + this.formInitialized = true; } @@ -164,12 +209,14 @@ private void resetHelp() { private void update() { if (this.selectedModemIfConfig != null) { - if (this.selectedModemIfConfig.isGpsEnabled()) { - this.radio1.setValue(true); - this.radio2.setValue(false); - } else { - this.radio1.setValue(false); - this.radio2.setValue(true); + this.radio1.setValue(this.selectedModemIfConfig.isGpsEnabled()); + this.radio2.setValue(!this.selectedModemIfConfig.isGpsEnabled()); + + for (int i = 0; i < this.gpsMode.getItemCount(); i++) { + if (this.gpsMode.getValue(i).equals(this.selectedModemIfConfig.getGpsMode())) { + this.gpsMode.setSelectedIndex(i); + break; + } } } refreshForm(); @@ -177,19 +224,23 @@ private void update() { private void refreshForm() { if (this.selectedModemIfConfig != null) { - if (this.selectedModemIfConfig.isGpsSupported()) { - this.radio1.setEnabled(true); - this.radio2.setEnabled(true); - } else { - this.radio1.setEnabled(false); - this.radio2.setEnabled(false); + this.radio1.setEnabled(this.selectedModemIfConfig.isGpsSupported()); + this.radio2.setEnabled(this.selectedModemIfConfig.isGpsSupported()); + + for (int i = 0; i < this.gpsMode.getItemCount(); i++) { + if (this.selectedModemIfConfig.getSupportedGpsModes().contains(this.gpsMode.getItemText(i))) { + this.gpsMode.getElement().getElementsByTagName("option").getItem(i).removeAttribute("disabled"); + } } } + + this.gpsMode.setEnabled(this.radio1.getValue()); } private void reset() { this.radio1.setValue(true); this.radio2.setValue(false); + this.gpsMode.setSelectedIndex(0); // UNMANAGED update(); } } diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.ui.xml b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.ui.xml index 197fd866e97..d4f2a156f97 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.ui.xml +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/client/ui/network/TabModemGpsUi.ui.xml @@ -59,6 +59,14 @@ + + + + + + + + diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/GwtNetInterfaceConfigBuilder.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/GwtNetInterfaceConfigBuilder.java index 0ad6fb227d5..b1e170e2d0b 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/GwtNetInterfaceConfigBuilder.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/GwtNetInterfaceConfigBuilder.java @@ -326,6 +326,7 @@ private void setModemProperties() { gwtModemConfig.setLcpEchoInterval(this.properties.getModemLpcEchoInterval(this.ifName)); gwtModemConfig.setLcpEchoFailure(this.properties.getModemLpcEchoFailure(this.ifName)); gwtModemConfig.setGpsEnabled(this.properties.getModemGpsEnabled(this.ifName)); + gwtModemConfig.setGpsMode(this.properties.getModemGpsMode(ifName)); gwtModemConfig.setDiversityEnabled(this.properties.getModemDiversityEnabled(this.ifName)); gwtModemConfig.setApn(this.properties.getModemApn(this.ifName)); gwtModemConfig.setModemId(this.properties.getUsbProductName(this.ifName)); diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServiceProperties.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServiceProperties.java index 97872aaeec7..6ec6b84bd17 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServiceProperties.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServiceProperties.java @@ -601,6 +601,7 @@ public void setWifiInfraRadioMode(String ifname, Optional mode) { private static final String NET_INTERFACE_CONFIG_DIVERSITY_ENABLED = "net.interface.%s.config.diversityEnabled"; private static final String NET_INTERFACE_CONFIG_RESET_TIMEOUT = "net.interface.%s.config.resetTimeout"; private static final String NET_INTERFACE_CONFIG_GPS_ENABLED = "net.interface.%s.config.gpsEnabled"; + private static final String NET_INTERFACE_CONFIG_GPS_MODE = "net.interface.%s.config.gpsMode"; private static final String NET_INTERFACE_CONFIG_PERSIST = "net.interface.%s.config.persist"; private static final String NET_INTERFACE_CONFIG_APN = "net.interface.%s.config.apn"; private static final String NET_INTERFACE_CONFIG_DIAL_STRING = "net.interface.%s.config.dialString"; @@ -718,6 +719,15 @@ public void setModemGpsEnabled(String ifname, boolean isGpsEnabled) { this.properties.put(String.format(NET_INTERFACE_CONFIG_GPS_ENABLED, ifname), isGpsEnabled); } + public String getModemGpsMode(String ifname) { + return (String) this.properties.getOrDefault(String.format(NET_INTERFACE_CONFIG_GPS_MODE, ifname), + "kuraModemGpsModeUnmanaged"); + } + + public void setModemGpsMode(String ifname, String gpsMode) { + this.properties.put(String.format(NET_INTERFACE_CONFIG_GPS_MODE, ifname), gpsMode); + } + public boolean getModemPersistEnabled(String ifname) { return (boolean) this.properties.getOrDefault(String.format(NET_INTERFACE_CONFIG_PERSIST, ifname), false); } diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServicePropertiesBuilder.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServicePropertiesBuilder.java index 542c08d0adc..b39ab68c06a 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServicePropertiesBuilder.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/configuration/NetworkConfigurationServicePropertiesBuilder.java @@ -420,6 +420,7 @@ private void setModemGpsProperties() { GwtModemInterfaceConfig gwtModemConfig = (GwtModemInterfaceConfig) this.gwtConfig; this.properties.setModemGpsEnabled(this.ifname, gwtModemConfig.isGpsEnabled()); + this.properties.setModemGpsMode(this.ifname, gwtModemConfig.getGpsMode()); } } diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/status/NetworkStatusServiceAdapter.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/status/NetworkStatusServiceAdapter.java index d17a48fb3b5..344f8c59cb0 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/status/NetworkStatusServiceAdapter.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/server/net2/status/NetworkStatusServiceAdapter.java @@ -291,6 +291,8 @@ private void setModemStateProperties(GwtNetInterfaceConfig gwtConfig, NetworkInt gwtModemConfig.setManufacturer(ellipsis(modemInterfaceInfo.getManufacturer(), 20)); gwtModemConfig.setModemId(modemInterfaceInfo.getModel()); gwtModemConfig.setGpsSupported(modemInterfaceInfo.isGpsSupported()); + gwtModemConfig.setSupportedGpsModes( + modemInterfaceInfo.getSupporteGpsModes().stream().map(Enum::name).collect(Collectors.toList())); gwtModemConfig.setHwFirmware(modemInterfaceInfo.getFirmwareVersion()); gwtModemConfig.setConnectionType(modemInterfaceInfo.getConnectionType().toString()); gwtModemConfig.setNetworkTechnology( diff --git a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java index d593eed224b..a3c1effe7dc 100644 --- a/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java +++ b/kura/org.eclipse.kura.web2/src/main/java/org/eclipse/kura/web/shared/model/GwtModemInterfaceConfig.java @@ -243,6 +243,14 @@ public void setGpsEnabled(boolean gpsEnabled) { set("gpsEnabled", gpsEnabled); } + public void setGpsMode(String gpsMode) { + set("gpsMode", gpsMode); + } + + public String getGpsMode() { + return get("gpsMode"); + } + public boolean isGpsSupported() { if (get("gpsSupported") != null) { return (Boolean) get("gpsSupported"); @@ -254,6 +262,14 @@ public void setGpsSupported(boolean gpsSupported) { set("gpsSupported", gpsSupported); } + public void setSupportedGpsModes(List list) { + set("gpsSupportedModes", list); + } + + public List getSupportedGpsModes() { + return get("gpsSupportedModes"); + } + public boolean isDiversityEnabled() { if (get(DIVERSITY_ENABLED_KEY) != null) { return (Boolean) get(DIVERSITY_ENABLED_KEY); diff --git a/kura/org.eclipse.kura.web2/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties b/kura/org.eclipse.kura.web2/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties index 78e81033071..3ba5cad84e1 100644 --- a/kura/org.eclipse.kura.web2/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties +++ b/kura/org.eclipse.kura.web2/src/main/resources/org/eclipse/kura/web/client/messages/Messages.properties @@ -696,6 +696,7 @@ netModemInvalidLcpEchoInterval="LCP Echo Interval" must be set to either 0 or po netModemLcpEchoFailure=LCP Echo Failure netModemInvalidLcpEchoFailure="LCP Echo Failure" must be set to either 0 or positive integer. netModemEnableGps=Enable GPS +netModemGpsMode=GPS Mode netModemToolTipNetworkTopology=Select the appropriate network topology. netModemToolTipModemIndentifier=Enter a unique name for the modem. netModemToolTipModemInterfaceNumber=A unique number that identifies a modem interface. For example:

An Interface # of 0 would name the modem interface ppp0

An Interface # of 1 would name the modem interface ppp1 @@ -711,7 +712,8 @@ netModemToolTipIdle=Sets the idle option of the PPP daemon which makes it netModemToolTipActiveFilter=Sets the active-filter option of the PPP daemon. It specifies a packet filter (filter-expression) to be applied to data packets to determine which packets are to be regarded as link activity, and therefore reset the idle timer.

The filter-expression syntax is as described for tcpdump(1), except that qualifiers which are inappropriate for a PPP link, such as ether and arp, are not permitted.

The default value is: inbound

To disable the active-filter option of the PPP daemon, leave it blank. netModemToolTipLcpEchoInterval=Sets the lcp-echo-interval option of the PPP daemon.

If set to a positive number, modem will send an LCP echo-request to the peer every specified number of seconds.

To disable this option, set it to 0.

This option can be used with the 'LCP Echo Failure' option to detect that the peer is no longer connected. netModemToolTipLcpEchoFailure=Sets the lcp-echo-failure option of the PPP daemon

If set to a positive number, modem will presume the peer to be dead if specified number of LCP echo-requests are sent without receiving a valid LCP echo-reply.

To disable this option, set it to 0. -netModemToolTipEnableGps=Enable GPS from modem.

If enabled:
* One modem port will be dedicated to NMEA data stream.
* It will not be possible to send AT commands to this port.
* Position Service needs to be enabled as well.
* Serial settings of Position Service should not be changed; it will be redirected to the modem GPS port automatically. +netModemToolTipEnableGps=Enable modem GPS. +netModemToolTipGpsMode=Choose GPS mode:

* UNMANAGED the GPS device of the modem will be setup but not directly managed, therefore freeing the serial port for other services to use.
* MANAGED_GPS the GPS device of the modem will be setup and directly managed therefore the serial port will not be available for other services to use. netModemAntenna=Antenna netModemEnableCellDiv=LTE Antenna Diversity netModemToolTipAntenna=Diversity antenna of the LTE modem enabled.

LTE uses MIMO technology with two antennas port noted "CELL MAIN" and "CELL DIV". When you use only one antenna connected to MAIN port the diversity antenna (CELL DIV) needs to be disabled.
In this case select "false".