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 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.github.Jasonchenlijian:FastBle:2.4.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.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:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<activity android:name=".MainActivity"
android:launchMode="singleTask"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -24,7 +26,6 @@
</intent-filter>
</activity>
<service android:name=".BLEMockLocationService" ></service>
<service android:name=".BLEHRService" ></service>
<receiver android:name=".TaskerReceiver">
<intent-filter>
<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.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.*
import android.location.LocationManager
import android.os.*
import android.support.v4.app.NotificationCompat
import android.support.v4.content.LocalBroadcastManager
import android.support.v7.app.AppCompatActivity
import android.util.Log
import java.io.File
import java.io.FileNotFoundException
@ -31,12 +30,11 @@ class BLEMockLocationService : Service() {
private lateinit var mockGPS: MockLocationProvider
private var locationReceived = false
private var qualityReceived = false
private var gpsverbose = false
private var gpxopened = false
private var hrenable = false
private var tempenable = false
private lateinit var gpxoutputstream: FileOutputStream
private lateinit var sharedPreferences: SharedPreferences
var gpsConf: GPSConfiguration = GPSConfiguration()
// Location
@ -50,11 +48,8 @@ class BLEMockLocationService : Service() {
private var currentEVPE: Float = -1.0f
private var currentHDOP: 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 currentHR: Byte = 0
private var currentTemperature: Float = 0.0f
private val binder = sBinder()
@ -70,7 +65,6 @@ class BLEMockLocationService : Service() {
currentHeading = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYLOCATIONHEADING,-1.0f)
mockGPS.pushLocation(currentLatitude,currentLongitude,currentElevation, currentSpeed, currentHeading, currentEHPE)
locationReceived = true
storeGPX()
}
fun qualityChanged(intent: Intent)
@ -80,16 +74,8 @@ class BLEMockLocationService : Service() {
currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f)
currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-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)
qualityReceived = true
storeGPX()
}
fun HRChanged(intent: Intent)
{
currentHR = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYBTHRM,-1)
}
fun bmpStatusChanged(intent: Intent)
@ -105,71 +91,25 @@ class BLEMockLocationService : Service() {
fun taskerChanged(bundle: Bundle) {
Log.v(LOG_TAG, "taskerChanged")
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 = true
sendConfBLE(2)
} else {
gpsConf.gpsBoost = false
}*/
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
sendConfBLE(1)
}
}
}
//gpsConf.gpsBoost = bundle.getBoolean(ServicesConstants.BROADCAST_KEY.KEYBOOST)
fun writeGPX(str: String)
{
try {
gpxoutputstream.write(str.toByteArray())
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
//Log.v(LOG_TAG, "Received Tasker Intent : Boost ${gpsConf.gpsBoost}")
}
}
override fun onCreate() {
super.onCreate()
sharedPreferences = baseContext.getSharedPreferences("blegps_config",
AppCompatActivity.MODE_PRIVATE
)
mockGPS = MockLocationProvider(LocationManager.GPS_PROVIDER, baseContext)
val brReceiver = object : BroadcastReceiver() {
@ -177,7 +117,6 @@ class BLEMockLocationService : Service() {
when (intent?.action) {
ServicesConstants.BROADCAST_FILTER.FILTERLOCATION -> locationChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERQUALITY-> qualityChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBTHRM-> HRChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERTEMP-> tempChanged(intent)
ServicesConstants.BROADCAST_FILTER.FILTERBMP-> bmpStatusChanged(intent)
@ -190,7 +129,6 @@ class BLEMockLocationService : Service() {
val manager = LocalBroadcastManager.getInstance(this)
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION))
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.FILTERBMP))
//pBLE.registerBMP()
@ -200,11 +138,10 @@ class BLEMockLocationService : Service() {
if(intent.action == ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION) {
Log.i(LOG_TAG, "Received Start Foreground Intent ")
// val intentNotif = Intent(this, MainActivity::class.java)
// intentNotif.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
// intentNotif.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACT
//val pendingIntent = PendingIntent.getActivity(this, 0, intentNotif, 0)
val startIntent = Intent(this, MainActivity::class.java)
startIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
val contentIntent = PendingIntent.getActivity(this, 0, startIntent,
PendingIntent.FLAG_UPDATE_CURRENT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -225,7 +162,8 @@ class BLEMockLocationService : Service() {
.setContentTitle("BLE GPS")
.setContentText("BLE & Mock active")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
//.setContentIntent(pendingIntent)
.setContentIntent(contentIntent)
.setAutoCancel(false)
.build()
pBLE = BLEProvider(application, baseContext)
@ -239,7 +177,9 @@ class BLEMockLocationService : Service() {
stopSelf()
} else if(intent.action == ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION){
Log.i(LOG_TAG, "intent action : ${intent.action}")
taskerChanged(intent.extras)
if(this::pBLE.isInitialized) {
taskerChanged(intent.extras)
}
}
return START_STICKY
}
@ -271,103 +211,25 @@ class BLEMockLocationService : Service() {
pBLE.sendCalibrate(buffer.array())
}
fun HRStatusChanged(enable: Boolean)
{
hrenable = enable
}
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)
//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) {
val buffer = ByteBuffer.allocate(2)
buffer.order(ByteOrder.LITTLE_ENDIAN)
var activateByte1: Byte = 0
var activateByte2: Byte = 0
if(gpsConf.bmpNrf) { activateByte1 = activateByte1.or(0x01) }
if(gpsConf.bmpBT) { activateByte1 = activateByte1.or(0x02) }
if(gpsConf.bmp2gps) { activateByte1 = activateByte1.or(0x04) }
if(gpsConf.extTemp) { activateByte1 = activateByte1.or(0x08) }
if(gpsConf.gpsBLE) { activateByte2 = activateByte2.or(0x01) }
if(gpsConf.gpsVerbose) { activateByte2 = activateByte2.or(0x02) }
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)
if(sharedPreferences.getBoolean("swbmp2gps", false)) { activateByte1 = activateByte1.or(0x01) }
if(mode == 1) {
activateByte2 = activateByte2.or(0x01)
} else if(mode == 2) {
activateByte2 = activateByte2.or(0x02)
} else if(mode == 3) {
activateByte2 = activateByte2.or(0x04)
}
buffer.put(activateByte1)
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())
}

View File

@ -3,19 +3,19 @@ import android.app.Application
import android.bluetooth.BluetoothGatt
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.support.v4.content.LocalBroadcastManager
import android.util.Log
import com.clj.fastble.BleManager
import com.clj.fastble.data.BleDevice
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.ByteOrder
import android.os.CountDownTimer
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)
@ -36,13 +36,17 @@ class BLEProvider(val application: Application, val baseContext: Context)
private var connected = false
private var reconnectcount = 0
private val LOG_TAG = "BLEProvider"
//private lateinit var baseContext: Context
private lateinit var sharedPreferences: SharedPreferences
init
{
sharedPreferences = baseContext.getSharedPreferences("blegps_config",
AppCompatActivity.MODE_PRIVATE
)
BleManager.getInstance().enableBluetooth()
connectBLE()
}
@ -50,7 +54,27 @@ class BLEProvider(val application: Application, val baseContext: Context)
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()
@ -59,7 +83,8 @@ class BLEProvider(val application: Application, val baseContext: Context)
//BleManager.getInstance().operateTimeout = 5000
//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() {
}
@ -266,17 +291,18 @@ class BLEProvider(val application: Application, val baseContext: Context)
val buffer = ByteBuffer.wrap(data)
buffer.order(ByteOrder.LITTLE_ENDIAN)
//val flags = buffer.short
val sat_view: Byte = buffer.get().toUByte().toByte()
val sat_used: Byte = buffer.get().toUByte().toByte()
//val sat_view: Byte = buffer.get().toUByte().toByte()
//val sat_used: Byte = buffer.get().toUByte().toByte()
val ehpe: 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 vdop: Float = buffer.get().toUByte().toByte()*2/10.0f
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(
Intent(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY).putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW, sat_view)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED, sat_used)
Intent(ServicesConstants.BROADCAST_FILTER.FILTERQUALITY)
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATVIEW, sat_view)
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYSATUSED, sat_used)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEHPE, ehpe)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE, evpe)
.putExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP, hdop)
@ -308,13 +334,14 @@ class BLEProvider(val application: Application, val baseContext: Context)
val buffer = ByteBuffer.wrap(data)
buffer.order(ByteOrder.LITTLE_ENDIAN)
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.KEYSATSBASALL, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASUSED, buffer.get())
.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSALL, buffer.get())
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASALL, buffer.get())
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATSBASUSED, buffer.get())
//.putExtra(ServicesConstants.BROADCAST_KEY.KEYSATGLONASSALL, 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())
)
}

View File

@ -1,16 +1,6 @@
package net.nigreon.blegps
class GPSConfiguration {
var bmpNrf: Boolean = false
var bmpBT: 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 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
var mServiceBound = false
private lateinit var mBoundServiceHR: BLEHRService
var mServiceBoundHR = false
var currentPressure: Int = -1
var currentTemperature: Float = -1.0f
var BTConnected = false
var BTHRConnected = false
var lastLocation: Location = Location("LastLocation")
private lateinit var gpxfilename: String
private var gpxopened = false
var resumeActivityState: Boolean = true;
private lateinit var sharedPreferences: SharedPreferences
@ -70,16 +65,6 @@ class MainActivity : AppCompatActivity() {
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)
{
Log.v(LOG_TAG, "Filter01 Broadcast received")
@ -104,46 +89,19 @@ class MainActivity : AppCompatActivity() {
val connected = intent.getBooleanExtra(ServicesConstants.BROADCAST_KEY.KEYBTSTATUS,false)
if(connected) {
BTConnected=true
if(resumeActivityState == true) { sendGPSModeToBLEService(3) }
text01.text = "BT Connected"
buttonconnectbt.text = "Disconnect"
Log.v(LOG_TAG, "BT Connected Broadcast received")
mBoundService.HRStatusChanged(BTHRConnected)
sendConfToBLEService()
if(swlog2file.isChecked())
{
mBoundService.openGPX(gpxfilename)
gpxopened = true
}
} else {
text01.text = "BT Disconnected"
buttonconnectbt.text = "Connect"
Log.v(LOG_TAG, "BT Disconnected Broadcast received")
BTConnected=false
swblepower.setChecked(false)
}
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 {
val builder = StringBuilder()
@ -204,11 +162,6 @@ class MainActivity : AppCompatActivity() {
textlocation.text = "${convertLatLon(currentLatitude, currentLongitude)} $currentElevation m \n $currentLatitude $currentLongitude $currentElevation m"
textspeedheading.text = "$currentSpeed km/h $currentHeading° ${currentLocation.distanceTo(lastLocation)} m"
lastLocation = currentLocation
if(swblegpsverbose.isChecked == false) {
textquality.text = "$currentEHPE m"
textsatellites.text = "Satellites in verbose"
}
}
fun writeQualityText(intent: Intent)
@ -217,23 +170,16 @@ class MainActivity : AppCompatActivity() {
val currentEVPE = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYEVPE,-1.0f)
val currentHDOP = intent.getFloatExtra(ServicesConstants.BROADCAST_KEY.KEYQUALITYHDOP,-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)
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)
{
val gpsall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGPSALL,-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 galileoall = intent.getByteExtra(ServicesConstants.BROADCAST_KEY.KEYSATGALILEOALL,-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()
{
@ -242,72 +188,14 @@ class MainActivity : AppCompatActivity() {
mBoundService.sendCalibrateBLE(calibrateval)
}
}
private fun sendConfToBLEService()
private fun sendGPSModeToBLEService(gpsmode: Int)
{
if(BTConnected) {
val bmppollersend: Float = resources.getStringArray(R.array.pollerval)[spinbmp.selectedItemPosition].toFloat() * 4
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)
mBoundService.sendConfBLE(gpsmode)
}
}
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?) {
super.onCreate(savedInstanceState)
@ -326,8 +214,6 @@ class MainActivity : AppCompatActivity() {
when (intent?.action) {
ServicesConstants.BROADCAST_FILTER.FILTER01 -> filter01changed(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.FILTERPRESSURE -> pressureChanged(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.longitude = 0.0
sharedPreferences = baseContext.getSharedPreferences("blegps_config", MODE_PRIVATE)
editbtaddr.setText(sharedPreferences.getString("macaddr", ""))
swbmp2gps.isChecked = sharedPreferences.getBoolean("swbmp2gps", false)
/*sharedPreferences
.edit()
.putInt("inttest", 64)
@ -396,144 +280,34 @@ class MainActivity : AppCompatActivity() {
)
}*/
swblepower.setOnCheckedChangeListener { _, isChecked ->
if(isChecked) {
buttonconnectbt.setOnClickListener {
if(BTConnected == false && editbtaddr.text.toString() != "") {
sharedPreferences
.edit()
.putString("macaddr", editbtaddr.text.toString())
.apply()
Intent(this, BLEMockLocationService::class.java).also { intent ->
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE)
intent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION
startService(intent)
}
} 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 {
//text01.text = editcalibratebmp2gps.text
sendCalibrateToBLEService()
}
swbmp2gps.setOnClickListener {
sharedPreferences
.edit()
.putBoolean("swbmp2gps", swbmp2gps.isChecked)
.apply()
}
/*startmock.setOnClickListener {
//val startIntent = Intent(this,BLEMockLocationService::class.java)
//startIntent.action = ServicesConstants.MOCKSERVICEACTION.STARTFOREGROUND_ACTION
@ -566,8 +340,6 @@ class MainActivity : AppCompatActivity() {
val manager = LocalBroadcastManager.getInstance(this)
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTER01))
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.FILTERPRESSURE))
manager.registerReceiver(brReceiver, IntentFilter(ServicesConstants.BROADCAST_FILTER.FILTERLOCATION))
@ -580,9 +352,14 @@ class MainActivity : AppCompatActivity() {
override fun onPause() {
super.onPause()
if(!swlog2file.isChecked) {
swblegpsverbose.setChecked(false)
}
resumeActivityState = false
sendGPSModeToBLEService(2)
}
override fun onResume() {
super.onResume()
resumeActivityState = true
sendGPSModeToBLEService(3)
}
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.LocationManager
import android.os.SystemClock
import android.util.Log
class MockLocationProvider(val providerName: String, val ctx: Context) {
private val LOG_TAG = "MockLocationProvider"
private val lm = ctx.getSystemService(
Context.LOCATION_SERVICE
) as LocationManager
fun start() {
lm.addTestProvider(
providerName, false, false, false, false, true,
true, true, 0, 5
)
try {
lm.removeTestProvider(providerName)
} catch(exception: Exception) {
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)
}

View File

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

View File

@ -10,14 +10,19 @@ import android.util.Log
class TaskerReceiver: BroadcastReceiver() {
private val LOG_TAG = "TaskerReceiver"
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)
serviceIntent.action=ServicesConstants.MOCKSERVICEACTION.TASKER_ACTION
//serviceIntent.putExtras(Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, false))
serviceIntent.putExtras(intent)
serviceIntent.putExtras(Intent(ServicesConstants.BROADCAST_FILTER.FILTERTASKER).putExtra(ServicesConstants.BROADCAST_KEY.KEYBOOST, screen))
//serviceIntent.putExtras(intent)
//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)
}
}

View File

@ -11,85 +11,40 @@
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<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"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<Switch
android:text="BLE GPS Power"
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"
tools:context=".MainActivity"
android:focusableInTouchMode="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="BT Address"
android:layout_margin="0dp"
android:padding="10dp"
android:id="@+id/startmock"/>
<Button
android:text="Stop Mock"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/textbtaddr"/>
<EditText
android:id="@+id/editbtaddr"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_gravity="center_horizontal"
android:layout_margin="0dp"
android:padding="10dp"
android:id="@+id/stopmock"/>-->
</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="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"/>
android:maxLength="17"
android:inputType="textCapCharacters" />
</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
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -130,31 +85,6 @@
android:padding="10dp"
android:layout_gravity="center_horizontal"
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
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -171,21 +101,6 @@
android:padding="10dp"
android:layout_gravity="center_horizontal"
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
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
@ -194,113 +109,11 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:context=".MainActivity">
<Button
android:text="Read"
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"
<Switch
android:text="BMP2GPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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" />
android:layout_height="wrap_content" android:id="@+id/swbmp2gps"/>
</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
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -5,7 +5,7 @@ buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
@ -19,6 +19,7 @@ allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}