fort test av mbed cli

Fork of Alarmsystem_rev_innlevering by Programmeringsgruppe 1

main.cpp

Committer:
Banyrud
Date:
2018-03-08
Revision:
17:f27485b6d16e
Parent:
16:3d2e29aa5df5
Child:
18:e06a42c5d2a4

File content as of revision 17:f27485b6d16e:

#include "mbed.h"
#include "rtos.h"
#include <string>
#include <stdio.h>

/////DEFINISJONER/////
#define Inn 4
Serial pc(USBTX, USBRX);
LocalFileSystem local("local");

/////INNGANGER/////
DigitalIn Servicebryter(p20);
AnalogIn _Sone1(p15);
AnalogIn _Sone2(p16);
AnalogIn _Sone3(p17);
AnalogIn _Sone4(p19);

/////UTGANGER/////
DigitalOut Driftslys(LED1);
DigitalOut Utganger[8] = {p21, p22, p23, p24, p25,p26,p27,p28};

/////VARIABLER/////
float Soner[Inn];
int minne[8] = {};
int tilstand[8]= {};
volatile int buffer;
volatile bool running = true;
volatile bool admin = false;
volatile bool start = false;
volatile bool stopp = true;
string passord = ("admin");
string start_kommando = ("start");
string stopp_kommando = ("stopp");
Timer t;
int v = 0;

/////FUNKSJON DEKLARASJONER/////
void Alarmf();
Thread Alarm;
Thread Read;
void admin_access_granted();
void sone_monitor();
int log_to_file(int, int);
void password_check();
void read_keyinput();
void start_sys();
void stopp_sys();
int logg_start();
int logg_stopp();
int request_status_sys();
int request_status_alarm(int);
int TilstandSjekk();
extern "C" void mbed_reset();

/////MAIN/////
int main()
{
    Read.start(password_check);// here stod den når vi brukte (read_keyinput)
    t.start();
    while(1) {
        if(Servicebryter == 1) { //Hvis du trykker på servicebryteren, starter man innelåst modus i 15 sek der alarmer slår seg av.
            running = false;
            pc.printf("NB! Alle alarmer er i innelast modus i 15 sek!! \n");
            wait(10);
            pc.printf("NB! Alarmer gar pa om 5 sek! \n");
            wait(5);
        }
        while((admin) && (Servicebryter == 0)&&(start == true) && (stopp == false)) { //Hvis man har skrevet inn admin passord og servicebryteren ikke er trykket på, kjører alle funksjonene i en løkke.
            Alarm.start(Alarmf); //dette starter funksjonen Alarmf i en tråd, dvs at denne går kontinuerlig og ikke stopper opp programmet.
            sone_monitor();// Tilordener sloyfe verdier til tabell for soner.
            wait(0.1);
            TilstandSjekk();
        }
    }
}


/////FUNKSJONER/////
void Alarmf(void)
{
    while(1) {
        if(running == true) { //Running er en global variabel som blir satt til false ved tilstand Normaldrift eller ved servicebryter lagt inn.
            Driftslys = !Driftslys;
            Thread::wait(50);  //Som vanlig wait funksjon, bare litt annerledes kode i thread library OS5.
        } else { //Hvis vi er i normaldrift driftlyset lyse kontinuerlig.
            Driftslys = 1;
        }
    }
}

void sone_monitor()
{
    //Først legger vi de forskjellige sonene inn i en tabell.
    Soner[0] = _Sone1;
    Soner[1] = _Sone2;
    Soner[2] = _Sone3;
    Soner[3] = _Sone4;
    for(int i = 0, x = 0; i < 4; i++,x+=2) { //Dette sjekker en og en sone og setter de inn i riktige tilstander.
        if( (Soner[i] > 0.35 ) && ( Soner[i] < 0.45) ) { //Normaldrift
            tilstand[x] = 0;
            tilstand[x+1] = 0;
        }
        if( (Soner[i] > 0.6 ) && ( Soner[i] < 0.7) ) { //Tilstand1, Dør 1 åpen
            tilstand[x] = 1;
            tilstand[x+1] = 0;
            running = true;
        }
        if( (Soner[i] > 0.46 ) && ( Soner[i] < 0.55) ) { //Tilstand2, Dør 2 åpen
            tilstand[x] = 0;
            tilstand[x+1] = 1;
            running = true;
        }
        if( (Soner[i] > 0.9) ) { //Tilstand 3, Begge dører er åpen
            tilstand[x] = 1;
            tilstand[x+1] = 1;
        }
    }
}


int TilstandSjekk()    // [ x, x+1, x+2, x+3, x+4, x+5, x+6, x+7 ]
{
    for (int i = 0; i < 8; i++) {
        if(minne[i] != tilstand[i]) {
            Utganger[i] = 1;
            minne[i] = tilstand[i];
            log_to_file(i,Utganger[i]);
        }
    }
    return 0;
}

////////////////////////////////////////////////////////////
/////////////////Mulige logg innforinger////////////////////
// Tid: t sekunder                                        //
// Alarm 1 har blitt utloost // Dette betyr Sone 1 door 1 //
// Alarm 2 har blitt utloost // Dette betyr Sone 1 door 2 //
// Alarm 3 har blitt utloost // Dette betyr Sone 2 door 1 //
// Alarm 4 har blitt utloost // Dette betyr Sone 2 door 2 //
// Alarm 5 har blitt utloost // Dette betyr Sone 3 door 1 //
// Alarm 6 har blitt utloost // Dette betyr Sone 3 door 2 //
// Alarm 7 har blitt utloost // Dette betyr Sone 4 door 1 //
// Alarm 8 har blitt utloost // Dette betyr Sone 4 door 2 //
////////////////////////////////////////////////////////////

int log_to_file(int c, int b)   // c er sone, b er tilsand.
{
    FILE *fp ;
    fp = fopen( "/local/log.txt", "a" ) ;
    if(fp != NULL) {
        float tid = t.read();
        fprintf(fp, "Tid: %.2f i sekunder siden systemet blir spenningsatt \nAlarm %d: er utloost \n", tid, c+1);
    }
    fclose(fp);
    return 0;
}

void admin_access_granted()
{
    admin = true;
    running = false;
    pc.printf("\nAdministrator tilgang innvilget\n");//info
    pc.printf("Folgende kommandoer kan brukes: \n");// liste over funksjoner tilgjenglig.
    pc.printf("Starte overvaaking av systemet. Kommando: 'start' + 'Enter'\n");//
    pc.printf("Stoppe overvaaking av systemet. Kommando: 'stopp' + 'Enter'\n");//
    pc.printf("Status alarm for hver some. Kommando: reqa1 \n");// funksjon 1 - request spesific status
    pc.printf("Status alle soner og dorer. Kommando: 'status' \n");// funksjon 1 - request status all
    pc.printf("Reset hele systemet. Kommando: 'reset' \n");// funksjon 4 - request log all
    read_keyinput();
}

void password_check()
{
    if(v == 0) {
        pc.printf("Skriv passord: ");
        v = 1;
    }
    char tastepassord[20];
    pc.scanf("%s",&tastepassord);
    int k = strcmp(tastepassord, "passord");
    if(!k) {
        admin_access_granted();
    }
}

void read_keyinput()
{
    char read[20];
    pc.scanf("%s",&read);
    if(!strcmp(read, "start")) {
        pc.printf("du er i start kommando");
        start_sys();
    }
    if(!strcmp(read,"stopp")) {
        stopp_sys();
    }
    if( !strcmp(read, "reset")) mbed_reset();
    if( !strcmp(read, "reqa1")) request_status_alarm(1);
    if( !strcmp(read, "reqa2")) request_status_alarm(2);
    if( !strcmp(read, "reqa3")) request_status_alarm(3);
    if( !strcmp(read, "reqa4")) request_status_alarm(4);
    if( !strcmp(read, "reqa5")) request_status_alarm(5); /// Jeg skriver denne kommandoen til systemet - gå til linje 287!
    if( !strcmp(read, "reqa6")) request_status_alarm(6);
    if( !strcmp(read, "reqa7")) request_status_alarm(7);
    if( !strcmp(read, "reqa8")) request_status_alarm(8);
    if( !strcmp(read, "status")) request_status_sys();
}

void start_sys()    // funksjon som lar systemet starte opp og kaller opp logg funksjon for og logge start.
{
    start = true;
    stopp = false;
    pc.printf("\nSystemet ble startet\n");
    logg_start();
}

void stopp_sys()    // funksjon som lar systemet stopp opp og kaller opp logg funksjon for og logge stopp.
{
    start = false;
    stopp = true;
    running = false;
    pc.printf("\nSystemet ble stoppet\n");
    logg_stopp();
}

int logg_start()
{
    FILE *fp ;
    fp = fopen( "/local/log.txt", "a" ) ;
    if(fp != NULL) {
        float tid = t.read();
        fprintf(fp, "Tid: %.2f i sekunder siden systemet blir spenningsatt \n Overvaakingen ble startet \n", tid);//t er tid

        fclose(fp);
        return 0;
    } else {
        return 1;
    }
}
int logg_stopp()
{
    FILE *fp ;
    fp = fopen( "/local/log.txt", "a" ) ;
    if(fp != NULL) {
        float tid = t.read();
        fprintf(fp, "Tid: %.2f i sekunder siden systemet blir spenningsatt \n Overvaakingen ble stoppet \n", tid);//t er tid
        fclose(fp);
        return 0;
    } else {
        return 1;
    }
}
int request_status_alarm(int v)
{
    switch(v) {
        case 1:
            if(Utganger[v] == 1) {
                pc.printf("Door 1 i sone 1 er utloost\n");
            } else {
                pc.printf("Door 1 i sone 1 er ikke utloost\n");
            }
            break;
        case 2:
            if(Utganger[v] == 1) {
                pc.printf("Door 2 i sone 1 er utloost\n");
            } else {
                pc.printf("Door 2 i sone 1 er ikke utloost\n");
            }
            break;
        case 3:
            if(Utganger[v] == 1) {
                pc.printf("Door 1 i sone 2 er utloost\n");
            } else {
                pc.printf("Door 1 i sone 2 er ikke utloost\n");
            }
            break;
        case 4:
            if(Utganger[v] == 1) {
                pc.printf("Door 2 i sone 2 er utloost\n");
            } else {
                pc.printf("Door 2 i sone 2 er ikke utloost\n");
            }
            break;
        case 5:
            if(Utganger[v] == 1) {
                pc.printf("Door 1 i sone 3 er utloost\n");
            } else {
                pc.printf("Door 1 i sone 3 er ikke utloost\n");
            }
            break;
        case 6:
            if(Utganger[v] == 1) {
                pc.printf("Door 2 i sone 3 er utloost\n");
            } else {
                pc.printf("Door 2 i sone 3 er ikke utloost\n");
            }
            break;
        case 7:
            if(Utganger[v] == 1) {
                pc.printf("Door 1 i sone 4 er utloost\n");
            } else {
                pc.printf("Door 1 i sone 4 er ikke utloost\n");
            }
            break;
        case 8:
            if(Utganger[v] == 1) {
                pc.printf("Door 2 i sone 4 er utloost\n");
            } else {
                pc.printf("Door 2 i sone 4 er ikke utloost\n");
            }
            break;
    }
    return 0;
}
int request_status_sys()
{
    for(int u = 1; u <9; u++) {
        if(Utganger[u] == 1) {
            pc.printf("Alarm %d er utloost\n", u);
        } else {
            pc.printf("Alarm %d er ikke utloost\n", u);
        }
    }
    return 0;
}