Generation 3 of the Harp project

Dependencies:   Servo TMP36 GZ buffered-serial1 chan_fatfs_sd nmea_parser watchdog mbed-rtos mbed

Fork of HARP2 by Tyler Weaver

Committer:
tylerjw
Date:
Thu Jan 24 06:50:46 2013 +0000
Revision:
33:61f0be6af3c0
Parent:
32:4f811b397720
last revision;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tylerjw 24:7477105103e5 1 /**
tylerjw 24:7477105103e5 2 * HARP Version 2
tylerjw 26:85cdb1031eb1 3 *
tylerjw 26:85cdb1031eb1 4 * TODO: Test Servo Code
tylerjw 26:85cdb1031eb1 5 * Test Watchdog Timer
tylerjw 24:7477105103e5 6 */
tylerjw 24:7477105103e5 7
tylerjw 0:ce5f06c3895f 8 #include "mbed.h"
tylerjw 7:d8ecabe16c9e 9 #include "rtos.h"
tylerjw 10:b13416bbb4cd 10 #include "buffered_serial.h"
tylerjw 12:0d943d69d3ec 11 #include "ff.h"
tylerjw 26:85cdb1031eb1 12 #include "TMP36GZ.h"
tylerjw 24:7477105103e5 13 #include "nmea_parser.h"
tylerjw 25:81c3696ba2c9 14 #include "watchdog.h"
tylerjw 25:81c3696ba2c9 15 #include "Servo.h"
tylerjw 22:becb67846755 16 #include "config.h"
tylerjw 19:1cfe22ef30e2 17
tylerjw 0:ce5f06c3895f 18 Serial pc(USBTX, USBRX);
tylerjw 24:7477105103e5 19 BufferedSerial gps;
tylerjw 10:b13416bbb4cd 20 AnalogIn gps_battery(p20);
tylerjw 26:85cdb1031eb1 21 AnalogIn mbed_battery(p16);
tylerjw 26:85cdb1031eb1 22 TMP36GZ temperature(p17);
tylerjw 29:8cdb56a0fe57 23 DigitalOut alarm(p18);
tylerjw 7:d8ecabe16c9e 24
tylerjw 24:7477105103e5 25 NmeaParser nmea;
tylerjw 17:4927053e120f 26
tylerjw 18:29b19a25a963 27 Semaphore parachute_sem(0);
tylerjw 26:85cdb1031eb1 28 Semaphore sd_sem(0);
tylerjw 18:29b19a25a963 29
tylerjw 13:db6af0620264 30 typedef struct {
tylerjw 13:db6af0620264 31 char line[80];
tylerjw 13:db6af0620264 32 } gps_line;
tylerjw 13:db6af0620264 33 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 34 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 35
tylerjw 13:db6af0620264 36 typedef struct {
tylerjw 14:dce4d8c29b17 37 char line[80];
tylerjw 13:db6af0620264 38 } sensor_line;
tylerjw 13:db6af0620264 39 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 40 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 41
tylerjw 28:032d55fa57b8 42 volatile float left_pos = 0.0; // servo position for logging
tylerjw 28:032d55fa57b8 43 volatile float right_pos = 0.0;
tylerjw 28:032d55fa57b8 44
tylerjw 29:8cdb56a0fe57 45 volatile bool gps_wd = false;
tylerjw 29:8cdb56a0fe57 46 volatile bool sensor_wd = false;
tylerjw 29:8cdb56a0fe57 47 volatile bool log_wd = false;
tylerjw 29:8cdb56a0fe57 48 volatile bool parachute_wd = false;
tylerjw 29:8cdb56a0fe57 49
tylerjw 7:d8ecabe16c9e 50 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 51 {
tylerjw 10:b13416bbb4cd 52 char buffer[80];
tylerjw 18:29b19a25a963 53 float alt, alt_prev;
tylerjw 18:29b19a25a963 54 alt = alt_prev = 0;
tylerjw 32:4f811b397720 55 bool released = false;
tylerjw 9:4debfbc1fb3e 56
tylerjw 21:8799ee63c2cd 57 //DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 58
tylerjw 7:d8ecabe16c9e 59 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 60
tylerjw 7:d8ecabe16c9e 61 while(true) {
tylerjw 21:8799ee63c2cd 62 //gps_led = !gps_led;
tylerjw 24:7477105103e5 63 gps.get_line(buffer);
tylerjw 19:1cfe22ef30e2 64 int line_type = nmea.parse(buffer);
tylerjw 14:dce4d8c29b17 65 //pc.puts(buffer);
tylerjw 13:db6af0620264 66 // send to log...
tylerjw 13:db6af0620264 67 gps_line *message = mpool_gps_line.alloc();
tylerjw 13:db6af0620264 68 strcpy(message->line, buffer);
tylerjw 13:db6af0620264 69 queue_gps_line.put(message);
tylerjw 19:1cfe22ef30e2 70
tylerjw 19:1cfe22ef30e2 71 // test altitude direction - release parachute thread to run
tylerjw 24:7477105103e5 72 if(line_type == RMC && nmea.quality()) {
tylerjw 32:4f811b397720 73 if(RELEASE_AT_ALT) {
tylerjw 32:4f811b397720 74 if(nmea.msl_altitude() >= RELEASE_ALT)
tylerjw 32:4f811b397720 75 {
tylerjw 32:4f811b397720 76 parachute_sem.release();
tylerjw 32:4f811b397720 77 released = true;
tylerjw 29:8cdb56a0fe57 78 }
tylerjw 32:4f811b397720 79 }
tylerjw 32:4f811b397720 80 if(UNLOCK_ON_FALL & released) {
tylerjw 29:8cdb56a0fe57 81 if(alt == 0) { // first time
tylerjw 24:7477105103e5 82 alt = nmea.msl_altitude();
tylerjw 19:1cfe22ef30e2 83 } else {
tylerjw 19:1cfe22ef30e2 84 alt_prev = alt;
tylerjw 24:7477105103e5 85 alt = nmea.msl_altitude();
tylerjw 32:4f811b397720 86 if(alt < alt_prev) { // going down
tylerjw 19:1cfe22ef30e2 87 parachute_sem.release(); // let the parachute code execute
tylerjw 29:8cdb56a0fe57 88 if(ALARM && alt < ALARM_ALT)
tylerjw 29:8cdb56a0fe57 89 alarm = 1;
tylerjw 29:8cdb56a0fe57 90 }
tylerjw 19:1cfe22ef30e2 91 }
tylerjw 32:4f811b397720 92 } else if(released) {
tylerjw 19:1cfe22ef30e2 93 parachute_sem.release();
tylerjw 18:29b19a25a963 94 }
tylerjw 18:29b19a25a963 95 }
tylerjw 32:4f811b397720 96
tylerjw 29:8cdb56a0fe57 97 gps_wd = true; // kick the watchdog
tylerjw 13:db6af0620264 98 }
tylerjw 13:db6af0620264 99 }
tylerjw 13:db6af0620264 100
tylerjw 13:db6af0620264 101 void log_thread(const void *args)
tylerjw 13:db6af0620264 102 {
tylerjw 13:db6af0620264 103 FATFS fs;
tylerjw 13:db6af0620264 104 FIL fp_gps, fp_sensor;
tylerjw 13:db6af0620264 105
tylerjw 13:db6af0620264 106 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 107
tylerjw 29:8cdb56a0fe57 108 log_wd = true; // kick the dog
tylerjw 13:db6af0620264 109 f_mount(0, &fs);
tylerjw 25:81c3696ba2c9 110 f_open(&fp_gps, "0:gps.txt", FA_OPEN_EXISTING | FA_WRITE);
tylerjw 26:85cdb1031eb1 111 f_lseek(&fp_gps, f_size(&fp_gps));
tylerjw 25:81c3696ba2c9 112 f_open(&fp_sensor, "0:sensors.csv", FA_OPEN_EXISTING | FA_WRITE);
tylerjw 26:85cdb1031eb1 113 f_lseek(&fp_sensor, f_size(&fp_sensor));
tylerjw 29:8cdb56a0fe57 114 log_wd = true; // kick the dog
tylerjw 13:db6af0620264 115
tylerjw 26:85cdb1031eb1 116 sd_sem.release(); // sd card initialized... start sensor thread
tylerjw 29:8cdb56a0fe57 117
tylerjw 13:db6af0620264 118 while(1) {
tylerjw 18:29b19a25a963 119 log_led = !log_led;
tylerjw 14:dce4d8c29b17 120 osEvent evt1 = queue_gps_line.get(1);
tylerjw 14:dce4d8c29b17 121 if (evt1.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 122 gps_line *message = (gps_line*)evt1.value.p;
tylerjw 13:db6af0620264 123
tylerjw 13:db6af0620264 124 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 125 f_sync(&fp_gps);
tylerjw 19:1cfe22ef30e2 126
tylerjw 13:db6af0620264 127 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 128 }
tylerjw 19:1cfe22ef30e2 129
tylerjw 14:dce4d8c29b17 130 osEvent evt2 = queue_sensor_line.get(1);
tylerjw 14:dce4d8c29b17 131 if(evt2.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 132 sensor_line *message = (sensor_line*)evt2.value.p;
tylerjw 19:1cfe22ef30e2 133
tylerjw 14:dce4d8c29b17 134 f_puts(message->line, &fp_sensor);
tylerjw 14:dce4d8c29b17 135 f_sync(&fp_sensor);
tylerjw 19:1cfe22ef30e2 136
tylerjw 13:db6af0620264 137 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 138 }
tylerjw 29:8cdb56a0fe57 139
tylerjw 29:8cdb56a0fe57 140 log_wd = true; // kick the dog
tylerjw 13:db6af0620264 141 }
tylerjw 13:db6af0620264 142 }
tylerjw 13:db6af0620264 143
tylerjw 13:db6af0620264 144 void sensor_thread(const void* args)
tylerjw 13:db6af0620264 145 {
tylerjw 14:dce4d8c29b17 146 DigitalOut sensor_led(LED2);
tylerjw 16:653df0cfe6ee 147 Timer t;
tylerjw 18:29b19a25a963 148 float time;
tylerjw 18:29b19a25a963 149 float gps_battery_voltage, mbed_battery_voltage;
tylerjw 26:85cdb1031eb1 150 float temp;
tylerjw 27:24fd8e32511c 151 float distance, course_to, course;
tylerjw 32:4f811b397720 152
tylerjw 30:b81274979e73 153 pc.baud(9600);
tylerjw 29:8cdb56a0fe57 154
tylerjw 29:8cdb56a0fe57 155 while( sd_sem.wait(50) <= 0) // wait for the sd card to initialize and open files
tylerjw 29:8cdb56a0fe57 156 sensor_wd = true; // kick the dog
tylerjw 19:1cfe22ef30e2 157
tylerjw 19:1cfe22ef30e2 158 if(WAIT_FOR_LOCK) {
tylerjw 29:8cdb56a0fe57 159 while(!nmea.date()) {
tylerjw 29:8cdb56a0fe57 160 Thread::wait(50); // wait for lock
tylerjw 29:8cdb56a0fe57 161 sensor_wd = true; // kick the dog
tylerjw 29:8cdb56a0fe57 162 }
tylerjw 19:1cfe22ef30e2 163 }
tylerjw 19:1cfe22ef30e2 164
tylerjw 17:4927053e120f 165 t.start(); // start timer after lock
tylerjw 19:1cfe22ef30e2 166
tylerjw 14:dce4d8c29b17 167 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 29:8cdb56a0fe57 168 sprintf(message->line, "Date: %d, Time: %f\r\nGPS Time (UTC),GPS Battery(V),mbed Battery(V),", nmea.date(), nmea.utc_time());
tylerjw 26:85cdb1031eb1 169 queue_sensor_line.put(message);
tylerjw 29:8cdb56a0fe57 170
tylerjw 29:8cdb56a0fe57 171 sensor_wd = true; // kick the dog
tylerjw 29:8cdb56a0fe57 172
tylerjw 26:85cdb1031eb1 173 message = mpool_sensor_line.alloc();
tylerjw 29:8cdb56a0fe57 174 sprintf(message->line, "Temperature,GPS Altitude,GPS Course,");
tylerjw 29:8cdb56a0fe57 175 queue_sensor_line.put(message);
tylerjw 29:8cdb56a0fe57 176
tylerjw 29:8cdb56a0fe57 177 sensor_wd = true; // kick the dog
tylerjw 29:8cdb56a0fe57 178
tylerjw 29:8cdb56a0fe57 179 message = mpool_sensor_line.alloc();
tylerjw 29:8cdb56a0fe57 180 sprintf(message->line, "Course to Target,Distance,Left Servo,Right Servo \r\n");
tylerjw 14:dce4d8c29b17 181 queue_sensor_line.put(message);
tylerjw 19:1cfe22ef30e2 182
tylerjw 19:1cfe22ef30e2 183 while(true) {
tylerjw 13:db6af0620264 184 //get sensor line memory
tylerjw 18:29b19a25a963 185 sensor_led = !sensor_led;
tylerjw 19:1cfe22ef30e2 186
tylerjw 16:653df0cfe6ee 187 //timestamp
tylerjw 24:7477105103e5 188 time = nmea.utc_time();
tylerjw 19:1cfe22ef30e2 189
tylerjw 13:db6af0620264 190 //gps battery
tylerjw 18:29b19a25a963 191 gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
tylerjw 19:1cfe22ef30e2 192
tylerjw 16:653df0cfe6ee 193 //mbed battery
tylerjw 18:29b19a25a963 194 mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
tylerjw 19:1cfe22ef30e2 195
tylerjw 26:85cdb1031eb1 196 //temperature
tylerjw 26:85cdb1031eb1 197 temp = temperature.sample_f();
tylerjw 29:8cdb56a0fe57 198
tylerjw 27:24fd8e32511c 199 //gps
tylerjw 27:24fd8e32511c 200 distance = nmea.calc_dist_to_km(target_lat, target_lon);
tylerjw 27:24fd8e32511c 201 course_to = nmea.calc_initial_bearing(target_lat, target_lon);
tylerjw 27:24fd8e32511c 202 course = nmea.track();
tylerjw 32:4f811b397720 203
tylerjw 32:4f811b397720 204 pc.printf("course: %4.1f course_to: %4.1f distance: %f, alt: %f\r\n", course, course_to, distance, nmea.msl_altitude());
tylerjw 19:1cfe22ef30e2 205
tylerjw 29:8cdb56a0fe57 206 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 29:8cdb56a0fe57 207 sprintf(message->line, "%f,%f,%f,%f,%f,", time,gps_battery_voltage,mbed_battery_voltage,temp,nmea.calc_altitude_ft());
tylerjw 14:dce4d8c29b17 208 queue_sensor_line.put(message);
tylerjw 29:8cdb56a0fe57 209
tylerjw 29:8cdb56a0fe57 210 message = mpool_sensor_line.alloc();
tylerjw 29:8cdb56a0fe57 211 sprintf(message->line, "%f,%f,%f,%f,%f\r\n", course,course_to,distance,left_pos,right_pos);
tylerjw 29:8cdb56a0fe57 212 queue_sensor_line.put(message);
tylerjw 29:8cdb56a0fe57 213
tylerjw 29:8cdb56a0fe57 214 sensor_wd = true; // kick the dog
tylerjw 31:b9ac7d61b15b 215 Thread::wait(200);
tylerjw 0:ce5f06c3895f 216 }
tylerjw 7:d8ecabe16c9e 217 }
tylerjw 7:d8ecabe16c9e 218
tylerjw 17:4927053e120f 219 void parachute_thread(const void *args)
tylerjw 17:4927053e120f 220 {
tylerjw 28:032d55fa57b8 221 DigitalOut left_turn_led(LED4);
tylerjw 28:032d55fa57b8 222 DigitalOut right_turn_led(LED1);
tylerjw 29:8cdb56a0fe57 223 bool is_released = false;
tylerjw 29:8cdb56a0fe57 224
tylerjw 25:81c3696ba2c9 225 // servos ////////////////////////// NOT TESTED!!! ///////////////////////////
tylerjw 25:81c3696ba2c9 226 Servo left_s(p21);
tylerjw 25:81c3696ba2c9 227 Servo right_s(p22);
tylerjw 29:8cdb56a0fe57 228 Servo release_s(p23);
tylerjw 25:81c3696ba2c9 229
tylerjw 29:8cdb56a0fe57 230 left_s.calibrate_max(SERVO_L_MAX);
tylerjw 29:8cdb56a0fe57 231 left_s.calibrate_min(SERVO_L_MIN);
tylerjw 29:8cdb56a0fe57 232 right_s.calibrate_max(SERVO_R_MAX);
tylerjw 29:8cdb56a0fe57 233 right_s.calibrate_min(SERVO_R_MIN);
tylerjw 31:b9ac7d61b15b 234 release_s.calibrate_max(SERVO_RELEASE_MAX);
tylerjw 31:b9ac7d61b15b 235 release_s.calibrate_min(SERVO_RELEASE_MIN);
tylerjw 29:8cdb56a0fe57 236
tylerjw 32:4f811b397720 237 left_s = 1.0;
tylerjw 25:81c3696ba2c9 238 right_s = 0.0;
tylerjw 31:b9ac7d61b15b 239 release_s = 0.0;
tylerjw 29:8cdb56a0fe57 240
tylerjw 25:81c3696ba2c9 241 ////////////////////////////////////////////////////////////////////////////////
tylerjw 19:1cfe22ef30e2 242
tylerjw 30:b81274979e73 243 //right_turn_led = 1; // remove with watchdog on - test to determine which led is which
tylerjw 30:b81274979e73 244 //Thread::wait(1000);
tylerjw 30:b81274979e73 245 //left_turn_led = 1;
tylerjw 30:b81274979e73 246 //Thread::wait(1000);
tylerjw 32:4f811b397720 247
tylerjw 30:b81274979e73 248 int counter = 0;
tylerjw 32:4f811b397720 249
tylerjw 19:1cfe22ef30e2 250 while(true) {
tylerjw 30:b81274979e73 251 parachute_wd = true; // kick the dog
tylerjw 28:032d55fa57b8 252 right_turn_led = left_turn_led = 0;
tylerjw 29:8cdb56a0fe57 253 while( parachute_sem.wait(50) <= 0) // didn't get it (timeout)
tylerjw 29:8cdb56a0fe57 254 parachute_wd = true; // kick the dog
tylerjw 29:8cdb56a0fe57 255
tylerjw 32:4f811b397720 256 if(!is_released) {
tylerjw 31:b9ac7d61b15b 257 release_s = 1.0; // let go of the balloon
tylerjw 31:b9ac7d61b15b 258 is_released = true;
tylerjw 31:b9ac7d61b15b 259 }
tylerjw 32:4f811b397720 260
tylerjw 32:4f811b397720 261 if(counter < test_length) { // test flight -- (NOT Tested)
tylerjw 30:b81274979e73 262 left_s = test_left[counter];
tylerjw 30:b81274979e73 263 right_s = test_right[counter];
tylerjw 30:b81274979e73 264 Thread::wait(1000);
tylerjw 30:b81274979e73 265 parachute_wd = true; // kick the watchdog
tylerjw 30:b81274979e73 266 Thread::wait(1000);
tylerjw 30:b81274979e73 267 counter++;
tylerjw 30:b81274979e73 268 continue;
tylerjw 30:b81274979e73 269 }
tylerjw 32:4f811b397720 270
tylerjw 21:8799ee63c2cd 271 float distance = nmea.calc_dist_to_km(target_lat, target_lon);
tylerjw 19:1cfe22ef30e2 272
tylerjw 32:4f811b397720 273 if(distance < distance_fudge_km) {
tylerjw 30:b81274979e73 274 alarm = 1; // sound the alarm
tylerjw 19:1cfe22ef30e2 275 continue; // dont do anything
tylerjw 30:b81274979e73 276 }
tylerjw 19:1cfe22ef30e2 277
tylerjw 24:7477105103e5 278 float course = nmea.track();
tylerjw 24:7477105103e5 279 float course_to = nmea.calc_initial_bearing(target_lat, target_lon);
tylerjw 19:1cfe22ef30e2 280 float course_diff = course_to - course;
tylerjw 29:8cdb56a0fe57 281
tylerjw 22:becb67846755 282 if(course == 0.0) // not moving fast enough
tylerjw 22:becb67846755 283 continue; // do nothing
tylerjw 19:1cfe22ef30e2 284
tylerjw 21:8799ee63c2cd 285 if(course_diff < course_fudge && course_diff > neg_course_fudge) {
tylerjw 28:032d55fa57b8 286 right_turn_led = left_turn_led = 1;
tylerjw 21:8799ee63c2cd 287 Thread::wait(400);
tylerjw 19:1cfe22ef30e2 288 continue; // don't do anything
tylerjw 32:4f811b397720 289 } else if(course_diff > 180.0 || course_diff < 0.0) { // turn left
tylerjw 28:032d55fa57b8 290 left_turn_led = 1;
tylerjw 32:4f811b397720 291 right_s = right_pos = 0.0;
tylerjw 32:4f811b397720 292 left_s = left_pos = 0.0;
tylerjw 21:8799ee63c2cd 293 Thread::wait(400); // turn left
tylerjw 32:4f811b397720 294 left_s = 1.0;
tylerjw 32:4f811b397720 295 } else { // turn right
tylerjw 28:032d55fa57b8 296 right_turn_led = 1;
tylerjw 32:4f811b397720 297 left_s = left_pos = 1.0;
tylerjw 28:032d55fa57b8 298 right_s = right_pos = 1.0;
tylerjw 22:becb67846755 299 Thread::wait(400); // turn righ
tylerjw 28:032d55fa57b8 300 right_s = right_pos = 0.0;
tylerjw 21:8799ee63c2cd 301 }
tylerjw 29:8cdb56a0fe57 302 }
tylerjw 29:8cdb56a0fe57 303 }
tylerjw 29:8cdb56a0fe57 304
tylerjw 29:8cdb56a0fe57 305 void watchdog_thread(const void *args)
tylerjw 29:8cdb56a0fe57 306 {
tylerjw 29:8cdb56a0fe57 307 Watchdog wdt; // NOT TESTED!!!
tylerjw 29:8cdb56a0fe57 308
tylerjw 32:4f811b397720 309 wdt.kick(10.0);
tylerjw 29:8cdb56a0fe57 310
tylerjw 29:8cdb56a0fe57 311 while(true) {
tylerjw 29:8cdb56a0fe57 312 if(gps_wd && sensor_wd && parachute_wd && log_wd) {
tylerjw 29:8cdb56a0fe57 313 wdt.kick();
tylerjw 29:8cdb56a0fe57 314 gps_wd = sensor_wd = parachute_wd = log_wd = false;
tylerjw 29:8cdb56a0fe57 315 } else {
tylerjw 29:8cdb56a0fe57 316 Thread::wait(50);
tylerjw 29:8cdb56a0fe57 317 }
tylerjw 18:29b19a25a963 318 }
tylerjw 17:4927053e120f 319 }
tylerjw 17:4927053e120f 320
tylerjw 7:d8ecabe16c9e 321 int main()
tylerjw 7:d8ecabe16c9e 322 {
tylerjw 9:4debfbc1fb3e 323 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 324 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 14:dce4d8c29b17 325 Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 17:4927053e120f 326 Thread thread4(parachute_thread, NULL, osPriorityRealtime);
tylerjw 32:4f811b397720 327 if(WATCHDOG)
tylerjw 32:4f811b397720 328 Thread thread5(watchdog_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 329
tylerjw 25:81c3696ba2c9 330 while(true) {
tylerjw 29:8cdb56a0fe57 331 Thread::wait(osWaitForever);
tylerjw 25:81c3696ba2c9 332 }
tylerjw 0:ce5f06c3895f 333 }