trabalho final
Dependencies: X_NUCLEO_IKS01A1-f255a2c75ecb mbed-rtos mbed
main.cpp@37:886dcde018ad, 2016-05-18 (annotated)
- Committer:
- Jacinta
- Date:
- Wed May 18 11:40:30 2016 +0000
- Revision:
- 37:886dcde018ad
- Parent:
- 36:0e30191d7db6
commited revision
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Jacinta | 0:1eaebb55408a | 1 | /** |
| Jacinta | 0:1eaebb55408a | 2 | ****************************************************************************** |
| Jacinta | 35:34bbca276f99 | 3 | * @file main.cpp |
| Jacinta | 35:34bbca276f99 | 4 | * @author ANG Group (Nelson Santos; Irina Baptista; Pierluigi Urru) |
| Jacinta | 35:34bbca276f99 | 5 | * @version V0.0.3 |
| Jacinta | 35:34bbca276f99 | 6 | * @brief Simple Example application for using the X_NUCLEO_IKS01A1 |
| Jacinta | 35:34bbca276f99 | 7 | * MEMS Inertial & Environmental Sensor Nucleo expansion board. |
| Jacinta | 0:1eaebb55408a | 8 | ****************************************************************************** |
| Jacinta | 0:1eaebb55408a | 9 | */ |
| Jacinta | 0:1eaebb55408a | 10 | |
| Jacinta | 0:1eaebb55408a | 11 | #include "mbed.h" |
| Jacinta | 0:1eaebb55408a | 12 | #include "x_nucleo_iks01a1.h" |
| Jacinta | 2:0b8065489409 | 13 | #include "rtos.h" |
| Jacinta | 0:1eaebb55408a | 14 | #include <cstring> |
| Jacinta | 0:1eaebb55408a | 15 | #include <stdexcept> |
| Jacinta | 2:0b8065489409 | 16 | #include <vector> |
| Jacinta | 0:1eaebb55408a | 17 | #include "sensor.h" |
| Jacinta | 0:1eaebb55408a | 18 | #include "userMethods.h" |
| Jacinta | 35:34bbca276f99 | 19 | #include "log.h" |
| Jacinta | 35:34bbca276f99 | 20 | |
| Jacinta | 35:34bbca276f99 | 21 | #define QUEUESIZE 120 |
| Jacinta | 0:1eaebb55408a | 22 | |
| Jacinta | 2:0b8065489409 | 23 | struct tm t = {t.tm_hour = 0}; |
| Jacinta | 0:1eaebb55408a | 24 | |
| Jacinta | 2:0b8065489409 | 25 | int n = 0; |
| Jacinta | 20:014a808b3ea2 | 26 | bool flag = false; |
| Jacinta | 35:34bbca276f99 | 27 | |
| Jacinta | 35:34bbca276f99 | 28 | Mail<log_data, QUEUESIZE> mail_box; |
| Jacinta | 35:34bbca276f99 | 29 | vector<log_data> v; |
| Jacinta | 35:34bbca276f99 | 30 | |
| Jacinta | 31:8bbdfea60151 | 31 | ExpansionBoard e(n, flag); |
| Jacinta | 35:34bbca276f99 | 32 | UserMethods u(v, n, e, flag, mail_box); |
| Jacinta | 35:34bbca276f99 | 33 | |
| Jacinta | 35:34bbca276f99 | 34 | int i = 0; |
| Jacinta | 35:34bbca276f99 | 35 | |
| Jacinta | 36:0e30191d7db6 | 36 | void sampleData() |
| Jacinta | 35:34bbca276f99 | 37 | { |
| Jacinta | 35:34bbca276f99 | 38 | //while(true){ |
| Jacinta | 35:34bbca276f99 | 39 | if(flag) printf("\nAbout to alloc\n"); |
| Jacinta | 35:34bbca276f99 | 40 | log_data *log_d = mail_box.alloc(); |
| Jacinta | 35:34bbca276f99 | 41 | |
| Jacinta | 35:34bbca276f99 | 42 | if (log_d == NULL) { |
| Jacinta | 35:34bbca276f99 | 43 | if(flag) printf("Out of memory, last sample deleted\n"); |
| Jacinta | 35:34bbca276f99 | 44 | osEvent evt = mail_box.get(); |
| Jacinta | 35:34bbca276f99 | 45 | log_data *log = (log_data*)evt.value.p; |
| Jacinta | 35:34bbca276f99 | 46 | printf("\nI = %d\n", i); |
| Jacinta | 35:34bbca276f99 | 47 | printf("Pressure: %f", log->pressure); |
| Jacinta | 35:34bbca276f99 | 48 | printf("Counter: %d", log->counter); |
| Jacinta | 35:34bbca276f99 | 49 | log_data* log_d = (log_data*)mail_box.alloc(); |
| Jacinta | 35:34bbca276f99 | 50 | if(flag) printf("Allocated after out of memory\n"); |
| Jacinta | 35:34bbca276f99 | 51 | } |
| Jacinta | 2:0b8065489409 | 52 | |
| Jacinta | 35:34bbca276f99 | 53 | if(flag) printf("Not null, reading values\n"); |
| Jacinta | 35:34bbca276f99 | 54 | //Store read data in a sample |
| Jacinta | 35:34bbca276f99 | 55 | float value; |
| Jacinta | 35:34bbca276f99 | 56 | //log_d->date = time(NULL); |
| Jacinta | 35:34bbca276f99 | 57 | temp_sensor->GetTemperature(&value); |
| Jacinta | 35:34bbca276f99 | 58 | log_d->tempCelsius = value; |
| Jacinta | 35:34bbca276f99 | 59 | humidity_sensor->GetHumidity(&value); |
| Jacinta | 35:34bbca276f99 | 60 | log_d->humidity = value; |
| Jacinta | 35:34bbca276f99 | 61 | pressure_sensor->GetPressure(&value); |
| Jacinta | 35:34bbca276f99 | 62 | log_d->pressure = value; |
| Jacinta | 35:34bbca276f99 | 63 | log_d->counter = i; |
| Jacinta | 35:34bbca276f99 | 64 | if(flag) printf("All values STORED\n"); |
| Jacinta | 35:34bbca276f99 | 65 | //Send pointer to sample to the queue |
| Jacinta | 35:34bbca276f99 | 66 | //osStatus stat = |
| Jacinta | 35:34bbca276f99 | 67 | mail_box.put(log_d); |
| Jacinta | 35:34bbca276f99 | 68 | Thread::wait(4000); |
| Jacinta | 35:34bbca276f99 | 69 | |
| Jacinta | 35:34bbca276f99 | 70 | i++; |
| Jacinta | 35:34bbca276f99 | 71 | |
| Jacinta | 35:34bbca276f99 | 72 | //v.push_back(*log_d); |
| nlsantos | 6:d388428956b2 | 73 | |
| Jacinta | 35:34bbca276f99 | 74 | if(flag) printf("MAIL_BOX.PUT run\n"); |
| Jacinta | 35:34bbca276f99 | 75 | //printf("%d", v.size()); |
| Jacinta | 35:34bbca276f99 | 76 | // printf("Pressure: %f, Humidity: %f", v[0].pressure, v[0].humidity); |
| Jacinta | 35:34bbca276f99 | 77 | // Check for resource error |
| Jacinta | 35:34bbca276f99 | 78 | /* if (stat == osErrorResource) { |
| Jacinta | 35:34bbca276f99 | 79 | if(flag) printf("mail_box->put() Error %4Xh\n", stat); |
| Jacinta | 35:34bbca276f99 | 80 | //Error, free up memory block taken |
| Jacinta | 35:34bbca276f99 | 81 | mail_box.free(log_d); |
| Jacinta | 35:34bbca276f99 | 82 | |
| Jacinta | 35:34bbca276f99 | 83 | }*/ |
| Jacinta | 35:34bbca276f99 | 84 | // Thread::wait(1000); |
| Jacinta | 35:34bbca276f99 | 85 | //} |
| Jacinta | 35:34bbca276f99 | 86 | } |
| nlsantos | 6:d388428956b2 | 87 | |
| nlsantos | 6:d388428956b2 | 88 | int main() |
| nlsantos | 6:d388428956b2 | 89 | { |
| Jacinta | 2:0b8065489409 | 90 | printf("Sampling started...\n"); |
| Jacinta | 35:34bbca276f99 | 91 | |
| nlsantos | 10:2f9585ff5a7b | 92 | printf("\n\rWelcome! Type one of the following commands and press space or enter"); |
| Jacinta | 37:886dcde018ad | 93 | printf("\n\r Don't forget to use only capitals when typing the commands!"); |
| Jacinta | 2:0b8065489409 | 94 | printf("\n\r READ ALL\n\r READ <n>\n\r DELETE ALL\n\r DELETE <n>"); |
| Jacinta | 2:0b8065489409 | 95 | printf("\n\r SETDATE dd mm yyyy\n\r SETTIME hh mm ss"); |
| Jacinta | 2:0b8065489409 | 96 | printf("\n\r SETT <T>\n\r STATE <x>\n\r LOGGING <x>\n\r EXIT\n\n\r"); |
| nlsantos | 6:d388428956b2 | 97 | |
| Jacinta | 2:0b8065489409 | 98 | //Initialise time |
| nlsantos | 6:d388428956b2 | 99 | set_time(0); |
| nlsantos | 9:ce395d75c0df | 100 | |
| nlsantos | 9:ce395d75c0df | 101 | //ISR to sample data |
| Jacinta | 36:0e30191d7db6 | 102 | Ticker ticker; |
| Jacinta | 36:0e30191d7db6 | 103 | ticker.attach(&sampleData, e.T); |
| nlsantos | 6:d388428956b2 | 104 | |
| Jacinta | 0:1eaebb55408a | 105 | char command[20]; |
| Jacinta | 0:1eaebb55408a | 106 | char arg[10]; |
| nlsantos | 6:d388428956b2 | 107 | |
| nlsantos | 9:ce395d75c0df | 108 | //User commands |
| nlsantos | 9:ce395d75c0df | 109 | |
| Jacinta | 2:0b8065489409 | 110 | while(1) { |
| Jacinta | 2:0b8065489409 | 111 | scanf("%s", command); |
| nlsantos | 6:d388428956b2 | 112 | |
| Jacinta | 2:0b8065489409 | 113 | if (strcmp("READ", command)==0) { |
| Jacinta | 2:0b8065489409 | 114 | scanf("%s", arg); |
| Jacinta | 2:0b8065489409 | 115 | printf("\n"); |
| Jacinta | 2:0b8065489409 | 116 | if(strcmp("ALL", arg)==0) |
| nlsantos | 12:33728f2a7068 | 117 | Thread readAllThread(u.readAllData, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); |
| nlsantos | 33:2ee6fbdad7b4 | 118 | |
| Jacinta | 2:0b8065489409 | 119 | else if (atoi(arg)!= 0) { |
| Jacinta | 2:0b8065489409 | 120 | n = atoi(arg); //A bit hacky, but it works |
| nlsantos | 6:d388428956b2 | 121 | Thread readThread(u.readNData, NULL,osPriorityBelowNormal, DEFAULT_STACK_SIZE); |
| nlsantos | 6:d388428956b2 | 122 | } |
| nlsantos | 6:d388428956b2 | 123 | |
| nlsantos | 10:2f9585ff5a7b | 124 | else perror("The argument is invalid\n\r"); |
| Jacinta | 2:0b8065489409 | 125 | } |
| Jacinta | 37:886dcde018ad | 126 | |
| Jacinta | 2:0b8065489409 | 127 | else if (strcmp("DELETE", command)==0) { |
| Jacinta | 2:0b8065489409 | 128 | scanf("%s", arg); |
| Jacinta | 2:0b8065489409 | 129 | printf("\n"); |
| Jacinta | 2:0b8065489409 | 130 | if (strcmp("ALL", arg)==0) { |
| Jacinta | 35:34bbca276f99 | 131 | //int n = v.size(); |
| Jacinta | 35:34bbca276f99 | 132 | //v.clear(); |
| Jacinta | 2:0b8065489409 | 133 | printf("DELETED %d RECORDS", n); |
| Jacinta | 35:34bbca276f99 | 134 | } else if (atoi(arg)!= 0) { |
| Jacinta | 35:34bbca276f99 | 135 | /*int n = v.size(); |
| Jacinta | 2:0b8065489409 | 136 | v.erase(v.begin(), v.end()); |
| Jacinta | 2:0b8065489409 | 137 | if(n < atoi(arg)) |
| Jacinta | 35:34bbca276f99 | 138 | */ printf("DELETED %d RECORDS", n); |
| Jacinta | 35:34bbca276f99 | 139 | //else printf("DELETED %d RECORDS", atoi(arg)); |
| Jacinta | 2:0b8065489409 | 140 | } |
| nlsantos | 6:d388428956b2 | 141 | |
| nlsantos | 10:2f9585ff5a7b | 142 | else perror("The argument is invalid\n\r"); |
| Jacinta | 2:0b8065489409 | 143 | } |
| Jacinta | 37:886dcde018ad | 144 | |
| Jacinta | 2:0b8065489409 | 145 | else if (strcmp("SETDATE", command)==0) { |
| Jacinta | 2:0b8065489409 | 146 | char day[2], month[2], year[4]; |
| Jacinta | 2:0b8065489409 | 147 | //Read day |
| Jacinta | 2:0b8065489409 | 148 | scanf("%s", day); |
| Jacinta | 2:0b8065489409 | 149 | if (atoi(day)!=0) |
| Jacinta | 2:0b8065489409 | 150 | atoi(day)<31 ? t.tm_mday=atoi(day) : printf("Invalid day\n"); |
| Jacinta | 2:0b8065489409 | 151 | // Read month |
| Jacinta | 2:0b8065489409 | 152 | scanf("%s", month); |
| Jacinta | 2:0b8065489409 | 153 | if (atoi(month)!=0) |
| Jacinta | 2:0b8065489409 | 154 | atoi(month)<=12 ? t.tm_mon=atoi(month)-1 : printf("Invalid month\n"); |
| Jacinta | 2:0b8065489409 | 155 | //Read year |
| Jacinta | 2:0b8065489409 | 156 | scanf("%s", year); |
| Jacinta | 2:0b8065489409 | 157 | printf("\n"); |
| Jacinta | 2:0b8065489409 | 158 | if (atoi(year)!=0) |
| Jacinta | 2:0b8065489409 | 159 | atoi(year)>=70 ? t.tm_year=atoi(year)-1900 : printf("Invalid year\n"); |
| nlsantos | 6:d388428956b2 | 160 | |
| Jacinta | 2:0b8065489409 | 161 | // Check whether date is correct |
| Jacinta | 2:0b8065489409 | 162 | if (mktime(&t)>0) { |
| Jacinta | 2:0b8065489409 | 163 | printf("DATE UPDATED TO %d %d %d", t.tm_mday, |
| Jacinta | 2:0b8065489409 | 164 | t.tm_mon+1, t.tm_year+1900); |
| Jacinta | 2:0b8065489409 | 165 | set_time(mktime(&t)); |
| nlsantos | 9:ce395d75c0df | 166 | } else perror("Date inserted is invalid\n\r"); |
| Jacinta | 0:1eaebb55408a | 167 | } |
| Jacinta | 35:34bbca276f99 | 168 | |
| Jacinta | 2:0b8065489409 | 169 | else if (strcmp("SETTIME", command)==0) { |
| Jacinta | 2:0b8065489409 | 170 | char hour[2], min[2], sec[2]; |
| nlsantos | 6:d388428956b2 | 171 | |
| Jacinta | 2:0b8065489409 | 172 | scanf("%s", hour); |
| Jacinta | 2:0b8065489409 | 173 | if (atoi(hour)!=0) |
| Jacinta | 2:0b8065489409 | 174 | t.tm_hour = atoi(hour); |
| Jacinta | 2:0b8065489409 | 175 | scanf("%s", min); |
| Jacinta | 2:0b8065489409 | 176 | if (atoi(min)!=0) |
| Jacinta | 2:0b8065489409 | 177 | t.tm_min = atoi(min); |
| Jacinta | 2:0b8065489409 | 178 | scanf("%s", sec); |
| Jacinta | 2:0b8065489409 | 179 | if (atoi(sec)!=0) |
| Jacinta | 2:0b8065489409 | 180 | t.tm_sec = atoi(sec); |
| Jacinta | 2:0b8065489409 | 181 | printf("\n"); |
| Jacinta | 0:1eaebb55408a | 182 | |
| Jacinta | 2:0b8065489409 | 183 | //If the user sets this before without DATE, it's gonna be garbage |
| nlsantos | 6:d388428956b2 | 184 | |
| Jacinta | 2:0b8065489409 | 185 | // Check whether time is correct |
| Jacinta | 2:0b8065489409 | 186 | if (mktime(&t)>0) { |
| Jacinta | 2:0b8065489409 | 187 | set_time(mktime(&t)); |
| Jacinta | 2:0b8065489409 | 188 | printf("TIME UPDATED TO %d %d %d", t.tm_hour, t.tm_min, t.tm_sec); |
| nlsantos | 9:ce395d75c0df | 189 | } else perror("Time inserted is invalid\n\r"); |
| Jacinta | 2:0b8065489409 | 190 | } |
| nlsantos | 6:d388428956b2 | 191 | |
| Jacinta | 21:849e5636076e | 192 | // Set sampling period |
| Jacinta | 2:0b8065489409 | 193 | else if (strcmp("SETT", command)==0) { |
| Jacinta | 2:0b8065489409 | 194 | scanf("%s", arg); |
| Jacinta | 2:0b8065489409 | 195 | printf("\n"); |
| Jacinta | 2:0b8065489409 | 196 | if (atof(arg) >= 0.1 && atof(arg) <= 60.0 ) { |
| Jacinta | 2:0b8065489409 | 197 | e.T = atof(arg); |
| Jacinta | 37:886dcde018ad | 198 | ticker.attach(sampleData,e.T); |
| Jacinta | 2:0b8065489409 | 199 | printf("T UPDATED TO %.1f", e.T); |
| nlsantos | 9:ce395d75c0df | 200 | } else perror ("Value must be between 1 and 60"); |
| Jacinta | 21:849e5636076e | 201 | |
| nlsantos | 9:ce395d75c0df | 202 | //Toggle sampling on and off |
| nlsantos | 6:d388428956b2 | 203 | |
| Jacinta | 35:34bbca276f99 | 204 | } else if (strcmp("STATE", command)==0) { |
| Jacinta | 2:0b8065489409 | 205 | scanf("%s", arg); |
| nlsantos | 6:d388428956b2 | 206 | printf("\n"); |
| Jacinta | 2:0b8065489409 | 207 | if (strcmp("ON", arg)==0) { |
| Jacinta | 37:886dcde018ad | 208 | ticker.attach(sampleData, e.T); |
| Jacinta | 2:0b8065489409 | 209 | printf("SAMPLING ON"); |
| nlsantos | 6:d388428956b2 | 210 | } else if (strcmp("OFF", arg)==0) { |
| Jacinta | 37:886dcde018ad | 211 | ticker.detach(); |
| Jacinta | 2:0b8065489409 | 212 | printf("SAMPLIG OFF"); |
| Jacinta | 2:0b8065489409 | 213 | } |
| nlsantos | 6:d388428956b2 | 214 | |
| nlsantos | 9:ce395d75c0df | 215 | else perror("The argument is invalid\n\r"); |
| Jacinta | 2:0b8065489409 | 216 | } |
| nlsantos | 9:ce395d75c0df | 217 | |
| Jacinta | 21:849e5636076e | 218 | //Toggle debug messages on and off |
| Jacinta | 2:0b8065489409 | 219 | else if(strcmp("LOGGING", command)==0) { |
| Jacinta | 2:0b8065489409 | 220 | scanf("%s", arg); |
| Jacinta | 2:0b8065489409 | 221 | printf("\n"); |
| Jacinta | 37:886dcde018ad | 222 | if (strcmp("ON", arg)==0){ |
| Jacinta | 37:886dcde018ad | 223 | printf("Diagnostics ON"); |
| Jacinta | 20:014a808b3ea2 | 224 | flag= true; |
| Jacinta | 37:886dcde018ad | 225 | |
| Jacinta | 37:886dcde018ad | 226 | } |
| Jacinta | 37:886dcde018ad | 227 | else if (strcmp("OFF", arg)==0){ |
| Jacinta | 37:886dcde018ad | 228 | |
| Jacinta | 37:886dcde018ad | 229 | printf("Diagnostics OFF"); |
| Jacinta | 20:014a808b3ea2 | 230 | flag= false; |
| Jacinta | 37:886dcde018ad | 231 | |
| Jacinta | 37:886dcde018ad | 232 | } |
| nlsantos | 9:ce395d75c0df | 233 | else perror ("The argument is invalid\n\r"); |
| Jacinta | 2:0b8065489409 | 234 | } |
| Jacinta | 21:849e5636076e | 235 | |
| Jacinta | 35:34bbca276f99 | 236 | |
| nlsantos | 6:d388428956b2 | 237 | else if(strcmp("EXIT", command) == 0) { |
| nlsantos | 6:d388428956b2 | 238 | break; |
| nlsantos | 6:d388428956b2 | 239 | } |
| nlsantos | 6:d388428956b2 | 240 | |
| nlsantos | 9:ce395d75c0df | 241 | else perror("\nThere is no command matching. Try again"); |
| Jacinta | 0:1eaebb55408a | 242 | |
| Jacinta | 2:0b8065489409 | 243 | // Clear the input to avoid it to being reused in the next cycle |
| Jacinta | 2:0b8065489409 | 244 | command[0] = arg[0] = 0; |
| Jacinta | 2:0b8065489409 | 245 | printf("\n\r"); |
| Jacinta | 0:1eaebb55408a | 246 | } |
| nlsantos | 6:d388428956b2 | 247 | |
| nlsantos | 6:d388428956b2 | 248 | |
| Jacinta | 21:849e5636076e | 249 | printf ("Thank you for using our system \n"); |
| Jacinta | 21:849e5636076e | 250 | printf ("\n Press the reset button to start again \n"); |
| nlsantos | 10:2f9585ff5a7b | 251 | |
| Jacinta | 2:0b8065489409 | 252 | return 0; |
| Jacinta | 0:1eaebb55408a | 253 | } |