acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

TFT_Terminal.ino (5862B)

      1 
      2 /*************************************************************
      3   This sketch implements a simple serial receive terminal
      4   program for monitoring serial debug messages from another
      5   board.
      6   
      7   Connect GND to target board GND
      8   Connect RX line to TX line of target board
      9   Make sure the target and terminal have the same baud rate
     10   and serial stettings!
     11 
     12   The sketch works with the ILI9341 TFT 240x320 display and
     13   the called up libraries.
     14   
     15   The sketch uses the hardware scrolling feature of the
     16   display. Modification of this sketch may lead to problems
     17   unless the ILI9341 data sheet has been understood!
     18 
     19   Updated by Bodmer 21/12/16 for TFT_eSPI library:
     20   https://github.com/Bodmer/TFT_eSPI
     21   
     22   BSD license applies, all text above must be included in any
     23   redistribution
     24  *************************************************************/
     25 
     26 #include <TFT_eSPI.h> // Hardware-specific library
     27 #include <SPI.h>
     28 
     29 TFT_eSPI tft = TFT_eSPI();       // Invoke custom library
     30 
     31 // The scrolling area must be a integral multiple of TEXT_HEIGHT
     32 #define TEXT_HEIGHT 16 // Height of text to be printed and scrolled
     33 #define BOT_FIXED_AREA 0 // Number of lines in bottom fixed area (lines counted from bottom of screen)
     34 #define TOP_FIXED_AREA 16 // Number of lines in top fixed area (lines counted from top of screen)
     35 #define YMAX 320 // Bottom of screen area
     36 
     37 // The initial y coordinate of the top of the scrolling area
     38 uint16_t yStart = TOP_FIXED_AREA;
     39 // yArea must be a integral multiple of TEXT_HEIGHT
     40 uint16_t yArea = YMAX-TOP_FIXED_AREA-BOT_FIXED_AREA;
     41 // The initial y coordinate of the top of the bottom text line
     42 uint16_t yDraw = YMAX - BOT_FIXED_AREA - TEXT_HEIGHT;
     43 
     44 // Keep track of the drawing x coordinate
     45 uint16_t xPos = 0;
     46 
     47 // For the byte we read from the serial port
     48 byte data = 0;
     49 
     50 // A few test variables used during debugging
     51 bool change_colour = 1;
     52 bool selected = 1;
     53 
     54 // We have to blank the top line each time the display is scrolled, but this takes up to 13 milliseconds
     55 // for a full width line, meanwhile the serial buffer may be filling... and overflowing
     56 // We can speed up scrolling of short text lines by just blanking the character we drew
     57 int blank[19]; // We keep all the strings pixel lengths to optimise the speed of the top line blanking
     58 
     59 void setup() {
     60   // Setup the TFT display
     61   tft.init();
     62   tft.setRotation(0); // Must be setRotation(0) for this sketch to work correctly
     63   tft.fillScreen(TFT_BLACK);
     64   
     65   // Setup baud rate and draw top banner
     66   Serial.begin(9600);
     67   
     68   tft.setTextColor(TFT_WHITE, TFT_BLUE);
     69   tft.fillRect(0,0,240,16, TFT_BLUE);
     70   tft.drawCentreString(" Serial Terminal - 9600 baud ",120,0,2);
     71 
     72   // Change colour for scrolling zone text
     73   tft.setTextColor(TFT_WHITE, TFT_BLACK);
     74 
     75   // Setup scroll area
     76   setupScrollArea(TOP_FIXED_AREA, BOT_FIXED_AREA);
     77 
     78   // Zero the array
     79   for (byte i = 0; i<18; i++) blank[i]=0;
     80 }
     81 
     82 
     83 void loop(void) {
     84   //  These lines change the text colour when the serial buffer is emptied
     85   //  These are test lines to see if we may be losing characters
     86   //  Also uncomment the change_colour line below to try them
     87   //
     88   //  if (change_colour){
     89   //  change_colour = 0;
     90   //  if (selected == 1) {tft.setTextColor(TFT_CYAN, TFT_BLACK); selected = 0;}
     91   //  else {tft.setTextColor(TFT_MAGENTA, TFT_BLACK); selected = 1;}
     92   //}
     93 
     94   while (Serial.available()) {
     95     data = Serial.read();
     96     // If it is a CR or we are near end of line then scroll one line
     97     if (data == '\r' || xPos>231) {
     98       xPos = 0;
     99       yDraw = scroll_line(); // It can take 13ms to scroll and blank 16 pixel lines
    100     }
    101     if (data > 31 && data < 128) {
    102       xPos += tft.drawChar(data,xPos,yDraw,2);
    103       blank[(18+(yStart-TOP_FIXED_AREA)/TEXT_HEIGHT)%19]=xPos; // Keep a record of line lengths
    104     }
    105     //change_colour = 1; // Line to indicate buffer is being emptied
    106   }
    107 }
    108 
    109 // ##############################################################################################
    110 // Call this function to scroll the display one text line
    111 // ##############################################################################################
    112 int scroll_line() {
    113   int yTemp = yStart; // Store the old yStart, this is where we draw the next line
    114   // Use the record of line lengths to optimise the rectangle size we need to erase the top line
    115   tft.fillRect(0,yStart,blank[(yStart-TOP_FIXED_AREA)/TEXT_HEIGHT],TEXT_HEIGHT, TFT_BLACK);
    116 
    117   // Change the top of the scroll area
    118   yStart+=TEXT_HEIGHT;
    119   // The value must wrap around as the screen memory is a circular buffer
    120   if (yStart >= YMAX - BOT_FIXED_AREA) yStart = TOP_FIXED_AREA + (yStart - YMAX + BOT_FIXED_AREA);
    121   // Now we can scroll the display
    122   scrollAddress(yStart);
    123   return  yTemp;
    124 }
    125 
    126 // ##############################################################################################
    127 // Setup a portion of the screen for vertical scrolling
    128 // ##############################################################################################
    129 // We are using a hardware feature of the display, so we can only scroll in portrait orientation
    130 void setupScrollArea(uint16_t tfa, uint16_t bfa) {
    131   tft.writecommand(ILI9341_VSCRDEF); // Vertical scroll definition
    132   tft.writedata(tfa >> 8);           // Top Fixed Area line count
    133   tft.writedata(tfa);
    134   tft.writedata((YMAX-tfa-bfa)>>8);  // Vertical Scrolling Area line count
    135   tft.writedata(YMAX-tfa-bfa);
    136   tft.writedata(bfa >> 8);           // Bottom Fixed Area line count
    137   tft.writedata(bfa);
    138 }
    139 
    140 // ##############################################################################################
    141 // Setup the vertical scrolling start address pointer
    142 // ##############################################################################################
    143 void scrollAddress(uint16_t vsp) {
    144   tft.writecommand(ILI9341_VSCRSADD); // Vertical scrolling pointer
    145   tft.writedata(vsp>>8);
    146   tft.writedata(vsp);
    147 }
    148