Subversion Repositories Projects

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*****************************************************************************
 *   Copyright (C) 2009-2010 Peter "woggle" Mack, mac@denich.net             *
 *                                                                           *
 *   see this fine thread on RCLine:                                         *
 *   http://www.rclineforum.de/forum/thread.php?threadid=226786              *
 *                                                                           *
 *   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.          *
 *                                                                           *
 *   This program 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 General Public License for more details.                            *
 *                                                                           *
 *   You should have received a copy of the GNU General Public License       *
 *   along with this program; if not, write to the                           *
 *   Free Software Foundation, Inc.,                                         *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.               *
 *                                                                           *
 *****************************************************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

#include "main.h"               // LEDs
#include "timer.h"      // Keys
#include "lcd.h"
#include "jeti.h"

#define font8x8

uint8_t JetiBuffer[32]; // 32 characters
volatile uint8_t JetiBufferReady;


//*****************************************************************************
//
ISR (USART1_RX_vect)
{
        uint8_t stat;
        uint8_t rh;
        uint8_t rl;
        static uint8_t jbp;
       
        stat = UCSR1A;
        rh = UCSR1B;
        rl = UDR1;
       
        if (stat & ((1 << FE1) | (1 << DOR1) | (1 << UPE1)))
        {       // discard buffer and start new on any error
                JetiBufferReady = 0;
                jbp = 0;
                                                                                                                  //1234567890123456
                lcd_printpj_at (0, 3, PSTR(" Communication  "), 0);
                lcd_printpj_at (0, 4, PSTR("    Error       "), 0);
                LED6_TOGGLE;
        }
        else if ((rh & (1 << RXB81)) == 0)
        {       // control
                if (rl == 0xfe)
                {       // start condition
                        JetiBufferReady = 0;
                        jbp = 0;
                        LED1_ON;
                }
                else if (rl == 0xff)
                {       // stop condition
                        JetiBufferReady = 1;
                        LED1_OFF;
                }
        }
        else
        {       // data
                if (jbp < 32)
                {
                        JetiBuffer[jbp++] = rl;
                }
        }
}

//*****************************************************************************
//
void JETI_Init (void)
{
        DDRD  &= ~(1 << DDD3);          // set TXD1 pin as input
        PORTD &= ~(1 << PORTD3);        // disable pullup on TXD1 pin
       
        // set clock divider
#undef BAUD
#define BAUD 9600
#include <util/setbaud.h>
        UBRR1H = UBRRH_VALUE;
        UBRR1L = UBRRL_VALUE;
       
#if USE_2X
        UCSR1A |= (1 << U2X1);  // enable double speed operation
#else
        UCSR1A &= ~(1 << U2X1); // disable double speed operation
#endif
       
        // set 9O1
        UCSR1C = (1 << UPM11) | (1 << UPM10) | (1 << UCSZ11) | (1 << UCSZ10);
        UCSR1B = (1 << UCSZ12);
       
        // flush receive buffer
        while ( UCSR1A & (1 << RXC1) ) UDR1;
}

//*****************************************************************************
// disable the txd pin of usart
void JETI_DisableTXD (void)
{
        UCSR1B &= ~(1 << TXEN1);        // disable TX}
}

//*****************************************************************************
// enable the txd pin of usart
void JETI_EnableTXD (void)
{
        UCSR1B |=  (1 << TXEN1);        // enable TX
}


//*****************************************************************************
//
void JETI_putw (uint16_t c)
{
        loop_until_bit_is_set(UCSR1A, UDRE1);
        UCSR1B &= ~(1 << TXB81);
        if (c & 0x0100)
        {
                UCSR1B |= (1 << TXB81);
        }
        UDR1 = c;
}

//*****************************************************************************
//
void JETI_putc (uint8_t c)
{
        loop_until_bit_is_set(UCSR1A, UDRE1);
        //      UCSRB &= ~(1 << TXB8);
        UCSR1B |= (1 << TXB81);
        UDR1 = c;
}

//*****************************************************************************
//
void JETI_puts (char *s)
{
        while (*s)
        {
                JETI_putc (*s);
                s++;
        }
}

//*****************************************************************************
//
void JETI_puts_p (const char *s)
{
        while (pgm_read_byte(s))
        {
                JETI_putc (pgm_read_byte(s));
                s++;
        }
}

//*****************************************************************************
//
void JETI_put_start (void)
{
        loop_until_bit_is_set(UCSR1A, UDRE1);
        UCSR1B &= ~(1 << TXB81);
        UDR1 = 0xFE;
}

//*****************************************************************************
//
void JETI_put_stop (void)
{
        loop_until_bit_is_set(UCSR1A, UDRE1);
        UCSR1B &= ~(1 << TXB81);
        UDR1 = 0xFF;
}

//*****************************************************************************
//
void jeti (void)
{
        uint8_t key;
        uint8_t i;

        // enable Rx
        UCSR1B |= (1 << RXEN1);
        UCSR1B |= (1 << RXCIE1);
       
        lcd_cls ();
        lcd_printp_at (0, 0, PSTR("Jeti Box Display"), 0);
        lcd_printpns_at (0, 7, PSTR(" \x1a    \x1b      \x1c     \x1d"), 0);
       
#ifdef font8x8
        lcd_line(0, 21, 127, 21, 1);
        lcd_line(0, 22, 127, 22, 1);
        lcd_line(0, 40, 127, 40, 1);
        lcd_line(0, 41, 127, 41, 1);
#else
        lcd_rect(10, 22, 98, 18, 1);
#endif
       
        do
        {
                if (JetiBufferReady)
                {
                        JETI_EnableTXD();
                        LED2_ON;
                        for (i = 0; i < 16; i++)
                        {
#ifdef font8x8
                                lcd_putc_jeti(i, 3, JetiBuffer[i], 0);
#else
                                lcd_putc (2 + i, 3, JetiBuffer[i], 0);
#endif
                        }
                        for (i = 0; i < 16; i++)
                        {
#ifdef font8x8
                                lcd_putc_jeti(i, 4, JetiBuffer[i + 16], 0);
#else
                                lcd_putc (2 + i, 4, JetiBuffer[i + 16], 0);
#endif
                        }
                        JetiBufferReady = 0;    // invalidate buffer
                        LED2_OFF;
                       
                        _delay_ms (1);  //
                                                                                                // Writing to the display takes aprox. 5.8 ms @ 7 MHz and 3.2 ms @ 20 MHz.
                                                                                                // With the additional 4 ms we had a 10 ms delay.
                                                                                                // 10 ms works perfect with the MUI30 and the MT125
                                                                                                // But not with the TU transceiver module.
                       
                        key = get_key_short ((1 << KEY_MINUS) | (1 << KEY_PLUS) | (1 << KEY_ESC) | (1 << KEY_ENTER));
                        key = (key << 1) | (key >> 3);
                        key = (~key) & 0xf0;
                       
                        JETI_putw((uint16_t) key);
                        _delay_ms (1);
                        JETI_DisableTXD();
                }
        }
        while (!get_key_long (1 << KEY_ESC));
        get_key_press(KEY_ALL);

        // disable Rx
        UCSR1B &= ~(1 << RXCIE1);
        UCSR1B &= ~(1 << RXEN1);
}