kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
first test
rodzic
6fd57c8722
commit
1c942a10b3
2
TODO.md
2
TODO.md
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
# Medium priority
|
# Medium priority
|
||||||
|
|
||||||
|
* require user auth to pair with the device (i.e. press button on device to allow a new phone to pair with it).
|
||||||
|
Don't leave device discoverable. Don't let unpaired users do thing with device
|
||||||
* add crash reporting
|
* add crash reporting
|
||||||
* remove example code boilerplate from the service
|
* remove example code boilerplate from the service
|
||||||
* add analytics (make them optional)
|
* add analytics (make them optional)
|
||||||
|
|
|
@ -42,6 +42,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
|
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
|
||||||
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
|
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SoftwareUpdateService.enqueueWork(this, SoftwareUpdateService.scanDevicesIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.app.JobIntentService
|
import androidx.core.app.JobIntentService
|
||||||
|
import java.io.InputStream
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,13 +37,17 @@ class SoftwareUpdateService : JobIntentService() {
|
||||||
lateinit var updateGatt: BluetoothGatt // the gatt api used to talk to our device
|
lateinit var updateGatt: BluetoothGatt // the gatt api used to talk to our device
|
||||||
lateinit var updateService: BluetoothGattService // The service we are currently talking to to do the update
|
lateinit var updateService: BluetoothGattService // The service we are currently talking to to do the update
|
||||||
lateinit var totalSizeDesc: BluetoothGattCharacteristic
|
lateinit var totalSizeDesc: BluetoothGattCharacteristic
|
||||||
|
lateinit var dataDesc: BluetoothGattCharacteristic
|
||||||
|
lateinit var firmwareStream: InputStream
|
||||||
|
|
||||||
fun startUpdate() {
|
fun startUpdate() {
|
||||||
if (updateService != null) {
|
if (updateService != null) {
|
||||||
totalSizeDesc = updateService.getCharacteristic(SW_UPDATE_TOTALSIZE_CHARACTER)!!
|
totalSizeDesc = updateService.getCharacteristic(SW_UPDATE_TOTALSIZE_CHARACTER)!!
|
||||||
|
|
||||||
|
firmwareStream = assets.open("firmware.bin")!!
|
||||||
|
|
||||||
// Start the update by writing the # of bytes in the image
|
// Start the update by writing the # of bytes in the image
|
||||||
val numBytes = 45
|
val numBytes = firmwareStream.available()
|
||||||
assert(totalSizeDesc.setValue(numBytes, BluetoothGattCharacteristic.FORMAT_UINT32, 0))
|
assert(totalSizeDesc.setValue(numBytes, BluetoothGattCharacteristic.FORMAT_UINT32, 0))
|
||||||
assert(updateGatt.writeCharacteristic(totalSizeDesc))
|
assert(updateGatt.writeCharacteristic(totalSizeDesc))
|
||||||
assert(updateGatt.readCharacteristic(totalSizeDesc))
|
assert(updateGatt.readCharacteristic(totalSizeDesc))
|
||||||
|
@ -51,7 +56,24 @@ class SoftwareUpdateService : JobIntentService() {
|
||||||
|
|
||||||
// Send the next block of our file to the device
|
// Send the next block of our file to the device
|
||||||
fun sendNextBlock() {
|
fun sendNextBlock() {
|
||||||
|
if(firmwareStream.available() > 0) {
|
||||||
|
var blockSize = 512
|
||||||
|
|
||||||
|
if (blockSize > firmwareStream.available())
|
||||||
|
blockSize = firmwareStream.available()
|
||||||
|
val buffer = ByteArray(blockSize)
|
||||||
|
|
||||||
|
// slightly expensive to keep reallocing this buffer, but whatever
|
||||||
|
assert(firmwareStream.read(buffer) == blockSize)
|
||||||
|
|
||||||
|
dataDesc = updateService.getCharacteristic(SW_UPDATE_DATA_CHARACTER)!!
|
||||||
|
// updateGatt.beginReliableWrite()
|
||||||
|
dataDesc.value = buffer
|
||||||
|
assert(updateGatt.writeCharacteristic(dataDesc))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert(false) // fixme
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each device that appears in our scan, ask for its GATT, when the gatt arrives,
|
// For each device that appears in our scan, ask for its GATT, when the gatt arrives,
|
||||||
|
@ -75,16 +97,11 @@ class SoftwareUpdateService : JobIntentService() {
|
||||||
//intentAction = ACTION_GATT_CONNECTED
|
//intentAction = ACTION_GATT_CONNECTED
|
||||||
//connectionState = STATE_CONNECTED
|
//connectionState = STATE_CONNECTED
|
||||||
// broadcastUpdate(intentAction)
|
// broadcastUpdate(intentAction)
|
||||||
Log.i(AppCompatActivity.TAG, "Connected to GATT server.")
|
|
||||||
Log.i(
|
|
||||||
AppCompatActivity.TAG, "Attempting to start service discovery: "
|
|
||||||
)
|
|
||||||
assert(bluetoothGatt.discoverServices())
|
assert(bluetoothGatt.discoverServices())
|
||||||
}
|
}
|
||||||
BluetoothProfile.STATE_DISCONNECTED -> {
|
BluetoothProfile.STATE_DISCONNECTED -> {
|
||||||
//intentAction = ACTION_GATT_DISCONNECTED
|
//intentAction = ACTION_GATT_DISCONNECTED
|
||||||
//connectionState = STATE_DISCONNECTED
|
//connectionState = STATE_DISCONNECTED
|
||||||
Log.i(AppCompatActivity.TAG, "Disconnected from GATT server.")
|
|
||||||
// broadcastUpdate(intentAction)
|
// broadcastUpdate(intentAction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,6 +144,18 @@ class SoftwareUpdateService : JobIntentService() {
|
||||||
|
|
||||||
// broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic)
|
// broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCharacteristicWrite(
|
||||||
|
gatt: BluetoothGatt?,
|
||||||
|
characteristic: BluetoothGattCharacteristic?,
|
||||||
|
status: Int
|
||||||
|
) {
|
||||||
|
assert(status == BluetoothGatt.GATT_SUCCESS)
|
||||||
|
|
||||||
|
if (characteristic == dataDesc) {
|
||||||
|
enqueueWork(this@SoftwareUpdateService, sendNextBlockIntent)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bluetoothGatt = device.connectGatt(this, false, gattCallback)!!
|
bluetoothGatt = device.connectGatt(this, false, gattCallback)!!
|
||||||
}
|
}
|
||||||
|
@ -158,6 +187,13 @@ class SoftwareUpdateService : JobIntentService() {
|
||||||
}
|
}
|
||||||
toast("Executing: $label")
|
toast("Executing: $label")
|
||||||
|
|
||||||
|
when(intent.action) {
|
||||||
|
scanDevicesIntent.action -> scanLeDevice(true)
|
||||||
|
startUpdateIntent.action -> startUpdate()
|
||||||
|
sendNextBlockIntent.action -> sendNextBlock()
|
||||||
|
else -> assert(false)
|
||||||
|
}
|
||||||
|
|
||||||
Log.i(
|
Log.i(
|
||||||
"SimpleJobIntentService",
|
"SimpleJobIntentService",
|
||||||
"Completed service @ " + SystemClock.elapsedRealtime()
|
"Completed service @ " + SystemClock.elapsedRealtime()
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<resources>
|
||||||
|
<string name="min_firmware_version">0.1.01</string>
|
||||||
|
</resources>
|
Ładowanie…
Reference in New Issue