#include  "msp430g2211.h"

#define     RING1                 BIT0
#define     RING2                 BIT4
#define     RING3                 BIT6
 
#define     BUTTON                BIT3
#define     RESETB                BIT7

#define     TIMER_PWM_MODE        0
#define     TIMER_PWM_PERIOD      2000  
#define     TIMER_PWM_OFFSET      20

#define     SBUTTON 			  1
#define     RBUTTON               2

/* Tastenspeicher */
unsigned int ActRing;
unsigned int LastRing;
unsigned int PressedButton;
unsigned int timerCount = 0;


void InitializeClocks(void);
void InitializeRing(void);
void InitializeButton(void);
unsigned int ChangeRing(unsigned int);


void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;
	InitializeClocks();
	InitializeButton();
	InitializeRing();
    
    ActRing = RING1;
    LastRing = 0;

	CCTL0 = CCIE;
	TACTL = TASSEL_2 + MC_2;
    
    __enable_interrupt();
    
    while(1)
    {
    	switch (PressedButton) {
			case SBUTTON:
				if (LastRing == 0)
				{
					LastRing = ActRing;
					P1OUT |= LastRing;
				}
				PressedButton = 0;
				break;
			case RBUTTON:
				P1OUT &= ~LastRing;
				LastRing = 0;
				PressedButton = 0;
				break;
			default:
		    	ActRing = ChangeRing(ActRing);
				break;
		}
    } 
}

unsigned int ChangeRing(unsigned int actRing)
{
    	switch (actRing) {
		case RING1:
			actRing = RING2;
			break;
		case RING2:
			actRing = RING3;
			break;
		case RING3:
			actRing = RING1;
			break;
		default:
			break;
	}
	return actRing;
}

void InitializeClocks(void)
{

  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;
  BCSCTL2 &= ~(DIVS_3);                     // SMCLK = DCO / 8 = 1MHz  
}

void InitializeRing(void)
{
  P1DIR |= RING1 + RING2 + RING3;                          
  P1OUT &= ~(RING1 + RING2 + RING3);  
}

void InitializeButton(void)
{
  P1DIR &= ~(BUTTON + RESETB);
  P1OUT |= (BUTTON + RESETB);
  P1REN |= (BUTTON + RESETB);
  P1IES |= (BUTTON + RESETB);
  P1IFG &= ~(BUTTON + RESETB);
  P1IE |= (BUTTON + RESETB);
}

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{   
	if ((P1IFG & BUTTON) == BUTTON)
	{
		P1IFG &= ~BUTTON;       
		PressedButton = SBUTTON;
	}
	if ((P1IFG & RESETB) == RESETB)
	{
		P1IFG &= ~RESETB;       
		PressedButton = RBUTTON;
	}
    P1IFG = 0x00;
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
	timerCount = (timerCount + 1) % 8;
	if(timerCount ==0)
	P1OUT ^= RING2;
}


