From 19b124ae21becf28c3b670db760e6816d4fd6fd3 Mon Sep 17 00:00:00 2001 From: alno Date: Fri, 12 Sep 2014 14:28:33 +0000 Subject: [PATCH] New log library: 2.0. More log events logged on lower levels. git-svn-id: http://svn.nordicsemi.no/applications/mobile/android/DFULibrary/trunk@6541 94a72e49-5737-764a-8bf3-0d5ceb61e552 --- libs/nrf-logger-v1.2.jar | Bin 18991 -> 0 bytes libs/nrf-logger-v2.0.jar | Bin 0 -> 49315 bytes .../android/dfu/DfuBaseService.java | 83 +++++++++++++----- 3 files changed, 59 insertions(+), 24 deletions(-) delete mode 100644 libs/nrf-logger-v1.2.jar create mode 100644 libs/nrf-logger-v2.0.jar diff --git a/libs/nrf-logger-v1.2.jar b/libs/nrf-logger-v1.2.jar deleted file mode 100644 index 3f9d254ce7d0160b84eb0d416d0f35b39c97715a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18991 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%0DpA+l*Sx@yQLq3NcEx)PEOXXi;+$sjA^R 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 4]; + out[j * 3 + 1] = HEX_ARRAY[v & 0x0F]; + if (j != length - 1) + out[j * 3 + 2] = '-'; + } + return new String(out); + } }; public DfuBaseService() { @@ -809,12 +831,12 @@ public abstract class DfuBaseService extends IntentService { // send Start DFU command to Control Point logi("Sending Start DFU command (Op Code = 1, Upload Mode = " + fileType + ")"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_START_DFU); - sendLogBroadcast(Level.INFO, "DFU Start sent (Op Code 1, Upload Mode = " + fileType + ")"); + sendLogBroadcast(Level.APPLICATION, "DFU Start sent (Op Code 1, Upload Mode = " + fileType + ")"); // send image size in bytes to DFU Packet logi("Sending image size array to DFU Packet: [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); writeImageSize(gatt, packetCharacteristic, softDeviceImageSize, bootloaderImageSize, appImageSize); - sendLogBroadcast(Level.INFO, "Firmware image size sent [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); + sendLogBroadcast(Level.APPLICATION, "Firmware image size sent [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); // a notification will come with confirmation. Let's wait for it a bit response = readNotificationResponse(); @@ -830,7 +852,7 @@ public abstract class DfuBaseService extends IntentService { * +---------+--------+----------------------------------------------------+ */ status = getStatusCode(response, OP_CODE_RECEIVE_START_DFU_KEY); - sendLogBroadcast(Level.INFO, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); + sendLogBroadcast(Level.APPLICATION, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); if (status != DFU_STATUS_SUCCESS) throw new RemoteDfuException("Starting DFU failed", status); } catch (final RemoteDfuException e) { @@ -863,17 +885,17 @@ public abstract class DfuBaseService extends IntentService { sendLogBroadcast(Level.VERBOSE, "Sending only SD/BL"); logi("Resending Start DFU command (Op Code = 1, Upload Mode = " + fileType + ")"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_START_DFU); - sendLogBroadcast(Level.INFO, "DFU Start sent (Op Code 1, Upload Mode = " + fileType + ")"); + sendLogBroadcast(Level.APPLICATION, "DFU Start sent (Op Code 1, Upload Mode = " + fileType + ")"); // send image size in bytes to DFU Packet logi("Sending image size array to DFU Packet: [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); writeImageSize(gatt, packetCharacteristic, softDeviceImageSize, bootloaderImageSize, appImageSize); - sendLogBroadcast(Level.INFO, "Firmware image size sent [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); + sendLogBroadcast(Level.APPLICATION, "Firmware image size sent [" + softDeviceImageSize + "b, " + bootloaderImageSize + "b, " + appImageSize + "b]"); // a notification will come with confirmation. Let's wait for it a bit response = readNotificationResponse(); status = getStatusCode(response, OP_CODE_RECEIVE_START_DFU_KEY); - sendLogBroadcast(Level.INFO, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); + sendLogBroadcast(Level.APPLICATION, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); if (status != DFU_STATUS_SUCCESS) throw new RemoteDfuException("Starting DFU failed", status); } else @@ -892,17 +914,17 @@ public abstract class DfuBaseService extends IntentService { sendLogBroadcast(Level.VERBOSE, "Switching to DFU v.1"); logi("Resending Start DFU command (Op Code = 1)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_START_DFU); // If has 2 bytes, but the second one is ignored - sendLogBroadcast(Level.INFO, "DFU Start sent (Op Code 1)"); + sendLogBroadcast(Level.APPLICATION, "DFU Start sent (Op Code 1)"); // send image size in bytes to DFU Packet logi("Sending application image size to DFU Packet: " + imageSizeInBytes + " bytes"); writeImageSize(gatt, packetCharacteristic, mImageSizeInBytes); - sendLogBroadcast(Level.INFO, "Firmware image size sent (" + imageSizeInBytes + " bytes)"); + sendLogBroadcast(Level.APPLICATION, "Firmware image size sent (" + imageSizeInBytes + " bytes)"); // a notification will come with confirmation. Let's wait for it a bit response = readNotificationResponse(); status = getStatusCode(response, OP_CODE_RECEIVE_START_DFU_KEY); - sendLogBroadcast(Level.INFO, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); + sendLogBroadcast(Level.APPLICATION, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); if (status != DFU_STATUS_SUCCESS) throw new RemoteDfuException("Starting DFU failed", status); } else @@ -930,19 +952,19 @@ public abstract class DfuBaseService extends IntentService { logi("Sending the number of packets before notifications (Op Code = 8, value = " + numberOfPacketsBeforeNotification + ")"); setNumberOfPackets(OP_CODE_PACKET_RECEIPT_NOTIF_REQ, numberOfPacketsBeforeNotification); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_PACKET_RECEIPT_NOTIF_REQ); - sendLogBroadcast(Level.INFO, "Packet Receipt Notif Req (Op Code 8) sent (value: " + numberOfPacketsBeforeNotification + ")"); + sendLogBroadcast(Level.APPLICATION, "Packet Receipt Notif Req (Op Code 8) sent (value: " + numberOfPacketsBeforeNotification + ")"); } // Initialize firmware upload logi("Sending Receive Firmware Image request (Op Code = 3)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_RECEIVE_FIRMWARE_IMAGE); - sendLogBroadcast(Level.INFO, "Receive Firmware Image request sent"); + sendLogBroadcast(Level.APPLICATION, "Receive Firmware Image request sent"); // This allow us to calculate upload time final long startTime = System.currentTimeMillis(); updateProgressNotification(); try { - sendLogBroadcast(Level.INFO, "Starting upload..."); + sendLogBroadcast(Level.APPLICATION, "Starting upload..."); response = uploadFirmwareImage(gatt, packetCharacteristic, is); } catch (final DeviceDisconnectedException e) { loge("Disconnected while sending data"); @@ -952,11 +974,11 @@ public abstract class DfuBaseService extends IntentService { final long endTime = System.currentTimeMillis(); logi("Transfer of " + mBytesSent + " bytes has taken " + (endTime - startTime) + " ms"); - sendLogBroadcast(Level.INFO, "Upload completed in " + (endTime - startTime) + " ms"); + sendLogBroadcast(Level.APPLICATION, "Upload completed in " + (endTime - startTime) + " ms"); // Check the result of the operation status = getStatusCode(response, OP_CODE_RECEIVE_FIRMWARE_IMAGE_KEY); - sendLogBroadcast(Level.INFO, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); + sendLogBroadcast(Level.APPLICATION, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); logi("Response received. Op Code: " + response[0] + " Req Op Code: " + response[1] + " status: " + response[2]); if (status != DFU_STATUS_SUCCESS) throw new RemoteDfuException("Device returned error after sending file", status); @@ -964,13 +986,13 @@ public abstract class DfuBaseService extends IntentService { // Send Validate request logi("Sending Validate request (Op Code = 4)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_VALIDATE); - sendLogBroadcast(Level.INFO, "Validate request sent"); + sendLogBroadcast(Level.APPLICATION, "Validate request sent"); // A notification will come with status code. Let's wait for it a bit. response = readNotificationResponse(); status = getStatusCode(response, OP_CODE_RECEIVE_VALIDATE_KEY); logi("Response received. Op Code: " + response[0] + " Req Op Code: " + response[1] + " status: " + response[2]); - sendLogBroadcast(Level.INFO, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); + sendLogBroadcast(Level.APPLICATION, "Responce received (Op Code: " + response[1] + " Status: " + status + ")"); if (status != DFU_STATUS_SUCCESS) throw new RemoteDfuException("Device returned validation error", status); @@ -982,7 +1004,7 @@ public abstract class DfuBaseService extends IntentService { // Send Activate and Reset signal. logi("Sending Activate and Reset request (Op Code = 5)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_ACTIVATE_AND_RESET); - sendLogBroadcast(Level.INFO, "Activate and Reset request sent"); + sendLogBroadcast(Level.APPLICATION, "Activate and Reset request sent"); // The device will reset so we don't have to send Disconnect signal. waitUntilDisconnected(); @@ -1019,7 +1041,7 @@ public abstract class DfuBaseService extends IntentService { logi("Sending Reset command (Op Code = 6)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_RESET); - sendLogBroadcast(Level.INFO, "Reset request sent"); + sendLogBroadcast(Level.APPLICATION, "Reset request sent"); terminateConnection(gatt, error); } catch (final RemoteDfuException e) { final int error = ERROR_REMOTE_MASK | e.getErrorNumber(); @@ -1028,7 +1050,7 @@ public abstract class DfuBaseService extends IntentService { logi("Sending Reset command (Op Code = 6)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_RESET); - sendLogBroadcast(Level.INFO, "Reset request sent"); + sendLogBroadcast(Level.APPLICATION, "Reset request sent"); terminateConnection(gatt, error); } } catch (final UploadAbortedException e) { @@ -1039,7 +1061,7 @@ public abstract class DfuBaseService extends IntentService { mAborted = false; logi("Sending Reset command (Op Code = 6)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_RESET); - sendLogBroadcast(Level.INFO, "Reset request sent"); + sendLogBroadcast(Level.APPLICATION, "Reset request sent"); } catch (final Exception e1) { // do nothing } @@ -1060,7 +1082,7 @@ public abstract class DfuBaseService extends IntentService { try { logi("Sending Reset command (Op Code = 6)"); writeOpCode(gatt, controlPointCharacteristic, OP_CODE_RESET); - sendLogBroadcast(Level.INFO, "Reset request sent"); + sendLogBroadcast(Level.APPLICATION, "Reset request sent"); } catch (final Exception e1) { // do nothing } @@ -1312,12 +1334,18 @@ public abstract class DfuBaseService extends IntentService { logi((enable ? "Enabling " : "Disabling") + " notifications..."); + if (enable) { + sendLogBroadcast(Level.VERBOSE, "Enabling notifications for " + characteristic.getUuid()); + } else { + sendLogBroadcast(Level.VERBOSE, "Disabling notifications for " + characteristic.getUuid()); + } // enable notifications locally gatt.setCharacteristicNotification(characteristic, enable); // enable notifications on the device final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG); descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE); + sendLogBroadcast(Level.DEBUG, "gatt.writeDescriptor(" + descriptor.getUuid() + (enable ? ", value=0x01-00)" : ", value=0x00-00)")); gatt.writeDescriptor(descriptor); // We have to wait until device gets disconnected or an error occur @@ -1363,6 +1391,8 @@ public abstract class DfuBaseService extends IntentService { mResetRequestSent = value[0] == OP_CODE_RECEIVE_RESET_KEY || value[0] == OP_CODE_RECEIVE_ACTIVATE_AND_RESET_KEY; characteristic.setValue(value); + sendLogBroadcast(Level.VERBOSE, "Writing to characteristic " + characteristic.getUuid()); + sendLogBroadcast(Level.DEBUG, "gatt.writeCharacteristic(" + characteristic.getUuid() + ")"); gatt.writeCharacteristic(characteristic); // We have to wait for confirmation @@ -1405,6 +1435,8 @@ public abstract class DfuBaseService extends IntentService { characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE); characteristic.setValue(new byte[4]); characteristic.setValue(imageSize, BluetoothGattCharacteristic.FORMAT_UINT32, 0); + sendLogBroadcast(Level.VERBOSE, "Writing to characteristic " + characteristic.getUuid()); + sendLogBroadcast(Level.DEBUG, "gatt.writeCharacteristic(" + characteristic.getUuid() + ")"); gatt.writeCharacteristic(characteristic); // We have to wait for confirmation @@ -1459,6 +1491,8 @@ public abstract class DfuBaseService extends IntentService { characteristic.setValue(softDeviceImageSize, BluetoothGattCharacteristic.FORMAT_UINT32, 0); characteristic.setValue(bootloaderImageSize, BluetoothGattCharacteristic.FORMAT_UINT32, 4); characteristic.setValue(appImageSize, BluetoothGattCharacteristic.FORMAT_UINT32, 8); + sendLogBroadcast(Level.VERBOSE, "Writing to characteristic " + characteristic.getUuid()); + sendLogBroadcast(Level.DEBUG, "gatt.writeCharacteristic(" + characteristic.getUuid() + ")"); gatt.writeCharacteristic(characteristic); // We have to wait for confirmation @@ -1501,6 +1535,7 @@ public abstract class DfuBaseService extends IntentService { final byte[] buffer = mBuffer; try { final int size = inputStream.read(buffer); + sendLogBroadcast(Level.VERBOSE, "Sending firmware to characteristic " + packetCharacteristic.getUuid() + "..."); writePacket(gatt, packetCharacteristic, buffer, size); } catch (final HexFileValidationException e) { throw new DfuException("HEX file not valid", ERROR_FILE_INVALID); @@ -1732,7 +1767,7 @@ public abstract class DfuBaseService extends IntentService { } private void sendLogBroadcast(final int level, final String message) { - final LogSession session = mLogSession; + final ILogSession session = mLogSession; final String fullMessage = "[DFU] " + message; if (session == null) { // the log provider is not installed, use broadcast action