Devilmarkus Geschrieben 30. März 2008 Geschrieben 30. März 2008 Hallo, ich möchte in einen Emulator "Autotype" implementieren. Dazu möchte ich einen String auslesen und ihn in die einzelnen Buchstaben / Zeichen zerlegen. Diese einzelnen Buchstaben sollen dann in KeyEvents umgewandelt werden. Das Problem, was sich mir auch noch bietet ist, dass die Tastaturabfrage im gegensatz zur emulierten CPU recht träge reagiert und man so die CPU erst 20.000x "cyclen" lassen muss, bevor man die nächste Taste drücken kann. Ein Beispiel, wo ich schonmal kleinere Befehle auf den Computer übertrage, habe ich (verkürzt) hier mal als Code: public int attyper = 0; public int cattyper = 0; public int cpmtyper = 0; public int rdtyper = 0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void cycle() { this.gateArray.cycle(); this.fdc.cycle(); if ((this.audioCount += this.audioAdd / Switches.turbo) >= AUDIO_TEST) { this.psg.writeAudio(); this.audioCount -= AUDIO_TEST; } if (attyper !=0){ attyper++; if (attyper == 20000){ keyboarda.keyReleased(KeyEvent.VK_OPEN_BRACKET); attyper = 0; } } if (cpmtyper !=0){ cpmtyper++; if (cpmtyper == 20000){ keyboarda.keyReleased(KeyEvent.VK_OPEN_BRACKET); keyboarda.keyPressed(KeyEvent.VK_C); } if (cpmtyper == 40000){ keyboarda.keyReleased(KeyEvent.VK_C); keyboarda.keyPressed(KeyEvent.VK_P); } if (cpmtyper == 60000){ keyboarda.keyReleased(KeyEvent.VK_P); keyboarda.keyPressed(KeyEvent.VK_M); } if (cpmtyper == 80000){ keyboarda.keyReleased(KeyEvent.VK_M); keyboarda.keyPressed(KeyEvent.VK_ENTER); } if (cpmtyper == 100000){ keyboarda.keyReleased(KeyEvent.VK_ENTER); keyboarda.keyReleased(KeyEvent.VK_SHIFT); cpmtyper = 0; } } if (rdtyper !=0){ rdtyper++; if (rdtyper == 20000){ keyboarda.keyReleased(KeyEvent.VK_R); keyboarda.keyPressed(KeyEvent.VK_U); } if (rdtyper == 40000){ keyboarda.keyReleased(KeyEvent.VK_U); keyboarda.keyPressed(KeyEvent.VK_N); } if (rdtyper == 60000){ keyboarda.keyReleased(KeyEvent.VK_N); keyboarda.keyPressed(KeyEvent.VK_2); } if (rdtyper == 80000){ keyboarda.keyReleased(KeyEvent.VK_2); keyboarda.keyReleased(KeyEvent.VK_SHIFT); rdtyper = 0; } } if (cattyper !=0){ cattyper++; if (cattyper == 20000){ keyboarda.keyReleased(KeyEvent.VK_C); keyboarda.keyPressed(KeyEvent.VK_A); } if (cattyper == 40000){ keyboarda.keyReleased(KeyEvent.VK_A); keyboarda.keyPressed(KeyEvent.VK_T); } if (cattyper == 60000){ keyboarda.keyReleased(KeyEvent.VK_T); keyboarda.keyPressed(KeyEvent.VK_ENTER); } if (cattyper == 80000){ keyboarda.keyReleased(KeyEvent.VK_ENTER); keyboarda.keyReleased(KeyEvent.VK_SHIFT); cattyper = 0; } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void AtKey(){ this.keyboarda.keyPressed(KeyEvent.VK_OPEN_BRACKET); attyper = 1; } public void typeCat(){ this.keyboarda.keyPressed(KeyEvent.VK_SHIFT); this.keyboarda.keyPressed(KeyEvent.VK_C); cattyper = 1; } public void typeRun(){ this.keyboarda.keyPressed(KeyEvent.VK_SHIFT); this.keyboarda.keyPressed(KeyEvent.VK_R); rdtyper = 1; } public void bootCPM(){ this.keyboarda.keyPressed(KeyEvent.VK_SHIFT); this.keyboarda.keyPressed(KeyEvent.VK_OPEN_BRACKET); cpmtyper = 1; } cycle() läuft also ständig und dort kann man einen Timer ansetzen. Die 4 Befehle danach stellen 4 verschiedene "automatische" Keyboard - Eingaben dar. Mein Ziel ist es, einen String festzulegen, diesen in die einzelnen Buchstaben zu zerlegen und diese als Tastenkette an den Computer weiterzugeben. Bitte helft mir!!!!!!!!!!!!!!!! Gruss, Markus Zitieren
geloescht_Newlukai Geschrieben 31. März 2008 Geschrieben 31. März 2008 Du müßtest den String in ein Array aus VK_-Werten umwandeln. Dann kannst Du so: if (cpmtyper !=0){ cpmtyper++; if (cpmtyper % 20000 == 0) { keyboarda.keyReleased(eventArray[cpmtyper/20000 - 1]); keyboarda.keyPressed(eventArray[cpmtyper/20000 - 1]); } } die Befehle ausführen. Wie Du allerdings am geschicktesten den String in VK_-Events umwandelst, weiß ich auch nicht, sorry. Im Prinzip läuft es allerdings so: String cmd = "RUN\n"; int[] eventArray = new int[cmd.length()]; for(int i = 0; i < cmd.length(); i++) { eventArray[i] = convertCharToVK(cmd.charAt(i)); } Ich weiß nicht, ob in irgendeiner Bibliothek (oder gar in der Java API) solch eine Konvertierung existiert. Notfalls müßte man sie halt selbst schreiben, wobei man da eben nochmal die Spezialfälle wie Steuerzeichen überprüfen sollte. Zitieren
Devilmarkus Geschrieben 31. März 2008 Autor Geschrieben 31. März 2008 Hi Newlukai, leider funktioniert Dein Vorschlag nicht. Er fragt nach convertCharToVK (ist nicht definiert) Und er schreibt, dass incompatible types gefunden wurden. (Required int, found convertCharToVK) Trotzdem danke für Deine Mühe. Vielleicht gibt es ja noch eine andere Lösung... (Die For-Schleife im cycle() ist auf jeden Fall ein guter Ansatz) Gruss, Markus Edit: Hier könnt Ihr das Applet mal als Webstart-Application testen: popup Die 4 Knöpfe oben rechts dienen der automatischen Befehlseingabe... Ziel ist, soetwas aus einem Parameter lesen zu können, und z.B. nach dem Start ein RUN"DISC" ausführen zu können. Den kompletten Source-Code gibt es für interessierte hier: SourceForge.net: JavaCPC - Amstrad CPC emulator in JAVA Zitieren
geloescht_Newlukai Geschrieben 31. März 2008 Geschrieben 31. März 2008 leider funktioniert Dein Vorschlag nicht. Er fragt nach convertCharToVK (ist nicht definiert) Und er schreibt, dass incompatible types gefunden wurden. (Required int, found convertCharToVK) Äh ... logisch. Vielleicht habe ich mich nicht klar genug ausgedrückt, sorry. Aber die Methode "convertCharToVK()" wäre von Dir zu implementieren. Darin sollte eine Konvertierung von einem char zu einer VK-Konstanten erfolgen: public static convertCharToVK(char in) { switch(in) { case 'A': case 'a': return VK_A; break; case 'B': case 'b': return VK_B; break; //... } } Zitieren
Devilmarkus Geschrieben 31. März 2008 Autor Geschrieben 31. März 2008 Hallo Newlukai, Dein Ansatz war echt gut! Habe dank ein paar Veränderungen das erreichen können, was ich brauchte. Man kann nun in der javacpc.ini den Wert 'autoload' angeben. Dann startet der Emulator genau dieses Programm, wenn es sich auf der eingelegten Disk (Image) befindet! Klasse! Danke Dir nochmal! Zum Probieren: Nochmal die Webstart Application öffnen. Download dieses Disk-Images: http://cpc.devilmarkus.de/clevsma.dsk Dieses durch Mausklick auf "Local File" öffnen... Dann nochmal den Emulator schliessen. Nun einfach mal die 'javacpc.ini" mit nem Texteditor bearbeiten und folgende Zeile hinzufügen: autoload=clever Nun nochmal die Webstart Application starten. Anmerkung: javacpc.ini wird bei Benutzung mit dem IE auf den Desktop geschrieben. Bei Firefox-Benutzern findet man diese in c:\programme\mozilla firefox\ Nach einmaligem Aufruf dieses "autoloads" wird es gelöscht. (Ich möchte die Funktion für ein externes Programm nutzen, welches Disk-Images in Emulatoren einbindet und per autoload-funktion eben ein Programm gestartet werden kann) Zitieren
Devilmarkus Geschrieben 31. März 2008 Autor Geschrieben 31. März 2008 Heute habe ich einen experimentiellen Prototypen für "Autotype" fertiggestellt. So sieht das Ganze aus... Fragt mich nicht nach dem Code Der ist so zerwurschtelt, aber funktioniert Gruss, Markus Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.