SEDO subject project
Dependencies: ds3231 mbed-rtos mbed DHT
main.cpp@10:f14f47225091, 2017-05-08 (annotated)
- 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?
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 | 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 | } |