Implemented very simple PHP for embedding stuff in control pages.

This commit is contained in:
reprappro 2013-02-22 22:03:46 +00:00
parent a10599f32c
commit 7bc5761b3e
15 changed files with 802 additions and 292 deletions

View file

@ -37,6 +37,7 @@ Licence: GPL
// Language-specific includes // Language-specific includes
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
// Platform-specific includes // Platform-specific includes

130
SD-image/control.php Normal file
View file

@ -0,0 +1,130 @@
<!DOCTYPE HTML>
<head>
<style type="text/css">td { text-align: center; } </style>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.php">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<table border="1"><div align="center">
<tr>
<th colspan="9">Move X Y Z</th>
</tr>
<tr>
<td rowspan="2"><button type="button" onclick="return homea()">Home<br>All</button></td>
<td colspan="4">- mm</td>
<td colspan="4">+ mm</td>
</tr>
<tr>
<td>-100</td>
<td>-10</td>
<td>-1</td>
<td>-0.1</td>
<td>0.1</td>
<td>1</td>
<td>10</td>
<td>100</td>
</tr>
<tr>
<td><button type="button" onclick="return homex()">Home X</button></td>
<td><button type="button" onclick="return xm100mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm10mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm1mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm01mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xp01mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp1mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp10mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp100mm()">X -&gt;</button></td>
</tr>
<tr>
<td><button type="button" onclick="return homey()">Home Y</button></td>
<td><button type="button" onclick="return ym100mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym10mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym1mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym01mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return yp01mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp1mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp10mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp100mm()">Y -&gt;</button></td>
</tr>
<tr>
<td><button type="button" onclick="return homez()">Home Z</button></td>
<td><button type="button" onclick="return zm100mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm10mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm1mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm01mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zp01mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp1mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp10mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp100mm()">Z -&gt;</button></td>
</tr>
</div></table>
<br><br><form name="input" action="gather.asp" method="get">Send a G Code: <input type="text" name="gcode"><input type="submit" value="Send"></form>
<script language="javascript" type="text/javascript">
function homea(){ window.location.href = "control.php?gcode=G28";}
function homex(){ window.location.href = "control.php?gcode=G28%20X0";}
function homey(){ window.location.href = "control.php?gcode=G28%20Y0";}
function homez(){ window.location.href = "control.php?gcode=G28%20Z0";}
function xp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X0.1%0AG90";}
function xp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X1%0AG90";}
function xp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X10%0AG90";}
function xp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X100%0AG90";}
function xm01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X-0.1%0AG90";}
function xm1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X-1%0AG90";}
function xm10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X10%0AG90";}
function xm100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X100%0AG90";}
function yp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y0.1%0AG90";}
function yp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y1%0AG90";}
function yp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y10%0AG90";}
function yp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y100%0AG90";}
function ym01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y-0.1%0AG90";}
function ym1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y-1%0AG90";}
function ym10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y10%0AG90";}
function ym100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y100%0AG90";}
function zp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z0.1%0AG90";}
function zp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z1%0AG90";}
function zp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z10%0AG90";}
function zp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z100%0AG90";}
function zm01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z-0.1%0AG90";}
function zm1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z-1%0AG90";}
function zm10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z10%0AG90";}
function zm100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z100%0AG90";}
</script>
<br><br></html>

130
SD-image/control.php~ Normal file
View file

@ -0,0 +1,130 @@
<!DOCTYPE HTML>
<head>
<style type="text/css">td { text-align: center; } </style>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.php">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<table border="1"><div align="center">
<tr>
<th colspan="9">Move X Y Z</th>
</tr>
<tr>
<td rowspan="2"><button type="button" onclick="return homea()">Home<br>All</button></td>
<td colspan="4">- mm</td>
<td colspan="4">+ mm</td>
</tr>
<tr>
<td>-100</td>
<td>-10</td>
<td>-1</td>
<td>-0.1</td>
<td>0.1</td>
<td>1</td>
<td>10</td>
<td>100</td>
</tr>
<tr>
<td><button type="button" onclick="return homex()">Home X</button></td>
<td><button type="button" onclick="return xm100mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm10mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm1mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xm01mm()">&lt;- X</button></td>
<td><button type="button" onclick="return xp01mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp1mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp10mm()">X -&gt;</button></td>
<td><button type="button" onclick="return xp100mm()">X -&gt;</button></td>
</tr>
<tr>
<td><button type="button" onclick="return homey()">Home Y</button></td>
<td><button type="button" onclick="return ym100mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym10mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym1mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return ym01mm()">&lt;- Y</button></td>
<td><button type="button" onclick="return yp01mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp1mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp10mm()">Y -&gt;</button></td>
<td><button type="button" onclick="return yp100mm()">Y -&gt;</button></td>
</tr>
<tr>
<td><button type="button" onclick="return homez()">Home Z</button></td>
<td><button type="button" onclick="return zm100mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm10mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm1mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zm01mm()">&lt;- Z</button></td>
<td><button type="button" onclick="return zp01mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp1mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp10mm()">Z -&gt;</button></td>
<td><button type="button" onclick="return zp100mm()">Z -&gt;</button></td>
</tr>
</div></table>
<br><br><form name="input" action="gather.asp" method="get">Send a G Code: <input type="text" name="gcode"><input type="submit" value="Send"></form>
<script language="javascript" type="text/javascript">
function homea(){ window.location.href = "control.php?gcode=G28";}
function homex(){ window.location.href = "control.php?gcode=G28%20X0";}
function homey(){ window.location.href = "control.php?gcode=G28%20Y0";}
function homez(){ window.location.href = "control.php?gcode=G28%20Z0";}
function xp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X0.1%0AG90";}
function xp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X1%0AG90";}
function xp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X10%0AG90";}
function xp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X100%0AG90";}
function xm01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X-0.1%0AG90";}
function xm1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X-1%0AG90";}
function xm10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X10%0AG90";}
function xm100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20X100%0AG90";}
function yp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y0.1%0AG90";}
function yp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y1%0AG90";}
function yp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y10%0AG90";}
function yp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y100%0AG90";}
function ym01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y-0.1%0AG90";}
function ym1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y-1%0AG90";}
function ym10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y10%0AG90";}
function ym100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Y100%0AG90";}
function zp01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z0.1%0AG90";}
function zp1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z1%0AG90";}
function zp10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z10%0AG90";}
function zp100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z100%0AG90";}
function zm01mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z-0.1%0AG90";}
function zm1mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z-1%0AG90";}
function zm10mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z10%0AG90";}
function zm100mm(){ window.location.href = "control.php?gcode=G91%0AG1%20Z100%0AG90";}
</script>
<br><br></html>

11
SD-image/html404.htm Normal file
View file

@ -0,0 +1,11 @@
<!DOCTYPE HTML>
<html>
<center>
<h3><br><br>RepRap Firmware<br><br>404 Error: page not found.</h3>
<center>
</html>

View file

@ -1,18 +1,11 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html> <html>
<head> <center>
<title>404 Error</title>
</head> <h3><br><br>404 Error: page not found.</h3>
<body>
<center> <center>
<h3>
RepRap Web Interface
<br><br><br>
RepRapPro Firmware - 404 Error: page not found. </html>
</h3>
</center>
</body></html>

6
SD-image/logout.php Normal file
View file

@ -0,0 +1,6 @@
<!DOCTYPE HTML>
<head>
<?php print(logout()); ?>
</head>
<html>
</html>

8
SD-image/logout.php~ Normal file
View file

@ -0,0 +1,8 @@
<!DOCTYPE HTML>
<head>
<?php print(logout()); ?>
</head>
<html>
</html>

13
SD-image/passwd.php Normal file
View file

@ -0,0 +1,13 @@
<!DOCTYPE HTML>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<br>
<form name="input" action="control.php" method="get">Password: <input type="password" name="pwd"><input type="submit" value="Submit">
<br><br>
</html>

13
SD-image/passwd.php~ Normal file
View file

@ -0,0 +1,13 @@
<!DOCTYPE HTML>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<br>
<form name="input" action="gather.asp" method="get">Password: <input type="password" name="pwd"><input type="submit" value="Submit">
<br><br>
</html>

30
SD-image/print.php Normal file
View file

@ -0,0 +1,30 @@
<!DOCTYPE HTML>
<head>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.php">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<br><br>Print: allow user to click a file to print it, upload files, delete files.
</html>

30
SD-image/print.php~ Normal file
View file

@ -0,0 +1,30 @@
<!DOCTYPE HTML>
<head>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.htm">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<br><br>Print: allow user to click a file to print it, upload files, delete files.
</html>

30
SD-image/settings.php Normal file
View file

@ -0,0 +1,30 @@
<!DOCTYPE HTML>
<head>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.php">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<br><br>Settings: allow user to rename machine, set password, set steps/mm etc etc and record the lot.
</html>

30
SD-image/settings.php~ Normal file
View file

@ -0,0 +1,30 @@
<!DOCTYPE HTML>
<head>
</head>
<html>
<h2>RepRap:
<?php print(getMyName()); ?>
<?php if(gotPassword()) echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://reprappro.com" target="_blank"><img src="logo.png" alt="RepRapPro logo"></a>'; ?>
</h2><br><br>
<?php if(printLinkTable()) echo '<table><tr>
<td>&nbsp;&nbsp;&nbsp;<a href="control.php">Control</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="print.php">Print</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="http://reprap.org/wiki/RepRapPro_RepRap_Firmware" target="_blank">Help</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="settings.php">Settings</a>&nbsp;&nbsp;&nbsp;</td>
<td>&nbsp;&nbsp;&nbsp;<a href="logout.htm">Logout</a>&nbsp;&nbsp;&nbsp;</td>
</tr></table>
<br><br>'; ?>
<br><br>Settings: allow user to rename machine, set password, set steps/mm etc etc and record the lot.
</html>

View file

@ -7,6 +7,15 @@ RepRap machine. It interprests returned values from those pages and uses them t
which it sends to the RepRap. It also collects values from the RepRap like temperature and uses which it sends to the RepRap. It also collects values from the RepRap like temperature and uses
those to construct the web pages. those to construct the web pages.
It implements very very restricted PHP. It can do:
<?php print(myStringFunction()); ?>
<?php if(myBooleanFunction()) print(myOtherStringFunction()); ?>
<?php if(myOtherBooleanFunction()) echo 'Some arbitrarily long string of HTML including newlines up to this quote:'; ?>
Note that by printing a function that returns "" you can just call
that function in this C++ code with no effect on the loaded web page.
----------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------
Version 0.1 Version 0.1
@ -26,8 +35,13 @@ Licence: GPL
#define CLIENT_CLOSE_DELAY 1000 // Microseconds to wait after serving a page #define CLIENT_CLOSE_DELAY 1000 // Microseconds to wait after serving a page
#define PASSWORD_PAGE "passwd.htm" #define PASSWORD_PAGE "passwd.php"
#define STRING_LENGTH 1000 #define STRING_LENGTH 1000
#define PHP_TAG_LENGTH 200
#define PHP_IF 1
#define PHP_ECHO 2
#define PHP_PRINT 3
#define NO_PHP 99
class Webserver class Webserver
{ {
@ -49,22 +63,21 @@ class Webserver
void ParseQualifier(); void ParseQualifier();
void CheckPassword(); void CheckPassword();
boolean LoadGcodeBuffer(char* gc, boolean convertWeb); boolean LoadGcodeBuffer(char* gc, boolean convertWeb);
boolean InternalFile(char* nameOfFileToSend);
void InternalHead(boolean sendTab, int noLink, char* headString);
void InternalTail();
void CloseClient(); void CloseClient();
void SendControlPage(); void initialisePHP();
void SendPrintPage(); char PHPParse(char* phpString);
void SendHelpPage(); boolean printHeadString();
void SendSettingsPage(); boolean printLinkTable();
void SendLogoutPage(); boolean callPHPBoolean(char* phpRecord);
void SendPasswordPage(); char* callPHPString(char* phpRecord);
void Send404Page(); void ProcessPHPByte(char b);
void WritePHPByte();
Platform* platform; Platform* platform;
unsigned long lastTime; unsigned long lastTime;
int fileBeingSent; int fileBeingSent;
boolean writing; boolean writing;
boolean inPHPFile;
boolean clientLineIsBlank; boolean clientLineIsBlank;
unsigned long clientCloseTime; unsigned long clientCloseTime;
boolean needToCloseClient; boolean needToCloseClient;
@ -78,6 +91,20 @@ class Webserver
boolean gotPassword; boolean gotPassword;
char* password; char* password;
char* myName; char* myName;
char phpTag[PHP_TAG_LENGTH];
char phpRecord[PHP_TAG_LENGTH];
int inPHPString;
int phpPointer;
boolean phpEchoing;
boolean phpIfing;
boolean phpPrinting;
boolean eatInput;
boolean recordInput;
boolean ifWasTrue;
boolean sendTable;
char eatInputChar;
int phpRecordPointer;
boolean ifwasTrue;
}; };

View file

@ -7,6 +7,16 @@ RepRap machine. It interprests returned values from those pages and uses them t
which it sends to the RepRap. It also collects values from the RepRap like temperature and uses which it sends to the RepRap. It also collects values from the RepRap like temperature and uses
those to construct the web pages. those to construct the web pages.
It implements very very restricted PHP. It can do:
<?php print(myStringFunction()); ?>
<?php if(myBooleanFunction()) print(myOtherStringFunction()); ?>
<?php if(myOtherBooleanFunction()) echo 'Some arbitrarily long string of HTML including newlines up to this quote:'; ?>
Note that by printing a function that returns "" you can just call
that function in this C++ code with no effect on the loaded web page.
----------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------
Version 0.1 Version 0.1
@ -29,6 +39,8 @@ Webserver::Webserver(Platform* p)
platform = p; platform = p;
lastTime = platform->time(); lastTime = platform->time();
writing = false; writing = false;
inPHPFile = false;
initialisePHP();
clientLineIsBlank = true; clientLineIsBlank = true;
needToCloseClient = false; needToCloseClient = false;
clientLinePointer = 0; clientLinePointer = 0;
@ -39,6 +51,8 @@ Webserver::Webserver(Platform* p)
gotPassword = false; gotPassword = false;
gcodeAvailable = false; gcodeAvailable = false;
gcodePointer = 0; gcodePointer = 0;
sendTable = true;
phpRecordPointer = 0;
} }
boolean Webserver::Available() boolean Webserver::Available()
@ -81,22 +95,19 @@ boolean Webserver::LoadGcodeBuffer(char* gc, boolean convertWeb)
{ {
if(c == '+' && convertWeb) if(c == '+' && convertWeb)
c = ' '; c = ' ';
if(c == '%'&& convertWeb) // FIXME - just convert the next two hex bytes to a char if(c == '%'&& convertWeb)
{ {
if(StringStartsWith(&gc[gcp], "2B")) c = 0;
c = '+'; if(isalpha(gc[gcp]))
else if(StringStartsWith(&gc[gcp], "20")) c += 16*(gc[gcp] - 'A' + 10);
c = ' ';
else if(StringStartsWith(&gc[gcp], "0A"))
c = '\n';
else else
{ c += 16*(gc[gcp] - '0');
platform->Message(HOST_MESSAGE, "Webserver: Dud web-form byte: "); gcp++;
platform->Message(HOST_MESSAGE, gc); if(isalpha(gc[gcp]))
platform->Message(HOST_MESSAGE, "\n"); c += gc[gcp] - 'A' + 10;
} else
gcp += 2; c += gc[gcp] - '0';
gcp++;
} }
gcodeBuffer[gcodePointer++] = c; gcodeBuffer[gcodePointer++] = c;
} }
@ -104,7 +115,6 @@ boolean Webserver::LoadGcodeBuffer(char* gc, boolean convertWeb)
gcodeBuffer[gcodePointer] = 0; gcodeBuffer[gcodePointer] = 0;
gcodePointer = 0; gcodePointer = 0;
gcodeAvailable = true; gcodeAvailable = true;
return true; return true;
} }
@ -132,262 +142,24 @@ boolean Webserver::StringStartsWith(char* string, char* starting)
return true; return true;
} }
void Webserver::InternalHead(boolean sendTab, int noLink, char* headString)
{
platform->SendToClient("<!DOCTYPE HTML><head>");
if(headString)
platform->SendToClient(headString);
platform->SendToClient("</head><html><h2>RepRap: ");
platform->SendToClient(myName);
if(gotPassword)
platform->SendToClient("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"http://reprappro.com\" target=\"_blank\"><img src=\"logo.png\" alt=\"RepRapPro logo\"></a>");
platform->SendToClient("</h2><br><br>");
if(sendTab)
{
platform->SendToClient("<table><tr>"); // border=\"1\"
if(noLink == 0)
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;Control&nbsp;&nbsp;&nbsp;</td>");
else
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;<a href=\"control.htm\">Control</a>&nbsp;&nbsp;&nbsp;</td>");
if(noLink == 1)
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;Print&nbsp;&nbsp;&nbsp;</td>");
else
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;<a href=\"print.htm\">Print</a>&nbsp;&nbsp;&nbsp;</td>");
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;<a href=\"http://reprap.org/wiki/RepRapPro_RepRap_Firmware\" target=\"_blank\">Help</a>&nbsp;&nbsp;&nbsp;</td>");
if(noLink == 3)
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;Settings&nbsp;&nbsp;&nbsp;</td>");
else
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;<a href=\"settings.htm\">Settings</a>&nbsp;&nbsp;&nbsp;</td>");
platform->SendToClient("<td>&nbsp;&nbsp;&nbsp;<a href=\"logout.htm\">Logout</a>&nbsp;&nbsp;&nbsp;</td>");
platform->SendToClient("</tr></table>");
}
platform->SendToClient("<br><br>");
}
void Webserver::CloseClient() void Webserver::CloseClient()
{ {
writing = false; writing = false;
inPHPFile = false;
initialisePHP();
clientCloseTime = platform->time(); clientCloseTime = platform->time();
needToCloseClient = true; needToCloseClient = true;
} }
void Webserver::InternalTail()
{
platform->SendToClient("<br><br></html>\n");
CloseClient();
}
void Webserver::SendControlPage()
{
InternalHead(true, 0, "<style type=\"text/css\">td { text-align: center; } </style>");
platform->SendToClient("<table border=\"1\"><div align=\"center\">");
platform->SendToClient("<tr>");
platform->SendToClient("<th colspan=\"9\">Move X Y Z</th>");
platform->SendToClient("</tr>");
platform->SendToClient("<tr>");
platform->SendToClient("<td rowspan=\"2\"><button type=\"button\" onclick=\"return homea()\">Home<br>All</button></td>");
platform->SendToClient("<td colspan=\"4\">- mm</td>");
platform->SendToClient("<td colspan=\"4\">+ mm</td>");
platform->SendToClient("</tr>");
platform->SendToClient("<tr>");
platform->SendToClient("<td>-100</td>");
platform->SendToClient("<td>-10</td>");
platform->SendToClient("<td>-1</td>");
platform->SendToClient("<td>-0.1</td>");
platform->SendToClient("<td>0.1</td>");
platform->SendToClient("<td>1</td>");
platform->SendToClient("<td>10</td>");
platform->SendToClient("<td>100</td>");
platform->SendToClient("</tr>");
platform->SendToClient("<tr>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return homex()\">Home X</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xm100mm()\">&lt;- X</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xm10mm()\">&lt;- X</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xm1mm()\">&lt;- X</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xm01mm()\">&lt;- X</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xp01mm()\">X -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xp1mm()\">X -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xp10mm()\">X -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return xp100mm()\">X -&gt;</button></td>");
platform->SendToClient("</tr>");
platform->SendToClient("<tr>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return homey()\">Home Y</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return ym100mm()\">&lt;- Y</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return ym10mm()\">&lt;- Y</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return ym1mm()\">&lt;- Y</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return ym01mm()\">&lt;- Y</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return yp01mm()\">Y -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return yp1mm()\">Y -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return yp10mm()\">Y -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return yp100mm()\">Y -&gt;</button></td>");
platform->SendToClient("</tr>");
platform->SendToClient("<tr>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return homez()\">Home Z</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zm100mm()\">&lt;- Z</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zm10mm()\">&lt;- Z</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zm1mm()\">&lt;- Z</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zm01mm()\">&lt;- Z</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zp01mm()\">Z -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zp1mm()\">Z -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zp10mm()\">Z -&gt;</button></td>");
platform->SendToClient("<td><button type=\"button\" onclick=\"return zp100mm()\">Z -&gt;</button></td>");
platform->SendToClient("</tr>");
platform->SendToClient("</div></table>");
platform->SendToClient("<br><br><form name=\"input\" action=\"gather.asp\" method=\"get\">Send a G Code: <input type=\"text\" name=\"gcode\"><input type=\"submit\" value=\"Send\"></form>\n");
platform->SendToClient("<script language=\"javascript\" type=\"text/javascript\">");
// FIXME - this lot can be be easily generated by a single function
platform->SendToClient("function homea(){ window.location.href = \"control.htm?gcode=G28\";}");
platform->SendToClient("function homex(){ window.location.href = \"control.htm?gcode=G28 X0\";}");
platform->SendToClient("function homey(){ window.location.href = \"control.htm?gcode=G28 Y0\";}");
platform->SendToClient("function homez(){ window.location.href = \"control.htm?gcode=G28 Z0\";}");
platform->SendToClient("function xp01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X0.1%0AG90\";}");
platform->SendToClient("function xp1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X1%0AG90\";}");
platform->SendToClient("function xp10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X10%0AG90\";}");
platform->SendToClient("function xp100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X100%0AG90\";}");
platform->SendToClient("function xm01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X-0.1%0AG90\";}");
platform->SendToClient("function xm1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X-1%0AG90\";}");
platform->SendToClient("function xm10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X10%0AG90\";}");
platform->SendToClient("function xm100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 X100%0AG90\";}");
platform->SendToClient("function yp01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y0.1%0AG90\";}");
platform->SendToClient("function yp1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y1%0AG90\";}");
platform->SendToClient("function yp10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y10%0AG90\";}");
platform->SendToClient("function yp100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y100%0AG90\";}");
platform->SendToClient("function ym01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y-0.1%0AG90\";}");
platform->SendToClient("function ym1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y-1%0AG90\";}");
platform->SendToClient("function ym10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y10%0AG90\";}");
platform->SendToClient("function ym100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Y100%0AG90\";}");
platform->SendToClient("function zp01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z0.1%0AG90\";}");
platform->SendToClient("function zp1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z1%0AG90\";}");
platform->SendToClient("function zp10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z10%0AG90\";}");
platform->SendToClient("function zp100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z100%0AG90\";}");
platform->SendToClient("function zm01mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z-0.1%0AG90\";}");
platform->SendToClient("function zm1mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z-1%0AG90\";}");
platform->SendToClient("function zm10mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z10%0AG90\";}");
platform->SendToClient("function zm100mm(){ window.location.href = \"control.htm?gcode=G91%0AG1 Z100%0AG90\";}");
platform->SendToClient("</script>");
InternalTail();
}
void Webserver::SendPrintPage()
{
InternalHead(true, 1, 0);
platform->SendToClient("Print Page - List files in a table: click one to print it; upload a file; delete a file\n");
InternalTail();
}
void Webserver::SendHelpPage()
{
InternalHead(true, 2, 0);
platform->SendToClient("Help Page");
InternalTail();
}
void Webserver::SendSettingsPage()
{
InternalHead(true, 3, 0);
platform->SendToClient("Settings Page - Change things and save the result: machine name, password, e steps/mm etc etc");
InternalTail();
}
void Webserver::SendLogoutPage()
{
gotPassword = false;
SendPasswordPage();
}
void Webserver::SendPasswordPage()
{
InternalHead(false, -1, 0);
platform->SendToClient("<form name=\"input\" action=\"gather.asp\" method=\"get\">Password: <input type=\"password\" name=\"pwd\"><input type=\"submit\" value=\"Submit\">");
InternalTail();
}
void Webserver::Send404Page()
{
InternalHead(false, -1, 0);
platform->SendToClient("<h3><br><br>404 Error: page not found.</h3>");
InternalTail();
}
boolean Webserver::InternalFile(char* nameOfFileToSend)
{
if(StringStartsWith(nameOfFileToSend, "index.htm") ||
StringStartsWith(nameOfFileToSend, "control.htm"))
{
SendControlPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "print.htm"))
{
SendPrintPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "help.htm"))
{
SendHelpPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "settings.htm"))
{
SendSettingsPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "logout.htm"))
{
SendLogoutPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "passwd.htm"))
{
SendPasswordPage();
return true;
}
if(StringStartsWith(nameOfFileToSend, "html404.htm"))
{
Send404Page();
return true;
}
return false;
}
void Webserver::SendFile(char* nameOfFileToSend) void Webserver::SendFile(char* nameOfFileToSend)
{ {
if(!gotPassword) if(!gotPassword)
{
sendTable = false;
nameOfFileToSend = PASSWORD_PAGE; nameOfFileToSend = PASSWORD_PAGE;
} else
sendTable = true;
platform->SendToClient("HTTP/1.1 200 OK\n"); platform->SendToClient("HTTP/1.1 200 OK\n");
@ -406,8 +178,8 @@ void Webserver::SendFile(char* nameOfFileToSend)
platform->SendToClient('\n'); platform->SendToClient('\n');
if(InternalFile(nameOfFileToSend)) // if(InternalFile(nameOfFileToSend))
return; // return;
//Serial.print("File requested: "); //Serial.print("File requested: ");
//Serial.println(nameOfFileToSend); //Serial.println(nameOfFileToSend);
@ -415,10 +187,14 @@ void Webserver::SendFile(char* nameOfFileToSend)
fileBeingSent = platform->OpenFile(nameOfFileToSend, false); fileBeingSent = platform->OpenFile(nameOfFileToSend, false);
if(fileBeingSent < 0) if(fileBeingSent < 0)
{ {
InternalFile("html404.htm"); sendTable = false;
return; nameOfFileToSend = "html404.htm";
fileBeingSent = platform->OpenFile(nameOfFileToSend, false);
} }
inPHPFile = StringEndsWith(nameOfFileToSend, ".php");
if(inPHPFile)
initialisePHP();
writing = true; writing = true;
} }
@ -435,6 +211,277 @@ void Webserver::WriteByte()
} }
void Webserver::initialisePHP()
{
phpTag[0] = 0;
inPHPString = 0;
phpPointer = 0;
phpEchoing = false;
phpIfing = false;
phpPrinting = false;
eatInput = false;
recordInput = false;
phpRecordPointer = 0;
phpRecord[phpRecordPointer] = 0;
ifWasTrue = true;
}
char Webserver::PHPParse(char* phpString)
{
if(!strcmp(phpString, "if("))
return PHP_IF;
if(!strcmp(phpString, "echo"))
return PHP_ECHO;
if(!strcmp(phpString, "print("))
return PHP_PRINT;
return NO_PHP;
}
boolean Webserver::printLinkTable() { boolean r = sendTable; sendTable = true; return r; }
boolean Webserver::callPHPBoolean(char* phpRecord)
{
if(!strcmp(phpRecord, "gotPassword("))
return gotPassword;
if(!strcmp(phpRecord, "printLinkTable("))
return printLinkTable();
platform->Message(HOST_MESSAGE, "callPHPBoolean(): non-existent function - ");
platform->Message(HOST_MESSAGE, phpRecord);
platform->Message(HOST_MESSAGE, "\n");
return true; // Best default
}
char* Webserver::callPHPString(char* phpRecord)
{
if(!strcmp(phpRecord, "getMyName("))
return myName;
if(!strcmp(phpRecord, "logout("))
{
gotPassword = false;
return "<meta http-equiv=\"REFRESH\" content=\"0;url=passwd.php\"></HEAD>";
}
platform->Message(HOST_MESSAGE, "callPHPString(): non-existent function - ");
platform->Message(HOST_MESSAGE, phpRecord);
platform->Message(HOST_MESSAGE, "\n");
return "";
}
void Webserver::ProcessPHPByte(char b)
{
if(eatInput)
{
if(b == eatInputChar)
eatInput = false;
return;
}
if(recordInput)
{
if(b == eatInputChar)
{
recordInput = false;
phpRecordPointer = 0;
return;
}
phpRecord[phpRecordPointer++] = b;
if(phpRecordPointer >= PHP_TAG_LENGTH)
{
platform->Message(HOST_MESSAGE, "ProcessPHPByte: PHP record buffer overflow.\n");
initialisePHP();
}
phpRecord[phpRecordPointer] = 0;
return;
}
if(phpEchoing)
{
if(b != '\'')
{
if(ifwasTrue)
platform->SendToClient(b);
} else
{
initialisePHP();
eatInput = true;
eatInputChar = '>';
}
return;
}
if(phpIfing)
{
boolean ifWas = callPHPBoolean(phpRecord);
initialisePHP();
ifWasTrue = ifWas;
inPHPString = 5;
if(b != ')')
{
eatInput = true;
eatInputChar = ')';
}
return;
}
if(phpPrinting)
{
char* thingToSend = callPHPString(phpRecord);
platform->SendToClient(thingToSend);
initialisePHP();
eatInput = true;
eatInputChar = '>';
return;
}
if(inPHPString >= 5)
{
// We are in a PHP expression
if(isspace(b))
return;
phpTag[phpPointer++] = b;
phpTag[phpPointer] = 0;
if(phpPointer >= PHP_TAG_LENGTH)
{
platform->Message(HOST_MESSAGE, "ProcessPHPByte: PHP buffer overflow: ");
platform->Message(HOST_MESSAGE, phpTag);
platform->Message(HOST_MESSAGE, "\n");
initialisePHP();
return;
}
switch(PHPParse(phpTag))
{
case PHP_ECHO:
phpEchoing = true;
eatInput = true;
eatInputChar = '\'';
break;
case PHP_IF:
phpIfing = true;
recordInput = true;
phpRecordPointer = 0;
phpRecord[phpRecordPointer] = 0;
eatInputChar = ')';
break;
case PHP_PRINT:
phpPrinting = true;
recordInput = true;
phpRecordPointer = 0;
phpRecord[phpRecordPointer] = 0;
eatInputChar = ')';
break;
default:
break;
}
return;
}
// We are not in a PHP expression
phpTag[inPHPString] = b;
switch(inPHPString)
{
case 0:
if(b == '<')
{
inPHPString = 1;
} else
{
phpTag[1] = 0;
inPHPString = 0;
platform->SendToClient(phpTag);
}
return;
case 1:
if(b == '?')
{
inPHPString = 2;
} else
{
phpTag[2] = 0;
inPHPString = 0;
platform->SendToClient(phpTag);
}
return;
case 2:
if(b == 'p')
{
inPHPString = 3;
} else
{
phpTag[3] = 0;
inPHPString = 0;
platform->SendToClient(phpTag);
}
return;
case 3:
if(b == 'h')
{
inPHPString = 4;
} else
{
phpTag[4] = 0;
inPHPString = 0;
platform->SendToClient(phpTag);
}
return;
case 4:
if(b == 'p')
{
inPHPString = 5;
phpTag[0] = 0;
phpPointer = 0;
} else
{
phpTag[5] = 0;
inPHPString = 0;
platform->SendToClient(phpTag);
}
return;
// Should never get here...
default:
platform->Message(HOST_MESSAGE, "ProcessPHPByte: PHP tag runout.");
platform->SendToClient(b);
initialisePHP();
}
}
void Webserver::WritePHPByte()
{
unsigned char b;
if(platform->Read(fileBeingSent, b))
ProcessPHPByte(b);
else
{
platform->Close(fileBeingSent);
initialisePHP();
CloseClient();
}
}
/* /*
Parse a string in clientLine[] from the user's web browser Parse a string in clientLine[] from the user's web browser
@ -456,6 +503,9 @@ void Webserver::ParseClientLine()
if(!StringStartsWith(clientLine, "GET")) if(!StringStartsWith(clientLine, "GET"))
return; return;
Serial.print("HTTP request: ");
Serial.println(clientLine);
int i = 5; int i = 5;
int j = 0; int j = 0;
clientRequest[j] = 0; clientRequest[j] = 0;
@ -480,8 +530,9 @@ void Webserver::ParseClientLine()
clientQualifier[j] = 0; clientQualifier[j] = 0;
} }
if(!clientRequest[0]) if(!clientRequest[0])
strcpy(clientRequest, "index.htm"); strcpy(clientRequest, "control.php");
} }
void Webserver::CheckPassword() void Webserver::CheckPassword()
@ -490,7 +541,7 @@ void Webserver::CheckPassword()
return; return;
gotPassword = true; gotPassword = true;
strcpy(clientRequest, "index.htm"); strcpy(clientRequest, "control.php");
} }
@ -498,13 +549,17 @@ void Webserver::ParseQualifier()
{ {
if(!clientQualifier[0]) if(!clientQualifier[0])
return; return;
if(StringStartsWith(clientQualifier, "pwd=")) if(StringStartsWith(clientQualifier, "pwd="))
CheckPassword(); CheckPassword();
if(!gotPassword) //Doan work fur nuffink
return;
if(StringStartsWith(clientQualifier, "gcode=")) if(StringStartsWith(clientQualifier, "gcode="))
{ {
if(!LoadGcodeBuffer(&clientQualifier[6], true)) if(!LoadGcodeBuffer(&clientQualifier[6], true))
platform->Message(HOST_MESSAGE, "Webserver: buffer not free!"); platform->Message(HOST_MESSAGE, "Webserver: buffer not free!");
strcpy(clientRequest, "index.htm"); // FIXME strcpy(clientRequest, "control.php"); // FIXME
} }
} }
@ -515,7 +570,10 @@ void Webserver::spin()
if(writing) if(writing)
{ {
WriteByte(); if(inPHPFile)
WritePHPByte();
else
WriteByte();
return; return;
} }
@ -524,7 +582,7 @@ void Webserver::spin()
if (platform->ClientStatus() & AVAILABLE) if (platform->ClientStatus() & AVAILABLE)
{ {
char c = platform->ClientRead(); char c = platform->ClientRead();
Serial.write(c); //Serial.write(c);
// if you've gotten to the end of the line (received a newline // if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended, // character) and the line is blank, the http request has ended,
// so you can send a reply // so you can send a reply