1. Ich benötige diese Funktion nicht
2. bin selbst blutiger C Anfänger ( ASM ist mir lieber )
3. Habs mal umgesetzt und versuche Licht ins Dunkel zu bringen
Beachtet und Lest das was schon vorhanden ist.
Ergänst nur die Zeilen die fehlen. Vergleichen ist da angesagt, aber ich werde versuchen die Stellen mit
// Begin und
//End zu kennzeichnen.
Zu Beginn wird die
httpd.c bearbeitet.
Jedes Formular, das Daten mit den Server austauscht hat den Namen "OUT"
Das steht auch in der
httpd.c
Code: Alles auswählen
//Hier wird das codierte Passwort aus config.h gespeichert.
unsigned char http_auth_passwort[20];
unsigned char post_in[5] = {'O','U','T','='}; // hier steht das "OUT"
unsigned char post_ready[5] = {'S','U','B','='};
Daher muss auch das Textformular den Namen "OUT" haben.
Da aber alle den gleichen Name haben, bringt das natürlich Probleme auf den Plan.
Die müssen umgangen werden. Ich habe es so gelöst:
Jede htm-Seite bekommt einen eigenen "versteckten" Name.
Dieser Name muss gelesen werden und zur Auswertung herhalten.
Das geht so:
Code: Alles auswählen
eth_buffer[a+1+strcspn( (char*)(ð_buffer[a+1]), "&" )] = 0;
Nun kommt diese Zeile ins Listing:
Code: Alles auswählen
//Schaltanweisung finden!
if (eth_buffer[a] != *http_entry[index].post_ptr++)
{
http_entry[index].post_ptr = post_in;
}
if(*http_entry[index].post_ptr == 0)
{
//Begin
// HTML-Seitenname lesen !! Dieser ist in der HTML
eth_buffer[a+1+strcspn( (char*)(ð_buffer[a+1]), "&" )] = 0;
//End
if( !input ) strcpy( quellfile, (char*)(ð_buffer[a+1]) );
Nun steht der Name der Seite bereit und kann verwendet werden, wenn er abgefragt wird.
Also benötigen wir eine Abfrage dazu, die so aussieht:
Hier wird die index.htm abgefragt, also einbauen:
Code: Alles auswählen
//Schaltanweisung finden!
if (eth_buffer[a] != *http_entry[index].post_ptr++)
{
http_entry[index].post_ptr = post_in;
}
if(*http_entry[index].post_ptr == 0)
{
// HTML-Seitenname lesen !! Dieser ist in der HTML
eth_buffer[a+1+strcspn( (char*)(ð_buffer[a+1]), "&" )] = 0;
if( !input ) strcpy( quellfile, (char*)(ð_buffer[a+1]) );
//Begin
if( !strcmp( quellfile, "index.htm" ) )
{
//End
switch (eth_buffer[a+1])
{
case ('A'):
PORT_tmp = PORT_tmp + 1;
break;
Ihr seht, es steht noch weit oben im Listing der
httpd.c
Wichtig ist noch zu erwähnen, es ist eine IF Schleife.
Diese beginnt mit einer Klammer "
{" und muss auch abgeschlossen werden.
Also das Ende der Scleife auch mit "
}" beenden. das ist an der Stelle der Fall:
Code: Alles auswählen
** Bereits verwendete Zeichen siehe oben bei den case-Statements.
*/
}
http_entry[index].post_ptr = post_in;
//Schaltanweisung wurde gefunden
//Begin
} //if( !strcmp( quellfile, "index.htm" ) ) //Ende der Schleife
//End
Und nun soll das Formularfeld ausgelesen werden. Das steht gleich danach. Das ist ja der Sinn dieser Übung.
Code: Alles auswählen
//Schaltanweisung wurde gefunden
} //if( !strcmp( quellfile, "index.htm" ) )
//Begin
if( !strcmp( quellfile, "text.htm" ) )
{
if( input == 1 )
{
if (strlen((char*)ð_buffer[a+1]) < 16)
{
strcpy( tlcd, (char*)ð_buffer[a+1] );
lcd_print(1,0, "%s", tlcd);
}
}
http_entry[index].post_ptr = post_in;
} //if( !strcmp( quellfile, "ad.htm" ) )
//End
Hier sind alle Klammern schon da. Aber es gibt eine Zeile die noch eine Bemerkung bedarf:
Am Ende steht
< 16. Diese 16 ist eine Puffergröße die in der lcd.c noch fest gelegt wird.
Wenn die Nachricht, die an das LCD übertragen werden soll, größer oder kleiner sein soll, dann diesen Wert anpassen.
Die Nachricht, die an das LCD gesendet wird, soll auch im Textformular erhalten bleiben.
Dazu ist auch ein Eintrg nötig, der das Textformular füllt:
Code: Alles auswählen
}
else
#endif
strlcpy_P(dest, http_entry[index].new_page_pointer, length);
token[TOKENLEN] = 0;
//HTTP_DEBUG("\r\nTeste Token: %s",token);
//Begin
if (strncasecmp_P(token,PSTR("tlcd"),4)==0)
{
sprintf_P(var_conversion_buffer,PSTR("%s"), tlcd);
copy2eth_buff( var_conversion_buffer, &a );
nchars = 4;
}
//End
if (strncasecmp_P(token,PSTR("TIME"),4)==0)
{
uint16_t year;
uint8_t month, day, hour, min, sec;
Der Spass steht weiter unten im Listing, sucht bitte die Stelle damit auch alles passt.
Die Zeile
if (strncasecmp_P(token,PSTR("TIME"),4)==0) sollte aber leicht zu finden sein.
Nun kommt eine Anpassung in der
lcd.c Da ist aber nur das Anlegen der Variable nötig.
Code: Alles auswählen
#include <lcd.h>
#if USE_SER_LCD
const char LINE_ADDRESS[] ={0x80,0xC0,0x90,0xD0}; //2 x 16;4 x 16 uvm.
//const char LINE_ADDRESS[] ={0x80,0xC0,0x94,0xD4}; //4 mal 20
volatile unsigned char back_light = 0;
char ZEILE = 0;
//Begin
unsigned char tlcd[16] = "";
//End
Hier ist diese 16 wieder zu finden. Also die Puffergröße die oben erwäht wurde.
Das muß noch in der
lcd.h öffentlich gemacht werden.
Dazu ist die Zeile nötig:
Code: Alles auswählen
#endif //USE_LCD_4Bit
#define BUSY_WAIT 6000
#define NOP() asm("nop")
#define WAIT(x) for (unsigned long count=0;count<x;count++){NOP();}
//Begin
extern unsigned char tlcd[16];
//End
#endif //_LCD_H_
#endif //USE_SER_LCD
So, nu ist "fast" alles fertig. Eines Fehlt noch, die text.htm
Ich selbst habe diese Seite in einem Frame eigebettet auf einer SD-Karte zu liegen. Deshalb müsst ihr, wenn die Seite im Flash des Mega liegt soll, selbst die Anpassung machen. Ulli hat dazu ein Tool hier in Forum zu Download im Angebot. Ich werde mich da raushalten und
keine Unterstützung liefern.
Aber nun zur Seite selbst.
Code: Alles auswählen
<html>
<head>
<title></title>
<link rel="stylesheet" href="standard.css" type="text/css">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<form name="form1" method="post" action="text.htm">
<input type="text" name="OUT" style="display:none" value="text.htm">
<table align="left" width="100%" border="0">
<br>
<br>
<br>
<textarea name="OUT" cols="16" rows="1">%tlcd</textarea>
<pre align="left"><input type="submit" name="SUB" value="to LCD"></pre>
</table>
</body>
</html>
Das ist alles, wobei ich da noch eine Anmerkungen machen möchte. Dabei handelt es sich um den "verstekten Name" und die LCD-Zeile selbst.
Code: Alles auswählen
<input type="text" name="OUT" style="display:none" value="text.htm">
In der Zeile mit dem name="
OUT" seht auch value="
text.htm", also der "versteckte" Seitenname.
Und hierwird auch das Textformular aufgerufen:
Code: Alles auswählen
<textarea name="OUT" cols="16" rows="1">%tlcd</textarea>
da sind die Zeichen, wieder die 16 Zeichen (Puffergröße) und eine Spalte (Zeile des LCD) angegeben. %tlcd ist das Puffer das in der lcd.c (h) angelegt wurde.
So, nu ist gut für heute....
Fertig.