Bahar 2008 BMU112 – 2. Ödev Bu ödevde daha önce başladığımız GPS programına eklemeler yapacaksınız. Program üç adet sınıftan oluşacaktır: GPSAlicisi.java, GPSCumleİsleyici.java ve GPSViz.java. GPSAlicisi.java ve GPSCumleİsleyici.java dosyalarını web sayfamızdan indirin. Daha sonra aynı proje içinde GPSViz.java dosyasını oluşturup aşağıdaki resimlerde görüldüğü gibi görsel dizaynını yapın. GPSAlicisi.java programı disk üzerindeki bir NMEA dosyasını parametre olarak alır ve saniyede bir satırını GPSCumleIsleyici.java dosyasındaki LinkList’e ekler. GPSCumleIsleyici programı kendisine gönderilen GPS cümlelerini parçalar ve gerekli kısımlarını GPSViz programından gönderilen etiketlerin (JLabel) değerlerini güncellemek için kullanır. GPSCumleIsleyici.java programı verilen haliyle GGA cümlelerinden Enlem, Boylam ve Zaman bilgilerini çıkarmaktadır. GGA cümlelerinden almak istediğimiz veriler ve çerçeveye yazdırılma biçimleri şu şekildedir: Zaman: 12:35:19 Enlem: 48’ 07.038’’ Boylam: 11’ 31.000’’ (Örnek cümle: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47) Yazacağınız GPSViz.java programı çalıştırıldığında aşağıdaki pencere ortaya çıkmalıdır: GPS verilerinin bulunduğu dosya seçilip açıldıktan sonra program ikinci tabı otomatik olarak açmalı ve gelen verileri aşağıdaki gibi göstermelidir: Galip Aydın 07-04-2008 Page 1 Bahar 2008 BMU112 – 2. Ödev GPSViz programının kurucu metodunda frame bileşenleri başlatıldıktan sonra GPSCumleIsleyici Threadine gerekli etiketler parametre olarak geçilmeli ve GPSCumleIsleyici programı başlatılmalıdır. Java Dosyaları GPSAlicisi.java import java.io.File; import java.util.Scanner; public class GPSAlicisi extends Thread { private String dosyaAdresi; GPSCumleIsleyici cumleIsleyici; public GPSAlicisi(String dosyaAdr, GPSCumleIsleyici ci) { cumleIsleyici = ci; this.dosyaAdresi = dosyaAdr; } public void run() { nmeaDosyaOku(this.dosyaAdresi); } public void nmeaDosyaOku(String dosyaAdi) { try { String satir = ""; Scanner dosya = new Scanner(new File(dosyaAdi)). useDelimiter("\n"); while (dosya.hasNext()) { satir = dosya.next(); System.out.println("SATIR = " + satir); if (satir.startsWith("$GP")) { cumleIsleyici.paketEkle(satir); } else { Galip Aydın 07-04-2008 Page 2 Bahar 2008 BMU112 – 2. Ödev System.err.println("Hatali Satir : " + satir); } try { this.sleep(100); } catch (Exception e) { } } } catch (Exception e) { } } public static void main(String[] args) { } } GPSCumleIsleyici.java import import import import import java.util.Collections; java.util.LinkedList; java.util.List; java.util.Scanner; javax.swing.JLabel; public class GPSCumleIsleyici extends Thread { private JLabel label1, private List list; label2, label3; public GPSCumleIsleyici() { list = Collections.synchronizedList(new LinkedList()); } public GPSCumleIsleyici( javax.swing.JLabel l1, javax.swing.JLabel l2, javax.swing.JLabel l3) { list = Collections.synchronizedList(new LinkedList()); label1 = l1; label2 = l2; label3 = l3; } public void paketEkle(String paket) { synchronized (list) { list.add(paket); list.notifyAll(); } } public void paketCikar() { try { synchronized (list) { while (list.isEmpty()) { list.wait(); } String paket = (String) list.remove(0); cumleParcala(paket); } } catch (Exception e) { e.printStackTrace(); } } public void run() { while (true) { paketCikar(); } Galip Aydın 07-04-2008 Page 3 Bahar 2008 BMU112 – 2. Ödev } public void cumleParcala(String cumle) { if (cumle.startsWith("$GPGGA")) { String zaman = getKelime(cumle, 1); zaman = zaman.substring(0,2) + ":" + zaman.substring(2,4) + ":" + zaman.substring(4,6); String enlem = getKelime(cumle, 2); enlem = enlem.substring(0,2) + "' " + enlem.substring(2) + "''"; String boylam = getKelime(cumle, 4); if(boylam.startsWith("0")) boylam = boylam.substring(1,boylam.length()); boylam = boylam.substring(0,2) + "' " + boylam.substring(2) + "''"; System.out.println("Zaman = " + zaman); System.out.println("Enlem = " + enlem); System.out.println("Boylam = " + boylam); label1.setText("Enlem = " + enlem); label2.setText("Boylam = " + boylam); label3.setText("Zaman = " + zaman); // // // } } public String getKelime(String cumle, int index) { Scanner s = new Scanner(cumle).useDelimiter(","); int sayac = 0; while (s.hasNext()) { String kelime = s.next(); if (sayac == index) { return kelime; } sayac++; } return null; } } Galip Aydın 07-04-2008 Page 4