3.3 KiB
Design
The design of the system is summarized in the following UML class diagrams.
UML Class Diagram
@startuml skinparam class { BackgroundColor<> #98FF98 BackgroundColor<> #FFCC88 }
package "gps" { class NMEASentence { +addToChecksum(s: String, originalChecksum: int): int +convertLatitude(latitudeString: String): double +convertLongitude(longitudeString: String): double }
class GPGGASentence {
-time: String
-latitude: double
-longitude: double
-fixType: int
-satellites: int
-dilution: double
-altitude: double
-altitudeUnits: String
-sealevel: double
-geoidunits: String
+GPGGASentence(All Necessary Parameters)
+All Necessary Accessors()
+{static} parseGPGGA(s: String): GPGGASentence
}
interface GPSObserver {
+handleGPSData(sentence: String)
}
interface GPSSubject {
+addGPSObserver(observer: GPSObserver)
+notifyGPSObservers(sentence: String)
+removeGPSObserver(observer: GPSObserver)
}
class GPSReaderTask {
-in: BufferedReader
-sentences: String[]
+GPSReaderTask(is: InputStream, sentences: String...)
+doInBackground(): Void
+process(lines: List<String>)
}
}
package "gui" { class CartographyPanel <> { }
class DynamicCartographyPanel {
-gpgga: GPGGASentence
-proj: MapProjection
+DynamicCartographyPanel(model: CartographyDocument<T>, cartographer: Cartographer<T>, proj: MapProjection)
+handleGPSData(data: String)
+paint(g: Graphics)
}
}
class SwingWorker<T, V> <> { }
' Relationships NMEASentence <|-- GPGGASentence GPSSubject <|.. GPSReaderTask SwingWorker <|-- GPSReaderTask : "T bound to Void, V bound to String" GPSObserver <|.. DynamicCartographyPanel CartographyPanel <|-- DynamicCartographyPanel
@enduml
Specifications
This section contains design specifications for specific components. For others, refer to the UML diagrams above. The DynamicCartographyPanel Class
A DynamicCartographyPanel object is a CartographyPanel object that handles dynamic position/location updates
- handleGPSData(): Must parse the NMEA sentence it is passed and store it as an attribute.
- paint(): This method must perform the following steps:
- Add a Rectangle2D.Double object to the first element of the zoomStack centered on the current location, sized 2km wide and 2km high.
- Call the parent paint() method to invoke the street network.
- Project and transform the current position/location.
- Render a filled red circle centered on the current location, 8 pixels wide and 8 pixels high.
The GPSReaderTask Class
- Constructor: Passed the InputStream (typically from the GPS device) and a variable number of NMEA sentences to be processed.
- doInBackground(): Must continuously read lines from the BufferedReader (which decorates the InputStream) and invoke publish() for each line until the task is cancelled.
- process(): Must notify all GPSObserver objects of each line it is supposed to process, as defined by the sentences[] array.
- Note: For performance, multiple lines may be coalesced into a "chunk," which is why process() receives a List