SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Committer:
ValenSalLop
Date:
Mon May 08 17:13:57 2017 +0000
Revision:
10:f14f47225091
Parent:
9:5e9c4277151d
Child:
11:a9f41d6489c9
RTOS errors fix

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