fort test av mbed cli

Fork of Alarmsystem_rev_innlevering by Programmeringsgruppe 1

Revision:
18:e06a42c5d2a4
Parent:
17:f27485b6d16e
--- a/main.cpp	Thu Mar 08 22:34:53 2018 +0000
+++ b/main.cpp	Fri Mar 09 10:49:36 2018 +0000
@@ -1,48 +1,77 @@
-#include "mbed.h"
-#include "rtos.h"
-#include <string>
-#include <stdio.h>
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////BIBLIOTEK//////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+#include "mbed.h"         //Standard bibliotek for mbed
+#include "rtos.h"         //OS-5 embed bibliotek for og få benyttet thread - funksjonen.
+#include <string>         //Bibliotek for og kunne benytte strenger.
+#include <stdio.h>        //Bibliotek for og kunne logge til tekstfil i c++.
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////DEFINISJONER///////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-/////DEFINISJONER/////
-#define Inn 4
-Serial pc(USBTX, USBRX);
-LocalFileSystem local("local");
+
+#define Inn 4                      //Hensikt: Hvis vi skriver "Inn" skriver vi egentlig tallet 4.
+Serial pc(USBTX, USBRX);           //Hensikt: Lage en krets med datamaskinen igjennom USB porten, så vi kan utføre forskjellige ting igjennom f.eks tera-term.
+LocalFileSystem local("local");    //Hensikt: Kunne skrive lokalt i en tekst fil i lagringssystemet til mbed.
+
 
-/////INNGANGER/////
-DigitalIn Servicebryter(p20);
-AnalogIn _Sone1(p15);
-AnalogIn _Sone2(p16);
-AnalogIn _Sone3(p17);
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////INNGANGER//////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+DigitalIn Servicebryter(p20);  //Hensikt: Deklarere en bryter, som skal virke som en "innelåst bryter".
+AnalogIn _Sone1(p15);          
+AnalogIn _Sone2(p16);          //Hensikt: Deklarasjon av soner, som fungerer ved at det er 2 dører som er koblet i parallell med motstander,
+AnalogIn _Sone3(p17);          //              og får dermed inn en voltverdi i inngangen som videre sier noe om hvilken tilstand dørene er i. (åpen / lukket)
 AnalogIn _Sone4(p19);
 
-/////UTGANGER/////
-DigitalOut Driftslys(LED1);
-DigitalOut Utganger[8] = {p21, p22, p23, p24, p25,p26,p27,p28};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////UTGANGER///////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+DigitalOut Driftslys(LED1);            //Hensikt: Deklarere utgangen Driftslys som skal bli brukt som både alarm (10Hz blinking) og lyse konstant under normaldrift.
+DigitalOut Utganger[8] = {p21, p22, p23, p24, p25,p26,p27,p28}; //Hensikt: Deklarere alle lys i en tabell, lysene skal lyse etter hvilket punkt det er alarm på.
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////VARIABLER//////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
 
-/////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;
+float Soner[Inn];                  //Hensikt: Deklarere en tabell som vi senere skal legge alle verdiene til de forskjellige sonene inn i.                  
+int tilstand[8]= {};               //Hensikt: Sette inn de forskjellige tilstandene til dørene inn i en tabell.
+int minne[8] = {};                 //Hensikt: Lagre tilstandene i en annen tabell etter en test, for og sjekke om det er en ny endring i tabellen.
+volatile bool running = true;      //Hensikt: Sette funksjonen alarmf i else setning; dvs få lyset (LED1) til og lyse konstant.
+volatile bool admin = false;       //Hensikt: Sjekker om vi har skrevet inn passord for og starte anlegget.
+volatile bool start = false;       //Hensikt: Sjekker om vi har skrevet inn "Start" på tasturet, for og starte alarmanlegget.
+volatile bool stopp = true;        //Hensikt: Sjekker om vi har skrevet inn "Stopp" på tasturet, for og stoppe alarmanlegget.
+string passord = ("admin");        //Hensikt: Legge inn "admin" inn i en streng som er passordet til anlegget
+string start_kommando = ("start"); //Hensikt: Legge inn "start" inn i en streng som er strengen for starte anlegget.
+string stopp_kommando = ("stopp"); //Hensikt: Legge inn "stopp" inn i en streng som er strengen for og stoppe anlegget.
+Timer t;                           //Hensikt: Deklarere en timer, som skal skal sjekke tiden som har gått etter oppstart.
+int v = 0;                         //Hensikt: Printe til datamaskinen en gang, når man blir sendt inn i funksjonen password_check. ("Skriv Passord: ")
 
-/////FUNKSJON DEKLARASJONER/////
-void Alarmf();
-Thread Alarm;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////FUNKSJON DEKLARASJONER///////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+           
+                                 
+void Alarmf();                   // Hensikten til funksjonene er beskrevet nærmere ovenfor funksjonen, deklarasjoner skal bare vise compileren at funksjonene kommer
+Thread Alarm;                    //      senere i programmet vårt.
 Thread Read;
 void admin_access_granted();
 void sone_monitor();
 int log_to_file(int, int);
 void password_check();
-void read_keyinput();
+void compare_commands();
 void start_sys();
 void stopp_sys();
 int logg_start();
@@ -50,81 +79,107 @@
 int request_status_sys();
 int request_status_alarm(int);
 int TilstandSjekk();
-extern "C" void mbed_reset();
+extern "C" void mbed_reset();    //Hensikt: Kunne resete alarmsystemet 100% igjennom tastaturet. Dette er en standard funksjon i mbed.
+
 
-/////MAIN/////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////MAIN//////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+//Hensikt: Starte funksjoner kontinuerlig i en while løkke utifra de globale variablene våre. Vi sjekker også om servicebryteren er aktivert, og vi vil da sette
+//              programmet inn i "innelåst - modus" og resete alarmene. Man har da 10 sekunder på og komme seg ut, før alarmene reaktiverer seg.
+
 int main()
 {
-    Read.start(password_check);// here stod den når vi brukte (read_keyinput)
+    Read.start(password_check);
     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.
+        if(Servicebryter == 1) {  // "Innelåst - Modus"
+            TilstandSjekk();
             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);
+            wait(15);
         }
-        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);
+        while((admin) && (Servicebryter == 0)&&(start == true) && (stopp == false)) { // Sjekker globale variabler, for deretter og starte alarmsystemet.
+            Alarm.start(Alarmf);//Denne funksjonen starter Alarmf i en tråd, dvs at denne går kontinuerlig og ikke stopper opp programmet.
+            sone_monitor();
+            wait(0.1);          //Vi benytter en wait funksjon for og få programmet til og fungere, hvis denne ikke er tilstede vil ikke programmet fungere korrekt.
             TilstandSjekk();
         }
     }
 }
 
 
-/////FUNKSJONER/////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////FUNKSJONER////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+//Hensikt: Få et lys til og lyse når alarmanlegget er i normaldrift.
+//         Hvis alarmanlegget er i alarm-modus skal lyset blinke med en frekvens på 10 Hz.
+//         Denne funksjonen blir kalt opp av en thread, som betyr at den kjører kontinuerlig seperat av andre 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.
+        if(running == true) {  // Beskrivelse: 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.
+            Thread::wait(20);  //Som vanlig wait funksjon, bare litt annen skrivemåte i thread biblioteket i OS5.
+        } else {               // Hensikt: Hvis vi er i normaldrift driftlyset lyse kontinuerlig.
             Driftslys = 1;
         }
     }
 }
 
+//Hensikt: Legge måleresultater over motstandene inn i en tabell som videre setter korrekte tilstander inn i en annen tabell.
+
 void sone_monitor()
 {
-    //Først legger vi de forskjellige sonene inn i en tabell.
+    //Legger først 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;
+    for(int i = 0, x = 0; i < 4; i++,x+=2) {              //Hensikt: Sjekker en og en sone.
+        if( (Soner[i] > 0.35 ) && ( Soner[i] < 0.45) ) {  //Normaldrift: Begge dører lukket. utregnedt verdi: 0.4.
+            tilstand[x] = 0;            
             tilstand[x+1] = 0;
         }
-        if( (Soner[i] > 0.6 ) && ( Soner[i] < 0.7) ) { //Tilstand1, Dør 1 åpen
+        if( (Soner[i] > 0.6 ) && ( Soner[i] < 0.7) ) {    //Tilstand1: Dør 1 åpen. Utregnet verdi: 0.65
             tilstand[x] = 1;
             tilstand[x+1] = 0;
             running = true;
         }
-        if( (Soner[i] > 0.46 ) && ( Soner[i] < 0.55) ) { //Tilstand2, Dør 2 åpen
+        if( (Soner[i] > 0.46 ) && ( Soner[i] < 0.55) ) {  //Tilstand2: Dør 2 åpen. Utregnet verdi: 0.5
             tilstand[x] = 0;
             tilstand[x+1] = 1;
             running = true;
         }
-        if( (Soner[i] > 0.9) ) { //Tilstand 3, Begge dører er åpen
+        if( (Soner[i] > 0.9) ) {                          //Tilstand 3: Begge dører er åpene. Utregnet verdi: 1. 
             tilstand[x] = 1;
             tilstand[x+1] = 1;
         }
     }
 }
 
+//Hensikt: Sette utgangsalarmlysene på ettersom tabellen tilstand[i] endrer seg. Sjekker om tilstandene er ulike som minne, hvis det er tilfelle setter vi de ulike
+//               verdiene direkte til alarmutgangs tabellen. Etter dette starter vi log funksjonen for og logge endringen. Hvis den globale variabelen running
+//               ikke er true nullstiller vi alarmutgangene. 
 
-int TilstandSjekk()    // [ x, x+1, x+2, x+3, x+4, x+5, x+6, x+7 ]
+int TilstandSjekk() 
 {
-    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]);
+    if( running == true) {
+        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]);
+            }
+        }
+    } else {
+        for (int i = 0; i < 8; i++) {
+            Utganger[i] = 0;
         }
     }
     return 0;
@@ -143,6 +198,8 @@
 // Alarm 8 har blitt utloost // Dette betyr Sone 4 door 2 //
 ////////////////////////////////////////////////////////////
 
+//Hensikt: Skriver til en tekstfil når en alarm blir utløst. Samtidig som den skriver ned tiden siden anlegget startet.
+
 int log_to_file(int c, int b)   // c er sone, b er tilsand.
 {
     FILE *fp ;
@@ -155,74 +212,99 @@
     return 0;
 }
 
+// Hensikt: Sette globale variabler, som har til hensikt å starte alarmanlegget. 
+//          Minne tabellen som blir sammenlignet med utganger blir også nullstilt i denne funksjonen, for og vite
+//                 om det har vært en alarm før funksjonen startet.
+//          Itillegg skriver den ut en rekke forskjellige kommandoer som kan bli benyttet
+//          til å kjøre forskjellige funksjoner i tera terma / annet program som skriver til pc. 
+
 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();
+    for (int i=0; i<8; i++) {  //Hensikt: Setter alle elementene i tabellen minne til 0, for og nullstille.
+        minne[i] = 0;
+    } 
+    pc.printf("\nAdministrator tilgang innvilget\n");                                //Hensikt: Gi info
+    pc.printf("Folgende kommandoer kan brukes: \n");                                 //Hensikt: Skrive ut en liste over alle funksjoner som er tilgjenglig.
+    pc.printf("Starte overvaaking av systemet. Kommando: 'start' + 'Enter'\n");      //Hensikt: Starter alarmanlegget.
+    pc.printf("Stoppe overvaaking av systemet. Kommando: 'stopp' + 'Enter'\n");      //Hensikt: Stopper alarmanlegget.
+    pc.printf("Status alarm for hver sone. Kommando: 'staa1' + 'Enter' \n");                     //Hensikt: Sjekke om det er en alarm ved et spesifikk punkt.
+    pc.printf("Status alle soner og dorer. Kommando: 'status' + 'Enter' \n");                  //Hensikt: Sjekke statusen til alle dører i alle sonere.
+    pc.printf("Reset hele systemet. Kommando: 'reset' + 'Enter' \n");                          //Hensikt: Resete hele systemet.
+    compare_commands();
 }
 
+//Hensikt: Passordbeskytter alarmsystemet ved hjelp av en string, funksjonen kjører i en thread, som vil si
+//                at denne går kontinuerlig sammen med resten av programmet.
+//         Når passord er riktig tastet inn, vil den alltid sørge for at compare_commands() kommandoen kjører.
+
 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();
+    if(admin == false) {
+        char tastepassord[20];
+        pc.scanf("%s",&tastepassord);
+        int k = strcmp(tastepassord, "passord\0");
+        if(!k) {
+            admin_access_granted();
+        }
+    }
+    while(admin == true) {
+        compare_commands();
     }
 }
 
-void read_keyinput()
+
+//Hensikt: Sjekke inntastet verdi på tastatur oppimot våre funksjoner, for deretter og starte opp funksjoner som utfører 
+//                riktige ting utifra inntastet verdi. Etter hver sjekk vil tabellen bli cleared.
+
+void compare_commands()
 {
     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, "start\0"))start_sys();
+    if(!strcmp(read, "stopp\0")) stopp_sys();
+    if(!strcmp(read, "reset\0")) mbed_reset();
+    if(!strcmp(read, "reqa1\0")) request_status_alarm(1);
+    if(!strcmp(read, "reqa2\0")) request_status_alarm(2);
+    if(!strcmp(read, "reqa3\0")) request_status_alarm(3);
+    if(!strcmp(read, "reqa4\0")) request_status_alarm(4);
+    if(!strcmp(read, "reqa5\0")) request_status_alarm(5); 
+    if(!strcmp(read, "reqa6\0")) request_status_alarm(6);
+    if(!strcmp(read, "reqa7\0")) request_status_alarm(7);
+    if(!strcmp(read, "reqa8\0")) request_status_alarm(8);
+    if(!strcmp(read, "status\0")) request_status_sys();
+    for (int i=0; i<19; i++) {
+        read[i] = 0;
     }
-    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.
+//Hensikt: Starte alarmanlegget og kalle opp logg funksjonen for og logge start.
+
+void start_sys() 
 {
     start = true;
     stopp = false;
-    pc.printf("\nSystemet ble startet\n");
+    pc.printf("Systemet ble startet\n");
     logg_start();
 }
 
-void stopp_sys()    // funksjon som lar systemet stopp opp og kaller opp logg funksjon for og logge stopp.
+//Hensikt: Stopper alarmanlegget ved hjelp av globale variabler og kaller opp logg funksjonen for og logge stopp.
+
+void stopp_sys()
 {
     start = false;
     stopp = true;
-    running = false;
-    pc.printf("\nSystemet ble stoppet\n");
+    pc.printf("Systemet ble stoppet\n");
     logg_stopp();
 }
 
+//Hensikt: Skrive til en fil på pc, når alarmanlegget ble startet i tid fra spenningssetting.
+
 int logg_start()
 {
     FILE *fp ;
@@ -237,6 +319,9 @@
         return 1;
     }
 }
+
+//Hensikt: Skrive til en fil på pc, når alarmanlegget ble stoppet i tid fra spenningssetting.
+
 int logg_stopp()
 {
     FILE *fp ;
@@ -250,6 +335,9 @@
         return 1;
     }
 }
+
+//Hensikt: Skrive til status til alle dører til pc / tera term.
+
 int request_status_alarm(int v)
 {
     switch(v) {
@@ -312,13 +400,16 @@
     }
     return 0;
 }
+
+//Hensikt: Skrive status til alarmpunkt utifra inntastet valg på tastatur.
+
 int request_status_sys()
 {
-    for(int u = 1; u <9; u++) {
+    for(int u = 0; u <8; u++) {
         if(Utganger[u] == 1) {
-            pc.printf("Alarm %d er utloost\n", u);
+            pc.printf("Alarm %d er utloost\n", u+1);
         } else {
-            pc.printf("Alarm %d er ikke utloost\n", u);
+            pc.printf("Alarm %d er ikke utloost\n", u+1);
         }
     }
     return 0;