     }
 }
 
+internal enum SecureDFUImageType : UInt8 {
+    case softdevice  = 0x00
+    case application = 0x01
+    case bootloader  = 0x02
+    
+    var description: String{
+        switch self{
+            case .softdevice:  return "Soft Device"
+            case .application: return "Application"
+            case .bootloader:  return "Bootloader"
+        }
+    }
+}
+
 internal enum SecureDFURequest {
-    case createCommandObject(withSize : UInt32)
-    case createDataObject(withSize : UInt32)
+    case getProtocolVersion
+    case createCommandObject(withSize: UInt32)
+    case createDataObject(withSize: UInt32)
     case readCommandObjectInfo
     case readDataObjectInfo
-    case setPacketReceiptNotification(value : UInt16)
+    case setPacketReceiptNotification(value: UInt16)
     case calculateChecksumCommand
     case executeCommand
+    case getMtu
+    case write(bytes: Data)
+    case ping(id: UInt8)
+    case getHwVersion
+    case getFwVersion(image: SecureDFUImageType)
+    case abort
 
     var data : Data {
         switch self {
+        case .getProtocolVersion:
+            return Data([SecureDFUOpCode.getProtocolVersion.code])
         case .createDataObject(let aSize):
             var data = Data([SecureDFUOpCode.createObject.code, SecureDFUProcedureType.data.rawValue])
             data += aSize.littleEndian

            var data = Data([SecureDFUOpCode.createObject.code, SecureDFUProcedureType.command.rawValue])
            data += aSize.littleEndian
            return data
        case .readCommandObjectInfo:
            return Data([SecureDFUOpCode.readObjectInfo.code, SecureDFUProcedureType.command.rawValue])
        case .readDataObjectInfo:
            return Data([SecureDFUOpCode.readObjectInfo.code, SecureDFUProcedureType.data.rawValue])
        case .setPacketReceiptNotification(let aSize):
            var data = Data([SecureDFUOpCode.setPRNValue.code])
            data += aSize.littleEndian

    case invalidObject         = 0x05
    case signatureMismatch     = 0x06
    case unsupportedType       = 0x07
    case operationNotPermitted = 0x08
    case operationFailed       = 0x0A
    case extendedError         = 0x0B
    
