Protokollbeschreibung fr die Ansteurung des HMPEG ber RS232

Gltig fr die Version V0.99 und folgende.

Einstellungen des Terminals
	Baudrate: 	38400
	Datenbits:	8
	Paritt:	keine
	Stoppbits:	1

Prinzipieller Ablauf:

0.  Der Master (Controller, der den HMPEG seteuern soll) wartet nach dem Einschalten auf ein READY vom 
	Slave (HMPEG), danach ist der Slave kommunikationsbereit.
1. 	Master schickt dem Slave (H-MPEG) ein Kommando (bestehend aus einem Byte, z.B. PlayNext: 2Bh)
2. 	Slave nimmt das Kommando auf und schickt das Byte als Echo zurck.
	Der Slave kennt durch das Kommando die Anzahl (0, 1, 4 oder 8 Byte) der folgenden Argumente.
3. 	Der Master schickt die Argumente einzeln, d.h. wartet immer das Echo vom Slave ab
4. 	Slave schickt nach Empfang jedes Argumentbytes ein Echo
5.	Sind alle Argumente bertragen und ist das Echo vom Slave eingetroffen, schickt der Master 0x0d (Enter)
6.	Erhlt der Slave abschlieend (nachdem alle Argumente bertragen sind) ein 0x0d, 
	gibt er als Echo eine 0x00 zurck und fhrt danach den Befehl aus.
7.  Wenn der Befehl dem Slave unbekannt ist, wird dieses Byte trotzdem zunchst als Echo zurckgegeben.
	Erst wenn dann vom Master das 0x0d (Enter) gesendet wird, kommt an Stelle der 0x00 eine 0x01.
	Es wird als erst beim Befehl "GO!" der Befehl berprft.
8.  Falls erforderlich antwortet der Player in der Ausfhrungsphase auf den Befehl, indem er die angeforterten 
	Bytes schickt.
noch nicht umgesetzt:
9.  Will der Slave unaufgefordert Daten an Master Schicken (z.B. wenn eine Taste auf der FB gedrckt wird),
	so sendet er zuerst eine Kennung, gefolgt von den Daten in konstanter Lnge (je nach Kennung).
	
Allgemein gilt: - 	Der Player sendet alle Zahlen als Ascci. D.h. eine 0x34 wird als 0x33 (=='3') und 0x34 (=='4')
					gesentet. Er erwatet jedoch Binrzahlen mit LSB first.
				- 	Der Player erwartet kein Echo vom Master, schickt aber seinerseits immer ein Echo.

Beispiel: Der Master will vom Slave wissen, welcher Wert im Register "Lautstrke rechts" des MAS3507 steht.

Er sendet den Befehl "READ_MEM_MAS"						M: 0x35					
Der Slave antwortet mit dem Echo:						S: 0x35
Der Slave wei jetzt, da die folgenden 4 Byte die Argumente des Befehls sind. Der Master sendet
zuerst die Speicherart MEM_D1:							M: 0xF0
Der Slave gibt sein Echo:								S: 0xF0
Die nchsten 2 Byte sind die Adresse 0x7fb (LSB first)	M: 0xfb
Der Slave gibt sein Echo:								S: 0xfb
Master sendet MSB										M: 0x07
Der Slave gibt sein Echo:								S: 0x07
Das vierte Byte wird nicht ausgewertet:					M: 0x00
Der Slave gibt sein Echo:								S: 0x00
Master sendet "GO!"										M: 0x0d
Der Slave quittiert mit 0x00:							S: 0x00
Der Befehl wird ausgefhrt. Die Lautstrke war auf z.B. -40dB eingestellt (0xfeb85). 
Der Slave anwortet 000feb85   					 '0'	S: 0x30
												 '0'	S: 0x30
												 '0'	S: 0x30
												 'f'	S: 0x66 
												 'e'	S: 0x65
												 'b'	S: 0x62 
												 '8'	S: 0x38 
												 '5'	S: 0x35
												 ' '	S: 0x20
												 		S: 0x0d
														S: 0x0a
Es folgt kein Echo vom Master.
Der Master will die Lautstrke jetzt um weitere 10 dB absenken. Er mu in Speicher M1 in Adresse 
0x7fb den Wert 0xff986 schreiben:

Er sendet den Befehl "WRITE_MEM_MAS"					M: 0x37
Der Slave antwortet mit dem Echo:						S: 0x37
Der Slave wei jetzt, da die folgenden 8 Byte die Argumente des Befehls sind. Der Master sendet
zuerst die Speicherart MEM_D1:							M: 0xF0
Der Slave gibt sein Echo:								S: 0xF0
Die nchsten 2 Byte sind die Adresse 0x7fb (LSB first)	M: 0xfb
Der Slave gibt sein Echo:								S: 0xfb
Master sendet MSB										M: 0x07
Der Slave gibt sein Echo:								S: 0x07
Die nchsten 4 Byte sind die Daten 0xff986 (LSB first)	M: 0x86
Der Slave gibt sein Echo:								S: 0x86
														M: 0xf9
														S: 0xf9
														M: 0x0f
														S: 0x0f
														M: 0x00
														S: 0x00
Das achte Byte wird nicht ausgewertet:					M: 0x00
														S: 0x00
Master sendet "GO!"										M: 0x0d
Der Slave quittiert mit 0x00:							S: 0x00
Der Speicher wird beschrieben.

kurze Begriffserklrung:
	"Bereitgestellt" heit, das dieser Titel der nchste sein wird, der abgespielt wird. 
	Alle Befehle beziehen sich auf diesen. 

Als Kommando sind z.Zt. definiert:
SET_NEXT (6eh, 'n'):
	Der nchste Titel wird bereitgestellt. War der letzte Titel der letze im Verzeichnis, wird ins 
	nchste Verzeichnis gewechselt. Der laufende Titel wird nicht unterbrochen. Die LCD zeigt den spielenden
	Titel an, nicht den nchsten.
		
PLAY_NEXT (2bh, '+'):
	Wie SET_NEXT, jedoch wird der laufende Titel unterbrochen und der nchste abgespielt.

SHOW_NEXT (3fh, '?'):
	Wie SET_NEXT, jedoch wird der nchste Titel blinkend in der LCD angezeigt.

PLAY_PREV (2dh, '-'):
	Wie PLAY_NEXT, jedoch wird der davorliegende Titel gespielt, es wird bei Bedarf ins davorliegende Verzeichnis 
	gesprungen.
	
SET_PREV (70h, 'p'):
	Wie SET_NEXT, jedoch der davorliegende Titel.
				
PAUSE (04h):
	Der Player stoppt, wenn gerade ein Stck gespielt wird, in der Anzeige erscheint PAUSE blinkend. Beim nchsten 
	Aufruf wird fortgesetzt.

PLAY_STOP (20h, ' '):
	Der Player stoppt. Angezeigt wird der letzte Titel.

NEXT_DIR (77h, 'w'):
	Der 1. Titel aus dem nchsten Verzeinis wird angezigt und bereitgestellt.

PREV_DIR (7ah, 'z'):	  
	Der 1. Titel aus dem vorhergehenden Verzeinis wird angezigt und bereitgestellt.

SET_PLAY_SINGLE (31h, '1'):
	Der Player spielt immer genau ein Stck ab und wartet danach auf neue Eingaben.

SET_PLAY_CONTINUES (32h, '2'):
	Nach dem Start eines Stcks wird am Ende des Stcks der nchste Titel aufgerufen, bei Bedarf wird das 
	Verzeichnis gewechselt.

SAVE (73h, 's'):
	Der bereitgestellte Titel und sein Pfad wird im EEprom gesichert.

RESUME (72h, 'r'):
	Der im EEprom gespeicherte Titel und der Pfad werden bereitgestellt.

PLAY (78h, 'x'):
	Der bereitgestellte Titel wird gespielt.

PLAY_ENTRY (65h, 'e'):
	erwartet 8 Bytes als Argument
	1. Byte:				Nummer des Titels im Verzeichnis von 0 bis 99
	2., 3., 4., 5. Byte:	Cluster des Verzeichnisses, wie durch INFO angegeben
	6., 7., 8.:				wird nicht ausgewertet
	Spielt den ausgewhlten Titel.
							
INFO (69h, 'i'):
	Player sendet umfangreiche Informatinen zum aktuellen Verzeichnis
	1. Name des berietgestellten Titels, abgeschlossen mit NL CR
	2. Name des bereitgestellten Verzeichnisses, abgeschlossen mit NL CR
	3. Anzahl der Eintrge in diesem Verzeichnis (hex), abgeschlossen mit 0x20 NL CR
	5. - n. Die Dateinamen der Eintrge (Datein oder Unterverzeichnisse)
		XXXXXXXX YYYYYYYY NAME, abgeschlossen mit NL CR
		XXXXXXXX: Startcluster des Eintrags, YYYYYYYY: Dateilnge, 0 bei Verzeichnissen

SEND_ID3TAG (49h, 'I'):
	Der Player sendet zuerst die ersten 4, danach die letzten 128 Byte der bereitgestellten Datei.

DIR_CLUSTER (64h, 'd'):
	erwartet 4 Bytes als Argument
	1., 2., 3., 4.Byte:	Cluster des Verzeichnisses
	Liest ein Verzeichnis ein. Wenn Cluster ==0 ist, wird das Root-Verzeichnis eingelesen. 
	Danach kann mit INFO der Inhalt ausgelesen werden.

READ_REG_MAS (34h, '4'):
	erwartet 1 Bytes als Argument
	1. Byte: 		Adresse des Registers
	Liest das angegebene Register aus.
	Ausgabe: XXXXXXXX, abgeschlossen mit 0x20 NL CR (gesendet werden 11 Bytes)
					
READ_MEM_MAS (35h, '5'):
	erwartet 4 Bytes als Argument
	1. Byte: 		Speicherart (MEM0: 0xE0 oder MEM1: 0xF0) des Registers
	2., 3. Byte:	Adresse
	Liest den angegebenen Speicher aus.
	Ausgabe: XXXXXXXX, abgeschlossen mit 0x20 NL CR (gesendet werden 11 Bytes)

RUN_ADR_MAS (36h, '6'):
	erwartet 4 Bytes als Argument
	1., 2. Byte:	Adresse
	3., 4. Byte:	wird nicht ausgewertet
	Startet ein internes Programm im Speicher des MAS ab Adresse

WRITE_MEM_MAS (37h, '7'):
	erwartet 8 Bytes als Argument
	1. Byte: 				Speicherart (MEM0: 0xE0 oder MEM1: 0xF0) des Registers
	2., 3. Byte:			Adresse
	4., 5., 6., 7.Byte:		Data
	8. Byte :				wird nicht ausgewertet
					
WRITE_REG_MAS (38h, '8'):
	erwartet 8 Bytes als Argument
	1. Byte: 				Adresse des Registers
	2., 3., 4., 5.Byte:		Data
	Schreibt ein Wert in das angegebene Register

READ_DEFAULT (39h, '9'):
	fhrt den Befehl "read default" des MAS aus
	Ausgabe: XXXXXXXX (Framecounter des MAS)
	Abschlieend wird noch ein ' ' gesendet.

DISPLAY_LCD (6ch, 'l'):
	erwartet 8 Bytes als Argument
	Es werden alle 8 Byte auf der LCD dargestellt

COMMAND_LCD (4ch, 'L'):
	erwartet 1 Bytes als Argument
	Das bergebende Byte wird in das Controlregister der LCD geschrieben

SEND_PLAYLIST (52h, 'S'):
	Der Player sucht im aktuellen Verzeichnis nach einer Datei playlist.m3u (Kleinschreibung wichtig!) und gibt 
	diese, wenn gefunden, auf die serielle Schnittstelle. Abschlieendes Zeichen: 0x04

NOP (4eh, 'N'):
	Der Player macht nichts. Man kann dieses Byte senden, bis ein Echo eintritt. Danach mit Enter ausfhren lassen. 
	Der Player sendet nach dem Enter das Echo 0x00, wie auch bei anderen Befehlen.

SENS_STATUS (??h, 'm'):
	Der Player gibt ein Byte zurck mit dem Inhalt:
		Bit 0 = 1: Es wird beim Einschaltet automatisch das letzte Lied gespielt
		Bit 1 = 1: Signle play ist aktiv. Es wird immer nur ein Lied gespielt, am Ende des Liedes stoppt der Player.
		Bit 2 = 1: der Player spielt gerade ein Lied
		Bit 3 -7 : Immer 0

WRITE_STATUS(??h, 'M'):
		erwartet 1 Bytes als Argument
		Der Player setzt seine Eigenschaften entsprechend der Bits 0 und 1 bei "SEND_STATUS".