/* ATB_Menue_1.c Created: 13.03.2016 11:35:08 Author : AS */ 

// ori Teile P30 und P64 und D2 + NT

// P64 Tastenboard Belegung Buchsenleiste
// Pin 1-frei	Pin 2-Servo	Pin 3-LED
// Pin 4-T1		Pin 5-T2	Pin 6-T3
// Pin 7-T4		Pin 8-T5

// P30 Board 1 Prozessor Port A-Buchsenleiste
// PA 0-Pin 1-frei	PA 1-Pin 2-Servo
// PA 2-Pin 3-LED	PA 3-Pin 4-T1
// PA 4-Pin 5-T2	PA 5-Pin 6-T3
// PA 6-Pin 7-T4	PA 7-Pin 8-T5
// T1-hoch, T3-enter, T4-zurück, T7-runter

#include <avr/io.h>      // Einbindung Datein
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "main.h"
#include "i2clcd.h"
#include "i2cmaster.h"
#include <stdlib.h>
#include <util/delay.h>

#define PCF8591w   0x90
#define PCF8591r   0x91

volatile int16_t led1=0;
volatile int8_t lauf=0;
volatile int8_t zeile=2;
volatile int8_t menue=0;
volatile int8_t wahl=0;
char Buffer[20];
///////////////////////////////////////////////////////
volatile int8_t wait;
volatile uint8_t key_state;
volatile uint8_t key_press;
volatile uint8_t key_rpt;
//////////////////////////////////////////////////////
#define KEY_DDR    DDRA                         // Datenrichtung A
#define KEY_PORT   PORTA                        // Angabe Port A
#define KEY_PIN    PINA                         // Angabe PIN A
#define KEY_1       3                           // PA 3
#define KEY_2       5                           // PA 5
#define KEY_3       7                           // PA 7
#define KEY_4       6                           // PA 6
#define ALL_KEYS (1<<KEY_1|1<<KEY_2|1<<KEY_3|1<<KEY_4)
#define REPEAT_MASK (1<<KEY_1|1<<KEY_2|1<<KEY_3)
#define REPEAT_START 50                          // after 500ms
#define REPEAT_NEXT 10                           // every 200ms
///////////////////////////////////////////////////
void startanzeige()            // Titelbild
  {
	lcd_command(LCD_CLEAR);
	_delay_ms(2);
	lcd_printlc(1,3,"Menue 1-I2C");
	lcd_printlc(2,2,"P30 + P64 + D2");
	lcd_printlc(3,1,"AT1284 und LCD");
	lcd_printlc(4,4,"bei achim S");
  }
void bedienung()            // Titelbild
  {
	lcd_command(LCD_CLEAR);
	_delay_ms(2);
	lcd_printlc(1,3,"Bedienung:");
	lcd_printlc(2,1,"T1 Hoch");
	lcd_printlc(3,1,"T1/4 Enter Menue");
	lcd_printlc(4,1,"T5 Runter");	
  }
//////////////////////////////////////////////////
ISR (TIMER0_COMPA_vect)                // wait1=1ms,
  {
	static uint8_t ct0=0xFF, ct1=0xFF, rpt;
	uint8_t i;
	if(wait<=9)                                // bei 9 sind es 10ms
	  {
		wait++;
	  }                      // erhöht
	else                    // wenn dann ...
	  {
		wait=0;                  // setzt wait auf 0
		i=key_state ^~KEY_PIN;
		ct0=~(ct0&i);
		ct1=ct0^(ct1&i);
		i&=ct0&ct1;
		key_state^=i;
		key_press|=key_state&i;
		if((key_state & REPEAT_MASK)==0)
		rpt=REPEAT_START;
		if(--rpt==0)
		  {
			rpt=REPEAT_NEXT;
			key_rpt|=key_state & REPEAT_MASK;
		  }
	  }
  }
//////////////////////////////////////////////////////
uint8_t get_key_press(uint8_t key_mask)
  {
	cli();
	key_mask &=key_press;
	key_press^=key_mask;
	sei();
	return key_mask;
  }
/////////////////////////////////////////
uint8_t get_key_rpt(uint8_t key_mask)
  {
	cli();
	key_mask &=key_rpt;
	key_rpt^=key_mask;
	sei();
	return key_mask;
  }
///////////////////////////////////////////////////////
uint8_t get_key_short(uint8_t key_mask)
  {
	return get_key_press(~key_state & key_mask);
  }
///////////////////////////////////////////////////////
uint8_t get_key_long(uint8_t key_mask)
  {
	return get_key_press(get_key_rpt(key_mask));
  }
//////////////////////////////////////////////////////
void led_blinken1()
  {
	led1++;
	if(led1==500)
	  {
		PORTA &= ~(1<<PA2);        // Schaltet Pin
	  }
	else
	  {
		if(led1==1000)
		  {
			PORTA |= (1<<PA2);      // Schaltet Pin
			led1=0;
		  }
	  }
  }
/////////////////////////////////////////////////////
void timer_init()
  {									// Timer 0 konfigurieren
	TCCR0A = (1<<WGM01);            // CTC Modus
	TCCR0B = (1<<CS01)|(1<<CS00);	// Prescaler 64
	OCR0A=249;
	TIMSK0|=(1<<OCIE0A);            // Interrupt erlauben
  }
//////////////////////////////////////////////
void menue1()            // Titelbild
  {
	lcd_command(LCD_CLEAR);
	_delay_ms(2);	
    lcd_printlc(1,2,"Menue 1-xxx");
  }
//////////////////////////////////////////////
void menue2()            // 
  {
	lcd_command(LCD_CLEAR);
	_delay_ms(2);
	lcd_printlc(1,2,"Menue 2-xxx");
  }
///////////////////////////////////////////////
void menue3()            // 
  {
	lcd_command(LCD_CLEAR);
	_delay_ms(2);
	lcd_printlc(1,2,"Menue 3-xxx");
  }
//////////////////////////////////////////////////
void anzeige1()            // 
  {
    lauf++;
    if(lauf==100)
      {	
	    lcd_printlc(1,2,"Menue A - I2C");
	    lcd_printlc(2,4,"Zeile 1");
	    lcd_printlc(3,4,"Zeile 2");
	    lcd_printlc(4,4,"Zeile 3");	
	    lcd_printlc(2,1,"  ");
	    lcd_printlc(3,1,"  ");
	    lcd_printlc(4,1,"  ");
 	    lcd_printlc(zeile,1,">>");
	    lauf=0;
      }
  }
///////////////////////////////////////////////////////////
void tasten()
  {
    if(get_key_press(1<<KEY_3)||get_key_rpt(1<<KEY_3))
      {
	    zeile++;
	    if (zeile>4)
	      {
		    zeile=2;
	        }
      }
	if(get_key_press(1<<KEY_1)||get_key_rpt(1<<KEY_1))
	  {
		zeile--;
		if (zeile<2)
		  {
			zeile=4;
		  }
	  }
	if(get_key_press(1<<KEY_2)||get_key_rpt(1<<KEY_2))
	  {
		if (zeile==2)
		  {
			menue=1;
		  }
		if (zeile==3)
		  {
			menue=2;
		  }
		
		if (zeile==4)
		  {
			menue=3;
		  }		  
	   }
  }
/////////////////////////////////////////////////////////////////////
int main(void)
  {
	timer_init();
	DDRA=0b00000100;              // Port A 1x auf Ausgang schalten
	DDRC=0b01100000;              // Port C 2x auf Ausgang schalten
	KEY_DDR&=~ALL_KEYS;
	KEY_PORT|=ALL_KEYS;
	PORTC |= (1<<PC5);              // Port A beim einschalten Ausgänge aus
	PORTC |= (1<<PC6);
	i2c_init();                          // Starte I2C Bus
	lcd_init();                          // Starte I2CLCD
	lcd_light(0);                // 0=Licht an, 1=Licht aus
	// Display Befehle
	lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
	// Display ON/OFF / Cursor ON/OFF / Blinken ON/OFF
	
	startanzeige();
	_delay_ms(3000);
	
	bedienung();
	_delay_ms(3000);
	
	lcd_command(LCD_CLEAR);            // Leere Display
	_delay_ms(2);              // warte 2ms
	sei();
	while(1)              // Programmschleife
	  {
	    led_blinken1();        // Aufruf Unterprogramm	  
		if(get_key_press(1<<KEY_4))
		  {
			  wahl=0;
		  }
		if (wahl==0)
		  {
			anzeige1();
		  }
		tasten();
		if (menue==1)
		  {
			menue1();
		    wahl=1;
		  }
		if (menue==2)
		  {
			menue2();
		    wahl=1;
		  }
		if (menue==3)
		  {
			menue3();
		    wahl=1;
		  }
			menue=0;
			_delay_ms(1);
		}
	return 0;
  }
