Andreas Pedersen
/
Alarmsystem_som_faen_ikke_funkerrrrr
06.03.2018
Fork of Alarmsystem_med_matrix_log_funker_ikke by
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); } }