Ignore:
Timestamp:
2023-08-01T14:17:03+02:00 (16 months ago)
Author:
stoecker
Message:

add direct NMEA input, fix JavaDoc and some warnings

Location:
applications/editors/josm/plugins/livegps
Files:
6 added
4 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/livegps/build.xml

    r35993 r36107  
    22<project name="livegps" default="dist" basedir=".">
    33    <property name="commit.message" value="Changed the constructor signature of the plugin main class"/>
    4     <property name="plugin.main.version" value="18494"/>
    5        
     4    <property name="plugin.main.version" value="18788"/>
     5
    66    <!-- Configure these properties (replace "..." accordingly).
    77         See https://josm.openstreetmap.de/wiki/DevelopersGuide/DevelopingPlugins
     
    1010    <property name="plugin.class" value="livegps.LiveGpsPlugin"/>
    1111    <property name="plugin.description" value="Support live GPS input (moving dot) through a connection to gpsd server."/>
    12     <property name="plugin.icon" value="images/dialogs/livegps.png"/>
     12    <property name="plugin.icon" value="images/dialogs/livegps.svg"/>
    1313    <property name="plugin.link" value="https://wiki.openstreetmap.org/index.php/JOSM/Plugins/LiveGPS"/>
    1414    <property name="plugin.stage" value="50"/>
    15    
     15
    1616    <!-- ** include targets that all plugins have in common ** -->
    1717    <import file="../build-common.xml"/>
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java

    r34526 r36107  
    2525
    2626public class LiveGpsAcquirer implements Runnable {
    27     private static final String DEFAULT_HOST = "localhost";
    28     private static final int DEFAULT_PORT = 2947;
    29     private static final String C_HOST = "livegps.gpsd.host";
    30     private static final String C_PORT = "livegps.gpsd.port";
     27    /* default gpsd host address */
     28    public static final String DEFAULT_HOST = "localhost";
     29    /* default gpsd port number */
     30    public static final int DEFAULT_PORT = 2947;
     31    /* option to use specify gpsd host address */
     32    public static final String C_HOST = "livegps.gpsd.host";
     33    /* option to use specify gpsd port number */
     34    public static final String C_PORT = "livegps.gpsd.port";
    3135    private String gpsdHost;
    3236    private int gpsdPort;
     
    3741    private boolean shutdownFlag = false;
    3842    private boolean JSONProtocol = true;
     43    private long skipTime = 0L;
     44    private int skipNum = 0;
    3945
    4046    private final List<PropertyChangeListener> propertyChangeListener = new ArrayList<>();
     
    139145            }
    140146
    141             assert (connected);
     147            assert connected;
    142148
    143149            try {
     
    191197        String line, type, release;
    192198
    193         Logging.info("LiveGps: trying to connect to gpsd at " + gpsdHost + ":" + gpsdPort);
     199        long t = System.currentTimeMillis();
     200        if (skipTime == 0 || t > skipTime) {
     201            skipTime = 0;
     202            Logging.info("LiveGps: trying to connect to gpsd at " + gpsdHost + ":"
     203                + gpsdPort + (skipNum != 0 ? " (skipped " + skipNum + " notices)" : ""));
     204            skipNum = 0;
     205        } else {
     206          ++skipNum;
     207        }
    194208        fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
    195209
     
    200214                break;
    201215            } catch (IOException e) {
    202                 Logging.warn("LiveGps: Could not open connection to gpsd: " + e);
     216                if (skipTime == 0) {
     217                    Logging.warn("LiveGps: Could not open connection to gpsd ("+addrs[i]+"): " + e);
     218                }
    203219                gpsdSocket = null;
    204220            }
    205221        }
    206222
    207         if (gpsdSocket == null || gpsdSocket.isConnected() == false)
     223        if (gpsdSocket == null || gpsdSocket.isConnected() == false) {
     224            if (skipTime == 0)
     225                skipTime = System.currentTimeMillis()+60000;
    208226            throw new IOException();
     227        }
     228        skipTime = 0;
     229        skipNum = 0;
    209230
    210231        /*
     
    311332
    312333        words = line.split(",");
    313         if ((words.length == 0) || (!words[0].equals("GPSD")))
     334        if ((words.length == 0) || !words[0].equals("GPSD"))
    314335            return null;
    315336
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsData.java

    r33739 r36107  
    77
    88import org.openstreetmap.josm.data.coor.LatLon;
     9import org.openstreetmap.josm.data.gpx.WayPoint;
    910import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1011import org.openstreetmap.josm.data.osm.Way;
     
    1314
    1415/**
     16 * Representation of a single LiveGPS data epoch
    1517 * @author cdaller
    16  *
    1718 */
    1819public class LiveGpsData {
     
    2425    private String wayString;
    2526    private Way way;
     27    private WayPoint wp;
    2628
    2729    public LiveGpsData(double latitude, double longitude, float course, float speed) {
     
    4244
    4345    /**
    44      * @return the course
     46     * Return the waypoint associated with this data set (can be {@code null})
     47     * @return waypoint with additional information or {@code null}
     48     */
     49    public WayPoint getWaypoint() {
     50        return this.wp;
     51    }
     52
     53    /**
     54     * Set the waypoint to transfer additional data form NMEA input
     55     * @param wp waypoint to set
     56     */
     57    public void setWaypoint(WayPoint wp) {
     58        this.wp = wp;
     59    }
     60
     61    /**
     62     * Return the course value
     63     * @return course value in degree
    4564     */
    4665    public float getCourse() {
     
    4968
    5069    /**
    51      * @param course the course to set
     70     * Set the course value in degree
     71     * @param course course to set
    5272     */
    5373    public void setCourse(float course) {
     
    5676
    5777    /**
    58      * @return the haveFix
     78     * Return the fix status (whether there is a position solution or not)
     79     * @return fix status
    5980     */
    6081    public boolean isFix() {
     
    6384
    6485    /**
     86     * Set the fix status (whether there is a position solution or not)
    6587     * @param haveFix the haveFix to set
    6688     */
     
    7092
    7193    /**
    72      * @return the latitude
     94     * Return the latitude part of the position
     95     * @return latitude of position
    7396     */
    7497    public double getLatitude() {
     
    77100
    78101    /**
    79      * @return the longitude
     102     * Return the longitude part of the position
     103     * @return longitude of position
    80104     */
    81105    public double getLongitude() {
     
    84108
    85109    /**
    86      * @return the speed in metres per second!
     110     * Return the speed (m/s)
     111     * @return speed in metres per second!
    87112     */
    88113    public float getSpeed() {
     
    91116
    92117    /**
     118     * Set the speed (m/s)
    93119     * @param speed the speed to set
    94120     */
     
    98124
    99125    /**
    100      * @return the latlon
     126     * Return the position with latitude and logitude combined
     127     * @return both position components
    101128     */
    102129    public LatLon getLatLon() {
     
    104131    }
    105132
     133    /**
     134     * Set the position with latitude and logitude combined
     135     * @param latLon position to set
     136     */
    106137    public void setLatLon(LatLon latLon) {
    107138        this.latLon = latLon;
     
    202233        if (this == obj)
    203234            return true;
    204         if (obj == null)
    205             return false;
    206         if (getClass() != obj.getClass())
     235        if (!(obj instanceof LiveGpsData))
    207236            return false;
    208237        final LiveGpsData other = (LiveGpsData) obj;
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java

    r33078 r36107  
    1414import javax.swing.SwingUtilities;
    1515
     16import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
     17import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
    1618import org.openstreetmap.josm.gui.MapFrame;
    1719import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
     20import org.openstreetmap.josm.spi.preferences.Config;
    1821import org.openstreetmap.josm.tools.Shortcut;
    1922
    2023/**
     24 * The LiveGPS dialog window showing the current data and status
    2125 * @author cdaller
    22  *
    2326 */
    2427public class LiveGpsDialog extends ToggleDialog implements PropertyChangeListener {
    2528    private static final long serialVersionUID = 6183400754671501117L;
    2629    private JLabel statusLabel;
     30    private JLabel nmeaStatusLabel;
    2731    private JLabel wayLabel;
    2832    private JLabel latLabel;
     
    3135    private JLabel speedLabel;
    3236    private JPanel panel;
    33     private LiveGpsStatus status;
     37    private LiveGpsStatus status = new LiveGpsStatus(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
     38    private LiveGpsStatus nmeaStatus = new LiveGpsStatus(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
    3439    private LiveGpsData data;
    3540
     
    3944        KeyEvent.VK_G, Shortcut.ALT_CTRL_SHIFT), 100);
    4045        panel = new JPanel();
    41         panel.setLayout(new GridLayout(6, 2));
    42         panel.add(new JLabel(tr("Status")));
     46        panel.setLayout(new GridLayout(7, 2));
     47        panel.add(new JLabel(tr("Status gpsd")));
    4348        panel.add(statusLabel = new JLabel());
     49        if (!Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL).isEmpty()) {
     50          panel.add(new JLabel(tr("Status NMEA")));
     51          panel.add(nmeaStatusLabel = new JLabel());
     52        }
    4453        panel.add(new JLabel(tr("Way Info")));
    4554        panel.add(wayLabel = new JLabel());
     
    6877                if (data.isFix()) {
    6978                    panel.setBackground(Color.WHITE);
    70                     latLabel.setText(data.getLatitude() + "deg");
    71                     longLabel.setText(data.getLongitude() + "deg");
     79                    ICoordinateFormat mCord = CoordinateFormatManager.getDefaultFormat();
     80                    latLabel.setText(mCord.latToString(data.getLatLon()));
     81                    longLabel.setText(mCord.lonToString(data.getLatLon()));
    7282                    double mySpeed = data.getSpeed() * 3.6f;
    73                     speedLabel.setText((Math.round(mySpeed*100)/100) + "km/h");
    74                     courseLabel.setText(data.getCourse() + "deg");
     83                    speedLabel.setText(tr("{0} km/h", Math.round(mySpeed*100)/100));
     84                    courseLabel.setText(tr("{0} deg", data.getCourse()));
    7585
    7686                    String wayString = data.getWayInfo();
     
    8999            } });
    90100        } else if ("gpsstatus".equals(evt.getPropertyName())) {
     101            LiveGpsStatus oldStatus = status;
    91102            status = (LiveGpsStatus) evt.getNewValue();
    92103
     
    94105            @Override
    95106            public void run() {
    96                 statusLabel.setText(status.getStatusMessage());
    97                 if (status.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED) {
     107                /* prevent flickering - skip the connecting message when NMEA input is working */
     108                if (!(oldStatus.getStatus() == LiveGpsStatus.GpsStatus.CONNECTION_FAILED && status.getStatus() == LiveGpsStatus.GpsStatus.CONNECTING && nmeaStatus.getStatus() == LiveGpsStatus.GpsStatus.CONNECTED))
     109                    statusLabel.setText(status.getStatusMessage());
     110                if (status.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED && nmeaStatus.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED) {
    98111                    panel.setBackground(Color.RED);
    99112                } else {
     
    101114                }
    102115            } });
     116        } else if ("nmeastatus".equals(evt.getPropertyName())) {
     117            nmeaStatus = (LiveGpsStatus) evt.getNewValue();
     118
     119            SwingUtilities.invokeLater(new Runnable() {
     120            @Override
     121            public void run() {
     122                nmeaStatusLabel.setText(nmeaStatus.getStatusMessage());
     123            } });
    103124        }
    104125    }
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java

    r35975 r36107  
    6363    }
    6464
    65     void setCurrentPosition(double lat, double lon) {
     65    void setCurrentPosition(double lat, double lon, WayPoint wp) {
    6666        LatLon thisPos = new LatLon(lat, lon);
    6767        if (lastPos != null && thisPos.equalsEpsilon(lastPos, ILatLon.MAX_SERVER_PRECISION))
     
    7171
    7272        lastPos = thisPos;
    73         lastPoint = new WayPoint(thisPos);
    74         lastPoint.attr.put("time", dateFormat.format(new Date()));
     73        if (wp != null) {
     74          lastPoint = wp;
     75        } else {
     76          lastPoint = new WayPoint(thisPos);
     77          lastPoint.attr.put("time", dateFormat.format(new Date()));
     78        }
    7579        trackSegment.addWaypoint(lastPoint);
    7680
     
    110114            lastData = (LiveGpsData) evt.getNewValue();
    111115            if (lastData.isFix()) {
    112                 setCurrentPosition(lastData.getLatitude(), lastData.getLongitude());
     116                setCurrentPosition(lastData.getLatitude(), lastData.getLongitude(), lastData.getWaypoint());
    113117                if (allowRedraw())
    114118                    this.setFilterStateChanged();
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java

    r35583 r36107  
    2323import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
    2424import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
     25import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    2526import org.openstreetmap.josm.plugins.Plugin;
    2627import org.openstreetmap.josm.plugins.PluginInformation;
     28import org.openstreetmap.josm.spi.preferences.Config;
    2729import org.openstreetmap.josm.tools.Shortcut;
    2830
     
    3133    private LiveGpsAcquirer acquirer = null;
    3234    private Thread acquirerThread = null;
     35    private LiveGpsAcquirerNMEA acquirerNMEA = null;
     36    private Thread acquirerNMEAThread = null;
    3337    private JMenu lgpsmenu = null;
    3438    private JCheckBoxMenuItem lgpscapture;
     
    186190            acquirerThread.start();
    187191
     192            assert (acquirerNMEA == null);
     193            assert (acquirerNMEAThread == null);
     194
     195            if (!Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL).isEmpty()) {
     196                acquirerNMEA = new LiveGpsAcquirerNMEA();
     197                acquirerNMEAThread = new Thread(acquirerNMEA);
     198                acquirerNMEA.addPropertyChangeListener(lgpslayer);
     199                acquirerNMEA.addPropertyChangeListener(lgpsdialog);
     200
     201                for (PropertyChangeListener listener : listenerQueue) {
     202                    acquirerNMEA.addPropertyChangeListener(listener);
     203                }
     204
     205                acquirerNMEAThread.start();
     206            }
     207
    188208            enabled = true;
    189 
    190209        } else if (!enable && enabled) {
    191210            assert (lgpslayer != null);
     
    197216            acquirerThread = null;
    198217
     218            if (acquirerNMEAThread != null) {
     219                acquirerNMEA.shutdown();
     220                acquirerNMEA = null;
     221                acquirerNMEAThread = null;
     222            }
     223
    199224            enabled = false;
    200225        }
     
    211236        if (acquirer != null)
    212237            acquirer.addPropertyChangeListener(listener);
     238        if (acquirerNMEA != null)
     239            acquirerNMEA.addPropertyChangeListener(listener);
    213240    }
    214241
     
    223250        if (acquirer != null)
    224251            acquirer.removePropertyChangeListener(listener);
     252        if (acquirerNMEA != null)
     253            acquirerNMEA.removePropertyChangeListener(listener);
    225254    }
    226255
     
    232261
    233262    /**
    234      * @return the lgpsmenu
     263     * Return the LiveGPS menu
     264     * @return the {@code JMenu} entry
    235265     */
    236266    public JMenu getLgpsMenu() {
    237267        return this.lgpsmenu;
    238268    }
     269
     270    @Override
     271    public PreferenceSetting getPreferenceSetting() {
     272        return new LiveGPSPreferences();
     273    }
    239274}
  • applications/editors/josm/plugins/livegps/src/livegps/LiveGpsStatus.java

    r33078 r36107  
    33
    44/**
     5 * Representation of the LiveGPS connection status
    56 * @author cdaller
    6  *
    77 */
    88public class LiveGpsStatus {
     
    1414    private GpsStatus status;
    1515
     16    /**
     17     * Create a status representation
     18     * @param status current status code
     19     * @param statusMessage current status description message
     20     */
    1621    public LiveGpsStatus(GpsStatus status, String statusMessage) {
    1722        super();
     
    2126
    2227    /**
    23      * @return the status
     28     * Retrieve the current status
     29     * @return current status
    2430     */
    2531    public GpsStatus getStatus() {
     
    2834
    2935    /**
     36     * Set the current status
    3037     * @param status the status to set
    3138     */
     
    3542
    3643    /**
    37      * @return the statusMessage
     44     * Access the status message
     45     * @return status message
    3846     */
    3947    public String getStatusMessage() {
     
    4250
    4351    /**
    44      * @param statusMessage the statusMessage to set
     52     * Set the current status message
     53     * @param statusMessage the status message to set
    4554     */
    4655    public void setStatusMessage(String statusMessage) {
Note: See TracChangeset for help on using the changeset viewer.