Помогите с Web Serverom на ардуинке
Добавлено: Вс янв 06, 2013 1:06 am
Добрый день.
подскажите кто может, проблемка с ардуинкой а точнее с библиотекой <EtherCard.h>
ни как не могу разобраться
информации слишком мало по библиотеке, а так хочется переделать вот этот web server для ENC https://github.com/sergiomokshin/Arduino-WebServer
1 не получается передать параметры стилей (тупо не достучаться становится до ардуинки
2 не могу с помощью цикла вывести в веб некоторые переменные
может кто уже работал с этой библиотекой и подскажет как решить данную проблему.
подскажите кто может, проблемка с ардуинкой а точнее с библиотекой <EtherCard.h>
ни как не могу разобраться
1 не получается передать параметры стилей (тупо не достучаться становится до ардуинки
2 не могу с помощью цикла вывести в веб некоторые переменные
может кто уже работал с этой библиотекой и подскажет как решить данную проблему.
Код: Выделить всё
// Present a "Will be back soon web page", as stand-in webserver.
// 2011-01-30 <[email protected]> http://opensource.org/licenses/mit-license.php
#include <EtherCard.h>
#include <avr/eeprom.h>
#define DEBUG 0 // set to 1 to display free RAM on web page
#define SERIAL 0 // set to 1 to show incoming requests on serial port
#define CONFIG_EEPROM_ADDR ((byte*) 0x10)
// configuration, as stored in EEPROM
struct Config {
// byte band;
byte group;
byte collect;
word refresh;
byte valid; // keep this as last byte
} config;
#define STATIC 0 // set to 1 to disable DHCP (adjust myip/gwip values below)
#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,0,200 };
// gateway ip address
static byte gwip[] = { 192,168,0,10 };
#endif
// ethernet mac address - must be unique on your network
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static BufferFiller bfill; // used as cursor while filling the buffer
byte Ethernet::buffer[1000]; // tcp/ip send and receive buffer
static void loadConfig() {
for (byte i = 0; i < sizeof config; ++i)
((byte*) &config)[i] = eeprom_read_byte(CONFIG_EEPROM_ADDR + i);
// if (config.valid != 253) {
// config.valid = 253;
// config.band = 8;
// странная проверка по первому признаку!! если ему не соответсвует то все сбрасывает на те которые ниже
if (config.group != 1) {
config.group = 1;
config.collect = 1;
config.refresh = 5;
}
// byte freq = config.band == 4 ? RF12_433MHZ :
// config.band == 8 ? RF12_868MHZ :
// RF12_915MHZ;
// rf12_initialize(31, freq, config.group);
}
static void saveConfig() {
for (byte i = 0; i < sizeof config; ++i)
eeprom_write_byte(CONFIG_EEPROM_ADDR + i, ((byte*) &config)[i]);
}
#if DEBUG
static int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
#endif
void setup(){
Serial.begin(57600);
Serial.println("\n[myWEB_Server]");
/* Disable SD card */
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
loadConfig();
Serial.print("MAC: ");
for (byte i = 0; i < 6; ++i) {
Serial.print(mymac[i], HEX);
if (i < 5)
Serial.print(':');
}
Serial.println();
delay(2000);
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0)
Serial.println( "Failed to access Ethernet controller");
Serial.println("Setting up DHCP");
#if STATIC
ether.staticSetup(myip, gwip);
#else
if (!ether.dhcpSetup())
Serial.println("DHCP failed");
#endif
ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.mymask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
//------------------------------------
char okHeader[] PROGMEM =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n"
;
static void homePage(BufferFiller& buf) {
//---------------------------------------------
buf.emit_p(PSTR("$F\r\n"
"<meta http-equiv='refresh' content='$D'; charset=\"utf-8\"/>"
"<title>Web Server Arduino</title>"), okHeader, config.refresh);
//---------------------------------------------
buf.emit_p(PSTR(
"<style>"
/****************************тут первая проблема. как толко раскоментирую ардуина стоновится недоступной******************
".TableSite{width: 960px;margin: 0 auto;}"
".Banner{width: 970px;height: 120px;background-color:#3399CC;padding-top: 1px;}"
".Main{padding-top: 30px;width: 970px;background-color:#EEEEEE;height: 500px;margin: 0 auto;overflow:auto;}"
".MainMonitor{width:100%;height:100%;position:relative;}"
".BlockMonitorEntry{padding-left: 20px;margin-left: 20px;background-color: #FFFFFF;width:430px;height:430px;float:left;border:thin solid #CCCCCC;}"
".BlockItemMonitor{padding-top: 10px;}"
".TextOutput{float:left;margin-right:15px;}"
".IconSaida{width:15px;height:15px;marging-left:50px;margin-right:10px;float:left}"
*/***************************************************************************************************************
"h1{font-size:20px;margin-left: 10px;font-name: Calibri;color:white;padding-top: 5px;}"
"span{font-size:13px;font-name: Calibri;color:black;}"
"</style>"
"<body><div class='TableSite'>"
"<div class='Banner'><h1>WebServer Arduino ALPHA</h1></div>"
"<div class='Main'>"
"<div class='BlockMonitorEntry'><div class='BlockItemMonitor'>"
"Entradas Analogicas<br/>"
"<br/><pre>"));
Serial.println("Start @for@");
for (int analogChannel = 0; analogChannel <=5; analogChannel++) {
// #if SERIAL
Serial.println(analogChannel);
Serial.println("=");
Serial.println(analogRead(analogChannel));
//#endif
/*****************************не выполняется цикл, точнее ни чего не выводится и тоже не доступна стоновится**************
buf.emit_p(PSTR("<span>Entrada Analogica $D"),analogChannel);
buf.emit_p(PSTR(" = "));
buf.emit_p(PSTR("$D</span><br/>\r\n"),analogRead(analogChannel));
buf.emit_p(PSTR("</span><br/>"));
*/***********************************************************************************************************
}
buf.emit_p(PSTR(
"<br/><br/><br/>"
"- <a href='c'>configure</a> -<br/>"
"<br/>"
"</div>"
"</div>"
"<div class='BlockMonitorEntry'><div class='BlockItemMonitor'>"
"Saidas Digitais<br/><br/>"));
/*
for (int digitalChannel = 0; digitalChannel <= 7; digitalChannel++) {
buf.emit_p(PSTR("<div class='IconSaida' style='background-color:"));
if(digitalRead(digitalChannel) == 1)
buf.emit_p(PSTR("red;'></div>"));
else
buf.emit_p(PSTR("lightgray;'></div>"));
buf.emit_p(PSTR("<span>Saida Digital "));
buf.emit_p(PSTR("$D"),digitalChannel);
buf.emit_p(PSTR(" = "));
buf.emit_p(PSTR("$D"),digitalRead(digitalChannel));
buf.emit_p(PSTR("</span>"));
buf.emit_p(PSTR("<A HREF ='http://192.168.1.70/IS"));
buf.emit_p(PSTR("$D"),digitalChannel);
if(digitalRead(digitalChannel) == 1)
buf.emit_p(PSTR("0"));
else
buf.emit_p(PSTR("1"));
buf.emit_p(PSTR("'> Alterar saida</A>"));
buf.emit_p(PSTR(""));
buf.emit_p(PSTR("<br/>"));
*/
buf.emit_p(PSTR("</div></div></div></div>"));
long t = millis() / 1000;
word h = t / 3600;
byte m = (t / 60) % 60;
byte s = t % 60;
buf.emit_p(PSTR(
"<h1>Uptime is $D$D:$D$D:$D$D</h1>"
"<h2>test</h2>"
"</body></html>"),h/10, h%10, m/10, m%10, s/10, s%10);
#if DEBUG
buf.emit_p(PSTR(" ($D bytes free)"), freeRam());
#endif
}
//------------------------------------
static int getIntArg(const char* data, const char* key, int value =-1) {
char temp[10];
if (ether.findKeyVal(data + 7, temp, sizeof temp, key) > 0)
value = atoi(temp);
return value;
}
static void configPage(const char* data, BufferFiller& buf) {
// pick up submitted data, if present
if (data[6] == '?') {
// byte b = getIntArg(data, "b");
byte g = getIntArg(data, "g");
byte c = getIntArg(data, "c", 0);
word r = getIntArg(data, "r");
if (1 <= g && g <= 250 && 1 <= r && r <= 3600) {
// store values as new settings
// config.band = b;
config.group = g;
config.collect = c;
config.refresh = r;
saveConfig();
// re-init RF12 driver
loadConfig();
// clear history
//memset(history_len, 0, sizeof history_len);
// redirect to the home page
buf.emit_p(PSTR(
"HTTP/1.0 302 found\r\n"
"Location: /\r\n"
"\r\n"));
return;
}
}
// else show a configuration form
buf.emit_p(PSTR("$F\r\n"
"<h3>Web Server configuration</h3>"
"<form>"
"<p>"
// "Freq band <input type=text name=b value='$D' size=1> (4, 8, or 9)<br>"
"Net group <input type=text name=g value='$D' size=3> (1..250)<br>"
"Collect mode: <input type=checkbox name=c value='1' $S> "
"Don't send ACKs<br><br>"
"Refresh rate <input type=text name=r value='$D' size=4> (1..3600 seconds)"
"</p>"
"<input type=submit value=Set>"
"</form>"), okHeader, config.group,
config.collect ? "CHECKED" : "",
config.refresh);
}
//==========================================
void loop(){
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
// check if valid tcp data is received
if (pos) {
bfill = ether.tcpOffset();
char* data = (char *) Ethernet::buffer + pos;
#if SERIAL
Serial.println(data);
#endif
// receive buf hasn't been clobbered by reply yet
if (strncmp("GET / ", data, 6) == 0)
homePage(bfill);
else if (strncmp("GET /c", data, 6) == 0)
configPage(data, bfill);
// else if (strncmp("GET /send", data, 6) == 0)
// sendPage(data, bfill);
else
bfill.emit_p(PSTR(
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<h1>401 Unauthorized</h1>"));
ether.httpServerReply(bfill.position()); // send web page data
}
}