/*------------ 1/2 Szitkovits Gábor -- LCD Menü --- Szétdarabolva menu.h menu.c --------------------
-------------- Az Lcd vezérlés nem az enyém ! ------------------------------------------------------
-- Proci = G2352 ami nem a végleges !!! A végleges G2xx3 lesz. -------------------------------------
---------- A stop feliratnál hang kiadás ---- Volt mérő ------------------------------------------*/

#include "io430.h"
#include "lcd4x16.h"
#include "menu.h"
#include "stdint.h"
#include "intrinsics.h"

const unsigned char akf[] ={" Akku  lemerült  "};
const unsigned char cpuh[] ={"CPU hőfok: "};

const unsigned char *betu;
unsigned int akku, fesz, cfok, ref = 343, oszto = 413;   // ref = vcc / 1023 = 3.3v = 322, 3.5 = 343
long fesz_sz, hoertek;
    int sz=0;
// ------------------------- Delay millisec-ben -----------------------------------------------------
void delay_ms(volatile unsigned int t){       // A "t" értéke határozza meg a kéleltetés idejét
  unsigned int i;                             // "i" változó deklarálása
  for(i=0; i<t; i++){                         // "for" ciklus, ahol 1: i=0, 2: i vizsgálata 3: i=i+1
    __delay_cycles(1000);                     // 1000 uS = 1 mS
  }                           // for ciklus
}                             // void delay_ms
//------------------------- Hang előállítás --------------------------------------------------------
void hang(){                                // hang előállítása
  int h;                                    // h deklarálása 
  for (h=0; h<2200; h++){                   // szoftveres pwm, for ciklussal
    P2OUT |= BIT3;                          // Port magas
    __delay_cycles(130);                    // 130us-ig magas
    P2OUT &= ~BIT3;                         // Port alacsony
    __delay_cycles(130);                    // 130us-ig alacsony
  }             // for ciklus vége
}               // void vége
//------------------------- Hőmérő setup -----------------------------------------------------------
void homero_setup(void){
  ADC10CTL1 = INCH_10 + ADC10DIV_3;         // Temp Sensor ADC10CLK/4
  ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;
  __enable_interrupt();                     // Enable interrupts.
}
//------------------------- Hőmérő -----------------------------------------------------------------
void homero(void){
//  if(sz==20){
  ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  __low_power_mode_0();                                // LPM0 mód bekapcsolás
  hoertek = ADC10MEM;
//        cfok = ((hoertek - 673) * 423) / 1024;
 //     sor(1);
 //     betu = cpuh;                  // az "betu" mutatóba, a CPU hőfok szöveg
 //     while(*betu){                // mutató ciklus
//        lcd_putc(*betu++);         // első betü kiírása
 //       if(!*betu);                // ha vége a szövegnek, kilép a ciklusból
 //     }
 //     lcd_ertek(cfok);             // hőfok kiírása
 //     sz=0;
 // }
 // sz++;
}
//------------------------- Analóg Digitál konverter -----------------------------------------------
void adc(void){
  ADC10CTL1 = INCH_6 + ADC10SSEL_3 + ADC10DIV_3 ;         // A5 bemmenet, ADC óra osztó /4
  ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10ON + ADC10IE;
//-- Vcc & Vss a referencia, ADC10 bekapcsolása és megszakítás engedélyezése --
  ADC10AE0 |= BIT6;                                    //P1.5 Analog bemenet engedélyezése
  ADC10CTL0 |= ENC + ADC10SC;                          // Mintavétel és átalakítás ind
  __low_power_mode_0();                                // LPM0 mód bekapcsolás
  delay_ms(5);
  akku = ADC10MEM;                                     // Ad konverzió étréke az ertek-be
}
//------------------------- Program ----------------------------------------------------------------
void main(void){

  WDTCTL = WDTPW + WDTHOLD;     // Watchdog tiltás
  BCSCTL1 = CALBC1_1MHZ;        // A gyárilag kalibrált 1 MHz
  DCOCTL = CALDCO_1MHZ;         // DCO frekvencia beállítása
//------------------------- Port beállítások -------------------------------------------------------
  P1DIR = 0x4F;                       // P1.0-P1.3 + P1.6 kimenet
  P1OUT = 0x00;                       // P1 port alacsony
  P1DIR &= ~(BIT4 + BIT5 + BIT7);     // P1.4 P1.5 P1.7 bemenetek (ideiglenes)
  P1SEL |= BIT6;
  P2DIR &= ~BIT0;                     // P2.0 bemenet
  P2IES |= BIT0;                      // P2.2 lefutó él
  P2IFG &= ~BIT0;                     // flag törlése
  P2IE |= BIT0;                       // megszakítás engedélyezése
  P2DIR |= (BIT1 + BIT3);             // P2.1 kimenet
  P2OUT &= ~(BIT1 + BIT3);            // P2.1 alacsony, itt van a led ami a végtelen ciklusban vill
  /*---------------- További portbeállítások: ------------------------------------------------------
  - SPI vagy I2C portok, de valószínübb az I2C (kevesebb porthasználat)
  - Analog port az akksi figyeléshez (hardver kész, szoftver kidolgozás alatt /matek/ )
  - H-híd hőmérséklet figyelés (hardver 1/2 kész, szoftver sehol)
  - A STOP gomb (jelen esetben P2.0) több funkciós: 1: STOP 2: H-híd áramfelvétel figyelés 
  (hardver kiépítve, szoftver kész). A STOP felirat villogása alatt, valami hangot kéne generálni !!
  - További ötletek, a portok fügvényében lesznek.                                                */  
  __enable_interrupt();               // megszakítás engedélyezése
//------------------------- Lcd beállítások -------------------------------------------------------- 
  lcdinit();                          // Lcd inicializálás
  lcd_cgram_init();                   // Ékezetek definiálása
  logo();                             // Logó kiírása
  menu_1();                           // Főmenü indítása
  homero_setup();                              // analóg átalakító betöltése
//-------------------------- Végtelen ciklus -------------------------------------------------------
    while(1){
 /*     adc();                              // analóg átalakító betöltése
      fesz_sz = (long)akku * ref;
      fesz_sz *= oszto;
      fesz_sz /= 100000;
      fesz = fesz_sz;
      akku_fesz();
      if(fesz < 1000){
        char i;
        for(i=0; i<5; i++){
          sor(4);
          betu = akf;                  // az "ekbetu" mutatóba, az akku fesz szöveg
          while(*betu){                // mutató ciklus
            lcd_putc(*betu++);         // első betü kiírása
            if(!*betu);                // ha vége a szövegnek, kilép a ciklusból
          }
          hang();
          delay_ms(100);
          sor(4);
          print("                ");
          delay_ms(200);
        }
      }*/

      homero();
      cfok = ((hoertek - 673) * 423) / 1024;
      sor(1);
      betu = cpuh;                  // az "betu" mutatóba, a CPU hőfok szöveg
      while(*betu){                // mutató ciklus
        lcd_putc(*betu++);         // első betü kiírása
        if(!*betu);                // ha vége a szövegnek, kilép a ciklusból
      }
      lcd_ertek(cfok);             // hőfok kiírása
      P2OUT |= BIT1;
      delay_ms(500);
      P2OUT &= ~BIT1;
      delay_ms(500);  
  }                                       // While
}                                         // Main
//-------------------------- Port 2 megszakítás ----------------------------------------------------
#pragma vector=PORT2_VECTOR
__interrupt void Port(void) {
  char ujra=5;                   // ciklus változó feltöltése
  while(ujra){                    // ciklus
    lcdclear();                   // lcd törlése
    hang();                       // hangjelzés
    delay_ms(500);                // várakozás 500 ms
    sor(2);                       // lcd 2. sor
    print("    S T O P !   ");    // szöveg kiírása
    delay_ms(500);                // várakozás
    ujra--;                       // ciklus futási idejének csökkentése
  }
  WDTCTL &= ~WDTHOLD;          // Watchdog engedélyezése
  WDTCTL = WDT_MDLY_0_5;       // Reset 0.5 ms mulva
//  P2IFG &= ~BIT2;            // P2.2 megszakítás flag törlése    Ez itt HÜLYESÉG !!!!!!
//  __delay_cycles(500);         // És ez is !!!! De elférnek.
}
//---------------------- ADC10 megszakítás-------------------------------------
#pragma vector=ADC10_VECTOR
__interrupt void ADC10(void){
  delay_ms(2);
  __low_power_mode_off_on_exit();        // Ébresztő
}
//---------------------- TA megszakítás ------------------------------------------------------------

/* -----------    H U R R Á   M Ű K Ö D I K   !!!!!!!!!! Szeretem a felkiáltójeleket -------------*/