SEDO subject project
Dependencies: ds3231 mbed-rtos mbed DHT
main.cpp@11:a9f41d6489c9, 2017-05-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |