Updated

Dependents:   PROJECTTEST

Files at this revision

API Documentation at this revision

Comitter:
Swabey89
Date:
Sat Jan 05 15:02:27 2019 +0000
Commit message:
Updated

Changed in this revision

sample_hardware.cpp Show annotated file Show diff for this revision Revisions of this file
sample_hardware.hpp Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r dbd6284a9f1b sample_hardware.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample_hardware.cpp	Sat Jan 05 15:02:27 2019 +0000
@@ -0,0 +1,235 @@
+#include "sample_hardware.hpp"
+
+#define RED_DONE 1
+#define YELLOW_DONE 2
+
+//Digital outputs
+DigitalOut onBoardLED(LED1);
+DigitalOut redLED(PE_15);
+DigitalOut yellowLED(PB_10);
+DigitalOut greenLED(PB_11);
+
+//Inputs
+DigitalIn  onBoardSwitch(USER_BUTTON);
+DigitalIn  SW1(PE_12);
+DigitalIn  SW2(PE_14);
+AnalogIn 	adcIn(PA_0);
+
+//Environmental Sensor driver
+#ifdef BME
+BME280 sensor(D14, D15);
+#else
+BMP280 sensor(I2C_SDA, I2C_SCL);
+#endif
+
+//LCD Driver (provided via mbed repository)
+//RS D9
+//E  D8
+//D7,6,4,2 are the 4 bit for d4-7
+TextLCD lcd(D9, D8, D7, D6, D4, D2); // rs, e, d4-d7
+
+//SD Card
+SDBlockDevice sd(PB_5, D12, D13, D10); // mosi, miso, sclk, cs
+
+sensorData buffer[BUFFERSIZE];
+
+FATFileSystem* fs;
+
+//POWER ON SELF TEST
+void post() 
+{
+	
+		seconds = time(NULL);
+		timeData = localtime(&seconds);
+		set_time(mktime(timeData));	
+	
+    //POWER ON TEST (POT)
+    pc->printf("**********STARTING POWER ON SELF TEST (POST)**********\n\r");
+    
+    //Test LEDs
+    pc->printf("ALL LEDs should be blinking\n\r");
+    for (unsigned int n=0; n<10; n++) {
+        redLED    = 1;
+        yellowLED = 1;
+        greenLED  = 1;
+        wait(0.05);
+        redLED    = 0;
+        yellowLED = 0;
+        greenLED  = 0;     
+        wait(0.05);         
+    } 
+    
+    //Output the switch states (hold them down to test)
+    pc->printf("SW1: %d\tSW2: %d\n\r", SW1.read(), SW2.read());    
+    pc->printf("USER: %d\n\r", onBoardSwitch.read()); 
+    
+    //Output the ADC
+    pc->printf("ADC: %f\n\r", adcIn.read());
+    
+    //Read Sensors (I2C)
+    float temp = sensor.getTemperature();
+    float pressure = sensor.getPressure();
+    #ifdef BME
+    float humidity = sensor.getHumidity();
+    #endif
+   
+    //Display in PuTTY
+    pc->printf("Temperature: %5.1f\n\r", temp);
+    pc->printf("Pressure: %5.1f\n\r", pressure);
+    #ifdef BME
+    pc->printf("Pressure: %5.1f\n\r", humidity);
+    #endif
+    
+    //Display on LCD
+    redLED = 1;
+    lcd.cls();
+    lcd.printf("DISPLAY TEST...");
+    wait(0.5);
+    redLED = 0;
+    pc->puts("**********POST END**********\r\n\n");
+    
+    pc->puts("READY FOR COMMANDS\n\r");
+    pc->puts("READ ALL/<N>    	: Read samples\r\n");
+    pc->puts("DELETE ALL/<N>  	: Delete samples\r\n");
+    pc->puts("SETDATE DDMMYYYY	: Set the date\r\n");
+    pc->puts("SETTIME HHMMSS  	: Set the time\r\n");
+    pc->puts("SETT <T>        	: Set the sampling rate (15s)\r\n");
+    pc->puts("STATE <X>       	: Toggle sampling on/off (off)\r\n");
+    pc->puts("LOGGING <X>     	: Toggle logging on/off (off)\r\n\n");
+ 
+		pc->puts("PLEASE UPDATE DATE AND TIME IF REQUIRED\r\n");
+		pc->printf("CURRENT DATE AND TIME : %s\r\n", ctime(&seconds));
+}
+
+void errorCode(ELEC350_ERROR_CODE err)
+{
+    switch (err) {
+      case OK:
+        greenLED = 1;
+        wait(1.0);
+        greenLED = 0;
+        return;                
+      case FATAL:
+        while(1) {
+            redLED = 1;
+            wait(0.1);
+            redLED = 0;
+            wait(0.1);                
+        }
+    }
+}
+
+void sampleProducer()
+{
+    while(true)
+    {
+        //High priority thread 
+        Thread::signal_wait(TAKE_SAMPLE);
+    
+        Nspaces = spaceAvailable.wait(0); //Non-blocking
+        bufferLock.lock();
+        producer_tout.attach(producer_toutISR, TOUT_TIME_DEF);
+               
+        //Update buffer           
+        if ((newestIndex == oldestIndex) && (Nspaces==0))
+        {
+            oldestIndex = (oldestIndex+1) % BUFFERSIZE;     
+        }
+            
+        newestIndex = (newestIndex+1) % BUFFERSIZE;  //CIRCULAR 
+         
+        double temp_r = sensor.getTemperature();
+        double press_r = sensor.getPressure();
+        float light_r = adcIn.read();
+        
+        buffer[newestIndex].updatetemp(temp_r);
+        buffer[newestIndex].updatepress(press_r);
+        buffer[newestIndex].updatelight(light_r);
+        buffer[newestIndex].updateTime();
+               
+        if (Nspaces != 0)
+        {   
+            Nspaces--;            
+        } 
+          
+        samplesInBuffer.release();
+
+        if(logging)
+        {
+            printQueue.call(printf, "Sample placed in buffer at position %d\r\nNumber of spaces available in buffer:%d\r\n\n", newestIndex, Nspaces); 
+        }
+        
+        bufferLock.unlock();
+        producer_tout.detach();
+    }
+}
+
+void sampleConsumer()
+{
+    while(true)
+    {
+        //write to the SD card from oldestindex up to newestIndex.
+        
+        Nsamples = samplesInBuffer.wait(); //Block if no samples to take - acquires
+        
+        bufferLock.lock();
+        consumer_tout.attach(consumer_toutISR,TOUT_TIME_DEF);
+        if (sd_init)
+        {      
+                oldestIndex = (oldestIndex+1) % BUFFERSIZE;                        
+                SDqueue.call(SDaddSample,buffer[oldestIndex].getTime(), buffer[oldestIndex].gettemp(), buffer[oldestIndex].getpress(), buffer[oldestIndex].getlight(), oldestIndex);                
+        }      
+        else
+        {
+            samplesInBuffer.release();   
+        } 
+        bufferLock.unlock();
+        consumer_tout.detach();     
+    }       
+    
+}
+
+void sampleISR()
+{
+    producer_thread.signal_set(TAKE_SAMPLE);   
+}
+
+void producer_toutISR(void)
+{
+    threadstates |= PRODUCER;
+}
+
+void consumer_toutISR(void)
+{
+    threadstates |= CONSUMER;   
+}
+
+/*SensorData Class Definitions*/
+
+sensorData::sensorData(void)
+{
+		this->temperature = 0;
+		this->pressure = 0;
+		this->lightlevel = 0;
+		this->time_str = "";
+}
+void sensorData::updateTime()
+{
+		string t;
+		time_t seconds; 
+		timeLock.lock();
+		seconds = time(NULL);            
+		t = ctime(&seconds);
+		timeLock.unlock();
+		t = t.substr(0,t.length()-1);
+		this->time_str = t; 
+		
+}
+void sensorData::updatetemp(double t) {this->temperature = t;}
+void sensorData::updatepress(double p) {this->pressure = p;}
+void sensorData::updatelight(float l) {this->lightlevel = l;}
+double sensorData::gettemp(void) {return this->temperature;}
+double sensorData::getpress(void) {return this->pressure;}
+float sensorData::getlight(void) {return this->lightlevel;}  
+string sensorData::getTime(void) {return this->time_str;}
+
diff -r 000000000000 -r dbd6284a9f1b sample_hardware.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sample_hardware.hpp	Sat Jan 05 15:02:27 2019 +0000
@@ -0,0 +1,71 @@
+#ifndef __sample_hardware__
+#define __sample_hardware__
+
+#include "main.h"
+#include "SDCard.hpp"
+
+//#define BME
+#ifdef BME
+#include "BME280.h"
+#else
+#include "BMP280.h"
+#endif
+#include "TextLCD.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+#include <string>
+
+class sensorData
+{
+    private:
+        double temperature;
+        double pressure;
+        float  lightlevel;
+        string time_str;
+    public:
+        sensorData(void);
+        void updatetemp(double t);        
+        void updatepress(double p);        
+        void updatelight(float l);        
+        void updateTime();        
+        double gettemp(void);        
+        double getpress(void);        
+        float getlight(void);        
+        string getTime(void);
+};
+
+extern sensorData buffer[BUFFERSIZE];
+
+enum ELEC350_ERROR_CODE {OK, FATAL};
+
+extern RawSerial* pc;
+extern DigitalOut onBoardLED;
+extern DigitalOut redLED;
+extern DigitalOut yellowLED;
+extern DigitalOut greenLED;
+
+extern DigitalIn  onBoardSwitch;
+extern DigitalIn  SW1;
+extern DigitalIn  SW2;
+extern AnalogIn adcIn;
+
+extern FATFileSystem* fs;
+
+#ifdef BME
+extern BME280 sensor;
+#else
+extern BMP280 sensor;
+#endif
+
+extern TextLCD lcd;
+extern SDBlockDevice sd;
+
+extern void post();
+extern void errorCode(ELEC350_ERROR_CODE err);
+extern void sampleProducer();
+extern void sampleConsumer();
+extern void sampleISR();
+extern void producer_toutISR(void);
+extern void consumer_toutISR(void);
+
+#endif
\ No newline at end of file