SEDO subject project
Dependencies: ds3231 mbed-rtos mbed DHT
Diff: main.cpp
- Revision:
- 9:5e9c4277151d
- Parent:
- 7:8065e844e99a
- Child:
- 10:f14f47225091
diff -r 8d3e14c8d5f1 -r 5e9c4277151d main.cpp --- 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