Traducción al Español - Spanish translation
parent
bd8422b228
commit
bc2cb9e25a
|
|
@ -1,414 +1,414 @@
|
||||||
/** The MIT License (MIT)
|
/** The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2018 David Payne
|
Copyright (c) 2018 David Payne
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Additional Contributions:
|
// Additional Contributions:
|
||||||
/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */
|
/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */
|
||||||
|
|
||||||
#include "OctoPrintClient.h"
|
#include "OctoPrintClient.h"
|
||||||
|
|
||||||
OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
||||||
updatePrintClient(ApiKey, server, port, user, pass, psu);
|
updatePrintClient(ApiKey, server, port, user, pass, psu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctoPrintClient::updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
void OctoPrintClient::updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
||||||
server.toCharArray(myServer, 100);
|
server.toCharArray(myServer, 100);
|
||||||
myApiKey = ApiKey;
|
myApiKey = ApiKey;
|
||||||
myPort = port;
|
myPort = port;
|
||||||
encodedAuth = "";
|
encodedAuth = "";
|
||||||
if (user != "") {
|
if (user != "") {
|
||||||
String userpass = user + ":" + pass;
|
String userpass = user + ":" + pass;
|
||||||
base64 b64;
|
base64 b64;
|
||||||
encodedAuth = b64.encode(userpass, true);
|
encodedAuth = b64.encode(userpass, true);
|
||||||
}
|
}
|
||||||
pollPsu = psu;
|
pollPsu = psu;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean OctoPrintClient::validate() {
|
boolean OctoPrintClient::validate() {
|
||||||
boolean rtnValue = false;
|
boolean rtnValue = false;
|
||||||
printerData.error = "";
|
printerData.error = "";
|
||||||
if (String(myServer) == "") {
|
if (String(myServer) == "") {
|
||||||
printerData.error += "Server address is required; ";
|
printerData.error += "La dirección del servidor es obligatoria; ";
|
||||||
}
|
}
|
||||||
if (myApiKey == "") {
|
if (myApiKey == "") {
|
||||||
printerData.error += "ApiKey is required; ";
|
printerData.error += "La ApiKey es obligatoria; ";
|
||||||
}
|
}
|
||||||
if (printerData.error == "") {
|
if (printerData.error == "") {
|
||||||
rtnValue = true;
|
rtnValue = true;
|
||||||
}
|
}
|
||||||
return rtnValue;
|
return rtnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) {
|
WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) {
|
||||||
WiFiClient printClient;
|
WiFiClient printClient;
|
||||||
printClient.setTimeout(5000);
|
printClient.setTimeout(5000);
|
||||||
|
|
||||||
Serial.println("Getting Octoprint Data via GET");
|
Serial.println("Obteniendo datos de Octoprint via GET");
|
||||||
Serial.println(apiGetData);
|
Serial.println(apiGetData);
|
||||||
result = "";
|
result = "";
|
||||||
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
||||||
printClient.println(apiGetData);
|
printClient.println(apiGetData);
|
||||||
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
||||||
printClient.println("X-Api-Key: " + myApiKey);
|
printClient.println("X-Api-Key: " + myApiKey);
|
||||||
if (encodedAuth != "") {
|
if (encodedAuth != "") {
|
||||||
printClient.print("Authorization: ");
|
printClient.print("Authorization: ");
|
||||||
printClient.println("Basic " + encodedAuth);
|
printClient.println("Basic " + encodedAuth);
|
||||||
}
|
}
|
||||||
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
||||||
printClient.println("Connection: close");
|
printClient.println("Connection: close");
|
||||||
if (printClient.println() == 0) {
|
if (printClient.println() == 0) {
|
||||||
Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed.");
|
Serial.println("Conexión a " + String(myServer) + ":" + String(myPort) + " fallida.");
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed.";
|
printerData.error = "Conexión a " + String(myServer) + ":" + String(myPort) + " fallida.";
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
Serial.println("Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check HTTP status
|
// Check HTTP status
|
||||||
char status[32] = {0};
|
char status[32] = {0};
|
||||||
printClient.readBytesUntil('\r', status, sizeof(status));
|
printClient.readBytesUntil('\r', status, sizeof(status));
|
||||||
if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) {
|
if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) {
|
||||||
Serial.print(F("Unexpected response: "));
|
Serial.print(F("Respuesta inesperada: "));
|
||||||
Serial.println(status);
|
Serial.println(status);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.error = "Response: " + String(status);
|
printerData.error = "Respuesta: " + String(status);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip HTTP headers
|
// Skip HTTP headers
|
||||||
char endOfHeaders[] = "\r\n\r\n";
|
char endOfHeaders[] = "\r\n\r\n";
|
||||||
if (!printClient.find(endOfHeaders)) {
|
if (!printClient.find(endOfHeaders)) {
|
||||||
Serial.println(F("Invalid response"));
|
Serial.println(F("Respuesta no válida"));
|
||||||
printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Respuesta no válida de " + String(myServer) + ":" + String(myPort);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBody) {
|
WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBody) {
|
||||||
WiFiClient printClient;
|
WiFiClient printClient;
|
||||||
printClient.setTimeout(5000);
|
printClient.setTimeout(5000);
|
||||||
|
|
||||||
Serial.println("Getting Octoprint Data via POST");
|
Serial.println("Obteniendo datos de Octoprint via POST");
|
||||||
Serial.println(apiPostData + " | " + apiPostBody);
|
Serial.println(apiPostData + " | " + apiPostBody);
|
||||||
result = "";
|
result = "";
|
||||||
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
||||||
printClient.println(apiPostData);
|
printClient.println(apiPostData);
|
||||||
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
||||||
printClient.println("Connection: close");
|
printClient.println("Conexión: close");
|
||||||
printClient.println("X-Api-Key: " + myApiKey);
|
printClient.println("X-Api-Key: " + myApiKey);
|
||||||
if (encodedAuth != "") {
|
if (encodedAuth != "") {
|
||||||
printClient.print("Authorization: ");
|
printClient.print("Authorization: ");
|
||||||
printClient.println("Basic " + encodedAuth);
|
printClient.println("Basic " + encodedAuth);
|
||||||
}
|
}
|
||||||
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
||||||
printClient.println("Content-Type: application/json");
|
printClient.println("Content-Type: application/json");
|
||||||
printClient.print("Content-Length: ");
|
printClient.print("Content-Length: ");
|
||||||
printClient.println(apiPostBody.length());
|
printClient.println(apiPostBody.length());
|
||||||
printClient.println();
|
printClient.println();
|
||||||
printClient.println(apiPostBody);
|
printClient.println(apiPostBody);
|
||||||
if (printClient.println() == 0) {
|
if (printClient.println() == 0) {
|
||||||
Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed.");
|
Serial.println("Conexión a " + String(myServer) + ":" + String(myPort) + " fallida.");
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed.";
|
printerData.error = "Conexión a " + String(myServer) + ":" + String(myPort) + " fallida.";
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
Serial.println("Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check HTTP status
|
// Check HTTP status
|
||||||
char status[32] = {0};
|
char status[32] = {0};
|
||||||
printClient.readBytesUntil('\r', status, sizeof(status));
|
printClient.readBytesUntil('\r', status, sizeof(status));
|
||||||
if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) {
|
if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) {
|
||||||
Serial.print(F("Unexpected response: "));
|
Serial.print(F("Respuesta inesperada: "));
|
||||||
Serial.println(status);
|
Serial.println(status);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.error = "Response: " + String(status);
|
printerData.error = "Respuesta: " + String(status);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip HTTP headers
|
// Skip HTTP headers
|
||||||
char endOfHeaders[] = "\r\n\r\n";
|
char endOfHeaders[] = "\r\n\r\n";
|
||||||
if (!printClient.find(endOfHeaders)) {
|
if (!printClient.find(endOfHeaders)) {
|
||||||
Serial.println(F("Invalid response"));
|
Serial.println(F("Respuesta no válida"));
|
||||||
printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Respuesta no válida de " + String(myServer) + ":" + String(myPort);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctoPrintClient::getPrinterJobResults() {
|
void OctoPrintClient::getPrinterJobResults() {
|
||||||
if (!validate()) {
|
if (!validate()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//**** get the Printer Job status
|
//**** get the Printer Job status
|
||||||
String apiGetData = "GET /api/job HTTP/1.1";
|
String apiGetData = "GET /api/job HTTP/1.1";
|
||||||
WiFiClient printClient = getSubmitRequest(apiGetData);
|
WiFiClient printClient = getSubmitRequest(apiGetData);
|
||||||
if (printerData.error != "") {
|
if (printerData.error != "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710;
|
const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710;
|
||||||
DynamicJsonBuffer jsonBuffer(bufferSize);
|
DynamicJsonBuffer jsonBuffer(bufferSize);
|
||||||
|
|
||||||
// Parse JSON object
|
// Parse JSON object
|
||||||
JsonObject& root = jsonBuffer.parseObject(printClient);
|
JsonObject& root = jsonBuffer.parseObject(printClient);
|
||||||
if (!root.success()) {
|
if (!root.success()) {
|
||||||
Serial.println("OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort));
|
Serial.println("Fallo al parsear los datos de OctoPrint: " + String(myServer) + ":" + String(myPort));
|
||||||
printerData.error = "OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Fallo al parsear los datos de OctoPrint: " + String(myServer) + ":" + String(myPort);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printerData.averagePrintTime = (const char*)root["job"]["averagePrintTime"];
|
printerData.averagePrintTime = (const char*)root["job"]["averagePrintTime"];
|
||||||
printerData.estimatedPrintTime = (const char*)root["job"]["estimatedPrintTime"];
|
printerData.estimatedPrintTime = (const char*)root["job"]["estimatedPrintTime"];
|
||||||
printerData.fileName = (const char*)root["job"]["file"]["name"];
|
printerData.fileName = (const char*)root["job"]["file"]["name"];
|
||||||
printerData.fileSize = (const char*)root["job"]["file"]["size"];
|
printerData.fileSize = (const char*)root["job"]["file"]["size"];
|
||||||
printerData.lastPrintTime = (const char*)root["job"]["lastPrintTime"];
|
printerData.lastPrintTime = (const char*)root["job"]["lastPrintTime"];
|
||||||
printerData.progressCompletion = (const char*)root["progress"]["completion"];
|
printerData.progressCompletion = (const char*)root["progress"]["completion"];
|
||||||
printerData.progressFilepos = (const char*)root["progress"]["filepos"];
|
printerData.progressFilepos = (const char*)root["progress"]["filepos"];
|
||||||
printerData.progressPrintTime = (const char*)root["progress"]["printTime"];
|
printerData.progressPrintTime = (const char*)root["progress"]["printTime"];
|
||||||
printerData.progressPrintTimeLeft = (const char*)root["progress"]["printTimeLeft"];
|
printerData.progressPrintTimeLeft = (const char*)root["progress"]["printTimeLeft"];
|
||||||
printerData.filamentLength = (const char*)root["job"]["filament"]["tool0"]["length"];
|
printerData.filamentLength = (const char*)root["job"]["filament"]["tool0"]["length"];
|
||||||
printerData.state = (const char*)root["state"];
|
printerData.state = (const char*)root["state"];
|
||||||
|
|
||||||
if (isOperational()) {
|
if (isOperational()) {
|
||||||
Serial.println("Status: " + printerData.state);
|
Serial.println("Estado: " + printerData.state);
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Printer Not Operational");
|
Serial.println("Impresora no disponible");
|
||||||
}
|
}
|
||||||
|
|
||||||
//**** get the Printer Temps and Stat
|
//**** get the Printer Temps and Stat
|
||||||
apiGetData = "GET /api/printer?exclude=sd,history HTTP/1.1";
|
apiGetData = "GET /api/printer?exclude=sd,history HTTP/1.1";
|
||||||
printClient = getSubmitRequest(apiGetData);
|
printClient = getSubmitRequest(apiGetData);
|
||||||
if (printerData.error != "") {
|
if (printerData.error != "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300;
|
const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300;
|
||||||
DynamicJsonBuffer jsonBuffer2(bufferSize2);
|
DynamicJsonBuffer jsonBuffer2(bufferSize2);
|
||||||
|
|
||||||
// Parse JSON object
|
// Parse JSON object
|
||||||
JsonObject& root2 = jsonBuffer2.parseObject(printClient);
|
JsonObject& root2 = jsonBuffer2.parseObject(printClient);
|
||||||
if (!root2.success()) {
|
if (!root2.success()) {
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
printerData.toolTemp = "";
|
printerData.toolTemp = "";
|
||||||
printerData.toolTargetTemp = "";
|
printerData.toolTargetTemp = "";
|
||||||
printerData.bedTemp = "";
|
printerData.bedTemp = "";
|
||||||
printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"];
|
printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String printing = (const char*)root2["state"]["flags"]["printing"];
|
String printing = (const char*)root2["state"]["flags"]["printing"];
|
||||||
if (printing == "true") {
|
if (printing == "true") {
|
||||||
printerData.isPrinting = true;
|
printerData.isPrinting = true;
|
||||||
} else {
|
} else {
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
}
|
}
|
||||||
printerData.toolTemp = (const char*)root2["temperature"]["tool0"]["actual"];
|
printerData.toolTemp = (const char*)root2["temperature"]["tool0"]["actual"];
|
||||||
printerData.toolTargetTemp = (const char*)root2["temperature"]["tool0"]["target"];
|
printerData.toolTargetTemp = (const char*)root2["temperature"]["tool0"]["target"];
|
||||||
printerData.bedTemp = (const char*)root2["temperature"]["bed"]["actual"];
|
printerData.bedTemp = (const char*)root2["temperature"]["bed"]["actual"];
|
||||||
printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"];
|
printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"];
|
||||||
|
|
||||||
if (isPrinting()) {
|
if (isPrinting()) {
|
||||||
Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
Serial.println("Estado: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctoPrintClient::getPrinterPsuState() {
|
void OctoPrintClient::getPrinterPsuState() {
|
||||||
//**** get the PSU state (if enabled and printer operational)
|
//**** get the PSU state (if enabled and printer operational)
|
||||||
if (pollPsu && isOperational()) {
|
if (pollPsu && isOperational()) {
|
||||||
if (!validate()) {
|
if (!validate()) {
|
||||||
printerData.isPSUoff = false; // we do not know PSU state, so assume on.
|
printerData.isPSUoff = false; // we do not know PSU state, so assume on.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String apiPostData = "POST /api/plugin/psucontrol HTTP/1.1";
|
String apiPostData = "POST /api/plugin/psucontrol HTTP/1.1";
|
||||||
String apiPostBody = "{\"command\":\"getPSUState\"}";
|
String apiPostBody = "{\"command\":\"getPSUState\"}";
|
||||||
WiFiClient printClient = getPostRequest(apiPostData,apiPostBody);
|
WiFiClient printClient = getPostRequest(apiPostData,apiPostBody);
|
||||||
if (printerData.error != "") {
|
if (printerData.error != "") {
|
||||||
printerData.isPSUoff = false; // we do not know PSU state, so assume on.
|
printerData.isPSUoff = false; // we do not know PSU state, so assume on.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const size_t bufferSize3 = JSON_OBJECT_SIZE(2) + 300;
|
const size_t bufferSize3 = JSON_OBJECT_SIZE(2) + 300;
|
||||||
DynamicJsonBuffer jsonBuffer3(bufferSize3);
|
DynamicJsonBuffer jsonBuffer3(bufferSize3);
|
||||||
|
|
||||||
// Parse JSON object
|
// Parse JSON object
|
||||||
JsonObject& root3 = jsonBuffer3.parseObject(printClient);
|
JsonObject& root3 = jsonBuffer3.parseObject(printClient);
|
||||||
if (!root3.success()) {
|
if (!root3.success()) {
|
||||||
printerData.isPSUoff = false; // we do not know PSU state, so assume on
|
printerData.isPSUoff = false; // we do not know PSU state, so assume on
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String psu = (const char*)root3["isPSUOn"];
|
String psu = (const char*)root3["isPSUOn"];
|
||||||
if (psu == "true") {
|
if (psu == "true") {
|
||||||
printerData.isPSUoff = false; // PSU checked and is on
|
printerData.isPSUoff = false; // PSU checked and is on
|
||||||
} else {
|
} else {
|
||||||
printerData.isPSUoff = true; // PSU checked and is off, set flag
|
printerData.isPSUoff = true; // PSU checked and is off, set flag
|
||||||
}
|
}
|
||||||
printClient.stop(); //stop client
|
printClient.stop(); //stop client
|
||||||
} else {
|
} else {
|
||||||
printerData.isPSUoff = false; // we are not checking PSU state, so assume on
|
printerData.isPSUoff = false; // we are not checking PSU state, so assume on
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset all PrinterData
|
// Reset all PrinterData
|
||||||
void OctoPrintClient::resetPrintData() {
|
void OctoPrintClient::resetPrintData() {
|
||||||
printerData.averagePrintTime = "";
|
printerData.averagePrintTime = "";
|
||||||
printerData.estimatedPrintTime = "";
|
printerData.estimatedPrintTime = "";
|
||||||
printerData.fileName = "";
|
printerData.fileName = "";
|
||||||
printerData.fileSize = "";
|
printerData.fileSize = "";
|
||||||
printerData.lastPrintTime = "";
|
printerData.lastPrintTime = "";
|
||||||
printerData.progressCompletion = "";
|
printerData.progressCompletion = "";
|
||||||
printerData.progressFilepos = "";
|
printerData.progressFilepos = "";
|
||||||
printerData.progressPrintTime = "";
|
printerData.progressPrintTime = "";
|
||||||
printerData.progressPrintTimeLeft = "";
|
printerData.progressPrintTimeLeft = "";
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.toolTemp = "";
|
printerData.toolTemp = "";
|
||||||
printerData.toolTargetTemp = "";
|
printerData.toolTargetTemp = "";
|
||||||
printerData.filamentLength = "";
|
printerData.filamentLength = "";
|
||||||
printerData.bedTemp = "";
|
printerData.bedTemp = "";
|
||||||
printerData.bedTargetTemp = "";
|
printerData.bedTargetTemp = "";
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
printerData.isPSUoff = false;
|
printerData.isPSUoff = false;
|
||||||
printerData.error = "";
|
printerData.error = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getAveragePrintTime(){
|
String OctoPrintClient::getAveragePrintTime(){
|
||||||
return printerData.averagePrintTime;
|
return printerData.averagePrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getEstimatedPrintTime() {
|
String OctoPrintClient::getEstimatedPrintTime() {
|
||||||
return printerData.estimatedPrintTime;
|
return printerData.estimatedPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getFileName() {
|
String OctoPrintClient::getFileName() {
|
||||||
return printerData.fileName;
|
return printerData.fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getFileSize() {
|
String OctoPrintClient::getFileSize() {
|
||||||
return printerData.fileSize;
|
return printerData.fileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getLastPrintTime(){
|
String OctoPrintClient::getLastPrintTime(){
|
||||||
return printerData.lastPrintTime;
|
return printerData.lastPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getProgressCompletion() {
|
String OctoPrintClient::getProgressCompletion() {
|
||||||
return String(printerData.progressCompletion.toInt());
|
return String(printerData.progressCompletion.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getProgressFilepos() {
|
String OctoPrintClient::getProgressFilepos() {
|
||||||
return printerData.progressFilepos;
|
return printerData.progressFilepos;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getProgressPrintTime() {
|
String OctoPrintClient::getProgressPrintTime() {
|
||||||
return printerData.progressPrintTime;
|
return printerData.progressPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getProgressPrintTimeLeft() {
|
String OctoPrintClient::getProgressPrintTimeLeft() {
|
||||||
String rtnValue = printerData.progressPrintTimeLeft;
|
String rtnValue = printerData.progressPrintTimeLeft;
|
||||||
if (getProgressCompletion() == "100") {
|
if (getProgressCompletion() == "100") {
|
||||||
rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint
|
rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint
|
||||||
}
|
}
|
||||||
return rtnValue;
|
return rtnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getState() {
|
String OctoPrintClient::getState() {
|
||||||
return printerData.state;
|
return printerData.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean OctoPrintClient::isPrinting() {
|
boolean OctoPrintClient::isPrinting() {
|
||||||
return printerData.isPrinting;
|
return printerData.isPrinting;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean OctoPrintClient::isPSUoff() {
|
boolean OctoPrintClient::isPSUoff() {
|
||||||
return printerData.isPSUoff;
|
return printerData.isPSUoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean OctoPrintClient::isOperational() {
|
boolean OctoPrintClient::isOperational() {
|
||||||
boolean operational = false;
|
boolean operational = false;
|
||||||
if (printerData.state == "Operational" || isPrinting()) {
|
if (printerData.state == "Operational" || isPrinting()) {
|
||||||
operational = true;
|
operational = true;
|
||||||
}
|
}
|
||||||
return operational;
|
return operational;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getTempBedActual() {
|
String OctoPrintClient::getTempBedActual() {
|
||||||
return printerData.bedTemp;
|
return printerData.bedTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getTempBedTarget() {
|
String OctoPrintClient::getTempBedTarget() {
|
||||||
return printerData.bedTargetTemp;
|
return printerData.bedTargetTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getTempToolActual() {
|
String OctoPrintClient::getTempToolActual() {
|
||||||
return printerData.toolTemp;
|
return printerData.toolTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getTempToolTarget() {
|
String OctoPrintClient::getTempToolTarget() {
|
||||||
return printerData.toolTargetTemp;
|
return printerData.toolTargetTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getFilamentLength() {
|
String OctoPrintClient::getFilamentLength() {
|
||||||
return printerData.filamentLength;
|
return printerData.filamentLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getError() {
|
String OctoPrintClient::getError() {
|
||||||
return printerData.error;
|
return printerData.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getValueRounded(String value) {
|
String OctoPrintClient::getValueRounded(String value) {
|
||||||
float f = value.toFloat();
|
float f = value.toFloat();
|
||||||
int rounded = (int)(f+0.5f);
|
int rounded = (int)(f+0.5f);
|
||||||
return String(rounded);
|
return String(rounded);
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getPrinterType() {
|
String OctoPrintClient::getPrinterType() {
|
||||||
return printerType;
|
return printerType;
|
||||||
}
|
}
|
||||||
|
|
||||||
int OctoPrintClient::getPrinterPort() {
|
int OctoPrintClient::getPrinterPort() {
|
||||||
return myPort;
|
return myPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
String OctoPrintClient::getPrinterName() {
|
String OctoPrintClient::getPrinterName() {
|
||||||
return printerData.printerName;
|
return printerData.printerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctoPrintClient::setPrinterName(String printer) {
|
void OctoPrintClient::setPrinterName(String printer) {
|
||||||
printerData.printerName = printer;
|
printerData.printerName = printer;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ void OpenWeatherMapClient::updateWeatherApiKey(String ApiKey) {
|
||||||
void OpenWeatherMapClient::updateLanguage(String language) {
|
void OpenWeatherMapClient::updateLanguage(String language) {
|
||||||
lang = language;
|
lang = language;
|
||||||
if (lang == "") {
|
if (lang == "") {
|
||||||
lang = "en";
|
lang = "es";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ void OpenWeatherMapClient::updateWeather() {
|
||||||
WiFiClient weatherClient;
|
WiFiClient weatherClient;
|
||||||
String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + "&lang=" + lang + " HTTP/1.1";
|
String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + "&lang=" + lang + " HTTP/1.1";
|
||||||
|
|
||||||
Serial.println("Getting Weather Data");
|
Serial.println("Obteniendo datos de clima");
|
||||||
Serial.println(apiGetData);
|
Serial.println(apiGetData);
|
||||||
result = "";
|
result = "";
|
||||||
if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection
|
if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection
|
||||||
|
|
@ -56,14 +56,14 @@ void OpenWeatherMapClient::updateWeather() {
|
||||||
weatherClient.println();
|
weatherClient.println();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.println("connection for weather data failed"); //error message if no client connect
|
Serial.println("conexión fallida al obtener datos del clima"); //error message if no client connect
|
||||||
Serial.println();
|
Serial.println();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data
|
while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data
|
||||||
|
|
||||||
Serial.println("Waiting for data");
|
Serial.println("Esperando por datos");
|
||||||
|
|
||||||
// Check HTTP status
|
// Check HTTP status
|
||||||
char status[32] = {0};
|
char status[32] = {0};
|
||||||
|
|
@ -78,7 +78,7 @@ void OpenWeatherMapClient::updateWeather() {
|
||||||
// Skip HTTP headers
|
// Skip HTTP headers
|
||||||
char endOfHeaders[] = "\r\n\r\n";
|
char endOfHeaders[] = "\r\n\r\n";
|
||||||
if (!weatherClient.find(endOfHeaders)) {
|
if (!weatherClient.find(endOfHeaders)) {
|
||||||
Serial.println(F("Invalid response"));
|
Serial.println(F("Respuesta no válida"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,15 +90,15 @@ void OpenWeatherMapClient::updateWeather() {
|
||||||
// Parse JSON object
|
// Parse JSON object
|
||||||
JsonObject& root = jsonBuffer.parseObject(weatherClient);
|
JsonObject& root = jsonBuffer.parseObject(weatherClient);
|
||||||
if (!root.success()) {
|
if (!root.success()) {
|
||||||
Serial.println(F("Weather Data Parsing failed!"));
|
Serial.println(F("Fallo al parsear los datos del clima!"));
|
||||||
weathers[0].error = "Weather Data Parsing failed!";
|
weathers[0].error = "Fallo al parsear los datos del clima!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
weatherClient.stop(); //stop client
|
weatherClient.stop(); //stop client
|
||||||
|
|
||||||
if (root.measureLength() <= 150) {
|
if (root.measureLength() <= 150) {
|
||||||
Serial.println("Error Does not look like we got the data. Size: " + String(root.measureLength()));
|
Serial.println("Error No parece que hayamos obtenido los datos. Tamaño: " + String(root.measureLength()));
|
||||||
weathers[0].cached = true;
|
weathers[0].cached = true;
|
||||||
weathers[0].error = (const char*)root["message"];
|
weathers[0].error = (const char*)root["message"];
|
||||||
Serial.println("Error: " + weathers[0].error);
|
Serial.println("Error: " + weathers[0].error);
|
||||||
|
|
@ -308,4 +308,4 @@ String OpenWeatherMapClient::getWeatherIcon(int index)
|
||||||
default:break;
|
default:break;
|
||||||
}
|
}
|
||||||
return W;
|
return W;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,367 +1,367 @@
|
||||||
/** The MIT License (MIT)
|
/** The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2018 David Payne
|
Copyright (c) 2018 David Payne
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Additional Contributions:
|
// Additional Contributions:
|
||||||
/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */
|
/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */
|
||||||
/* 07 April 2019 : Jon Smith : Redesigned this class for Repetier Server */
|
/* 07 April 2019 : Jon Smith : Redesigned this class for Repetier Server */
|
||||||
|
|
||||||
#include "RepetierClient.h"
|
#include "RepetierClient.h"
|
||||||
|
|
||||||
RepetierClient::RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
RepetierClient::RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
||||||
updatePrintClient(ApiKey, server, port, user, pass, psu);
|
updatePrintClient(ApiKey, server, port, user, pass, psu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RepetierClient::updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
void RepetierClient::updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
||||||
server.toCharArray(myServer, 100);
|
server.toCharArray(myServer, 100);
|
||||||
myApiKey = ApiKey;
|
myApiKey = ApiKey;
|
||||||
myPort = port;
|
myPort = port;
|
||||||
encodedAuth = "";
|
encodedAuth = "";
|
||||||
if (user != "") {
|
if (user != "") {
|
||||||
String userpass = user + ":" + pass;
|
String userpass = user + ":" + pass;
|
||||||
base64 b64;
|
base64 b64;
|
||||||
encodedAuth = b64.encode(userpass, true);
|
encodedAuth = b64.encode(userpass, true);
|
||||||
}
|
}
|
||||||
pollPsu = psu;
|
pollPsu = psu;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean RepetierClient::validate() {
|
boolean RepetierClient::validate() {
|
||||||
boolean rtnValue = false;
|
boolean rtnValue = false;
|
||||||
printerData.error = "";
|
printerData.error = "";
|
||||||
if (String(myServer) == "") {
|
if (String(myServer) == "") {
|
||||||
printerData.error += "Server address is required; ";
|
printerData.error += "La dirección del servidor es obligatoria; ";
|
||||||
}
|
}
|
||||||
if (myApiKey == "") {
|
if (myApiKey == "") {
|
||||||
printerData.error += "ApiKey is required; ";
|
printerData.error += "La ApiKey es obligatoria; ";
|
||||||
}
|
}
|
||||||
if (printerData.error == "") {
|
if (printerData.error == "") {
|
||||||
rtnValue = true;
|
rtnValue = true;
|
||||||
}
|
}
|
||||||
return rtnValue;
|
return rtnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
WiFiClient RepetierClient::getSubmitRequest(String apiGetData) {
|
WiFiClient RepetierClient::getSubmitRequest(String apiGetData) {
|
||||||
WiFiClient printClient;
|
WiFiClient printClient;
|
||||||
printClient.setTimeout(5000);
|
printClient.setTimeout(5000);
|
||||||
|
|
||||||
Serial.println("Getting Repetier Data via GET");
|
Serial.println("Obteniendo datos del Repetidor via GET");
|
||||||
Serial.println(apiGetData);
|
Serial.println(apiGetData);
|
||||||
result = "";
|
result = "";
|
||||||
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection
|
||||||
printClient.println(apiGetData);
|
printClient.println(apiGetData);
|
||||||
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
|
||||||
printClient.println("X-Api-Key: " + myApiKey);
|
printClient.println("X-Api-Key: " + myApiKey);
|
||||||
if (encodedAuth != "") {
|
if (encodedAuth != "") {
|
||||||
printClient.print("Authorization: ");
|
printClient.print("Authorization: ");
|
||||||
printClient.println("Basic " + encodedAuth);
|
printClient.println("Basic " + encodedAuth);
|
||||||
}
|
}
|
||||||
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
printClient.println("User-Agent: ArduinoWiFi/1.1");
|
||||||
printClient.println("Connection: close");
|
printClient.println("Connection: close");
|
||||||
if (printClient.println() == 0) {
|
if (printClient.println() == 0) {
|
||||||
Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed.");
|
Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed.");
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed.";
|
printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed.";
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.println("Connection to Repetier failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
Serial.println("Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
|
||||||
Serial.println();
|
Serial.println();
|
||||||
resetPrintData();
|
resetPrintData();
|
||||||
printerData.error = "Connection to Repetier failed: " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Conexión a OctoPrint fallida: " + String(myServer) + ":" + String(myPort);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
// Check HTTP status
|
// Check HTTP status
|
||||||
char status[32] = {0};
|
char status[32] = {0};
|
||||||
printClient.readBytesUntil('\r', status, sizeof(status));
|
printClient.readBytesUntil('\r', status, sizeof(status));
|
||||||
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
|
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
|
||||||
Serial.print(F("Unexpected response: "));
|
Serial.print(F("Unexpected response: "));
|
||||||
Serial.println(status);
|
Serial.println(status);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.error = "Response: " + String(status);
|
printerData.error = "Response: " + String(status);
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip HTTP headers
|
// Skip HTTP headers
|
||||||
char endOfHeaders[] = "\r\n\r\n";
|
char endOfHeaders[] = "\r\n\r\n";
|
||||||
if (!printClient.find(endOfHeaders)) {
|
if (!printClient.find(endOfHeaders)) {
|
||||||
Serial.println(F("Invalid response"));
|
Serial.println(F("Invalid response"));
|
||||||
printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
return printClient;
|
return printClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RepetierClient::getPrinterJobResults() {
|
void RepetierClient::getPrinterJobResults() {
|
||||||
if (!validate()) {
|
if (!validate()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//**** get the Printer Job status
|
//**** get the Printer Job status
|
||||||
String apiGetData = "GET /printer/api/?a=listPrinter&apikey=" + myApiKey;
|
String apiGetData = "GET /printer/api/?a=listPrinter&apikey=" + myApiKey;
|
||||||
WiFiClient printClient = getSubmitRequest(apiGetData);
|
WiFiClient printClient = getSubmitRequest(apiGetData);
|
||||||
if (printerData.error != "") {
|
if (printerData.error != "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710;
|
const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710;
|
||||||
DynamicJsonBuffer jsonBuffer(bufferSize);
|
DynamicJsonBuffer jsonBuffer(bufferSize);
|
||||||
|
|
||||||
// Parse JSON object
|
// Parse JSON object
|
||||||
JsonArray& root = jsonBuffer.parseArray(printClient);
|
JsonArray& root = jsonBuffer.parseArray(printClient);
|
||||||
|
|
||||||
if (!root.success()) {
|
if (!root.success()) {
|
||||||
printerData.error = "Repetier Data Parsing failed: " + String(myServer) + ":" + String(myPort);
|
printerData.error = "Fallo al parsear los datos de OctoPrint: " + String(myServer) + ":" + String(myPort);
|
||||||
Serial.println(printerData.error);
|
Serial.println(printerData.error);
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int inx = 0;
|
int inx = 0;
|
||||||
int count = root.size();
|
int count = root.size();
|
||||||
Serial.println("Size of root: " + String(count));
|
Serial.println("Size of root: " + String(count));
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
Serial.println("Printer: " + String((const char*)root[i]["slug"]));
|
Serial.println("Printer: " + String((const char*)root[i]["slug"]));
|
||||||
if (String((const char*)root[i]["slug"]) == printerData.printerName) {
|
if (String((const char*)root[i]["slug"]) == printerData.printerName) {
|
||||||
inx = i;
|
inx = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject& pr = root[inx];
|
JsonObject& pr = root[inx];
|
||||||
|
|
||||||
//printerData.averagePrintTime = (const char*)pr[""];
|
//printerData.averagePrintTime = (const char*)pr[""];
|
||||||
printerData.estimatedPrintTime = (const char*)pr["printTime"];
|
printerData.estimatedPrintTime = (const char*)pr["printTime"];
|
||||||
printerData.fileName = (const char*) pr["job"];
|
printerData.fileName = (const char*) pr["job"];
|
||||||
printerData.fileSize = (const char*) pr["totalLines"];
|
printerData.fileSize = (const char*) pr["totalLines"];
|
||||||
//printerData.filamentLength = (const char*) pr[""];
|
//printerData.filamentLength = (const char*) pr[""];
|
||||||
printerData.state = (const char*) pr["online"];
|
printerData.state = (const char*) pr["online"];
|
||||||
//printerData.lastPrintTime = (const char*) pr[""];
|
//printerData.lastPrintTime = (const char*) pr[""];
|
||||||
printerData.progressCompletion = (const char*) pr["done"];
|
printerData.progressCompletion = (const char*) pr["done"];
|
||||||
printerData.progressFilepos = (const char*) pr["linesSend"];
|
printerData.progressFilepos = (const char*) pr["linesSend"];
|
||||||
printerData.progressPrintTime = (const char*) pr["printedTimeComp"];
|
printerData.progressPrintTime = (const char*) pr["printedTimeComp"];
|
||||||
|
|
||||||
//Figure out Time Left
|
//Figure out Time Left
|
||||||
long timeTot=0;
|
long timeTot=0;
|
||||||
long timeElap=0;
|
long timeElap=0;
|
||||||
long timeLeft=0;
|
long timeLeft=0;
|
||||||
if (printerData.estimatedPrintTime != "" ) {
|
if (printerData.estimatedPrintTime != "" ) {
|
||||||
timeTot = atol(pr["printTime"]);
|
timeTot = atol(pr["printTime"]);
|
||||||
}
|
}
|
||||||
if (printerData.progressPrintTime != "") {
|
if (printerData.progressPrintTime != "") {
|
||||||
timeElap= atol(pr["printedTimeComp"]);
|
timeElap= atol(pr["printedTimeComp"]);
|
||||||
}
|
}
|
||||||
timeLeft = timeTot-timeElap;
|
timeLeft = timeTot-timeElap;
|
||||||
printerData.progressPrintTimeLeft = String(timeLeft);
|
printerData.progressPrintTimeLeft = String(timeLeft);
|
||||||
|
|
||||||
if (printerData.fileName != "none") {
|
if (printerData.fileName != "none") {
|
||||||
printerData.isPrinting = true;
|
printerData.isPrinting = true;
|
||||||
} else {
|
} else {
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printerData.isPrinting) {
|
if (printerData.isPrinting) {
|
||||||
Serial.println("Printing: " + printerData.fileName);
|
Serial.println("Printing: " + printerData.fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isOperational()) {
|
if (isOperational()) {
|
||||||
Serial.println("Status: " + printerData.state);
|
Serial.println("Estado: " + printerData.state);
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Printer Not Operational");
|
Serial.println("Impresora no disponible");
|
||||||
}
|
}
|
||||||
|
|
||||||
//**** get the Printer Temps and Stat
|
//**** get the Printer Temps and Stat
|
||||||
apiGetData = "GET /printer/api/?a=stateList&apikey=" + myApiKey;
|
apiGetData = "GET /printer/api/?a=stateList&apikey=" + myApiKey;
|
||||||
printClient = getSubmitRequest(apiGetData);
|
printClient = getSubmitRequest(apiGetData);
|
||||||
if (printerData.error != "") {
|
if (printerData.error != "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300;
|
const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300;
|
||||||
DynamicJsonBuffer jsonBuffer2(bufferSize2);
|
DynamicJsonBuffer jsonBuffer2(bufferSize2);
|
||||||
|
|
||||||
//Parse JSON object
|
//Parse JSON object
|
||||||
JsonObject& root2 = jsonBuffer2.parseObject(printClient);
|
JsonObject& root2 = jsonBuffer2.parseObject(printClient);
|
||||||
|
|
||||||
//Select printer
|
//Select printer
|
||||||
JsonObject& pr2 = root2[printerData.printerName];
|
JsonObject& pr2 = root2[printerData.printerName];
|
||||||
|
|
||||||
if (!root2.success()) {
|
if (!root2.success()) {
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
printerData.toolTemp = "";
|
printerData.toolTemp = "";
|
||||||
printerData.toolTargetTemp = "";
|
printerData.toolTargetTemp = "";
|
||||||
printerData.bedTemp = "";
|
printerData.bedTemp = "";
|
||||||
printerData.bedTargetTemp = "";
|
printerData.bedTargetTemp = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printerData.toolTemp = (const char*) pr2["extruder"][0]["tempRead"];
|
printerData.toolTemp = (const char*) pr2["extruder"][0]["tempRead"];
|
||||||
printerData.toolTargetTemp = (const char*) pr2["extruder"][0]["tempSet"];
|
printerData.toolTargetTemp = (const char*) pr2["extruder"][0]["tempSet"];
|
||||||
printerData.bedTemp = (const char*) pr2["heatedBeds"][0]["tempRead"];
|
printerData.bedTemp = (const char*) pr2["heatedBeds"][0]["tempRead"];
|
||||||
printerData.bedTargetTemp = (const char*) pr2["heatedBeds"][0]["tempSet"];
|
printerData.bedTargetTemp = (const char*) pr2["heatedBeds"][0]["tempSet"];
|
||||||
|
|
||||||
if (printerData.isPrinting) {
|
if (printerData.isPrinting) {
|
||||||
Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RepetierClient::getPrinterPsuState() {
|
void RepetierClient::getPrinterPsuState() {
|
||||||
//**** get the PSU state (if enabled and printer operational)
|
//**** get the PSU state (if enabled and printer operational)
|
||||||
//Not implemented in Repetier Server AFAIK
|
//Not implemented in Repetier Server AFAIK
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset all PrinterData
|
// Reset all PrinterData
|
||||||
void RepetierClient::resetPrintData() {
|
void RepetierClient::resetPrintData() {
|
||||||
printerData.averagePrintTime = "";
|
printerData.averagePrintTime = "";
|
||||||
printerData.estimatedPrintTime = "";
|
printerData.estimatedPrintTime = "";
|
||||||
printerData.fileName = "";
|
printerData.fileName = "";
|
||||||
printerData.fileSize = "";
|
printerData.fileSize = "";
|
||||||
printerData.lastPrintTime = "";
|
printerData.lastPrintTime = "";
|
||||||
printerData.progressCompletion = "";
|
printerData.progressCompletion = "";
|
||||||
printerData.progressFilepos = "";
|
printerData.progressFilepos = "";
|
||||||
printerData.progressPrintTime = "";
|
printerData.progressPrintTime = "";
|
||||||
printerData.progressPrintTimeLeft = "";
|
printerData.progressPrintTimeLeft = "";
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.toolTemp = "";
|
printerData.toolTemp = "";
|
||||||
printerData.toolTargetTemp = "";
|
printerData.toolTargetTemp = "";
|
||||||
printerData.filamentLength = "";
|
printerData.filamentLength = "";
|
||||||
printerData.bedTemp = "";
|
printerData.bedTemp = "";
|
||||||
printerData.bedTargetTemp = "";
|
printerData.bedTargetTemp = "";
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
printerData.isPSUoff = false;
|
printerData.isPSUoff = false;
|
||||||
printerData.error = "";
|
printerData.error = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getAveragePrintTime(){
|
String RepetierClient::getAveragePrintTime(){
|
||||||
return printerData.averagePrintTime;
|
return printerData.averagePrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getEstimatedPrintTime() {
|
String RepetierClient::getEstimatedPrintTime() {
|
||||||
return printerData.estimatedPrintTime;
|
return printerData.estimatedPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getFileName() {
|
String RepetierClient::getFileName() {
|
||||||
return printerData.fileName;
|
return printerData.fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getFileSize() {
|
String RepetierClient::getFileSize() {
|
||||||
return printerData.fileSize;
|
return printerData.fileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getLastPrintTime(){
|
String RepetierClient::getLastPrintTime(){
|
||||||
return printerData.lastPrintTime;
|
return printerData.lastPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getProgressCompletion() {
|
String RepetierClient::getProgressCompletion() {
|
||||||
return String(printerData.progressCompletion.toInt());
|
return String(printerData.progressCompletion.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getProgressFilepos() {
|
String RepetierClient::getProgressFilepos() {
|
||||||
return printerData.progressFilepos;
|
return printerData.progressFilepos;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getProgressPrintTime() {
|
String RepetierClient::getProgressPrintTime() {
|
||||||
return printerData.progressPrintTime;
|
return printerData.progressPrintTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getProgressPrintTimeLeft() {
|
String RepetierClient::getProgressPrintTimeLeft() {
|
||||||
String rtnValue = printerData.progressPrintTimeLeft;
|
String rtnValue = printerData.progressPrintTimeLeft;
|
||||||
if (getProgressCompletion() == "100") {
|
if (getProgressCompletion() == "100") {
|
||||||
rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint
|
rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint
|
||||||
}
|
}
|
||||||
return rtnValue;
|
return rtnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getState() {
|
String RepetierClient::getState() {
|
||||||
String rtnValue = "Offline";
|
String rtnValue = "Offline";
|
||||||
if (printerData.state == "1") {
|
if (printerData.state == "1") {
|
||||||
rtnValue = "Operational";
|
rtnValue = "Operational";
|
||||||
}
|
}
|
||||||
return rtnValue;
|
return rtnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean RepetierClient::isPrinting() {
|
boolean RepetierClient::isPrinting() {
|
||||||
return printerData.isPrinting;
|
return printerData.isPrinting;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean RepetierClient::isPSUoff() {
|
boolean RepetierClient::isPSUoff() {
|
||||||
return printerData.isPSUoff;
|
return printerData.isPSUoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean RepetierClient::isOperational() {
|
boolean RepetierClient::isOperational() {
|
||||||
boolean operational = false;
|
boolean operational = false;
|
||||||
if (printerData.state == "1" || isPrinting()) {
|
if (printerData.state == "1" || isPrinting()) {
|
||||||
operational = true;
|
operational = true;
|
||||||
}
|
}
|
||||||
return operational;
|
return operational;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getTempBedActual() {
|
String RepetierClient::getTempBedActual() {
|
||||||
String temp = printerData.bedTemp;
|
String temp = printerData.bedTemp;
|
||||||
temp.remove(temp.indexOf(".") + 3);
|
temp.remove(temp.indexOf(".") + 3);
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getTempBedTarget() {
|
String RepetierClient::getTempBedTarget() {
|
||||||
return printerData.bedTargetTemp;
|
return printerData.bedTargetTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getTempToolActual() {
|
String RepetierClient::getTempToolActual() {
|
||||||
String temp = printerData.toolTemp;
|
String temp = printerData.toolTemp;
|
||||||
temp.remove(temp.indexOf(".") + 3);
|
temp.remove(temp.indexOf(".") + 3);
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getTempToolTarget() {
|
String RepetierClient::getTempToolTarget() {
|
||||||
return printerData.toolTargetTemp;
|
return printerData.toolTargetTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getFilamentLength() {
|
String RepetierClient::getFilamentLength() {
|
||||||
return printerData.filamentLength;
|
return printerData.filamentLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getError() {
|
String RepetierClient::getError() {
|
||||||
return printerData.error;
|
return printerData.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getValueRounded(String value) {
|
String RepetierClient::getValueRounded(String value) {
|
||||||
float f = value.toFloat();
|
float f = value.toFloat();
|
||||||
int rounded = (int)(f+0.5f);
|
int rounded = (int)(f+0.5f);
|
||||||
return String(rounded);
|
return String(rounded);
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getPrinterType() {
|
String RepetierClient::getPrinterType() {
|
||||||
return printerType;
|
return printerType;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RepetierClient::getPrinterPort() {
|
int RepetierClient::getPrinterPort() {
|
||||||
return myPort;
|
return myPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
String RepetierClient::getPrinterName() {
|
String RepetierClient::getPrinterName() {
|
||||||
return printerData.printerName;
|
return printerData.printerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RepetierClient::setPrinterName(String printer) {
|
void RepetierClient::setPrinterName(String printer) {
|
||||||
printerData.printerName = printer;
|
printerData.printerName = printer;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,114 +1,114 @@
|
||||||
/** The MIT License (MIT)
|
/** The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2018 David Payne
|
Copyright (c) 2018 David Payne
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Additional Contributions:
|
// Additional Contributions:
|
||||||
/* 15 Jan 2019 : Owen Carter : Add psucontrol setting */
|
/* 15 Jan 2019 : Owen Carter : Add psucontrol setting */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Printer Monitor is designed for the Wemos D1 ESP8266
|
* Printer Monitor is designed for the Wemos D1 ESP8266
|
||||||
* Wemos D1 Mini: https://amzn.to/2qLyKJd
|
* Wemos D1 Mini: https://amzn.to/2qLyKJd
|
||||||
* 0.96" OLED I2C 128x64 Display (12864) SSD1306
|
* 0.96" OLED I2C 128x64 Display (12864) SSD1306
|
||||||
* OLED Display: https://amzn.to/2JDEAUF
|
* OLED Display: https://amzn.to/2JDEAUF
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* NOTE: The settings here are the default settings for the first loading.
|
* NOTE: The settings here are the default settings for the first loading.
|
||||||
* After loading you will manage changes to the settings via the Web Interface.
|
* After loading you will manage changes to the settings via the Web Interface.
|
||||||
* If you want to change settings again in the settings.h, you will need to
|
* If you want to change settings again in the settings.h, you will need to
|
||||||
* erase the file system on the Wemos or use the “Reset Settings” option in
|
* erase the file system on the Wemos or use the “Reset Settings” option in
|
||||||
* the Web Interface.
|
* the Web Interface.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266WebServer.h>
|
#include <ESP8266WebServer.h>
|
||||||
#include <WiFiManager.h>
|
#include <WiFiManager.h>
|
||||||
#include <ESP8266mDNS.h>
|
#include <ESP8266mDNS.h>
|
||||||
#include <ArduinoOTA.h>
|
#include <ArduinoOTA.h>
|
||||||
#include <ESP8266HTTPUpdateServer.h>
|
#include <ESP8266HTTPUpdateServer.h>
|
||||||
#include "TimeClient.h"
|
#include "TimeClient.h"
|
||||||
#include "RepetierClient.h"
|
#include "RepetierClient.h"
|
||||||
#include "OctoPrintClient.h"
|
#include "OctoPrintClient.h"
|
||||||
#include "OpenWeatherMapClient.h"
|
#include "OpenWeatherMapClient.h"
|
||||||
#include "WeatherStationFonts.h"
|
#include "WeatherStationFonts.h"
|
||||||
#include "FS.h"
|
#include "FS.h"
|
||||||
#include "SH1106Wire.h"
|
#include "SH1106Wire.h"
|
||||||
#include "SSD1306Wire.h"
|
#include "SSD1306Wire.h"
|
||||||
#include "OLEDDisplayUi.h"
|
#include "OLEDDisplayUi.h"
|
||||||
|
|
||||||
//******************************
|
//******************************
|
||||||
// Start Settings
|
// Start Settings
|
||||||
//******************************
|
//******************************
|
||||||
|
|
||||||
// OctoPrint / Repetier Monitoring -- Monitor your 3D OctoPrint or Repetier Server
|
// OctoPrint / Repetier Monitoring -- Monitor your 3D OctoPrint or Repetier Server
|
||||||
//#define USE_REPETIER_CLIENT // Uncomment this line to use the Repetier Printer Server -- OctoPrint is used by default and is most common
|
//#define USE_REPETIER_CLIENT // Uncomment this line to use the Repetier Printer Server -- OctoPrint is used by default and is most common
|
||||||
String PrinterApiKey = ""; // ApiKey from your User Account on OctoPrint / Repetier
|
String PrinterApiKey = ""; // ApiKey from your User Account on OctoPrint / Repetier
|
||||||
String PrinterHostName = "octopi";// Default 'octopi' -- or hostname if different (optional if your IP changes)
|
String PrinterHostName = "octopi";// Default 'octopi' -- or hostname if different (optional if your IP changes)
|
||||||
String PrinterServer = ""; // IP or Address of your OctoPrint / Repetier Server (DO NOT include http://)
|
String PrinterServer = ""; // IP or Address of your OctoPrint / Repetier Server (DO NOT include http://)
|
||||||
int PrinterPort = 80; // the port you are running your OctoPrint / Repetier server on (usually 80);
|
int PrinterPort = 80; // the port you are running your OctoPrint / Repetier server on (usually 80);
|
||||||
String PrinterAuthUser = ""; // only used if you have haproxy or basic athentintication turned on (not default)
|
String PrinterAuthUser = ""; // only used if you have haproxy or basic athentintication turned on (not default)
|
||||||
String PrinterAuthPass = ""; // only used with haproxy or basic auth (only needed if you must authenticate)
|
String PrinterAuthPass = ""; // only used with haproxy or basic auth (only needed if you must authenticate)
|
||||||
|
|
||||||
// Weather Configuration
|
// Weather Configuration
|
||||||
boolean DISPLAYWEATHER = true; // true = show weather when not printing / false = no weather
|
boolean DISPLAYWEATHER = true; // true = show weather when not printing / false = no weather
|
||||||
String WeatherApiKey = ""; // Your API Key from http://openweathermap.org/
|
String WeatherApiKey = ""; // Your API Key from http://openweathermap.org/
|
||||||
// Default City Location (use http://openweathermap.org/find to find city ID)
|
// Default City Location (use http://openweathermap.org/find to find city ID)
|
||||||
int CityIDs[] = { 5304391 }; //Only USE ONE for weather marquee
|
int CityIDs[] = { 2515270 }; //Only USE ONE for weather marquee
|
||||||
boolean IS_METRIC = false; // false = Imperial and true = Metric
|
boolean IS_METRIC = true; // false = Imperial and true = Metric
|
||||||
// Languages: ar, bg, ca, cz, de, el, en, fa, fi, fr, gl, hr, hu, it, ja, kr, la, lt, mk, nl, pl, pt, ro, ru, se, sk, sl, es, tr, ua, vi, zh_cn, zh_tw
|
// Languages: ar, bg, ca, cz, de, el, en, fa, fi, fr, gl, hr, hu, it, ja, kr, la, lt, mk, nl, pl, pt, ro, ru, se, sk, sl, es, tr, ua, vi, zh_cn, zh_tw
|
||||||
String WeatherLanguage = "en"; //Default (en) English
|
String WeatherLanguage = "es"; //Default (en) English
|
||||||
|
|
||||||
// Webserver
|
// Webserver
|
||||||
const int WEBSERVER_PORT = 80; // The port you can access this device on over HTTP
|
const int WEBSERVER_PORT = 80; // The port you can access this device on over HTTP
|
||||||
const boolean WEBSERVER_ENABLED = true; // Device will provide a web interface via http://[ip]:[port]/
|
const boolean WEBSERVER_ENABLED = true; // Device will provide a web interface via http://[ip]:[port]/
|
||||||
boolean IS_BASIC_AUTH = true; // true = require athentication to change configuration settings / false = no auth
|
boolean IS_BASIC_AUTH = true; // true = require athentication to change configuration settings / false = no auth
|
||||||
char* www_username = "admin"; // User account for the Web Interface
|
char www_username[] = "admin"; // User account for the Web Interface
|
||||||
char* www_password = "password"; // Password for the Web Interface
|
char www_password[] = "password"; // Password for the Web Interface
|
||||||
|
|
||||||
// Date and Time
|
// Date and Time
|
||||||
float UtcOffset = -7; // Hour offset from GMT for your timezone
|
float UtcOffset = 0; // Hour offset from GMT for your timezone
|
||||||
boolean IS_24HOUR = false; // 23:00 millitary 24 hour clock
|
boolean IS_24HOUR = true; // 23:00 millitary 24 hour clock
|
||||||
int minutesBetweenDataRefresh = 15;
|
int minutesBetweenDataRefresh = 10;
|
||||||
boolean DISPLAYCLOCK = true; // true = Show Clock when not printing / false = turn off display when not printing
|
boolean DISPLAYCLOCK = true; // true = Show Clock when not printing / false = turn off display when not printing
|
||||||
|
|
||||||
// Display Settings
|
// Display Settings
|
||||||
const int I2C_DISPLAY_ADDRESS = 0x3c; // I2C Address of your Display (usually 0x3c or 0x3d)
|
const int I2C_DISPLAY_ADDRESS = 0x3c; // I2C Address of your Display (usually 0x3c or 0x3d)
|
||||||
const int SDA_PIN = D2;
|
const int SDA_PIN = D2;
|
||||||
const int SCL_PIN = D5; // original code D5 -- Monitor Easy Board use D1
|
const int SCL_PIN = D5; // original code D5 -- Monitor Easy Board use D1
|
||||||
boolean INVERT_DISPLAY = false; // true = pins at top | false = pins at the bottom
|
boolean INVERT_DISPLAY = true; // true = pins at top | false = pins at the bottom
|
||||||
//#define DISPLAY_SH1106 // Uncomment this line to use the SH1106 display -- SSD1306 is used by default and is most common
|
//#define DISPLAY_SH1106 // Uncomment this line to use the SH1106 display -- SSD1306 is used by default and is most common
|
||||||
|
|
||||||
// LED Settings
|
// LED Settings
|
||||||
const int externalLight = LED_BUILTIN; // LED will always flash on bootup or Wifi Errors
|
const int externalLight = LED_BUILTIN; // LED will always flash on bootup or Wifi Errors
|
||||||
boolean USE_FLASH = true; // true = System LED will Flash on Service Calls; false = disabled LED flashing
|
boolean USE_FLASH = false; // true = System LED will Flash on Service Calls; false = disabled LED flashing
|
||||||
|
|
||||||
// PSU Control
|
// PSU Control
|
||||||
boolean HAS_PSU = false; // Set to true if https://github.com/kantlivelong/OctoPrint-PSUControl/ in use
|
boolean HAS_PSU = false; // Set to true if https://github.com/kantlivelong/OctoPrint-PSUControl/ in use
|
||||||
|
|
||||||
// OTA Updates
|
// OTA Updates
|
||||||
boolean ENABLE_OTA = true; // this will allow you to load firmware to the device over WiFi (see OTA for ESP8266)
|
boolean ENABLE_OTA = true; // this will allow you to load firmware to the device over WiFi (see OTA for ESP8266)
|
||||||
String OTA_Password = ""; // Set an OTA password here -- leave blank if you don't want to be prompted for password
|
String OTA_Password = ""; // Set an OTA password here -- leave blank if you don't want to be prompted for password
|
||||||
|
|
||||||
//******************************
|
//******************************
|
||||||
// End Settings
|
// End Settings
|
||||||
//******************************
|
//******************************
|
||||||
|
|
||||||
String themeColor = "light-green"; // this can be changed later in the web interface.
|
String themeColor = "light-blue"; // this can be changed later in the web interface.
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp
Normal file → Executable file
0
printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp
Normal file → Executable file
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue