From 708822a54e6f3b7fcbaca6afa94fffa449255ceb Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Tue, 22 Oct 2013 18:27:12 +0100 Subject: [PATCH] A couple of tidyings and additions: 1. Z home now moves home, rather than just setting the coordinate. 2. Wait for temps implemented. Also the JSON requests for the g code filelist has been temporarily commented out in reprap.htm. It was causing the firmware to hang sometimes. To be investigated. Machine now prints nicely... --- Configuration.h | 3 + GCodes.cpp | 38 ++- GCodes.h | 3 +- Heat.h | 56 ++++ Platform.cpp | 76 +++--- Platform.h | 6 +- RepRapFirmware.cpp | 3 + SD-image/gcodes/crocclip.g | 24 +- SD-image/sys/config.g | 2 +- SD-image/www/reprap.htm | 2 +- network/httpd-hacked.c | 521 ------------------------------------- network/httpd.c | 2 +- 12 files changed, 164 insertions(+), 572 deletions(-) delete mode 100644 network/httpd-hacked.c diff --git a/Configuration.h b/Configuration.h index 93ac775..e094b26 100644 --- a/Configuration.h +++ b/Configuration.h @@ -34,6 +34,9 @@ Licence: GPL #define HEAT_SAMPLE_TIME 0.5 // Seconds +#define TEMPERATURE_CLOSE_ENOUGH 5.0 // Celsius +#define TEMPERATURE_LOW_SO_DONT_CARE 40.0 // Celsius + #define STANDBY_INTERRUPT_RATE 2.0e-4 // Seconds #define NUMBER_OF_PROBE_POINTS 3 diff --git a/GCodes.cpp b/GCodes.cpp index 7487b21..19a7935 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -58,6 +58,7 @@ void GCodes::Init() homeX = false; homeY = false; homeZ = false; + homeZFinalMove = false; // homeXQueued = false; // homeYQueued = false; // homeZQueued = false; @@ -284,13 +285,15 @@ bool GCodes::DoHome() float moveToDo[DRIVES+1]; bool action[DRIVES+1]; - for(int8_t drive = 0; drive <= DRIVES; drive++) + for(int8_t drive = 0; drive < DRIVES; drive++) action[drive] = false; + action[DRIVES] = true; if(homeX) { action[X_AXIS] = true; moveToDo[X_AXIS] = -2.0*platform->AxisLength(X_AXIS); + moveToDo[DRIVES] = platform->HomeFeedRate(X_AXIS)*0.016666667; if(DoCannedCycleMove(moveToDo, action, true)) { homeX = false; @@ -303,6 +306,7 @@ bool GCodes::DoHome() { action[Y_AXIS] = true; moveToDo[Y_AXIS] = -2.0*platform->AxisLength(Y_AXIS); + moveToDo[DRIVES] = platform->HomeFeedRate(Y_AXIS)*0.016666667; if(DoCannedCycleMove(moveToDo, action, true)) { homeY = false; @@ -314,13 +318,24 @@ bool GCodes::DoHome() if(homeZ) { action[Z_AXIS] = true; - moveToDo[Z_AXIS] = -2.0*platform->AxisLength(Z_AXIS); - if(DoCannedCycleMove(moveToDo, action, true)) + moveToDo[DRIVES] = platform->HomeFeedRate(Z_AXIS)*0.016666667; + if(homeZFinalMove) { - homeZ = false; - return NoHome(); + moveToDo[Z_AXIS] = 0.0; + if(DoCannedCycleMove(moveToDo, action, false)) + { + homeZFinalMove = false; + homeZ = false; + return NoHome(); + } + return false; + }else + { + moveToDo[Z_AXIS] = -2.0*platform->AxisLength(Z_AXIS); + if(DoCannedCycleMove(moveToDo, action, true)) + homeZFinalMove = true; + return false; } - return false; } // Should never get here @@ -708,6 +723,10 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) drivesRelative = true; break; + case 84: + platform->Message(HOST_MESSAGE, "Motors off received\n"); + break; + case 92: // Set steps/mm for each axis if(reprap.debug()) platform->GetLine()->Write("Steps/mm: "); @@ -752,7 +771,9 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) break; case 116: // Wait for everything - platform->Message(HOST_MESSAGE, "Wait for all temperatures received\n"); + if(!AllMovesAreFinishedAndMoveBufferIsLoaded()) + return false; + result = reprap.GetHeat()->AllHeatersAtSetTemperatures(); break; case 111: // Debug level @@ -813,7 +834,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) }else{ value = -1; } - float accel = platform->Acceleration(i,value); + float accel = platform->Acceleration(i, value); if(reprap.debug()) { platform->GetLine()->Write(gCodeLetters[i]); @@ -824,6 +845,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) if(reprap.debug()) platform->GetLine()->Write("\n"); break; + case 906: // Motor currents for(uint8_t i = 0; i < DRIVES; i++) { diff --git a/GCodes.h b/GCodes.h index fea22ff..9a90af0 100644 --- a/GCodes.h +++ b/GCodes.h @@ -118,6 +118,7 @@ class GCodes bool homeX; bool homeY; bool homeZ; + bool homeZFinalMove; // bool homeXQueued; // bool homeYQueued; // bool homeZQueued; @@ -161,7 +162,7 @@ inline bool GCodes::PrintingAFile() inline bool GCodes::NoHome() { - return !(homeX || homeY || homeZ); + return !(homeX || homeY || homeZ || homeZFinalMove); } // This function takes care of the fact that the heater and head indices diff --git a/Heat.h b/Heat.h index 78188af..9d3d336 100644 --- a/Heat.h +++ b/Heat.h @@ -29,9 +29,12 @@ class PID void Init(); void Spin(); void SetActiveTemperature(const float& t); + float GetActiveTemperature(); void SetStandbyTemperature(const float& t); + float GetStandbyTemperature(); void Activate(); void Standby(); + bool Active(); float GetTemperature(); private: @@ -57,10 +60,13 @@ class Heat void Init(); void Exit(); void SetActiveTemperature(int8_t heater, const float& t); + float GetActiveTemperature(int8_t heater); void SetStandbyTemperature(int8_t heater, const float& t); + float GetStandbyTemperature(int8_t heater); void Activate(int8_t heater); void Standby(int8_t heater); float GetTemperature(int8_t heater); + bool AllHeatersAtSetTemperatures(); void Diagnostics(); private: @@ -75,16 +81,31 @@ class Heat //*********************************************************************************************************** +inline bool PID::Active() +{ + return active; +} + inline void PID::SetActiveTemperature(const float& t) { activeTemperature = t; } +inline float PID::GetActiveTemperature() +{ + return activeTemperature; +} + inline void PID::SetStandbyTemperature(const float& t) { standbyTemperature = t; } +inline float PID::GetStandbyTemperature() +{ + return standbyTemperature; +} + inline float PID::GetTemperature() { return temperature; @@ -105,11 +126,21 @@ inline void Heat::SetActiveTemperature(int8_t heater, const float& t) pids[heater]->SetActiveTemperature(t); } +inline float Heat::GetActiveTemperature(int8_t heater) +{ + return pids[heater]->GetActiveTemperature(); +} + inline void Heat::SetStandbyTemperature(int8_t heater, const float& t) { pids[heater]->SetStandbyTemperature(t); } +inline float Heat::GetStandbyTemperature(int8_t heater) +{ + return pids[heater]->GetStandbyTemperature(); +} + inline float Heat::GetTemperature(int8_t heater) { return pids[heater]->GetTemperature(); @@ -125,4 +156,29 @@ inline void Heat::Standby(int8_t heater) pids[heater]->Standby(); } +inline bool Heat::AllHeatersAtSetTemperatures() +{ + float dt; + for(int8_t heater = 0; heater < HEATERS; heater++) + { + dt = GetTemperature(heater); + if(pids[heater]->Active()) + { + if(GetActiveTemperature(heater) < TEMPERATURE_LOW_SO_DONT_CARE) + dt = 0; + else + dt = fabs(dt - GetActiveTemperature(heater)); + } else + { + if(GetStandbyTemperature(heater) < TEMPERATURE_LOW_SO_DONT_CARE) + dt = 0; + else + dt = fabs(dt - GetStandbyTemperature(heater)); + } + if(dt > TEMPERATURE_CLOSE_ENOUGH) + return false; + } + return true; +} + #endif diff --git a/Platform.cpp b/Platform.cpp index 5538f91..72b3af4 100644 --- a/Platform.cpp +++ b/Platform.cpp @@ -249,6 +249,21 @@ void Platform::Diagnostics() Message(HOST_MESSAGE, "Platform Diagnostics:\n"); } +//extern int __bss_end; // void? long? +//extern void *__brkval; +// +//long Platform::GetFreeMemory() +//{ +// long free_memory; +// +// if((long)__brkval == 0) +// free_memory = ((long)&free_memory) - ((long)&__bss_end); +// else +// free_memory = ((long)&free_memory) - ((long)__brkval); +// +// return free_memory; +//} + //=========================================================================== //=============================Thermal Settings ============================ @@ -351,6 +366,7 @@ void MassStorage::Init() { //platform->Message(HOST_MESSAGE, "Please plug in the SD card.\n"); //delay(1000); + sdPresentCount++; } if(sdPresentCount >= 5) @@ -883,6 +899,34 @@ void Network::Init() Reset(); } +void Network::Spin() +{ + // Keep the Ethernet running + + ethernet_task(); + + // Anything come in from the network to act on? + + if(!netRingGetPointer->Active()) + return; + + // Finished reading the active ring element? + + if(!netRingGetPointer->ReadFinished()) + { + // No - Finish reading any data that's been received. + + if(inputPointer < inputLength) + return; + + // Haven't started reading it yet - set that up. + + inputPointer = 0; + inputLength = netRingGetPointer->Length(); + inputBuffer = netRingGetPointer->Data(); + } +} + // Webserver calls this to read bytes that have come in from the network bool Network::Read(char& b) @@ -891,7 +935,7 @@ bool Network::Read(char& b) { inputLength = -1; inputPointer = 0; - netRingGetPointer->SetRead(); + netRingGetPointer->SetReadFinished(); // Past tense... SetWriteEnable(true); //reprap.GetPlatform()->Message(HOST_MESSAGE, "Network - data read.\n"); return false; @@ -935,33 +979,7 @@ void Network::Write(char b) } -void Network::Spin() -{ - // Keep the Ethernet running - ethernet_task(); - - // Anything come in from the network to act on? - - if(!netRingGetPointer->Active()) - return; - - // Finished reading the active ring element? - - if(!netRingGetPointer->Read()) - { - // No - Finish reading any data that's been received. - - if(inputPointer < inputLength) - return; - - // Haven't started reading it yet - set that up. - - inputPointer = 0; - inputLength = netRingGetPointer->Length(); - inputBuffer = netRingGetPointer->Data(); - } -} void Network::InputBufferReleased(void* pb) { @@ -1104,12 +1122,12 @@ int NetRing::Length() return length; } -bool NetRing::Read() +bool NetRing::ReadFinished() { return read; } -void NetRing::SetRead() +void NetRing::SetReadFinished() { read = true; } diff --git a/Platform.h b/Platform.h index 027a75b..7033e2a 100644 --- a/Platform.h +++ b/Platform.h @@ -238,8 +238,8 @@ protected: bool Set(char* d, int l, void* pb, void* pc, void* h); char* Data(); int Length(); - bool Read(); - void SetRead(); + bool ReadFinished(); + void SetReadFinished(); void* Pbuf(); void* Pcb(); void* Hs(); @@ -408,6 +408,8 @@ class Platform void Diagnostics(); + // long GetFreeMemory(); + // Timing float Time(); // Returns elapsed seconds since some arbitrary time diff --git a/RepRapFirmware.cpp b/RepRapFirmware.cpp index 116bf73..5576d33 100644 --- a/RepRapFirmware.cpp +++ b/RepRapFirmware.cpp @@ -178,6 +178,9 @@ void RepRap::Init() active = true; gCodes->RunConfigurationGCodes(); platform->Message(HOST_MESSAGE, "RepRapPro RepRap Firmware (Re)Started\n"); +// platform->Message(HOST_MESSAGE, "Free memory: "); +// sprintf(scratchString,"%d\n",platform->GetFreeMemory()); +// platform->Message(HOST_MESSAGE, scratchString); } void RepRap::Exit() diff --git a/SD-image/gcodes/crocclip.g b/SD-image/gcodes/crocclip.g index f8ce915..8fcc946 100644 --- a/SD-image/gcodes/crocclip.g +++ b/SD-image/gcodes/crocclip.g @@ -16,14 +16,22 @@ ; infill extrusion width = 0.80mm ; first layer extrusion width = 0.48mm -M107 -M104 S205 ; set temperature -G28 ; home all axes -G1 Z5 F200 ; lift nozzle -M109 S205 ; wait for temperature to be reached -G90 ; use absolute coordinates G21 ; set units to millimeters +G90 ; use absolute coordinates M83 ; use relative distances for extrusion +M107 +G10 P0 S205 R205 ; Set extruder temperature +T0 +M140 S55; Set bed temperature +G1 Z5 F200 ; lift nozzle +G28 X0 Y0; home X and Y axes +G1 X30 Y30 F2000 +G28 Z0 +G1 Z0 F200 +G32 ; Probe bed +G1 X0 Y0 F2000 +G1 Z0 F200 +M116; Wait for all temperatures G1 F1800.000 E-2.00000 G1 Z0.240 F3600.000 G1 X68.609 Y91.575 @@ -7584,8 +7592,8 @@ G1 X72.284 Y102.512 E0.02412 G1 X72.512 Y102.283 E0.01333 G1 F1800.000 E-2.00000 M107 -M104 S0 ; turn off temperature +G10 P0 S0 R0; Turn off heater M140 S0 -G28 X2 Y180 ; home X axis +G1 X2 Y180 ; M84 ; disable motors ; filament used = 1425.9mm (3.4cm3) diff --git a/SD-image/sys/config.g b/SD-image/sys/config.g index a26dbf2..c70801a 100644 --- a/SD-image/sys/config.g +++ b/SD-image/sys/config.g @@ -6,7 +6,7 @@ G90 ; Absolute positioning M83 ; Extrusion relative M107; Fan off G31 Z0.7 P400 ; Set Z probe height and threshold -M906 X1200 Y1200 Z1200 E1200 ; Motor currents (mA) +M906 X400 Y400 Z400 E400 ; Motor currents (mA) M201 X4000 Y4000 E4000 ; Accelerations (mms-2) T0 ; Extruder 0 diff --git a/SD-image/www/reprap.htm b/SD-image/www/reprap.htm index 6c48a0e..5d05672 100644 --- a/SD-image/www/reprap.htm +++ b/SD-image/www/reprap.htm @@ -335,7 +335,7 @@ function viewModel() self.fileList = function() { - $.get('/rr_files', {}, self.files); + //$.get('/rr_files', {}, self.files); }; self.getTemps = function() diff --git a/network/httpd-hacked.c b/network/httpd-hacked.c deleted file mode 100644 index fef53f8..0000000 --- a/network/httpd-hacked.c +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Copyright (c) 2001-2003 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#if 0 -#include "lwipopts.h" -#if defined(HTTP_RAW_USED) - -#include -#include "lwip/src/include/lwip/debug.h" -#include "lwip/src/include/lwip/stats.h" -#include "httpd.h" -#include "lwip/src/include/lwip/tcp.h" -#include "fs.h" - -struct http_state { - char *file; - uint16_t left; - uint8_t retries; -}; - -/*-----------------------------------------------------------------------------------*/ - -//static void -//send_data(struct tcp_pcb *pcb, struct http_state *hs) -//{ -// err_t err; -// uint16_t len; -// int i; -// -//// if(hs->left <= 0) -//// { -//// hs->left = GetRepRapNetworkDataToSendLength(); -//// hs->file = GetRepRapNetworkDataToSend(); -//// } -// -// /* We cannot send more data than space available in the send -// buffer. */ -// if (tcp_sndbuf(pcb) < hs->left) { -// len = tcp_sndbuf(pcb); -// } else { -// len = hs->left; -// } -// -// do { -// err = tcp_write(pcb, hs->file, len, 0); -// if (err == ERR_MEM) { -// len /= 2; -// } -// } while (err == ERR_MEM && len > 1); -// -// if (err == ERR_OK) { -// hs->file += len; -// hs->left -= len; -// /* } else { -// printf("send_data: error %s len %d %d\n", lwip_strerr(err), len, tcp_sndbuf(pcb));*/ -// } -//} - -/*-----------------------------------------------------------------------------------*/ -static void -conn_err(void *arg, err_t err) -{ - struct http_state *hs; - - LWIP_UNUSED_ARG(err); - - hs = arg; - mem_free(hs); -} -/*-----------------------------------------------------------------------------------*/ -static void -close_conn(struct tcp_pcb *pcb, struct http_state *hs) -{ - tcp_arg(pcb, NULL); - tcp_sent(pcb, NULL); - tcp_recv(pcb, NULL); - mem_free(hs); - tcp_close(pcb); -} - -/*-----------------------------------------------------------------------------------*/ -static err_t -http_poll(void *arg, struct tcp_pcb *pcb) -{ - struct http_state *hs; - - hs = arg; - - /* printf("Polll\n");*/ - if (hs == NULL) { - /* printf("Null, close\n");*/ - tcp_abort(pcb); - return ERR_ABRT; - } else { - ++hs->retries; - if (hs->retries == 4) { - tcp_abort(pcb); - return ERR_ABRT; - } - send_data(pcb, hs); - } - - return ERR_OK; -} - -/*-----------------------------------------------------------------------------------*/ -//static err_t -//http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) -//{ -// int i; -// char *data; -// struct fs_file file; -// struct http_state *hs; -// -// hs = arg; -// -// if (err == ERR_OK && p != NULL) -// { -// -// /* Inform TCP that we have taken the data. */ -// tcp_recved(pcb, p->tot_len); -// -// if (hs->file == NULL) -// { -// data = p->payload; -// -// if (strncmp(data, "GET ", 4) == 0) -// { -// for(i = 0; i < 40; i++) { -// if (((char *)data + 4)[i] == ' ' || -// ((char *)data + 4)[i] == '\r' || -// ((char *)data + 4)[i] == '\n') -// { -// ((char *)data + 4)[i] = 0; -// } -// } -// -// if (*(char *)(data + 4) == '/' && *(char *)(data + 5) == 0) -// { -// fs_open("/index.html", &file); -// } else if (!fs_open((char *)data + 4, &file)) -// { -// fs_open("/404.html", &file); -// } -// -// hs->file = file.data; -// hs->left = file.len; -// /* printf("data %p len %ld\n", hs->file, hs->left);*/ -// -// pbuf_free(p); -// send_data(pcb, hs); -// -// /* Tell TCP that we wish be to informed of data that has been -// successfully sent by a call to the http_sent() function. */ -// tcp_sent(pcb, http_sent); -// } else -// { -// pbuf_free(p); -// close_conn(pcb, hs); -// } -// } else -// { -// pbuf_free(p); -// } -// } -// -// if (err == ERR_OK && p == NULL) -// { -// close_conn(pcb, hs); -// } -// return ERR_OK; -//} - -static struct tcp_pcb* activePcb = 0; -static struct pbuf* activePbuf = 0; -static struct http_state* activeHttpState = 0; -static char* dataPayload = 0; -//static char outputBuffer[1200]; -static int lastDataSentLength = 0; - -int GetRepRapNetworkDataToSendLength(); -char* GetRepRapNetworkDataToSend(); -void RepRapNetworkMessage(char* s); -void RepRapNetworkReceiveInput(char* ip, int length); -void RepRapNetworkDataTransmitted(int length); - -int SendBufferSize() -{ - if(activePcb == 0) - return -1; - return tcp_sndbuf(activePcb); -} - -static err_t DataHasGone(void *arg, struct tcp_pcb *pcb, uint16_t len) -{ - RepRapNetworkDataTransmitted(len); -// struct http_state *hs; -// -// LWIP_UNUSED_ARG(len); -// -// hs = arg; -// -// activePcb = pcb; -// activeHttpState = hs; -// -// hs->retries = 0; -// -// if (hs->left > 0) -// { -// send_data(pcb, hs); -// } else -// SetDataToSend(); - -// if (hs->left <= 0) -// { -// CloseConnection(); -// // close_conn(pcb, hs); -// } - - return ERR_OK; -} - -int SendData(char* data, int length) -{ - if(activePcb == 0) - return -1; - int err = tcp_write(activePcb, data, length, 0); - lastDataSentLength = length; - tcp_sent(activePcb, DataHasGone); - return err; -} - -//int SetDataToSend() -//{ -// int i; -// -// if(activeHttpState == 0) -// return -1; -// -// if(activeHttpState->left > 0) -// return 0; -// -// activeHttpState->left = GetRepRapNetworkDataToSendLength(); -// activeHttpState->file = outputBuffer; -// -// if(activeHttpState->left > 0) -// { -// i = 0; -// while(i < activeHttpState->left) -// { -// outputBuffer[i] = GetRepRapNetworkDataToSend()[i]; -// i++; -// } -// outputBuffer[i] = 0; -// } else -// outputBuffer[0] = 0; -// -// return 1; -//} - -static void FreeBuffer() -{ - if(activePbuf != 0) - { - pbuf_free(activePbuf); - activePbuf = 0; - dataPayload = 0; - } -} - -static void CloseConnection() -{ - if(activePcb != 0 && activeHttpState != 0) - { - close_conn(activePcb, activeHttpState); - //activePcb = 0; - //activeHttpState = 0; - } -} - -static void FreeBufferAndCloseConnection() -{ - FreeBuffer(); - CloseConnection(); -} - -/*-----------------------------------------------------------------------------------*/ - -static err_t -http_sent(void *arg, struct tcp_pcb *pcb, uint16_t len) -{ - struct http_state *hs; - - LWIP_UNUSED_ARG(len); - - hs = arg; - - activePcb = pcb; - activeHttpState = hs; - - hs->retries = 0; - - if (hs->left > 0) - { - send_data(pcb, hs); - } else - SetDataToSend(); - - if (hs->left <= 0) - { - CloseConnection(); - // close_conn(pcb, hs); - } - - return ERR_OK; -} - -//int HttpSend() -//{ -// if(activePcb != 0 && activeHttpState != 0) -// { -// send_data(activePcb, activeHttpState); -// -// /* Tell TCP that we wish be to informed of data that has been -// successfully sent by a call to the http_sent() function. */ -// tcp_sent(activePcb, http_sent); -// } -//} - - - -//static int InterpretAndSend() -//{ -// if(dataPayload == 0) -// return false; -// -// int i; -// -// struct fs_file file; -// -// if (strncmp(dataPayload, "GET ", 4) == 0) -// //if(GetRepRapNetworkDataToSendLength() > 0) -// { -// for(i = 0; i < 40; i++) { -// if (((char *)dataPayload + 4)[i] == ' ' || -// ((char *)dataPayload + 4)[i] == '\r' || -// ((char *)dataPayload + 4)[i] == '\n') -// { -// ((char *)dataPayload + 4)[i] = 0; -// } -// } -// -// if (*(char *)(dataPayload + 4) == '/' && *(char *)(dataPayload + 5) == 0) -// { -// fs_open("/index.html", &file); -// } else if (!fs_open((char *)dataPayload + 4, &file)) -// { -// fs_open("/404.html", &file); -// } -// -// activeHttpState->file = file.data; -// activeHttpState->left = file.len; -// -// //activeHttpState->file = GetRepRapNetworkDataToSend(); -// //activeHttpState->left = GetRepRapNetworkDataToSendLength(); -// -// /* printf("data %p len %ld\n", hs->file, hs->left);*/ -// -// //pbuf_free(p); -// FreeBuffer(); -//// send_data(activePcb, activeHttpState); -//// -//// /* Tell TCP that we wish be to informed of data that has been -//// successfully sent by a call to the http_sent() function. */ -//// tcp_sent(activePcb, http_sent); -// -// //HttpSend(); -// } else -// { -// FreeBufferAndCloseConnection(); -// //pbuf_free(p); -// //close_conn(pcb, hs); -// } -// return true; -//} - -static err_t -http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) -{ - int i; - char *data; - - struct http_state *hs; - - hs = arg; - - activePcb = pcb; - activePbuf = p; - activeHttpState = hs; - - if (err == ERR_OK && p != NULL) - { - - /* Inform TCP that we have taken the data. */ - tcp_recved(pcb, p->tot_len); - - //if (hs->file == NULL) - //if(GetRepRapNetworkDataToSendLength() <= 0) - //{ - data = p->payload; - dataPayload = data; - - // Deal with data received - - RepRapNetworkReceiveInput(data, p->len); - - //InterpretAndSend(); - - //} /*else - //{ - FreeBuffer(); - //pbuf_free(p); - //}*/ - //FreeBuffer(); - } - - -// if (err == ERR_OK && p == NULL) -// { -// CloseConnection(); -// //close_conn(pcb, hs); -// } - return ERR_OK; -} - - - - - -/*-----------------------------------------------------------------------------------*/ -static err_t -http_accept(void *arg, struct tcp_pcb *pcb, err_t err) -{ - struct http_state *hs; - - LWIP_UNUSED_ARG(arg); - LWIP_UNUSED_ARG(err); - - tcp_setprio(pcb, TCP_PRIO_MIN); - - /* Allocate memory for the structure that holds the state of the - connection. */ - hs = (struct http_state *)mem_malloc(sizeof(struct http_state)); - - if (hs == NULL) { - //printf("http_accept: Out of memory\n"); - return ERR_MEM; - } - - /* Initialize the structure. */ - hs->file = NULL; - hs->left = 0; - hs->retries = 0; - - /* Tell TCP that this is the structure we wish to be passed for our - callbacks. */ - tcp_arg(pcb, hs); - - /* Tell TCP that we wish to be informed of incoming data by a call - to the http_recv() function. */ - tcp_recv(pcb, http_recv); - - tcp_err(pcb, conn_err); - - tcp_poll(pcb, http_poll, 4); - return ERR_OK; -} -/*-----------------------------------------------------------------------------------*/ -void -httpd_init(void) -{ - //struct tcp_pcb *pcb; - - activePcb = tcp_new(); - tcp_bind(activePcb, IP_ADDR_ANY, 80); - activePcb = tcp_listen(activePcb); - tcp_accept(activePcb, http_accept); -} -/*-----------------------------------------------------------------------------------*/ - -#endif - -#endif diff --git a/network/httpd.c b/network/httpd.c index 702ee1e..e9c5f8a 100644 --- a/network/httpd.c +++ b/network/httpd.c @@ -108,7 +108,7 @@ close_conn(struct tcp_pcb *pcb, struct http_state *hs) tcp_close(pcb); } -char scratch[40]; +//char scratch[40]; /*-----------------------------------------------------------------------------------*/