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.

209 lines
5.8 KiB
C

/**
******************************************************************************
* @file srvr.h
* @author Waveshare Team
* @version V2.0.0
* @date 10-August-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
*
******************************************************************************
*/
/* Library includes ----------------------------------------------------------*/
#include <BluetoothSerial.h>
bool Srvr__btIsOn;// It's true when bluetooth is on
bool Srvr__btConn;// It's true when bluetooth has connected client
int Srvr__msgPos;// Position in buffer from where data is expected
int Srvr__length;// Length of loaded data
/* Client ---------------------------------------------------------------------*/
BluetoothSerial Srvr__btClient; // Bluetooth client
/* Avaialble bytes in a stream ------------------------------------------------*/
int Srvr__available()
{
return Srvr__btIsOn ? Srvr__btClient.available() : false;
}
void Srvr__write(const char*value)
{
// Write data to bluetooth
if (Srvr__btIsOn) Srvr__btClient.write((const uint8_t*)value, strlen(value));
}
int Srvr__read()
{
return Srvr__btIsOn ? Srvr__btClient.read() : -1;
}
void Srvr__flush()
{
// Clear Bluetooth's stream
if (Srvr__btIsOn) Srvr__btClient.flush();
}
/* Project includes ----------------------------------------------------------*/
#include "buff.h" // POST request data accumulator
#include "epd.h" // e-Paper driver
bool Srvr__btSetup()
{
// Name shown in bluetooth device list of App part (PC or smartphone)
String devName("esp32");
// Turning on
Srvr__btIsOn = Srvr__btClient.begin(devName);
// Show the connection result
if (Srvr__btIsOn) Serial.println("Bluetooth is on");
else Serial.println("Bluetooth is off");
// There is no connection yet
Srvr__btConn = false;
// Return the connection result
return Srvr__btIsOn;
}
/* The server state observation loop -------------------------------------------*/
bool Srvr__loop()
{
// Bluetooh connection checking
if (!Srvr__btIsOn) return false;
// Show and update the state if it was changed
if (Srvr__btConn != Srvr__btClient.hasClient())
{
Serial.print("Bluetooth status:");
Srvr__btConn = !Srvr__btConn;
if(Srvr__btConn)
Serial.println("connected");
else
Serial.println("disconnected");
}
// Exit if there is no bluetooth connection
if (!Srvr__btConn) return false;
// Waiting the client is ready to send data
while(!Srvr__btClient.available())
{
delay(1);
}
// 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 (Srvr__available())
{
// Read a character from 'client'
int q = Srvr__read();
// Save it in the buffer and increment its index
Buff__bufArr[Buff__bufInd++] = (byte)q;
}
Serial.println();
// Initialization
if (Buff__bufArr[0] == 'I')
{
Srvr__length = 0;
// Getting of e-Paper's type
EPD_dispIndex = Buff__bufArr[1];
// Print log message: initialization of e-Paper (e-Paper's type)
Serial.printf("<<<EPD %s", EPD_dispMass[EPD_dispIndex].title);
// Initialization
EPD_dispInit();
Buff__bufInd = 0;
Srvr__flush();
}
// Loading of pixels' data
else if (Buff__bufArr[0] == 'L')
{
// Print log message: image loading
Serial.print("<<<LOAD");
int dataSize = Buff__getWord(1);
Srvr__length += dataSize;
if ((Buff__bufInd < dataSize) || Srvr__length != Buff__getN3(3))
{
Buff__bufInd = 0;
Srvr__flush();
Serial.print(" - failed!>>>");
Srvr__write("Error!");
return true;
}
// Load data into the e-Paper
// if there is loading function for current channel (black or red)
if (EPD_dispLoad != 0) EPD_dispLoad();
Buff__bufInd = 0;
Srvr__flush();
}
// Initialize next channel
else if (Buff__bufArr[0] == 'N')
{
// 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;
// e-Paper '2.7' (index 8) needs inverting of image data bits
EPD_invert = (EPD_dispIndex == 8);
// 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;
Buff__bufInd = 0;
Srvr__flush();
}
// Show loaded picture
else if (Buff__bufArr[0] == 'S')
{
EPD_dispMass[EPD_dispIndex].show();
Buff__bufInd = 0;
Srvr__flush();
//Print log message: show
Serial.print("<<<SHOW");
}
// Send message "Ok!" to continue
Srvr__write("Ok!");
delay(1);
// Print log message: the end of request processing
Serial.print(">>>");
return true;
}