SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Revision:
9:5e9c4277151d
Parent:
7:8065e844e99a
Child:
10:f14f47225091
--- a/main.cpp	Sat Apr 29 15:16:10 2017 +0000
+++ b/main.cpp	Mon May 08 07:20:54 2017 +0000
@@ -1,223 +1,149 @@
 #include "mbed.h"
 #include "rtos.h"
-#include "ds3231.h"
-#include "DHT.h"
-
-#define ESC 0x1B
 
-#define I2C_SDA D14
-#define I2C_SCL D15
-#define DHT_EN_PIN D7
-#define DHT_PIN D6
-#define M_DIR_PIN D4
-#define M_SPE_PIN D5
+#include "main.h"
+#include "real_time_clock.h"
+#include "temp_hum_sensor.h"
 
-void setupRTC();
-void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member);
-void get_user_input(char* message, uint8_t min, uint8_t max, bool* member);
-int readDHT(float* temperature, float* humidity, float* dewPoint);
-int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint);
-int setMotor(int direction, double speed);
-void wakeupFromRTC(void);
+#define TASKS_NUMBER    (sizeof(taskList)/sizeof(taskList[0]))
 
-Ds3231 rtc(D14, D15);
-
-PwmOut m_speed(D4);
-DigitalOut m_direction(D5);
-
-DHT DHTSensor(D6, DHT11);
-DigitalOut DHTEnable(D7);
-
-InterruptIn iRTC(D8);
+Mutex mutexData;
+SensorData data;
+Mutex mutexPCComm;
+Serial pc(USBTX,USBRX);
+volatile bool sensors_running = false;
 
-int main(void)
-{
-    int measureError = 0;
-    float temperature = 0.0,  humidity = 0.0,  dewPoint = 0.0;
-    int motorDirection = 0;
-    double motorSpeed = 0.0;
-    char buffer[32];
-    time_t ts;
+static struct task_definition_struct taskList[] = {
+    { temp_hum_thread,    &temp_hum_init, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+    //{ nodeComm_thread,    &initNodeComm, NULL, NULL, osPriorityNormal, 100, NULL, 0 }
+};
 
-    //setupRTC();
 
-    iRTC.rise(wakeupFromRTC);
-
+int main()
+{
+    pc.baud(9600);
+    mutexPCComm.lock();
+    pc.printf("MAIN: init\n");
+    mutexPCComm.unlock();
+    // Init RTC
+    time_t epoch_time;
+    epoch_time = rtc.get_epoch();
+    // Reset all data status
+    mutexData.lock();
+    data.DHTError = -128;
+    mutexData.unlock();
+    // Init all tasks
+    initTasks();
     while(true) {
-        //printf("%c[2J", ESC); //clear screen
-        sleep();
-        ts = rtc.get_epoch();
-        measureError = measure(&ts,&temperature,&humidity,&dewPoint);
+        // Start all threads
+        sensors_running = true;
+        for (int i = 0; i < TASKS_NUMBER; i++) {
+            if (taskList[i].retVal == 1) {
+                taskList[i].thread->signal_set(0x1);
+                Thread::wait(taskList[i].delay);
+                taskList[i].thread->signal_clr(0x1);
+            }
+        }
+        publishSensorData();
+        // Stop all remain tasks
+        sensors_running = false;
+        Thread::wait(10000);
+    }
+}
 
-        if(!measureError) {
-                printf("\nTime as seconds since January 1, 1970 = %d\n", ts);
-                printf("Temperature in Celcius: %4.2f\n", temperature);
-                printf("Humidity is %4.2f, Dewpoint: %4.2f\n", humidity, dewPoint);
-                setMotor(motorDirection, motorSpeed);
-        }
-        wait(1);
-    }//loop
-}
-int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint)
+int publishSensorData(void)
 {
-    int DHTError = 0;
-    *ts = rtc.get_epoch();
-    if(*ts<=0)
-        return 1;
-    DHTError = readDHT( temperature, humidity, dewPoint);
-    if(DHTError) {
-        printf("DHTError: %d\n", DHTError);
-        return 2;
+    Timer t;
+    int error = -1;
+    t.reset();
+    t.start();
+    while(error != 0 && t.read()<MAX_TIME_TO_WAIT_NODE_COMM) {
+        mutexData.lock();
+        // Check if all data are valid
+        error = data.DHTError;
+        if( error == 0) {
+            // Send all info
+            mutexPCComm.lock();
+            pc.printf("Temp\t%f\n",data.temperature);
+            pc.printf("Hum\t%f\n",data.humidity);
+            pc.printf("DewP\t%f\n",data.dewPoint);
+            mutexPCComm.unlock();
+        }
+        mutexData.unlock();
+        if(error!=0) {
+            Thread::wait(3000);
+        }
+        mutexPCComm.lock();
+        pc.printf("MAIN: req data\t%f\n",t.read());
+        mutexPCComm.unlock();
+    } // while
+    t.stop();
+    // Send valid info only
+    if(error!=0) {
+        mutexData.lock();
+        if( data.DHTError == 0) {
+            mutexPCComm.lock();
+            pc.printf("Temp:\t%f\n",data.temperature);
+            pc.printf("Hum:\t%f\n",data.humidity);
+            pc.printf("DewP:\t%f\n",data.dewPoint);
+            pc.printf("DHTError:\t%d\n",data.DHTError);
+            mutexPCComm.unlock();
+        } else {
+            mutexPCComm.lock();
+            pc.printf("DHTError:\t%d\n",data.DHTError);
+            mutexPCComm.unlock();
+        }
+        mutexData.unlock();
     }
-    return 0;
-
-}
-int readDHT(float* temperature, float* humidity, float* dewPoint)
-{
-    int error = 0;
-    DHTEnable = 1;
-    wait(2);
-    error = DHTSensor.readData();
-    if (0 == error) {
-        *temperature = DHTSensor.ReadTemperature(CELCIUS);
-        *humidity = DHTSensor.ReadHumidity();
-        *dewPoint = DHTSensor.CalcdewPoint(*temperature, *humidity);
-    }
-    DHTEnable=0;
+    // Reset all data status
+    mutexData.lock();
+    data.DHTError = -128;
+    mutexData.unlock();
     return error;
 }
 
-int setMotor(int direction, double speed)
-{
-    if(speed<0 or speed>255)
-        return 1;
-    else {
-        m_speed = speed;
-        if(direction)
-            m_direction=1;
-        else
-            m_direction=0;
-    }
-    return 0;
-}
-
-void setupRTC()
-{
-
-    //default, use bit masks in ds3231.h for desired operation
-    ds3231_cntl_stat_t rtc_control_status = {0,0};
-    ds3231_time_t rtc_time;
-    ds3231_calendar_t rtc_calendar;
-
-    rtc.set_cntl_stat_reg(rtc_control_status);
-
-    //get day from user
-    get_user_input("\nPlease enter day of week, 1 for Sunday (1-7): ", 1,
-                   7, &rtc_calendar.day);
-
-    //get day of month from user
-    get_user_input("\nPlease enter day of month (1-31): ", 1, 31,
-                   &rtc_calendar.date);
-
-    //get month from user
-    get_user_input("\nPlease enter the month, 1 for January (1-12): ", 1,
-                   12, &rtc_calendar.month);
-
-    //get year from user
-    get_user_input("\nPlease enter the year (0-99): ",0, 99,
-                   &rtc_calendar.year);
-
-    //Get time mode
-    get_user_input("\nWhat time mode? 1 for 12hr 0 for 24hr: ", 0, 1,
-                   &rtc_time.mode);
-
-    if(rtc_time.mode) {
-        //Get AM/PM status
-        get_user_input("\nIs it AM or PM? 0 for AM 1 for PM: ", 0, 1,
-                       &rtc_time.am_pm);
-        //Get hour from user
-        get_user_input("\nPlease enter the hour (1-12): ", 1, 12,
-                       &rtc_time.hours);
-    } else {
-        //Get hour from user
-        get_user_input("\nPlease enter the hour (0-23): ", 0, 23,
-                       &rtc_time.hours);
-    }
-
-    //Get minutes from user
-    get_user_input("\nPlease enter the minute (0-59): ", 0, 59,
-                   &rtc_time.minutes);
-
-
-    //Get seconds from user
-    get_user_input("\nPlease enter the second (0-59): ", 0, 59,
-                   &rtc_time.seconds);
 
 
+static uint32_t initTasks(void)
+{
+    uint32_t i;
+    uint32_t retval = 1;
 
-    //Set the time, uses inverted logic for return value
-    if(rtc.set_time(rtc_time)) {
-        printf("\nrtc.set_time failed!!\n");
-        exit(0);
-    }
-
-    //Set the calendar, uses inverted logic for return value
-    if(rtc.set_calendar(rtc_calendar)) {
-        printf("\nrtc.set_calendar failed!!\n");
-        exit(0);
+    mutexPCComm.lock();
+    pc.printf("initTasks: init\n");
+    mutexPCComm.unlock();
+    for (i = 0; i < TASKS_NUMBER; i++) {
+        mutexPCComm.lock();
+        pc.printf("initTasks: %d\n",i);
+        mutexPCComm.unlock();
+        if (taskList[i].init != NULL) {
+            if ((taskList[i].retVal = ((*taskList[i].init)(taskList[i].init_args))) == 0)
+                retval = 0;
+        } else {
+            taskList[i].retVal = 1;
+        }
     }
 
-
-}
-
-/**********************************************************************
-* Function: get_user_input()
-* Parameters: message - user prompt
-*             min - minimum value of input
-*             max - maximum value of input
-*             member - pointer to struct member
-* Returns: none
-*
-* Description: get time/date input from user
-*
-**********************************************************************/
-void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member)
-{
-    uint32_t temp;
-
-    do {
-        printf("\n%s", message);
-
-        //for some reason mbed doesn't like a pointer to a member in scanf
-        //term.scanf("%d", member); works with gcc on RPi
-        scanf("%d", &temp);
-
-        *member = temp;
+    for (i = 0; i < TASKS_NUMBER; i++) {
+        mutexPCComm.lock();
+        pc.printf("initTasks: start %d\n",i);
+        mutexPCComm.unlock();
+        Thread::wait(taskList[i].delay);
 
-        if((*(member)< min) || (*(member) > max)) {
-            printf("\nERROR-RTI");
+        mutexPCComm.lock();
+        pc.printf("initTasks: su1 %d\n",retval);
+        mutexPCComm.unlock();
+        if (taskList[i].retVal == 1) {
+            taskList[i].thread = new Thread(taskList[i].task, taskList[i].task_args, taskList[i].priority);
         }
-    } while((*(member) < min) || (*(member) > max));
-}
-
-
-void get_user_input(char* message, uint8_t min, uint8_t max, bool* member)
-{
-    uint32_t temp;
-
-    do {
-        printf("\n%s", message);
 
-        //for some reason mbed doesn't like a pointer to a member in scanf
-        //term.scanf("%d", member); works with gcc on RPi
-        scanf("%d", &temp);
-
-        *member = temp;
+        mutexPCComm.lock();
+        pc.printf("initTasks: finish su2 %d\n",retval);
+        mutexPCComm.unlock();
+    }
 
-        if((*(member)< min) || (*(member) > max)) {
-            printf("\nERROR-RTI");
-        }
-    } while((*(member) < min) || (*(member) > max));
-}
-void wakeupFromRTC(void){}
-
+    mutexPCComm.lock();
+    pc.printf("initTasks: finish %d\n",retval);
+    mutexPCComm.unlock();
+    return retval;
+}
\ No newline at end of file