Files

100 lines
3.3 KiB
Markdown

# Design
The design of the system is summarized in the following UML class diagrams.
## UML Class Diagram
@startuml
skinparam class {
BackgroundColor<<JavaAPI>> #98FF98
BackgroundColor<<Legacy>> #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 <<Legacy>> {
}
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> <<JavaAPI>> {
}
' 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:
1. Add a Rectangle2D.Double object to the first element of the zoomStack centered on the current location, sized 2km wide and 2km high.
2. Call the parent paint() method to invoke the street network.
3. Project and transform the current position/location.
4. 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<String>