Andy's CarPlayer

/***************************************************************************
                          tty.c  -  description
                             -------------------
    begin                : Wed Mar 2 2005
    copyright            : (C) 2005 by Andy
    email                : 
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 

 #include "main.h"
 #include "log.h"

FifoSetup() {
 fifo_fd = open("/dev/carplayer", O_NONBLOCK|O_RDONLY);
}

FifoRead() {
int data;
char buf;

data = read(fifo_fd, buf, 1);
return buf;
}

tty_setup()
{
int data, have_LCD, have_USB, have_Serial, i;
int PAUSE[] = { 0x06, 0x81, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66};
int PLAY[] = { 0x06, 0x82, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xE0, 0xC0, 0x80};
char *buffer[255];

FILE *in_file;

//struct termios oldmodes, newmodes;
   have_LCD = have_USB = have_Serial = FALSE;

     if ((tty_fd = open("/dev/ttyUSB0", O_RDWR)) < 0) {
//     if ((tty_fd = open("/dev/usb/tts/0", O_RDWR)) < 0) {
       log_printf(LOG_NORMAL, "USB Serial port unable to be opened\n");
       if ((tty_fd = open("/dev/ttyS0", O_RDWR)) < 0) {
         log_printf(LOG_NORMAL, "Serial port unable to be opened\n");
       } else { 
         log_printf(LOG_NORMAL, "ttyS0 serial port found\n");
	 have_Serial = TRUE;
       }
     } else {
       log_printf(LOG_NORMAL, "USB Serial Port found\n");
       have_USB = TRUE;
   }
   if ( have_Serial || have_USB) {
     log_printf(LOG_NORMAL, "Have either Serial or USB interface\n");
   
//     tcgetattr(tty_fd, &oldmodes);
//     newmodes = oldmodes;
//     newmodes.c_cflag = B9600;
//     tcsetattr(tty_fd, TCSANOW, &newmodes);

      write(tty_fd, " ", 1);      // send space char to set baud rate on LCD
      data = 0x0c;                // send ^L char to set module type
      write(tty_fd, &data, 1);
      write(tty_fd, "0", 1);      // set module type to 0 (128x64 pixel, 16x8 char)
      data = 0x12;                // reset LCD module
      write(tty_fd, &data, 1);
      data = 0x03;                // Set clear screen mode
      write(tty_fd, &data, 1);
      write(tty_fd, "2", 1);      // clear both graphic and character screen. Reset cursor to home.
      write(tty_fd, &PAUSE, 10);
      write(tty_fd, &PLAY, 10);
      data = 0x18;
      write(tty_fd, &data, 1);
//      read(tty_fd, buffer, 3);
//     if (((in_file = fopen("/dev/ttyUSB0", "r")) == NULL) || (( in_file = fopen("/dev/ttyS0", "r")) == NULL))
       if ((in_file = fopen("/dev/ttyUSB0", "r")) == NULL)   
	  log_printf(LOG_DEBUG, "Unable to open tty\n");
      else
      {
//         fscanf(in_file, "%s", buffer);

         if (strncmp(buffer, "Dm", 2) == 0) have_LCD = TRUE;
         if(have_LCD == TRUE)
         {
           log_printf(LOG_DEBUG, "Have an LCD\n");
           log_printf(LOG_DEBUG, "LCD reply : %s\n", buffer);
           for (data = 1 ; data <= 14; data++)
           {
             fscanf(in_file, "%s", buffer);
             log_printf(LOG_DEBUG, " %s\n", buffer);
           }
         }
      }
   }
}

tty_write(char *line, char data[16])
{
   int  data1;
   data1 = 0x10;               // set cursor...   (^P)
   write(tty_fd, &data1, 1);
   write(tty_fd, "0", 1);
   write(tty_fd, line, 1);
   write(tty_fd, "01", 2);      // ... character pos 0
//log_printf(LOG_DEBUG, "Writing \"%s\" to line %s on tty\n", data, line);
   data1 = 0x04;
   write(tty_fd, &data1, 1);    // Set Display text sent as ASCII

//strcat(&data, "/n"); // Add a newline to the end of the string - don't know why, but it works...
log_printf(LOG_NOISY_DEBUG, "Writing \"%s\" (%i chars) to line %s on tty\n", data, strlen(data), line);
if (strlen(data) >= 16) {
     write(tty_fd, data, 16);
} else
write(tty_fd, data, strlen(data));

}

tty_offset_write(char *line, char data[16])
{
   int data1;
   data1 = 0x10;               // set cursor...   (^P)
   write(tty_fd, &data1, 1);
   write(tty_fd, "0", 1);
   write(tty_fd, line, 1);
   write(tty_fd, "06", 2);      // ... character pos 0
   data1 = 0x04;
   write(tty_fd, &data1, 1);    // Set Display text sent as ASCII
   write(tty_fd, data, strlen(data));
}

LCD_clear()
{
  int data;
  data = 0x03;                // Set clear screen mode
  write(tty_fd, &data, 1);
  write(tty_fd, "2", 1);      // clear both graphic and character screen. Reset cursor to home.
}
/*
LCD_select_album()
{
  int a,b,c,d;
  int LCD_album_num, start_line = 0, counter, temp, i, j,k, line_offset[7], done ;
  char LCD_buffer[16], buffer[30], buffer1[5];
  char menu_option;
  LCD_clear();
  wtimeout(stdscr, 750);
  while(done != TRUE)
  {

  for(counter=0; counter <= 7; counter++)
  {
    j = counter + start_line;
    temp=(counter + 49);
    for (i=0; i<= 30; i++) buffer[i] = NULL;
    for (i=0; i<= 5; i++) buffer1[i] = NULL;
    strncpy(buffer, new_album_list[counter].album, 10);

    a=(((j/1000)%10) + 48); if ( a == 48) a = 32;
    b=(((j/100)%10) + 48); if ((b == 48) && j < 100) b = 32;
    c=(((j/10)%10) + 48); if ((c == 48) && j < 10) c = 32;
    d=((j%10) + 48);
    strcpy(&buffer1[0], (char *)&a);  log_printf(LOG_NOISY_DEBUG, "LCD_select_album: buffer1= %s.\n", &buffer1[0]);
    strcpy(&buffer1[1], (char *)&b);  log_printf(LOG_NOISY_DEBUG, "LCD_select_album: buffer1= %s.\n", &buffer1[1]);
    strcpy(&buffer1[2], (char *)&c);  log_printf(LOG_NOISY_DEBUG, "LCD_select_album: buffer1= %s.\n", &buffer1[2]);
    strcpy(&buffer1[3], (char *)&d);  log_printf(LOG_NOISY_DEBUG, "LCD_select_album: buffer1= %s.\n", &buffer1[3]);
    log_printf(LOG_NOISY_DEBUG, "LCD_select_album: buffer1= %s.\n", &buffer1);
    tty_write((char *)&temp, &buffer1);
    line_offset[counter] = menu_scroll_text((char *)&temp, new_album_list[counter + start_line].album, line_offset[counter]);
  }
  menu_option = wgetch(stdscr);

  switch(menu_option)
  {
    case '0':
      done = TRUE;
      wtimeout(stdscr, 2);
      break;
    case '2':
      if (start_line < number_of_albums)
      {
        for (i=0; i<=7; i++)
           line_offset[i] = 0;
        start_line++;
        wtimeout(stdscr, 2000);
      }
      break;
    case '3':
      if (start_line <= (number_of_albums -8))
      {
        for (i=0; i<=7; i++)
           line_offset[i] = 0;
        start_line = start_line+8;
        wtimeout(stdscr, 2000);
      }
      break;
    case '8':
      if (start_line > 0)
      {
        for (i=0; i<=7; i++)
           line_offset[i] = 0;
        start_line--;
        wtimeout(stdscr, 2000);
      }
      break;
    case '9':
      if (start_line >= 8)
      {
        for (i=0; i<=7; i++)
           line_offset[i] = 0;
        start_line = start_line - 8;
        wtimeout(stdscr, 2000);
      }
      break;
    default:
      wtimeout(stdscr, 750);
      break;
    }
  }
  wtimeout(stdscr, 2);
}
*/
int menu_scroll_text(char *line, char data[30], int offset)
{
  char LCD_buffer[10], buffer[30];
  int temp, offset_counter;

  for (temp=0; temp<=10; temp++) LCD_buffer[temp]=NULL;
  for (temp=0; temp<=30; temp++) buffer[temp]=NULL;
  tty_offset_write(line, "           ");
  strcpy(buffer, data);
  offset_counter = 0;
  for (temp = 0; temp <= 9; temp++)
  {
    if ((offset + temp) < strlen(data))
      LCD_buffer[temp] = buffer[offset + temp];
    else if ((offset + temp) < (strlen(data) +3))
    {
      LCD_buffer[temp] = '.';
    }
    else
    {
      LCD_buffer[temp] = buffer[offset_counter];
      log_printf(LOG_NOISY_DEBUG, "full_scroll_text: offset_counter = %i\n", offset_counter);
      log_printf(LOG_NOISY_DEBUG, "full_scroll_text: added text: %c (LCD_buffer length = %i)\n", buffer[offset_counter], strlen(LCD_buffer));
      offset_counter++;
    }
  }
  log_printf(LOG_NOISY_DEBUG, "scroll text : %s\n", LCD_buffer);
  log_printf(LOG_NOISY_DEBUG, "size of data string : %i\n", strlen(data));
  tty_offset_write(line, LCD_buffer);
  if (offset <= strlen(buffer))
    offset++;
  else
    offset = 0;

  return offset;
}

int full_scroll_text(char *line, char data[30], int offset)
{
  char LCD_buffer[15], buffer[30];
  int temp, offset_counter;

log_printf( LOG_NOISY_DEBUG, "In full scroll text\n");

//  for (temp=0; temp<=15; temp++) LCD_buffer[temp]=(int)NULL;
log_printf( LOG_NOISY_DEBUG, "Finished blanking LCD_buffer\n");
  for (temp=0; temp<=30; temp++) buffer[temp]=(int)NULL;
log_printf( LOG_NOISY_DEBUG, "Finished blanking buffer\n");

log_printf( LOG_NOISY_DEBUG, "writing blank line\n");

  tty_write(line, "                ");
  strcpy(buffer, data);
  offset_counter = 0;
log_printf( LOG_NOISY_DEBUG, "starting loop to print \"%s\"\n", data);

  for (temp = 0; temp <= 14; temp++)
  {
    if ((offset + temp) < strlen(data))
      LCD_buffer[temp] = buffer[offset + temp];
    else if ((offset + temp) < (strlen(data) +3))
    {
      LCD_buffer[temp] = '.';
    }
    else
    {
      LCD_buffer[temp] = buffer[offset_counter];
      log_printf(LOG_NOISY_DEBUG, "full_scroll_text: offset_counter = %i\n", offset_counter);
      log_printf(LOG_NOISY_DEBUG, "full_scroll_text: added text: %c (LCD_buffer length = %i)\n", buffer[offset_counter], strlen(LCD_buffer));
      offset_counter++;
    }
  }
  log_printf(LOG_NOISY_DEBUG, "scroll text : %s\n", LCD_buffer);
  log_printf(LOG_NOISY_DEBUG, "size of data string : %i\n", strlen(data));
  tty_write(line, LCD_buffer);
  if (offset <= strlen(buffer))
    offset++;
  else
    offset = 0;

  return offset;
}