Merge branch 'master' into mapsforge

mediatek_nojit
Georg Lukas 2016-10-06 12:35:57 +02:00
commit 5b6ede466d
21 zmienionych plików z 118 dodań i 121 usunięć

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 301 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 294 KiB

Wyświetl plik

@ -16,6 +16,7 @@
android:layout_marginRight="10sp"
android:singleLine="true"
android:inputType="textCapCharacters"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-"
android:hint="@string/p_callsign"
/>
<EditText

Wyświetl plik

@ -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>

Wyświetl plik

@ -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"

Wyświetl plik

@ -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>

Wyświetl plik

@ -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>

Wyświetl plik

@ -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"

Wyświetl plik

@ -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>

Wyświetl plik

@ -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"

Wyświetl plik

@ -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)
}

Wyświetl plik

@ -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))
}
}

Wyświetl plik

@ -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()

Wyświetl plik

@ -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)

Wyświetl plik

@ -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

Wyświetl plik

@ -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),

Wyświetl plik

@ -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

Wyświetl plik

@ -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 {

Wyświetl plik

@ -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()
}

Wyświetl plik

@ -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()

Wyświetl plik

@ -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()
}
}

Wyświetl plik

@ -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]()