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

Problem opening bmp file with FileIO on the Arduino Yún SD card to image on TFT screen. #2320

Closed
Lalieu opened this issue Sep 23, 2014 · 13 comments
Assignees
Labels
Library: Bridge The Bridge Arduino library Library: Other Arduino libraries that don't have their own label Type: Bug

Comments

@Lalieu
Copy link

Lalieu commented Sep 23, 2014

Hi all,

I have been trying to print a .bmp image on the arduino 1.77" TFT screen using the Arduino Yún, but I have some trouble opening the file using the FileIO library of the Yún. Although I can find the .bmp file on the SD card installed on the Yún, and can open it using: FileSystem.open(filename), it is not loaded as an image file properly when using: PImage logo = tft.loadImage(filename), causing logo.isValid() to return false.

Here is how far I got:

System:

  • Arduino Yún
  • Arduino 1.77" TFT LCD Screen
  • Micro SD card installed to the Yún (using YunDiskSpaceExpander.iso).
  • Image: arduino.bmp stored on the SD card (/mnt/sd/arduino.bmp).

With the system I was able to:

  • Create .txt file on the SD card, read it, and print the text in the file on the TFT screen.
  • Store arduino.bmp file on the SD card and find it in the sketch using
    Code:
    FileSystem.open("/mnt/sd/arduino.bmp")
  • print image on the TFT screen with SD card inserted in the TFT screen (instead of the Yún) and using the Arduino TFT Bitmap Logo example to print the logo on the screen.

So, from this I conclude that the connection between the TFT screen and Yún is fine and the image on the SD card installed in the Yún is accessible using the FileIO library of the Yún.

However, when the .bmp is stored on the SD card in the Yún, the FileIO library is needed to access the file. To display the image, the TFT library is needed, which in turn needs the SD library. The SD and FileIO library interfere with each other, due to double declarations of the File class.
The TFT library just uses the Adafruit_ST7735 and Adafruit_GFX libraries. Looking at these libraries it seems that the SD library is only needed to open the file on the SD card:
bmpFile = SD.open(fileName)
Therefore the PImage class and image handling functions needed to print the image on the screen are only declared when the SD library is loaded (#if defined(SD_H)).

In order to use the Adafruit libraries in combination with the FileIO library instead of the SD library I changed:
bmpFile = SD.open(fileName)
into:
File bmpFile = FileSystem.open(fileName);
and
#if defined(SD_H)
into
#if defined(FILEIO_H)
in the Adafruit library files and Pimage.h file.

With these modifications the different libraries are able to work with each other, and I can access the image on the SD card in the Yún, while using the Adafruit libraries, which should allow to print the image on the screen using the following code:

#include Bridge.h
#include FileIO.h
#include SPI.h
#include "Adafruit_ST7735.h"
#include "Adafruit_GFX.h"

// pin definitions
#define cs   7
#define dc   5
#define rst  6

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

void setup() {

  tft.initG();
  tft.setRotation(1);

  Bridge.begin();
  Serial.begin(9600);

  tft.fillScreen(ST7735_WHITE);
  tft.setTextColor(ST7735_BLACK);  
  tft.setTextSize(1);

  tft.println("Initializing FileSystem...");
  if (!FileSystem.begin()) {
    tft.println("failed!");
    return;
  }
  tft.println("OK!");

  PImage logo = tft.loadImage("/mnt/sda1/arduino.bmp");
  if (!logo.isValid()) {
    tft.println("error while loading Image");
    return;
  }
  tft.println("Image loaded");
_
  delay(5000);

  tft.fillScreen(ST7735_WHITE);
  tft.image(logo, 0, 0);
}

void loop() {
}

However, logo.isValid() returns false. So I guess the image is loaded differently now I’m using:
File bmpFile = FileSystem.open(fileName);
instead of:
bmpFile = SD.open(fileName);
However, until now I haven’t been able to figure out what is going wrong.

Therefore I hope there is someone who knows what is going wrong, or who encountered the problem before and discovered a solution.

Cheers,

Mark

@ffissore
Copy link
Contributor

ffissore commented Oct 9, 2014

When you load the image, lots of debug info should be printed on the serial monitor. Can you paste them here?

@Lalieu
Copy link
Author

Lalieu commented Oct 10, 2014

When the image is loaded the following is printed to the serial monitor:

File size: 2770445601
Image Offset: 2770445601
Header size: 2770445601
loadImage: invalid n. of planes

any ideas?

@ffissore
Copy link
Contributor

So this is where it's failing: https://github.com/arduino/Arduino/blob/ide-1.5.x/libraries/TFT/src/utility/Adafruit_GFX.h#L340
Thank you, we'll look into it.

@ffissore ffissore added Library: Bridge The Bridge Arduino library Library: Other Arduino libraries that don't have their own label Type: Bug labels Oct 10, 2014
@ffissore
Copy link
Contributor

If you have suggestions or fixes, please don't hesitate to share them

@Lalieu
Copy link
Author

Lalieu commented Oct 10, 2014

I don't know if the spot you highlighted in your previous comment (where read16() is called) is the first spot where it is failing. The numbers printed for the File Size, Image Offset and Header Size seem a bit strange to me, being equal. These numbers are generated using read32() (just above your highlighted part), so maybe it already fails there.

I should be able to check the numbers by formatting the SD card, plugging it back into the TFT SD slot and reading the image from the SD card in the TFT SD slot (in which case i was able to print the image on the TFT screen). Hope to check that this evening.

@sngl
Copy link
Contributor

sngl commented Oct 13, 2014

@Lalieu , can you share your modified files? The modified library and the sketch
Thanks

@Lalieu
Copy link
Author

Lalieu commented Oct 13, 2014

@sngl , Hey, I don't know if this is the best way to share the files, but I've put the changed files and the sketch here.

@sngl
Copy link
Contributor

sngl commented Oct 16, 2014

Hello @Lalieu ,
what causes the problem is the method you use to pass the bmpFile to the functions read16 and read32.

The FileIO class updates its internal data after every read or write to remain in sync with the linux-side Bridge library.
In your code you are passing the File object by value, so for example when you use f.read in read16 function, you are communicating with the linux-side but you are updating the internal data of the local File object. When you exit from the function the local object is lost and if you call again read16 or read32 you will pass them the old bmpFile object that is not in sync with the Bridge on linux. This causes errors in the communication so the data you read on the Serial monitor is not the data coming from the file.
You can see this error because when the TFT library reads the BMP header it works correctly and then tries to read the next sections of the bmp file. After the header reading is competed it exits from the read16 function and then it call again read16 or read32, causing the problem.

The solution is to pass the bmpFile object by reference, so you have to modify the functions in this way
uint16_t PImage::read16(File f) ----> uint16_t PImage::read16(File *f)
and inside the function:
((uint8_t *)&result)[0] = f.read(); ----> ((uint8_t *)&result)[0] = f->read();
and so on...
and calling it by read16(&bmpFile) instead of read16(bmpFile);
Passing the bmpFile by reference to read16 the f->read( ) method will update the original object so when you call different times the read16 and read32 functions it will be always in sync.


Initializing FileSystem...
OK!
File size: 9482
Image Offset: 122
Header size: 108
Bit Depth: 24
Image size: 52x60

Image loaded

@Lalieu
Copy link
Author

Lalieu commented Oct 17, 2014

@sngl , Thank you for the time and effort! I understand the problem now, and will try the fix this weekend.

@ld21
Copy link

ld21 commented Oct 18, 2014

@Lalieu: I just implemented what you are trying to do. Check out http://forum.arduino.cc/index.php?topic=268492.0 where I left my sketch for you. Good luck and a lot of fun with your project I wish!

@agdl
Copy link
Member

agdl commented Jun 5, 2015

@Lalieu @sngl if the problem has been solved please close the issue!

@agdl
Copy link
Member

agdl commented Jul 12, 2016

This issue was moved to arduino-libraries/Bridge#8

@agdl
Copy link
Member

agdl commented Jul 12, 2016

This issue was moved to arduino-libraries/Bridge#9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Library: Bridge The Bridge Arduino library Library: Other Arduino libraries that don't have their own label Type: Bug
Projects
None yet
Development

No branches or pull requests

7 participants