Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 7 of 7

Thread: adding functions to library ili9341_t3 or ili9341_t3n

  1. #1

    adding functions to library ili9341_t3 or ili9341_t3n

    hi,

    its possible to adding function for example:

    center string: DrawCenterString(...)
    scroll function ..
    ...

    thanks in advance.

  2. #2
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    7,441
    Yes it is possible to add new things. If you have working code, I would be more than willing to take a Pull request (_t3n) with it...

    Or if I know exactly what it is supposed to do and have example code to test with, I might at some point get inspired...

  3. #3
    TFT_eSPI for esp8266 ans esp32 contain code i think based to ili9341 for adafruit.

    Code:
    /***************************************************************************************
    ** Function name:           drawCentreString (deprecated, use setTextDatum())
    ** Descriptions:            draw string centred on dX
    ***************************************************************************************/
    int16_t TFT_eSPI::drawCentreString(const String& string, int dX, int poY, int font)
    {
      int16_t len = string.length() + 2;
      char buffer[len];
      string.toCharArray(buffer, len);
      return drawCentreString(buffer, dX, poY, font);
    }
    
    int16_t TFT_eSPI::drawCentreString(const char *string, int dX, int poY, int font)
    {
      static byte tempdatum = textdatum;
      int sumX = 0;
      textdatum = TC_DATUM;
      sumX = drawString(string, dX, poY, font);
      textdatum = tempdatum;
      return sumX;
    }
    
    /***************************************************************************************
    ** Function name:           drawString (with or without user defined font)
    ** Description :            draw string with padding if it is defined
    ***************************************************************************************/
    // Without font number, uses font set by setTextFont()
    int16_t TFT_eSPI::drawString(const String& string, int poX, int poY)
    {
      int16_t len = string.length() + 2;
      char buffer[len];
      string.toCharArray(buffer, len);
      return drawString(buffer, poX, poY, textfont);
    }
    // With font number
    int16_t TFT_eSPI::drawString(const String& string, int poX, int poY, int font)
    {
      int16_t len = string.length() + 2;
      char buffer[len];
      string.toCharArray(buffer, len);
      return drawString(buffer, poX, poY, font);
    }
    example for TFT_Terminal program scrolling from TFT_eSPI

    Code:
    /*************************************************************
      This sketch implements a simple serial receive terminal
      program for monitoring serial debug messages from another
      board.
      
      Connect GND to target board GND
      Connect RX line to TX line of target board
      Make sure the target and terminal have the same baud rate
      and serial stettings!
    
      The sketch works with the ILI9341 TFT 240x320 display and
      the called up libraries.
      
      The sketch uses the hardware scrolling feature of the
      display. Modification of this sketch may lead to problems
      unless the ILI9341 data sheet has been understood!
    
      Updated by Bodmer 21/12/16 for TFT_eSPI library:
      https://github.com/Bodmer/TFT_eSPI
      
      BSD license applies, all text above must be included in any
      redistribution
     *************************************************************/
    
    #include <TFT_eSPI.h> // Hardware-specific library
    #include <SPI.h>
    
    TFT_eSPI tft = TFT_eSPI();       // Invoke custom library
    
    // The scrolling area must be a integral multiple of TEXT_HEIGHT
    #define TEXT_HEIGHT 16 // Height of text to be printed and scrolled
    #define BOT_FIXED_AREA 0 // Number of lines in bottom fixed area (lines counted from bottom of screen)
    #define TOP_FIXED_AREA 16 // Number of lines in top fixed area (lines counted from top of screen)
    #define YMAX 320 // Bottom of screen area
    
    // The initial y coordinate of the top of the scrolling area
    uint16_t yStart = TOP_FIXED_AREA;
    // yArea must be a integral multiple of TEXT_HEIGHT
    uint16_t yArea = YMAX-TOP_FIXED_AREA-BOT_FIXED_AREA;
    // The initial y coordinate of the top of the bottom text line
    uint16_t yDraw = YMAX - BOT_FIXED_AREA - TEXT_HEIGHT;
    
    // Keep track of the drawing x coordinate
    uint16_t xPos = 0;
    
    // For the byte we read from the serial port
    byte data = 0;
    
    // A few test variables used during debugging
    boolean change_colour = 1;
    boolean selected = 1;
    
    // We have to blank the top line each time the display is scrolled, but this takes up to 13 milliseconds
    // for a full width line, meanwhile the serial buffer may be filling... and overflowing
    // We can speed up scrolling of short text lines by just blanking the character we drew
    int blank[19]; // We keep all the strings pixel lengths to optimise the speed of the top line blanking
    
    void setup() {
      // Setup the TFT display
      tft.init();
      tft.setRotation(0); // Must be setRotation(0) for this sketch to work correctly
      tft.fillScreen(TFT_BLACK);
      
      // Setup baud rate and draw top banner
      Serial.begin(9600);
      
      tft.setTextColor(TFT_WHITE, TFT_BLUE);
      tft.fillRect(0,0,240,16, TFT_BLUE);
      tft.drawCentreString(" Serial Terminal - 9600 baud ",120,0,2);
    
      // Change colour for scrolling zone text
      tft.setTextColor(TFT_WHITE, TFT_BLACK);
    
      // Setup scroll area
      setupScrollArea(TOP_FIXED_AREA, BOT_FIXED_AREA);
    
      // Zero the array
      for (byte i = 0; i<18; i++) blank[i]=0;
    }
    
    
    void loop(void) {
      //  These lines change the text colour when the serial buffer is emptied
      //  These are test lines to see if we may be losing characters
      //  Also uncomment the change_colour line below to try them
      //
      //  if (change_colour){
      //  change_colour = 0;
      //  if (selected == 1) {tft.setTextColor(TFT_CYAN, TFT_BLACK); selected = 0;}
      //  else {tft.setTextColor(TFT_MAGENTA, TFT_BLACK); selected = 1;}
      //}
    
      while (Serial.available()) {
        data = Serial.read();
        // If it is a CR or we are near end of line then scroll one line
        if (data == '\r' || xPos>231) {
          xPos = 0;
          yDraw = scroll_line(); // It can take 13ms to scroll and blank 16 pixel lines
        }
        if (data > 31 && data < 128) {
          xPos += tft.drawChar(data,xPos,yDraw,2);
          blank[(18+(yStart-TOP_FIXED_AREA)/TEXT_HEIGHT)%19]=xPos; // Keep a record of line lengths
        }
        //change_colour = 1; // Line to indicate buffer is being emptied
      }
    }
    
    // ##############################################################################################
    // Call this function to scroll the display one text line
    // ##############################################################################################
    int scroll_line() {
      int yTemp = yStart; // Store the old yStart, this is where we draw the next line
      // Use the record of line lengths to optimise the rectangle size we need to erase the top line
      tft.fillRect(0,yStart,blank[(yStart-TOP_FIXED_AREA)/TEXT_HEIGHT],TEXT_HEIGHT, TFT_BLACK);
    
      // Change the top of the scroll area
      yStart+=TEXT_HEIGHT;
      // The value must wrap around as the screen memory is a circular buffer
      if (yStart >= YMAX - BOT_FIXED_AREA) yStart = TOP_FIXED_AREA + (yStart - YMAX + BOT_FIXED_AREA);
      // Now we can scroll the display
      scrollAddress(yStart);
      return  yTemp;
    }
    
    // ##############################################################################################
    // Setup a portion of the screen for vertical scrolling
    // ##############################################################################################
    // We are using a hardware feature of the display, so we can only scroll in portrait orientation
    void setupScrollArea(uint16_t tfa, uint16_t bfa) {
      tft.writecommand(ILI9341_VSCRDEF); // Vertical scroll definition
      tft.writedata(tfa >> 8);           // Top Fixed Area line count
      tft.writedata(tfa);
      tft.writedata((YMAX-tfa-bfa)>>8);  // Vertical Scrolling Area line count
      tft.writedata(YMAX-tfa-bfa);
      tft.writedata(bfa >> 8);           // Bottom Fixed Area line count
      tft.writedata(bfa);
    }
    
    // ##############################################################################################
    // Setup the vertical scrolling start address pointer
    // ##############################################################################################
    void scrollAddress(uint16_t vsp) {
      tft.writecommand(ILI9341_VSCRSADD); // Vertical scrolling pointer
      tft.writedata(vsp>>8);
      tft.writedata(vsp);
    }
    EDIT:
    source of TFT_eSPI is here https://github.com/Bodmer/TFT_eSPI
    Last edited by andromeda; 08-26-2017 at 07:47 PM.

  4. #4
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    7,441
    Looks like most of the code is hardly tied to the internals of their version of the ILI9341 library...

    Could probably be converted, but would need to look at full set of code to figure it out. Currently playing with other things so probably won't get to it, for awhile...

    Note: with the ILI9341_t3n library this is a function that I believe works with Font drawing and strings, which I merged in from an external request to the main _t3 library, but I have not used.
    something like: pixel_count = tft.strPixelLen(myStr);
    Which will take a string and return back how many pixels wide that string would use. From that you can do your own code to horizontally center your string. That is then set the text cursor to the appropriate place such that your string is centered within your desired rectangle.

    As for scrolling text, I know there is some hardware support for doing some offsetting and the like. I have not played with it in a long time, so don't remember much. I don't see any of the command numbers defined in the header files so pretty sure not in current code. When I was playing with code that was running on an Intel Edison, I did my own scrolling text box. But this relied on me doing the work. That is I kept a list of the last N lines of text and when a new string came that needed to update the display, it would logically output all of the strings up one line at a time and blank out after the end of each line...

    I also know I experimented with doing it a different way of reading the pixels in for the lines below the top line, then write them back out starting at the first line, then output new string and blank out after it... This works well when I am using the display with the Frame buffer mode.... Which in _t3n only works for T3.6

  5. #5
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    920
    Hi KurtE, also, any reason why rotateChar was not included in your lib? This allows text in multiple orientations on the same screen.

    the UTFT lib has an example of this: https://github.com/telamon/utft/blob/master/UTFT.cpp
    Last edited by mortonkopf; 08-26-2017 at 05:04 PM. Reason: add link

  6. #6
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    7,441
    Note: my library started off simply as a way to test the T3.6 with multiple SPI devices. I later merged in some of the stuff that others have requested added to the _t3 library... In addition to this I also integrated in some of the Frame buffer stuff that Frank B did, plus then made the frame buffer stuff work better for what I would use it for.

    So I am mainly concentrated on those areas. But as I mentioned if someone wishes to make a Pull Request with new functionality I would be very willing to try it out and integrate it.

  7. #7
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    920
    yep, I appreciate the work that you have put into it. I had a look through and its beyond me at the moment. I did find a solution using drawing to screen within only certain areas:
    Click image for larger version. 

Name:	screen_rotation.jpg 
Views:	177 
Size:	80.5 KB 
ID:	11388

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •