SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Committer:
ValenSalLop
Date:
Mon May 08 18:30:12 2017 +0000
Revision:
11:a9f41d6489c9
Parent:
10:f14f47225091
Child:
12:1d544cdab2cf
XBee integration

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