Terminal Befehl über button ...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Terminal Befehl über button ...

    Hallo,

    ich möchte mir eine kleine App basteln mit der ich OpenCBM befehle ausgeben kann und das Ergebnis in einem Fenster angezeigt bekomme.

    OpenCBM dient dazu um eine echte C64 Floppy zu steuern, Floppy formatieren, D64 Images oder einzelne Programme auf Diskette oder von Diskette kopieren kann.
    Also ein Knopf soll zum Beispiel den Befehl "d64copy" ausführen, ein Textfeld könnte dazu dienen eine Quelle anzugeben, per drag an drop eine Datei in das Feld ziehen. noch ein Knopf gibt das Ziel an, hier Laufwerk "8" und der letzte Knopf löst den Befehl aus.

    Im Terminal würde das dann so aussehen "d64copy image.d64 8"

    Ich finde aber keinen leichten Weg das in Swift umzusetzen. Ich finde immer nur hallo Welt oder und das möchte ich ja nicht.

    vielen Dank
  • tjost1975 schrieb:

    Das hilft mir so leider nicht. Das erste beinhaltet nicht bas Beispiel das 2. ist iOS.
    Um es klar zu erbitten bräuchte ich einmal aufgeschrieben wie das IBAction aussehen müsste bitte.
    Dann lies doch bitte genau:

    HackingWithSwift schrieb:

    If you’re building an app for macOS or any other platform where you can run external programs, you can draw on Foundation’s Process class to do almost all the work for you.
    Um auch klar zu sein: Die Hilfestellung erfordert schon etwas Eigeninitiative...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    tjost1975 schrieb:

    Das hilft mir so leider nicht. Das erste beinhaltet nicht bas Beispiel das 2. ist iOS.
    Um es klar zu erbitten bräuchte ich einmal aufgeschrieben wie das IBAction aussehen müsste bitte.
    Dann lies doch bitte genau:

    HackingWithSwift schrieb:

    If you’re building an app for macOS or any other platform where you can run external programs, you can draw on Foundation’s Process class to do almost all the work for you.
    Um auch klar zu sein: Die Hilfestellung erfordert schon etwas Eigeninitiative...
    Mattes
    Mir ist schon klar das ich hier um Hilfe frage.
    Ich frage in keinster Weise danach das mit jemand meinen Code komplett schreiben soll.

    Mir ist auch aus Gründen die persönlicher Natur sind nicht möglich das in englisch geschriebene klar zu verstehen.
    Ich beherrsche auch keine Programmiersprachen ich habe ein Problem durch eine Beschädigung meines Gehirns welches es mir nicht ermöglich solche theoretischen Dinge zu lernen und zu behalten.
    Ich kann das nur logisch quasi durch anfassen verstehen. Ich habe da eine eigene Methodik entwickelt die es mir ermöglicht das Ergebnis zu erzielen was ich möchte.
    Im Sinne der Gleichstellung wünsche ich mir das man das berücksichtigt und mir diesen einen Code-Snippet aufschreibt das ich damit arbeiten kann mit Xcode und dem Storyboard.
    Dann kann ich mich damit auseinandersetzen es so probieren und studieren wie es mir möglich ist und wenn ich dann noch fragen habe die ich durch eigene Recherche nicht lösen kann würde ich wieder fragen.

    Ich habe Eigeninitiative im Vorfeld meiner Frage anhand von Internetrecherche bereits getätigt doch diese führte aus den oben angegebenen Gründen nicht zum Erfolg.
    Ich finde es etwas schade das ich in einem Internetforum, so scheint es mir gerade, erst einmal meine äussert persönlichen Defizite aufführen muss um nach Hilfe zu fragen. Es sind, auch wenn es so scheinen mag, nicht alle Menschen gleich.

    Ich bedanke mich im Voraus für die Hilfe,
  • tjost1975 schrieb:

    Im Sinne der Gleichstellung wünsche ich mir das man das berücksichtigt ...
    Das kann und möchte ich so nicht stehen lassen:

    Deine persönliche Situation kann uns - im speziellen mir - nicht bekannt gewesen sein. Nach den Recherche-Hinweisen von @matz reagierst Du nicht mit "Englisch ist ein Problem", sondern mit einem Pseudo-Argument, das einfach unwahr ist: Der Artikel adressierte durchaus macOS. Unter diesen Umständen und mit dem gegebenen Kontext stehe ich zu meiner Reaktion, von Dir mehr Eigeninitiative zu fordern.

    Dass Du nun die Gleichstellungskarte ziehst, empfinde ich als unangemessen: Ohne dass die ursächlichen Gründe eine Rolle spielen, wirst Du ohne Englisch verstehen zu können und ohne eine Programmiersprache zu können, keine Applikation entwickeln können. Auch wenn Apple sich Mühe gibt, anderes zu suggerieren: App-Entwicklung erfordert Programmieren und dessen Dokumentation ist vorrangig englischsprachig. Das mag man bedauern oder nicht, es ist eine Tatsache.

    Wenn sich nun jemand findet, der Dir den gewünschten Code kopierfertig liefert, gut. Aber mit Gleichstellung hat das nichts zu tun.

    Angesäuert, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    tjost1975 schrieb:

    Im Sinne der Gleichstellung wünsche ich mir das man das berücksichtigt ...
    Das kann und möchte ich so nicht stehen lassen:
    Deine persönliche Situation kann uns - im speziellen mir - nicht bekannt gewesen sein. Nach den Recherche-Hinweisen von @matz reagierst Du nicht mit "Englisch ist ein Problem", sondern mit einem Pseudo-Argument, das einfach unwahr ist: Der Artikel adressierte durchaus macOS. Unter diesen Umständen und mit dem gegebenen Kontext stehe ich zu meiner Reaktion, von Dir mehr Eigeninitiative zu fordern.

    Dass Du nun die Gleichstellungskarte ziehst, empfinde ich als unangemessen: Ohne dass die ursächlichen Gründe eine Rolle spielen, wirst Du ohne Englisch verstehen zu können und ohne eine Programmiersprache zu können, keine Applikation entwickeln können. Auch wenn Apple sich Mühe gibt, anderes zu suggerieren: App-Entwicklung erfordert Programmieren und dessen Dokumentation ist vorrangig englischsprachig. Das mag man bedauern oder nicht, es ist eine Tatsache.

    Wenn sich nun jemand findet, der Dir den gewünschten Code kopierfertig liefert, gut. Aber mit Gleichstellung hat das nichts zu tun.

    Angesäuert, Mattes
    Mattes,

    lass uns nicht streiten, jeder Mensch hat seine Defizite, was Du geschafft hast ist mich wütend zu machen und das schein geholfen zu haben

    ich habe das gefunden


    Quellcode

    1. let task = Process() - damit öffne ich einen Task
    2. task.launchPath = "/usr/sbin/sysctl" - müsste ich hier mein Tool angeben? Also in meinem Fall task.launchPath = "/usr/local/bin/d64copy"
    3. task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"] - hier kommen dann die Argumente rein? z.B. task.arguments = ["image.d64", "8"]let pipe = NSPipe()task.standardOutput = pipetask.standardError = pipetask.launch()
    4. task.waitUntilExit()
    5. let data = pipe.fileHandleForReading.readDataToEndOfFile()
    6. let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
    und kann ich das so als Beispiel so in mein IBAction einfügen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tjost1975 ()

  • Mach' es doch einfach einmal ... inklusive der verschiedenen Zeilenumbrüche, die wohl dem Kopieren zum Opfer gefallen sind. Wenn Du dann Fehler bekommst, nenn' bitte die entsprechenden Meldungen aus der Konsole. Damit lässt sich meistens weiter arbeiten.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes ()

  • Himmel ist das ein Durcheinander,

    Also mit dem was ich da gefunden habe bekomme ich viele Fehler.
    Dann habe ich genau das gefunden was ich mir dachte, das Zauberwort ist "Process" danach etwas gesucht und was gefunden.

    Ich habe dann " Process.launchedProcess(launchPath: "/usr/local/bin/cbmctrl", arguments: ["dir","8"]) " genommen und nur Fehler in der Konsole bekommen.
    launch path not accessible und not permitted bis ich dann gefunden habe das man in der entitlements datei das Sandbox auf Null stellen muss.

    Aber so hatte ich mir das vorgestellt, nun muss ich nur noch rausfinden wie ich das Ergebnis in einem kleinen Fenster anzeigen kann.
  • tjost1975 schrieb:

    Dann habe ich genau das gefunden was ich mir dachte, das Zauberwort ist "Process" danach etwas gesucht und was gefunden.
    Ok. Dann muss ich zukünftig Process als Process noch gebauer beschreiben. :S



    tjost1975 schrieb:

    Um es klar zu erbitten bräuchte ich einmal aufgeschrieben wie das IBAction aussehen müsste bitte.

    tjost1975 schrieb:

    Ich frage in keinster Weise danach das mit jemand meinen Code komplett schreiben soll.
    Ok. Dann verstehe ich beide Aussagen gegeneinander wohl vollkommen falsch. :S

    tjost1975 schrieb:

    Es sind, auch wenn es so scheinen mag, nicht alle Menschen gleich.
    Wow, da schwillt mir der Kamm.
  • ok. hier mal mein Code bisher.

    Quellcode

    1. //
    2. // ViewController.swift
    3. // OpenCBM
    4. //
    5. // Created by Marco Raap on 19.03.21.
    6. // Copyright © 2021 Marco Raap. All rights reserved.
    7. //
    8. import Cocoa
    9. import Foundation
    10. class ViewController: NSViewController {
    11. override func viewDidLoad() {
    12. super.viewDidLoad()
    13. // Do any additional setup after loading the view.
    14. }
    15. override var representedObject: Any? {
    16. didSet {
    17. // Update the view, if already loaded.
    18. }
    19. }
    20. func status(){
    21. let probeTask: Process = Process()
    22. probeTask.launchPath = "/usr/local/bin/cbmctrl"
    23. probeTask.arguments = ["status", "8"]
    24. probeTask.standardInput = FileHandle.nullDevice
    25. let outputPipe = Pipe()
    26. probeTask.standardOutput = outputPipe
    27. probeTask.launch()
    28. probeTask.waitUntilExit()
    29. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    30. let output = String(data:data, encoding: .utf8)!
    31. print(output)
    32. OutPut.stringValue = output
    33. }
    34. func format(){
    35. let probeTask: Process = Process()
    36. probeTask.launchPath = "/usr/local/bin/cbmformat"
    37. probeTask.arguments = ["-p", "-s", "8", "empty,88"]
    38. probeTask.standardInput = FileHandle.nullDevice
    39. let outputPipe = Pipe()
    40. probeTask.standardOutput = outputPipe
    41. probeTask.launch()
    42. //probeTask.waitUntilExit()
    43. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    44. let output = String(data:data, encoding: .utf8)!
    45. print(output)
    46. OutPut.stringValue = output
    47. }
    48. func directory(){
    49. let probeTask: Process = Process()
    50. probeTask.launchPath = "/usr/local/bin/cbmctrl"
    51. probeTask.arguments = ["dir", "8"]
    52. probeTask.standardInput = FileHandle.nullDevice
    53. let outputPipe = Pipe()
    54. probeTask.standardOutput = outputPipe
    55. probeTask.launch()
    56. //probeTask.waitUntilExit()
    57. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    58. let output = String(data:data, encoding: .utf8)!
    59. print(output)
    60. OutPut.stringValue = output
    61. }
    62. @IBOutlet weak var OutPut: NSTextField!
    63. @IBAction func Directory(_ sender: Any) {
    64. directory()
    65. }
    66. @IBAction func FormatiereDiskette(_ sender: Any) {
    67. format()
    68. }
    69. @IBAction func StatusKnopf(_ sender: Any) {
    70. status()
    71. }
    72. }
    Alles anzeigen
    ich kann also die Grundfunktionen nutzen und ich bekomme eine Ausgabe in ein Textfeld.

    nun würde ich gerne versuchen ein argument über die eingäbe eines Textfeldes als String einzufügen. Ich finde nichts im Internet was ansatzweise meiner Vorstellung entspricht.
    wie bekomme ich das Wort im NSTextField als String ausgegeben?
    so das ich das z.B. so einsetzen kann : probeTask.arguments = ["-p", "-s", "8", Textfeld.string,",88"]
  • probeTask.arguments = ["-p", "-s", "8", Textfeld.string,",88"]
    ist schon fast richtig. Wenn du Xcode verwendest, bekommst du bei der Eingabe Vorschläge, welche
    Eigenschaften oder Methoden du verwenden könntest. Wenn Textfeld ein NSTextField ist, wird Xcode
    dir bei Eingabe von Textfeld.string vorschlagen, Textfeld.stringValue zu verwenden. Das ist in dem
    Fall das Richtige. Der Vorschlag wird meist um eine Beschreibung ergänzt, der du dann entnehmen
    musst, ob das wirklich passt.
  • marcoo schrieb:

    probeTask.arguments = ["-p", "-s", "8", Textfeld.string,",88"]
    ist schon fast richtig. Wenn du Xcode verwendest, bekommst du bei der Eingabe Vorschläge, welche
    Eigenschaften oder Methoden du verwenden könntest. Wenn Textfeld ein NSTextField ist, wird Xcode
    dir bei Eingabe von Textfeld.string vorschlagen, Textfeld.stringValue zu verwenden. Das ist in dem
    Fall das Richtige. Der Vorschlag wird meist um eine Beschreibung ergänzt, der du dann entnehmen
    musst, ob das wirklich passt.
    Hallo Marcoo,

    danke. ich habe jetzt schon eine menge geschafft.
    Auch das mit dem stringValue habe ich so hinbekommen.
    Unaufgeräumt und ein Quick&Dirty aber soweit geht alles.


    Quellcode

    1. //
    2. // ViewController.swift
    3. // OpenCBM
    4. //
    5. // Created by Marco Raap on 19.03.21.
    6. // Copyright © 2021 Marco Raap. All rights reserved.
    7. //
    8. import Cocoa
    9. import Foundation
    10. class ViewController: NSViewController {
    11. override func viewDidLoad() {
    12. super.viewDidLoad()
    13. // Do any additional setup after loading the view.
    14. }
    15. override var representedObject: Any? {
    16. didSet {
    17. // Update the view, if already loaded.
    18. }
    19. }
    20. func status(){
    21. let probeTask: Process = Process()
    22. probeTask.launchPath = "/usr/local/bin/cbmctrl"
    23. probeTask.arguments = ["status", "8"]
    24. probeTask.standardInput = FileHandle.nullDevice
    25. let outputPipe = Pipe()
    26. probeTask.standardOutput = outputPipe
    27. probeTask.launch()
    28. probeTask.waitUntilExit()
    29. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    30. let output = String(data:data, encoding: .utf8)!
    31. print(output)
    32. OutPut.stringValue = output
    33. }
    34. let homePath = NSHomeDirectory()
    35. let d64Name = "notFound"
    36. let prgName = "notFound"
    37. func copyprg2Disk(){
    38. print("function copy prg 2 floppy")
    39. let prgName = prgName2disk.stringValue
    40. print(prgName)
    41. let probeTask: Process = Process()
    42. probeTask.launchPath = "/usr/local/bin/cbmcopy"
    43. probeTask.arguments = [ "-w", "8", "\(homePath)/c64/" + prgName]
    44. probeTask.standardInput = FileHandle.nullDevice
    45. let outputPipe = Pipe()
    46. probeTask.standardOutput = outputPipe
    47. probeTask.launch()
    48. //probeTask.waitUntilExit()
    49. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    50. let output = String(data:data, encoding: .utf8)!
    51. print(output)
    52. OutPut.stringValue = output
    53. self.prgName2disk.stringValue = ""
    54. directory()
    55. }
    56. func copyFloppy2prg(){
    57. print("function copy floppy 2 prg")
    58. let prgName = Floppy2prgName.stringValue
    59. print(prgName)
    60. let probeTask: Process = Process()
    61. probeTask.launchPath = "/usr/local/bin/cbmcopy"
    62. probeTask.arguments = [ "-r", "8", "\(prgName)", "-o","\(prgName)"]
    63. probeTask.standardInput = FileHandle.nullDevice
    64. let outputPipe = Pipe()
    65. probeTask.standardOutput = outputPipe
    66. probeTask.launch()
    67. //probeTask.waitUntilExit()
    68. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    69. let output = String(data:data, encoding: .utf8)!
    70. print(output)
    71. OutPut.stringValue = output
    72. self.Floppy2prgName.stringValue = ""
    73. directory()
    74. }
    75. func copyFloppy2d64(){
    76. print(homePath)
    77. print("function Floppy2d64")
    78. let d64Name = Floppy2d64Name.stringValue
    79. let probeTask: Process = Process()
    80. probeTask.launchPath = "/usr/local/bin/d64copy"
    81. probeTask.arguments = ["8", "\(homePath)/c64/" + d64Name + ".d64"]
    82. probeTask.standardInput = FileHandle.nullDevice
    83. let outputPipe = Pipe()
    84. probeTask.standardOutput = outputPipe
    85. probeTask.launch()
    86. //probeTask.waitUntilExit()
    87. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    88. let output = String(data:data, encoding: .utf8)!
    89. print(output)
    90. OutPut.stringValue = output
    91. self.Floppy2d64Name.stringValue = ""
    92. directory()
    93. }
    94. func copy2Floppy(){
    95. print(homePath)
    96. print("function d64Copy2Mac")
    97. let d64Name = d64Name2Disk.stringValue
    98. if (d64Name.isEmpty){
    99. print(d64Name)
    100. }
    101. let probeTask: Process = Process()
    102. probeTask.launchPath = "/usr/local/bin/d64copy"
    103. probeTask.arguments = ["-n", "\(homePath)/c64/" + d64Name + ".d64", "8" ]
    104. probeTask.standardInput = FileHandle.nullDevice
    105. let outputPipe = Pipe()
    106. probeTask.standardOutput = outputPipe
    107. probeTask.launch()
    108. //probeTask.waitUntilExit()
    109. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    110. let output = String(data:data, encoding: .utf8)!
    111. print(output)
    112. OutPut.stringValue = output
    113. self.d64Name2Disk.stringValue = ""
    114. directory()
    115. }
    116. func format(){
    117. let name = DiskName.stringValue
    118. let number = DiskNumber.stringValue
    119. print (name , number)
    120. let probeTask: Process = Process()
    121. probeTask.launchPath = "/usr/local/bin/cbmformat"
    122. probeTask.arguments = ["-p", "-s", "8", "\(name),\(number)"]
    123. probeTask.standardInput = FileHandle.nullDevice
    124. let outputPipe = Pipe()
    125. probeTask.standardOutput = outputPipe
    126. probeTask.launch()
    127. //probeTask.waitUntilExit()
    128. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    129. let output = String(data:data, encoding: .utf8)!
    130. print(output)
    131. OutPut.stringValue = output
    132. directory()
    133. }
    134. func directory(){
    135. let probeTask: Process = Process()
    136. probeTask.launchPath = "/usr/local/bin/cbmctrl"
    137. probeTask.arguments = ["dir", "8"]
    138. probeTask.standardInput = FileHandle.nullDevice
    139. let outputPipe = Pipe()
    140. probeTask.standardOutput = outputPipe
    141. probeTask.launch()
    142. //probeTask.waitUntilExit()
    143. let data = (probeTask.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile()
    144. let output = String(data:data, encoding: .utf8)!
    145. print(output)
    146. OutPut.stringValue = output
    147. }
    148. @IBOutlet weak var OutPut: NSTextField!
    149. @IBOutlet weak var Floppy2prgName: NSTextField!
    150. @IBOutlet weak var Floppy2d64Name: NSTextField!
    151. @IBOutlet weak var prgName2disk: NSTextField!
    152. @IBOutlet weak var d64Name2Disk: NSTextField!
    153. @IBOutlet weak var DiskName: NSTextField!
    154. @IBOutlet weak var DiskNumber: NSTextField!
    155. @IBAction func copyprg2Floppy(_ sender: Any) {
    156. copyprg2Disk()
    157. }
    158. @IBAction func Floppy2d64(_ sender: Any) {
    159. copyFloppy2d64()
    160. }
    161. @IBAction func d64Copy2Floppy(_ sender: Any) {
    162. print("d64copy")
    163. copy2Floppy()
    164. }
    165. @IBAction func Floppy2prg(_ sender: Any) {
    166. copyFloppy2prg()
    167. }
    168. @IBAction func Directory(_ sender: Any) {
    169. print("click directory")
    170. directory()
    171. }
    172. @IBAction func FormatiereDiskette(_ sender: Any) {
    173. format()
    174. }
    175. @IBAction func StatusKnopf(_ sender: Any) {
    176. status()
    177. }
    178. }
    Alles anzeigen
    Ich würde jetzt gerne eine Directoy angeben in der das Programm quasi arbeiten soll.
    Das Problem ist das ich bei einem Befehl keine target directory angeben kann.

    So einfach zu lösen. probeTask.currentDirectoryPath = "\(homePath)/c64" und schon speichert er da wo ich das gerne möchte.

    Und ich hadere noch sehr stark am Drag&Drop.

    wann immer ich etwas in Internet finde ist es so kompliziert beschrieben das ich es nicht mit dem was ich machen möchte verbinden kann, im Kopf
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tjost1975 ()

  • Schön, dass du voran kommst.

    Ich würde jetzt tatsächlich erstmal ein wenig aufräumen: der Code in directory taucht fast genau so
    an mind. 6 Stellen auf. Der einzige Unterschied, der mir auffiel ist das Setzen von launchPath und arguments.
    Daher bietet sich eine Methode an, der du das als Argumente übergibst. Ich habe im folgenden Code
    auch die von dir immer angelegte aber nicht verwendete Variable outputPipe genutzt, um die Zeile zum
    Lesen der Daten kürzer zu machen. Du müsstest deinen Code um mindestens 50 Zeilen verkürzen können.

    Quellcode

    1. func directory(){
    2. runCommand("/usr/local/bin/cbmctrl", with: ["dir", "8"])
    3. }
    4. func runCommand(_ command: String, with arguments: [String]) {
    5. let probeTask: Process = Process()
    6. probeTask.launchPath = command
    7. probeTask.arguments = arguments
    8. probeTask.standardInput = FileHandle.nullDevice
    9. let outputPipe = Pipe()
    10. probeTask.standardOutput = outputPipe
    11. probeTask.launch()
    12. //probeTask.waitUntilExit()
    13. let data = outputPipe.fileHandleForReading.readDataToEndOfFile()
    14. let output = String(data:data, encoding: .utf8)!
    15. print(output)
    16. OutPut.stringValue = output
    17. }
    Alles anzeigen
    Du kannst runCommand bei Bedarf um weitere Parameter erweitern, um z.B. optional waitUntilExit aufzurufen.
  • Danke Marcoo,

    das Zusammenfügen von Funktionen ist gar nicht so verkehrt.
    Ich habe das mal nach besten Wissen und Gewissen komplett neu gemacht und auch um einige Funktionen erweitert.
    Es ist so schwer etwas zu suchen im Netz wenn man keinen Plan hat wie das heißt wonach man suchen soll :)
    Aber ich habe mir meine If schleifen einfach zusammen gereimt und siehe da es funktioniert. Ich bin schon zufrieden.

    Brainfuck-Quellcode

    1. //
    2. // ViewController.swift
    3. // OpenCBM helper
    4. //
    5. // Created by Marco Raap on 31.03.21.
    6. //
    7. import Cocoa
    8. import CoreFoundation
    9. class ViewController: NSViewController {
    10. override func viewDidLoad() {
    11. super.viewDidLoad()
    12. // Do any additional setup after loading the view.
    13. }
    14. override var representedObject: Any? {
    15. didSet {
    16. // Update the view, if already loaded.
    17. }
    18. }
    19. //-------------- deklarationen
    20. var checkBTN: String?
    21. let dir = "Your chosen Directory"
    22. let d64 = "Your d64 File"
    23. let prg = "Your prg File"
    24. let path = NSHomeDirectory()
    25. //--------Knöpfe
    26. @IBAction func d64DateiAuswahl(_ sender: Any) {
    27. }
    28. @IBAction func prgDateiAuswahl(_ sender: Any) {
    29. }
    30. @IBAction func OrdnerAuswahl(_ sender: Any) {
    31. Dateiauswahl(Datei: false, Mehrfachauswahl: false, Ordnerauswahl: true, Ordnererstellen: true)
    32. }
    33. //--------Knöpfe start funktion
    34. @IBAction func StatusFloppy(_ sender: Any) {
    35. StatusderFloppy()
    36. Thread.sleep(forTimeInterval: 1)
    37. }
    38. @IBAction func DirectoryFloppy(_ sender: Any) {
    39. DirectoyderFloppy()
    40. Thread.sleep(forTimeInterval: 1)
    41. }
    42. @IBAction func d64Copy2Floppy(_ sender: Any) {
    43. Dateiauswahl(Datei: true, Mehrfachauswahl: false, Ordnerauswahl: false, Ordnererstellen: false)
    44. }
    45. @IBAction func FloppyCopy(_ sender: Any) {
    46. KopiereAufRealFloppy()
    47. }
    48. @IBAction func FormatFloppy(_ sender: Any) {
    49. FormatieredieFloppy()
    50. }
    51. //-----------Bilder
    52. @IBOutlet weak var DriveImage: NSImageView!
    53. //-----------Textfelder
    54. @IBOutlet weak var OutPut: NSTextField!
    55. @IBOutlet weak var DiskName: NSTextField!
    56. @IBOutlet weak var DiskNummer: NSTextField!
    57. @IBOutlet weak var DateiauswahlName: NSTextField!
    58. @IBOutlet weak var DirectoryName: NSTextField!
    59. @IBOutlet weak var Floppy2d64Name: NSTextField!
    60. //-----------Functionen
    61. //---- Dateiauswahl
    62. func Dateiauswahl(Datei:Bool, Mehrfachauswahl:Bool, Ordnerauswahl:Bool, Ordnererstellen:Bool){
    63. let openPanel = NSOpenPanel()
    64. openPanel.canChooseFiles = Datei
    65. openPanel.allowsMultipleSelection = Mehrfachauswahl
    66. openPanel.canChooseDirectories = Ordnerauswahl
    67. openPanel.canCreateDirectories = Ordnererstellen
    68. openPanel.allowedFileTypes = ["prg","d64"];
    69. openPanel.title = "Select a folder"
    70. openPanel.beginSheetModal(for:self.view.window!) { (response) in
    71. if response.rawValue == NSApplication.ModalResponse.OK.rawValue {
    72. let selectedPath = openPanel.url!.path
    73. // do whatever you what with the file path
    74. //let chosenDir:String? = selectedPath
    75. self.DateiauswahlName.stringValue = selectedPath
    76. let fileName: String = selectedPath
    77. let fileExtension = (fileName as NSString).pathExtension
    78. print(fileExtension)
    79. if fileExtension == "prg"{
    80. openPanel.close()
    81. sleep(2)
    82. self.KopiereprgaufFloppy()
    83. print(selectedPath)
    84. self.DirectoyderFloppy()
    85. }else if fileExtension == "d64"{
    86. openPanel.close()
    87. sleep(2)
    88. self.Kopiered64aufFloppy()
    89. print(selectedPath)
    90. self.DirectoyderFloppy()
    91. }else if Ordnererstellen == true{
    92. self.DirectoryName.stringValue = selectedPath
    93. }
    94. print("done")
    95. }
    96. openPanel.close()
    97. }
    98. }
    99. //------ Save Panel
    100. //------- Funktion auf Floppy kopieren
    101. func runCommandCopy2Floppy(_ command: String, with arguments: [String]){
    102. print("run Command")
    103. self.DriveImage.image = NSImage(named: "DiskDriveBusy.png")
    104. let probeTask: Process = Process()
    105. probeTask.launchPath = command
    106. probeTask.arguments = arguments
    107. probeTask.standardInput = FileHandle.nullDevice
    108. let outputPipe = Pipe()
    109. probeTask.standardOutput = outputPipe
    110. probeTask.launch()
    111. probeTask.waitUntilExit()
    112. let data = outputPipe.fileHandleForReading.readDataToEndOfFile()
    113. let output = String(data:data, encoding: .utf8)!
    114. OutPut.stringValue = output
    115. print(output)
    116. self.DriveImage.image = NSImage(named: "DiskDriveOn.png")
    117. }
    118. func runCommandCopyFromFloppy(_ command: String, with arguments: [String]){
    119. let dir = DirectoryName.stringValue
    120. print("run Command")
    121. self.DriveImage.image = NSImage(named: "DiskDriveBusy.png")
    122. let probeTask: Process = Process()
    123. probeTask.launchPath = command
    124. probeTask.arguments = arguments
    125. probeTask.currentDirectoryPath = "\(dir)/"
    126. probeTask.standardInput = FileHandle.nullDevice
    127. let outputPipe = Pipe()
    128. probeTask.standardOutput = outputPipe
    129. probeTask.launch()
    130. probeTask.waitUntilExit()
    131. let data = outputPipe.fileHandleForReading.readDataToEndOfFile()
    132. let output = String(data:data, encoding: .utf8)!
    133. OutPut.stringValue = output
    134. print(output)
    135. self.DriveImage.image = NSImage(named: "DiskDriveOn.png")
    136. }
    137. //---------Aufruf der Terminal Commandos
    138. func Kopiered64aufFloppy(){
    139. let d64Name = DateiauswahlName.stringValue
    140. runCommandCopy2Floppy("/usr/local/bin/d64copy", with: ["-n", "\(d64Name)", "8"])
    141. }
    142. func KopiereprgaufFloppy(){
    143. let prgName = DateiauswahlName.stringValue
    144. runCommandCopy2Floppy("/usr/local/bin/cbmcopy", with: ["-w", "8", "\(prgName)"])
    145. }
    146. func StatusderFloppy(){
    147. runCommandCopy2Floppy("/usr/local/bin/cbmctrl", with: ["status", "8"])
    148. }
    149. func DirectoyderFloppy(){
    150. let info = "Read Directory from Floppy"
    151. self.OutPut.stringValue = info
    152. runCommandCopy2Floppy("/usr/local/bin/cbmctrl", with: ["dir", "8"])
    153. }
    154. func FormatieredieFloppy(){
    155. self.DriveImage.image = NSImage(named: "DiskDriveBusy.png")
    156. let info = "Format Disk in Floppy Drive"
    157. OutPut.stringValue = info
    158. let name = DiskName.stringValue
    159. let number = DiskNummer.stringValue
    160. runCommandCopy2Floppy("/usr/local/bin/cbmformat", with: ["-p", "-s", "8", "\(name),\(number)"])
    161. }
    162. func KopiereAufRealFloppy(){
    163. if DirectoryName.stringValue == "Target Directoy"{
    164. print("geprüft nix drin")
    165. let alert = NSAlert()
    166. alert.messageText = "No Target Directoy"
    167. alert.informativeText = "Select a Target Directoy First"
    168. alert.beginSheetModal(for: self.view.window!) { (response) in}
    169. }else{
    170. print("dateierweiterung")
    171. let fileName: String = Floppy2d64Name.stringValue
    172. let fileExtension = (fileName as NSString).pathExtension
    173. print(fileExtension)
    174. if fileExtension == "d64"{
    175. print("Kopiere d64 auf Festplatte")
    176. let info = "Copy Image from Floppy to Target Drive"
    177. OutPut.stringValue = info
    178. let name = Floppy2d64Name.stringValue
    179. runCommandCopyFromFloppy("/usr/local/bin/d64copy", with: ["8", name])
    180. }else{
    181. print("keine Dateierweiterung")
    182. let info = "Copy Programfile from Floppy to Target Drive"
    183. OutPut.stringValue = info
    184. let name = Floppy2d64Name.stringValue
    185. runCommandCopyFromFloppy("/usr/local/bin/cbmcopy", with: ["-r", "8", "\(name)"])
    186. }
    187. }
    188. }
    189. }
    Alles anzeigen
    Video-Demo
  • hallo,

    ich habe ein neues Problem welches ich nicht lösen kann.
    Ich habe mir CheckBoxen erstellt und ich schaffe auch die Veränderung zu bekommen.
    nun möchte ich die Argumente erweitern je nachdem welche der Boxen ausgewählt sind.

    hier mal meine Kopier Funktion:

    Quellcode

    1. func Kopiered64aufFloppy(){
    2. let info = "Copy Disk Image to Floppy"
    3. self.OutPut.stringValue = info
    4. let d64Name = DateiauswahlName.stringValue
    5. let argument = "--transfer=auto"
    6. runCommandCopy2Floppy("/usr/local/bin/d64copy", with: ["\(argument)", "\(d64Name)", "8"])
    7. }
    hier meine Box Abfrage

    Quellcode

    1. func checkCheckBox(){
    2. if WarpBox.state == .on{
    3. print("Warp an")
    4. }else{
    5. print("Warp aus")
    6. }
    7. if BumBox.state == .on{
    8. print("bum an")
    9. }else{
    10. print("bum aus")
    11. }
    12. if Drive1571Box.state == .on{
    13. print("1571 an")
    14. self.TwoSidedBox.isHidden = false
    15. }else{
    16. print("1571 aus")
    17. self.TwoSidedBox.isHidden = true
    18. }
    19. if TwoSidedBox.state == .on{
    20. print("2 side an")
    21. }else{
    22. print("2 side aus")
    23. }
    24. }
    Alles anzeigen
    Wie kann ich jetzt den Status der Checkboxen nach dem Durchlauf so weiter geben das ich wenn zum Beispiel die WarpBox den State .on hat und die Drive1571Box den State .on hat die anderen aber nicht nur die Werte die in dem Argument hinzufügen möchte hinzugefügt werden...

    ansonsten bin ich schon echt weit gekommen.
    Die grüne Lampen leuchtet wenn eine Funktion ausgeführt wird.
    Ich kann die Datei auswählen und die wird je nachdem was es für eine Datei ist speziell kopiert. oder gespeichert. u.s.w

    Danke
    Dateien
  • Das ist leider recht ungenau beschrieben.
    Prinzipiell müsstest du dir beim Aufruf von runCommandCopy2Floppy überlegen, welche Schalter relevant sind.
    Für jede mögliche Kombination verwendest du einen passenden Aufruf der Methode. Im Folgenden nur für WarpBox:

    Quellcode

    1. if WarpBox.state == .on{
    2. runCommandCopy2Floppy("/usr/local/bin/d64copy", with: ["\(argument)", "\(d64Name)", "8", "warp", "now"])
    3. }else{
    4. runCommandCopy2Floppy("/usr/local/bin/d64copy", with: ["\(argument)", "\(d64Name)", "8", "pulse"])
    5. }
    Wenn du den kompletten Code vor dir hast, fällt dir bestimmt auf, wie du das wieder vereinfachen kannst.
    Mit der passenden Vorstellung von deinem Ziel kann man vermutlich auch direkt auf eine kompakte Lösung
    kommen, aber dafür ist die Beschreibung eben zu ungenau. Versuche etwas genauer dein Ziel und dein
    Problem zu beschreiben.

    Ich habe den Eindruck, dass dir meist gar nicht so viel fehlt. Sichere dir den Code, so wie er funktioniert,
    damit du Tests ggf. verwerfen kannst, und probiere einfach einige Varianten, von denen du vermutest,
    dass sie in die richtige Richtung gehen. Ich stelle viele Fragen meist gar nicht im Forum, weil mir beim
    Schreiben eine neue Idee kommt und ich dann vorher eine Lösung finde. Schau mal bei Wikipedia nach
    Quietscheentchen-Debugging.
  • Ja, scheint so schwer zu sein mich zu verstehen wie ich es finde es zu beschreiben.

    Die Idee hatte ich auch schon, mein Problem dabei ist folgendes, es sind 4 Checkboxen, zur Vereinfachung nenne ich sie A B C D
    mögliche Zustände.
    oder
    A - an. A - aus
    B - aus. B - an
    C - an. C- aus
    D - aus. D- aus u.s.w.
    kurz es sind 4 mal 4 verschiedene Kombinationen möglich.

    Ich bräuchte also eine Funktion die einmal die 4 Schalter prüft, ein einen String erstellt der nur die Werte beinhaltet wenn eine Box an.