Add TFT commands

Fork of DigoleSerialDisp by Michael Shimniok

DigoleSerialDisp.cpp

Committer:
pinfred
Date:
2016-11-11
Revision:
7:783f39600291
Parent:
6:3ed9cddf46d0

File content as of revision 7:783f39600291:

/** Digole Serial Display library
 *
 * @Author: Digole Digital Solutions : www.digole.com ported to mbed by Michael Shimniok www.bot-thoughts.com
 */
 
#include "mbed.h"
#include "DigoleSerialDisp.h"
#include <stdio.h>
#include <string.h>
#include <inttypes.h>

char null = 0;


// that resetting the Arduino doesn't reset the LCD, so we
// can't assume that its in that state when a sketch starts (and the
// LiquidCrystal constructor is called).

//UART function

char buf[128];
char tmp[128];

DigoleSerialDisp::DigoleSerialDisp(PinName sda, PinName scl, uint8_t address):
    _device(sda, scl)
{
    _address = (address<<1);
    _device.frequency(300000);
    _Comdelay=70;//70;
}

size_t DigoleSerialDisp::write(const char x)
{
    _device.write(_address, (char *) &x, 1);

    return 1;
}

size_t DigoleSerialDisp::write(const char *str) 
{
    if (str == NULL) return 0;
    return write(str, strlen(str));
}
    
size_t DigoleSerialDisp::write(const char *buffer, size_t size)
{
    int len = 0;
    if (buffer != NULL) {
        len = _device.write(_address, (char *) buffer, size);
        if (len == 0){
            len = size;
        }else{
            len = -1;
        }
        delay(7);
    }
    return len;
}


size_t DigoleSerialDisp::print(const char c)
{
    buf[0] = 'T';
    buf[1] = 'T';
    buf[2] = c;
    buf[3] = 0;
    write(buf);
    write(null);
    return 1;
}

size_t DigoleSerialDisp::print(const char s[])
{
    int len = strlen(s);

    if (s == NULL) return 0;

    buf[0] = 'T';
    buf[1] = 'T';
    buf[2] = 0;
    strncat(buf, s, 125);
    write(buf);
    write(null);
    return len;
}

size_t DigoleSerialDisp::println(const char s[])
{
    return print(s);
}

/*
 Print.cpp - Base class that provides print() and println()
 Copyright (c) 2008 David A. Mellis.  All right reserved.
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 Modified 23 November 2006 by David A. Mellis
 */

size_t DigoleSerialDisp::print(unsigned char b, int base)
{
  return print((unsigned long) b, base);
}

size_t DigoleSerialDisp::print(int n, int base)
{
  return print((long) n, base);
}

size_t DigoleSerialDisp::print(unsigned int n, int base)
{
  return print((unsigned long) n, base);
}

size_t DigoleSerialDisp::print(long n, int base)
{
  if (base == 0) {
    return write(n);
  } else if (base == 10) {
    if (n < 0) {
      int t = print('-');
      n = -n;
      return printNumber(n, 10) + t;
    }
    return printNumber(n, 10);
  } else {
    return printNumber(n, base);
  }
}

size_t DigoleSerialDisp::print(unsigned long n, int base)
{
  if (base == 0) return write(n);
  else return printNumber(n, base);
}

size_t DigoleSerialDisp::print(double n, int digits)
{
  return printFloat(n, digits);
}

size_t DigoleSerialDisp::println(unsigned char b, int base)
{
  size_t n = print(b, base);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(int num, int base)
{
  size_t n = print(num, base);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(unsigned int num, int base)
{
  size_t n = print(num, base);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(long num, int base)
{
  size_t n = print(num, base);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(unsigned long num, int base)
{
  size_t n = print(num, base);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(double num, int digits)
{
  size_t n = print(num, digits);
  n += println();
  return n;
}

size_t DigoleSerialDisp::println(void) 
{
    return 1;
}

// Private Methods /////////////////////////////////////////////////////////////

size_t DigoleSerialDisp::printNumber(unsigned long n, uint8_t base) {
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &buf[sizeof(buf) - 1];

  *str = '\0';

  // prevent crash if called with base == 1
  if (base < 2) base = 10;

  do {
    unsigned long m = n;
    n /= base;
    char c = m - base * n;
    *--str = c < 10 ? c + '0' : c + 'A' - 10;
  } while(n);

  return write(str);
}

size_t DigoleSerialDisp::printFloat(double number, uint8_t digits) 
{ 
  size_t n = 0;
  
  if (isnan(number)) return print("nan");
  if (isinf(number)) return print("inf");
  if (number > 4294967040.0) return print ("ovf");  // constant determined empirically
  if (number <-4294967040.0) return print ("ovf");  // constant determined empirically
  
  // Handle negative numbers
  if (number < 0.0)
  {
     n += print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  n += print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0) {
    n += print("."); 
  }

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    n += print(toPrint);
    remainder -= toPrint; 
  } 
  
  return n;
}

/*---------functions for Text and Graphic LCD adapters---------*/
void DigoleSerialDisp::disableCursor(void) 
{
    write("CS");
    write(null);
}

void DigoleSerialDisp::enableCursor(void) 
{
    write("CS");
    write(1);
}

void DigoleSerialDisp::drawStr(uint8_t x, uint8_t y, const char *s) 
{
    write("TP");
    write(x);
    write(y);
    write("TT");
    write(s);
    write(null);
}

void DigoleSerialDisp::setPrintPos(uint8_t x, uint8_t y, uint8_t graph) 
{
    if (graph == _TEXT_) {
        write("TP");
        write(x);
        write(y);
    } else {
        write("GP");
        write(x);
        write(y);
    }
}

void DigoleSerialDisp::clearScreen(void) 
{
    //write(null);
    write("CL");
}


void DigoleSerialDisp::setLCDColRow(uint8_t col, uint8_t row) 
{
    write("STCR");
    write(col);
    write(row);
    write("\x80\xC0\x94\xD4");
}

void DigoleSerialDisp::setI2CAddress(uint8_t add) 
{
    write("SI2CA");
    write(add);
    _address = (add<<1);
}

void DigoleSerialDisp::displayConfig(uint8_t v) 
{
    write("DC");
    write(v);
}

void DigoleSerialDisp::preprint(void) 
{
    //print("TT");
}

/*----------Functions for Graphic LCD/OLED adapters only---------*/
void DigoleSerialDisp::drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *bitmap) {
    uint8_t i = 0;
    if ((w & 7) != 0)
        i = 1;
    write("DIM");
    write(x); //x;
    write(y);
    write(w);
    write(h);
    for (int j = 0; j < h * ((w >> 3) + i); j++) {
        write( bitmap[j] );
        delay(1);
    }
}

void DigoleSerialDisp::drawBitmap256(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *bitmap) {
    write("EDIM1");
    write(x); //x;
    write(y);
    write(w);
    write(h);
    for (int j = 0; j < h * w; j++) {
        write(bitmap[j]);
        delay(1);
    }
}

void DigoleSerialDisp::setRot90(void) {
    write("SD1");
}

void DigoleSerialDisp::setRot180(void) {
    write("SD2");
}

void DigoleSerialDisp::setRot270(void) {
    write("SD3");
}

void DigoleSerialDisp::undoRotation(void) {
    write("SD0");
}

void DigoleSerialDisp::setRotation(uint8_t d) {
    write("SD");
    write(d);
}

void DigoleSerialDisp::setContrast(uint8_t c) {
    write("CT");
    write(c);
}

void DigoleSerialDisp::drawBox(uint8_t x, uint8_t y, uint8_t w, uint8_t h) {
    write("FR");
    write(x);
    write(y);
    write(x + w);
    write(y + h);
}

void DigoleSerialDisp::drawCircle(uint8_t x, uint8_t y, uint8_t r, uint8_t f) {
    write("CC");
    write(x);
    write(y);
    write(r);
    write(f);
}

void DigoleSerialDisp::drawDisc(uint8_t x, uint8_t y, uint8_t r) {
    drawCircle(x, y, r, 1);
}

void DigoleSerialDisp::drawFrame(uint8_t x, uint8_t y, uint8_t w, uint8_t h) {
    write("DR");
    write(x);
    write(y);
    write(x + w);
    write(y + h);
}

void DigoleSerialDisp::drawPixel(uint8_t x, uint8_t y, uint8_t color) {
    write("DP");
    write(x);
    write(y);
    write(color);
}

void DigoleSerialDisp::drawLine(uint8_t x, uint8_t y, uint8_t x1, uint8_t y1) {
    write("LN");
    write(x);
    write(y);
    write(x1);
    write(y1);
}

void DigoleSerialDisp::drawLineTo(uint8_t x, uint8_t y) {
    write("LT");
    write(x);
    write(y);
}

void DigoleSerialDisp::drawHLine(uint8_t x, uint8_t y, uint8_t w) {
    drawLine(x, y, x + w, y);
}

void DigoleSerialDisp::drawVLine(uint8_t x, uint8_t y, uint8_t h) {
    drawLine(x, y, x, y + h);
}

void DigoleSerialDisp::nextTextLine(void) {
    write(null);
    write("TRT");
}

void DigoleSerialDisp::setFont(uint8_t font) {
    write("SF");
    write(font);
}

void DigoleSerialDisp::setColor(uint8_t color) {
    write("SC");
    write(color);
}

void DigoleSerialDisp::setBgColor(uint8_t color) {
    write("BGC");
    write(color);
}

void DigoleSerialDisp::backLightOn(void) {
    write("BL");
    write(1);
}

void DigoleSerialDisp::backLightOff(void) {
    write("BL");
    write(null);
}

void DigoleSerialDisp::directCommand(uint8_t d) {
    write("MCD");
    write(d);
}

void DigoleSerialDisp::directData(uint8_t d) {
    write("MDT");
    write(d);
}

void DigoleSerialDisp::moveArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, char xoffset, char yoffset) {
    write("MA");
    write(x0);
    write(y0);
    write(x1);
    write(y1);
    write(xoffset);
    write(yoffset);
}


int DigoleSerialDisp::displayStartScreen(uint8_t m) {
    int ret =0;
    ret = write("DSS");
    if (ret == -1) return -1;
    write(m);
    return 0;
} //display start screen


void DigoleSerialDisp::setMode(uint8_t m) {
    write("DM");
    write(m);
} //set display mode


void DigoleSerialDisp::setTextPosBack(void) {
    write("ETB");
} //set text position back to previous, only one back allowed


void DigoleSerialDisp::setTextPosOffset(char xoffset, char yoffset) {
    write("ETO");
    write(xoffset);
    write(yoffset);
}


void DigoleSerialDisp::setTextPosAbs(uint8_t x, uint8_t y) {
    write("ETP");
    write(x);
    write(y);
}


void DigoleSerialDisp::setLinePattern(uint8_t pattern) {
    write("SLP");
    write(pattern);
}


void DigoleSerialDisp::setLCDChip(uint8_t chip) {      //only for universal LCD adapter
    write("SLCD");
    write(chip);
}


void DigoleSerialDisp::setDrawWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {      
    write("DWWIN");
    write(x);
    write(y);
    write(w);
    write(h);
}

void DigoleSerialDisp::resetDrawWindow() {      
    write("RSTDW");
}

void DigoleSerialDisp::cleanDrawWindow() {      
    write("WINC");
}



void DigoleSerialDisp::uploadStartScreen(int lon, const unsigned char *data) 
{
    int j;
    uint8_t c;
    write("SSS");
    write((uint8_t) (lon % 256));
    write((uint8_t) (lon / 256));
    for (j = 0; j < lon;j++) {
        if((j%32)==0)
            delay(10);
        delay(_Comdelay);
        c = data[j];
        write(c);
    }
}


void DigoleSerialDisp::uploadUserFont(int lon, const unsigned char *data, uint8_t sect) {
    uint8_t c;
    write("SUF");
    write(sect);
    write((uint8_t) (lon % 256));
    write((uint8_t) (lon / 256));
    for (int j = 0; j < lon; j++) {
        if((j%32)==0)
            delay(10);
        delay(_Comdelay);
        c = data[j];
        write(c);
    }
}

void DigoleSerialDisp::digitalOutput(uint8_t x) 
{
    write("DOUT");
    write(x);
}