Simplify the project and adapt to thee GPS device coded in Zephyr

master
Nigreon 2024-07-21 01:27:05 +02:00
parent 2732d2d6f9
commit 12d8046c5c
13 changed files with 177 additions and 928 deletions

View File

@ -28,6 +28,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.github.Jasonchenlijian:FastBle:2.4.0'
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

Binary file not shown.

View File

@ -16,7 +16,9 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity android:name=".MainActivity"> <activity android:name=".MainActivity"
android:launchMode="singleTask"
>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -24,7 +26,6 @@
</intent-filter> </intent-filter>
</activity> </activity>
<service android:name=".BLEMockLocationService" ></service> <service android:name=".BLEMockLocationService" ></service>
<service android:name=".BLEHRService" ></service>
<receiver android:name=".TaskerReceiver"> <receiver android:name=".TaskerReceiver">
<intent-filter> <intent-filter>
<action android:name="net.nigreon.blegps.TASKER_COMMAND" /> <action android:name="net.nigreon.blegps.TASKER_COMMAND" />

View File

@ -1,224 +0,0 @@
package net.nigreon.blegps
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.bluetooth.BluetoothGatt
import android.content.Intent
import android.os.Binder
import android.os.Build
import android.os.IBinder
import android.support.v4.app.NotificationCompat
import android.support.v4.content.LocalBroadcastManager
import android.util.Log
import com.clj.fastble.BleManager
import com.clj.fastble.callback.BleGattCallback
import com.clj.fastble.callback.BleNotifyCallback
import com.clj.fastble.callback.BleWriteCallback
import com.clj.fastble.data.BleDevice
import com.clj.fastble.exception.BleException
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.util.*
class BLEHRService : Service() {
private val LOG_TAG = "BLEHRService"
private val CHANNEL_ID = "NotifID2"
private val binder = sBinder()
val timerActivity = Timer()
private lateinit var bleDevice: BleDevice
private val serviceHeartRateUuid: String = "0000180d-0000-1000-8000-00805f9b34fb"
private val characteristicHRControlPointUuid: String = "00002a39-0000-1000-8000-00805f9b34fb"
private val characteristicHRMeasurementUuid: String = "00002a37-0000-1000-8000-00805f9b34fb"
private fun initNotificationHR() {
BleManager.getInstance().notify(
bleDevice,
serviceHeartRateUuid,
characteristicHRMeasurementUuid,
object : BleNotifyCallback() {
override fun onNotifySuccess() {
Log.v(LOG_TAG, "Notify HR Success")
//initNotificationPressure()
}
override fun onNotifyFailure(exception: BleException) {
Log.v(LOG_TAG, "BLE Notify HR Failure $exception")
//initNotificationPressure()
}
override fun onCharacteristicChanged(data: ByteArray) {
//Log.v(LOG_TAG, "Notify Temperature Characteristic changed")
val buffer = ByteBuffer.wrap(data)
buffer.order(ByteOrder.LITTLE_ENDIAN)
//texttemp.text = buffer.float.toString()
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBTHRM).putExtra(ServicesConstants.BROADCAST_KEY.KEYBTHRM, buffer.get(1))
)
}
})
}
private fun startHRBLE() {
BleManager.getInstance().connect("CC:2C:24:71:9C:BC", object : BleGattCallback() {
override fun onStartConnect() {
}
override fun onConnectFail(bleDevice: BleDevice, exception: BleException) {
Log.v(LOG_TAG, "BLE HR Connection Failed $exception")
}
override fun onConnectSuccess(
bleDeviceConnect: BleDevice,
gattConnect: BluetoothGatt,
status: Int
) {
Log.v(LOG_TAG, "BLE HR Connection OK")
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBTHR).putExtra(
ServicesConstants.BROADCAST_KEY.KEYBTSTATUSHR,
true
)
)
bleDevice = bleDeviceConnect
initNotificationHR()
val t = object : TimerTask() {
override fun run() {
startHRBLEActivity()
}
}
timerActivity.scheduleAtFixedRate(t, 0, 9500)
}
override fun onDisConnected(
isActiveDisConnected: Boolean,
bleDevice: BleDevice,
gatt: BluetoothGatt,
status: Int
) {
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBTHR).putExtra(
ServicesConstants.BROADCAST_KEY.KEYBTSTATUSHR,
false
)
)
timerActivity.cancel()
Log.v(LOG_TAG, "BLE HR Disconnected")
}
})
}
private fun stopHRBLE() {
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBTHR).putExtra(ServicesConstants.BROADCAST_KEY.KEYBTSTATUSHR, false)
)
BleManager.getInstance().disconnect(bleDevice)
}
private fun startHRBLEActivity() {
val data: ByteArray = byteArrayOf(0x15,0x01,0x01)
BleManager.getInstance().write(
bleDevice,
serviceHeartRateUuid,
characteristicHRControlPointUuid,
data,
object : BleWriteCallback() {
override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray) {
//Log.v(LOG_TAG, "Start Activity sended")
}
override fun onWriteFailure(exception: BleException) {
Log.v(LOG_TAG, "Start Activity Failure $exception")
}
})
}
private fun stopHRBLEActivity() {
val data: ByteArray = byteArrayOf(0x15,0x01,0x00)
BleManager.getInstance().write(
bleDevice,
serviceHeartRateUuid,
characteristicHRControlPointUuid,
data,
object : BleWriteCallback() {
override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray) {
Log.v(LOG_TAG, "Stop Activity sended")
}
override fun onWriteFailure(exception: BleException) {
Log.v(LOG_TAG, "Stop Activity send Failure $exception")
}
})
}
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
if(intent.action == ServicesConstants.HRSERVICEACTION.STARTFOREGROUND_ACTION) {
Log.i(LOG_TAG, "Received Start Foreground Intent ")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create the NotificationChannel
val name = "ChannelName"
val descriptionText = "ChannelDescription"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
mChannel.description = descriptionText
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
var notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("BLE HR")
.setContentText("BLE HR active")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
//.setContentIntent(pendingIntent)
.build()
//pBLE = BLEProvider(application, baseContext)
startHRBLE()
startForeground(ServicesConstants.NOTIFICATION_ID.FOREGROUND_HR_SERVICE,notification)
} else if(intent.action == ServicesConstants.HRSERVICEACTION.STOPFOREGROUND_ACTION) {
Log.i(LOG_TAG, "Received Stop Foreground Intent ")
//pBLE.disconnectBLE()
stopHRBLE()
stopForeground(true)
stopSelf()
}
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
Log.i(LOG_TAG, "In onDestroy")
}
override fun onBind(intent: Intent): IBinder? {
Log.v(LOG_TAG, "in onBind")
return binder
}
override fun onRebind(intent: Intent) {
Log.v(LOG_TAG, "in onRebind")
super.onRebind(intent)
}
override fun onUnbind(intent: Intent): Boolean {
Log.v(LOG_TAG, "in onUnbind")
return true
}
inner class sBinder : Binder() {
// Return this instance of LocalService so clients can call public methods
fun getService(): BLEHRService = this@BLEHRService
}
}

View File

@ -2,15 +2,14 @@ package net.nigreon.blegps
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service import android.app.Service
import android.content.BroadcastReceiver import android.content.*
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.location.LocationManager import android.location.LocationManager
import android.os.* import android.os.*
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.support.v4.content.LocalBroadcastManager import android.support.v4.content.LocalBroadcastManager
import android.support.v7.app.AppCompatActivity
import android.util.Log import android.util.Log
import java.io.File import java.io.File
import java.io.FileNotFoundException import java.io.FileNotFoundException
@ -31,12 +30,11 @@ class BLEMockLocationService : Service() {
private lateinit var mockGPS: MockLocationProvider private lateinit var mockGPS: MockLocationProvider
private var locationReceived = false private var locationReceived = false
private var qualityReceived = false private var qualityReceived = false
private var gpsverbose = false
private var gpxopened = false
private var hrenable = false
private var tempenable = false private var tempenable = false
private lateinit var gpxoutputstream: FileOutputStream private lateinit var gpxoutputstream: FileOutputStream
private lateinit var sharedPreferences: SharedPreferences
var gpsConf: GPSConfiguration = GPSConfiguration() var gpsConf: GPSConfiguration = GPSConfiguration()
// Location // Location
@ -50,11 +48,8 @@ class BLEMockLocationService : Service() {
private var currentEVPE: Float = -1.0f private var currentEVPE: Float = -1.0f
private var currentHDOP: Float = -1.0f private var currentHDOP: Float = -1.0f
private var currentVDOP: Float = -1.0f private var currentVDOP: Float = -1.0f
private var currentSatview: Byte = -1
private var currentSatused: Byte = -1
private var currentElevationGPS: Double = -1.0 private var currentElevationGPS: Double = -1.0
private var currentHR: Byte = 0
private var currentTemperature: Float = 0.0f private var currentTemperature: Float = 0.0f
private val binder = sBinder() private val binder = sBinder()
@ -70,7 +65,6 @@ class BLEMockLocationService : Service() {
currentHeading = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYLOCATIONHEADING,-1.0f) currentHeading = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYLOCATIONHEADING,-1.0f)
mockGPS.pushLocation(currentLatitude,currentLongitude,currentElevation, currentSpeed, currentHeading, currentEHPE) mockGPS.pushLocation(currentLatitude,currentLongitude,currentElevation, currentSpeed, currentHeading, currentEHPE)
locationReceived = true locationReceived = true
storeGPX()
} }
fun qualityChanged(intent: Intent) fun qualityChanged(intent: Intent)
@ -80,16 +74,8 @@ class BLEMockLocationService : Service() {
currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f) currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f)
currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-1.0f) currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-1.0f)
currentVDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYVDOP,-1.0f) currentVDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYVDOP,-1.0f)
currentSatview = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW,-1)
currentSatused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED,-1)
currentElevationGPS = intent.getDoubleExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYELEGPS,-1.0) currentElevationGPS = intent.getDoubleExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYELEGPS,-1.0)
qualityReceived = true qualityReceived = true
storeGPX()
}
fun HRChanged(intent: Intent)
{
currentHR = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYBTHRM,-1)
} }
fun bmpStatusChanged(intent: Intent) fun bmpStatusChanged(intent: Intent)
@ -105,71 +91,25 @@ class BLEMockLocationService : Service() {
fun taskerChanged(bundle: Bundle) { fun taskerChanged(bundle: Bundle) {
Log.v(LOG_TAG, "taskerChanged") Log.v(LOG_TAG, "taskerChanged")
if(bundle.containsKey(ServicesConstants.BROADCAST_KEY.KEYBOOST)) { if(bundle.containsKey(ServicesConstants.BROADCAST_KEY.KEYBOOST)) {
/*if (bundle.getBoolean(ServicesConstants.BROADCAST_KEY.KEYBOOST)) { if (bundle.getBoolean(ServicesConstants.BROADCAST_KEY.KEYBOOST)) {
//gpsConf.gpsBoost = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, false) //gpsConf.gpsBoost = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, false)
gpsConf.gpsBoost = true sendConfBLE(2)
} else { } else {
gpsConf.gpsBoost = false sendConfBLE(1)
}*/
gpsConf.gpsBoost = bundle.getBoolean(ServicesConstants.BROADCAST_KEY.KEYBOOST)
sendConfBLE(gpsConf)
Log.v(LOG_TAG, "Received Tasker Intent : Boost ${gpsConf.gpsBoost}")
}
}
fun storeGPX()
{
if(gpxopened) {
if(!gpsverbose and locationReceived)
{
//writeGPX("${SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date())} $currentLatitude $currentLongitude $currentElevation m\n")
writeGPX("<trkpt lat=\"$currentLatitude\" lon=\"$currentLongitude\"><ele>$currentElevation</ele><time>${SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date())}</time></trkpt>\n")
locationReceived = false
qualityReceived = false
} else if(gpsverbose and locationReceived and qualityReceived) {
//writeGPX("${SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date())} $currentLatitude $currentLongitude $currentElevation m\n")
//writeGPX("$currentEHPE m $currentEVPE m $currentHDOP $currentVDOP $currentSatused/$currentSatview $currentElevationGPS m\n")
//if(hrenable) { writeGPX("$currentHR bpm\n")}
//if(tempenable) { writeGPX("${currentTemperature}°C\n")}
writeGPX("<trkpt lat=\"$currentLatitude\" lon=\"$currentLongitude\"><ele>$currentElevation</ele><time>${SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date())}</time>\n" +
"<extensions>\n")
if(hrenable or tempenable)
{
writeGPX("<gpxtpx:TrackPointExtension>")
if(hrenable)
{
writeGPX("<gpxtpx:atemp>$currentHR</gpxtpx:atemp>")
}
if(tempenable)
{
writeGPX("<gpxtpx:atemp>$currentTemperature</gpxtpx:atemp>")
}
writeGPX("</gpxtpx:TrackPointExtension>\n")
}
writeGPX("<blegps:BLEGPSExtension><blegps:ehpe>$currentEHPE</blegps:ehpe><blegps:evpe>$currentEVPE</blegps:evpe><blegps:hdop>$currentHDOP</blegps:hdop><blegps:vdop>$currentVDOP</blegps:vdop><blegps:satused>$currentSatused</blegps:satused><blegps:satview>$currentSatview</blegps:satview><blegps:gpselevation>$currentElevationGPS</blegps:gpselevation></blegps:BLEGPSExtension>\n")
writeGPX("</extensions>\n</trkpt>\n")
locationReceived = false
qualityReceived = false
} }
} //gpsConf.gpsBoost = bundle.getBoolean(ServicesConstants.BROADCAST_KEY.KEYBOOST)
}
fun writeGPX(str: String) //Log.v(LOG_TAG, "Received Tasker Intent : Boost ${gpsConf.gpsBoost}")
{
try {
gpxoutputstream.write(str.toByteArray())
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
} }
} }
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
sharedPreferences = baseContext.getSharedPreferences("blegps_config",
AppCompatActivity.MODE_PRIVATE
)
mockGPS = MockLocationProvider(LocationManager.GPS_PROVIDER, baseContext) mockGPS = MockLocationProvider(LocationManager.GPS_PROVIDER, baseContext)
val brReceiver = object : BroadcastReceiver() { val brReceiver = object : BroadcastReceiver() {
@ -177,7 +117,6 @@ class BLEMockLocationService : Service() {
when (intent?.action) { when (intent?.action) {
ServicesConstants.BROADCAST_FILTER.FILTERLOCATION -> locationChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERLOCATION -> locationChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERQUALITY-> qualityChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERQUALITY-> qualityChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBTHRM-> HRChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERTEMP-> tempChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERTEMP-> tempChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBMP-> bmpStatusChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERBMP-> bmpStatusChanged(intent)
@ -190,7 +129,6 @@ class BLEMockLocationService : Service() {
val manager = LocalBroadcastManager.getInstance(this) val manager = LocalBroadcastManager.getInstance(this)
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBTHRM))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERTEMP)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERTEMP))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBMP)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBMP))
//pBLE.registerBMP() //pBLE.registerBMP()
@ -200,11 +138,10 @@ class BLEMockLocationService : Service() {
if(intent.action == ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION) { if(intent.action == ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION) {
Log.i(LOG_TAG, "Received Start Foreground Intent ") Log.i(LOG_TAG, "Received Start Foreground Intent ")
// val intentNotif = Intent(this, MainActivity::class.java) val startIntent = Intent(this, MainActivity::class.java)
// intentNotif.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
// intentNotif.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACT val contentIntent = PendingIntent.getActivity(this, 0, startIntent,
PendingIntent.FLAG_UPDATE_CURRENT)
//val pendingIntent = PendingIntent.getActivity(this, 0, intentNotif, 0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -225,7 +162,8 @@ class BLEMockLocationService : Service() {
.setContentTitle("BLE GPS") .setContentTitle("BLE GPS")
.setContentText("BLE & Mock active") .setContentText("BLE & Mock active")
.setPriority(NotificationCompat.PRIORITY_DEFAULT) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
//.setContentIntent(pendingIntent) .setContentIntent(contentIntent)
.setAutoCancel(false)
.build() .build()
pBLE = BLEProvider(application, baseContext) pBLE = BLEProvider(application, baseContext)
@ -239,7 +177,9 @@ class BLEMockLocationService : Service() {
stopSelf() stopSelf()
} else if(intent.action == ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION){ } else if(intent.action == ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION){
Log.i(LOG_TAG, "intent action : ${intent.action}") Log.i(LOG_TAG, "intent action : ${intent.action}")
taskerChanged(intent.extras) if(this::pBLE.isInitialized) {
taskerChanged(intent.extras)
}
} }
return START_STICKY return START_STICKY
} }
@ -271,103 +211,25 @@ class BLEMockLocationService : Service() {
pBLE.sendCalibrate(buffer.array()) pBLE.sendCalibrate(buffer.array())
} }
fun HRStatusChanged(enable: Boolean) //fun sendConfBLE(bmpnrf: Boolean, bmpble: Boolean, bmp2gps: Boolean, exttemp: Boolean, gpsble: Boolean, gpsbleverb: Boolean, gpsserial: Boolean, gpsmode: Int, gpspoller: Short, gpssendbt: Short, bmppoller: Short) {
{ fun sendConfBLE(mode: Int) {
hrenable = enable val buffer = ByteBuffer.allocate(2)
}
fun openGPX(datefilename: String) {
//val datefilename: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
var gpxfilename = File(
Environment.getExternalStorageDirectory().path + File.separator + "BTGPS",
datefilename + ".gpx"
)
var gpxdir = File(Environment.getExternalStorageDirectory().path + File.separator + "BTGPS")
var success = true;
if (!gpxdir.exists()) {
success = gpxdir.mkdir();
}
if (success) {
if(!gpxfilename.exists()) {
try {
gpxoutputstream = FileOutputStream(gpxfilename, true)
//val gpxheader = "GPX Header\n"
val gpxheader =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n" +
"<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" version=\"1.1\" " +
"xmlns:gpxtpx=\"http://www.garmin.com/xmlschemas/TrackPointExtension/v1\" " +
"xmlns:blegps=\"https://www.nigreon.net\"" +
">\n" +
"<metadata>" +
"<name>${datefilename}</name>" +
"<desc>${datefilename}</desc>\n" +
"<time>${SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date())}</time>\n" +
"</metadata>\n" +
"<trk>\n" +
"<name>${datefilename}</name>\n" +
"<trkseg>\n"
writeGPX(gpxheader)
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
} else {
try {
gpxoutputstream = FileOutputStream(gpxfilename, true)
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
gpxopened = true
}
}
fun closeGPX()
{
//val gpxfooter = "GPX Footer\n"
val gpxfooter = "</trkseg></trk></gpx>\n"
writeGPX(gpxfooter)
gpxoutputstream.close()
gpxopened = false
}
//fun sendConfBLE(bmpnrf: Boolean, bmpble: Boolean, bmp2gps: Boolean, exttemp: Boolean, gpsble: Boolean, gpsbleverb: Boolean, gpsserial: Boolean, gpsmode: Int, gpspoller: Short, gpssendbt: Short, bmppoller: Short) {
fun sendConfBLE(gpsConfNew: GPSConfiguration) {
gpsConf = gpsConfNew
val buffer = ByteBuffer.allocate(8)
buffer.order(ByteOrder.LITTLE_ENDIAN) buffer.order(ByteOrder.LITTLE_ENDIAN)
var activateByte1: Byte = 0 var activateByte1: Byte = 0
var activateByte2: Byte = 0 var activateByte2: Byte = 0
if(gpsConf.bmpNrf) { activateByte1 = activateByte1.or(0x01) } if(sharedPreferences.getBoolean("swbmp2gps", false)) { activateByte1 = activateByte1.or(0x01) }
if(gpsConf.bmpBT) { activateByte1 = activateByte1.or(0x02) } if(mode == 1) {
if(gpsConf.bmp2gps) { activateByte1 = activateByte1.or(0x04) } activateByte2 = activateByte2.or(0x01)
if(gpsConf.extTemp) { activateByte1 = activateByte1.or(0x08) } } else if(mode == 2) {
activateByte2 = activateByte2.or(0x02)
if(gpsConf.gpsBLE) { activateByte2 = activateByte2.or(0x01) } } else if(mode == 3) {
if(gpsConf.gpsVerbose) { activateByte2 = activateByte2.or(0x02) } activateByte2 = activateByte2.or(0x04)
if(gpsConf.gpsSerial) { activateByte2 = activateByte2.or(0x04) }
if(gpsConf.gpsMode == 1 || gpsConf.gpsBoost) {
activateByte2 = activateByte2.or(0x08)
} else if(gpsConf.gpsMode == 2) {
activateByte2 = activateByte2.or(0x10)
} }
buffer.put(activateByte1) buffer.put(activateByte1)
buffer.put(activateByte2) buffer.put(activateByte2)
if(gpsConf.gpsBoost) {
buffer.putShort(4)
buffer.putShort(gpsConf.bmpPollerSend)
buffer.putShort(4)
} else {
buffer.putShort(gpsConf.gpsPollerSend)
buffer.putShort(gpsConf.bmpPollerSend)
buffer.putShort(gpsConf.gpsSendBTSend)
}
pBLE.sendConf(buffer.array()) pBLE.sendConf(buffer.array())
} }

View File

@ -3,19 +3,19 @@ import android.app.Application
import android.bluetooth.BluetoothGatt import android.bluetooth.BluetoothGatt
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences
import android.support.v4.content.LocalBroadcastManager import android.support.v4.content.LocalBroadcastManager
import android.util.Log import android.util.Log
import com.clj.fastble.BleManager import com.clj.fastble.BleManager
import com.clj.fastble.data.BleDevice import com.clj.fastble.data.BleDevice
import com.clj.fastble.exception.BleException import com.clj.fastble.exception.BleException
import com.clj.fastble.callback.BleGattCallback
import com.clj.fastble.callback.BleNotifyCallback
import com.clj.fastble.callback.BleReadCallback
import com.clj.fastble.callback.BleWriteCallback
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.nio.ByteOrder import java.nio.ByteOrder
import android.os.CountDownTimer import android.os.CountDownTimer
import android.os.Handler import android.os.Handler
import android.support.v7.app.AppCompatActivity
import com.clj.fastble.callback.*
import com.clj.fastble.scan.BleScanRuleConfig
class BLEProvider(val application: Application, val baseContext: Context) class BLEProvider(val application: Application, val baseContext: Context)
@ -36,13 +36,17 @@ class BLEProvider(val application: Application, val baseContext: Context)
private var connected = false private var connected = false
private var reconnectcount = 0 private var reconnectcount = 0
private val LOG_TAG = "BLEProvider" private val LOG_TAG = "BLEProvider"
//private lateinit var baseContext: Context //private lateinit var baseContext: Context
private lateinit var sharedPreferences: SharedPreferences
init init
{ {
sharedPreferences = baseContext.getSharedPreferences("blegps_config",
AppCompatActivity.MODE_PRIVATE
)
BleManager.getInstance().enableBluetooth()
connectBLE() connectBLE()
} }
@ -50,7 +54,27 @@ class BLEProvider(val application: Application, val baseContext: Context)
Handler().postDelayed(function, delay) Handler().postDelayed(function, delay)
} }
private fun connectBLE() private fun connectBLE() {
val scanRuleConfig = BleScanRuleConfig.Builder()
//.setServiceUuids(serviceUuids)
//.setDeviceName(true, names)
//.setDeviceMac(mac)
//.setAutoConnect(isAutoConnect)
.setScanTimeOut(5000)
.build()
BleManager.getInstance().initScanRule(scanRuleConfig)
BleManager.getInstance().scan(object : BleScanCallback() {
override fun onScanStarted(success: Boolean) {}
override fun onScanning(bleDevice: BleDevice) {}
override fun onScanFinished(scanResultList: List<BleDevice>) {
connectBLE2()
}
})
}
private fun connectBLE2()
{ {
//BleManager.getInstance().init(application) //BleManager.getInstance().init(application)
/*BleManager.getInstance() /*BleManager.getInstance()
@ -59,7 +83,8 @@ class BLEProvider(val application: Application, val baseContext: Context)
//BleManager.getInstance().operateTimeout = 5000 //BleManager.getInstance().operateTimeout = 5000
//BleManager.getInstance().connect("24:6F:28:16:C1:F2", object : BleGattCallback() { //BleManager.getInstance().connect("24:6F:28:16:C1:F2", object : BleGattCallback() {
BleManager.getInstance().connect("E9:8E:8A:12:6F:3F", object : BleGattCallback() { var macaddr = sharedPreferences.getString("macaddr", null)
BleManager.getInstance().connect(macaddr, object : BleGattCallback() {
override fun onStartConnect() { override fun onStartConnect() {
} }
@ -266,17 +291,18 @@ class BLEProvider(val application: Application, val baseContext: Context)
val buffer = ByteBuffer.wrap(data) val buffer = ByteBuffer.wrap(data)
buffer.order(ByteOrder.LITTLE_ENDIAN) buffer.order(ByteOrder.LITTLE_ENDIAN)
//val flags = buffer.short //val flags = buffer.short
val sat_view: Byte = buffer.get().toUByte().toByte() //val sat_view: Byte = buffer.get().toUByte().toByte()
val sat_used: Byte = buffer.get().toUByte().toByte() //val sat_used: Byte = buffer.get().toUByte().toByte()
val ehpe: Float = buffer.int.toUInt().toFloat()/100.0f val ehpe: Float = buffer.int.toUInt().toFloat()/100.0f
val evpe: Float = buffer.int.toUInt().toFloat()/100.0f val evpe: Float = buffer.int.toUInt().toFloat()/100.0f
val hdop: Float = buffer.get().toUByte().toByte()*2/10.0f val hdop: Float = buffer.get().toUByte().toByte()*2/10.0f
val vdop: Float = buffer.get().toUByte().toByte()*2/10.0f val vdop: Float = buffer.get().toUByte().toByte()*2/10.0f
val elevation_gps: Double = buffer.int/100.0 val elevation_gps: Double = buffer.int/100.0
Log.v(LOG_TAG, "PQ $sat_view $sat_used $ehpe $evpe $hdop $vdop $elevation_gps") Log.v(LOG_TAG, "PQ $ehpe $evpe $hdop $vdop $elevation_gps")
LocalBroadcastManager.getInstance(baseContext).sendBroadcast( LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY).putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW, sat_view) Intent(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED, sat_used) //.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW, sat_view)
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED, sat_used)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEHPE, ehpe) .putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEHPE, ehpe)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE, evpe) .putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE, evpe)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP, hdop) .putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP, hdop)
@ -308,13 +334,14 @@ class BLEProvider(val application: Application, val baseContext: Context)
val buffer = ByteBuffer.wrap(data) val buffer = ByteBuffer.wrap(data)
buffer.order(ByteOrder.LITTLE_ENDIAN) buffer.order(ByteOrder.LITTLE_ENDIAN)
LocalBroadcastManager.getInstance(baseContext).sendBroadcast( LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERSAT).putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSALL, buffer.get()) Intent(ServicesConstants.BROADCAST_FILTER.FILTERSAT)
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSALL, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSUSED, buffer.get()) .putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSUSED, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASALL, buffer.get()) //.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASALL, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASUSED, buffer.get()) //.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASUSED, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSALL, buffer.get()) //.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSALL, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSUSED, buffer.get()) .putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSUSED, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOALL, buffer.get()) //.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOALL, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOUSED, buffer.get()) .putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOUSED, buffer.get())
) )
} }

View File

@ -1,16 +1,6 @@
package net.nigreon.blegps package net.nigreon.blegps
class GPSConfiguration { class GPSConfiguration {
var bmpNrf: Boolean = false
var bmpBT: Boolean = false
var bmp2gps: Boolean = false var bmp2gps: Boolean = false
var extTemp: Boolean = false
var gpsBLE: Boolean = false
var gpsVerbose: Boolean = false
var gpsSerial: Boolean = false
var gpsMode: Int = 0 var gpsMode: Int = 0
var gpsBoost: Boolean = false
var gpsPollerSend: Short = 0
var gpsSendBTSend: Short = 0
var bmpPollerSend: Short = 0
} }

View File

@ -35,17 +35,12 @@ class MainActivity : AppCompatActivity() {
private lateinit var mBoundService: BLEMockLocationService private lateinit var mBoundService: BLEMockLocationService
var mServiceBound = false var mServiceBound = false
private lateinit var mBoundServiceHR: BLEHRService
var mServiceBoundHR = false
var currentPressure: Int = -1 var currentPressure: Int = -1
var currentTemperature: Float = -1.0f var currentTemperature: Float = -1.0f
var BTConnected = false var BTConnected = false
var BTHRConnected = false
var lastLocation: Location = Location("LastLocation") var lastLocation: Location = Location("LastLocation")
private lateinit var gpxfilename: String var resumeActivityState: Boolean = true;
private var gpxopened = false
private lateinit var sharedPreferences: SharedPreferences private lateinit var sharedPreferences: SharedPreferences
@ -70,16 +65,6 @@ class MainActivity : AppCompatActivity() {
mServiceBound = false mServiceBound = false
} }
fun disconnectBTHR()
{
Intent(this, BLEHRService::class.java).also { intent ->
intent.action = ServicesConstants.HRSERVICEACTION.STOPFOREGROUND_ACTION
startService(intent)
}
unbindService(mServiceConnectionHR)
mServiceBoundHR = false
}
fun filter01changed(intent: Intent) fun filter01changed(intent: Intent)
{ {
Log.v(LOG_TAG, "Filter01 Broadcast received") Log.v(LOG_TAG, "Filter01 Broadcast received")
@ -104,46 +89,19 @@ class MainActivity : AppCompatActivity() {
val connected = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBTSTATUS,false) val connected = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBTSTATUS,false)
if(connected) { if(connected) {
BTConnected=true BTConnected=true
if(resumeActivityState == true) { sendGPSModeToBLEService(3) }
text01.text = "BT Connected" text01.text = "BT Connected"
buttonconnectbt.text = "Disconnect"
Log.v(LOG_TAG, "BT Connected Broadcast received") Log.v(LOG_TAG, "BT Connected Broadcast received")
mBoundService.HRStatusChanged(BTHRConnected)
sendConfToBLEService()
if(swlog2file.isChecked())
{
mBoundService.openGPX(gpxfilename)
gpxopened = true
}
} else { } else {
text01.text = "BT Disconnected" text01.text = "BT Disconnected"
buttonconnectbt.text = "Connect"
Log.v(LOG_TAG, "BT Disconnected Broadcast received") Log.v(LOG_TAG, "BT Disconnected Broadcast received")
BTConnected=false BTConnected=false
swblepower.setChecked(false)
} }
writeBMPText() writeBMPText()
} }
fun BTChangedHR(intent: Intent)
{
val connected = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBTSTATUSHR,false)
if(connected) {
BTHRConnected=true
text01.text = "BT HR Connected"
Log.v(LOG_TAG, "BT HR Connected Broadcast received")
if(BTConnected) { mBoundService.HRStatusChanged(true) }
} else {
text01.text = "BT HR Disconnected"
Log.v(LOG_TAG, "BT HR Disconnected Broadcast received")
BTHRConnected=false
if(BTConnected) { mBoundService.HRStatusChanged(false) }
}
writeBMPText()
}
fun BTChangedHRM(intent: Intent)
{
texthr.text = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYBTHRM,0).toString() + " bpm"
}
private fun convertLatLon(latitude: Double, longitude: Double): String { private fun convertLatLon(latitude: Double, longitude: Double): String {
val builder = StringBuilder() val builder = StringBuilder()
@ -204,11 +162,6 @@ class MainActivity : AppCompatActivity() {
textlocation.text = "${convertLatLon(currentLatitude, currentLongitude)} $currentElevation m \n $currentLatitude $currentLongitude $currentElevation m" textlocation.text = "${convertLatLon(currentLatitude, currentLongitude)} $currentElevation m \n $currentLatitude $currentLongitude $currentElevation m"
textspeedheading.text = "$currentSpeed km/h $currentHeading° ${currentLocation.distanceTo(lastLocation)} m" textspeedheading.text = "$currentSpeed km/h $currentHeading° ${currentLocation.distanceTo(lastLocation)} m"
lastLocation = currentLocation lastLocation = currentLocation
if(swblegpsverbose.isChecked == false) {
textquality.text = "$currentEHPE m"
textsatellites.text = "Satellites in verbose"
}
} }
fun writeQualityText(intent: Intent) fun writeQualityText(intent: Intent)
@ -217,23 +170,16 @@ class MainActivity : AppCompatActivity() {
val currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f) val currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f)
val currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-1.0f) val currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-1.0f)
val currentVDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYVDOP,-1.0f) val currentVDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYVDOP,-1.0f)
val sat_view = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW,-1)
val sat_used = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED,-1)
val elevation_gps = intent.getDoubleExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYELEGPS,-1.0) val elevation_gps = intent.getDoubleExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYELEGPS,-1.0)
textquality.text = "$currentEHPE m $currentEVPE m $currentHDOP $currentVDOP $sat_used/$sat_view $elevation_gps m" textquality.text = "$currentEHPE m $currentEVPE m $currentHDOP $currentVDOP $elevation_gps m"
} }
fun writeSatText(intent: Intent) fun writeSatText(intent: Intent)
{ {
val gpsall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSALL,-1)
val gpsused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSUSED,-1) val gpsused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSUSED,-1)
val sbasall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASALL,-1)
val sbasused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASUSED,-1)
val glonassall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSALL,-1)
val glonassused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSUSED,-1) val glonassused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSUSED,-1)
val galileoall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOALL,-1)
val galileoused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOUSED,-1) val galileoused = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOUSED,-1)
textsatellites.text = "GPS: $gpsused/$gpsall SBAS: $sbasused/$sbasall GLONASS: $glonassused/$glonassall GALILEO: $galileoused/$galileoall" textsatellites.text = "GPS: $gpsused GLONASS: $glonassused GALILEO: $galileoused"
} }
private fun sendCalibrateToBLEService() private fun sendCalibrateToBLEService()
{ {
@ -242,72 +188,14 @@ class MainActivity : AppCompatActivity() {
mBoundService.sendCalibrateBLE(calibrateval) mBoundService.sendCalibrateBLE(calibrateval)
} }
} }
private fun sendConfToBLEService()
private fun sendGPSModeToBLEService(gpsmode: Int)
{ {
if(BTConnected) { if(BTConnected) {
val bmppollersend: Float = resources.getStringArray(R.array.pollerval)[spinbmp.selectedItemPosition].toFloat() * 4 mBoundService.sendConfBLE(gpsmode)
var gpspollersend: Float
var gpssendbtsend: Float
var gpsmode: Int
/*if(swblegpsboost.isChecked)
{
gpspollersend = 4f
gpssendbtsend = 4f
gpsmode = 1
} else {*/
gpspollersend = resources.getStringArray(R.array.pollerval)[spingps.selectedItemPosition].toFloat() * 4
gpssendbtsend = resources.getStringArray(R.array.pollerval)[spingpssendbt.selectedItemPosition].toFloat() * 4
gpsmode = spingpsmode.selectedItemPosition
//}
var gpsConf: GPSConfiguration = GPSConfiguration()
gpsConf.bmpNrf = swbmpnrf.isChecked
gpsConf.bmpBT = swbmpbt.isChecked
gpsConf.bmp2gps = swbmp2gps.isChecked
gpsConf.extTemp = swexttemp.isChecked
gpsConf.gpsBLE = swgpsble.isChecked
gpsConf.gpsVerbose = swblegpsverbose.isChecked
//gpsConf.gpsBoost = swblegpsboost.isChecked
gpsConf.gpsSerial = swgpsserial.isChecked
gpsConf.gpsMode = gpsmode
gpsConf.gpsPollerSend = gpspollersend.toShort()
gpsConf.gpsSendBTSend = gpssendbtsend.toShort()
gpsConf.bmpPollerSend = bmppollersend.toShort()
mBoundService.sendConfBLE(gpsConf)
} }
} }
private fun sendStopConfToBLEService()
{
if(BTConnected) {
val gpspollersend: Float =
resources.getStringArray(R.array.pollerval)[spingps.selectedItemPosition].toFloat() * 4
val bmppollersend: Float =
resources.getStringArray(R.array.pollerval)[spinbmp.selectedItemPosition].toFloat() * 4
val gpssendbtsend: Float =
resources.getStringArray(R.array.pollerval)[spingpssendbt.selectedItemPosition].toFloat() * 4
var gpsConf: GPSConfiguration = GPSConfiguration()
gpsConf.bmpNrf = false
gpsConf.bmpBT = false
gpsConf.bmp2gps = false
gpsConf.extTemp = false
gpsConf.gpsBLE = false
gpsConf.gpsVerbose = false
gpsConf.gpsSerial = false
gpsConf.gpsMode = spingpsmode.selectedItemPosition
gpsConf.gpsPollerSend = gpspollersend.toShort()
gpsConf.gpsSendBTSend = gpssendbtsend.toShort()
gpsConf.bmpPollerSend = bmppollersend.toShort()
mBoundService.sendConfBLE(gpsConf)
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -326,8 +214,6 @@ class MainActivity : AppCompatActivity() {
when (intent?.action) { when (intent?.action) {
ServicesConstants.BROADCAST_FILTER.FILTER01 -> filter01changed(intent) ServicesConstants.BROADCAST_FILTER.FILTER01 -> filter01changed(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBT -> BTChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERBT -> BTChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBTHR -> BTChangedHR(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBTHRM -> BTChangedHRM(intent)
ServicesConstants.BROADCAST_FILTER.FILTERTEMP -> temperatureChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERTEMP -> temperatureChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERPRESSURE -> pressureChanged(intent) ServicesConstants.BROADCAST_FILTER.FILTERPRESSURE -> pressureChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERLOCATION -> writeLocationText(intent) ServicesConstants.BROADCAST_FILTER.FILTERLOCATION -> writeLocationText(intent)
@ -339,16 +225,14 @@ class MainActivity : AppCompatActivity() {
} }
} }
spinbmp.setSelection(11)
spingps.setSelection(3)
spingpsmode.setSelection(1)
spingpssendbt.setSelection(10)
lastLocation.latitude = 0.0 lastLocation.latitude = 0.0
lastLocation.longitude = 0.0 lastLocation.longitude = 0.0
sharedPreferences = baseContext.getSharedPreferences("blegps_config", MODE_PRIVATE) sharedPreferences = baseContext.getSharedPreferences("blegps_config", MODE_PRIVATE)
editbtaddr.setText(sharedPreferences.getString("macaddr", ""))
swbmp2gps.isChecked = sharedPreferences.getBoolean("swbmp2gps", false)
/*sharedPreferences /*sharedPreferences
.edit() .edit()
.putInt("inttest", 64) .putInt("inttest", 64)
@ -396,144 +280,34 @@ class MainActivity : AppCompatActivity() {
) )
}*/ }*/
swblepower.setOnCheckedChangeListener { _, isChecked -> buttonconnectbt.setOnClickListener {
if(isChecked) { if(BTConnected == false && editbtaddr.text.toString() != "") {
sharedPreferences
.edit()
.putString("macaddr", editbtaddr.text.toString())
.apply()
Intent(this, BLEMockLocationService::class.java).also { intent -> Intent(this, BLEMockLocationService::class.java).also { intent ->
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE) bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE)
intent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION intent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION
startService(intent) startService(intent)
} }
} else { } else {
sendStopConfToBLEService() delayFunction({ disconnectBT() }, 1500)
delayFunction({ disconnectBT() }, 1500)
} }
} }
swblehrpower.setOnCheckedChangeListener { _, isChecked ->
if(isChecked) {
Intent(this, BLEHRService::class.java).also { intent ->
bindService(intent, mServiceConnectionHR, Context.BIND_AUTO_CREATE)
intent.action = ServicesConstants.HRSERVICEACTION.STARTFOREGROUND_ACTION
startService(intent)
}
} else {
//sendStopConfToBLEService()
delayFunction({ disconnectBTHR() }, 1500)
}
}
swbmpnrf.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}
swbmpbt.setOnCheckedChangeListener { _, checked ->
if(checked) {
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBMP).putExtra(ServicesConstants.BROADCAST_KEY.KEYBMPSTATUS, true)
)
} else {
LocalBroadcastManager.getInstance(baseContext).sendBroadcast(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERBMP).putExtra(ServicesConstants.BROADCAST_KEY.KEYBMPSTATUS, false)
)
}
sendConfToBLEService()
}
swbmp2gps.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}
swexttemp.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}
swgpsble.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}
swblegpsverbose.setOnCheckedChangeListener { _, _ ->
sendConfToBLEService()
}
swgpsserial.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}
/*swblegpsboost.setOnCheckedChangeListener { _,_ ->
sendConfToBLEService()
}*/
swlog2file.setOnCheckedChangeListener { _, checked ->
if(checked) {
gpxfilename = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
if (BTConnected) {
mBoundService.openGPX(gpxfilename)
gpxopened = true
}
} else {
if(BTConnected) {
mBoundService.closeGPX()
} else if(gpxopened) {
var gpxhandle = File(
Environment.getExternalStorageDirectory().path + File.separator + "BTGPS",
gpxfilename + ".gpx"
)
var gpxoutputstream = FileOutputStream(gpxhandle, true)
try {
val gpxfooter = "</trkseg></trk></gpx>\n"
gpxoutputstream.write(gpxfooter.toByteArray())
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
gpxoutputstream.close()
}
gpxopened = false
}
//sendConfToBLEService()
}
spingpsmode.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
sendConfToBLEService()
}
}
spinbmp.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
sendConfToBLEService()
}
}
spingps.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
sendConfToBLEService()
}
}
spingpssendbt.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
sendConfToBLEService()
}
}
buttoncalibratebmp2gps.setOnClickListener { buttoncalibratebmp2gps.setOnClickListener {
//text01.text = editcalibratebmp2gps.text //text01.text = editcalibratebmp2gps.text
sendCalibrateToBLEService() sendCalibrateToBLEService()
} }
swbmp2gps.setOnClickListener {
sharedPreferences
.edit()
.putBoolean("swbmp2gps", swbmp2gps.isChecked)
.apply()
}
/*startmock.setOnClickListener { /*startmock.setOnClickListener {
//val startIntent = Intent(this,BLEMockLocationService::class.java) //val startIntent = Intent(this,BLEMockLocationService::class.java)
//startIntent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION //startIntent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION
@ -566,8 +340,6 @@ class MainActivity : AppCompatActivity() {
val manager = LocalBroadcastManager.getInstance(this) val manager = LocalBroadcastManager.getInstance(this)
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTER01)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTER01))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBT)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBT))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBTHR))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERBTHRM))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERTEMP)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERTEMP))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERPRESSURE)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERPRESSURE))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION)) manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION))
@ -580,9 +352,14 @@ class MainActivity : AppCompatActivity() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
if(!swlog2file.isChecked) { resumeActivityState = false
swblegpsverbose.setChecked(false) sendGPSModeToBLEService(2)
} }
override fun onResume() {
super.onResume()
resumeActivityState = true
sendGPSModeToBLEService(3)
} }
private val mServiceConnection = object : ServiceConnection { private val mServiceConnection = object : ServiceConnection {
@ -598,17 +375,4 @@ class MainActivity : AppCompatActivity() {
} }
} }
private val mServiceConnectionHR = object : ServiceConnection {
override fun onServiceDisconnected(name: ComponentName) {
mServiceBoundHR = false
}
override fun onServiceConnected(name: ComponentName, service: IBinder) {
val binderHR = service as BLEHRService.sBinder
mBoundServiceHR = binderHR.getService()
mServiceBoundHR = true
}
}
} }

View File

@ -4,19 +4,37 @@ import android.content.Context
import android.location.Location import android.location.Location
import android.location.LocationManager import android.location.LocationManager
import android.os.SystemClock import android.os.SystemClock
import android.util.Log
class MockLocationProvider(val providerName: String, val ctx: Context) { class MockLocationProvider(val providerName: String, val ctx: Context) {
private val LOG_TAG = "MockLocationProvider"
private val lm = ctx.getSystemService( private val lm = ctx.getSystemService(
Context.LOCATION_SERVICE Context.LOCATION_SERVICE
) as LocationManager ) as LocationManager
fun start() { fun start() {
try {
lm.addTestProvider( lm.removeTestProvider(providerName)
providerName, false, false, false, false, true, } catch(exception: Exception) {
true, true, 0, 5 Log.w(LOG_TAG,"No TestProvider to remove")
) }
/* if(providerName in lm.getAllProviders()) {
lm.removeTestProvider(providerName)
}*/
//try {
lm.addTestProvider(
providerName, false, false, false, false, true,
true, true, 0, 5
)
/*} catch() {
lm.removeTestProvider(providerName)
lm.addTestProvider(
providerName, false, false, false, false, true,
true, true, 0, 5
)
}*/
lm.setTestProviderEnabled(providerName, true) lm.setTestProviderEnabled(providerName, true)
} }

View File

@ -27,8 +27,6 @@ class ServicesConstants {
const val FILTER01 = "just.a.filter" const val FILTER01 = "just.a.filter"
const val FILTERBT = "filter.bt" const val FILTERBT = "filter.bt"
const val FILTERBMP = "filter.bmp" const val FILTERBMP = "filter.bmp"
const val FILTERBTHR = "filter.bthr"
const val FILTERBTHRM = "filter.bthrm"
const val FILTERTEMP = "filter.temp" const val FILTERTEMP = "filter.temp"
const val FILTERPRESSURE = "filter.pressure" const val FILTERPRESSURE = "filter.pressure"
const val FILTERLOCATION = "filter.location" const val FILTERLOCATION = "filter.location"
@ -41,8 +39,6 @@ class ServicesConstants {
companion object { companion object {
const val KEY01 = "key01" const val KEY01 = "key01"
const val KEYBTSTATUS = "btstatus" const val KEYBTSTATUS = "btstatus"
const val KEYBTSTATUSHR = "btstatushr"
const val KEYBTHRM = "bthrm"
const val KEYBMPSTATUS = "bmpstatus" const val KEYBMPSTATUS = "bmpstatus"
const val KEYTEMP = "temperature" const val KEYTEMP = "temperature"
const val KEYPRESSURE = "pressure" const val KEYPRESSURE = "pressure"
@ -60,13 +56,8 @@ class ServicesConstants {
const val KEYQUALITYHDOP = "hdop" const val KEYQUALITYHDOP = "hdop"
const val KEYQUALITYVDOP = "vdop" const val KEYQUALITYVDOP = "vdop"
const val KEYQUALITYELEGPS = "elevation_gps" const val KEYQUALITYELEGPS = "elevation_gps"
const val KEYSATGPSALL = "gpsall"
const val KEYSATGPSUSED = "gpsused" const val KEYSATGPSUSED = "gpsused"
const val KEYSATSBASALL = "sbasall"
const val KEYSATSBASUSED = "sbasused"
const val KEYSATGLONASSALL = "glonassall"
const val KEYSATGLONASSUSED = "glonassused" const val KEYSATGLONASSUSED = "glonassused"
const val KEYSATGALILEOALL = "galileoall"
const val KEYSATGALILEOUSED = "galileoused" const val KEYSATGALILEOUSED = "galileoused"
} }
} }

View File

@ -10,14 +10,19 @@ import android.util.Log
class TaskerReceiver: BroadcastReceiver() { class TaskerReceiver: BroadcastReceiver() {
private val LOG_TAG = "TaskerReceiver" private val LOG_TAG = "TaskerReceiver"
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
Log.v(LOG_TAG, "Receive") val screen = intent.extras.getBoolean("screen")
Log.v(LOG_TAG, "Receive Tasker $screen")
val serviceIntent = Intent(context, BLEMockLocationService::class.java) val serviceIntent = Intent(context, BLEMockLocationService::class.java)
serviceIntent.action=ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION serviceIntent.action=ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION
//serviceIntent.putExtras(Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, false)) serviceIntent.putExtras(Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, screen))
serviceIntent.putExtras(intent) //serviceIntent.putExtras(intent)
//LocalBroadcastManager.getInstance(context).sendBroadcast( //LocalBroadcastManager.getInstance(context).sendBroadcast(
// Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, true)) // Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, screen))
ContextCompat.startForegroundService(context, serviceIntent) ContextCompat.startForegroundService(context, serviceIntent)
} }
} }

View File

@ -11,85 +11,40 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
tools:context=".MainActivity"> tools:context=".MainActivity">
<LinearLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
tools:context=".MainActivity"> tools:context=".MainActivity"
<Switch android:focusableInTouchMode="true">
android:text="BLE GPS Power" <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swblepower">
</Switch>
<Switch
android:text="BLE HR Power"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swblehrpower"/>
<!--<Button
android:text="Start Mock"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:text="BT Address"
android:layout_margin="0dp"
android:padding="10dp" android:padding="10dp"
android:id="@+id/startmock"/> android:layout_gravity="center_horizontal"
<Button android:id="@+id/textbtaddr"/>
android:text="Stop Mock"
android:layout_width="wrap_content" <EditText
android:id="@+id/editbtaddr"
android:layout_width="200dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:layout_gravity="center_horizontal"
android:layout_margin="0dp"
android:padding="10dp" android:padding="10dp"
android:id="@+id/stopmock"/>--> android:maxLength="17"
</LinearLayout> android:inputType="textCapCharacters" />
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<Switch
android:text="BMP nRF"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swbmpnrf"/>
<Switch
android:text="BMP BT"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swbmpbt"/>
<Switch
android:text="Ext Temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swexttemp"/>
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<Switch
android:text="GPS BLE"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swgpsble"/>
<Switch
android:text="GPS Serial"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swgpsserial"/>
<Switch
android:text="BMP2GPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swbmp2gps"/>
</LinearLayout> </LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connect"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/buttonconnectbt"/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -130,31 +85,6 @@
android:padding="10dp" android:padding="10dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:id="@+id/textspeedheading"/> android:id="@+id/textspeedheading"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HR"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/texthr"/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<Switch
android:text="BLE GPS Verbose"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swblegpsverbose"/>
<Switch
android:text="Log2File"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swlog2file"/>
</LinearLayout>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -171,21 +101,6 @@
android:padding="10dp" android:padding="10dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:id="@+id/textsatellites"/> android:id="@+id/textsatellites"/>
<!-- <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Read"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/textread"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:padding="10dp"
android:hint="Value Hint"
android:id="@+id/edit01"/>
<LinearLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -194,113 +109,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
tools:context=".MainActivity"> tools:context=".MainActivity">
<Button <Switch
android:text="Read" android:text="BMP2GPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="10dp"
android:id="@+id/buttonread"/>
<Button
android:text="Write"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="10dp"
android:id="@+id/buttonwrite"/>
<Button
android:text="Get Counter"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content" android:id="@+id/swbmp2gps"/>
android:layout_margin="10dp"
android:padding="10dp"
android:id="@+id/bCounter"/>
</LinearLayout>-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BMP Poller"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/textspinbmp"/>
<Spinner
android:id="@+id/spinbmp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/poller" />
</LinearLayout> </LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS Mode"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/textspingpsmode"/>
<Spinner
android:id="@+id/spingpsmode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/gpsmode"/>
<!--<Switch
android:text="BLE GPS Boost"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/swblegpsboost"/>-->
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS Poller"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/textspingps"/>
<Spinner
android:id="@+id/spingps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/poller"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS BT"
android:layout_margin="0dp"
android:padding="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/textspingpssendbt"/>
<Spinner
android:id="@+id/spingpssendbt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/poller"/>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -19,6 +19,7 @@ allprojects {
repositories { repositories {
google() google()
jcenter() jcenter()
maven { url 'https://jitpack.io' }
} }
} }