You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
9.2 KiB
C
280 lines
9.2 KiB
C
/**
|
|
******************************************************************************
|
|
* @file srvr.h
|
|
* @author Waveshare Team
|
|
* @version V1.0.0
|
|
* @date 23-January-2018
|
|
* @brief ESP8266 WiFi server.
|
|
* This file provides firmware functions:
|
|
* + Sending web page of the tool to a client's browser
|
|
* + Uploading images from client part by part
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
//#include <ESP8266WiFi.h>// ESP8266 and WiFi classes
|
|
#include <WiFi.h>
|
|
|
|
#include "buff.h" // POST request data accumulator
|
|
#include "epd.h" // e-Paper driver
|
|
|
|
#include "scripts.h" // JavaScript code
|
|
#include "css.h" // Cascading Style Sheets
|
|
#include "html.h" // HTML page of the tool
|
|
|
|
/* SSID and password of your WiFi net ----------------------------------------*/
|
|
const char *ssid = "Team:Chaos"; //"your ssid";
|
|
const char *password = "professional!lasertag!victory"; //"your password";
|
|
|
|
/* Static IP address Settings ------------------------------------------------*/
|
|
IPAddress staticIP(192, 168, 178, 200);
|
|
IPAddress gateway(192, 168, 178, 255);
|
|
IPAddress subnet(255, 255, 255, 0);
|
|
IPAddress dns(192, 168, 178, 1);
|
|
|
|
/* Server and IP address ------------------------------------------------------*/
|
|
WiFiServer server(80); // Wifi server exemplar using port 80
|
|
IPAddress myIP; // IP address in your local wifi net
|
|
|
|
/* The 'index' page flag ------------------------------------------------------*/
|
|
bool isIndexPage = true; // true : GET request, client needs 'index' page;
|
|
// false: POST request, server sends empty page.
|
|
/* Server initialization -------------------------------------------------------*/
|
|
void Srvr__setup()
|
|
{
|
|
Serial.println();
|
|
Serial.println();
|
|
Serial.print("Connecting to ");
|
|
Serial.println(ssid);
|
|
|
|
if (WiFi.config(staticIP, gateway, subnet, dns, dns) == false) {
|
|
Serial.println("Configuration failed.");
|
|
}
|
|
|
|
// Applying SSID and password
|
|
WiFi.begin(ssid, password);
|
|
|
|
// Waiting the connection to a router
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
// Connection is complete
|
|
Serial.println("");
|
|
|
|
Serial.println("WiFi connected");
|
|
|
|
// Start the server
|
|
server.begin();
|
|
Serial.println("Server started");
|
|
|
|
// Show obtained IP address in local Wifi net
|
|
Serial.println(myIP = WiFi.localIP());
|
|
}
|
|
|
|
/* Sending a script to the client's browser ------------------------------------*/
|
|
bool Srvr__file(WiFiClient client, int fileIndex, char *fileName)
|
|
{
|
|
// Print log message: sending of script file
|
|
Serial.print(fileName);
|
|
|
|
// Sent to the 'client' the header describing the type of data.
|
|
client.print(fileIndex == 0
|
|
? "HTTP/1.1 200 OK\r\nContent-Type: text/css\r\n\r\n"
|
|
: "HTTP/1.1 200 OK\r\nContent-Type: text/javascript\r\n\r\n");
|
|
|
|
// Choose the index of script
|
|
// (ESP8266 can't to send all of code by one file
|
|
// and needs split it on a few parts)
|
|
switch (fileIndex) {
|
|
case 0:
|
|
sendCSS(client);
|
|
break;
|
|
case 1:
|
|
sendJS_A(client);
|
|
break;
|
|
case 2:
|
|
sendJS_B(client);
|
|
break;
|
|
case 3:
|
|
sendJS_C(client);
|
|
break;
|
|
case 4:
|
|
sendJS_D(client);
|
|
break;
|
|
}
|
|
|
|
client.print("\r\n");
|
|
delay(1);
|
|
|
|
// Print log message: the end of request processing
|
|
Serial.println(">>>");
|
|
|
|
return true;
|
|
}
|
|
|
|
/* The server state observation loop -------------------------------------------*/
|
|
bool Srvr__loop()
|
|
{
|
|
// Looking for a client trying to connect to the server
|
|
WiFiClient client = server.available();
|
|
int16_t label = 0;
|
|
int16_t fale = 1000;
|
|
|
|
// Exit if there is no any clients
|
|
if (!client)
|
|
return false;
|
|
|
|
// Print log message: the start of request processing
|
|
Serial.print("<<<");
|
|
|
|
// Waiting the client is ready to send data
|
|
while (!client.available())
|
|
{
|
|
delay(1);
|
|
label++;
|
|
if(label > fale)
|
|
{
|
|
label = fale + 1;
|
|
if(!server.available())
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Set buffer's index to zero
|
|
// It means the buffer is empty initially
|
|
Buff__bufInd = 0;
|
|
|
|
// While the stream of 'client' has some data do...
|
|
while (client.available()) {
|
|
// Read a character from 'client'
|
|
int q = client.read();
|
|
|
|
// Save it in the buffer and increment its index
|
|
Buff__bufArr[Buff__bufInd++] = (byte)q;
|
|
|
|
// If the carachter means the end of line, then...
|
|
if ((q == 10) || (q == 13)) {
|
|
// Clean the buffer
|
|
Buff__bufInd = 0;
|
|
continue;
|
|
}
|
|
|
|
// Requests of files
|
|
if (Buff__bufInd >= 11) {
|
|
if (Buff__signature(Buff__bufInd - 11, "/styles.css"))
|
|
return Srvr__file(client, 0, "styles.css");
|
|
|
|
if (Buff__signature(Buff__bufInd - 11, "/scriptA.js"))
|
|
return Srvr__file(client, 1, "scriptA.js");
|
|
|
|
if (Buff__signature(Buff__bufInd - 11, "/scriptB.js"))
|
|
return Srvr__file(client, 2, "scriptB.js");
|
|
|
|
if (Buff__signature(Buff__bufInd - 11, "/scriptC.js"))
|
|
return Srvr__file(client, 3, "scriptC.js");
|
|
|
|
if (Buff__signature(Buff__bufInd - 11, "/scriptD.js"))
|
|
return Srvr__file(client, 4, "scriptD.js");
|
|
}
|
|
|
|
// If the buffer's length is larger, than 4 (length of command's name), then...
|
|
if (Buff__bufInd > 4) {
|
|
// It is probably POST request, no need to send the 'index' page
|
|
isIndexPage = false;
|
|
|
|
// e-Paper driver initialization
|
|
if (Buff__signature(Buff__bufInd - 4, "EPD")) {
|
|
Serial.print("\r\nEPD\r\n");
|
|
// Getting of e-Paper's type
|
|
EPD_dispIndex = (int)Buff__bufArr[Buff__bufInd - 1] - (int)'a';
|
|
if(EPD_dispIndex < 0)
|
|
EPD_dispIndex = (int)Buff__bufArr[Buff__bufInd - 1] - (int)'A' + 26;
|
|
// Print log message: initialization of e-Paper (e-Paper's type)
|
|
Serial.printf("EPD %s", EPD_dispMass[EPD_dispIndex].title);
|
|
|
|
// Initialization
|
|
EPD_dispInit();
|
|
//client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
|
|
break;
|
|
}
|
|
|
|
// Image loading
|
|
if (Buff__signature(Buff__bufInd - 4, "LOAD")) {
|
|
// Print log message: image loading
|
|
Serial.print("LOAD");
|
|
|
|
// Load data into the e-Paper
|
|
// if there is loading function for current channel (black or red)
|
|
if (EPD_dispLoad != 0)
|
|
EPD_dispLoad();
|
|
//client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
|
|
break;
|
|
}
|
|
|
|
// Select the next data channel
|
|
if (Buff__signature(Buff__bufInd - 4, "NEXT")) {
|
|
// Print log message: next data channel
|
|
Serial.print("NEXT");
|
|
|
|
// Instruction code for for writting data into
|
|
// e-Paper's memory
|
|
int code = EPD_dispMass[EPD_dispIndex].next;
|
|
|
|
// If the instruction code isn't '-1', then...
|
|
if (code != -1) {
|
|
// Print log message: instruction code
|
|
Serial.printf(" %d", code);
|
|
|
|
// Do the selection of the next data channel
|
|
EPD_SendCommand(code);
|
|
delay(2);
|
|
}
|
|
|
|
// Setup the function for loading choosen channel's data
|
|
EPD_dispLoad = EPD_dispMass[EPD_dispIndex].chRd;
|
|
//client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
|
|
break;
|
|
}
|
|
|
|
// If the loading is complete, then...
|
|
if (Buff__signature(Buff__bufInd - 4, "SHOW")) {
|
|
// Show results and Sleep
|
|
EPD_dispMass[EPD_dispIndex].show();
|
|
|
|
//Print log message: show
|
|
Serial.print("\r\nSHOW");
|
|
//client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
|
|
break;
|
|
}
|
|
|
|
// If the routine reaches this code,
|
|
// it means the there is no known commands,
|
|
// the server has to send the 'index' page
|
|
isIndexPage = true;
|
|
}
|
|
}
|
|
|
|
// Clear data stream of the 'client'
|
|
client.flush();
|
|
|
|
// Sent to the 'client' the header describing the type of data.
|
|
// In this case 'Content-Type' is 'text/html'
|
|
client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
|
|
|
|
// Send the 'index' page if it's needed
|
|
if (isIndexPage)
|
|
sendHtml(client, myIP);
|
|
else
|
|
client.print("Ok!");
|
|
|
|
client.print("\r\n");
|
|
delay(1);
|
|
|
|
// Print log message: the end of request processing
|
|
Serial.println(">>>");
|
|
return true;
|
|
}
|