/********************************************************
  JI3BNB SSTV ENCODER (ROBOT B/W 8S MODE)
  v1.4 2016.04.08
  ARDUINO MEGA 2560 + ETHERNET SHIELD R3 + AD9850 DDS
  ETHERNET SHIELD ACTS JUST AS A "SD CARD SHIELD"
  --- THIS CODE IS IN THE PUBLIC DOMAIN --- 
/********************************************************/

#include <SPI.h> //IDE 1.5.0 or later
#include <SD.h>
const int chipSelect = 4;
File file;

#include <TimerOne.h>

#define  CLK   6 // MEGA:PORT_H3
#define  FQ    7 // MEGA:PORT_H4
#define  DATA  8 // MEGA:PORT_H5
#define  RST   9 // MEGA:PORT_H6

volatile long  oFrq = 7171000; // ***** set operating Frequency here in Hz *****
volatile byte  mode;
volatile byte  sSq;
volatile int   line;
volatile int   ti;

const boolean vox = 1; // ***** USE VOX TONE OR NOT ****

const boolean aRf = 0; // ***** DDS VFO OUTPUT MODE *****
//AF: 0
//RF: 1

char line00[7] = "CQSSTV"; // ***** TEXT MESSAGE 6x2 *****
char line01[7] = "JI3BNB";


const uint8_t font_a[]   = {0x00, 0x18, 0x24, 0x62, 0x62, 0x62, 0x7E, 0x62, 0x62, 0x62, 0x00};
const uint8_t font_b[]   = {0x00, 0x7C, 0x32, 0x32, 0x32, 0x3C, 0x32, 0x32, 0x32, 0x7C, 0x00};
const uint8_t font_c[]   = {0x00, 0x3C, 0x62, 0x62, 0x60, 0x60, 0x60, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_d[]   = {0x00, 0x7C, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x7C, 0x00};
const uint8_t font_e[]   = {0x00, 0x7E, 0x60, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x7E, 0x00};
const uint8_t font_f[]   = {0x00, 0x7E, 0x60, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x00};
const uint8_t font_g[]   = {0x00, 0x3C, 0x62, 0x62, 0x60, 0x60, 0x66, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_h[]   = {0x00, 0x62, 0x62, 0x62, 0x62, 0x7E, 0x62, 0x62, 0x62, 0x62, 0x00};
const uint8_t font_i[]   = {0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00};
const uint8_t font_j[]   = {0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x38, 0x00};
const uint8_t font_k[]   = {0x00, 0x62, 0x64, 0x68, 0x70, 0x68, 0x64, 0x62, 0x62, 0x62, 0x00};
const uint8_t font_l[]   = {0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00};
const uint8_t font_m[]   = {0x00, 0x42, 0x62, 0x76, 0x6A, 0x62, 0x62, 0x62, 0x62, 0x62, 0x00};
const uint8_t font_n[]   = {0x00, 0x42, 0x62, 0x72, 0x6A, 0x66, 0x62, 0x62, 0x62, 0x62, 0x00};
const uint8_t font_o[]   = {0x00, 0x3C, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_p[]   = {0x00, 0x7C, 0x62, 0x62, 0x62, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x00};
const uint8_t font_q[]   = {0x00, 0x3C, 0x62, 0x62, 0x62, 0x62, 0x62, 0x6A, 0x6A, 0x3C, 0x08};
const uint8_t font_r[]   = {0x00, 0x7C, 0x62, 0x62, 0x62, 0x7C, 0x68, 0x64, 0x62, 0x62, 0x00};
const uint8_t font_s[]   = {0x00, 0x3C, 0x62, 0x60, 0x60, 0x3C, 0x06, 0x06, 0x46, 0x3C, 0x00};
const uint8_t font_t[]   = {0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00};
const uint8_t font_u[]   = {0x00, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_v[]   = {0x00, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x22, 0x14, 0x08, 0x00};
const uint8_t font_w[]   = {0x00, 0x62, 0x62, 0x62, 0x62, 0x62, 0x6A, 0x76, 0x62, 0x42, 0x00};
const uint8_t font_x[]   = {0x00, 0x42, 0x62, 0x74, 0x38, 0x1C, 0x2E, 0x46, 0x42, 0x42, 0x00};
const uint8_t font_y[]   = {0x00, 0x42, 0x62, 0x74, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00};
const uint8_t font_z[]   = {0x00, 0x7E, 0x06, 0x0E, 0x0C, 0x18, 0x30, 0x70, 0x60, 0x7E, 0x00};
const uint8_t font_0[]   = {0x00, 0x3C, 0x62, 0x62, 0x66, 0x6A, 0x72, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_1[]   = {0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00};
const uint8_t font_2[]   = {0x00, 0x3C, 0x46, 0x06, 0x06, 0x1C, 0x20, 0x60, 0x60, 0x7E, 0x00};
const uint8_t font_3[]   = {0x00, 0x3C, 0x46, 0x06, 0x06, 0x1C, 0x06, 0x06, 0x46, 0x3C, 0x00};
const uint8_t font_4[]   = {0x00, 0x0C, 0x1C, 0x2C, 0x4C, 0x4C, 0x7E, 0x0C, 0x0C, 0x0C, 0x00};
const uint8_t font_5[]   = {0x00, 0x7E, 0x60, 0x60, 0x60, 0x7C, 0x06, 0x06, 0x46, 0x3C, 0x00};
const uint8_t font_6[]   = {0x00, 0x3C, 0x62, 0x60, 0x60, 0x7C, 0x62, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_7[]   = {0x00, 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00};
const uint8_t font_8[]   = {0x00, 0x3C, 0x62, 0x62, 0x62, 0x3C, 0x62, 0x62, 0x62, 0x3C, 0x00};
const uint8_t font_9[]   = {0x00, 0x3C, 0x46, 0x46, 0x46, 0x3E, 0x06, 0x06, 0x46, 0x3C, 0x00};
const uint8_t font_slu[] = {0x00, 0x00, 0x02, 0x06, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x40, 0x00};
const uint8_t font_das[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00};
const uint8_t font_dot[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00};
const uint8_t font_que[] = {0x00, 0x3C, 0x46, 0x06, 0x06, 0x0C, 0x10, 0x00, 0x30, 0x30, 0x00};
const uint8_t font_eks[] = {0x00, 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x00, 0x18, 0x18, 0x00};
const uint8_t font_col[] = {0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00};
const uint8_t font_spa[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

uint8_t pictArea[4800]; //80*60

void shortPulse (char PIN)
{
  digitalWrite(PIN, 1);
  digitalWrite(PIN, 0);
}

void setFreq(double freq)
{
  //--calculate
  int32_t d_Phase = freq * pow(2, 32) / 125000000;
  //--send first 32bit
  for (int i=0; i<32; i++, d_Phase>>=1)
  {
    if(d_Phase & 1 == 1)
    {
      PORTH |=  _BV(5); //--data
    }
    else
    {
      PORTH &= ~_BV(5); //--data
    }
    //--short pulse clk
    PORTH |=  _BV(3);
    PORTH &= ~_BV(3);
  }
  //--send rest 8bit
  PORTH &= ~_BV(5); //--data
  for (int i=0; i<8; i++)
  {
    //--short pulse clk
    PORTH |=  _BV(3);
    PORTH &= ~_BV(3);
  }
  //--finish, short pulse fq
  PORTH |=  _BV(4);
  delayMicroseconds(30);
  PORTH &= ~_BV(4);
}

void setup()
{
  //--SD CARD
  Serial.begin(9600) ;
  pinMode(53, OUTPUT) ;
  pinMode(31, OUTPUT) ; //ERROR LAMP
  if (!SD.begin(chipSelect))
  {
    Serial.println("ERROR: INSERT SD CARD AND RESTART") ;
    digitalWrite(31, HIGH);
    return ;
  }
  Serial.println("OK: SD CARD INITIALIZED") ;
  //--
  
  Timer1.initialize();
  Timer1.attachInterrupt(timer1_interrupt, 1000);
  
  digitalWrite(47, 1); //INTERNAL PULL UP
  digitalWrite(49, 1); //INTERNAL PULL UP
    
  //--DDS
  pinMode(CLK, OUTPUT);
  pinMode(FQ, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RST, OUTPUT);
  //--reset
  shortPulse(RST);
  shortPulse(CLK);
  //--change mode
  shortPulse(FQ);
  //--done
  delay(5);
  //--
}

void timer1_interrupt(void)
{
  int p;
  
  if(sSq == 3)
  {
    if(mode == 1)
    {
      if(ti < 160)
      {
        p = 80 * (line / 2) + (ti / 2);
        
        if(aRf == 0)
        {
               if(pictArea[p] <= 0x0F){setFreq(1500);}
          else if(pictArea[p] <= 0x1F){setFreq(1553);}
          else if(pictArea[p] <= 0x2F){setFreq(1607);}
          else if(pictArea[p] <= 0x3F){setFreq(1660);}
          else if(pictArea[p] <= 0x4F){setFreq(1713);}
          else if(pictArea[p] <= 0x5F){setFreq(1767);}
          else if(pictArea[p] <= 0x6F){setFreq(1820);}
          else if(pictArea[p] <= 0x7F){setFreq(1873);}
          else if(pictArea[p] <= 0x8F){setFreq(1927);}
          else if(pictArea[p] <= 0x9F){setFreq(1980);}
          else if(pictArea[p] <= 0xAF){setFreq(2033);}
          else if(pictArea[p] <= 0xBF){setFreq(2087);}
          else if(pictArea[p] <= 0xCF){setFreq(2140);}
          else if(pictArea[p] <= 0xDF){setFreq(2193);}
          else if(pictArea[p] <= 0xEF){setFreq(2247);}
          else          {setFreq(2300);}
        }
        else
        {
               if(pictArea[p] <= 0x0F){setFreq(oFrq - 1500);}
          else if(pictArea[p] <= 0x1F){setFreq(oFrq - 1553);}
          else if(pictArea[p] <= 0x2F){setFreq(oFrq - 1607);}
          else if(pictArea[p] <= 0x3F){setFreq(oFrq - 1660);}
          else if(pictArea[p] <= 0x4F){setFreq(oFrq - 1713);}
          else if(pictArea[p] <= 0x5F){setFreq(oFrq - 1767);}
          else if(pictArea[p] <= 0x6F){setFreq(oFrq - 1820);}
          else if(pictArea[p] <= 0x7F){setFreq(oFrq - 1873);}
          else if(pictArea[p] <= 0x8F){setFreq(oFrq - 1927);}
          else if(pictArea[p] <= 0x9F){setFreq(oFrq - 1980);}
          else if(pictArea[p] <= 0xAF){setFreq(oFrq - 2033);}
          else if(pictArea[p] <= 0xBF){setFreq(oFrq - 2087);}
          else if(pictArea[p] <= 0xCF){setFreq(oFrq - 2140);}
          else if(pictArea[p] <= 0xDF){setFreq(oFrq - 2193);}
          else if(pictArea[p] <= 0xEF){setFreq(oFrq - 2247);}
          else          {setFreq(oFrq - 2300);}
        }
      }
      else if(ti == 160)
      {
        line++;
        sSq = 2;
      }
      if(line == 120)
      {
        sSq = 0;
      }
      ti++;
    }
    else if(mode == 0)
    {
    
      if(line >= 40 && line <= 61)
      {
        if(ti < 56)
        {
          p = 56 * (line - 40) + ti;
          if(aRf == 0)
          {
            if(pictArea[p])
            {
              setFreq(2300);
            }
            else
            {
              setFreq(1500);
            }
          }
          else
          {
            if(pictArea[p])
            {
              setFreq(oFrq - 2300);
            }
            else
            {
              setFreq(oFrq - 1500);
            }
          }
        }
        else if(ti == 56)
        {
          line++;
          sSq = 2;
        }
      }
      else
      {
        if(aRf == 0)
        {
          switch(ti)
          {
            case 0:
              setFreq(1500);
              break;
            case 14:
              setFreq(1767);
              break;
            case 28:
              setFreq(2033);
              break;
            case 42:
              setFreq(2300);
              break;
            case 56:
              line++;
              if(line == 120)
              {
                sSq = 0;
              }
              else
              {
                sSq =2;
              }
              break;
          }
        }
        else
        {
          switch(ti)
          {
            case 0:
              setFreq(oFrq - 1500);
              break;
            case 14:
              setFreq(oFrq - 1767);
              break;
            case 28:
              setFreq(oFrq - 2033);
              break;
            case 42:
              setFreq(oFrq - 2300);
              break;
            case 56:
              line++;
              if(line == 120)
              {
                sSq = 0;
              }
              else
              {
                sSq =2;
              }
              break;
          }
        }
      }
      ti++;
    }
  }
}

void loop()
{
  int x;
  int y;
  int i;
  int p;
       
  if(sSq == 0)
  {
    setFreq(2);
    while(sSq == 0)
    {
      if(digitalRead(47) == 0) // - SEND SW -
      {
        sSq = 1;
      }
      else
      {
        delay(30);
      }
    }
  }
  if(sSq == 1)
  {
    boolean  err;
    
    if(digitalRead(49) == 1) // - MODE SW -
    {
      err = 0;
      
      mode = 1; //PICTURE MODE
      Timer1.setPeriod(353); // ***** SLANT ADJUST *****
      
      file = SD.open("sstv.bmp",FILE_READ) ;
      if (file)
      {
        uint16_t addr;
        uint8_t  bData;
        uint8_t  offset;
        uint8_t  cDepth;
        byte   rgbCnt;
        float  pxR;
        float  pxG;
        float  pxB;
        float  pxGr;
        uint8_t  pxGr_;
        
        for(i = 0; i < 4800; i++)
        {
          pictArea[i] = 0xFF;
        }
        
        x    = 0;
        y    = 0;
        addr = 0;
        
        while(file.available())
        {
          bData = file.read();
          
          //Serial.print(addr, HEX);
          //Serial.print(":");
          //Serial.println(bData);
          //delay(300);
          
          if(addr == 0x00)
          {
            if(bData != 0x42) //ASCII"B"
            {
              Serial.println("ERROR: THIS IS NOT BMP FILE");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x01)
          {
            if(bData != 0x4D) //ASCII"M"
            {
              Serial.println("ERROR: THIS IS NOT BMP FILE");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x0A)
          {
            offset = bData; //STARTING ADDRESS OF PICTURE DATA
          }
          else if(addr == 0x0E)
          {
            if(bData != 40) //--WINDOWS BITMAP(40)-- --OS/2 BITMAP(12)--
            {
              Serial.println("ERROR: THIS IS NOT -WINDOWS- BITMAP FILE");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x12)
          {
            if(bData != 80) //PICTURE WIDTH
            {
              Serial.println("ERROR: PICTURE WIDTH MUST BE 80 PX");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x13)
          {
            if(bData != 0) //HIGHER BIT
            {
              Serial.println("ERROR: PICTURE WIDTH MUST BE 80 PX");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x16)
          {
            if(bData != 60) //PICTURE HEIGHT
            {
              Serial.println("ERROR: PICTURE HEIGHT MUST BE 60 PX");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x17) //HIGHER BIT
          {
            if(bData != 0)
            {
              Serial.println("ERROR: PICTURE HEIGHT MUST BE 60 PX");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x1C)
          {
            cDepth = bData;
            if(cDepth != 24 && cDepth != 32) //COLOR DEPTH 1,4,8,24,32 BIT
            {
              Serial.println("ERROR: COLOR MUST BE 24 OR 32 BIT");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr == 0x1E)
          {
            if(bData != 0) //COMPRESSION TYPE 0,1,2,3
            {
              Serial.println("ERROR: MUST BE -NO- COMPRESSION FILE");
              err = 1;
              goto fileCls;
            }
          }
          else if(addr >= 0x0E && addr >= offset)
          {
            switch(rgbCnt)
            {
              case 0:
                pxB = bData; //-- BLUE --
                rgbCnt++;
                break;
              case 1:
                pxG = bData; //-- GREEN --
                rgbCnt++;
                break;
              case 2:
                pxR = bData; //-- RED --
                
                pxGr  = ((pxB * 0.11) + (pxG * 0.59) + (pxR * 0.30)); //-- Convert to Grey Scale --
                pxGr_ = (uint8_t)pxGr;
                
                p = ((59 - y) * 80) + x;
                pictArea[p] = pxGr_;
                
                x++;
                if(x == 80)
                {
                  y++;
                  x = 0;
                }
                if(y == 60)
                {
                  goto fileCls;
                }
                
                if(cDepth == 32)
                {
                  rgbCnt++;
                }
                else
                {
                  rgbCnt = 0;
                }
                break;
              case 3:
                rgbCnt = 0; //-- RESERVE --
                break;                      
            }
          }
          addr++;
        }
        fileCls:
        file.close();
      }
      else
      {
        Serial.println("ERROR: CAN'T OPEN FILE") ;
        err = 1;
      }
      if(err == 1)
      {
        digitalWrite(31, HIGH); //ERROR LAMP
        while(true); //STOP
      }
    }      
    else
    {
      mode = 0; //TEXT MODE
      Timer1.setPeriod(1001); // ***** SLANT ADJUST *****
      
      for(p = 0; p < 1232; p++)
      {
        pictArea[p] = 0xFF;
      }
      
      for(i = 0; i < 12; i++)
      {
        char ch;
        
        if(i < 6)
        {
          ch = line00[i];
        }
        else
        {
          ch = line01[i - 6];
        }
        for(y = 0; y < 11; y++)
        {
          for(x = 0; x < 8; x++)
          {
            if(i < 6)
            {
              p = 4 + (56 * y) + (8 * i) + x;
            }
            else
            {
              p = 4 + (56 * 11) + (56 * y) + (8 * (i - 6)) + x;
            }
            
            uint8_t mask;
            
                 if(x == 0){mask = B10000000;}
            else if(x == 1){mask = B01000000;}
            else if(x == 2){mask = B00100000;}
            else if(x == 3){mask = B00010000;}
            else if(x == 4){mask = B00001000;}
            else if(x == 5){mask = B00000100;}
            else if(x == 6){mask = B00000010;}
            else if(x == 7){mask = B00000001;}          
                 
            if(ch == 'A')
            {
              if((font_a[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'B')
            {
              if((font_b[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'C')
            {
              if((font_c[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'D')
            {
              if((font_d[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'E')
            {
              if((font_e[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'F')
            {
              if((font_f[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'G')
            {
              if((font_g[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'H')
            {
              if((font_h[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'I')
            {
              if((font_i[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'J')
            {
              if((font_j[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'K')
            {
              if((font_k[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'L')
            {
              if((font_l[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'M')
            {
              if((font_m[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'N')
            {
              if((font_n[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'O')
            {
              if((font_o[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'P')
            {
              if((font_p[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'Q')
            {
              if((font_q[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'R')
            {
              if((font_r[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'S')
            {
              if((font_s[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'T')
            {
              if((font_t[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'U')
            {
              if((font_u[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'V')
            {
              if((font_v[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'W')
            {
              if((font_w[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'X')
            {
              if((font_x[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'Y')
            {
              if((font_y[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == 'Z')
            {
              if((font_z[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '0')
            {
              if((font_0[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '1')
            {
              if((font_1[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '2')
            {
              if((font_2[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '3')
            {
              if((font_3[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '4')
            {
              if((font_4[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '5')
            {
              if((font_5[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '6')
            {
              if((font_6[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '7')
            {
              if((font_7[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '8')
            {
              if((font_8[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '9')
            {
              if((font_9[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '/')
            {
              if((font_slu[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '-')
            {
              if((font_das[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '.')
            {
              if((font_dot[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '?')
            {
              if((font_que[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == '!')
            {
              if((font_eks[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == ':')
            {
              if((font_col[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
            else if(ch == ' ')
            {
              if((font_spa[y] & mask) != 0)
              {
                pictArea[p] = 0x00;
              }
            }
          }
        }
      }
    }
    
    if(mode == 0)
    {
      delay(800);
    }
    
    if(aRf == 0)
    {
      //--VOX TONE
      if(vox == 1)
      {
        setFreq(1900);
        delay(100);
        setFreq(1500);
        delay(100);
        setFreq(1900);
        delay(100);
        setFreq(1500);
        delay(100);
        setFreq(2300);
        delay(100);
        setFreq(1500);
        delay(100);
        setFreq(2300);
        delay(100);
        setFreq(1500);
        delay(100);
      }
      
      //--VIS CODE
      //VIS CODE for ROBOT B/W 8S is B0000010 (DECIMAL 2)
      setFreq(1900);
      delay(300);
      setFreq(1200); //BREAK
      delay(10);
      setFreq(1900);
      delay(300);
      setFreq(1200); //START BIT
      delay(30);
      setFreq(1300); //BIT 0 (LSB FIRST)
      delay(30);
      setFreq(1100); //BIT 1
      delay(30);
      setFreq(1300); //BIT 2, 3, 4, 5, 6
      delay(150);
      setFreq(1100); //EVEN PARITY
      delay(30);
      setFreq(1200); //STOP BIT
      delay(30);
    }
    else
    {
      //--VIS CODE
      setFreq(oFrq - 1900);
      delay(300);
      setFreq(oFrq - 1200); //BREAK
      delay(10);
      setFreq(oFrq - 1900);
      delay(300);
      setFreq(oFrq - 1200); //START BIT
      delay(30);
      setFreq(oFrq - 1300); //BIT 0 (LSB FIRST)
      delay(30);
      setFreq(oFrq - 1100); //BIT 1
      delay(30);
      setFreq(oFrq - 1300); //BIT 2, 3, 4, 5, 6
      delay(150);
      setFreq(oFrq - 1100); //EVEN PARITY
      delay(30);
      setFreq(oFrq - 1200); //STOP BIT
      delay(30);
    }
    //--VIS DONE
    line = 0;
    sSq  = 2;
  }
  if(sSq == 2)
  {
    //--sync
    if(aRf == 0)
    {
      setFreq(1200);
      delayMicroseconds(10000);
    }
    else
    {
      setFreq(oFrq - 1200);
      delayMicroseconds(10000);
    }
    //--
    ti  = 0;
    sSq = 3;
  }
}