programmering / Mbed 2 deprecated mbed_blinkyrfferfrdfrf

Dependencies:   mbed

main.cpp

Committer:
datx98
Date:
2018-03-06
Revision:
0:c1d82c87628a
Child:
1:499bd5b83b45

File content as of revision 0:c1d82c87628a:

#include "mbed.h"
#include <time.h>

AnalogIn sloyfe[4] = {p17, p18, p19, p20};                          // Analoge inngangene, *sløyfene*
DigitalOut led[4] = {LED1, LED2, LED3, LED4};                       // Led til alarm blinking ved feil.
DigitalOut b[8] = {p21, p22, p23, p24, p25, p26, p27, p28};         // Status ledbar på sensorene i sløyfene.
DigitalIn sb(p16);                                                  // Service bryter.
Serial pc(USBTX, USBRX);                                            //PC komunikasjon
Ticker alarm, system_paa, servic;                                   // Tikkere, alarm er til å sjekke sløyfene, system på er til når alarmen er aktivert og service er for å sjekke servicebryter.
int blink[4]= {0, 0, 0, 0};                                         // Global variabel med 4 elementer. Hvert element styrer sin egen led!
int amount_faild = 0;                                        // En variabel for å telle antall ganger feil inntastet passord.
void alarm_actived();                                        // Sjekker hva verdien på de analoge inngangene er og og utfører en case ut fra det for hver sløyfe.
void service();                                              // Funksjon for resetting av anlegge. Anlegget blir satt i vedlikeholdsmodus med null feil.
void alblink();                                             // Blinke funksjonen.
char passord[5] = {'5','5', '5', '5', '5'};                             // Passordet.
int check_password1();                                       // Funksjon for å sjekke om inntastet passord er riktig.
void User_Of(int);                                               // Valg menyen der User_Of velger et ønske.
void Dato_timer();                                          //Klokke funskjonen.
LocalFileSystem local("local");                             // Fillogging

int main()
{
   set_time(1519919737); // vasjon 27 feb
    while(1)
    {
        pc.printf("Velkommen\n");                   // Velkomst beskjed.
        Dato_timer();                               // Oppkaller klokke funksjonen for å sjekke om tiden er riktig.
        int x = check_password1();                      // Dersom passord er riktig blir det returnet en ener og tilegnet til variabelen x.
        User_Of(x);                                      // Valg funskjonen får verdien 1 fra varabelen x.
    }
}

void Dato_timer()
{
    time_t seconds = time(NULL);                                                                                    // Returnerer tiden lagret i time_t i sekunder.
    pc.printf("Mbed klokka er naa: %s", ctime(&seconds));                                                                       // Viser hva tiden er, ctime tolker det til leselig tid for oss.
    pc.printf("\n\n\n");
    pc.printf("Hvis det ikke stemmer tast 0 ellers tast noe annet\n", ctime(&seconds));                                 //Kun info.
    if (pc.getc() == '0')                                                                                           // Sjekk om inntastet tegn er 0.
    {
        struct tm t;                                                                                                //Pakker all info inn og sender det til klokkefunksjonen.
        pc.printf("Tast inn dato og klokkeslett:\n");
        pc.printf("YYYY MM DD HH MM SS[enter]\n");
        scanf("%d %d %d %d %d %d", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec);            // inhenter riktig rid fra User_Of.
        
        t.tm_year = t.tm_year - 2020;               // Gjør om til riktig år.
        t.tm_mon = t.tm_mon - 1;                        //Gjør om til riktig måned.
        set_time(mktime(&t));                       // Setter nye tiden til intastet tid.
        
    }
    
}

void User_Of(int riktigpassord)                          // meny funksjonen.
{   
    servic.attach(&service, 60);                          // Tikker funksjon som service blir tilknyttet og utføres 2 ganger i sekundet.
    while(riktigpassord == 1)                           // Hvis verdien fra x er 1 gå inn her.
    {
        time_t seconds = time(0); 
        pc.printf("For start tast 5: \n\t");            // Valg meny.
        pc.printf("For stopp tast 6:\n\t");
        pc.printf("For reset tast 7:\n\t");
        pc.printf("For status av hele anlegget eller sloyfer tast 4:\n\t");
        pc.printf("For utlogging tast 8:\n\t");
    
        servic.attach(&service, 5);
        switch(pc.getc())                       // Innhenter inntrykk fra User_Of.
        {
            case '5':                       // Dersom intastet tegn er 1, utfør dette.
            {
                FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving.
                fprintf(fp, "\r\n Systemet paa: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                fclose(fp);                                             //Stenger filen fp.
                pc.printf("System paa. \n\n");//Info til User_Of.
                system_paa.attach(&alarm_actived, 2);// Tikker funksjon som alarm aktiv blir tilknyttet og skal utføres annen hvert sekund.
                break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            case '6':
            {
                FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving.
                fprintf(fp," Systemet stoppet: %s\r\n", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                fclose(fp);                                                             //Stenger filen fp.
                pc.printf("System stoppet. \n\n");
                system_paa.detach();                                                                //Fra kobler funskjonen system_paa fra tickeren.
                for(int m=0; m < 4; m++){ blink[m]=0; led[m]=0;}
                break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            case '7':
            {
                FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving.
                fprintf(fp, "\r\n Systemet resatt: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                fclose(fp);//Stenger filen fp.
                pc.printf("\n\n System resatt. \n\n");
                int m=0;
                while(m < 4) 
                { // Dersom denne lokale variabelen er mindre enn 4 hold deg i denne løkka.
                    blink[m]=0; // Dersom service bryter er 1 reset alarm.
                    b[m+m]=b[m+m+1]=0;// Sett alle diodene fra b[0+0] og b[0+0+1] = 0. Og for hver gang m økes med en verdi blir det da m+m og m+m+1. Partall og oddetall.
                    led[m]=0;// Sett alle led[] til 0.
                    m++;// Inkrementer denne lokale variabelen og repeter.
                }
                break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            case '4':
            {
                pc.printf("\n For status paa hele anlegget tast 1: \n");
                pc.printf("\n For status paa enkelt sloyfer tast 2: \n\n\t\t");
                switch(getchar())//Ny switch case i case 4 for status valg.
                {
                    case '5':
                    {
                        for(int m=0; m<4; m++)
                        {
                            float a=sloyfe[m];// Lokal float variabel som får verdien fra sløyfene for hver verdi i har.
                            if(a >= 0.30 && a <= 0.55){ pc.printf("\n Sloyfe %d alt ok. \n R1 i sloyfe %d operativ. \n R2 i sloyfe %d operativ \n\n", m+1, m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of.
                            else if(a >= 0.58 && a <= 0.62) { pc.printf("\n Brudd i sloyfe %d. \n Brudd i R1 sloyfe %d. \n", m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of.
                            else if(a >= 0.64 && a <= 0.80) { pc.printf("\n Brudd i sloyfe %d. \n \n Brudd i R2 sloyfe %d. \n\n", m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of.
                            else if(a < 0.25) { pc.printf("\n Brudd i hele sloyfe %d. \n", m+1); }// Tester og hvis sant, printer en beskjed til User_Of.
                            else if(a >=0.88) { pc.printf("\n Brudd i R1 og R2 i sloyfe %d. \n", m+1); }// Tester og hvis sant, printer en beskjed til User_Of.
                        }
                        break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
                    }
                    case '6':
                    {
                        pc.printf("\n For sloyfe 1 tast 1: \n For sloyfe 2 tast 2: \n For sloyfe 3 tast 3: \n For sloyfe 4 tast 4: \n\n\t\t");// Valg meny for status på sløye.
                        int x = getchar();
                        if(x<50 || x>60){pc.printf("\n Ugyldig valg! \n"); break;};
                        float a=sloyfe[x-50];//x-49 er pga getchar gir en ASCII verdi som er forskjellig fra ønskelig verdi, med -49 får vi riktig verdi til sløyfe element nummer.
                        if(a >= 0.30 && a <= 0.55){ pc.printf("\n R1 operativ. \n R2 operativ \n\n"); }// Tester og hvis sant, printer en beskjed til User_Of.
                        else if(a >= 0.58 && a <= 0.62) { pc.printf("\n Brudd i R1 sloyfe %d. \n", x-49); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer.
                        else if(a >= 0.64 && a <= 0.80) { pc.printf("\n Brudd i R2 sloyfe %d. \n\n", x-49); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer.
                        else if(a < 0.25) { pc.printf("\n Brudd i hele sloyfe %d. \n", x-48); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer.
                        else if(a >=0.88) { pc.printf("\n Brudd i R1 og R2 i sloyfe %d. \n", x-48); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer.
                        break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
                    }
                    default: //Dersom et annet tall enn hva som er spesifisert printes denne beskjeden ut.
                    {
                        printf("\n Ugyldig valg.\n");
                        break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
                    }
                } break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            case '8':
            {
                FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving.
                fprintf(fp, "\r\n Logget av systemet: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                fclose(fp);//Stenger filen fp.
                pc.printf("\n\n\n\n\n\n\n\n\t\t\t\t Farvel.\n\n\n\n\n\n\n\n\n");
                riktigpassord=0;// Setter denne variabelen til 0 for at neste innlogging kun skjer hvis riktig passord er skrevet.
                break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            case '0':
            {
                FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for lesing.
                /*if (fp == NULL) // Dette er for å gi beskjed om at filen ikke klarte å åpne.
                {
                    pc.printf
                    exit(1);
                }*/// Dette har vi valgt å eksludere da ved testing er det tydelig at filen åpner å lukker seg på rikitg måte.
                int c;
                if (fp) //En test for å se om filen er åpen!
                {
                    while ((c = getc(fp)) != EOF)// Så fremt det er flere tegn i fila forbli i while løkka.
                    {
                        pc.putc(c);// Printer ut tegn for tegn fra filen til TeraTerm.
                    }
                }
                fclose(fp);//Ferdig med lesing av filen og lukker filen.
                break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det.
            }
            default: //Dersom et annet tall enn hva som er spesifisert printes denne beskjeden ut.
            {
                printf("\n Ugyldig valg.\n");
                break;//Det er valgfritt å breake her da default blir utført og programmet fortsetter videre. Men vi tar det med for det.
            }
        }
    }
}   
int check_password1()
{
    time_t seconds = time(NULL); // Henter tiden lagret i time_t i sekunder for videre bruk.
    pc.printf("\n Skriv inn passord for adgang til alarmsystemet: ");
    int riktigpass=0; int n=0; char sjekk[4];// Lokale varable blir opprettet for bruk i denne funksjonen.
    while(1) 
    {
        if(pc.readable() && n < 4) // Dersom noe blir tastet på tastauret gå inn.
            {
                sjekk[n++] = pc.getc();// Lagre inntastet tegn i sjekk arrayet i element n og inkrementer n med 1.
                if(n == 4) { break; }// Dersom n er lik 4 break ut av while løkken. 
            }
    }
    for(n=0; n<4; n++) { if(sjekk[n]==passord[n]) { riktigpass++; } }// En for løkke for å sammenligne hvert intastet tegn med passord tegnene.
    
    if(riktigpass == 4) // Dersom passordet er riktig gå inn.
    {
        FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving.
        fprintf(fp, "\r\n Riktig passord inntastet: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
        fclose(fp);//Stenger filen fp.
        pc.printf("\n Riktig passord.\n\n");
        amount_faild=0;
        return 1;
    }
    else 
    { // Dersom passordet er feil gå inn her.
        amount_faild++;
        FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving.
        fprintf(fp, "\r\n Feil passord inntastet, %d ganger: %s", amount_faild, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
        fclose(fp);//Stenger filen fp.
        pc.printf("\n\nFeil Passord, prov igjen!\n\n"); }
    return 0;
}

void alblink()//Blinke funksjon for sløyfene.
{
    int n;// Lokal variabel
    for(n=0; n < 5; n++) 
    { // For løkke for å sjekke om feil er tilstedet eller ikke.
        if(blink[n]==1) { led[n] = !led[n]; }  // Dersom feil på de forskjellige sløyfene blink med riktig led!
    }
}

void service()// service bryter funksjon.
{
    time_t seconds = time(NULL); // Henter tiden lagret i time_t i sekunder for videre bruk.
    if(sb ==1) 
    { // Hvis service bryter aktiv gå inn.
        FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");                          // File blir peket til fp og fp blir åpnet for skriving.
        fprintf(fp, "\r\n Service bryter aktivert: %s", ctime(&seconds));           //Kun en beskjed som blir loggført med klokketid.
        fclose(fp);                         //Stenger filen fp.
    
        pc.printf("\n\n Vedlikeholdsarbeid paa alegget. \n\n\n\n");// Fortell User_Of at anlegge er i vedlikeholdsmodus.
        int m=0;            //Lokal variabel.
        while(sb==1) 
        {                                                           // Såfremt service bryteren er aktiv holdes programmet i denne while løkken.
            while(m < 2) 
            {                                                                   // Dersom denne lokale variabelen er mindre enn 4 hold deg i denne løkka.
                blink[m] = 0;                                                   // Dersom service bryter er 1 reset alarm.
                b[m+m]=b[m + m + 1] = 0;                // Sett alle diodene fra b[0+0] og b[0+0+1] = 0. Og for hver gang m økes med en verdi blir det da m+m og m+m+1. Partall og oddetall.
                led[m] = 0;                         // Sett alle led[] til 0.
                m++;                                                                // Inkrementer denne lokale variabelen og repeter.
            }
        }
        system_paa.detach();                            // Frakobler system_paa fra ticker.
        pc.printf("\n\n Tast 1 for igangsetting \n\n");
    }
}

void alarm_actived()// .
{
    time_t seconds = time(NULL);                                                        // Henter tiden lagret i time_t i sekunder for videre bruk.
    alarm.attach(&alblink, 0.1);                                                                // Tilkobler alblink funksjonen til ticker ved navnet alarm og denne funksjoenen kjøres 10 ganger i sekundet. 
    int analog_verdi=0;                                                             // Lokal variabel.
    for(int i = 0; i < 4; i++)                                          // En for løkke for å sjekke alle 4 sløyfene, og i for løkken er den en switch for å utføre riktig handling utfra hva analog_verdi er.
    {
        float a=sloyfe[i];                                              // Lokal float variabel som får verdien fra sløyfene for hver verdi i har.
        if(a >= 0.30 && a <= 0.55) { analog_verdi = 1; }                            // Dersom alt i orden sett analog_verdi til 1.
        else if(a >= 0.58 && a <= 0.62) { analog_verdi = 2; }        // Dersom R1 brutt sett analog_verdi til 2.
        else if(a >= 0.64 && a <= 0.80) { analog_verdi = 3; }               // Dersom R2 brutt sett analog_verdi til 3.
        else if(a < 0.25 || a >=0.88) { analog_verdi = 4; }                                             // Dersom brudd på leder eller begge motstandene sett analog_verdi til 4.
 
        switch(analog_verdi) 
        {
            case 1: 
            { // Dersom denne verdien er 1 gå inn her og utfør dette også gå ut av case 1 tilbake til for lokka.
                
                if(blink[i]==0 && led[i]==0) // Hvis det globale arrayet blink[i] og led[i] er av gå inn.
                {
                    if(i==0) { led[i]=1; }     // Dersom i=0 sett led[i] på. 
                    else if(i==1) { led[i]=1; }// Dersom i=1 sett led[i] på.
                    else if(i==2) { led[i]=1; }// Dersom i=2 sett led[i] på.
                    else if(i==3) { led[i]=1; }// Dersom i=3 sett led[i] på.
                }
                break;// Ferdig med hva som er blitt bedt av den og avlutter case 1 går tilbake til for løkken.
            }
            case 2: 
            {
                // Dersom denne verdien er 2 gå inn her og utfør dette også gå ut av case 2 tilbake til for løkken.
                blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke.
                if(b[i+i]==0) 
                {
                    FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving.
                    fprintf(fp, "\r\n Brudd i R1 i Sloyfe %d:  %s", i+1, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                    fclose(fp);//Stenger filen fp.
                    b[i+i]=1;// Led på bargraf med element nr i+i blir satt til en for å indikere feil på R1 i denne sløyfen. Partall, altså b0, b2, b4 og b6.
                }
                break;//  Ferdig med hva som er blitt bedt av den og avlutter case 2 går tilbake til for løkken.
            }
            case 3: 
            {
                 // Dersom denne verdien er 3 gå inn her og utfør dette også gå ut av case 3 tilbake til for løkken.
                blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke.
                if(b[i+i+1]==0) 
                {
                    FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving.
                    fprintf(fp, "\r\n Brudd i R2 i Sloyfe %d: %s", i+1, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid.
                    fclose(fp);//Stenger filen fp.
                    b[i+i+1]=1;// Led på bargraf med element nr i+i+1 blir satt til en for å indikere feil på R2 i denne sløyfen. Oddetall altså b1, b3, b5 og b7.
                }
                break;// Ferdig med hva som er blitt bedt av den og avlutter case 3 går tilbake til for løkken.
            }
            case 4: 
            {
               // Dersom denne verdien er 4 gå inn her og utfør dette også gå ut av case 4 tilbake til for løkken.
                blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke.
                if(b[i+i] == 0 || b[i+i+1] == 0) 
                {
                    FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving.
                    if(a < 0.25){fprintf(fp, "\r\n Brudd i hele Sloyfe %d: %s", i+1, ctime(&seconds));}//Kun en beskjed som blir loggført med klokketid.
                    else if(a >=0.88){fprintf(fp, "\r\n Brudd i R1 og R2 i Sloyfe %d: %s", i+1, ctime(&seconds));}//Kun en beskjed som blir loggført med klokketid.
                    fclose(fp);//Stenger filen fp.
                    b[i+i]=1;// Led på bargraf med element nr i+i blir satt til en for å indikere feil på R1 i denne sløyfen. Partall, altså b0, b2, b4 og b6.
                    b[i+i+1]=1;// Led på bargraf med element nr i+i+1 blir satt til en for å indikere feil på R2 i denne sløyfen. Oddetall altså b1, b3, b5 og b7.
                }
                break;// Ferdig med hva som er blitt bedt av den og avlutter case 4 går tilbake til for løkken.
            }
        }
    }
}