zavrsni ricci

Dependencies:   mbed

main.cpp

Committer:
marcoricci
Date:
2018-11-09
Revision:
0:427833cc260e

File content as of revision 0:427833cc260e:

//Reads input through the ADC, and transfers to PC terminal
#include "mbed.h"
#include "types.h"
#include "memoria.h"
#include "Keyb2.h"

// * -------------------------------------------- *
// * assign HW                                    *
// * -------------------------------------------- *  
BusOut Seg1( p5, p6, p7, p8, p9,p10,p11);   // ABCDEFG
BusOut Seg2(p12,p13,p14,p15,p16,p17,p18);   // ABCDEFG
BusOut Seg3(p24,p25,p26,p27,p28,p29,p30);   // ABCDEFG
DigitalOut DG (p19);                        // segment A 
PwmOut buzzer(p21);
DigitalOut led1(LED1);          // digital out to p5 
DigitalOut led2(LED2);          // digital out to p5 
DigitalOut led3(LED3);          // digital out to p5 
DigitalOut led4(LED4);          // digital out to p5 
InterruptIn buttonSEL(p22);     // Interrupt on digital pushbutton
InterruptIn buttonOK(p23);      // Interrupt on digital pushbutton 
Timer debounceSEL;              // define debounce timer
Timer debounceOK;               // define debounce timer
Timer TimVis;                   // time to visual
Timer StartUP;                  // counter up
Timer StartDW;                  // counter DW
AnalogIn Ain(p20);

// * -------------------------------------------- *
// * declare prototypes                           *
// * -------------------------------------------- *  
void Voltmetro (void);
void CounterUP (void);
void CounterDW (void);
void Visual7(int counter);
int SetCounterDW (int countrDW);
void CounterDWend(void);
void Menu1(void);
void Menu2(void);
void Menu3(void);
void BuzzerSEL (void);
void BuzzerOK (void);



int main() 
{

    // * -------------------------------------------- *
    // * init HW                                      *
    // * -------------------------------------------- *  
    debounceOK.start();
    buttonOK.rise(&KeybOk); // attach the address of the toggle
    buttonOK.mode(PullUp);
    debounceSEL.start();
    buttonSEL.rise(&KeybSEL); // attach the address of the toggle
    buttonSEL.mode(PullUp);
    TimVis.start();
    StartUP.start();
    StartDW.start();
    ExKeyPress = KEYNULL;
    KeyPress = KEYNULL;
    Level = LEVEL1;
    stateMbd = ST_INIT;

     do 
     { // infinite loop
    
        // * -------------------------------------------- *
        // * state mbed                                   *
        // * -------------------------------------------- *    
        if  (TimVis.read_ms() >= 200)
        {    
            TimVis.reset(); // restart timer           

            switch (stateMbd) { 
            case ST_INIT: 
                stateMbd = ST_M1;
                break;
            case ST_M1:
                Menu1();
                break;
            case ST_M2:
                Menu2();
                break;
           case ST_M3:
                Menu3();
                break;
            }
        }
    
        // * -------------------------------------------- *
        // * read keyboard  --> move to state machine     *
        // * -------------------------------------------- *     
        if (Keyboard() != KEYNULL) {  
        
            switch (KeyPress) {
            case KEYSEL:
                if (Level == LEVEL1) {
                    if (stateMbd < (ST_MMAX-1)) stateMbd++;
                    else  stateMbd = (ST_INIT+1);
                }
                break;
            case KEYOK:
                if (Level < LEVEL6) Level++; else Level = LEVEL1;
                break;
            }         
        }  
    } 
    while (1);

}



// * --------------------------------------------------- *
// * Menu                                                *
// * --------------------------------------------------- *
void Menu1(void)
{
    switch (Level) {                        
    case LEVEL1:                            
        Seg1 = tabFunc[0U];
        DG = 0u;
        Seg2 = tabSeg[0U];
        Seg3 = tabSeg[1U];
        break;
    case LEVEL2:
        Voltmetro();
        break;  
     case LEVEL3:
        Level = LEVEL1;
        break;  
    }
}

void Menu2(void)
{
    switch (Level) {                        
    case LEVEL1:                            
        Seg1 = tabFunc[0U];
        DG = 0u;
        Seg2 = tabSeg[0U];
        Seg3 = tabSeg[2U]; 
        break;
    case LEVEL2:  
        DG = 0u;
        Seg1 = tabFunc[1U];
        Seg2 = tabFunc[2U];
        Seg3 = tabFunc[3U];        
        break;
    case LEVEL3:  
        StartUP.reset();
        CntUp = 0U;
        Level = LEVEL4;
        break;
    case LEVEL4:  
        CounterUP(); 
        break;
    case LEVEL5:  
        break;
    case LEVEL6:  
        StartUP.reset();
        Level = LEVEL1;
        break;
    }
}

void Menu3(void)
{
    switch (Level) {                        
    case LEVEL1:                            
        Seg1 = tabFunc[0U];
        DG = 0u;
        Seg2 = tabSeg[0U];
        Seg3 = tabSeg[3U];
        break;
  case LEVEL2:  
        DG = 0u;
        Seg1 = tabFunc[1U];
        Seg2 = tabFunc[4U];
        Seg3 = tabFunc[5U];        
        break;
   case LEVEL3:  
        StartDW.reset();
        CntDw = 15U;
        CntDw = SetCounterDW(CntDw);
        break;
    case LEVEL4:  
        CounterDW(); 
        break;
    case LEVEL5:
        break;   
    case LEVEL6:  
        StartDW.reset();
        Level = LEVEL1;
        break;       
    }
}


// * --------------------------------------------------- *
// * Keyboard                                            *
// * --------------------------------------------------- *
// routine interrutpt
void KeybOk() {
     if (debounceOK.read_ms()>200) // only allow toggle if debounce timer 
     {
            bitFlag.keyB = 1;
            bitFlag.keyOk = 1;
     }
     debounceOK.reset(); // restart timer when the toggle is performed 
     BuzzerOK();
}

// routine interrutpt
void KeybSEL() {
     if (debounceSEL.read_ms()>200) 
     { 
            bitFlag.keyB = 1;
            bitFlag.keySel = 1;            
     }
     debounceSEL.reset(); // restart timer when the toggle is performed 
     BuzzerSEL();
}

char Keyboard(void)
{
    if (bitFlag.keyB == 0) return (KEYNULL);
    if (bitFlag.keyOk) 
    {
        KeyPress = KEYOK;
        bitFlag.keyOk = 0;
    }
    if (bitFlag.keySel) 
    {
        KeyPress = KEYSEL;
        bitFlag.keySel = 0;
    }
    bitFlag.keyB = 0;
    return (KeyPress);
}

// * --------------------------------------------------- *
// * DC measure                                          *
// * --------------------------------------------------- *
void Voltmetro (void)
{
unsigned short unit,dec,cent;
float tmpADCdata;
 
     // lettura adc
    ADCdata = Ain * 3.3;
    
    //unita
    unit = (unsigned short)ADCdata;
    Seg1 = tabSeg[unit];
    DG = 0u;
    
    //decine
    tmpADCdata = ADCdata - (unsigned short)ADCdata;
    dec = (unsigned short)(tmpADCdata * 10U);
    Seg2 = tabSeg[dec];
    
    //centinaia
    tmpADCdata = ADCdata - (unsigned short)ADCdata;
    tmpADCdata = tmpADCdata * 10U;
    tmpADCdata = tmpADCdata - (unsigned short)tmpADCdata;
    cent = (unsigned short)(tmpADCdata * 10U);
    Seg3 = tabSeg[cent];
}

// * --------------------------------------------------- *
// * Counters                                            *
// * --------------------------------------------------- *
void CounterUP (void)
{

    if (StartUP.read_ms()>= 1000)
    {
        if (CntUp < 999) 
        {
            CntUp++;
            buzzer.period(1./4000.); // set PWM period
            buzzer=0.5; // set duty cycle
            wait(0.05);
            buzzer.period(1./0.); // set PWM period
        }
        else 
        {
            CntUp = 0;
        }
        StartUP.reset();
    }
    Visual7(CntUp);     
}

void CounterDW (void)
{
 
    if (StartDW.read_ms()>= 1000U)
    {
        if (CntDw > 0U) 
        {
            CntDw--;
            buzzer.period(1./4000.); // set PWM period
            buzzer=0.5; // set duty cycle
            wait(0.05);
            buzzer.period(1./0.); // set PWM period
        }
        else 
        {
            buzzer.period(1./3000.); // set PWM period
            buzzer=0.5; // set duty cycle
            wait(3.5);
            buzzer.period(1./0.); // set PWM period
            Level = LEVEL5; 
        }
        StartDW.reset();
    }
    if (CntDw == 0) CounterDWend();
    else Visual7(CntDw);
}

void Visual7(int counter)
{
unsigned short unit,dec,cent, tmpCntUP;

    DG = 1U;
    
    //centinaia
    tmpCntUP = counter/100U;
    cent = tmpCntUP;
    Seg1 = tabSeg[cent];
    
    //decine
    tmpCntUP = counter- cent * 100U;
    tmpCntUP = tmpCntUP / 10U;
    dec = tmpCntUP;
    Seg2 = tabSeg[dec];
    
    //unity
    tmpCntUP = counter - cent * 100U - dec * 10U;
    unit = tmpCntUP;
    Seg3 = tabSeg[unit];     
}

int SetCounterDW (int countrDW)
{
char out = 1;
        
    do {
        if (Keyboard() != KEYNULL) {  
        
            switch (KeyPress) {
            case KEYSEL:
                if (countrDW > 0U) countrDW--;
                else countrDW = 180U;
                break;
            case KEYOK:
                Level = LEVEL4; 
                out = 0U;  
                break;
            }
        }
        Visual7(countrDW);
    } while (out);
    
    return(countrDW);
}

void CounterDWend(void)
{
    Seg1 = tabFunc[6U];
    Seg2 = tabFunc[7U];
    Seg3 = tabFunc[8U];
}


// * --------------------------------------------------- *
// * Buzzer                                              *
// * --------------------------------------------------- *
void BuzzerSEL (void)
{
    // buzzer
    buzzer.period(1./2000.); // set PWM period
    buzzer=0.5; // set duty cycle
    wait(0.05);
    buzzer.period(1./0); // set PWM period
}

void BuzzerOK (void)
{
    // buzzer
    buzzer.period(1./1000.); // set PWM period
    buzzer=0.5; // set duty cycle
    wait(0.05);
    buzzer.period(1./0); // set PWM period
}