Improved network recovery from errors and fixed small temp cal error
Improved network error recovery so that it it possible to reconnect after some types of network error have occurred Corrected calculation of temperatures to give more accurate results towards the limits of the ADC range
This commit is contained in:
parent
d040227c95
commit
1e444839e0
5 changed files with 56 additions and 19 deletions
28
Platform.cpp
28
Platform.cpp
|
@ -312,7 +312,7 @@ void Platform::ClassReport(char* className, float &lastTime)
|
||||||
// should compute it for you (i.e. it won't need to be calculated at run time).
|
// should compute it for you (i.e. it won't need to be calculated at run time).
|
||||||
|
|
||||||
// If the A->D converter has a range of 0..1023 and the measured voltage is V (between 0 and 1023)
|
// If the A->D converter has a range of 0..1023 and the measured voltage is V (between 0 and 1023)
|
||||||
// then the thermistor resistance, R = V.RS/(1023 - V)
|
// then the thermistor resistance, R = V.RS/(1024 - V)
|
||||||
// and the temperature, T = BETA/ln(R/R_INF)
|
// and the temperature, T = BETA/ln(R/R_INF)
|
||||||
// To get degrees celsius (instead of kelvin) add -273.15 to T
|
// To get degrees celsius (instead of kelvin) add -273.15 to T
|
||||||
//#define THERMISTOR_R_INFS ( THERMISTOR_25_RS*exp(-THERMISTOR_BETAS/298.15) ) // Compute in Platform constructor
|
//#define THERMISTOR_R_INFS ( THERMISTOR_25_RS*exp(-THERMISTOR_BETAS/298.15) ) // Compute in Platform constructor
|
||||||
|
@ -321,8 +321,10 @@ void Platform::ClassReport(char* className, float &lastTime)
|
||||||
|
|
||||||
float Platform::GetTemperature(int8_t heater)
|
float Platform::GetTemperature(int8_t heater)
|
||||||
{
|
{
|
||||||
float r = (float)GetRawTemperature(heater);
|
// If the ADC reading is N then for an ideal ADC, the input voltage is at least N/(ADC_RANGE + 1) and less than (N + 1)/(ADC_RANGE + 1), times the analog reference.
|
||||||
return ABS_ZERO + thermistorBetas[heater]/log( (r*thermistorSeriesRs[heater]/(AD_RANGE - r))/thermistorInfRs[heater] );
|
// So we add 0.5 to to the reading to get a better estimate of the input. We don't care whether or not we get exactly zero with the thermistor disconnected.
|
||||||
|
float r = (float)GetRawTemperature(heater) + 0.5;
|
||||||
|
return ABS_ZERO + thermistorBetas[heater]/log( (r*thermistorSeriesRs[heater]/((AD_RANGE + 1) - r))/thermistorInfRs[heater] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -864,9 +866,10 @@ void RepRapNetworkInputBufferReleased(void* pb)
|
||||||
reprap.GetPlatform()->GetNetwork()->InputBufferReleased(pb);
|
reprap.GetPlatform()->GetNetwork()->InputBufferReleased(pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RepRapNetworkHttpStateReleased(void* h)
|
void RepRapNetworkConnectionError(void* h)
|
||||||
{
|
{
|
||||||
reprap.GetPlatform()->GetNetwork()->HttpStateReleased(h);
|
reprap.GetPlatform()->GetNetwork()->ConnectionError(h);
|
||||||
|
reprap.GetWebserver()->ConnectionError();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called to put out a message via the RepRap firmware.
|
// Called to put out a message via the RepRap firmware.
|
||||||
|
@ -1053,14 +1056,19 @@ void Network::InputBufferReleased(void* pb)
|
||||||
netRingGetPointer->ReleasePbuf();
|
netRingGetPointer->ReleasePbuf();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Network::HttpStateReleased(void* h)
|
void Network::ConnectionError(void* h)
|
||||||
{
|
{
|
||||||
if(netRingGetPointer->Hs() != h)
|
// h points to an http state block that the caller is about to release, so we need to stop referring to it.
|
||||||
|
// The state block is usually but not always in use by the current http request being processed, in which case we abandon the current request.
|
||||||
|
if (netRingGetPointer != netRingAddPointer && netRingGetPointer->Hs() == h)
|
||||||
{
|
{
|
||||||
reprap.GetPlatform()->Message(HOST_MESSAGE, "Network::HttpStateReleased() - Pointers don't match!\n");
|
netRingGetPointer->Free();
|
||||||
return;
|
netRingGetPointer = netRingGetPointer->Next();
|
||||||
}
|
}
|
||||||
netRingGetPointer->ReleaseHs();
|
|
||||||
|
// Reset the network layer. In particular, this clears the output buffer to make sure nothing more gets sent,
|
||||||
|
// and sets statue to 'nothing' so that we can accept another connection attempt.
|
||||||
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,7 @@ public:
|
||||||
void Close();
|
void Close();
|
||||||
void ReceiveInput(char* data, int length, void* pb, void* pc, void* h);
|
void ReceiveInput(char* data, int length, void* pb, void* pc, void* h);
|
||||||
void InputBufferReleased(void* pb);
|
void InputBufferReleased(void* pb);
|
||||||
void HttpStateReleased(void* h);
|
void ConnectionError(void* h);
|
||||||
bool Active();
|
bool Active();
|
||||||
bool LinkIsUp();
|
bool LinkIsUp();
|
||||||
|
|
||||||
|
|
|
@ -711,6 +711,30 @@ void Webserver::Init()
|
||||||
//platform->GetMassStorage()->Delete(platform->GetWebDir(), MESSAGE_FILE);
|
//platform->GetMassStorage()->Delete(platform->GetWebDir(), MESSAGE_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is called when the connection has been lost.
|
||||||
|
// In particular, we must cancel any pending writes.
|
||||||
|
void Webserver::ConnectionError()
|
||||||
|
{
|
||||||
|
writing = false;
|
||||||
|
receivingPost = false;
|
||||||
|
postSeen = false;
|
||||||
|
getSeen = false;
|
||||||
|
jsonPointer = -1;
|
||||||
|
clientLineIsBlank = true;
|
||||||
|
needToCloseClient = false;
|
||||||
|
clientLinePointer = 0;
|
||||||
|
clientLine[0] = 0;
|
||||||
|
clientRequest[0] = 0;
|
||||||
|
gotPassword = false;
|
||||||
|
gcodeAvailable = false;
|
||||||
|
gcodePointer = 0;
|
||||||
|
InitialisePost();
|
||||||
|
lastTime = platform->Time();
|
||||||
|
longWait = lastTime;
|
||||||
|
active = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Webserver::Exit()
|
void Webserver::Exit()
|
||||||
{
|
{
|
||||||
platform->Message(HOST_MESSAGE, "Webserver class exited.\n");
|
platform->Message(HOST_MESSAGE, "Webserver class exited.\n");
|
||||||
|
|
|
@ -50,6 +50,7 @@ class Webserver
|
||||||
void Diagnostics();
|
void Diagnostics();
|
||||||
void SetPassword(char* pw);
|
void SetPassword(char* pw);
|
||||||
void SetName(char* nm);
|
void SetName(char* nm);
|
||||||
|
void ConnectionError();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ struct http_state {
|
||||||
|
|
||||||
void RepRapNetworkReceiveInput(char* ip, int length, void* pbuf, void* pcb, void* hs);
|
void RepRapNetworkReceiveInput(char* ip, int length, void* pbuf, void* pcb, void* hs);
|
||||||
void RepRapNetworkInputBufferReleased(void* pbuf);
|
void RepRapNetworkInputBufferReleased(void* pbuf);
|
||||||
void RepRapNetworkHttpStateReleased(void* h);
|
void RepRapNetworkConnectionError(void* h);
|
||||||
void RepRapNetworkMessage(char* s);
|
void RepRapNetworkMessage(char* s);
|
||||||
void RepRapNetworkAllowWriting();
|
void RepRapNetworkAllowWriting();
|
||||||
bool RepRapNetworkHasALiveClient();
|
bool RepRapNetworkHasALiveClient();
|
||||||
|
@ -86,15 +86,19 @@ static int initCount = 0;
|
||||||
static void
|
static void
|
||||||
conn_err(void *arg, err_t err)
|
conn_err(void *arg, err_t err)
|
||||||
{
|
{
|
||||||
struct http_state *hs;
|
// Report the error to the monitor
|
||||||
|
RepRapNetworkMessage("Network connection error, code ");
|
||||||
|
{
|
||||||
|
char tempBuf[10];
|
||||||
|
snprintf(tempBuf, sizeof(tempBuf)/sizeof(char), "%d\n", err);
|
||||||
|
RepRapNetworkMessage(tempBuf);
|
||||||
|
}
|
||||||
|
|
||||||
LWIP_UNUSED_ARG(err);
|
struct http_state *hs = arg;
|
||||||
|
RepRapNetworkConnectionError(hs); // tell the higher levels about the error
|
||||||
hs = arg;
|
mem_free(hs); // release the state data
|
||||||
mem_free(hs);
|
|
||||||
//RepRapNetworkHttpStateReleased(hs);
|
|
||||||
RepRapNetworkMessage("Network connection error.\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Reference in a new issue