Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancement request: Stream or File support #35

Closed
petervanderwalt opened this issue Sep 28, 2020 · 5 comments
Closed

Enhancement request: Stream or File support #35

petervanderwalt opened this issue Sep 28, 2020 · 5 comments
Labels
enhancement New feature or request

Comments

@petervanderwalt
Copy link

So I can use writeStream from https://github.com/espressif/arduino-esp32/blob/master/libraries/Update/examples/SD_Update/SD_Update.ino (:

Other example: https://techtutorialsx.com/2019/07/21/esp32-arduino-updating-firmware-from-the-spiffs-file-system/

Between the examples, SD and SPIFFS covered, no if only CH376s library had a stream interface (;

[alternative, I am far to stupid to figure out hehe, is to use https://github.com/espressif/arduino-esp32/blob/master/libraries/Update/src/Update.h#L46-L50

@djuseeq djuseeq added the enhancement New feature or request label Sep 29, 2020
@djuseeq
Copy link
Owner

djuseeq commented Sep 29, 2020

I’m pretty busy lately, but I’ll see what I can do

@petervanderwalt
Copy link
Author

So I tried to take a knack at it the last day or two:

    readMoreUpdates = true; 
    size_t updateSize = flashDrive.getFileSize();
    size_t writtenSize = 0;

    int runLoops = 0;

    if (Update.begin(updateSize)) {      
      interface.setCursor(145, 140);
      interface.print("Write: ");
      while(readMoreUpdates){ 
        readMoreUpdates = flashDrive.readFile(updateBuffer, sizeof(updateBuffer));

        // Credit to https://github.com/atanisoft for the type cast assistance with the following line
        size_t written = Update.write((uint8_t*)updateBuffer, sizeof(updateBuffer)-1); // -1 = remove null terminator from c string
        runLoops++;
        writtenSize = writtenSize+written;

        double perc = ((double)flashDrive.getCursorPos()/ (double)flashDrive.getFileSize())*100;
        interface.setCursor(190, 140);
        interface.print(perc);
        interface.print("%");

      }

      interface.beep(frequency);
      delay(100);
      interface.stopBeep();

      Serial.print("Wrote: ");
      Serial.print(writtenSize);
      Serial.print(" of ");
      Serial.print(updateSize);
      Serial.print(" in loops: ");
      Serial.println(runLoops);

     if (Update.end()) {
        if (Update.isFinished()) {
          interface.setCursor(145, 140);
          interface.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
          interface.println("Rebooting...");
          interface.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
        } else {
          interface.setCursor(145, 140);
          interface.setTextColor(ILI9341_RED, ILI9341_BLACK);
          interface.println("Error!");
          interface.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
        }
      } else {
        interface.setCursor(145, 140);
        interface.setTextColor(ILI9341_RED, ILI9341_BLACK);
        interface.println(String(Update.errorString()));
        interface.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
      }
    } else {
      interface.setCursor(145, 140);
      interface.setTextColor(ILI9341_RED, ILI9341_BLACK);
      interface.println("No Space");
      interface.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
    }

Wrote: 1101598 of 1101408 in loops: 4337

4337 read * 254 bytes = 1101598 = what was written to update.h by

size_t written = Update.write((uint8_t*)updateBuffer, sizeof(updateBuffer)-1); // -1 = remove null terminator from c string

But the data on the flashdrive was 1101408 big

I chatted to a couple guys on the arduino-esp32 gitter about it, and it seems readFile is meant for ascii data, and having trouble with the Binary data I am trying to read (firmware image bin)

So might not need full on streaming support, but if you can find a couple minutes to play with the sample code and see what I am doing wrong, or if I should be using https://github.com/djuseeq/Ch376msc/blob/master/src/Read.cpp#L72 or something else (:

@petervanderwalt
Copy link
Author

Just checking if if you maybe have had a chance to look at this (:
Would be so cool to be able to do firmware updates to the ESP32s over USB

@djuseeq
Copy link
Owner

djuseeq commented Oct 28, 2020

Hi, to read a binary data use readRaw() function instead. Try this branch, i wrote one extra function to be more simply to use.
flashDrive.setFileName("RTOSTM32.ELF"); //set the file name
flashDrive.openFile(); //open the file
//read data from flash drive until we reach EOF
while(!flashDrive.getEOF()){
flashDrive.readRaw(adatBuffer, sizeof(adatBuffer));
for(int i = 0; i < (int)flashDrive.getStreamLen(); i++){
Serial.write(adatBuffer[i]);
}//end for loop
}//end while loop
flashDrive.closeFile(); //at the end, close the file

For testing purpose i read 848 Kb .elf file and send it over UART to computer, after a compare two files, the checksum s are identical, so the read is correct.
Screenshot_20201028_132525

@petervanderwalt
Copy link
Author

petervanderwalt commented Oct 28, 2020

That did the job (:


byte updateBuffer[255];       

// ... open the file etc ...

size_t updateSize = flashDrive.getFileSize();
size_t writtenSize = 0;

while(!flashDrive.getEOF()){
          flashDrive.readRaw(updateBuffer, sizeof(updateBuffer));
          size_t written = Update.write(updateBuffer, flashDrive.getStreamLen());
          writtenSize = writtenSize+written;
          double perc = ((double)flashDrive.getCursorPos()/ (double)flashDrive.getFileSize())*100;
          Serial.print(perc);
          Serial.println("%");
}
Serial.print("Wrote: ")
Serial.print(writtenSize);
Serial.print(" of ");
Serial.print(updateSize); 

I'll clean up my code after this stint of the project, and then I'll send over an Example sketch for this (: very useful

Thank you for your help!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants