06.03.2018

Dependencies:   Matrix

Fork of Alarmsystem_med_matrix_log_funker_ikke by Programmeringsgruppe 1

main.cpp

Committer:
andreped
Date:
2018-03-06
Revision:
18:d2e5d6f5faeb
Parent:
17:f046c0ca9edd

File content as of revision 18:d2e5d6f5faeb:

#include "mbed.h"
#include "rtos.h"
#include <string>
#include <stdio.h>
//#include <vector>
//#include "Matrix.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);
BusOut AlarmUtganger1(p21, p22, p23, p24); //1 - Dør 1 Sone 1, 2 - Dør 1 Sone 2, 4 - Dør 1 Sone 3, 8 - Dør 1 Sone 4
BusOut AlarmUtganger2(p25, p26, p27, p28); //1 - Dør 2 Sone 1, 2 - Dør 2 Sone 2, 4 - Dør 2 Sone 3, 8 - Dør 2 Sone 4

/////VARIABLER/////
float Soner[Inn];
int tilstand = 0;
volatile int buffer;
volatile bool running = true;
volatile bool admin = false;
volatile int y1 = AlarmUtganger1;
volatile int y2 = AlarmUtganger2;
volatile int sone;
string password = ("admin");
Timer t;
//enum {tilstand1, tilstand2, tilstand3, normaldrift} state;
//Matrix tilstander(4, 4);
//Matrix buffer_tilstander(4, 4);

/////FUNKSJON DEKLARASJONER/////
void Alarmf();
//void TilstandSjekk();
//int log_to_file();
Thread Alarm;
//Thread Tilstandsjekk;
//Thread Log;
void admin_access_granted();
void sone_monitor();
void password_check();
void read_keyinput();
void request_status();
void request_status_sone_dor(int sone, int dor);
int TilstandSjekk(int, int);
extern "C" void mbed_reset();

/////MAIN/////
int main()
{
    t.start();
    while(1) {
        if(admin == false) {  //Hvis passordet ikke er skrevet inn starter en funksjon "password_check"
            password_check();
        }
        if(Servicebryter == 1) { //Hvis du trykker på servicebryteren, starter man innelåst modus i 15 sek der alarmer slår seg av.
            AlarmUtganger1 = 0;
            AlarmUtganger2 = 0;
            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)) { //Hvis man har skrevet inn admin passord og servicebryteren ikke er trykket på, kjører alle funksjonene i en løkke.
            //if((y1 != AlarmUtganger1) || (y2 != AlarmUtganger2)) log_to_file();
            //y1 = AlarmUtganger1;
            //y2 = AlarmUtganger2;
            Alarm.start(Alarmf); //dette starter funksjonen Alarmf i en tråd, dvs at denne går kontinuerlig og ikke stopper opp programmet.
            //Log.start(log_to_file);
            //Tilstandsjekk.start(TilstandSjekk);
            sone_monitor();
            read_keyinput();
        }
    }
}

/////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;
    int tilstander[Inn];
    for(int i = 0; i < Inn; i++) { //Dette sjekker en og en sone og setter de inn i riktige tilstander.
        if((Soner[i] > 0.6 )&&( Soner[i] < 0.7)) { //Tilstand1, Dør 1 åpen
            //pc.printf("Vi er i Tilstand1\n");
            //state = tilstand1;
            //tilstander(1, i) = 1;
            tilstand = 1;
            if(tilstander[i] != 1)TilstandSjekk(i, tilstand);
            tilstander[i] = 1;
        }
        if((Soner[i] > 0.35 )&&( Soner[i] < 0.45)) { //Normaldrift
            //state = normaldrift;
            tilstand = 0;
            if(tilstander[i] != 0)TilstandSjekk(i, tilstand);
            tilstander[i] = 0;
        }
        if((Soner[i] > 0.46 )&&( Soner[i] < 0.55)) { //Tilstand2, Dør 2 åpen
            //state = tilstand2;
            //tilstander(2, i) = 1;
            tilstand = 2;
            if(tilstander[i] != 2)TilstandSjekk(i, tilstand);
            tilstander[i] = 2;
        }
        if((Soner[i] > 0.9) &&( Soner[i] < 1)) { //Tilstand 3, Begge dører er åpen
            //state = tilstand3;
            //tilstander(3, i) = 1;
            tilstand = 3;
            if(tilstander[i] != 3)TilstandSjekk(i, tilstand);
            tilstander[i] = 3;
        }
    }
}

/*void TilstandSjekk(void)
{
    while(1) {
        int Y = 1;
        int n = 2;
        for(int k=0; k>=sone; k++) Y = k * n;
        switch(state) {
            case normaldrift:
                pc.printf("Vi er i case 0");
                running = false;
                if((y1 != AlarmUtganger1) && (y2 != AlarmUtganger2)) {
                    AlarmUtganger1 =- Y;
                    AlarmUtganger2 =- Y;
                }
                y1 = AlarmUtganger1;
                y2 = AlarmUtganger2;
                buffer = 0;
                break;
            case tilstand1:
                pc.printf("Vi er i case 1 \n");
                running = true;
                if(y1 != AlarmUtganger1) AlarmUtganger1 =+ Y;
                if(buffer == ( 2 || 3)) AlarmUtganger2 =- Y;
                y1 = AlarmUtganger1;
                buffer = 1;
                break;
            case tilstand2:
                pc.printf("Vi er i case 2 \n");
                running = true;
                if(y2 != AlarmUtganger2) AlarmUtganger2 =+ Y;
                if(buffer == ( 1 || 3 )) AlarmUtganger1 =- Y;
                y2 = AlarmUtganger2;
                buffer = 2;
                break;
            case tilstand3:
                pc.printf("Vi er i case 3 \n");
                running = true;
                if((y1 != AlarmUtganger1) && (y2 != AlarmUtganger2)) {
                    AlarmUtganger1 =+ Y;
                    AlarmUtganger2 =+ Y;
                }
                y1 = AlarmUtganger1;
                y2 = AlarmUtganger2;
                buffer = 3;
                break;
        }
        Thread:wait(1000);
    }
}*/

int TilstandSjekk(int i, int tilstand)
{
    //tilstander.add(i, tilstand, 1);
    if(tilstand == 0) {
        wait(0.5);
        pc.printf("Vi er i normaldrift i sone %d \n", i);
        running = false;
        double n = 2;
        double Y = 1;
        for(int k=1; k<=i; k++) Y = Y*n;
        if ( Y == AlarmUtganger1) AlarmUtganger1 = AlarmUtganger1 - Y;
        if ( Y == AlarmUtganger2) AlarmUtganger2 = AlarmUtganger2 - Y;
    }
    if(tilstand == 1) { //Hvis dør 1 er åpen...
        wait(0.5);
        pc.printf("Vi er i tilstand 1 i sone %d \n", i);
        running = true;
        double n = 2;
        double Y = 1;
        for(int k=1; k<=i; k++) Y = Y*n;
        if( Y == AlarmUtganger2 ) AlarmUtganger2 = AlarmUtganger2 - Y;
        if( Y != AlarmUtganger1) AlarmUtganger1 = Y + AlarmUtganger1; //Sjekk om denne verdien har blitt sjekket før, hvis ikke starter alarm på neste dør.
    }
    if(tilstand == 2) { //Hvis dør 2 er åpen...
        wait(0.5);
        pc.printf("Vi er i tilstand 2 i sone %d \n", i);
        running = true;
        double n = 2;
        double Y = 1;
        for(int k=1; k<=i; k++) Y = Y*n;
        if( Y == AlarmUtganger1 ) AlarmUtganger1 = AlarmUtganger1 - Y;
        if( Y!=AlarmUtganger2) AlarmUtganger2 = Y + AlarmUtganger2;  //Sjekk om denne verdien har blitt sjekket før, hvis ikke starter alarm på neste dør.
    }
    if(tilstand == 3) { //Hvis begge dører er åpne
        wait(0.5);
        pc.printf("Vi er i tilstand 3 i sone %d \n", i);
        running = true;
        double n = 2; // We want 2^i
        double Y = 1;
        for(int k=1; k<=i; k++) Y = Y*n;
        if( Y!=AlarmUtganger1 ) AlarmUtganger1 = Y + AlarmUtganger1;
        if( Y!=AlarmUtganger2 ) AlarmUtganger2 = Y + AlarmUtganger2;
    }
    return 0;
}

/*int log_to_file()
{
    //while(tilstander != buffer_tilstander) {
    // wait(5.0);

    FILE *fp = fopen("/local/LOG.txt", "w" );
    for(int i = 0; i < 4; i++) {
        int n = 2;
        int a1 = n * i;
        int a2 = n * i;
            if( (a1 == AlarmUtganger1) && (a2 != AlarmUtganger2) ) {
                fprintf(fp,"Sone %d, dor 1 er aapen \n", i);
                fprintf(fp,"Tid:%f siden start \n",t.read());
            }

            if( (a2 == AlarmUtganger2) && (a1 != AlarmUtganger1) ) {
                fprintf(fp,"Sone %d, dor 2 er lukket \n", i);
                fprintf(fp,"Tid:%f siden start \n",t.read());
            }
            if ( (a1 == AlarmUtganger1) && (a2 == AlarmUtganger2) ) {
                fprintf(fp,"Sone %d dor 1 og 2 er lukket \n",i);
                fprintf(fp,"Tid:%f siden start \n",t.read());
            }
        }
 return 0;
}*/

void admin_access_granted()
{
    admin = true;
    pc.printf("Admin access granted\n");//info
    pc.printf("Folgende kommandoer kan brukes: \n");// liste over funksjoner tilgjenglig.
    pc.printf("Status sone og dor(sone forst, dor etter) Kommando: 1,2 \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
}

void password_check()
{
    if(pc.readable() == 1) {
        pc.printf("Write password: ");
        string b;
        char s;
        for(int i = 0; i < 5; i++) {
            s = pc.getc();
            pc.printf("%c", s);
            b += s;
            if(b == password) {
                admin_access_granted();
            }
        }
    }
}

void read_keyinput()
{
    if(pc.readable() == 1) {
        pc.printf("\nDu skriver: ");
        string read;
        char c;
        for(int i = 0; i < 6; i++) {
            c = pc.getc();
            pc.printf("%c ", c);
            read += c;
            if( read == ("1, 1")) request_status_sone_dor(1, 1);
            if( read == ("1, 2")) request_status_sone_dor(1, 2);
            if( read == ("2, 1")) request_status_sone_dor(2, 1);
            if( read == ("2, 2")) request_status_sone_dor(2, 2);
            if( read == ("3, 1")) request_status_sone_dor(3, 1);
            if( read == ("3, 2")) request_status_sone_dor(3, 2);
            if( read == ("4, 1")) request_status_sone_dor(4, 1);
            if( read == ("4, 2")) request_status_sone_dor(4, 2);
            if( read == ("Status")) request_status();
            //if( read == ("Stop"))
            if( read == ("Reset")) mbed_reset();
        }
    }
}


void request_status_sone_dor(int sone, int dor)
{
    int n = 2;
    for(int i = 0; i <= 16;) {
        if(i == 0) i = 1;
        else i = i * n;
        if(sone == i) {
            if(dor == 1) {
                if(AlarmUtganger1 == sone) pc.printf("Dor: %d i sone: %d er apnet \n", dor, sone);
                else pc.printf("Dor: %d i sone: %d er lukket \n", dor, sone);
            }
            if(dor == 2) {
                if(AlarmUtganger2 == sone) pc.printf("Dor: %d i sone: %d er apnet \n", dor, sone);
                else pc.printf("Dor: %d i sone: %d er lukket \n", dor, sone);
            }
        }
    }
}

void request_status()
{
    int sone = 0;
    int n = 2;
    for(int i = 0; i < 8;) {
        sone = sone + 1;
        if(i == 0) i = 1;
        else i = i*n;
        if(AlarmUtganger1 == i) pc.printf("Dor: 1 i Sone: %d er apent \n", sone);
        else pc.printf("Dor: 1 i Sone: %d er lukket \n", sone);
        if(AlarmUtganger2 == i) pc.printf("Dor: 2 i Sone: %d er apent \n", sone);
        else pc.printf("Dor: 2 i Sone: %d er lukket \n", sone);
    }
}