21.02.2018

Fork of Alarmsystem20_02_2018 by Programmeringsgruppe 1

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include <string>
00004 #include <stdio.h>
00005 
00006 /////DEFINISJONER/////
00007 #define Inn 4
00008 Serial pc(USBTX, USBRX);
00009 LocalFileSystem local("local");
00010 FILE *fp = fopen("/local/log.txt", "w" ) ;
00011 
00012 /////INNGANGER/////
00013 DigitalIn Servicebryter(p20);
00014 AnalogIn _Sone1(p15);
00015 AnalogIn _Sone2(p16);
00016 AnalogIn _Sone3(p17);
00017 AnalogIn _Sone4(p19);
00018 
00019 /////UTGANGER/////
00020 DigitalOut Driftslys(LED1);
00021 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
00022 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
00023 
00024 /////VARIABLER/////
00025 float Soner[Inn];
00026 int tilstand = 0;
00027 volatile bool running = true;
00028 volatile bool admin = false;
00029 string password = ("admin");
00030 Timer t;
00031 
00032 /////FUNKSJON DEKLARASJONER/////
00033 void Alarmf();
00034 Thread Alarm;
00035 int TilstandSjekk(int, int);
00036 void admin_access_granted();
00037 void sone_monitor();
00038 void password_check();
00039 void read_keyinput();
00040 void request_status();
00041 void request_status_sone_dor(int sone, int dor);
00042 extern "C" void mbed_reset();
00043 int log_to_file(int, int);
00044 
00045 /////MAIN/////
00046 int main()
00047 {
00048     t.start();
00049     while(1) {
00050         if(admin == false) {
00051             password_check();
00052         }
00053         if(Servicebryter == 1) {
00054             AlarmUtganger1 = 0;
00055             AlarmUtganger2 = 0;
00056             running = false;
00057             pc.printf("NB! Alle alarmer er i innelast modus i 15 sek!! \n");
00058             wait(10);
00059             pc.printf("NB! Alarmer gar pa om 5 sek! \n");
00060             wait(5);
00061         }
00062         while((admin) && (Servicebryter == 0)) {
00063             Alarm.start(Alarmf);
00064             sone_monitor();
00065             read_keyinput();
00066         }
00067     }
00068 }
00069 
00070 /////FUNKSJONER/////
00071 void Alarmf(void)
00072 {
00073     while(1) {
00074         if(running == true) {
00075             Driftslys = !Driftslys;
00076             Thread::wait(50);
00077         } else {
00078             Driftslys = 1;
00079         }
00080     }
00081 }
00082 
00083 int TilstandSjekk(int i, int tilstand)
00084 {
00085     log_to_file(i, tilstand);
00086     if(tilstand == 0) {
00087         running = false;
00088         double n = 2;
00089         double Y = 1;
00090         for(int k=1; k<=i; k++) Y = Y*n;
00091         if ( Y == AlarmUtganger1) AlarmUtganger1 = AlarmUtganger1 - Y;
00092         if ( Y == AlarmUtganger2) AlarmUtganger2 = AlarmUtganger2 - Y;
00093     }
00094     if(tilstand == 1) { //Hvis dør 1 er åpen...
00095         running = true;
00096         double n = 2;
00097         double Y = 1;
00098         for(int k=1; k<=i; k++) Y = Y*n;
00099         if( Y == AlarmUtganger2 ) AlarmUtganger2 = AlarmUtganger2 - Y;
00100         if( Y!=AlarmUtganger1) AlarmUtganger1 = Y + AlarmUtganger1; //Sjekk om denne verdien har blitt sjekket før, hvis ikke starter alarm på neste dør.
00101     }
00102     if(tilstand == 2) { //Hvis dør 2 er åpen...
00103         running = true;
00104         double n = 2;
00105         double Y = 1;
00106         for(int k=1; k<=i; k++) Y = Y*n;
00107         if( Y == AlarmUtganger1 ) AlarmUtganger1 = AlarmUtganger1 - Y;
00108         if( Y!=AlarmUtganger2) AlarmUtganger2 = Y + AlarmUtganger2;  //Sjekk om denne verdien har blitt sjekket før, hvis ikke starter alarm på neste dør.
00109     }
00110     if(tilstand == 3) { //Hvis begge dører er åpne
00111         running = true;
00112         double n = 2; // We want 2^i
00113         double Y = 1;
00114         for(int k=1; k<=i; k++) Y = Y*n;
00115         if( Y!=AlarmUtganger1 ) AlarmUtganger1 = Y + AlarmUtganger1;
00116         if( Y!=AlarmUtganger2 ) AlarmUtganger2 = Y + AlarmUtganger2;
00117     }
00118     return 0;
00119 }
00120 
00121 int log_to_file(int i, int tilstand)
00122 {
00123     int p;
00124     FILE *fp = fopen("/local/log.txt", "w" ) ;
00125     if(fp != NULL) {
00126         if ((tilstand == 1) && (p != 1)) {
00127             fprintf(fp,"Sone %d, dor 1 er aapen \n",i);
00128             fprintf(fp,"Tid:%f siden start \n",t.read());
00129             p = 1;
00130         }
00131 
00132         if ((tilstand == 2) && (p != 2)) {
00133             fprintf(fp,"Sone %d, dor 2 er lukket \n",i);
00134             fprintf(fp,"Tid:%f siden start \n",t.read());
00135             p = 2;
00136         }
00137         if ((tilstand == 3) && (p != 3)) {
00138             fprintf(fp,"Sone %d dor 1 og 2 er lukket \n",i);
00139             fprintf(fp,"Tid:%f siden start \n",t.read());
00140             p = 3;
00141         }
00142     }
00143     return 0;
00144 }
00145 
00146 void sone_monitor()
00147 {
00148     Soner[0] = _Sone1;
00149     //Soner[1] = _Sone2;
00150     //Soner[2] = _Sone3;
00151     //Soner[3] = _Sone4;
00152     for(int i=0; i < Inn; i++) {
00153         if((Soner[i] > 0.75 )&&( Soner[i] < 0.83)) { //Tilstand1, Dør 1 åpen
00154             //pc.printf("Vi er i Tilstand1\n");
00155             tilstand = 1;
00156             TilstandSjekk(i, tilstand);
00157         }
00158         if((Soner[i] > 0.55 )&&( Soner[i] < 0.59)) { //Normaldrift
00159             tilstand = 0;
00160             TilstandSjekk(i, tilstand);
00161         }
00162         if((Soner[i] > 0.65 )&&( Soner[i] < 0.69)) { //Tilstand2, Dør 2 åpen
00163             tilstand = 2;
00164             TilstandSjekk(i, tilstand);
00165         }
00166         if(Soner[i] >= 1) { //Tilstand 3, Begge dører er åpen
00167             tilstand = 3;
00168             TilstandSjekk(i, tilstand);
00169         }
00170     }
00171 }
00172 void admin_access_granted()
00173 {
00174     admin = true;
00175     pc.printf("Admin access granted\n");//info
00176     pc.printf("Folgende kommandoer kan brukes: \n");// liste over funksjoner tilgjenglig.
00177     pc.printf("Status sone og dor(sone forst, dor etter) Kommando: 1,2 \n");// funksjon 1 - request spesific status
00178     pc.printf("Status alle soner og dorer. Kommando: Status \n");// funksjon 1 - request status all
00179     pc.printf("Reset hele systemet. Kommando: 'Reset' \n");// funksjon 4 - request log all
00180 }
00181 
00182 void password_check()
00183 {
00184     if(pc.readable() == 1) {
00185         pc.printf("Write password: ");
00186         string b;
00187         char s;
00188         for(int i = 0; i < 5; i++) {
00189             s = pc.getc();
00190             pc.printf("%c", s);
00191             b += s;
00192             if(b == password) {
00193                 admin_access_granted();
00194             }
00195         }
00196     }
00197 }
00198 
00199 void read_keyinput()
00200 {
00201     if(pc.readable() == 1) {
00202         pc.printf("\nDu skriver: ");
00203         string read;
00204         char c;
00205         for(int i = 0; i < 6; i++) {
00206             c = pc.getc();
00207             pc.printf("%c ", c);
00208             read += c;
00209             if( read == ("1, 1")) request_status_sone_dor(1, 1);
00210             if( read == ("1, 2")) request_status_sone_dor(1, 2);
00211             if( read == ("2, 1")) request_status_sone_dor(2, 1);
00212             if( read == ("2, 2")) request_status_sone_dor(2, 2);
00213             if( read == ("3, 1")) request_status_sone_dor(3, 1);
00214             if( read == ("3, 2")) request_status_sone_dor(3, 2);
00215             if( read == ("4, 1")) request_status_sone_dor(4, 1);
00216             if( read == ("4, 2")) request_status_sone_dor(4, 2);
00217             if( read == ("Status")) request_status();
00218             if( read == ("Stop")) while(1){ fclose(fp); }
00219             if( read == ("Reset")) {
00220                 fclose(fp);
00221                 mbed_reset();
00222             }
00223         }
00224     }
00225 }
00226 
00227 
00228 void request_status_sone_dor(int sone, int dor)
00229 {
00230     int n = 2;
00231     for(int i = 0; i <= 16;) {
00232         if(i == 0) i = 1;
00233         else i = i * n;
00234         if(sone == i) {
00235             if(dor == 1) {
00236                 if(AlarmUtganger1 == sone) pc.printf("Dor: %d i sone: %d er apnet \n", dor, sone);
00237                 else pc.printf("Dor: %d i sone: %d er lukket \n", dor, sone);
00238             }
00239             if(dor == 2) {
00240                 if(AlarmUtganger2 == sone) pc.printf("Dor: %d i sone: %d er apnet \n", dor, sone);
00241                 else pc.printf("Dor: %d i sone: %d er lukket \n", dor, sone);
00242             }
00243         }
00244     }
00245 }
00246 
00247 void request_status()
00248 {
00249     int sone = 0;
00250     int n = 2;
00251     for(int i = 0; i <= 8;) {
00252         sone = sone + sone;
00253         if(i == 0) i = 1;
00254         else i = i*n;
00255         if(AlarmUtganger1 == i) pc.printf("Dor: 1 i Sone: %d er apent \n", sone);
00256         else pc.printf("Dor: 1 i Sone: %d er lukket \n", i);
00257         if(AlarmUtganger2 == i) pc.printf("Dor: 2 i Sone: %d er apent \n", sone);
00258         else pc.printf("Dor: 2 i Sone: %d er lukket \n", i);
00259     }
00260 }