diff --git a/AVRsack/ASBuilder.swift b/AVRsack/ASBuilder.swift index 0dd27fc..1b05da3 100644 --- a/AVRsack/ASBuilder.swift +++ b/AVRsack/ASBuilder.swift @@ -18,10 +18,14 @@ class ASBuilder { termination = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification, object: nil, queue: nil, usingBlock: { (notification: NSNotification!) in - if notification.object as? NSTask == self.task && self.task!.terminationStatus == 0 { - if let cont = self.continuation { + if notification.object as? NSTask == self.task { + if self.task!.terminationStatus == 0 { + if let cont = self.continuation { + self.continuation = nil + cont() + } + } else { self.continuation = nil - cont() } } }) @@ -121,4 +125,23 @@ class ASBuilder { task!.arguments = args; task!.launch() } + + func disassembleProject(board: String) { + task = NSTask() + task!.currentDirectoryPath = dir.path! + task!.launchPath = "/usr/local/CrossPack-AVR/bin/avr-objdump" + + let fileManager = NSFileManager.defaultManager() + let logURL = dir.URLByAppendingPathComponent("build/disasm.log") + fileManager.createFileAtPath(logURL.path!, contents: NSData(), attributes: nil) + let logOut = NSFileHandle(forWritingAtPath: logURL.path!)! + task!.standardOutput = logOut + task!.standardError = logOut + + var args = ["-d", "-S", "build/"+board+"/"+dir.lastPathComponent+".elf"] + let cmdLine = task!.launchPath+" "+(args as NSArray).componentsJoinedByString(" ")+"\n" + logOut.writeData(cmdLine.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) + task!.arguments = args; + task!.launch() + } } \ No newline at end of file diff --git a/AVRsack/ASFileTree.swift b/AVRsack/ASFileTree.swift index c90d254..c4f8170 100644 --- a/AVRsack/ASFileTree.swift +++ b/AVRsack/ASFileTree.swift @@ -203,6 +203,7 @@ class ASFileTree : NSObject, NSOutlineViewDataSource { var dir = NSURL() var buildLog = ASLogNode(name: "Build Log", path: "build/build.log") var uploadLog = ASLogNode(name: "Upload Log", path: "build/upload.log") + var disassembly = ASLogNode(name: "Disassembly", path: "build/disasm.log") func addFileURL(url: NSURL, omitUnknown: Bool = true) { let type = ASFileType.guessForURL(url) @@ -230,7 +231,7 @@ class ASFileTree : NSObject, NSOutlineViewDataSource { // MARK: Outline Data Source func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int { if item == nil { - return 3 + return 4 } else { return (item as ASFileGroup).children.count } @@ -242,6 +243,8 @@ class ASFileTree : NSObject, NSOutlineViewDataSource { return buildLog case 2: return uploadLog + case 3: + return disassembly default: return root } diff --git a/AVRsack/ASProjDoc.swift b/AVRsack/ASProjDoc.swift index a7e1709..b2356fb 100644 --- a/AVRsack/ASProjDoc.swift +++ b/AVRsack/ASProjDoc.swift @@ -287,7 +287,7 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate { updateChangeCount(.ChangeDone) } func outlineView(outlineView: NSOutlineView, willDisplayCell cell: AnyObject, forTableColumn tableColumn: NSTableColumn?, item: AnyObject) { - if item === files.root || item === files.buildLog || item === files.uploadLog { + if item === files.root || item === files.buildLog || item === files.uploadLog || item === files.disassembly { (cell as NSCell).font = NSFont.boldSystemFontOfSize(13.0) } else { (cell as NSCell).font = NSFont.systemFontOfSize(13.0) @@ -476,5 +476,13 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate { } buildProject(sender) } + + @IBAction func disassembleProject(sender: AnyObject) { + builder.continuation = { + self.selectNodeInOutline(self.files.disassembly) + self.builder.disassembleProject(self.board) + } + buildProject(sender) + } } diff --git a/AVRsack/Base.lproj/ASProjDoc.xib b/AVRsack/Base.lproj/ASProjDoc.xib index bc6447e..0de03fa 100644 --- a/AVRsack/Base.lproj/ASProjDoc.xib +++ b/AVRsack/Base.lproj/ASProjDoc.xib @@ -1,5 +1,5 @@ - + @@ -109,6 +109,11 @@ + + + + + @@ -198,6 +203,7 @@ + @@ -218,6 +224,7 @@ + diff --git a/AVRsack/Images.xcassets/DisassIcon.imageset/Contents.json b/AVRsack/Images.xcassets/DisassIcon.imageset/Contents.json new file mode 100644 index 0000000..95aa976 --- /dev/null +++ b/AVRsack/Images.xcassets/DisassIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "DisassIcon 1x.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "DisassIcon 2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 1x.png b/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 1x.png new file mode 100644 index 0000000..61ad093 Binary files /dev/null and b/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 1x.png differ diff --git a/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 2x.png b/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 2x.png new file mode 100644 index 0000000..434a89b Binary files /dev/null and b/AVRsack/Images.xcassets/DisassIcon.imageset/DisassIcon 2x.png differ diff --git a/Artwork/DisassIcon.artx/Preview/preview.png b/Artwork/DisassIcon.artx/Preview/preview.png new file mode 100644 index 0000000..24a809a Binary files /dev/null and b/Artwork/DisassIcon.artx/Preview/preview.png differ diff --git a/Artwork/DisassIcon.artx/QuickLook/Preview.pdf b/Artwork/DisassIcon.artx/QuickLook/Preview.pdf new file mode 100644 index 0000000..22076e8 Binary files /dev/null and b/Artwork/DisassIcon.artx/QuickLook/Preview.pdf differ diff --git a/Artwork/DisassIcon.artx/doc.thread b/Artwork/DisassIcon.artx/doc.thread new file mode 100644 index 0000000..be641aa Binary files /dev/null and b/Artwork/DisassIcon.artx/doc.thread differ