Seite 1 von 6
erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 16:52
von Julian
So der Hive ist fertig und ich versuche mich gerade ein wenig in Spin einzuarbeiten. Ich versuche gerade einfach einen String über die Tastatur einzulesen und auszugeben. Die Eingaberoutine habe ich aus der play.spin. Doch ich bekomme den String nicht angezeigt. Mein Code sieht so aus:
Code: Alles auswählen
OBJ
ios: "ios"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OS_TIBLEN = 64
VAR
byte tibpos
byte tib[OS_TIBLEN]
byte inputstr
Pub main
ios.start
ios.startram
ios.print(string("Input test"))
ios.printnl
inputstr := os_cmdinput
ios.print(string("You typed: "))
ios.print(inputstr)
ios.stop
PUB os_cmdinput | charc 'eingaberoutine für eine kommandozeile
{{os_cmdinput - eingaberoutine für eine kommandozeile
tib - eingabepuffer
tibpos - index im tib}}
tibpos := 0 'tibposition auf anfang setzen
repeat
if ios.keystat > 0 'taste gedrückt?
charc := ios.key 'tastencode holen
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
case charc
ios#CHAR_BS: 'backspace
if tibpos > 0
tibpos--
tib[tibpos] := $0 'letztes zeichen im puffer löschen
ios.printctrl(ios#CHAR_TER_BS) 'steuerzeichen anterminal senden
other: ios.bus_putchar2(charc) 'sonstige zeichen
if (charc <> ios#CHAR_NL) & (charc <> ios#CHAR_BS) 'ausser sonderzeichen alles in tib
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
tib[tibpos++] := charc
tib[tibpos] := $0
until charc == $0D 'schleife bis RETURN
tibpos := 0
charc := 0
Und was bedeuten die Variablen nach dem Namen der Funktion die mit | oder mit () deklariert werden. Werden die zurückgegeben bzw. an die Funktion übergeben (so wie ByVal bei VB)?
Re: erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 17:42
von Rainer
Julian hat geschrieben:Und was bedeuten die Variablen nach dem Namen der Funktion die mit | oder mit () deklariert werden. Werden die zurückgegeben bzw. an die Funktion übergeben (so wie ByVal bei VB)?
Erstmal zu Deiner 2. Frage:
"PUB blub(test1,test2) | x,y"
würde bedeuten:
test1 und test2 werden dem Objekt von dem Aufrufenden Befehl übergeben. also der Aufruf wäre dann "blub(wert1, wert2)"
x und y sind lokale variablen. Diese werden nur in dieser Routine verwendet und sind von "außen" nicht zugänglich.
Der Code von Dir kann so nicht funktionieren .. ich überlege nur gerade, wie ich das schriftlich hier zeige ... kommt noch.
Gruß.
Rainer
Re: erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 18:00
von Rainer
So, hier Dein code mit Änderungen.
Ich hab's kommentiert.
ich habe das Array tib in Deine Variable umkopiert .. hätte man sich sparen können und direkt einen Pointer auf tib zurückgeben, aber wer weiß was Du mit dem Array sonst noch vorhast.
Code: Alles auswählen
OBJ
ios: "ios"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OS_TIBLEN = 64
VAR
byte tibpos
byte tib[OS_TIBLEN]
byte inputstr[OS_TIBLEN] 'damit wir auf die einzelnen Bytes des strings zugreifen können
Pub main
ios.start
ios.startram
ios.print(string("Input test"))
ios.printnl
inputstr := os_cmdinput ' Returnwert ist inputstr
ios.print(string("You typed: "))
ios.print(@inputstr) ' Zeiger auf erstes Byte von Inputstr
repeat ' Unendliche Schleife für mich zum testen
ios.stop
PUB os_cmdinput | charc,x 'eingaberoutine für eine kommandozeile
{{os_cmdinput - eingaberoutine für eine kommandozeile
tib - eingabepuffer
tibpos - index im tib}}
tibpos := 0 'tibposition auf anfang setzen
repeat
if ios.keystat > 0 'taste gedrückt?
charc := ios.key 'tastencode holen
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
case charc
ios#CHAR_BS: 'backspace
if tibpos > 0
tibpos--
tib[tibpos] := $0 'letztes zeichen im puffer löschen
ios.printctrl(ios#CHAR_TER_BS) 'steuerzeichen anterminal senden
other: ios.bus_putchar2(charc) 'sonstige zeichen
if (charc <> ios#CHAR_NL) & (charc <> ios#CHAR_BS) 'ausser sonderzeichen alles in tib
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
tib[tibpos++] := charc
tib[tibpos] := $0
until charc == $0D 'schleife bis RETURN
x := 0
repeat until tib[x] == $0
inputstr[x] := tib[x] 'tib nach inputstr umkopieren .. könnte man sich auch sparen
x++
inputstr[x] := $0 ' $0 zum Schluß in inputstr, da wir die Schleife vorher verlassen haben
return inputstr ' das geben wir zurück
tibpos := 0
charc := 0
Alternativ könnte man sich das sparen:
Code: Alles auswählen
x := 0
repeat until tib[x] == $0
inputstr[x] := tib[x] 'tib nach inputstr umkopieren .. könnte man sich auch sparen
x++
inputstr[x] := $0 ' $0 zum Schluß in inputstr, da wir die Schleife vorher verlassen haben
return inputstr ' das geben wir zurück
und dafür das machen:
Gruß.
Rainer
Re: erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 18:13
von Julian
Danke für den Code. Evtl. sollte ich mir doch vorher mal das Tutorial im Propeller Tools und das Handbuch anschaun. Ich bin vorhin mal die IOS Funktionen (so wies in der Wiki steht) durchgegangen und da gibts zwar alles mögliche für den Zugriff auf die SD Karte aber keine Möglichkeit eine Datei zu löschen (klar man könnte ein Datei überschreiben und nichts reinschreiben aber dann ist die Datei ja immernoch da). Sehe ich das richtig oder hab ich da was übersehen?
Re: erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 18:19
von Rainer
Julian hat geschrieben:Danke für den Code. Evtl. sollte ich mir doch vorher mal das Tutorial im Propeller Tools und das Handbuch anschaun. Ich bin vorhin mal die IOS Funktionen (so wies in der Wiki steht) durchgegangen und da gibts zwar alles mögliche für den Zugriff auf die SD Karte aber keine Möglichkeit eine Datei zu löschen (klar man könnte ein Datei überschreiben und nichts reinschreiben aber dann ist die Datei ja immernoch da). Sehe ich das richtig oder hab ich da was übersehen?
Datei löschen = ios.sdopen("d",stradr)
Der Buchstabe "d" = delete. Gibt noch "r","w", usw.
Danach "ios.sdclose" nicht vergessen.
Schau Dir am besten mal den Source von Regime an. Da wird alles mit SD-Karte gemacht.
Gruß.
Rainer
Re: erste Schritte in Spin
Verfasst: Do 13. Aug 2009, 23:36
von Julian
Ok ich habe mir xload ein wenig angepasst. Doch irgendwie werden die Daten nicht mehr richtig übertragen, obwohl ich den eigentlichen Transfercode nicht verändert habe. Evtl. findet einer von euch den Fehler. Die transferierte Datei auf der SD Karte wird dann mit chkdsk gelöscht werden.
Re: erste Schritte in Spin
Verfasst: Fr 14. Aug 2009, 00:05
von Rainer
Bei mir funktioniert Dein Code ohne Probs.
Die übermittelte bin-datei konnte auch ganz normal gestartet werden.
Gruß.
Rainer
Re: erste Schritte in Spin
Verfasst: Fr 14. Aug 2009, 00:14
von Julian
Ok habs auch grad noch mal getestet. Jetzt gehts. Merkwürdig. Naja evtl. hatte die SD nen Schlag der durch den letzten Check via checkdisk wieder behoben wurde (hab immer in den gleichen Dateinamen geladen).
Re: erste Schritte in Spin
Verfasst: Fr 14. Aug 2009, 00:18
von Rainer
Julian hat geschrieben:Ok habs auch grad noch mal getestet. Jetzt gehts. Merkwürdig. Naja evtl. hatte die SD nen Schlag der durch den letzten Check via checkdisk wieder behoben wurde (hab immer in den gleichen Dateinamen geladen).
Hmm .. nicht ganz fürchte ich ... habe gerade eine ganz normale Textdatei gesendet.
Neben meinem Text ist da noch ein Haufen anderer Müll drin.
Ich checke das Prog noch mal .. heute Nacht aber wohl nicht mehr.
Gruß
Rainer
Re: erste Schritte in Spin
Verfasst: Fr 14. Aug 2009, 00:29
von Rainer
Hmm .. scheint wohl nicht Dein Fehler zu sein.
Code: Alles auswählen
PUB bwrite(puffer) | n,i ' schreibt 128 byte nutzdaten in datei
repeat i from 0 to 127
n := byte[puffer][i]
ios.sdputc(n)
Der Code oben schreibt auf alle Fälle immer 128 Byte auf die SD ... auch wenn nur 1 Buchstabe in der Textdatei ist.
Dürfte aber bei Programmen kein Problem sein, sieht nur bei Textdateien ziemlich blöd aus ... und man kriegt Probleme, wenn man bis EOF einliest (bei Konfigurationsdateien, z.B.)
Schaue ich mir aber noch mal genauer an .. vll. lese ich da auch was falsches raus.
[EDIT]
Jo, ist so wie ich gedacht habe.
Es wird immer bis zur 128 Byte-Grenze geschrieben.
Sieht man wenn man z.B. eine Textdatei übermittelt und dann mit "type <name.txt>" sich die Datei ansieht.
Passiert mit allen 3 Versionen von Xload (also mit der Originalen, Deiner und meiner Version).
Wird wohl auch so sein müssen, da man ja immer mind. 1 Sektor schreiben muß.
Da ich das Ding aber ständig benutze und noch nie Probleme hatte, muß Dein Fehler wirklich an der SD-Karte gelegen haben.
[/EDIT]
Gruß.
Rainer