elec 350 courcework by oscar simons

Dependencies:   BMP280

Fork of Task617-mbedos by University of Plymouth - Stages 1, 2 and 3

Revision:
8:eb72f789f912
Parent:
7:3d054c1a26bf
--- a/main.cpp	Tue Oct 31 15:15:14 2017 +0000
+++ b/main.cpp	Tue Jan 09 19:38:56 2018 +0000
@@ -3,101 +3,167 @@
 #include "string.h"
 #include <stdio.h>
 #include <ctype.h>
-
-#define DELAY 200
+#include "TextLCD.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+#include "sample_hardware.hpp"
+BusOut binaryOutput(A2, A3, A4);
 
-DigitalOut onBoardLED(LED1);
-DigitalOut redLED(PE_15);
-DigitalOut yellowLED(PB_10);
-DigitalOut greenLED(PB_11);
-
-DigitalIn  onBoardSwitch(USER_BUTTON);
-DigitalIn  SW1(PE_12);
-DigitalIn  SW2(PE_14);
+//DigitalIn  onBoardSwitch(USER_BUTTON);
+//DigitalIn  SW1(D12);
+//DigitalIn  SW2(D13);
+Serial pc(USBTX, USBRX);
+Thread t1;  //thread used for thread one witch is the thread responsable for writeing and reading to the pcs serial port
+Thread t2;  //thread used for reading the sensor data from bothe the enviromental sensor and the ldr
+Thread t3;  // thread used to print to the lcd screen
 
 //Thread ID for the Main function (CMSIS API)
-osThreadId tidMain;
-
-//Thread sychronisation primatives
-Mutex lock1;
-Mutex lock2;
-unsigned long sw1Count = 0;
-unsigned long sw2Count = 0;
+osThreadId tidMain; // used only for setting up the main thread is not used after the initial setup and is set so sleep
+osThreadId id1;  //used for thread one witch is the thread responsable for writeing and reading to the pcs serial port
+osThreadId id2;   ///used for reading the sensor data from bothe the enviromental sensor and the ldr
+osThreadId id3;// thread used to print to the lcd screen
 
-void thread1() 
-{
-    printf("Entering thread 1\n");
-    while (true) {
-        yellowLED = 1;
-        
-        //Start critical section
-        lock1.lock();
- 
-        sw1Count++;
-        printf("\nCount1 = %lu", sw1Count);
-        
-        //Thread::wait(1); //1ms
-        
-        if (SW1 == 1) {
-            lock2.lock();
-            sw2Count--;
-            lock2.unlock();   
+SDBlockDevice sd(D11, D12, D13, D10); // mosi, miso, sclk, cs
+    
+TextLCD lcd(A1, A0, D6, D7, D8, D9); // rs, e, d4-d7 //TextLCD lcd(A1, A0, D6, D7, D8, D9); // rs, e, d4-d7
+int waiting = 90;
+float fLDR = 0.0;   //used to log the LDR level this has to be a global varable to be used in bothe threads
+float temp = 0.0;       //used to log the tempreture and has to be global because it is used in two threads
+float pressure = 0.0;   //used to log the presure and has to be global because it is used in two threads
+int i=0;        // this is the number of samples taken from the last reset of the board
+int j=0; // this is used to as a pointer for the sensor readings array
+int k=0;  //used for the user to count the umber of printed cycles befor the used is asked what to do
+int flag_for_debug =0;
+float sensor_readings[101][4];      
+void thread1() //serial comunnicaton and writeing to the LCD screen
+{//create a varable for the recived data to print will also include the serial debbugger and when this is activaled thread must be called every 0.5 secconds
+  pc.printf("if you would like to se all the infomation plese type Y into the keynord if you do not type n");  
+  char choice = pc.getc(); 
+   if(choice == 'y') {
+            pc.printf("all the infomation will be shown\r\r\n");
+            binaryOutput = 1;// this indicates that all of the infomation will be shown
+        }else{
+        pc.printf("only key infomation will be shown\r\r\n");
+        binaryOutput =0;
+        }  
+if (k=100){
+  pc.printf("if you would like to vuie or delete sensor data plese type Y into the keynord to delete the data if you do not type n to vuie all sensor\n\r\n");  
+  char choice3 = pc.getc(); //gets the users choice 
+   if(choice == 'y') {
+            pc.printf("information in the array will now be deleted\r\r\n");
+            delete[] sensor_readings;// this delets all the sensor readings
+        }else{
+        pc.printf("infomation in the array is still stored and is the following\r\r\n");
+    int k=0;
+    for (k=0; k<=101; k++){//for loop is used to increment the sensor
+        pc.printf("\n\r");
+        pc.printf("%f", sensor_readings[k][1]);//prints the reading id number
+        pc.printf("\n\r");
+        pc.printf("%f", sensor_readings[k][2]);//prints the ldr value
+        pc.printf("\n\r");
+        pc.printf("%f", sensor_readings[k][3]);//prints the tempreture value
+        pc.printf("\n\r");
+        pc.printf("%f", sensor_readings[k][4]);//prints the presure value
+       } 
+       k=0;//this is used so that once it reaches 101 sensor samples it will overite the first one saved and be a fifo 
+       }
+        }     
+    
+ pc.printf("plese type whitch sampling rate you would like a=10, b=100, c=200");
+ char choice2 = pc.getc(); // reads in the used input
+   if(choice2 == 'a') { //option for the choice as you can see from the prinf a sets it to 10
+           if(choice == 'y') {
+            pc.printf("you have sussesfully tested 10\r\r\n"); //conferms the users chice
         }
-        
-        //End critical section
-        lock1.unlock();
-        
-        yellowLED = 0;
-        Thread::wait(DELAY);       
-    }
+        waiting = 10;
+        }
+     if(choice2 == 'b'){
+           if(choice == 'y') {//option for the choice as you can see from the prinf a sets it to 100
+               pc.printf("you have sussesfully tested 100\r\r\n");//conferms the users chice
+           }
+        waiting = 100;
+        }
+    if(choice2 == 'c'){
+            waiting = 200;
+               if(choice == 'y') {//option for the choice as you can see from the prinf a sets it to 200
+                  pc.printf("you have sussesfully tested 200\r\r\n");//conferms the users chice
+                }
+        };
+        // aditinal if will alow the user to see and stop so they are sure of the sampling rate befor the start
+       pc.printf("\n\r The sampleing rate is set to");      
+       pc.printf("\n\r %i", waiting);  //prints out to the user what they have selected
+       pc.printf(" nanoseconds \n");  
+       pc.printf("\n\r press enter to continue");   
+       choice2 = pc.getc();  // this means the user can look bak on anythin ther have typed before this
+   while(1){
+    i++;//increments the sample taken
+    if(choice == 'y') {// this only gives some infor then
+            pc.printf("\r\n\r\n");
+            pc.printf("sample number %i \n\n\r", i);    // prints the sample number to the pc scree
+        }         // prints all the values 
+    pc.printf("tLDR = %6.4f\n\n\r", fLDR);      // prints the LDR reading to the screen
+    pc.printf("temp = %6.4f\n\n\r", temp);      //prints the tempreture to the screen
+    pc.printf("presure = %6.4f\n\n\r", pressure);   //prints the presure reading to the screen
+    time_t seconds = time(NULL);            //sets up the timer
+    //printf("Time as seconds since January 1, 1970 = %d\n", seconds); //prints the data
+    //printf("Time as a basic string = %s", ctime(&seconds));// printe the seconds
+    char buffer[32];
+    strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); //gatters the time in a custom format
+    if (choice == 'y'){
+        printf("Time as a custom formatted string = %s", buffer);   // prints the time
+    }// if chouse is n there is no action taken
+    if (choice == 'y'){
+        pc.printf(" infomation has now been sent to the LCD screen \n\n\r");    // this will thell the user when the lcd screen has been updated
+        flag_for_debug = 0; //resets the flag
+    }// if chouse is n there is no action taken
+    k++; // increments print no to the pc screen by one
+   Thread::wait(1.5);// sleep for 1.5 seconds
+   }
 }
 
 void thread2() 
-{
-    printf("Entering thread 2\n");  
-    while (true) {
-        redLED = 1; 
-        
-        //Start critical section
-        lock2.lock();
-        
-        sw2Count++;
-        printf("\nCount2 = %lu", sw2Count);
-        
-        //Thread::wait(1);  //1ms
-        
-        if (SW2 == 1) {
-            lock1.lock();
-            sw1Count--;
-            lock1.unlock();  
-        }  
-        //End critical section
-        lock2.unlock();
-        
-        redLED = 0;
-        Thread::wait(DELAY); 
-    } 
+{//this hapens in real time and is only blocked by the bottom where the time betwen samples is set from thread 1 or as a defult value of 90
+  AnalogIn LDD_ADC_In(A5); //creates the anoalog input for the ldr ciurcit
+  fLDR = 0.0;       //sets the LDr mesurement to 0
+  fLDR = LDD_ADC_In;    // reads in the value from the LDR sensor
+  temp     = sensor.getTemperature();    //reads in the tempreture into a global varable
+  pressure = sensor.getPressure();       //reads in the presure into a gobal varable
+  sensor_readings[i][0] =  i;           //saves the reading number to the array
+  sensor_readings[i][1] =  fLDR;        //saves the LDR value to the array
+  sensor_readings[i][2] =  temp;        //saves the tempreture reading to the array
+  sensor_readings[i][3] =  pressure;        //saves the presure sensor to the array
+  if (i==100){//checks to see if the records has reached 100
+      i=0; //if the records has reached that i is set to 0 so it will start recording over the initial values
+  }
+Thread::wait(waiting); //this thread will then sleep for 15 secconds the sampleing rate should be acurete as the tread has nothing blocking in it
 }
-
-
+ void thread3() //used to write to the LCD screen only this mean that the code dose not waste time printing when it dose not need to 
+ {  // global varable are used to print the sensor data so all LCD printing can happen in one threaad
+   lcd.printf("the data last recived is...... \n");//this is for 11 need to use objects for the enviromental sensors(12)
+   lcd.printf("tLDR = %6.4f\n\n\r", fLDR);      // prints the LDR reading to the screen
+   lcd.printf("temp = %6.4f\n\n\r", temp);      //prints the tempreture to the screen
+   lcd.printf("presure = %6.4f\n\n\r", pressure);   //prints the presure reading to the screen
+   flag_for_debug = 1;//used by another tread to print to a pc screen that the sensors have been writen to the LCD screen
+   Thread::wait(1.5);// sleep for 1.5 seconds     
+ }
 //Main thread
 int main() {
-    redLED    = 0;
-    yellowLED = 0;
-    greenLED  = 0;
-                
-    //Main thread ID
-    tidMain = Thread::gettid();  
-    
-    //Threads
-    Thread t1, t2;
-        
-    t1.start(thread1);
-    t2.start(thread2);
-    
-    printf("Main Thread\n");
+       
+TextLCD lcd(A1, A0, D6, D7, D8, D9);  //TextLCD lcd(A1, A0, D6, D7, D8, D9); // rs, e, d4-d7
+    pc.baud(9600);// sets up a speed to comunicate through the comp port to the pc
+    pc.printf("power on test\r\n");     // this prints to the pc serial port to ensure a conection is established for serial trasmition 
+     lcd.printf("power on test\n"); //prints to the LCD screen this will make sure that it is working 
+
+    t1.start(thread1);       //starts thread one    
+    t2.start(thread2);      //starts thread two
+     t3.start(thread3);     //starts thread 3
+     
+     id1 = t1.gettid();     // sets up tread identified
+    id2 = t2.gettid();      //sets up thread identifier
+    id3 = t3.gettid();      //sets up thread identifier
+   
     while (true) {
-        Thread::wait(osWaitForever);
+        Thread::wait(osWaitForever);    // main thread is now not used ant it will let the other threads take over
     }
 
 }