mirror of
https://github.com/mnzlmstr/N64toiQue
synced 2024-11-24 10:12:22 -05:00
add: precompiled binary for firebeetle-esp32, add: HTTPUpdate functionality
This commit is contained in:
parent
55f3a678a4
commit
14973773db
@ -33,5 +33,7 @@ Yes you will have to edit the Pins used in the file `PinMappings.h` to match the
|
|||||||
<br/>
|
<br/>
|
||||||
15.05.2020: <br/>
|
15.05.2020: <br/>
|
||||||
- PCB has been tested an appears to be working just fine<br/>
|
- PCB has been tested an appears to be working just fine<br/>
|
||||||
|
- Add: Updater to be able to upload new firmware over HTTP hosted by ESP32
|
||||||
|
- Add: precompiled binary for firebeetle-esp32
|
||||||
- TODO: redesigning PCB to incorporate LEDs for user feedback as well as Programming Header<br/>
|
- TODO: redesigning PCB to incorporate LEDs for user feedback as well as Programming Header<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
BIN
bin/src.ino.firebeetle32.bin
Normal file
BIN
bin/src.ino.firebeetle32.bin
Normal file
Binary file not shown.
BIN
src/.DS_Store
vendored
Normal file
BIN
src/.DS_Store
vendored
Normal file
Binary file not shown.
@ -5,26 +5,26 @@
|
|||||||
|
|
||||||
#define PIN_BUTTON_A 15
|
#define PIN_BUTTON_A 15
|
||||||
#define PIN_BUTTON_B 5
|
#define PIN_BUTTON_B 5
|
||||||
#define PIN_BUTTON_Z 23
|
#define PIN_BUTTON_Z 32
|
||||||
#define PIN_BUTTON_S 1
|
#define PIN_BUTTON_S 23
|
||||||
#define PIN_BUTTON_L 1
|
#define PIN_BUTTON_L 33
|
||||||
#define PIN_BUTTON_R 1
|
#define PIN_BUTTON_R 17
|
||||||
|
|
||||||
#define PIN_DPAD_UP 1
|
#define PIN_DPAD_UP 26
|
||||||
#define PIN_DPAD_DOWN 1
|
#define PIN_DPAD_DOWN 16
|
||||||
#define PIN_DPAD_LEFT 1
|
#define PIN_DPAD_LEFT 25
|
||||||
#define PIN_DPAD_RIGHT 1
|
#define PIN_DPAD_RIGHT 18
|
||||||
|
|
||||||
#define PIN_C_UP 1
|
#define PIN_C_UP 22
|
||||||
#define PIN_C_DOWN 1
|
#define PIN_C_DOWN 21
|
||||||
#define PIN_C_LEFT 1
|
#define PIN_C_LEFT 19
|
||||||
#define PIN_C_RIGHT 1
|
#define PIN_C_RIGHT 12
|
||||||
|
|
||||||
#define PIN_A_AXIS_X 14
|
#define PIN_A_AXIS_X 14
|
||||||
#define PIN_B_AXIS_X 27
|
#define PIN_B_AXIS_X 27
|
||||||
|
|
||||||
#define PIN_A_AXIS_Y 2
|
#define PIN_A_AXIS_Y 4
|
||||||
#define PIN_B_AXIS_Y 4
|
#define PIN_B_AXIS_Y 2
|
||||||
|
|
||||||
#define LINE_WRITE_HIGH pinMode(DATA_PIN,INPUT_PULLUP)
|
#define LINE_WRITE_HIGH pinMode(DATA_PIN,INPUT_PULLUP)
|
||||||
#define LINE_WRITE_LOW pinMode(DATA_PIN,OUTPUT)
|
#define LINE_WRITE_LOW pinMode(DATA_PIN,OUTPUT)
|
||||||
|
184
src/Updater.cpp
Normal file
184
src/Updater.cpp
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
#include "Updater.h"
|
||||||
|
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <WebServer.h>
|
||||||
|
#include <ESPmDNS.h>
|
||||||
|
#include <Update.h>
|
||||||
|
|
||||||
|
void handleSetup(void);
|
||||||
|
|
||||||
|
/** Function to check if the user wants to update the device.
|
||||||
|
* This is signaled by pressing all C Buttons + Start
|
||||||
|
* if so update process is initiated
|
||||||
|
* @param controller pointer to struct containing presed buttons
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void checkUpdateCombo(ControllerData *controller)
|
||||||
|
{
|
||||||
|
// if button combi is pressed
|
||||||
|
if(controller->CUp && controller->CDown && controller->CLeft && controller->CRight && controller->buttonStart)
|
||||||
|
{
|
||||||
|
handleSetup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===== TAKEN FROM ARDUINO, slight modifications =====
|
||||||
|
|
||||||
|
const char* host = "n64toique";
|
||||||
|
|
||||||
|
WebServer server(80);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Login page
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char* loginIndex =
|
||||||
|
"<form name='loginForm'>"
|
||||||
|
"<table width='20%' bgcolor='A09F9F' align='center'>"
|
||||||
|
"<tr>"
|
||||||
|
"<td colspan=2>"
|
||||||
|
"<center><font size=4><b>ESP32 Login Page</b></font></center>"
|
||||||
|
"<br>"
|
||||||
|
"</td>"
|
||||||
|
"<br>"
|
||||||
|
"<br>"
|
||||||
|
"</tr>"
|
||||||
|
"<td>Username:</td>"
|
||||||
|
"<td><input type='text' size=25 name='userid'><br></td>"
|
||||||
|
"</tr>"
|
||||||
|
"<br>"
|
||||||
|
"<br>"
|
||||||
|
"<tr>"
|
||||||
|
"<td>Password:</td>"
|
||||||
|
"<td><input type='Password' size=25 name='pwd'><br></td>"
|
||||||
|
"<br>"
|
||||||
|
"<br>"
|
||||||
|
"</tr>"
|
||||||
|
"<tr>"
|
||||||
|
"<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
|
||||||
|
"</tr>"
|
||||||
|
"</table>"
|
||||||
|
"</form>"
|
||||||
|
"<script>"
|
||||||
|
"function check(form)"
|
||||||
|
"{"
|
||||||
|
"if(form.userid.value=='n64toique' && form.pwd.value=='n64toique')"
|
||||||
|
"{"
|
||||||
|
"window.open('/serverIndex')"
|
||||||
|
"}"
|
||||||
|
"else"
|
||||||
|
"{"
|
||||||
|
" alert('Error Password or Username')/*displays error message*/"
|
||||||
|
"}"
|
||||||
|
"}"
|
||||||
|
"</script>";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Server Index Page
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char* serverIndex =
|
||||||
|
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
|
||||||
|
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
|
||||||
|
"<input type='file' name='update'>"
|
||||||
|
"<input type='submit' value='Update'>"
|
||||||
|
"</form>"
|
||||||
|
"<div id='prg'>progress: 0%</div>"
|
||||||
|
"<script>"
|
||||||
|
"$('form').submit(function(e){"
|
||||||
|
"e.preventDefault();"
|
||||||
|
"var form = $('#upload_form')[0];"
|
||||||
|
"var data = new FormData(form);"
|
||||||
|
" $.ajax({"
|
||||||
|
"url: '/update',"
|
||||||
|
"type: 'POST',"
|
||||||
|
"data: data,"
|
||||||
|
"contentType: false,"
|
||||||
|
"processData:false,"
|
||||||
|
"xhr: function() {"
|
||||||
|
"var xhr = new window.XMLHttpRequest();"
|
||||||
|
"xhr.upload.addEventListener('progress', function(evt) {"
|
||||||
|
"if (evt.lengthComputable) {"
|
||||||
|
"var per = evt.loaded / evt.total;"
|
||||||
|
"$('#prg').html('progress: ' + Math.round(per*100) + '%');"
|
||||||
|
"}"
|
||||||
|
"}, false);"
|
||||||
|
"return xhr;"
|
||||||
|
"},"
|
||||||
|
"success:function(d, s) {"
|
||||||
|
"console.log('success!')"
|
||||||
|
"},"
|
||||||
|
"error: function (a, b, c) {"
|
||||||
|
"}"
|
||||||
|
"});"
|
||||||
|
"});"
|
||||||
|
"</script>";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* setup function
|
||||||
|
*/
|
||||||
|
void handleSetup(void) {
|
||||||
|
//Serial.begin(115200);
|
||||||
|
|
||||||
|
// Connect to WiFi network
|
||||||
|
WiFi.beginSmartConfig();
|
||||||
|
Serial.println("");
|
||||||
|
|
||||||
|
// Wait for connection
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*use mdns for host name resolution*/
|
||||||
|
if (!MDNS.begin(host)) { //http://esp32.local
|
||||||
|
Serial.println("Error setting up MDNS responder!");
|
||||||
|
while (1) {
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serial.println("mDNS responder started");
|
||||||
|
/*return index page which is stored in serverIndex */
|
||||||
|
server.on("/", HTTP_GET, []() {
|
||||||
|
server.sendHeader("Connection", "close");
|
||||||
|
server.send(200, "text/html", loginIndex);
|
||||||
|
});
|
||||||
|
server.on("/serverIndex", HTTP_GET, []() {
|
||||||
|
server.sendHeader("Connection", "close");
|
||||||
|
server.send(200, "text/html", serverIndex);
|
||||||
|
});
|
||||||
|
/*handling uploading firmware file */
|
||||||
|
server.on("/update", HTTP_POST, []() {
|
||||||
|
server.sendHeader("Connection", "close");
|
||||||
|
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
|
||||||
|
ESP.restart();
|
||||||
|
}, []() {
|
||||||
|
HTTPUpload& upload = server.upload();
|
||||||
|
if (upload.status == UPLOAD_FILE_START) {
|
||||||
|
Serial.printf("Update: %s\n", upload.filename.c_str());
|
||||||
|
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
} else if (upload.status == UPLOAD_FILE_WRITE) {
|
||||||
|
/* flashing firmware to ESP*/
|
||||||
|
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
} else if (upload.status == UPLOAD_FILE_END) {
|
||||||
|
if (Update.end(true)) { //true to set the size to the current progress
|
||||||
|
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
|
||||||
|
} else {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
server.begin();
|
||||||
|
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
delay(50);
|
||||||
|
server.handleClient();
|
||||||
|
}
|
||||||
|
}
|
14
src/Updater.h
Normal file
14
src/Updater.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef UPDATER_H
|
||||||
|
#define UPDATER_H
|
||||||
|
|
||||||
|
#include "ControllerBuffer.h"
|
||||||
|
|
||||||
|
/** Function to check if the user wants to update the device.
|
||||||
|
* This is signaled by pressing all C Buttons + Start
|
||||||
|
* if so update process is initiated
|
||||||
|
* @param controller pointer to struct containing presed buttons
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
extern void checkUpdateCombo(ControllerData *controller);
|
||||||
|
|
||||||
|
#endif
|
@ -2,6 +2,7 @@
|
|||||||
#include "ControllerData.h"
|
#include "ControllerData.h"
|
||||||
#include "ControllerBuffer.h"
|
#include "ControllerBuffer.h"
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
|
#include "Updater.h"
|
||||||
|
|
||||||
ControllerData controller;
|
ControllerData controller;
|
||||||
|
|
||||||
@ -36,4 +37,11 @@ void loop()
|
|||||||
|
|
||||||
// polling must not occur faster than every 20 ms
|
// polling must not occur faster than every 20 ms
|
||||||
delay(14);
|
delay(14);
|
||||||
|
|
||||||
|
checkUpdateCombo(&controller);
|
||||||
|
|
||||||
|
//Serial.printf("DPAD: %i %i %i %i \n",controller.DPadUp,controller.DPadDown,controller.DPadLeft,controller.DPadRight);
|
||||||
|
//Serial.printf("C: %i %i %i %i \n",controller.CUp,controller.CDown,controller.CLeft,controller.CRight);
|
||||||
|
|
||||||
|
//delay(5000);
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user