kopia lustrzana https://github.com/ge0rg/aprsdroid
Merge branch 'master' into mapsforge
commit
5b6ede466d
Plik binarny nie jest wyświetlany.
Przed Szerokość: | Wysokość: | Rozmiar: 301 KiB Po Szerokość: | Wysokość: | Rozmiar: 294 KiB |
|
@ -16,6 +16,7 @@
|
|||
android:layout_marginRight="10sp"
|
||||
android:singleLine="true"
|
||||
android:inputType="textCapCharacters"
|
||||
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-"
|
||||
android:hint="@string/p_callsign"
|
||||
/>
|
||||
<EditText
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<string name="wrongpasscode">Your passcode does not match your callsign!</string>
|
||||
<string name="anon_warning">Without a passcode, your reports will not be propagated!</string>
|
||||
<string name="mininterval">Minimum update time is 1 minute!</string>
|
||||
<string name="singlelog">Single Shot</string>
|
||||
<string name="singlelog">Send Position</string>
|
||||
<string name="startlog">Start Tracking</string>
|
||||
<string name="stoplog">Stop Tracking</string>
|
||||
|
||||
|
@ -165,6 +165,8 @@
|
|||
<string name="p_symbol_summary">Your symbol for map display</string>
|
||||
<string name="p_symbol_overlay">Overlay:</string>
|
||||
<string name="p_symbol_result">Result:</string>
|
||||
<string name="p_frequency">Voice frequency</string>
|
||||
<string name="p_frequency_summary">Your voice frequency [MHz]</string>
|
||||
<string name="p_status">Comment field</string>
|
||||
<string name="p_status_summary">The text after your coordinates</string>
|
||||
<string name="p_status_entry">Enter your beacon comment</string>
|
||||
|
@ -350,13 +352,13 @@
|
|||
<string name="p_bt_channel_summary">Bluetooth channel on the TNC</string>
|
||||
<string name="p_bt_channel_entry">Enter channel (most often: "1"; empty for SPP)</string>
|
||||
|
||||
<string name="p_bt_tnc_init">TNC init string</string>
|
||||
<string name="p_bt_tnc_init_summary">Initialization commands for TNC (URL-encoded, Esc=%%1B, "%%"=%%25)</string>
|
||||
<string name="p_bt_tnc_init_msg" formatted="false">URL-encoded string (Esc=%1B, \"%\"=%25), delay after each line:</string>
|
||||
<string name="p_tnc_init">TNC init string</string>
|
||||
<string name="p_tnc_init_summary">Initialization commands for TNC (URL-encoded, Esc=%%1B, "%%"=%%25)</string>
|
||||
<string name="p_tnc_init_msg" formatted="false">URL-encoded string (Esc=%1B, \"%\"=%25), delay after each line:</string>
|
||||
|
||||
<string name="p_bt_tnc_delay">TNC init delay</string>
|
||||
<string name="p_bt_tnc_delay_summary">Time to wait after each line</string>
|
||||
<string name="p_bt_tnc_delay_entry">TNC init delay [ms]</string>
|
||||
<string name="p_tnc_delay">TNC init delay</string>
|
||||
<string name="p_tnc_delay_summary">Time to wait after each line</string>
|
||||
<string name="p_tnc_delay_entry">TNC init delay [ms]</string>
|
||||
|
||||
<string name="p_bt_prefs">Bluetooth settings</string>
|
||||
<string name="p_bt_prefs_summary">Enable Bluetooth, pair devices...</string>
|
||||
|
@ -384,4 +386,8 @@
|
|||
<!-- (USB) Serial TNC settings -->
|
||||
<string name="p_serial_baudrate">Baud Rate</string>
|
||||
<string name="p_serial_baudrate_summary">Data rate of the serial port</string>
|
||||
<!-- (USB) Serial Errors -->
|
||||
<string name="p_serial_unsupported">Unsupported serial port!</string>
|
||||
<string name="p_serial_noperm">No permission for USB device!</string>
|
||||
<string name="p_serial_notfound">No USB device found!</string>
|
||||
</resources>
|
||||
|
|
|
@ -24,22 +24,6 @@
|
|||
android:title="@string/p_bt_channel"
|
||||
android:summary="@string/p_bt_channel_summary"
|
||||
android:dialogTitle="@string/p_bt_channel_entry" />
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="bt.init"
|
||||
android:defaultValue=""
|
||||
android:singleLine="false"
|
||||
android:title="@string/p_bt_tnc_init"
|
||||
android:summary="@string/p_bt_tnc_init_summary"
|
||||
android:dialogMessage="@string/p_bt_tnc_init_msg"
|
||||
android:dialogTitle="@string/p_bt_tnc_init" />
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="bt.delay"
|
||||
android:inputType="number"
|
||||
android:hint="300"
|
||||
android:defaultValue="300"
|
||||
android:title="@string/p_bt_tnc_delay"
|
||||
android:summary="@string/p_bt_tnc_delay_summary"
|
||||
android:dialogTitle="@string/p_bt_tnc_delay_entry" />
|
||||
|
||||
<Preference
|
||||
android:title="@string/p_bt_prefs"
|
||||
|
|
|
@ -22,22 +22,6 @@
|
|||
android:defaultValue="120"
|
||||
android:dialogTitle="@string/p_sotimeout_entry" />
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="bt.init"
|
||||
android:defaultValue=""
|
||||
android:singleLine="false"
|
||||
android:title="@string/p_bt_tnc_init"
|
||||
android:summary="@string/p_bt_tnc_init_summary"
|
||||
android:dialogTitle="@string/p_bt_tnc_init" />
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="bt.delay"
|
||||
android:inputType="number"
|
||||
android:hint="300"
|
||||
android:defaultValue="300"
|
||||
android:title="@string/p_bt_tnc_delay"
|
||||
android:summary="@string/p_bt_tnc_delay_summary"
|
||||
android:dialogTitle="@string/p_bt_tnc_delay_entry" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
|
|
@ -14,23 +14,6 @@
|
|||
android:defaultValue="115200"
|
||||
android:dialogTitle="@string/p_serial_baudrate" />
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="usb.init"
|
||||
android:defaultValue=""
|
||||
android:singleLine="false"
|
||||
android:title="@string/p_bt_tnc_init"
|
||||
android:summary="@string/p_bt_tnc_init_summary"
|
||||
android:dialogMessage="@string/p_bt_tnc_init_msg"
|
||||
android:dialogTitle="@string/p_bt_tnc_init" />
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="usb.delay"
|
||||
android:inputType="number"
|
||||
android:hint="300"
|
||||
android:defaultValue="300"
|
||||
android:title="@string/p_bt_tnc_delay"
|
||||
android:summary="@string/p_bt_tnc_delay_summary"
|
||||
android:dialogTitle="@string/p_bt_tnc_delay_entry" />
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
android:key="digi_path"
|
||||
android:hint="hop1,hop2,.."
|
||||
android:defaultValue="WIDE1-1"
|
||||
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,-"
|
||||
android:title="@string/p_aprs_path"
|
||||
android:summary="@string/p_aprs_path_summary"
|
||||
android:dialogTitle="@string/p_aprs_path_entry" />
|
||||
|
@ -58,6 +59,13 @@
|
|||
android:targetClass="org.aprsdroid.app.PrefSymbolAct" />
|
||||
</PreferenceScreen>
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="frequency"
|
||||
android:inputType="number|numberDecimal"
|
||||
android:title="@string/p_frequency"
|
||||
android:summary="@string/p_frequency_summary"
|
||||
android:dialogTitle="@string/p_frequency_summary" />
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="status"
|
||||
android:hint="@string/default_status"
|
||||
|
|
|
@ -38,14 +38,6 @@
|
|||
android:summary="@string/p_afsk_prefix_summary"
|
||||
android:dialogTitle="@string/p_afsk_prefix_entry" />
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="digi_path"
|
||||
android:hint="hop1,hop2,.."
|
||||
android:defaultValue="WIDE1-1"
|
||||
android:title="@string/p_aprs_path"
|
||||
android:summary="@string/p_aprs_path_summary"
|
||||
android:dialogTitle="@string/p_aprs_path_entry" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
|
|
@ -5,6 +5,22 @@
|
|||
<PreferenceCategory
|
||||
android:title="@string/p_conn_kiss">
|
||||
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="kiss.init"
|
||||
android:defaultValue=""
|
||||
android:singleLine="false"
|
||||
android:title="@string/p_tnc_init"
|
||||
android:summary="@string/p_tnc_init_summary"
|
||||
android:dialogTitle="@string/p_tnc_init" />
|
||||
<de.duenndns.EditTextPreferenceWithValue
|
||||
android:key="kiss.delay"
|
||||
android:inputType="number"
|
||||
android:hint="300"
|
||||
android:defaultValue="300"
|
||||
android:title="@string/p_tnc_delay"
|
||||
android:summary="@string/p_tnc_delay_summary"
|
||||
android:dialogTitle="@string/p_tnc_delay_entry" />
|
||||
|
||||
<de.duenndns.ListPreferenceWithValue
|
||||
android:key="link"
|
||||
android:title="@string/p_link"
|
||||
|
|
|
@ -53,6 +53,13 @@ object AprsPacket {
|
|||
""
|
||||
}
|
||||
|
||||
def formatFreq(csespd : String, freq : Float) : String = {
|
||||
if (freq == 0) "" else {
|
||||
val prefix = if (csespd.length() > 0) "/" else ""
|
||||
prefix + "%07.3fMHz".formatLocal(null, freq)
|
||||
}
|
||||
}
|
||||
|
||||
def formatLogin(callsign : String, ssid : String, passcode : String, version : String) : String = {
|
||||
"user %s pass %s vers %s".format(formatCallSsid(callsign, ssid), passcode, version)
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ object AprsService {
|
|||
val SERVICE_STOPPED = PACKAGE + ".SERVICE_STOPPED"
|
||||
val POSITION = PACKAGE + ".POSITION"
|
||||
val MICLEVEL = PACKAGE + ".MICLEVEL" // internal volume event intent
|
||||
val LINK_ON = PACKAGE + ".LINK_ON"
|
||||
val LINK_OFF = PACKAGE + ".LINK_OFF"
|
||||
// broadcast actions
|
||||
val UPDATE = PACKAGE + ".UPDATE" // something added to the log
|
||||
val MESSAGE = PACKAGE + ".MESSAGE" // we received a message/ack
|
||||
|
@ -213,10 +215,11 @@ class AprsService extends Service {
|
|||
pos.setPositionAmbiguity(prefs.getStringInt("priv_ambiguity", 0))
|
||||
val status_spd = if (prefs.getBoolean("priv_spdbear", true))
|
||||
AprsPacket.formatCourseSpeed(location) else ""
|
||||
val status_freq = AprsPacket.formatFreq(status_spd, prefs.getStringFloat("frequency", 0.0f))
|
||||
val status_alt = if (prefs.getBoolean("priv_altitude", true))
|
||||
AprsPacket.formatAltitude(location) else ""
|
||||
newPacket(new PositionPacket(
|
||||
pos, status_spd + status_alt + " " + status, /* messaging = */ true))
|
||||
pos, status_spd + status_freq + status_alt + " " + status, /* messaging = */ true))
|
||||
}
|
||||
|
||||
def sendPacket(packet : APRSPacket, status_postfix : String) {
|
||||
|
@ -357,5 +360,12 @@ class AprsService extends Service {
|
|||
}
|
||||
}
|
||||
|
||||
def postLinkOn() {
|
||||
sendBroadcast(new Intent(LINK_ON))
|
||||
}
|
||||
|
||||
def postLinkOff() {
|
||||
sendBroadcast(new Intent(LINK_OFF))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -268,13 +268,9 @@ class StationOverlay(icons : Drawable, context : MapAct, db : StorageDatabase) e
|
|||
val strokePaint = new Paint(textPaint)
|
||||
strokePaint.setColor(0xffc8ffc8)
|
||||
strokePaint.setStyle(Paint.Style.STROKE)
|
||||
strokePaint.setStrokeWidth(2)
|
||||
strokePaint.setStrokeWidth(drawSize.asInstanceOf[Float]/12.f)
|
||||
|
||||
val symbStrPaint = new Paint(strokePaint)
|
||||
symbStrPaint.setColor(0xff000000)
|
||||
symbStrPaint.setTextSize(drawSize*3/4 - 1)
|
||||
|
||||
strokePaint.setShadowLayer(2, 0, 0, 0xffc8ffc8)
|
||||
strokePaint.setShadowLayer(10, 0, 0, 0x80c8ffc8)
|
||||
|
||||
|
||||
val p = new Point()
|
||||
|
|
|
@ -24,8 +24,8 @@ class PostListAdapter(context : Context)
|
|||
|
||||
class PostViewBinder extends ViewBinder {
|
||||
|
||||
// post, info, error, incoming
|
||||
val COLORS = Array(0xff30b030, 0xffc0c080, 0xffffb0b0, 0xff8080b0)
|
||||
// post, info, error, incoming, tx
|
||||
val COLORS = Array(0xff30b030, 0xffc0c080, 0xffffb0b0, 0xff8080b0, 0xff30b030)
|
||||
|
||||
override def setViewValue (view : View, cursor : Cursor, columnIndex : Int) : Boolean = {
|
||||
import StorageDatabase.Post._
|
||||
|
@ -36,7 +36,7 @@ class PostViewBinder extends ViewBinder {
|
|||
val v = view.asInstanceOf[TextView]
|
||||
v.setText(m)
|
||||
v.setTextColor(COLORS(t))
|
||||
if (t == TYPE_POST || t == TYPE_INCMG)
|
||||
if (t == TYPE_POST || t == TYPE_INCMG || t == TYPE_TX)
|
||||
v.setTypeface(Typeface.MONOSPACE)
|
||||
else
|
||||
v.setTypeface(Typeface.DEFAULT)
|
||||
|
|
|
@ -34,6 +34,8 @@ object StorageDatabase {
|
|||
val TYPE_INFO = 1
|
||||
val TYPE_ERROR = 2
|
||||
val TYPE_INCMG = 3
|
||||
val TYPE_TX = 4
|
||||
|
||||
val COLUMN_TYPE = 3
|
||||
val COLUMN_MESSAGE = 5
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ object AprsBackend {
|
|||
null,
|
||||
R.xml.proto_afsk, null),
|
||||
"kiss" -> new ProtoInfo(
|
||||
(s, is, os) => new KissProto(is, os),
|
||||
(s, is, os) => new KissProto(s, is, os),
|
||||
R.xml.proto_kiss, "link"),
|
||||
"kenwood" -> new ProtoInfo(
|
||||
(s, is, os) => new KenwoodProto(s, is, os),
|
||||
|
|
|
@ -71,7 +71,6 @@ class BluetoothTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBack
|
|||
var proto : TncProto = null
|
||||
|
||||
def log(s : String) {
|
||||
Log.i(TAG, s)
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_INFO, R.string.post_info, s)
|
||||
}
|
||||
|
||||
|
@ -97,21 +96,7 @@ class BluetoothTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBack
|
|||
}
|
||||
log("Connected to TNC.")
|
||||
|
||||
this.synchronized {
|
||||
proto = AprsBackend.instanciateProto(service, socket.getInputStream(), socket.getOutputStream())
|
||||
}
|
||||
val initstring = java.net.URLDecoder.decode(prefs.getString("bt.init", ""), "UTF-8")
|
||||
val initdelay = prefs.getStringInt("bt.delay", 300)
|
||||
if (initstring != null && initstring != "") {
|
||||
log("Sending init: " + initstring)
|
||||
val os = socket.getOutputStream()
|
||||
for (line <- initstring.split("\n")) {
|
||||
os.write(line.getBytes())
|
||||
os.write('\r')
|
||||
os.write('\n')
|
||||
Thread.sleep(initdelay)
|
||||
}
|
||||
}
|
||||
proto = AprsBackend.instanciateProto(service, socket.getInputStream(), socket.getOutputStream())
|
||||
Log.d(TAG, "init_socket() done")
|
||||
}
|
||||
|
||||
|
@ -133,6 +118,7 @@ class BluetoothTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBack
|
|||
Thread.sleep(3*1000)
|
||||
} catch { case _ => }
|
||||
init_socket()
|
||||
service.postLinkOn()
|
||||
}
|
||||
Log.d(TAG, "waiting for data...")
|
||||
while (running) {
|
||||
|
@ -143,6 +129,8 @@ class BluetoothTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBack
|
|||
} catch {
|
||||
case e : Exception =>
|
||||
Log.d(TAG, "exception, reconnecting...")
|
||||
if (running && !need_reconnect)
|
||||
service.postLinkOff()
|
||||
need_reconnect = true
|
||||
try {
|
||||
if (running) // only bother the user if not yet quitting
|
||||
|
|
|
@ -133,6 +133,7 @@ class TcpUploader(service : AprsService, prefs : PrefsWrapper) extends AprsBacke
|
|||
Log.d(TAG, "TcpSocketThread.run()")
|
||||
try {
|
||||
init_socket()
|
||||
service.postLinkOn()
|
||||
service.postPosterStarted()
|
||||
} catch {
|
||||
case e : Exception => service.postAbort(e.toString()); running = false
|
||||
|
@ -147,6 +148,7 @@ class TcpUploader(service : AprsService, prefs : PrefsWrapper) extends AprsBacke
|
|||
shutdown()
|
||||
Thread.sleep(RECONNECT*1000)
|
||||
init_socket()
|
||||
service.postLinkOn()
|
||||
}
|
||||
Log.d(TAG, "waiting for data...")
|
||||
var line : String = null
|
||||
|
@ -158,6 +160,7 @@ class TcpUploader(service : AprsService, prefs : PrefsWrapper) extends AprsBacke
|
|||
service.postAddPost(TYPE_INFO, R.string.post_info, line)
|
||||
}
|
||||
if (running && (line == null || !socket.isConnected())) {
|
||||
service.postLinkOff()
|
||||
need_reconnect = true
|
||||
}
|
||||
} catch {
|
||||
|
|
|
@ -61,7 +61,7 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
}
|
||||
val granted = i.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED)
|
||||
if (!granted) {
|
||||
service.postAbort("No permission for USB device!")
|
||||
service.postAbort(service.getString(R.string.p_serial_noperm))
|
||||
return
|
||||
}
|
||||
log("Obtained USB permissions.")
|
||||
|
@ -83,7 +83,6 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
}
|
||||
|
||||
def log(s : String) {
|
||||
Log.i(TAG, s)
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_INFO, R.string.post_info, s)
|
||||
}
|
||||
|
||||
|
@ -104,7 +103,7 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
} else
|
||||
log("Unsupported USB device %04x:%04x.".format(deviceVID, devicePID))
|
||||
}
|
||||
service.postAbort("No USB device found!")
|
||||
service.postAbort(service.getString(R.string.p_serial_notfound))
|
||||
}
|
||||
|
||||
def update(packet : APRSPacket) : String = {
|
||||
|
@ -128,6 +127,8 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
//thread.shutdown()
|
||||
thread.interrupt()
|
||||
thread.join(50)
|
||||
if (proto != null)
|
||||
proto.stop()
|
||||
}
|
||||
|
||||
class UsbThread()
|
||||
|
@ -136,7 +137,6 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
var running = true
|
||||
|
||||
def log(s : String) {
|
||||
Log.i(TAG, s)
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_INFO, R.string.post_info, s)
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,7 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
val ser = UsbSerialDevice.createUsbSerialDevice(dev, con)
|
||||
if (ser == null || !ser.open()) {
|
||||
con.close()
|
||||
service.postAbort("Unsupported serial port")
|
||||
service.postAbort(service.getString(R.string.p_serial_unsupported))
|
||||
return
|
||||
}
|
||||
val baudrate = prefs.getStringInt("baudrate", 115200)
|
||||
|
@ -159,19 +159,7 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
prefs.prefs.edit().putString(UsbTnc.deviceHandle(dev), prefs.getString("proto", "kiss")).commit()
|
||||
|
||||
log("Opened " + ser.getClass().getSimpleName() + " at " + baudrate + "bd")
|
||||
val os = new SerialOutputStream(ser)
|
||||
val initstring = java.net.URLDecoder.decode(prefs.getString("usb.init", ""), "UTF-8")
|
||||
val initdelay = prefs.getStringInt("usb.delay", 300)
|
||||
if (initstring != null && initstring != "") {
|
||||
log("Sending init: " + initstring)
|
||||
for (line <- initstring.split("\n")) {
|
||||
os.write(line.getBytes())
|
||||
os.write('\r')
|
||||
os.write('\n')
|
||||
Thread.sleep(initdelay)
|
||||
}
|
||||
}
|
||||
proto = AprsBackend.instanciateProto(service, new SerialInputStream(ser), os)
|
||||
proto = AprsBackend.instanciateProto(service, new SerialInputStream(ser), new SerialOutputStream(ser))
|
||||
service.postPosterStarted()
|
||||
while (running) {
|
||||
val line = proto.readPacket()
|
||||
|
@ -179,7 +167,6 @@ class UsbTnc(service : AprsService, prefs : PrefsWrapper) extends AprsBackend(pr
|
|||
service.postSubmit(line)
|
||||
}
|
||||
Log.d(TAG, "terminate()")
|
||||
proto.stop()
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ class AprsIsProto(service : AprsService, is : InputStream, os : OutputStream) ex
|
|||
val reader = new BufferedReader(new InputStreamReader(is), 256)
|
||||
val writer = new PrintWriter(new OutputStreamWriter(os), true)
|
||||
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_TX,
|
||||
R.string.p_conn_aprsis, loginfilter)
|
||||
writer.println(loginfilter)
|
||||
|
||||
def readPacket() : String = reader.readLine()
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package org.aprsdroid.app
|
||||
|
||||
import _root_.android.content.Context
|
||||
import _root_.android.location.{GpsStatus, LocationManager}
|
||||
import _root_.android.location._
|
||||
import _root_.android.util.Log
|
||||
import _root_.android.os.{Handler, Looper}
|
||||
import _root_.android.os.{Bundle, Handler, Looper}
|
||||
import _root_.java.io.{BufferedReader, InputStream, InputStreamReader, OutputStream, OutputStreamWriter}
|
||||
|
||||
import _root_.net.ab0oo.aprs.parser._
|
||||
|
@ -11,16 +11,17 @@ import _root_.net.ab0oo.aprs.parser._
|
|||
class KenwoodProto(service : AprsService, is : InputStream, os : OutputStream) extends TncProto(is, null) {
|
||||
val TAG = "APRSdroid.KenwoodProto"
|
||||
val br = new BufferedReader(new InputStreamReader(is))
|
||||
val sinkhole = new LocationSinkhole()
|
||||
val locMan = service.getSystemService(Context.LOCATION_SERVICE).asInstanceOf[LocationManager]
|
||||
val output = new OutputStreamWriter(os)
|
||||
|
||||
var listener : NmeaListener = null
|
||||
if (android.os.Build.VERSION.SDK_INT >= 5) {
|
||||
new Handler(Looper.getMainLooper()).post(new Runnable() { override def run() {
|
||||
listener = new NmeaListener()
|
||||
locMan.addNmeaListener(listener)
|
||||
}})
|
||||
}
|
||||
new Handler(Looper.getMainLooper()).post(new Runnable() { override def run() {
|
||||
listener = new NmeaListener()
|
||||
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,
|
||||
0, 0, sinkhole)
|
||||
locMan.addNmeaListener(listener)
|
||||
}})
|
||||
|
||||
def wpl2aprs(line : String) = {
|
||||
val s = line.split("[,*]") // get and split nmea
|
||||
|
@ -56,6 +57,8 @@ class KenwoodProto(service : AprsService, is : InputStream, os : OutputStream) e
|
|||
Log.d(TAG, "NMEA >>> " + nmea)
|
||||
try {
|
||||
output.write(nmea)
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_TX,
|
||||
R.string.p_conn_kwd, nmea.trim())
|
||||
} catch {
|
||||
case e : Exception =>
|
||||
Log.e(TAG, "error sending NMEA to Kenwood: " + e)
|
||||
|
@ -65,9 +68,21 @@ class KenwoodProto(service : AprsService, is : InputStream, os : OutputStream) e
|
|||
Log.d(TAG, "NMEA --- " + nmea)
|
||||
}}
|
||||
|
||||
class LocationSinkhole extends LocationListener {
|
||||
override def onLocationChanged(location : Location) {
|
||||
}
|
||||
|
||||
override def onProviderDisabled(provider : String) {
|
||||
}
|
||||
override def onProviderEnabled(provider : String) {
|
||||
}
|
||||
override def onStatusChanged(provider : String, st: Int, extras : Bundle) {
|
||||
}
|
||||
}
|
||||
|
||||
override def stop() {
|
||||
if (android.os.Build.VERSION.SDK_INT >= 5)
|
||||
locMan.removeNmeaListener(listener)
|
||||
locMan.removeUpdates(sinkhole)
|
||||
locMan.removeNmeaListener(listener)
|
||||
super.stop()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import _root_.java.io.{InputStream, OutputStream}
|
|||
|
||||
import _root_.net.ab0oo.aprs.parser._
|
||||
|
||||
class KissProto(is : InputStream, os : OutputStream) extends TncProto(is, os) {
|
||||
class KissProto(service : AprsService, is : InputStream, os : OutputStream) extends TncProto(is, os) {
|
||||
val TAG = "APRSdroid.KissProto"
|
||||
|
||||
object Kiss {
|
||||
|
@ -19,6 +19,19 @@ class KissProto(is : InputStream, os : OutputStream) extends TncProto(is, os) {
|
|||
val CMD_DATA = 0x00
|
||||
}
|
||||
|
||||
val initstring = java.net.URLDecoder.decode(service.prefs.getString("kiss.init", ""), "UTF-8")
|
||||
val initdelay = service.prefs.getStringInt("kiss.delay", 300)
|
||||
if (initstring != null && initstring != "") {
|
||||
for (line <- initstring.split("\n")) {
|
||||
service.postAddPost(StorageDatabase.Post.TYPE_TX,
|
||||
R.string.p_tnc_init, line)
|
||||
os.write(line.getBytes())
|
||||
os.write('\r')
|
||||
os.write('\n')
|
||||
Thread.sleep(initdelay)
|
||||
}
|
||||
}
|
||||
|
||||
def readPacket() : String = {
|
||||
import Kiss._
|
||||
val buf = scala.collection.mutable.ListBuffer[Byte]()
|
||||
|
|
Ładowanie…
Reference in New Issue