Bjørn André Nyrud
/
Alarmsystem_rev_innlevering_ferdig
fort test av mbed cli
Fork of Alarmsystem_rev_innlevering by
Revision 18:e06a42c5d2a4, committed 2018-03-09
- Comitter:
- Banyrud
- Date:
- Fri Mar 09 10:49:36 2018 +0000
- Parent:
- 17:f27485b6d16e
- Commit message:
- ferdig;
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r f27485b6d16e -r e06a42c5d2a4 main.cpp --- 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;