diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 0b911e78586e52fd51068a5428c0558713a009a3..53608dc47bf3c20115b9bc8feb99970e291aed8b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,8 +10,10 @@ </component> <component name="ChangeListManager"> <list default="true" id="ffce6e62-d498-4e17-b121-42833fbda3f5" name="Default" comment=""> + <change type="DELETED" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/HidBridge.java" afterPath="" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> - <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" /> </list> <ignored path="Medtronic640gUploader.iws" /> <ignored path=".idea/workspace.xml" /> @@ -32,12 +34,13 @@ </component> <component name="FileEditorManager"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> - <file leaf-file-name="Medtronic640gActivity.java" pinned="false" current-in-tab="true"> + <file leaf-file-name="Medtronic640gActivity.java" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.29955947"> - <caret line="126" column="32" selection-start-line="126" selection-start-column="32" selection-end-line="126" selection-end-column="32" /> + <state vertical-scroll-proportion="-8.407408"> + <caret line="543" column="58" selection-start-line="543" selection-start-column="48" selection-end-line="543" selection-end-column="58" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> @@ -45,21 +48,11 @@ </provider> </entry> </file> - <file leaf-file-name="Eula.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/eula/Eula.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="42" column="38" selection-start-line="42" selection-start-column="4" selection-end-line="42" selection-end-column="38" /> - <folding /> - </state> - </provider> - </entry> - </file> <file leaf-file-name="MedtronicCNLService.java" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-7.259259"> - <caret line="241" column="5" selection-start-line="237" selection-start-column="4" selection-end-line="241" selection-end-column="5" /> + <state vertical-scroll-proportion="-10.185185"> + <caret line="150" column="25" selection-start-line="150" selection-start-column="16" selection-end-line="150" selection-end-column="25" /> <folding> <element signature="imports" expanded="true" /> </folding> @@ -67,13 +60,23 @@ </provider> </entry> </file> - <file leaf-file-name="GetHmacAndKeyActivity.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java"> + <file leaf-file-name="MedtronicCNLReader.java" pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-5.5925927"> - <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" /> + <state vertical-scroll-proportion="0.7641509"> + <caret line="197" column="12" selection-start-line="197" selection-start-column="12" selection-end-line="197" selection-end-column="12" /> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="AndroidManifest.xml" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="-11.291667"> + <caret line="54" column="77" selection-start-line="54" selection-start-column="58" selection-end-line="54" selection-end-column="77" /> <folding> - <element signature="e#4031#4073#0" expanded="true" /> + <element signature="e#198#215#0" expanded="true" /> </folding> </state> </provider> @@ -1778,6 +1781,8 @@ <option value="$PROJECT_DIR$/app/src/main/res/values/strings.xml" /> <option value="$PROJECT_DIR$/app/src/main/res/xml/preferences.xml" /> <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" /> </list> </option> </component> @@ -1838,6 +1843,10 @@ <option name="myItemId" value="res" /> <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderNode" /> </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="xml" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderTypeNode" /> + </PATH_ELEMENT> </PATH> <PATH> <PATH_ELEMENT> @@ -1857,6 +1866,20 @@ <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderTypeNode" /> </PATH_ELEMENT> </PATH> + <PATH> + <PATH_ELEMENT> + <option name="myItemId" value="Medtronic640gUploader" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" /> + </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="app" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> + </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="res" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderNode" /> + </PATH_ELEMENT> + </PATH> <PATH> <PATH_ELEMENT> <option name="myItemId" value="Medtronic640gUploader" /> @@ -2100,6 +2123,10 @@ <option name="myItemId" value="app" /> <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="manifests" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidManifestsGroupNode" /> + </PATH_ELEMENT> </PATH> </subPane> </pane> @@ -2110,7 +2137,7 @@ <component name="PropertiesComponent"> <property name="settings.editor.selected.configurable" value="android.sdk-updates" /> <property name="settings.editor.splitter.proportion" value="0.2" /> - <property name="SearchEverywhereHistoryKey" value="uploa	PSI	JAVA://com.nightscout.android.upload.UploadHelper g4	PSI	JAVA://com.nightscout.android.dexcom.DexcomG4Activity cnlread	PSI	JAVA://com.nightscout.android.medtronic.MedtronicCNLReader" /> + <property name="SearchEverywhereHistoryKey" value="reader	FILE	file:///Users/lgoedhart/StudioProjects/Medtronic640gUploader/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java uploa	PSI	JAVA://com.nightscout.android.upload.UploadHelper g4	PSI	JAVA://com.nightscout.android.dexcom.DexcomG4Activity cnlread	PSI	JAVA://com.nightscout.android.medtronic.MedtronicCNLReader" /> <property name="android.project.structure.last.selected" value="app" /> <property name="android.project.structure.proportion" value="0.15" /> <property name="device.picker.selection" value="192.168.0.115:5555" /> @@ -2414,7 +2441,7 @@ <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" /> - <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2633864" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.86975396" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3299566" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> @@ -2454,7 +2481,7 @@ <breakpoints-dialog> <breakpoints-dialog /> </breakpoints-dialog> - <option name="time" value="15" /> + <option name="time" value="17" /> </breakpoint-manager> <watches-manager /> </component> @@ -2464,6 +2491,7 @@ <state vertical-scroll-proportion="0.0"> <caret line="166" column="77" selection-start-line="166" selection-start-column="71" selection-end-line="166" selection-end-column="77" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> @@ -2503,6 +2531,7 @@ <state vertical-scroll-proportion="0.0"> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> @@ -2534,6 +2563,7 @@ <state vertical-scroll-proportion="0.0"> <caret line="166" column="77" selection-start-line="166" selection-start-column="71" selection-end-line="166" selection-end-column="77" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> @@ -2573,6 +2603,7 @@ <state vertical-scroll-proportion="0.0"> <caret line="72" column="0" selection-start-line="72" selection-start-column="0" selection-end-line="72" selection-end-column="0" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> @@ -2753,14 +2784,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="1.0114943"> - <caret line="331" column="0" selection-start-line="331" selection-start-column="0" selection-end-line="331" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/app/build/generated/source/r/debug/info/nightscout/android/R.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.3524229"> @@ -2769,16 +2792,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-7.259259"> - <caret line="241" column="5" selection-start-line="237" selection-start-column="4" selection-end-line="241" selection-end-column="5" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/eula/Eula.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> @@ -2807,9 +2820,7 @@ <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.7417943"> <caret line="59" column="50" selection-start-line="59" selection-start-column="50" selection-end-line="59" selection-end-column="50" /> - <folding> - <element signature="e#3741#3758#0" expanded="true" /> - </folding> + <folding /> </state> </provider> </entry> @@ -2821,42 +2832,98 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="-5.5925927"> + <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" /> + <folding> + <element signature="e#4031#4073#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="-10.185185"> + <caret line="150" column="25" selection-start-line="150" selection-start-column="16" selection-end-line="150" selection-end-column="25" /> + <folding> + <element signature="imports" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/device_filter.xml"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.13953489"> - <caret line="4" column="26" selection-start-line="4" selection-start-column="26" selection-end-line="4" selection-end-column="26" /> + <state vertical-scroll-proportion="-0.21387284"> + <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/UsbDriver.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-5.5925927"> - <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" /> + <state vertical-scroll-proportion="0.0"> + <caret line="29" column="17" selection-start-line="29" selection-start-column="17" selection-end-line="29" selection-end-column="17" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/CommonUsbDriver.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.0"> + <caret line="31" column="42" selection-start-line="31" selection-start-column="42" selection-end-line="31" selection-end-column="42" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/UsbHidDriver.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.4827586"> + <caret line="22" column="13" selection-start-line="22" selection-start-column="13" selection-end-line="22" selection-end-column="13" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="-11.291667"> + <caret line="54" column="77" selection-start-line="54" selection-start-column="58" selection-end-line="54" selection-end-column="77" /> <folding> - <element signature="e#4031#4073#0" expanded="true" /> + <element signature="e#198#215#0" expanded="true" /> </folding> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.33264032"> - <caret line="601" column="36" selection-start-line="601" selection-start-column="36" selection-end-line="601" selection-end-column="36" /> - <folding /> + <state vertical-scroll-proportion="-4.0740743"> + <caret line="1352" column="28" selection-start-line="1352" selection-start-column="22" selection-end-line="1352" selection-end-column="28" /> + <folding> + <element signature="e#50698#50964#0" expanded="true" /> + <element signature="e#50963#50964#0" expanded="true" /> + </folding> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.29955947"> - <caret line="126" column="32" selection-start-line="126" selection-start-column="32" selection-end-line="126" selection-end-column="32" /> + <state vertical-scroll-proportion="-8.407408"> + <caret line="543" column="58" selection-start-line="543" selection-start-column="48" selection-end-line="543" selection-end-column="58" /> <folding> + <element signature="imports" expanded="true" /> <element signature="e#15673#15939#0" expanded="true" /> <element signature="e#15938#15939#0" expanded="true" /> </folding> </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.7641509"> + <caret line="197" column="12" selection-start-line="197" selection-start-column="12" selection-end-line="197" selection-end-column="12" /> + <folding /> + </state> + </provider> + </entry> </component> </project> \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/android/USB/HidBridge.java b/app/src/main/java/info/nightscout/android/USB/HidBridge.java deleted file mode 100644 index 57ed36a474d2ac4966dae9685b39b678d72ae0ad..0000000000000000000000000000000000000000 --- a/app/src/main/java/info/nightscout/android/USB/HidBridge.java +++ /dev/null @@ -1,397 +0,0 @@ -package info.nightscout.android.USB; - -import android.content.BroadcastReceiver; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbEndpoint; -import android.hardware.usb.UsbInterface; -import android.hardware.usb.UsbManager; -import android.util.Log; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Queue; - -/** - * This class is used for talking to hid of the dongle, connecting, disconnecting and enumerating the devices. - * @author gai - */ -public class HidBridge { - private Context _context; - private int _productId; - private int _vendorId; - - // Can be used for debugging. - @SuppressWarnings("unused") - //private HidBridgeLogSupporter _logSupporter = new HidBridgeLogSupporter(); - private static final String ACTION_USB_PERMISSION = - "com.example.company.app.testhid.USB_PERMISSION"; - - // Locker object that is responsible for locking read/write thread. - private Object _locker = new Object(); - private Thread _readingThread = null; - private String _deviceName; - - private UsbManager _usbManager; - private UsbDevice _usbDevice; - - // The queue that contains the read data. - private Queue<byte[]> _receivedQueue; - - /** - * Creates a hid bridge to the dongle. Should be created once. - * @param context is the UI context of Android. - * @param productId of the device. - * @param vendorId of the device. - */ - public HidBridge(Context context, int productId, int vendorId) { - _context = context; - _productId = productId; - _vendorId = vendorId; - _receivedQueue = new LinkedList<byte[]>(); - } - - /** - * Searches for the device and opens it if successful - * @return true, if connection was successful - */ - public boolean OpenDevice() { - _usbManager = (UsbManager) _context.getSystemService(Context.USB_SERVICE); - - HashMap<String, UsbDevice> deviceList = _usbManager.getDeviceList(); - - Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); - _usbDevice = null; - - // Iterate all the available devices and find ours. - while(deviceIterator.hasNext()){ - UsbDevice device = deviceIterator.next(); - if (device.getProductId() == _productId && device.getVendorId() == _vendorId) { - _usbDevice = device; - _deviceName = _usbDevice.getDeviceName(); - } - } - - if (_usbDevice == null) { - Log("Cannot find the device. Did you forgot to plug it?"); - Log(String.format("\t I search for VendorId: %s and ProductId: %s", _vendorId, _productId)); - return false; - } - - // Create and intent and request a permission. - PendingIntent mPermissionIntent = PendingIntent.getBroadcast(_context, 0, new Intent(ACTION_USB_PERMISSION), 0); - IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); - _context.registerReceiver(mUsbReceiver, filter); - - _usbManager.requestPermission(_usbDevice, mPermissionIntent); - Log("Found the device"); - return true; - } - - /** - * Closes the reading thread of the device. - */ - public void CloseTheDevice() { - StopReadingThread(); - } - - /** - * Starts the thread that continuously reads the data from the device. - * Should be called in order to be able to talk with the device. - */ - public void StartReadingThread() { - if (_readingThread == null) { - _readingThread = new Thread(readerReceiver); - _readingThread.start(); - } else { - Log("Reading thread already started"); - } - } - - /** - * Stops the thread that continuously reads the data from the device. - * If it is stopped - talking to the device would be impossible. - */ - @SuppressWarnings("deprecation") - public void StopReadingThread() { - if (_readingThread != null) { - // Just kill the thread. It is better to do that fast if we need that asap. - _readingThread.stop(); - _readingThread = null; - } else { - Log("No reading thread to stop"); - } - } - - /** - * Write data to the usb hid. Data is written as-is, so calling method is responsible for adding header data. - * @param bytes is the data to be written. - * @param timeout in milliseconds. - * @return true if succeed. - */ - public boolean WriteData(byte[] bytes, int timeout) { - try - { - // Lock that is common for read/write methods. - synchronized (_locker) { - Log.e( "HidBridge", "InterfaceCount: " +_usbDevice.getInterfaceCount() ); - UsbInterface writeIntf = _usbDevice.getInterface(0); - Log.e( "HidBridge", writeIntf.toString() ); - Log.e( "HidBridge", "" + writeIntf.getEndpointCount() ); - UsbEndpoint writeEp = writeIntf.getEndpoint(0); - Log.e( "HidBridge", writeEp.toString() ); - - UsbDeviceConnection writeConnection = _usbManager.openDevice(_usbDevice); - - // Lock the usb interface. - writeConnection.claimInterface(writeIntf, true); - - // Write the data as a bulk transfer with defined data length. - int r = writeConnection.bulkTransfer(writeEp, bytes, bytes.length, timeout); - if (r != -1) { - Log(String.format("Written %s bytes to the dongle. Data written: %s", r, composeString(bytes))); - } else { - Log("Error happened while writing data. No ACK"); - } - - // Release the usb interface. - writeConnection.releaseInterface(writeIntf); - writeConnection.close(); - } - - } catch(NullPointerException e) - { - Log("Error happend while writing. Could not connect to the device or interface is busy?"); - Log.e("HidBridge", Log.getStackTraceString(e)); - return false; - } - return true; - } - - /** - * Read data from the usb hid. This is synchronous. If you want asynchronous reading, use StartReadingThread() instead. - * @param length the number of bytes to be read. - * @return an array of bytes. - */ - public byte[] ReadData(int length, int timeout) { - byte[] bytes = new byte[length]; - - // Lock that is common for read/write methods. - synchronized (_locker) { - UsbInterface readIntf = _usbDevice.getInterface(0); - Log.e( "HidBridge", readIntf.toString() ); - Log.e( "HidBridge", "" + readIntf.getEndpointCount() ); - UsbEndpoint readEp = readIntf.getEndpoint(1); - Log.e( "HidBridge", readEp.toString() ); - UsbDeviceConnection readConnection = _usbManager.openDevice(_usbDevice); - - // Lock the usb interface. - readConnection.claimInterface(readIntf, true); - - // Write the data as a bulk transfer with defined data length. - int r = readConnection.bulkTransfer(readEp, bytes, bytes.length, timeout); - if (r >= 0) { - Log(String.format("Read %s bytes from the dongle. Data read: %s", r, composeString(bytes))); - } else { - Log("Error happened while reading data."); - } - - // Release the usb interface. - readConnection.releaseInterface(readIntf); - readConnection.close(); - } - - return bytes; - } - - /** - * @return true if there are any data in the queue to be read. - */ - public boolean IsThereAnyReceivedData() { - synchronized(_locker) { - return !_receivedQueue.isEmpty(); - } - } - - /** - * Queue the data from the read queue. - * @return queued data. - */ - public byte[] GetReceivedDataFromQueue() { - synchronized(_locker) { - return _receivedQueue.poll(); - } - } - - // The thread that continuously receives data from the dongle and put it to the queue. - private Runnable readerReceiver = new Runnable() { - public void run() { - if (_usbDevice == null) { - Log("No device to read from"); - return; - } - - UsbEndpoint readEp; - UsbDeviceConnection readConnection = null; - UsbInterface readIntf = null; - boolean readerStartedMsgWasShown = false; - - // We will continuously ask for the data from the device and store it in the queue. - while (true) { - // Lock that is common for read/write methods. - synchronized (_locker) { - try - { - if (_usbDevice == null) { - OpenDevice(); - Log("No device. Rechecking in 10 sec..."); - - Sleep(10000); - continue; - } - - readIntf = _usbDevice.getInterface(0); - readEp = readIntf.getEndpoint(1); - if (!_usbManager.getDeviceList().containsKey(_deviceName)) { - Log("Failed to connect to the device. Retrying to acquire it."); - OpenDevice(); - if (!_usbManager.getDeviceList().containsKey(_deviceName)) { - Log("No device. Rechecking in 10 sec..."); - - Sleep(10000); - continue; - } - } - - try - { - - readConnection = _usbManager.openDevice(_usbDevice); - - if (readConnection == null) { - Log("Cannot start reader because the user didn't gave me permissions or the device is not present. Retrying in 2 sec..."); - Sleep(2000); - continue; - } - - // Claim and lock the interface in the android system. - readConnection.claimInterface(readIntf, true); - } - catch (SecurityException e) { - Log("Cannot start reader because the user didn't gave me permissions. Retrying in 2 sec..."); - - Sleep(2000); - continue; - } - - // Show the reader started message once. - if (!readerStartedMsgWasShown) { - Log("!!! Reader was started !!!"); - readerStartedMsgWasShown = true; - } - - // Read the data as a bulk transfer with the size = MaxPacketSize - int packetSize = readEp.getMaxPacketSize(); - byte[] bytes = new byte[packetSize]; - int r = readConnection.bulkTransfer(readEp, bytes, packetSize, 50); - if (r >= 0) { - byte[] trancatedBytes = new byte[r]; // Truncate bytes in the honor of r - - int i=0; - for (byte b : bytes) { - trancatedBytes[i] = b; - i++; - } - - _receivedQueue.add(trancatedBytes); // Store received data - Log(String.format("Message received of lengths %s and content: %s", r, composeString(bytes))); - } - - // Release the interface lock. - readConnection.releaseInterface(readIntf); - readConnection.close(); - } - - catch (NullPointerException e) { - Log("Error happened while reading. No device or the connection is busy"); - Log.e("HidBridge", Log.getStackTraceString(e)); - } - catch (ThreadDeath e) { - if (readConnection != null) { - readConnection.releaseInterface(readIntf); - readConnection.close(); - } - - throw e; - } - } - - // Sleep for 10 ms to pause, so other thread can write data or anything. - // As both read and write data methods lock each other - they cannot be run in parallel. - // Looks like Android is not so smart in planning the threads, so we need to give it a small time - // to switch the thread context. - Sleep(10); - } - } - }; - - private void Sleep(int milliseconds) { - try { - Thread.sleep(milliseconds); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { - - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (ACTION_USB_PERMISSION.equals(action)) { - synchronized (this) { - UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); - - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { - if(device != null){ - //call method to set up device communication - } - } - else { - Log.d("TAG", "permission denied for the device " + device); - } - } - } - } - }; - - /** - * Logs the message from HidBridge. - * @param message to log. - */ - private void Log(String message) { - //LogHandler logHandler = LogHandler.getInstance(); - //logHandler.WriteMessage("HidBridge: " + message, LogHandler.GetNormalColor()); - } - - /** - * Composes a string from byte array. - */ - private String composeString(byte[] bytes) { - StringBuilder builder = new StringBuilder(); - for (byte b: bytes) { - builder.append(b); - builder.append(" "); - } - - return builder.toString(); - } - - public String toString() { - return "" + _usbDevice.getInterfaceCount(); - } -} diff --git a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java index 76445d357768017da19babac6036a5c16564617e..e392fc11f4cbcf995026faedff19eef233c70776 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java +++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java @@ -148,7 +148,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler { public void requestDeviceInfo() throws IOException, TimeoutException, UnexpectedMessageException { new ContourNextLinkCommandMessage("X").send(this); - boolean gotTimeout = false; + boolean doRetry = false; // TODO - parse this into an ASTM record for the device info. try { @@ -169,10 +169,9 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler { } catch (TimeoutException e) { // Terminate comms with the pump, then try again new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this); - gotTimeout = true; + doRetry = true; } finally { - // If we timed out - try to start the session again. - if (gotTimeout) { + if (doRetry) { requestDeviceInfo(); } } @@ -187,10 +186,22 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler { } public void enterControlMode() throws IOException, TimeoutException, UnexpectedMessageException { - new ContourNextLinkCommandMessage(ASCII.NAK.value).send(this); - checkControlMessage(readMessage(), ASCII.EOT.value); - new ContourNextLinkCommandMessage(ASCII.ENQ.value).send(this); - checkControlMessage(readMessage(), ASCII.ACK.value); + boolean doRetry = false; + + try { + new ContourNextLinkCommandMessage(ASCII.NAK.value).send(this); + checkControlMessage(readMessage(), ASCII.EOT.value); + new ContourNextLinkCommandMessage(ASCII.ENQ.value).send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + } catch( UnexpectedMessageException e2 ) { + // Terminate comms with the pump, then try again + new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this); + doRetry = true; + } finally { + if (doRetry) { + enterControlMode(); + } + } } public void enterPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException {