Update: implement update of the SPIFFS image
This commit is contained in:
parent
49c39184b9
commit
bb524d03dd
|
@ -7,6 +7,11 @@
|
||||||
class UpdateServer
|
class UpdateServer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum UpdateTypes {
|
||||||
|
UT_FLASH = 0,
|
||||||
|
UT_SPIFFS = 1
|
||||||
|
};
|
||||||
|
|
||||||
UpdateServer(const std::string &pw);
|
UpdateServer(const std::string &pw);
|
||||||
|
|
||||||
void start(void);
|
void start(void);
|
||||||
|
|
|
@ -9,6 +9,10 @@ import time
|
||||||
|
|
||||||
from getpass import getpass
|
from getpass import getpass
|
||||||
|
|
||||||
|
# update types
|
||||||
|
FLASH = 0
|
||||||
|
SPIFFS = 1
|
||||||
|
|
||||||
def readMessage(sock):
|
def readMessage(sock):
|
||||||
data = sock.recv(4)
|
data = sock.recv(4)
|
||||||
length, = struct.unpack(">I", data)
|
length, = struct.unpack(">I", data)
|
||||||
|
@ -28,7 +32,15 @@ with open("../data/etc/auth", "r") as authFile:
|
||||||
break
|
break
|
||||||
lineno += 1
|
lineno += 1
|
||||||
|
|
||||||
_, host, port, filename = sys.argv
|
_, host, port, updatetypestr, filename = sys.argv
|
||||||
|
|
||||||
|
if updatetypestr == "flash":
|
||||||
|
updatetype = FLASH
|
||||||
|
elif updatetypestr == "spiffs":
|
||||||
|
updatetype = SPIFFS
|
||||||
|
else:
|
||||||
|
print(f"Invalid update type {updatetypestr}. Valid types are: flash, spiffs")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# read and store the password from the user
|
# read and store the password from the user
|
||||||
pwd = getpass()
|
pwd = getpass()
|
||||||
|
@ -70,8 +82,12 @@ print() # for proper progress display
|
||||||
|
|
||||||
with open(filename, "rb") as binfile:
|
with open(filename, "rb") as binfile:
|
||||||
filesize = os.stat(filename).st_size
|
filesize = os.stat(filename).st_size
|
||||||
|
messagesize = filesize + 1 # for type byte
|
||||||
|
|
||||||
data = struct.pack(">I", filesize)
|
data = struct.pack(">I", messagesize)
|
||||||
|
s.send(data)
|
||||||
|
|
||||||
|
data = struct.pack("B", updatetype)
|
||||||
s.send(data)
|
s.send(data)
|
||||||
|
|
||||||
sent_bytes = 0
|
sent_bytes = 0
|
||||||
|
|
|
@ -119,11 +119,44 @@ void UpdateServer::updateTask(void *arg)
|
||||||
|
|
||||||
len = be32toh(len);
|
len = be32toh(len);
|
||||||
|
|
||||||
|
if(len <= 1) {
|
||||||
|
Serial.println("Update message too small (expected >= 2 byte)");
|
||||||
|
sendMessage(&client, false, "Update message too small (expected >= 2 byte).");
|
||||||
|
client.stop();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
len -= 1; // remove the previously read byte for type
|
||||||
|
|
||||||
|
// read update type
|
||||||
|
uint8_t update_type;
|
||||||
|
if(!read_n(&client, reinterpret_cast<char*>(&update_type), sizeof(update_type))) {
|
||||||
|
Serial.println("Read from update client (update type) failed.");
|
||||||
|
client.stop();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate to internal value
|
||||||
|
int update_command;
|
||||||
|
switch(update_type) {
|
||||||
|
case UT_FLASH:
|
||||||
|
update_command = U_FLASH;
|
||||||
|
break;
|
||||||
|
case UT_SPIFFS:
|
||||||
|
update_command = U_SPIFFS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Serial.println("Invalid update type.");
|
||||||
|
sendMessage(&client, false, "Invalid update type");
|
||||||
|
client.stop();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Serial.print("Update size: ");
|
Serial.print("Update size: ");
|
||||||
Serial.print(len);
|
Serial.print(len);
|
||||||
Serial.println(" Byte");
|
Serial.println(" Byte");
|
||||||
|
|
||||||
if(!Update.begin(len)) {
|
if(!Update.begin(len, update_command)) {
|
||||||
Serial.println("Cannot start update.");
|
Serial.println("Cannot start update.");
|
||||||
sendMessage(&client, false, "Update failed.");
|
sendMessage(&client, false, "Update failed.");
|
||||||
client.stop();
|
client.stop();
|
||||||
|
|
Loading…
Reference in a new issue