SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Committer:
ValenSalLop
Date:
Mon May 08 07:20:54 2017 +0000
Revision:
9:5e9c4277151d
Parent:
7:8065e844e99a
Child:
10:f14f47225091
RTOS used

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ValenSalLop 0:de99871168ac 1 #include "mbed.h"
ValenSalLop 0:de99871168ac 2 #include "rtos.h"
ValenSalLop 0:de99871168ac 3
ValenSalLop 9:5e9c4277151d 4 #include "main.h"
ValenSalLop 9:5e9c4277151d 5 #include "real_time_clock.h"
ValenSalLop 9:5e9c4277151d 6 #include "temp_hum_sensor.h"
ValenSalLop 0:de99871168ac 7
ValenSalLop 9:5e9c4277151d 8 #define TASKS_NUMBER (sizeof(taskList)/sizeof(taskList[0]))
ValenSalLop 5:19ccff89f555 9
ValenSalLop 9:5e9c4277151d 10 Mutex mutexData;
ValenSalLop 9:5e9c4277151d 11 SensorData data;
ValenSalLop 9:5e9c4277151d 12 Mutex mutexPCComm;
ValenSalLop 9:5e9c4277151d 13 Serial pc(USBTX,USBRX);
ValenSalLop 9:5e9c4277151d 14 volatile bool sensors_running = false;
ValenSalLop 0:de99871168ac 15
ValenSalLop 9:5e9c4277151d 16 static struct task_definition_struct taskList[] = {
ValenSalLop 9:5e9c4277151d 17 { temp_hum_thread, &temp_hum_init, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
ValenSalLop 9:5e9c4277151d 18 //{ nodeComm_thread, &initNodeComm, NULL, NULL, osPriorityNormal, 100, NULL, 0 }
ValenSalLop 9:5e9c4277151d 19 };
ValenSalLop 7:8065e844e99a 20
ValenSalLop 7:8065e844e99a 21
ValenSalLop 9:5e9c4277151d 22 int main()
ValenSalLop 9:5e9c4277151d 23 {
ValenSalLop 9:5e9c4277151d 24 pc.baud(9600);
ValenSalLop 9:5e9c4277151d 25 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 26 pc.printf("MAIN: init\n");
ValenSalLop 9:5e9c4277151d 27 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 28 // Init RTC
ValenSalLop 9:5e9c4277151d 29 time_t epoch_time;
ValenSalLop 9:5e9c4277151d 30 epoch_time = rtc.get_epoch();
ValenSalLop 9:5e9c4277151d 31 // Reset all data status
ValenSalLop 9:5e9c4277151d 32 mutexData.lock();
ValenSalLop 9:5e9c4277151d 33 data.DHTError = -128;
ValenSalLop 9:5e9c4277151d 34 mutexData.unlock();
ValenSalLop 9:5e9c4277151d 35 // Init all tasks
ValenSalLop 9:5e9c4277151d 36 initTasks();
ValenSalLop 7:8065e844e99a 37 while(true) {
ValenSalLop 9:5e9c4277151d 38 // Start all threads
ValenSalLop 9:5e9c4277151d 39 sensors_running = true;
ValenSalLop 9:5e9c4277151d 40 for (int i = 0; i < TASKS_NUMBER; i++) {
ValenSalLop 9:5e9c4277151d 41 if (taskList[i].retVal == 1) {
ValenSalLop 9:5e9c4277151d 42 taskList[i].thread->signal_set(0x1);
ValenSalLop 9:5e9c4277151d 43 Thread::wait(taskList[i].delay);
ValenSalLop 9:5e9c4277151d 44 taskList[i].thread->signal_clr(0x1);
ValenSalLop 9:5e9c4277151d 45 }
ValenSalLop 9:5e9c4277151d 46 }
ValenSalLop 9:5e9c4277151d 47 publishSensorData();
ValenSalLop 9:5e9c4277151d 48 // Stop all remain tasks
ValenSalLop 9:5e9c4277151d 49 sensors_running = false;
ValenSalLop 9:5e9c4277151d 50 Thread::wait(10000);
ValenSalLop 9:5e9c4277151d 51 }
ValenSalLop 9:5e9c4277151d 52 }
ValenSalLop 7:8065e844e99a 53
ValenSalLop 9:5e9c4277151d 54 int publishSensorData(void)
ValenSalLop 7:8065e844e99a 55 {
ValenSalLop 9:5e9c4277151d 56 Timer t;
ValenSalLop 9:5e9c4277151d 57 int error = -1;
ValenSalLop 9:5e9c4277151d 58 t.reset();
ValenSalLop 9:5e9c4277151d 59 t.start();
ValenSalLop 9:5e9c4277151d 60 while(error != 0 && t.read()<MAX_TIME_TO_WAIT_NODE_COMM) {
ValenSalLop 9:5e9c4277151d 61 mutexData.lock();
ValenSalLop 9:5e9c4277151d 62 // Check if all data are valid
ValenSalLop 9:5e9c4277151d 63 error = data.DHTError;
ValenSalLop 9:5e9c4277151d 64 if( error == 0) {
ValenSalLop 9:5e9c4277151d 65 // Send all info
ValenSalLop 9:5e9c4277151d 66 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 67 pc.printf("Temp\t%f\n",data.temperature);
ValenSalLop 9:5e9c4277151d 68 pc.printf("Hum\t%f\n",data.humidity);
ValenSalLop 9:5e9c4277151d 69 pc.printf("DewP\t%f\n",data.dewPoint);
ValenSalLop 9:5e9c4277151d 70 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 71 }
ValenSalLop 9:5e9c4277151d 72 mutexData.unlock();
ValenSalLop 9:5e9c4277151d 73 if(error!=0) {
ValenSalLop 9:5e9c4277151d 74 Thread::wait(3000);
ValenSalLop 9:5e9c4277151d 75 }
ValenSalLop 9:5e9c4277151d 76 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 77 pc.printf("MAIN: req data\t%f\n",t.read());
ValenSalLop 9:5e9c4277151d 78 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 79 } // while
ValenSalLop 9:5e9c4277151d 80 t.stop();
ValenSalLop 9:5e9c4277151d 81 // Send valid info only
ValenSalLop 9:5e9c4277151d 82 if(error!=0) {
ValenSalLop 9:5e9c4277151d 83 mutexData.lock();
ValenSalLop 9:5e9c4277151d 84 if( data.DHTError == 0) {
ValenSalLop 9:5e9c4277151d 85 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 86 pc.printf("Temp:\t%f\n",data.temperature);
ValenSalLop 9:5e9c4277151d 87 pc.printf("Hum:\t%f\n",data.humidity);
ValenSalLop 9:5e9c4277151d 88 pc.printf("DewP:\t%f\n",data.dewPoint);
ValenSalLop 9:5e9c4277151d 89 pc.printf("DHTError:\t%d\n",data.DHTError);
ValenSalLop 9:5e9c4277151d 90 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 91 } else {
ValenSalLop 9:5e9c4277151d 92 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 93 pc.printf("DHTError:\t%d\n",data.DHTError);
ValenSalLop 9:5e9c4277151d 94 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 95 }
ValenSalLop 9:5e9c4277151d 96 mutexData.unlock();
ValenSalLop 7:8065e844e99a 97 }
ValenSalLop 9:5e9c4277151d 98 // Reset all data status
ValenSalLop 9:5e9c4277151d 99 mutexData.lock();
ValenSalLop 9:5e9c4277151d 100 data.DHTError = -128;
ValenSalLop 9:5e9c4277151d 101 mutexData.unlock();
ValenSalLop 7:8065e844e99a 102 return error;
ValenSalLop 7:8065e844e99a 103 }
ValenSalLop 7:8065e844e99a 104
ValenSalLop 5:19ccff89f555 105
ValenSalLop 5:19ccff89f555 106
ValenSalLop 9:5e9c4277151d 107 static uint32_t initTasks(void)
ValenSalLop 9:5e9c4277151d 108 {
ValenSalLop 9:5e9c4277151d 109 uint32_t i;
ValenSalLop 9:5e9c4277151d 110 uint32_t retval = 1;
ValenSalLop 5:19ccff89f555 111
ValenSalLop 9:5e9c4277151d 112 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 113 pc.printf("initTasks: init\n");
ValenSalLop 9:5e9c4277151d 114 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 115 for (i = 0; i < TASKS_NUMBER; i++) {
ValenSalLop 9:5e9c4277151d 116 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 117 pc.printf("initTasks: %d\n",i);
ValenSalLop 9:5e9c4277151d 118 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 119 if (taskList[i].init != NULL) {
ValenSalLop 9:5e9c4277151d 120 if ((taskList[i].retVal = ((*taskList[i].init)(taskList[i].init_args))) == 0)
ValenSalLop 9:5e9c4277151d 121 retval = 0;
ValenSalLop 9:5e9c4277151d 122 } else {
ValenSalLop 9:5e9c4277151d 123 taskList[i].retVal = 1;
ValenSalLop 9:5e9c4277151d 124 }
ValenSalLop 0:de99871168ac 125 }
ValenSalLop 5:19ccff89f555 126
ValenSalLop 9:5e9c4277151d 127 for (i = 0; i < TASKS_NUMBER; i++) {
ValenSalLop 9:5e9c4277151d 128 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 129 pc.printf("initTasks: start %d\n",i);
ValenSalLop 9:5e9c4277151d 130 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 131 Thread::wait(taskList[i].delay);
ValenSalLop 5:19ccff89f555 132
ValenSalLop 9:5e9c4277151d 133 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 134 pc.printf("initTasks: su1 %d\n",retval);
ValenSalLop 9:5e9c4277151d 135 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 136 if (taskList[i].retVal == 1) {
ValenSalLop 9:5e9c4277151d 137 taskList[i].thread = new Thread(taskList[i].task, taskList[i].task_args, taskList[i].priority);
ValenSalLop 0:de99871168ac 138 }
ValenSalLop 5:19ccff89f555 139
ValenSalLop 9:5e9c4277151d 140 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 141 pc.printf("initTasks: finish su2 %d\n",retval);
ValenSalLop 9:5e9c4277151d 142 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 143 }
ValenSalLop 5:19ccff89f555 144
ValenSalLop 9:5e9c4277151d 145 mutexPCComm.lock();
ValenSalLop 9:5e9c4277151d 146 pc.printf("initTasks: finish %d\n",retval);
ValenSalLop 9:5e9c4277151d 147 mutexPCComm.unlock();
ValenSalLop 9:5e9c4277151d 148 return retval;
ValenSalLop 9:5e9c4277151d 149 }