Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Alarmsystem_log_funksjon_funker_ikke by
Diff: main.cpp
- 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;
