Now we've copied xSmurf's PROGMEM and other changes to his branch we'll back them out from here for now as they require SPrint from cral which we don't yet supply by default (this caused problems for people trying out the code in its current state.).

git-svn-id: svn+ssh://oldsvn/home/mlalondesvn/svn/cral@72 3ee9b42a-b53c-0410-a25e-f0b6218d5d5b
master
follower 17 years ago
parent 580cf788fe
commit 504380217e

@ -4,40 +4,40 @@
See: See:
<http://code.rancidbacon.com/LearningAboutArduinoWIZ810MJ> <http://code.rancidbacon.com/LearningAboutArduinoWIZ810MJ>
Current features: Current features:
* Initial W5100 driver port: * Initial W5100 driver port:
+ new-style network configuration + new-style network configuration
+ socket creation/listening/closing + socket creation/listening/closing
+ Sending/Receiving okay + Sending/Receiving okay
+ example "echo" server (no longer) + example "echo" server (no longer)
+ example "web server" with LED flash. + example "web server" with LED flash.
* Terrible hacked-together code * Terrible hacked-together code
Author: Author:
follower@rancidbacon.com follower@rancidbacon.com
License: License:
LGPL LGPL
Version: Version:
20071106-0005+ 20071106-0005+
*/ */
#include <WIZ810MJ.h> #include <WIZ810MJ.h>
#include <SPrint/staticPrint.h>
// Define SPI-related pins // Define SPI-related pins
@ -56,7 +56,7 @@ byte ip[6];
void configureSPI() { void configureSPI() {
/* /*
Configure pins and registers required for SPI communication. Configure pins and registers required for SPI communication.
*/ */
@ -69,16 +69,16 @@ void configureSPI() {
digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave
/* /*
Configure SPI Control Register (SPCR) (All values initially 0) Configure SPI Control Register (SPCR) (All values initially 0)
Bit Description Bit Description
7 SPI Interrupt Enable -- disable (SPIE --> 0) 7 SPI Interrupt Enable -- disable (SPIE --> 0)
6 SPI Enable -- enable (SPE --> 1) 6 SPI Enable -- enable (SPE --> 1)
5 Data Order -- MSB 1st (DORD --> 0) (Slave specific) 5 Data Order -- MSB 1st (DORD --> 0) (Slave specific)
4 Master/Slave Select -- master (MSTR --> 1) 4 Master/Slave Select -- master (MSTR --> 1)
3 Clock Polarity -- (CPOL --> 0) (Slave specific) ("Mode") 3 Clock Polarity -- (CPOL --> 0) (Slave specific) ("Mode")
2 Clock Phase -- (CPHA --> 0) (Slave specific) 2 Clock Phase -- (CPHA --> 0) (Slave specific)
1 SPI Clock Rate Select 1 -- } (SPR1 --> 0) 1 SPI Clock Rate Select 1 -- } (SPR1 --> 0)
0 SPI Clock Rate Select 0 -- } fOSC/4 (SPR0 --> 0) ("Fastest" but see SPI2X in SPSR) 0 SPI Clock Rate Select 0 -- } fOSC/4 (SPR0 --> 0) ("Fastest" but see SPI2X in SPSR)
*/ */
SPCR = (1<<SPE)| (1<<MSTR); SPCR = (1<<SPE)| (1<<MSTR);
@ -95,17 +95,17 @@ void configureSPI() {
void initModule() { void initModule() {
/* /*
Initialise the WIZ810MJ module and driver. Initialise the WIZ810MJ module and driver.
*/ */
/* /*
Initialise the W5100 chip Initialise the W5100 chip
(Originally I thought it was possible for the chip (Originally I thought it was possible for the chip
to function without a hardware reset but it to function without a hardware reset but it
seems not to be the case.) seems not to be the case.)
*/ */
pinMode(PIN_RESET, OUTPUT); pinMode(PIN_RESET, OUTPUT);
// We rely on the time between function calls to // We rely on the time between function calls to
@ -131,41 +131,41 @@ void initModule() {
#define PIN_LED 2 #define PIN_LED 2
void setup () { void setup () {
Serial.begin(19200); Serial.begin(9600);
SPrintln("Setup enter..."); Serial.println("Setup enter...");
configureSPI(); configureSPI();
initModule(); initModule();
SPrintln("Test W5100 configuration..."); Serial.println("Test W5100 configuration...");
byte config_gateway[] = {192,168,0.1}; byte config_gateway[] = {192,168,2,101};
byte config_subnet_mask[] = {255,255,0,0}; byte config_subnet_mask[] = {255,255,255,0};
byte config_mac_address[] = {0x02,0xDE,0xAD,0xBE,0xEF,0x00}; byte config_mac_address[] = {0x02,0xDE,0xAD,0xBE,0xEF,0x00};
byte config_ip_address[] = {192,168,0,69}; byte config_ip_address[] = {192,168,2,105};
setGAR(config_gateway); setGAR(config_gateway);
setSUBR(config_subnet_mask); setSUBR(config_subnet_mask);
setSHAR(config_mac_address); setSHAR(config_mac_address);
setSIPR(config_ip_address); setSIPR(config_ip_address);
SPrintln("End test W5100 configuration..."); Serial.println("End test W5100 configuration...");
SPrintln("Test W5100 driver code...");
Serial.println("Test W5100 driver code...");
getGAR(ip); getGAR(ip);
SPrint("Gateway IP read (first digit): "); Serial.print("Gateway IP read (first digit): ");
Serial.println(ip[0], DEC); Serial.println(ip[0], DEC);
SPrintln("End test W5100 driver code..."); Serial.println("End test W5100 driver code...");
pinMode(PIN_LED, OUTPUT); pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, HIGH); digitalWrite(PIN_LED, HIGH);
SPrintln("Setup exit..."); Serial.println("Setup exit...");
} }
@ -173,7 +173,7 @@ void sendPrompt(uint8_t *buffer) { // {Socket targetSocket, ) {
strcpy((char *) buffer, "w00t!> "); strcpy((char *) buffer, "w00t!> ");
SPrint("send result: "); Serial.print("send result: ");
//Serial.println(send(testSocket, buffer, 6), DEC); //Serial.println(send(testSocket, buffer, 6), DEC);
Serial.println(send(testSocket, buffer, strlen((char *)buffer)), DEC); Serial.println(send(testSocket, buffer, strlen((char *)buffer)), DEC);
} }
@ -181,39 +181,38 @@ void sendPrompt(uint8_t *buffer) { // {Socket targetSocket, ) {
void sendBanner(uint8_t *buffer, int ledState) { // {Socket targetSocket, ) { void sendBanner(uint8_t *buffer, int ledState) { // {Socket targetSocket, ) {
//strcpy((char *) buffer, "Content-Type: text/plain\n\nfoo!\n"); //strcpy((char *) buffer, "Content-Type: text/plain\n\nfoo!\n");
if (ledState) {
strcpy((char *) buffer, "HTTP/1.1 200 OK\n\rContent-Type: text/html\n\r\n\r<html><body bgcolor='#000000'>foo!</body></html>\n\r"); strcpy((char *) buffer, "HTTP/1.1 200 OK\n\rContent-Type: text/html\n\r\n\r<html><body bgcolor='#000000'>foo!</body></html>\n\r");
if (ledState) {
buffer[66] = 'F'; buffer[66] = 'F';
} else { } else {
strcpy((char *) buffer, "HTTP/1.1 200 OK\n\rContent-Type: text/html\n\r\n\r<html><body bgcolor='#000000'>bar!</body></html>\n\r"); buffer[68] = 'F';
buffer[68] = 'F';
} }
SPrint("send result: "); Serial.print("send result: ");
Serial.println(send(testSocket, buffer, strlen((char *)buffer)), DEC); Serial.println(send(testSocket, buffer, strlen((char *)buffer)), DEC);
} }
void loop() { void loop() {
SPrintln("Test W5100 socket..."); Serial.println("Test W5100 socket...");
SPrint("Create socket result: "); Serial.print("Create socket result: ");
Serial.println(socket(testSocket, Sn_MR_TCP, 80, 0), DEC); Serial.println(socket(testSocket, Sn_MR_TCP, 80, 0), DEC);
SPrint("Socket status: "); Serial.print("Socket status: ");
Serial.println(IINCHIP_READ(Sn_SR(testSocket)), HEX); Serial.println(IINCHIP_READ(Sn_SR(testSocket)), HEX);
if (IINCHIP_READ(Sn_SR(testSocket)) == SOCK_CLOSED) { if (IINCHIP_READ(Sn_SR(testSocket)) == SOCK_CLOSED) {
SPrintln("Socket still closed, waiting..."); Serial.println("Socket still closed, waiting...");
while (IINCHIP_READ(Sn_SR(testSocket)) == SOCK_CLOSED) { while (IINCHIP_READ(Sn_SR(testSocket)) == SOCK_CLOSED) {
//pass //pass
} }
} }
SPrint("Listen on socket result: "); Serial.print("Listen on socket result: ");
Serial.println(listen(testSocket), DEC); Serial.println(listen(testSocket), DEC);
SPrintln("Waiting for connection..."); Serial.println("Waiting for connection...");
while (getSn_SR(testSocket) == SOCK_LISTEN) { while (getSn_SR(testSocket) == SOCK_LISTEN) {
delay(500); delay(500);
@ -223,7 +222,7 @@ void loop() {
getSn_DIPR(testSocket, ip); getSn_DIPR(testSocket, ip);
SPrint("Destination IP read (last digit): "); Serial.print("Destination IP read (last digit): ");
Serial.println(ip[3], DEC); Serial.println(ip[3], DEC);
@ -257,71 +256,71 @@ void loop() {
while (getSn_SR(testSocket) == SOCK_ESTABLISHED) { while (getSn_SR(testSocket) == SOCK_ESTABLISHED) {
while (getSn_RX_RSR(testSocket) > 0) { while (getSn_RX_RSR(testSocket) > 0) {
recv(testSocket, bytesReceived, 1); recv(testSocket, bytesReceived, 1);
theByte = bytesReceived[0]; theByte = bytesReceived[0];
//Serial.print(bytesReceived[0], BYTE); //Serial.print(bytesReceived[0], BYTE);
Serial.print(theByte, BYTE); Serial.print(theByte, BYTE);
if ((state == STATE_G) && (theByte == 'G')) { if ((state == STATE_G) && (theByte == 'G')) {
state = STATE_E; state = STATE_E;
} else if ((state == STATE_E) && (theByte == 'E')) { } else if ((state == STATE_E) && (theByte == 'E')) {
state = STATE_T; state = STATE_T;
} else if ((state == STATE_T) && (theByte == 'T')) { } else if ((state == STATE_T) && (theByte == 'T')) {
state = STATE_SPACE; state = STATE_SPACE;
} else if ((state == STATE_SPACE) && (theByte == ' ')) { } else if ((state == STATE_SPACE) && (theByte == ' ')) {
state = STATE_SLASH; state = STATE_SLASH;
} else if ((state == STATE_SLASH) && (theByte == '/')) { } else if ((state == STATE_SLASH) && (theByte == '/')) {
state = STATE_READ; state = STATE_READ;
} else if ((state == STATE_READ) && (theByte == '0')) { } else if ((state == STATE_READ) && (theByte == '0')) {
digitalWrite(PIN_LED, LOW); digitalWrite(PIN_LED, LOW);
ledState = 0; ledState = 0;
//state = STATE_END; //state = STATE_END;
delay(100); delay(100);
} else if ((state == STATE_READ) && (theByte == '1')) { } else if ((state == STATE_READ) && (theByte == '1')) {
digitalWrite(PIN_LED, HIGH); digitalWrite(PIN_LED, HIGH);
ledState = 1; ledState = 1;
//state = STATE_END; //state = STATE_END;
delay(100); delay(100);
} else if (state == STATE_READ) { } else if (state == STATE_READ) {
// It's not a valid byte. // It's not a valid byte.
state = STATE_END; state = STATE_END;
} else { } else {
state = STATE_ERR; state = STATE_ERR;
} }
if ((state == STATE_ERR) || (state == STATE_END)) {
Serial.println("");
break;
}
/*
dataLength = getSn_RX_RSR(testSocket);
if (dataLength >= MAX_RX_BUFFER_SIZE) { // TODO: blah, blah...
dataLength = MAX_RX_BUFFER_SIZE-1;
}
// Serial.print("dataLength: "); Serial.println(dataLength, HEX);
//Serial.print("recv result: ");
//Serial.println(recv(testSocket, bytesReceived, dataLength), DEC); // NOTE: Throws away unread portion? No?
recv(testSocket, bytesReceived, dataLength); // TODO: Return length?
bytesReceived[dataLength]=0x00;
Serial.print((char *)bytesReceived);
//Serial.print("send result: ");
//Serial.println(send(testSocket, bytesReceived, dataLength), DEC);
//sendPrompt(bytesReceived);
*/
if ((state == STATE_ERR) || (state == STATE_END)) {
SPrintln("");
break;
}
/*
dataLength = getSn_RX_RSR(testSocket);
if (dataLength >= MAX_RX_BUFFER_SIZE) { // TODO: blah, blah...
dataLength = MAX_RX_BUFFER_SIZE-1;
}
// SPrint("dataLength: "); Serial.println(dataLength, HEX);
//SPrint("recv result: ");
//Serial.println(recv(testSocket, bytesReceived, dataLength), DEC); // NOTE: Throws away unread portion? No?
recv(testSocket, bytesReceived, dataLength); // TODO: Return length?
bytesReceived[dataLength]=0x00;
Serial.print((char *)bytesReceived);
//SPrint("send result: ");
//Serial.println(send(testSocket, bytesReceived, dataLength), DEC);
//sendPrompt(bytesReceived);
*/
} }
sendBanner(bytesToSend, ledState); sendBanner(bytesToSend, ledState);
//sendPrompt(bytesReceived); //sendPrompt(bytesReceived);
break; break;
} }
close(testSocket);
disconnect(testSocket); disconnect(testSocket);
close(testSocket);
SPrintln("End test W5100 socket...");
Serial.println("End test W5100 socket...");

Loading…
Cancel
Save