sforkowany z mirror/meshtastic-android
				
			change to use @mik3y /usb-serial-for-android (WIP)
							rodzic
							
								
									712e034228
								
							
						
					
					
						commit
						d1a3d98de4
					
				|  | @ -21,5 +21,10 @@ | |||
|       <option name="name" value="Google" /> | ||||
|       <option name="url" value="https://dl.google.com/dl/android/maven2/" /> | ||||
|     </remote-repository> | ||||
|     <remote-repository> | ||||
|       <option name="id" value="maven" /> | ||||
|       <option name="name" value="maven" /> | ||||
|       <option name="url" value="https://jitpack.io" /> | ||||
|     </remote-repository> | ||||
|   </component> | ||||
| </project> | ||||
|  | @ -121,7 +121,8 @@ dependencies { | |||
|     implementation 'com.google.protobuf:protobuf-javalite:3.12.2' | ||||
| 
 | ||||
|     // For UART access | ||||
|     implementation 'com.google.android.things:androidthings:1.0' | ||||
|     // implementation 'com.google.android.things:androidthings:1.0' | ||||
|     implementation 'com.github.mik3y:usb-serial-for-android:v2.2.2' | ||||
| 
 | ||||
|     // mapbox | ||||
|     implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:9.1.0' | ||||
|  | @ -136,7 +137,7 @@ dependencies { | |||
|     implementation 'com.google.android.gms:play-services-auth:18.0.0' | ||||
| 
 | ||||
|     // Add the Firebase SDK for Crashlytics. | ||||
|     implementation 'com.google.firebase:firebase-crashlytics:17.0.0' | ||||
|     implementation 'com.google.firebase:firebase-crashlytics:17.0.1' | ||||
| 
 | ||||
|     // alas implementation bug deep in the bowels when I tried it for my SyncBluetoothDevice class | ||||
|     // implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3" | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ | |||
|     <uses-permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND" /> | ||||
| 
 | ||||
|     <!-- Uart access --> | ||||
|     <uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" /> | ||||
| 
 | ||||
| 
 | ||||
|     <!-- the xing library will try to bring this permission in but we don't want it --> | ||||
|     <uses-permission | ||||
|  | @ -69,8 +69,6 @@ | |||
|         android:hardwareAccelerated="true" | ||||
|         android:theme="@style/AppTheme"> | ||||
| 
 | ||||
|         <uses-library android:name="com.google.android.things" /> | ||||
| 
 | ||||
|         <meta-data | ||||
|             android:name="com.mixpanel.android.MPConfig.DisableViewCrawler" | ||||
|             android:value="true" /> | ||||
|  | @ -110,7 +108,14 @@ | |||
|         <service | ||||
|             android:name="com.geeksville.mesh.service.SerialInterfaceService" | ||||
|             android:enabled="true" | ||||
|             android:exported="false" /> | ||||
|             android:exported="false"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> | ||||
|             </intent-filter> | ||||
|             <meta-data | ||||
|                 android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" | ||||
|                 android:resource="@xml/device_filter" /> | ||||
|         </service> | ||||
| 
 | ||||
|         <activity | ||||
|             android:name="com.geeksville.mesh.MainActivity" | ||||
|  |  | |||
|  | @ -1,35 +1,26 @@ | |||
| package com.geeksville.mesh.service | ||||
| 
 | ||||
| import com.google.android.things.pio.PeripheralManager | ||||
| import com.google.android.things.pio.UartDevice | ||||
| import com.google.android.things.pio.UartDeviceCallback | ||||
| import android.content.Context | ||||
| import android.hardware.usb.UsbManager | ||||
| import com.hoho.android.usbserial.driver.UsbSerialDriver | ||||
| import com.hoho.android.usbserial.driver.UsbSerialPort | ||||
| import com.hoho.android.usbserial.driver.UsbSerialProber | ||||
| 
 | ||||
| 
 | ||||
| class SerialInterfaceService : InterfaceService() { | ||||
|     companion object { | ||||
|         fun findPorts(): List<String> { | ||||
|             val manager = PeripheralManager.getInstance() | ||||
|             return manager.uartDeviceList | ||||
|         } | ||||
| 
 | ||||
|         private val START1 = 0x94.toByte() | ||||
|         private val START2 = 0xc3.toByte() | ||||
|         private val MAX_TO_FROM_RADIO_SIZE = 512 | ||||
|     } | ||||
| 
 | ||||
|     private var uart: UartDevice? = null | ||||
|     private var uart: UsbSerialPort? = null | ||||
| 
 | ||||
|     /** The index of the next byte we are hoping to receive */ | ||||
|     private var rxPtr = 0 | ||||
| 
 | ||||
|     private val callback = object : UartDeviceCallback { | ||||
|         override fun onUartDeviceDataAvailable(p0: UartDevice): Boolean { | ||||
| 
 | ||||
|             return uart != null // keep reading until our device goes away | ||||
|     private val manager: UsbManager by lazy { | ||||
|         getSystemService(Context.USB_SERVICE) as UsbManager | ||||
|     } | ||||
| 
 | ||||
|         override fun onUartDeviceError(uart: UartDevice, error: Int) { | ||||
|             super.onUartDeviceError(uart, error) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     override fun handleSendToRadio(p: ByteArray) { | ||||
|         uart?.apply { | ||||
|  | @ -38,36 +29,89 @@ class SerialInterfaceService : InterfaceService() { | |||
|             header[1] = START2 | ||||
|             header[2] = (p.size shr 8).toByte() | ||||
|             header[3] = (p.size and 0xff).toByte() | ||||
|             write(header, header.size) | ||||
|             write(p, p.size) | ||||
|             // flush(UartDevice.FLUSH_OUT) - I don't think we need to stall for htis | ||||
|             write(header, 0) | ||||
|             write(p, 0) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /* | ||||
|     /** Print device serial debug output somewhere */ | ||||
|     private fun debugOut(c: Byte) { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private fun readerLoop() { | ||||
|         try { | ||||
|             val scratch = ByteArray(1) | ||||
| 
 | ||||
|             /** The index of the next byte we are hoping to receive */ | ||||
|             var ptr = 0 | ||||
| 
 | ||||
|             /** The two halves of our length */ | ||||
|             var msb = 0 | ||||
|             var lsb = 0 | ||||
| 
 | ||||
|             while (true) { // FIXME wait for someone to ask us to exit, and catch continuation exception | ||||
|                 uart?.apply { | ||||
|                 read(scratch, 1) | ||||
|                     read(scratch, 0) | ||||
|                     val c = scratch[0] | ||||
| 
 | ||||
|                     // Assume we will be advancing our pointer | ||||
|                     var nextPtr = ptr + 1 | ||||
| 
 | ||||
|                     when (ptr) { | ||||
|                     0 -> | ||||
|                         0 -> // looking for START1 | ||||
|                             if (c != START1) { | ||||
|                                 debugOut(c) | ||||
|                                 nextPtr = 0 // Restart from scratch | ||||
|                             } | ||||
|                         1 -> // Looking for START2 | ||||
|                             if (c != START2) | ||||
|                                 nextPtr = 0 // Restart from scratch | ||||
|                         2 -> // Looking for MSB of our 16 bit length | ||||
|                             msb = c.toInt() and 0xff | ||||
|                         3 -> // Looking for LSB of our 16 bit length | ||||
|                             lsb = c.toInt() and 0xff | ||||
|                         else -> { // We've read our header, do one big read for the packet itself | ||||
|                             val packetLen = (msb shl 8) or lsb | ||||
| 
 | ||||
|                             // If packet len is too long, the bytes must have been corrupted, start looking for START1 again | ||||
|                             if (packetLen <= MAX_TO_FROM_RADIO_SIZE) { | ||||
|                                 val buf = ByteArray(packetLen) | ||||
|                                 read(buf, 0) | ||||
|                                 handleFromRadio(buf) | ||||
|                             } | ||||
|                             nextPtr = 0 // Start parsing the next packet | ||||
|                         } | ||||
|                     } | ||||
|                     ptr = nextPtr | ||||
|                 } | ||||
|             } | ||||
|         } catch (ex: Exception) { | ||||
|             errormsg("Terminating reader thread due to ${ex.message}", ex) | ||||
|         } | ||||
|     } | ||||
|     } */ | ||||
| 
 | ||||
| 
 | ||||
|     override fun onCreate() { | ||||
|         super.onCreate() | ||||
| 
 | ||||
|         val port = findPorts()[0] | ||||
|         val manager = PeripheralManager.getInstance() | ||||
|         uart = manager.openUartDevice(port) | ||||
|         uart?.apply { | ||||
|             setBaudrate(921600) | ||||
|             registerUartDeviceCallback(callback) | ||||
|         val drivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager) | ||||
| 
 | ||||
|         // Open a connection to the first available driver. | ||||
|         // Open a connection to the first available driver. | ||||
|         val driver: UsbSerialDriver = drivers[0] | ||||
|         val connection = manager.openDevice(driver.device) | ||||
|         if (connection == null) { | ||||
|             // FIXME add UsbManager.requestPermission(driver.getDevice(), ..) handling to activity | ||||
|             TODO() | ||||
|         } else { | ||||
|             val port = driver.ports[0] // Most devices have just one port (port 0) | ||||
| 
 | ||||
|             port.open(connection) | ||||
|             port.setParameters(921600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE) | ||||
|             uart = port | ||||
| 
 | ||||
|             // FIXME, start reading thread | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,58 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <!-- 0x0403 FTDI --> | ||||
|     <usb-device | ||||
|         vendor-id="1027" | ||||
|         product-id="24577" /> <!-- 0x6001: FT232R --> | ||||
|     <usb-device | ||||
|         vendor-id="1027" | ||||
|         product-id="24592" /> <!-- 0x6010: FT2232H --> | ||||
|     <usb-device | ||||
|         vendor-id="1027" | ||||
|         product-id="24593" /> <!-- 0x6011: FT4232H --> | ||||
|     <usb-device | ||||
|         vendor-id="1027" | ||||
|         product-id="24596" /> <!-- 0x6014: FT232H --> | ||||
|     <usb-device | ||||
|         vendor-id="1027" | ||||
|         product-id="24597" /> <!-- 0x6015: FT231X --> | ||||
| 
 | ||||
|     <!-- 0x10C4 / 0xEAxx: Silabs CP210x --> | ||||
|     <usb-device | ||||
|         vendor-id="4292" | ||||
|         product-id="60000" /> <!-- 0xea60: CP2102 --> | ||||
|     <usb-device | ||||
|         vendor-id="4292" | ||||
|         product-id="60016" /> <!-- 0xea70: CP2105 --> | ||||
|     <usb-device | ||||
|         vendor-id="4292" | ||||
|         product-id="60017" /> <!-- 0xea71: CP2108 --> | ||||
|     <usb-device | ||||
|         vendor-id="4292" | ||||
|         product-id="60032" /> <!-- 0xea80: CP2110 --> | ||||
| 
 | ||||
|     <!-- 0x067B / 0x2303: Prolific PL2303 --> | ||||
|     <usb-device | ||||
|         vendor-id="1659" | ||||
|         product-id="8963" /> | ||||
| 
 | ||||
|     <!-- 0x1a86 / 0x7523: Qinheng CH340 --> | ||||
|     <usb-device | ||||
|         vendor-id="6790" | ||||
|         product-id="29987" /> | ||||
| 
 | ||||
|     <!-- CDC driver --> | ||||
|     <usb-device vendor-id="9025" />                   <!-- 0x2341 / ......: Arduino --> | ||||
|     <usb-device | ||||
|         vendor-id="5824" | ||||
|         product-id="1155" /> <!-- 0x16C0 / 0x0483: Teensyduino  --> | ||||
|     <usb-device | ||||
|         vendor-id="1003" | ||||
|         product-id="8260" /> <!-- 0x03EB / 0x2044: Atmel Lufa --> | ||||
|     <usb-device | ||||
|         vendor-id="7855" | ||||
|         product-id="4" /> <!-- 0x1eaf / 0x0004: Leaflabs Maple --> | ||||
|     <usb-device | ||||
|         vendor-id="3368" | ||||
|         product-id="516" /> <!-- 0x0d28 / 0x0204: ARM mbed --> | ||||
| </resources> | ||||
|  | @ -32,7 +32,7 @@ allprojects { | |||
|     repositories { | ||||
|         google() | ||||
|         jcenter() | ||||
| 
 | ||||
|         maven { url 'https://jitpack.io' } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 geeksville
						geeksville