/*
 * ======== Standard MSP430 includes ========
 */
#include <msp430.h>
#include "one_wire.h"

volatile unsigned int status;

void main(void) {
	status = 0;
	long i = 0;
	long j = 0;
	long v = 20000;
	double h = -99.0;
	unsigned char b[9];
	
	WDTCTL = WDTPW + WDTHOLD; // WDT kikapcsolása
	BCSCTL3 = LFXT1S_2; // ACLK forrása legyen VLO
	IFG1 &= ~OFIFG; // Az "oszcillátor hiba" jelzőbit törlése
	DCOCTL = CALDCO_1MHZ;
	BCSCTL1 = CALBC1_1MHZ;
	BCSCTL2 = SELM_0 + // MCLK forrása: DCO
			  DIVM_0 + // MCLK osztója: 1
			  DIVS_0; // SMCLK osztója: 1

	P1SEL = 0; // P1 és P2 legyen digitális IO
	P2SEL = 0;
	P1REN = 0; // P1 ellenállások kikapcsolása
	P1OUT = P2OUT = 0; // kimenetek 0-ázása
	P1DIR = BIT5 + BIT4 + BIT2 + BIT1 + BIT0; // P1.7, P1.6, P1.3 bemenet, többi kimenet
	P2DIR = 0xFF; // P2 kimenet
	
	P1IES &= ~BIT3; // Felfutó élre
	P1IFG &= ~BIT3; // P1.3 interrupt flag törlése		
	P1IE |= BIT3; // Megszakítás engedélyezése P1.3-on
	__enable_interrupt(); // Set global interrupt enable, __low_power_mode_4() esetén nem kell

	one_wire_setup(&P1DIR, &P1IN, BIT7, 1); // P1.7
	P1OUT |= BIT0; // P1.0 (Piros LED) be
	
	while (1) {
		// Piros LED villogtatása; 25e
		if (i == v) {
			i = 0;
			P1OUT ^= BIT0;
			if (v == 20000) {
				v = 500000;
			} else {
				v = 20000;
			}
		}
		i++; j++;

		// 1-wire műveletek
		if (status == 0) {
			if (owex(0, 0)) {
				// van slave eszköz
	    		P1OUT |= BIT6;
				P1DIR |= BIT6;
				// skip rom command
				//owex(0xCC, 8);
				//owex(0, 0); // Reset pulse
				owex(0x44CC, 16); // start conver T
				//P1DIR &= ~BIT7;
	    		status = 1;
	    		j = 0;
			} else {
				// nincs slave eszköz
				//P1DIR |= BIT6;
	    		//P1OUT |= BIT6;
			}
		} else if ((status == 1) && (j == 500000)) { // j == 750000
			// hőmérséklet mérés vége
			owex(0, 0); // Reset pulse
			owex(0xBECC, 16); // Read Scratchpad
			read_block(b, 9);
			h = b[0] >> 1; // /2
			if (b[1] != 0) h *= -1;
			status = 2;
		}		
	} // while
} // main

// S2 kezelése megszakításból
#pragma vector=PORT1_VECTOR
__interrupt void p1_isr(void) {
	status = 0;
	P1IFG &= ~BIT3; // Megszakítás jelzőbit törlése
}
