/*
 Test wyświetlacza 4-cyfrowego
 Ten szkic ilustruje techniki przewijania tekstu na wyświetlaczu 4-cyfrowym.
 Zgodnie z tradycją pierwszy program powinien wyświetlać komunikat Witaj świecie,
 jednak wyświetlacz 4-znakowy nie pozwala wyświetlać np. litery w. W tej sytuacji musimy improwizować...
 Ten przykładowy kod jest dostępny publicznie.
 */

#include <SoftwareSerial.h>

#define SerialIn 2
#define SerialOut 3

#define Xdelay 600

String txtmessage = "HeJ JeSt SuPer";

byte thou=0;
byte hund=0;
byte tens=0;
byte ones=0;


SoftwareSerial mySerialPort(SerialIn, SerialOut);

void setup()
{
  pinMode(SerialOut, OUTPUT);
  pinMode(SerialIn, INPUT);


  // rozpoczyna komunikację z wyświetlaczem 4-znakowym
  mySerialPort.begin(9600);

  // znak 'v' resetuje wyświetlacz
  mySerialPort.print("v");

}

void loop()
{


  // włącza wszystkie segmenty w celach testowych
  mySerialPort.print("----");
  delay(Xdelay); 
  mySerialPort.print("8888");
  delay(Xdelay); 
  mySerialPort.print("----");
  delay(Xdelay); 
  mySerialPort.print("xxxx");
  delay(Xdelay); 



  // przewija cyfry od 1 do zera w prosty, ale mało ciekawy sposób 
  mySerialPort.print("xxxx");
  delay(Xdelay); 
  mySerialPort.print("xxx1");
  delay(Xdelay); 
  mySerialPort.print("xx12");
  delay(Xdelay); 
  mySerialPort.print("x123");
  delay(Xdelay); 
  mySerialPort.print("1234");
  delay(Xdelay); 
  mySerialPort.print("2345");
  delay(Xdelay); 
  mySerialPort.print("3456");
  delay(Xdelay); 
  mySerialPort.print("4567");
  delay(Xdelay); 
  mySerialPort.print("5678");
  delay(Xdelay); 
  mySerialPort.print("6789");
  delay(Xdelay); 
  mySerialPort.print("7890");
  delay(Xdelay); 
  mySerialPort.print("8900");
  delay(Xdelay); 
  mySerialPort.print("9000");
  delay(Xdelay); 
  mySerialPort.print("0000");
  delay(Xdelay); 


  // liczy od -1009 do 2000

  for(int i = -1009; i<2000; i++)
  {
    if((i<-999) || (i>9999))
    {
      mySerialPort.print("ERRx");
      return;
    }
    char fourChars[5];
    sprintf(fourChars, "%04d", i);

    mySerialPort.print("v");
    mySerialPort.print(fourChars);

    // jeśli liczby zmieniają się zbyt szybko, wystarczy zwiększyć opóźnienie
    //delay(Xdelay);

  }



  delay(Xdelay); 
  mySerialPort.print("xxxx");
  delay(Xdelay); 


  // przewija wartość zmiennej txtmessage w dość skomplikowany sposób
  // dodaje najpierw niezbędny bufor 
  txtmessage = "xxxx"+txtmessage+"xxxxx";
  // następnie konwertuje łańcuch (obiekt typu String) na tablicę znaków (typu char)
  // dzięki temu będzie możliwe wyświetlanie danych za pomocą biblioteki SoftwareSerial
  char temps[txtmessage.length()];
  txtmessage.toCharArray(temps,txtmessage.length());

  // wyświetlany tekst należy jeszcze przewinąć 
  for(int i = 0; i <= txtmessage.length()-5; i++)
  {
    mySerialPort.print(temps[i]);
    mySerialPort.print(temps[i+1]);
    mySerialPort.print(temps[i+2]);
    mySerialPort.print(temps[i+3]);
    delay(Xdelay);
  }


  delay(Xdelay); 
  delay(Xdelay); 
  delay(Xdelay); 

}

