/***************************************************************************
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;
}