Agra-GPS / FreePilot_V2-3

Dependencies:   FreePilot PinDetect mbed-src

Fork of FreePilot_V2-2 by Agra-GPS

Committer:
maximbolduc
Date:
Tue Mar 10 23:14:18 2015 +0000
Revision:
45:ecd8c2e27948
Parent:
44:e9d5cd98273d
Child:
46:d7d6dc429153
checksum fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maximbolduc 26:dc00998140af 1 #include "mbed.h"
maximbolduc 26:dc00998140af 2 #include "PinDetect.h"
maximbolduc 26:dc00998140af 3 #include "Point.h"
maximbolduc 26:dc00998140af 4 #include <vector>
maximbolduc 26:dc00998140af 5 #include "Line.h"
maximbolduc 26:dc00998140af 6 #include "stringUtils.h"
jhedmonton 28:5905886c76ee 7 #include "base.h"
jhedmonton 28:5905886c76ee 8 #include "Config.h"
maximbolduc 30:3afafa1ef16b 9 #include "imu_functions.h"
maximbolduc 32:c57bc701d65c 10 #include "atoh.h"
maximbolduc 34:c2bc9f9be7ff 11 #include "checksum.h"
maximbolduc 34:c2bc9f9be7ff 12 #include <string.h>
maximbolduc 35:f9caeb8ca31e 13
maximbolduc 33:3e71c418e90d 14 #define dot(u,v) ((u).GetX() * (v).GetX()+ (u).GetY() * (v).GetY())
maximbolduc 33:3e71c418e90d 15 #define norm(v) sqrt(dot(v,v)) // norm = length of vector
maximbolduc 33:3e71c418e90d 16 #define d(u,v) norm(point_sub(u,v)) // distance = norm of difference
maximbolduc 35:f9caeb8ca31e 17
maximbolduc 30:3afafa1ef16b 18 char *version="FreePilot V2.11 Jtan 20, 2015\r\n";
jhedmonton 27:9ac59b261d87 19 long lastsend_version=0;
jhedmonton 27:9ac59b261d87 20 Timer vTimer; //this timer is int based! Max is 30 minutes
maximbolduc 35:f9caeb8ca31e 21
maximbolduc 26:dc00998140af 22 int checksumm;
maximbolduc 26:dc00998140af 23 double distance_from_line;
maximbolduc 26:dc00998140af 24 double cm_per_deg_lon;
maximbolduc 26:dc00998140af 25 double cm_per_deg_lat;
maximbolduc 26:dc00998140af 26 //all timing objects
maximbolduc 26:dc00998140af 27 Timer gps_connecting;
maximbolduc 26:dc00998140af 28 Timer autosteer_time;
maximbolduc 36:8e84b5ade03e 29 Timer autosteer_timeout; //timeout work near as timer, but they don't give timing. they just trigger an interrupt once the time we assigned it is passed.
maximbolduc 26:dc00998140af 30 Ticker accelerometerTicker;
maximbolduc 26:dc00998140af 31 Ticker gyroscopeTicker;
maximbolduc 26:dc00998140af 32 Ticker filterTicker;
maximbolduc 26:dc00998140af 33 Ticker angle_print;
maximbolduc 35:f9caeb8ca31e 34
jhedmonton 27:9ac59b261d87 35 //Motor
jhedmonton 27:9ac59b261d87 36 PinDetect motor_switch(p16); //pinDetect is close to digitalIn, althought, it can detect holds and detect the debounce.
jhedmonton 27:9ac59b261d87 37 DigitalOut enable_motor(p7);
maximbolduc 35:f9caeb8ca31e 38
maximbolduc 37:ac60a8a0ae8a 39 PwmOut pwm1(p21);
maximbolduc 37:ac60a8a0ae8a 40 PwmOut pwm2(p22);
maximbolduc 35:f9caeb8ca31e 41
jhedmonton 27:9ac59b261d87 42 //equipment switches
jhedmonton 27:9ac59b261d87 43 PinDetect boom1(p20,PullUp); //pinDetect is close to digitalIn, althought, it can detect holds and detect the debounce.
jhedmonton 27:9ac59b261d87 44 PinDetect boom2(p19); //pinDetect is close to digitalIn, althought, it can detect holds and detect the debounce.
jhedmonton 27:9ac59b261d87 45 PinDetect boom3(p18); //pinDetect is close to digitalIn, althought, it can detect holds and detect the debounce.
jhedmonton 27:9ac59b261d87 46 PinDetect boom4(p17); //pinDetect is close to digitalIn, althought, it can detect holds and detect the debounce.
maximbolduc 35:f9caeb8ca31e 47
jhedmonton 27:9ac59b261d87 48 char boom18; //1 byte
jhedmonton 27:9ac59b261d87 49 char lastboom18; //1 byte
maximbolduc 35:f9caeb8ca31e 50 char boomstate[8]= {'$','F','B','S',0,13,10,0 };
maximbolduc 35:f9caeb8ca31e 51
maximbolduc 35:f9caeb8ca31e 52 double filterg = 100;
maximbolduc 26:dc00998140af 53 Point position;
maximbolduc 26:dc00998140af 54 Point looked_ahead;
maximbolduc 26:dc00998140af 55 Point line_start;
maximbolduc 26:dc00998140af 56 Point line_end;
maximbolduc 26:dc00998140af 57 Point tilt_compensated_position;
maximbolduc 26:dc00998140af 58 Point yaw_compensated_position;
maximbolduc 35:f9caeb8ca31e 59
maximbolduc 32:c57bc701d65c 60 extern int gyro_pos;
maximbolduc 26:dc00998140af 61 double distance_to_line;
maximbolduc 35:f9caeb8ca31e 62
maximbolduc 26:dc00998140af 63 //FreePilot variables
maximbolduc 26:dc00998140af 64 int timer_enabled;
jhedmonton 28:5905886c76ee 65 double motorspeed;
maximbolduc 26:dc00998140af 66 int enable_time;
maximbolduc 26:dc00998140af 67 char* motor_enable_state = 0;
jhedmonton 28:5905886c76ee 68 int motor_enable = 0;
jhedmonton 28:5905886c76ee 69 int lastmotor_enable = 1;
maximbolduc 26:dc00998140af 70 double pwm1_speed;
maximbolduc 26:dc00998140af 71 double pwm2_speed;
jhedmonton 28:5905886c76ee 72 long lastsend_motorstate=0;
jhedmonton 28:5905886c76ee 73 Timer motTimer; //this timer is int based! Max is 30 minutes
jhedmonton 28:5905886c76ee 74 Timer btTimer; //measure time for Bluetooth communication
jhedmonton 28:5905886c76ee 75 long lastgetBT=0;
maximbolduc 35:f9caeb8ca31e 76
maximbolduc 26:dc00998140af 77 int msg2_changed = 1;
maximbolduc 26:dc00998140af 78 char* buffer;
maximbolduc 26:dc00998140af 79 double meter_lat = 0;
maximbolduc 26:dc00998140af 80 double meter_lon = 0;
maximbolduc 35:f9caeb8ca31e 81
maximbolduc 26:dc00998140af 82 char msg[256]; //GPS line buffer
maximbolduc 26:dc00998140af 83 char msg2[256];//PC line buffer
maximbolduc 45:ecd8c2e27948 84 char* result;
maximbolduc 26:dc00998140af 85 int printing;
maximbolduc 26:dc00998140af 86 int num_of_gps_sats;
maximbolduc 35:f9caeb8ca31e 87
maximbolduc 26:dc00998140af 88 double decimal_lon;
maximbolduc 26:dc00998140af 89 float longitude;
maximbolduc 26:dc00998140af 90 float latitude;
maximbolduc 26:dc00998140af 91 char ns, ew;
maximbolduc 26:dc00998140af 92 int lock;
maximbolduc 26:dc00998140af 93 int flag_gga;
maximbolduc 26:dc00998140af 94 int reading;
maximbolduc 26:dc00998140af 95 double decimal_latitude;
maximbolduc 26:dc00998140af 96 int gps_satellite_quality;
maximbolduc 26:dc00998140af 97 int day;
maximbolduc 26:dc00998140af 98 int hour;
maximbolduc 26:dc00998140af 99 int minute;
maximbolduc 26:dc00998140af 100 int second;
maximbolduc 26:dc00998140af 101 int tenths;
maximbolduc 26:dc00998140af 102 int hundreths;
maximbolduc 26:dc00998140af 103 char status;
maximbolduc 26:dc00998140af 104 double track; // track made good . angle
maximbolduc 26:dc00998140af 105 char magvar_dir;
maximbolduc 26:dc00998140af 106 double magvar;
maximbolduc 26:dc00998140af 107 int year;
maximbolduc 26:dc00998140af 108 int month;
maximbolduc 26:dc00998140af 109 double speed_km;
maximbolduc 26:dc00998140af 110 double speed_m_s = 0;
maximbolduc 26:dc00998140af 111 double velocity; // speed in knot
maximbolduc 26:dc00998140af 112 int connect_time = 10000; //variable to change the time that the serial output all the strings in order to verify if the command was right.
maximbolduc 26:dc00998140af 113 int connecting = 0; //are we still in phase of connecting? based on the connect_time value.
maximbolduc 35:f9caeb8ca31e 114
maximbolduc 26:dc00998140af 115 int angle_send = 0;
maximbolduc 26:dc00998140af 116 int correct_rmc = 1;
maximbolduc 26:dc00998140af 117 double m_lat = 0;
maximbolduc 26:dc00998140af 118 double m_lon = 0;
maximbolduc 26:dc00998140af 119 char* degminsec;
maximbolduc 26:dc00998140af 120 double m_per_deg_lon;
maximbolduc 26:dc00998140af 121 double m_per_deg_lat;
maximbolduc 26:dc00998140af 122 double look_ahead_lon;
maximbolduc 26:dc00998140af 123 double look_ahead_lat;
maximbolduc 26:dc00998140af 124 int active_AB = 0;
maximbolduc 26:dc00998140af 125 double compensation_vector;
maximbolduc 26:dc00998140af 126 char output[256];
maximbolduc 35:f9caeb8ca31e 127
maximbolduc 26:dc00998140af 128 double yaw;
maximbolduc 26:dc00998140af 129 double pitch;
maximbolduc 26:dc00998140af 130 double roll;
maximbolduc 35:f9caeb8ca31e 131
maximbolduc 30:3afafa1ef16b 132 double a_x;
maximbolduc 30:3afafa1ef16b 133 double a_y;
maximbolduc 30:3afafa1ef16b 134 double a_z;
maximbolduc 30:3afafa1ef16b 135 double w_x;
maximbolduc 30:3afafa1ef16b 136 double w_y;
maximbolduc 30:3afafa1ef16b 137 double w_z;
maximbolduc 35:f9caeb8ca31e 138
maximbolduc 26:dc00998140af 139 int readings[3];
maximbolduc 26:dc00998140af 140 double Freepilot_bearing;
maximbolduc 35:f9caeb8ca31e 141
maximbolduc 36:8e84b5ade03e 142 int time_till_stop = 200;
maximbolduc 26:dc00998140af 143 volatile bool newline_detected = false;
maximbolduc 35:f9caeb8ca31e 144
maximbolduc 26:dc00998140af 145 Point point_add(Point a, Point b)
maximbolduc 26:dc00998140af 146 {
maximbolduc 26:dc00998140af 147 return Point(a.GetX() + b.GetX(), a.GetY() + b.GetY());
maximbolduc 26:dc00998140af 148 }
maximbolduc 35:f9caeb8ca31e 149
maximbolduc 26:dc00998140af 150 Point point_sub(Point a , Point b)
maximbolduc 26:dc00998140af 151 {
maximbolduc 26:dc00998140af 152 return Point(a.GetX() - b.GetX(), a.GetY() - b.GetY());
maximbolduc 26:dc00998140af 153 }
maximbolduc 35:f9caeb8ca31e 154
maximbolduc 33:3e71c418e90d 155 double get_yaw()
maximbolduc 33:3e71c418e90d 156 {
maximbolduc 35:f9caeb8ca31e 157 double yaw_angle = imuFilter.getYaw() * -1 ; // *-1 to reverse polarity as gyro is up-side-down
maximbolduc 33:3e71c418e90d 158 return yaw_angle;
maximbolduc 33:3e71c418e90d 159 }
maximbolduc 35:f9caeb8ca31e 160
maximbolduc 33:3e71c418e90d 161 double get_roll()
maximbolduc 33:3e71c418e90d 162 {
maximbolduc 33:3e71c418e90d 163 double roll_angle = 0;
maximbolduc 35:f9caeb8ca31e 164 if ( gyro_pos == 0 ) {
maximbolduc 33:3e71c418e90d 165 roll_angle = imuFilter.getRoll();
maximbolduc 35:f9caeb8ca31e 166 } else if ( gyro_pos == 1 ) {
maximbolduc 33:3e71c418e90d 167 roll_angle = imuFilter.getRoll() * -1;
maximbolduc 35:f9caeb8ca31e 168 } else if( gyro_pos == 2 ) {
maximbolduc 33:3e71c418e90d 169 roll_angle = imuFilter.getPitch() * -1;
maximbolduc 35:f9caeb8ca31e 170 } else if ( gyro_pos == 3 ) {
maximbolduc 33:3e71c418e90d 171 roll_angle = imuFilter.getPitch();
maximbolduc 33:3e71c418e90d 172 }
maximbolduc 33:3e71c418e90d 173 return roll_angle;
maximbolduc 33:3e71c418e90d 174 }
maximbolduc 35:f9caeb8ca31e 175
maximbolduc 33:3e71c418e90d 176 double get_pitch()
maximbolduc 33:3e71c418e90d 177 {
maximbolduc 33:3e71c418e90d 178 double pitch_angle = 0;
maximbolduc 35:f9caeb8ca31e 179 if ( gyro_pos == 0 ) {
maximbolduc 35:f9caeb8ca31e 180 pitch_angle = imuFilter.getPitch();
maximbolduc 35:f9caeb8ca31e 181 } else if ( gyro_pos == 1 ) {
maximbolduc 33:3e71c418e90d 182 pitch_angle = imuFilter.getPitch() * -1;
maximbolduc 35:f9caeb8ca31e 183 } else if( gyro_pos == 2 ) {
maximbolduc 33:3e71c418e90d 184 pitch_angle = imuFilter.getRoll();
maximbolduc 35:f9caeb8ca31e 185 } else if ( gyro_pos == 3 ) {
maximbolduc 35:f9caeb8ca31e 186 pitch_angle = imuFilter.getRoll() * -1;
maximbolduc 35:f9caeb8ca31e 187 }
maximbolduc 33:3e71c418e90d 188 return pitch_angle;
maximbolduc 33:3e71c418e90d 189 }
maximbolduc 35:f9caeb8ca31e 190
maximbolduc 26:dc00998140af 191 double dist_Point_to_Line( Point P, Point line_start, Point line_end)
maximbolduc 26:dc00998140af 192 {
maximbolduc 35:f9caeb8ca31e 193 Point v = point_sub(line_end,line_start);
maximbolduc 35:f9caeb8ca31e 194 Point w = point_sub(P,line_start);
maximbolduc 35:f9caeb8ca31e 195
maximbolduc 35:f9caeb8ca31e 196 double c1 = dot(w,v);
maximbolduc 35:f9caeb8ca31e 197 double c2 = dot(v,v);
maximbolduc 35:f9caeb8ca31e 198 double b = c1 / c2;
maximbolduc 35:f9caeb8ca31e 199
maximbolduc 35:f9caeb8ca31e 200 Point resulting(b * v.GetX(),b*v.GetY());
maximbolduc 35:f9caeb8ca31e 201 Point Pb = point_add(line_start, resulting);
maximbolduc 38:b5352d6f8166 202
maximbolduc 35:f9caeb8ca31e 203 return d(P, Pb);
maximbolduc 26:dc00998140af 204 }
maximbolduc 35:f9caeb8ca31e 205
maximbolduc 26:dc00998140af 206 double lat_to_deg(char *s, char north_south)
maximbolduc 26:dc00998140af 207 {
maximbolduc 26:dc00998140af 208 int deg, min, sec;
maximbolduc 26:dc00998140af 209 double fsec, val;
maximbolduc 35:f9caeb8ca31e 210
maximbolduc 26:dc00998140af 211 deg = ( (s[0] - '0') * 10) + s[1] - '0';
maximbolduc 26:dc00998140af 212 min = ( (s[2] - '0') * 10) + s[3] - '0';
maximbolduc 26:dc00998140af 213 sec = ( ((s[5] - '0') * 1000) + ((s[6] - '0') * 100) + ((s[7] - '0') * 10) + (s[8] - '0'));
maximbolduc 26:dc00998140af 214 fsec = (double)((double)sec /10000.0);
maximbolduc 26:dc00998140af 215 val = (double)deg + ((double)((double)min/60.0)) + (fsec/60.0);
maximbolduc 35:f9caeb8ca31e 216 if (north_south == 'S') {
maximbolduc 26:dc00998140af 217 val *= -1.0;
maximbolduc 26:dc00998140af 218 }
maximbolduc 26:dc00998140af 219 return val;
maximbolduc 26:dc00998140af 220 }
maximbolduc 35:f9caeb8ca31e 221
maximbolduc 30:3afafa1ef16b 222 // isLeft(): test if a point is Left|On|Right of an infinite 2D line.
maximbolduc 30:3afafa1ef16b 223 // Input: three points P0, P1, and P2
maximbolduc 30:3afafa1ef16b 224 // Return: >0 for P2 left of the line through P0 to P1
maximbolduc 30:3afafa1ef16b 225 // =0 for P2 on the line
maximbolduc 30:3afafa1ef16b 226 // <0 for P2 right of the line
maximbolduc 35:f9caeb8ca31e 227 int isLeft( Point P0, Point P1, Point P2 )
maximbolduc 30:3afafa1ef16b 228 {
maximbolduc 35:f9caeb8ca31e 229 double isleft = ( (P1.GetY() - P0.GetY()) * (P2.GetX() - P0.GetX()) - (P2.GetY() - P0.GetY()) * (P1.GetX() - P0.GetX()));
maximbolduc 35:f9caeb8ca31e 230 if ( isleft > 0 ) {
maximbolduc 35:f9caeb8ca31e 231 isleft = 1;
maximbolduc 35:f9caeb8ca31e 232 } else {
maximbolduc 35:f9caeb8ca31e 233 isleft = -1;
maximbolduc 35:f9caeb8ca31e 234 }
maximbolduc 35:f9caeb8ca31e 235 return (int)isleft;
maximbolduc 30:3afafa1ef16b 236 }
maximbolduc 35:f9caeb8ca31e 237
maximbolduc 26:dc00998140af 238 double lon_to_deg(char *s, char east_west)
maximbolduc 26:dc00998140af 239 {
maximbolduc 26:dc00998140af 240 int deg, min, sec;
maximbolduc 26:dc00998140af 241 double fsec, val;
maximbolduc 26:dc00998140af 242 deg = ( (s[0] - '0') * 100) + ((s[1] - '0') * 10) + (s[2] - '0');
maximbolduc 26:dc00998140af 243 min = ( (s[3] - '0') * 10) + s[4] - '0';
maximbolduc 26:dc00998140af 244 sec = ( ((s[6] - '0') * 1000) + ((s[7] - '0') * 100) + ((s[8] - '0') * 10) + (s[9] - '0'));
maximbolduc 26:dc00998140af 245 fsec = (double)((double)sec /10000.0);
maximbolduc 26:dc00998140af 246 val = (double)deg + ((double)((double)min/60.0)) + (fsec/60.0);
maximbolduc 38:b5352d6f8166 247
maximbolduc 35:f9caeb8ca31e 248 if (east_west == 'W') {
maximbolduc 26:dc00998140af 249 val *= -1.0;
maximbolduc 26:dc00998140af 250 }
maximbolduc 26:dc00998140af 251 return val;
maximbolduc 26:dc00998140af 252 }
maximbolduc 35:f9caeb8ca31e 253
maximbolduc 26:dc00998140af 254 void nmea_gga(char *s)
maximbolduc 26:dc00998140af 255 {
maximbolduc 26:dc00998140af 256 char *token;
maximbolduc 26:dc00998140af 257 int token_counter = 0;
maximbolduc 26:dc00998140af 258 char *latitude = (char *)NULL;
maximbolduc 26:dc00998140af 259 char *longitude = (char *)NULL;
maximbolduc 26:dc00998140af 260 char *lat_dir = (char *)NULL;
maximbolduc 26:dc00998140af 261 char *lon_dir = (char *)NULL;
maximbolduc 26:dc00998140af 262 char *qual = (char *)NULL;
maximbolduc 26:dc00998140af 263 char *altitude = (char *)NULL;
maximbolduc 26:dc00998140af 264 char *sats = (char *)NULL;
maximbolduc 35:f9caeb8ca31e 265
maximbolduc 26:dc00998140af 266 token = strtok(s, ",");
maximbolduc 35:f9caeb8ca31e 267 while (token) {
maximbolduc 35:f9caeb8ca31e 268 switch (token_counter) {
maximbolduc 26:dc00998140af 269 case 2:
maximbolduc 26:dc00998140af 270 latitude = token;
maximbolduc 26:dc00998140af 271 break;
maximbolduc 26:dc00998140af 272 case 4:
maximbolduc 26:dc00998140af 273 longitude = token;
maximbolduc 26:dc00998140af 274 break;
maximbolduc 26:dc00998140af 275 case 3:
maximbolduc 26:dc00998140af 276 lat_dir = token;
maximbolduc 26:dc00998140af 277 break;
maximbolduc 26:dc00998140af 278 case 5:
maximbolduc 26:dc00998140af 279 lon_dir = token;
maximbolduc 26:dc00998140af 280 break;
maximbolduc 26:dc00998140af 281 case 6:
maximbolduc 26:dc00998140af 282 qual = token;
maximbolduc 26:dc00998140af 283 break;
maximbolduc 26:dc00998140af 284 case 7:
maximbolduc 26:dc00998140af 285 sats = token;
maximbolduc 26:dc00998140af 286 break;
maximbolduc 26:dc00998140af 287 case 9:
maximbolduc 26:dc00998140af 288 altitude = token;
maximbolduc 26:dc00998140af 289 break;
maximbolduc 26:dc00998140af 290 }
maximbolduc 26:dc00998140af 291 token = strtok((char *)NULL, ",");
maximbolduc 26:dc00998140af 292 token_counter++;
maximbolduc 26:dc00998140af 293 }
maximbolduc 35:f9caeb8ca31e 294 if (latitude && longitude && altitude && sats) {
maximbolduc 26:dc00998140af 295 decimal_latitude = lat_to_deg(latitude, lat_dir[0]);
maximbolduc 26:dc00998140af 296 decimal_lon = lon_to_deg(longitude, lon_dir[0]);
maximbolduc 26:dc00998140af 297 num_of_gps_sats = atoi(sats);
maximbolduc 26:dc00998140af 298 gps_satellite_quality = atoi(qual);
maximbolduc 35:f9caeb8ca31e 299 } else {
maximbolduc 26:dc00998140af 300 gps_satellite_quality = 0;
maximbolduc 26:dc00998140af 301 }
maximbolduc 26:dc00998140af 302 }
maximbolduc 35:f9caeb8ca31e 303
maximbolduc 35:f9caeb8ca31e 304 void autosteer_done()
maximbolduc 35:f9caeb8ca31e 305 {
maximbolduc 35:f9caeb8ca31e 306 enable_motor = 0;
maximbolduc 35:f9caeb8ca31e 307 }
maximbolduc 35:f9caeb8ca31e 308
maximbolduc 26:dc00998140af 309 //from farmerGPS code
maximbolduc 26:dc00998140af 310 void get_latlon_byangle(double lat1, double lon1, double distance,double angle, double &lon2, double &lat2)
maximbolduc 26:dc00998140af 311 {
maximbolduc 26:dc00998140af 312 double ydist = 0;
maximbolduc 26:dc00998140af 313 double xdist = 0;
maximbolduc 26:dc00998140af 314 angle = angle + 180;
maximbolduc 26:dc00998140af 315 double radiant = angle * 3.14159265359 / 180;
maximbolduc 26:dc00998140af 316 double sinr = sin(radiant);
maximbolduc 26:dc00998140af 317 double cosr = cos(radiant);
maximbolduc 26:dc00998140af 318 xdist = cosr * distance;
maximbolduc 26:dc00998140af 319 ydist = sinr * distance;
maximbolduc 26:dc00998140af 320 lat2 = lat1 + (ydist / (69.09 * -1609.344));
maximbolduc 26:dc00998140af 321 lon2 = lon1 - (xdist / (69.09 * 1609.344 * cos(lat1/57.295779513)));
maximbolduc 26:dc00998140af 322 }
maximbolduc 35:f9caeb8ca31e 323
maximbolduc 26:dc00998140af 324 Point compensation;
maximbolduc 35:f9caeb8ca31e 325
maximbolduc 26:dc00998140af 326 void yaw_compensate()
maximbolduc 26:dc00998140af 327 {
maximbolduc 33:3e71c418e90d 328 yaw = get_yaw();
maximbolduc 26:dc00998140af 329 }
maximbolduc 34:c2bc9f9be7ff 330
maximbolduc 35:f9caeb8ca31e 331 void pitch_and_roll(double real_bearing)
maximbolduc 34:c2bc9f9be7ff 332 {
maximbolduc 34:c2bc9f9be7ff 333 pitch = get_pitch();
maximbolduc 34:c2bc9f9be7ff 334 roll = get_roll();
maximbolduc 34:c2bc9f9be7ff 335 compensation.SetX(antennaheight * tan(roll) * sin(real_bearing/ 57.295779513)-antennaheight * tan(pitch) * cos(real_bearing/ 57.295779513));
maximbolduc 34:c2bc9f9be7ff 336 compensation.SetY(antennaheight * tan(roll) * cos(real_bearing/ 57.295779513)-antennaheight * tan(pitch) * sin(real_bearing/ 57.295779513));
maximbolduc 34:c2bc9f9be7ff 337 }
maximbolduc 33:3e71c418e90d 338
maximbolduc 26:dc00998140af 339 void process_GPSHEIGHT(char* height_string)
maximbolduc 26:dc00998140af 340 {
maximbolduc 26:dc00998140af 341 char *token;
maximbolduc 26:dc00998140af 342 int token_counter = 0;
maximbolduc 26:dc00998140af 343 char *height = (char *)NULL;
maximbolduc 26:dc00998140af 344 token = strtok(height_string, ",");
maximbolduc 35:f9caeb8ca31e 345 while (token) {
maximbolduc 35:f9caeb8ca31e 346 switch (token_counter) {
maximbolduc 26:dc00998140af 347 case 1:
maximbolduc 26:dc00998140af 348 height = token;
maximbolduc 26:dc00998140af 349 break;
maximbolduc 26:dc00998140af 350 }
maximbolduc 26:dc00998140af 351 token = strtok((char *)NULL, ",");
maximbolduc 26:dc00998140af 352 token_counter++;
maximbolduc 26:dc00998140af 353 }
maximbolduc 35:f9caeb8ca31e 354 if ( height ) {
jhedmonton 28:5905886c76ee 355 antennaheight = atof(height);
maximbolduc 42:854d8cc26bbb 356 // Config_Save();
maximbolduc 26:dc00998140af 357 }
maximbolduc 26:dc00998140af 358 }
maximbolduc 26:dc00998140af 359
maximbolduc 35:f9caeb8ca31e 360 char dms[128];
maximbolduc 34:c2bc9f9be7ff 361 char* To_DMS(double dec_deg)
maximbolduc 34:c2bc9f9be7ff 362 {
maximbolduc 34:c2bc9f9be7ff 363 dec_deg = abs(dec_deg);
maximbolduc 34:c2bc9f9be7ff 364 int d = (int)(dec_deg);
maximbolduc 34:c2bc9f9be7ff 365 sprintf(dms,"%0.2i\0",d);
maximbolduc 34:c2bc9f9be7ff 366 double m = (double)(((double)dec_deg - (double)d) * 60.0);
maximbolduc 34:c2bc9f9be7ff 367 if (m < 10 ) {
maximbolduc 34:c2bc9f9be7ff 368 sprintf(dms,"%s0%0.9f\0",dms,m);
maximbolduc 34:c2bc9f9be7ff 369 } else {
maximbolduc 34:c2bc9f9be7ff 370 sprintf(dms,"%s%0.9f\0",dms,m);
maximbolduc 34:c2bc9f9be7ff 371 }
maximbolduc 34:c2bc9f9be7ff 372 return dms;
maximbolduc 34:c2bc9f9be7ff 373 }
maximbolduc 34:c2bc9f9be7ff 374
maximbolduc 34:c2bc9f9be7ff 375 char* To_DMS_lon(double dec_deg)
maximbolduc 34:c2bc9f9be7ff 376 {
maximbolduc 34:c2bc9f9be7ff 377 dec_deg = abs(dec_deg);
maximbolduc 34:c2bc9f9be7ff 378 int d = (int)(dec_deg);
maximbolduc 34:c2bc9f9be7ff 379 sprintf(dms,"%0.3i\0",d);
maximbolduc 34:c2bc9f9be7ff 380 double m = (double)(((double)dec_deg - (double)d) * 60.0);
maximbolduc 34:c2bc9f9be7ff 381 if (m < 10 ) {
maximbolduc 34:c2bc9f9be7ff 382 sprintf(dms,"%s0%0.9f\0",dms,m);
maximbolduc 34:c2bc9f9be7ff 383 } else {
maximbolduc 34:c2bc9f9be7ff 384 sprintf(dms,"%s%0.9f\0",dms,m);
maximbolduc 34:c2bc9f9be7ff 385 }
maximbolduc 34:c2bc9f9be7ff 386 return dms;
maximbolduc 34:c2bc9f9be7ff 387 }
maximbolduc 34:c2bc9f9be7ff 388
maximbolduc 35:f9caeb8ca31e 389 //sets pwm1 and pwm2 and enable_motor
maximbolduc 35:f9caeb8ca31e 390 void process_ASTEER(char* asteer)
maximbolduc 35:f9caeb8ca31e 391 {
maximbolduc 35:f9caeb8ca31e 392 char *token;
maximbolduc 35:f9caeb8ca31e 393 int token_counter = 0;
maximbolduc 35:f9caeb8ca31e 394 char *asteer_speed = (char *)NULL;
maximbolduc 35:f9caeb8ca31e 395 char *asteer_time = (char *)NULL;
maximbolduc 35:f9caeb8ca31e 396 token = strtok(asteer, ",");
maximbolduc 35:f9caeb8ca31e 397 while (token) {
maximbolduc 35:f9caeb8ca31e 398 switch (token_counter) {
maximbolduc 35:f9caeb8ca31e 399 case 1:
maximbolduc 35:f9caeb8ca31e 400 asteer_speed = token;
maximbolduc 35:f9caeb8ca31e 401 break;
maximbolduc 35:f9caeb8ca31e 402 case 2:
maximbolduc 35:f9caeb8ca31e 403 asteer_time = token;
maximbolduc 35:f9caeb8ca31e 404 break;
maximbolduc 35:f9caeb8ca31e 405 }
maximbolduc 35:f9caeb8ca31e 406 token = strtok((char *)NULL, ",");
maximbolduc 35:f9caeb8ca31e 407 token_counter++;
maximbolduc 35:f9caeb8ca31e 408 }
maximbolduc 35:f9caeb8ca31e 409 if ( asteer_speed && asteer_time ) {
maximbolduc 35:f9caeb8ca31e 410 motorspeed = atof(asteer_speed);
maximbolduc 35:f9caeb8ca31e 411 enable_time = atof(asteer_time);
maximbolduc 36:8e84b5ade03e 412 autosteer_timeout.reset();
maximbolduc 36:8e84b5ade03e 413 time_till_stop = atoi(asteer_time);
maximbolduc 37:ac60a8a0ae8a 414 if ( motor_enable == 0 ) {
maximbolduc 35:f9caeb8ca31e 415 } else {
maximbolduc 37:ac60a8a0ae8a 416 if ( motorspeed > 127.0 ) {
maximbolduc 37:ac60a8a0ae8a 417 pwm2_speed = 0.0;
maximbolduc 37:ac60a8a0ae8a 418 pwm1_speed = ((double)motorspeed - (double)127.0) / 128.0;
maximbolduc 37:ac60a8a0ae8a 419
maximbolduc 37:ac60a8a0ae8a 420 } else if ( motorspeed < 127.0 ) {
maximbolduc 37:ac60a8a0ae8a 421 pwm1_speed = 0.0;
maximbolduc 37:ac60a8a0ae8a 422 pwm2_speed = ( ((double)127-(double)motorspeed) / 128.0 );
maximbolduc 37:ac60a8a0ae8a 423 } else {
maximbolduc 37:ac60a8a0ae8a 424 pwm1_speed = 0;
maximbolduc 37:ac60a8a0ae8a 425 pwm2_speed = 0;
maximbolduc 37:ac60a8a0ae8a 426 enable_motor = 0;
maximbolduc 37:ac60a8a0ae8a 427 }
maximbolduc 37:ac60a8a0ae8a 428 // if(Authenticated)
maximbolduc 37:ac60a8a0ae8a 429 // {
maximbolduc 37:ac60a8a0ae8a 430 pwm1 = pwm1_speed;
maximbolduc 37:ac60a8a0ae8a 431 pwm2 = pwm2_speed;
maximbolduc 37:ac60a8a0ae8a 432 enable_motor = 1;
maximbolduc 38:b5352d6f8166 433 //}
maximbolduc 35:f9caeb8ca31e 434 }
maximbolduc 35:f9caeb8ca31e 435 }
maximbolduc 35:f9caeb8ca31e 436 }
maximbolduc 35:f9caeb8ca31e 437
maximbolduc 38:b5352d6f8166 438 char *strsep(char **stringp, char *delim)
maximbolduc 38:b5352d6f8166 439 {
maximbolduc 38:b5352d6f8166 440 char *s;
maximbolduc 38:b5352d6f8166 441 const char *spanp;
maximbolduc 38:b5352d6f8166 442 int c, sc;
maximbolduc 38:b5352d6f8166 443 char *tok;
maximbolduc 38:b5352d6f8166 444 if ((s = *stringp) == NULL)
maximbolduc 38:b5352d6f8166 445 return (NULL);
maximbolduc 38:b5352d6f8166 446 for (tok = s;;) {
maximbolduc 38:b5352d6f8166 447 c = *s++;
maximbolduc 38:b5352d6f8166 448 spanp = delim;
maximbolduc 38:b5352d6f8166 449 do {
maximbolduc 38:b5352d6f8166 450 if ((sc = *spanp++) == c) {
maximbolduc 38:b5352d6f8166 451 if (c == 0)
maximbolduc 38:b5352d6f8166 452 s = NULL;
maximbolduc 38:b5352d6f8166 453 else
maximbolduc 38:b5352d6f8166 454 s[-1] = 0;
maximbolduc 38:b5352d6f8166 455 *stringp = s;
maximbolduc 38:b5352d6f8166 456 return (tok);
maximbolduc 38:b5352d6f8166 457 }
maximbolduc 38:b5352d6f8166 458 } while (sc != 0);
maximbolduc 38:b5352d6f8166 459 }
maximbolduc 38:b5352d6f8166 460 /* NOTREACHED */
maximbolduc 38:b5352d6f8166 461 }
maximbolduc 38:b5352d6f8166 462
maximbolduc 41:a26acd346c2f 463 //Maybe you rather use the routine I currently use in FarmerGPS? It uses a lookahead and simply distance to AB-line.
maximbolduc 41:a26acd346c2f 464 //No heading error at all.
maximbolduc 41:a26acd346c2f 465
maximbolduc 41:a26acd346c2f 466 //ControlSteerFilter is the main routine. ActiveTime in ms, typically under 200ms, distAUTOL is distance to AB line at lookahead position
maximbolduc 41:a26acd346c2f 467 /*#include "mbed.h"
maximbolduc 41:a26acd346c2f 468 #include <string.h>
maximbolduc 41:a26acd346c2f 469 #include <math.h>
maximbolduc 41:a26acd346c2f 470 #include <stdlib.h>*/
maximbolduc 41:a26acd346c2f 471
maximbolduc 41:a26acd346c2f 472 #ifndef PI
maximbolduc 41:a26acd346c2f 473 #define PI 3.14159265359
maximbolduc 41:a26acd346c2f 474 #endif
maximbolduc 41:a26acd346c2f 475
maximbolduc 42:854d8cc26bbb 476 double m_Tcenter[5] = {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 477 double mphaseadv[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 478 double morder[5]= {0,0,0,0,0};
maximbolduc 41:a26acd346c2f 479 int order;
maximbolduc 42:854d8cc26bbb 480 double B0[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 481 double B1[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 482 double B2[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 483 double B3[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 484 double A_1[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 485 double A_2[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 486 double A_3[5]= {0,0,0,0,0};
maximbolduc 41:a26acd346c2f 487
maximbolduc 42:854d8cc26bbb 488 double mx[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 489 double my[5]= {0,0,0,0,0};
maximbolduc 42:854d8cc26bbb 490 double mz[5]= {0,0,0,0,0};
maximbolduc 41:a26acd346c2f 491 int Err_aPort = 0;
maximbolduc 41:a26acd346c2f 492
maximbolduc 41:a26acd346c2f 493 double OutputValue = 0;
maximbolduc 41:a26acd346c2f 494 double OutputTime = 0;
maximbolduc 41:a26acd346c2f 495 double LastOutputValue = 0;
maximbolduc 41:a26acd346c2f 496
maximbolduc 41:a26acd346c2f 497 double SpeedN = 1;
maximbolduc 41:a26acd346c2f 498 int porder = 0;
maximbolduc 41:a26acd346c2f 499
maximbolduc 41:a26acd346c2f 500 std::string itos(int n)
maximbolduc 41:a26acd346c2f 501 {
maximbolduc 41:a26acd346c2f 502 const int max_size = std::numeric_limits<int>::digits10 + 1 /*sign*/ + 1 /*0-terminator*/;
maximbolduc 41:a26acd346c2f 503 char buffer[max_size] = {0};
maximbolduc 41:a26acd346c2f 504 sprintf(buffer, "%d", n);
maximbolduc 41:a26acd346c2f 505 return std::string(buffer);
maximbolduc 41:a26acd346c2f 506 }
maximbolduc 41:a26acd346c2f 507
maximbolduc 41:a26acd346c2f 508 void SetDigitalFilter(double phaseadv, double _Tcenter, int filternumber)
maximbolduc 41:a26acd346c2f 509 {
maximbolduc 41:a26acd346c2f 510 m_Tcenter[filternumber] = _Tcenter;
maximbolduc 41:a26acd346c2f 511 mphaseadv[filternumber] = phaseadv;
maximbolduc 41:a26acd346c2f 512 morder[filternumber] = porder;
maximbolduc 41:a26acd346c2f 513 _Tcenter = _Tcenter / 2 / PI;
maximbolduc 41:a26acd346c2f 514 order = porder;
maximbolduc 41:a26acd346c2f 515
maximbolduc 41:a26acd346c2f 516 double T1T2ratio = (1 + sin(phaseadv * PI / 180)) / (1 - sin(phaseadv * PI / 180));
maximbolduc 41:a26acd346c2f 517 double _T1 = sqrt(T1T2ratio) * _Tcenter;
maximbolduc 41:a26acd346c2f 518 double _T2 =_T1 / T1T2ratio;
maximbolduc 41:a26acd346c2f 519 double _T = 0.2;
maximbolduc 41:a26acd346c2f 520 double _K = (1 + 2 * _T1 / _T);
maximbolduc 41:a26acd346c2f 521 double _L = (1 - 2 * _T1 / _T);
maximbolduc 41:a26acd346c2f 522 double _M = (1 + 2 * _T2 / _T);
maximbolduc 41:a26acd346c2f 523 double _N = (1 - 2 * _T2 / _T);
maximbolduc 42:854d8cc26bbb 524 // order = 2;
maximbolduc 41:a26acd346c2f 525 //version 1,
maximbolduc 41:a26acd346c2f 526 switch (order) {
maximbolduc 41:a26acd346c2f 527 case 3:
maximbolduc 41:a26acd346c2f 528 B0[filternumber] = pow(_K, 3) / pow(_M, 3);
maximbolduc 41:a26acd346c2f 529 B1[filternumber] = 3 * pow(_K, 2) * _L / pow(_M, 3);
maximbolduc 41:a26acd346c2f 530 B2[filternumber] = 3 * _K * pow(_L, 2) / pow(_M, 3);
maximbolduc 41:a26acd346c2f 531 B3[filternumber] = pow(_L, 3) / pow(_M, 3);
maximbolduc 41:a26acd346c2f 532
maximbolduc 41:a26acd346c2f 533 A_1[filternumber] = 3 * _N / _M;
maximbolduc 41:a26acd346c2f 534 A_2[filternumber] = 3 * pow(_N, 2) / pow(_M, 2);
maximbolduc 41:a26acd346c2f 535 A_3[filternumber] = pow(_N, 3) / pow(_M, 3);
maximbolduc 41:a26acd346c2f 536 break;
maximbolduc 41:a26acd346c2f 537 case 2:
maximbolduc 41:a26acd346c2f 538 B0[filternumber] = pow(_K, 2) / pow(_M, 2);
maximbolduc 41:a26acd346c2f 539 B1[filternumber] = 2 * _K * _L / pow(_M, 2);
maximbolduc 41:a26acd346c2f 540 B2[filternumber] = pow(_L, 2) / pow(_M, 2);
maximbolduc 41:a26acd346c2f 541 B3[filternumber] = 0;
maximbolduc 41:a26acd346c2f 542
maximbolduc 41:a26acd346c2f 543 A_1[filternumber] = 2 * _N / _M;
maximbolduc 41:a26acd346c2f 544 A_2[filternumber] = pow(_N, 2) / pow(_M, 2);
maximbolduc 41:a26acd346c2f 545 A_3[filternumber] = 0;
maximbolduc 41:a26acd346c2f 546 break;
maximbolduc 41:a26acd346c2f 547 case 1:
maximbolduc 41:a26acd346c2f 548 case 0:
maximbolduc 41:a26acd346c2f 549 B0[filternumber] = _K / _M;
maximbolduc 41:a26acd346c2f 550 B1[filternumber] = _L / _M;
maximbolduc 41:a26acd346c2f 551 B2[filternumber] = 0;
maximbolduc 41:a26acd346c2f 552 B3[filternumber] = 0;
maximbolduc 41:a26acd346c2f 553
maximbolduc 41:a26acd346c2f 554 A_1[filternumber] = _N / _M;
maximbolduc 41:a26acd346c2f 555 A_2[filternumber] = 0;
maximbolduc 41:a26acd346c2f 556 A_3[filternumber] = 0;
maximbolduc 41:a26acd346c2f 557 break;
maximbolduc 41:a26acd346c2f 558 }
maximbolduc 41:a26acd346c2f 559 }
maximbolduc 41:a26acd346c2f 560 //double d = 0;
maximbolduc 41:a26acd346c2f 561
maximbolduc 41:a26acd346c2f 562 string Steer(int ActiveTime,int value)
maximbolduc 41:a26acd346c2f 563 {
maximbolduc 41:a26acd346c2f 564 string sRet = "";
maximbolduc 41:a26acd346c2f 565 //f ((Err_aPort == 0)) {
maximbolduc 42:854d8cc26bbb 566 // if (ActiveTime > 300) ActiveTime = 300;
maximbolduc 42:854d8cc26bbb 567 if (value < 0) value = 0;
maximbolduc 42:854d8cc26bbb 568 if ((value > 255)) value = 255;
maximbolduc 42:854d8cc26bbb 569 OutputValue = value;
maximbolduc 42:854d8cc26bbb 570 OutputTime = ActiveTime;
maximbolduc 41:a26acd346c2f 571
maximbolduc 42:854d8cc26bbb 572 // d = //= DateTime.Now - autosteer.LastCommunication;
maximbolduc 41:a26acd346c2f 573
maximbolduc 42:854d8cc26bbb 574 //no need to send repeated 127=do nothing
maximbolduc 42:854d8cc26bbb 575 //if ((OutputValue != 127) || (LastOutputValue != OutputValue)) { // || (d.read()-LastCommunication > 2)) {
maximbolduc 42:854d8cc26bbb 576 sRet = "$ASTEER," + itos(OutputValue) + "," + itos(ActiveTime) + "\r\n";
maximbolduc 42:854d8cc26bbb 577 LastOutputValue = OutputValue;
maximbolduc 42:854d8cc26bbb 578 // autosteer.Timer1counter = 0;
maximbolduc 42:854d8cc26bbb 579 // autosteer.LastCommunication = DateTime.Now;
maximbolduc 42:854d8cc26bbb 580 //}
maximbolduc 42:854d8cc26bbb 581 // == }
maximbolduc 41:a26acd346c2f 582 return (sRet);
maximbolduc 41:a26acd346c2f 583 }
maximbolduc 41:a26acd346c2f 584
maximbolduc 41:a26acd346c2f 585 string ControlSteerFilter(int ActiveTime, double distAUTOL, double speed, double FilterGain, double min, double max,double SCALE)
maximbolduc 41:a26acd346c2f 586 {
maximbolduc 41:a26acd346c2f 587 string sRet = "";
maximbolduc 41:a26acd346c2f 588
maximbolduc 41:a26acd346c2f 589 int N = 3;
maximbolduc 41:a26acd346c2f 590 double y = 0;
maximbolduc 42:854d8cc26bbb 591 // if (B0[0] == 9999.0) {
maximbolduc 42:854d8cc26bbb 592 // SetDigitalFilter(47, 4.2 / 2 / PI, 0);
maximbolduc 42:854d8cc26bbb 593 // }
maximbolduc 42:854d8cc26bbb 594 // if (distAUTOL == 5000) distAUTOL = 0; //not set
maximbolduc 42:854d8cc26bbb 595 // if (speed < 1) steer=false;
maximbolduc 41:a26acd346c2f 596
maximbolduc 41:a26acd346c2f 597 mx[N - 3] = mx[N - 2];
maximbolduc 41:a26acd346c2f 598 mx[N - 2] = mx[N - 1];
maximbolduc 41:a26acd346c2f 599 mx[N - 1] = mx[N];
maximbolduc 42:854d8cc26bbb 600 if ( FilterGain > 0 ) {
maximbolduc 42:854d8cc26bbb 601 if ( abs(distAUTOL) > 0 ) {
maximbolduc 42:854d8cc26bbb 602 mx[N] = distAUTOL * FilterGain;
maximbolduc 41:a26acd346c2f 603
maximbolduc 42:854d8cc26bbb 604
maximbolduc 42:854d8cc26bbb 605 my[N] = -A_1[0] * (double)my[N - 1] - A_2[0] * (double)my[N - 2] - A_3[0] * (double)my[N - 3] + B0[0] * (double)mx[N] + B1[0] * (double)mx[N - 1] + B2[0] * (double)mx[N - 2] + B3[0] * (double)mx[N - 3];
maximbolduc 42:854d8cc26bbb 606 mz[N] = my[N];
maximbolduc 41:a26acd346c2f 607
maximbolduc 42:854d8cc26bbb 608 my[N - 3] = my[N - 2];
maximbolduc 42:854d8cc26bbb 609 my[N - 2] = my[N - 1];
maximbolduc 42:854d8cc26bbb 610 my[N - 1] = my[N];
maximbolduc 41:a26acd346c2f 611
maximbolduc 42:854d8cc26bbb 612 mz[N - 3] = mz[N - 2];
maximbolduc 42:854d8cc26bbb 613 mz[N - 2] = mz[N - 1];
maximbolduc 42:854d8cc26bbb 614 mz[N - 1] = mz[N];
maximbolduc 42:854d8cc26bbb 615 }
maximbolduc 42:854d8cc26bbb 616 }
maximbolduc 41:a26acd346c2f 617 double y1 = (double)mz[N]; // y1 used to preserve value of mz[N]; // mz is now the output
maximbolduc 42:854d8cc26bbb 618 //pc.printf("%f\r\n",y1);
maximbolduc 41:a26acd346c2f 619
maximbolduc 41:a26acd346c2f 620 //modify scale depending on distance!
maximbolduc 41:a26acd346c2f 621 double mscale = SCALE;
maximbolduc 42:854d8cc26bbb 622 //if (abs(distAUTOL) > 0.5) mscale = SCALE * 1.5;
maximbolduc 42:854d8cc26bbb 623 //if (abs(distAUTOL) > 1.5) mscale = SCALE * 1.5;
maximbolduc 42:854d8cc26bbb 624 mscale = 0.85 * abs(distAUTOL) + SCALE;
maximbolduc 41:a26acd346c2f 625
maximbolduc 41:a26acd346c2f 626 y = (double)(y1 * mscale); // scale it here if neccesary
maximbolduc 42:854d8cc26bbb 627 // pc.printf("%f\r\n",y);
maximbolduc 41:a26acd346c2f 628
maximbolduc 41:a26acd346c2f 629 // y = (double) (y * 10 / speed) ; //added March12, 10 km/h being most typical speed
maximbolduc 41:a26acd346c2f 630 y = (double)(y * pow((10.0 / speed), SpeedN)); //SpeedN varies the gain factor with speed n=0 to 1 or more. n=0 should give y=
maximbolduc 41:a26acd346c2f 631
maximbolduc 42:854d8cc26bbb 632 y = y * SCALE;
maximbolduc 41:a26acd346c2f 633
maximbolduc 42:854d8cc26bbb 634 if ( y < -max ) {
maximbolduc 42:854d8cc26bbb 635 y = -max;
maximbolduc 42:854d8cc26bbb 636 } else if ( y > max) {
maximbolduc 42:854d8cc26bbb 637 y = max;
maximbolduc 42:854d8cc26bbb 638 }
maximbolduc 42:854d8cc26bbb 639 y = 127 + y;
maximbolduc 42:854d8cc26bbb 640
maximbolduc 42:854d8cc26bbb 641 if (y <= 127) y = y - (min / 2.0);
maximbolduc 42:854d8cc26bbb 642 if (y >= 127) y = y + (min / 2.0);
maximbolduc 41:a26acd346c2f 643
maximbolduc 42:854d8cc26bbb 644 // y = y + 127;
maximbolduc 42:854d8cc26bbb 645 if (y >= 255) y = 255;
maximbolduc 42:854d8cc26bbb 646 if (y <= 0) y = 0;
maximbolduc 42:854d8cc26bbb 647
maximbolduc 42:854d8cc26bbb 648 int value = (int)y;
maximbolduc 41:a26acd346c2f 649
maximbolduc 42:854d8cc26bbb 650 if (speed > 1.0 ) {
maximbolduc 41:a26acd346c2f 651 sRet= Steer( ActiveTime, value);
maximbolduc 42:854d8cc26bbb 652 } else {
maximbolduc 42:854d8cc26bbb 653 sRet = Steer( ActiveTime, 127 );
maximbolduc 42:854d8cc26bbb 654 }
maximbolduc 41:a26acd346c2f 655
maximbolduc 41:a26acd346c2f 656 return (sRet);
maximbolduc 41:a26acd346c2f 657 }
maximbolduc 41:a26acd346c2f 658
maximbolduc 38:b5352d6f8166 659 Point old_position;
maximbolduc 38:b5352d6f8166 660
maximbolduc 38:b5352d6f8166 661 //char rmc_cpy[256];
maximbolduc 26:dc00998140af 662 void nmea_rmc(char *s)
maximbolduc 26:dc00998140af 663 {
maximbolduc 26:dc00998140af 664 char *token;
maximbolduc 26:dc00998140af 665 int token_counter = 0;
maximbolduc 26:dc00998140af 666 char *time = (char *)NULL;
maximbolduc 26:dc00998140af 667 char *date = (char *)NULL;
maximbolduc 26:dc00998140af 668 char *stat = (char *)NULL;
maximbolduc 26:dc00998140af 669 char *vel = (char *)NULL;
maximbolduc 26:dc00998140af 670 char *trk = (char *)NULL;
maximbolduc 26:dc00998140af 671 char *magv = (char *)NULL;
maximbolduc 38:b5352d6f8166 672 char *magd = (char *)NULL;
maximbolduc 38:b5352d6f8166 673 char *latit = "";
maximbolduc 38:b5352d6f8166 674 char *longit = "";
maximbolduc 26:dc00998140af 675 char *latitude = (char *)NULL;
maximbolduc 26:dc00998140af 676 char *longitude = (char *)NULL;
maximbolduc 26:dc00998140af 677 char *lat_dir = (char *)NULL;
maximbolduc 26:dc00998140af 678 char *lon_dir = (char *)NULL;
maximbolduc 35:f9caeb8ca31e 679
maximbolduc 38:b5352d6f8166 680 while ((token = strsep(&s, ",")) != NULL) {
maximbolduc 35:f9caeb8ca31e 681 switch (token_counter) {
maximbolduc 26:dc00998140af 682 case 1:
maximbolduc 26:dc00998140af 683 time = token;
maximbolduc 26:dc00998140af 684 break;
maximbolduc 26:dc00998140af 685 case 2:
maximbolduc 26:dc00998140af 686 stat = token;
maximbolduc 26:dc00998140af 687 break;
maximbolduc 34:c2bc9f9be7ff 688 case 3:
maximbolduc 39:6767d4c840f9 689 if ( token ) {
maximbolduc 38:b5352d6f8166 690 latit = token;
maximbolduc 38:b5352d6f8166 691 latitude = token;
maximbolduc 38:b5352d6f8166 692 }
maximbolduc 34:c2bc9f9be7ff 693 break;
maximbolduc 34:c2bc9f9be7ff 694 case 4:
maximbolduc 34:c2bc9f9be7ff 695 lat_dir = token;
maximbolduc 34:c2bc9f9be7ff 696 break;
maximbolduc 34:c2bc9f9be7ff 697 case 5:
maximbolduc 38:b5352d6f8166 698 longit = token;
maximbolduc 34:c2bc9f9be7ff 699 longitude = token;
maximbolduc 34:c2bc9f9be7ff 700 break;
maximbolduc 34:c2bc9f9be7ff 701 case 6:
maximbolduc 34:c2bc9f9be7ff 702 lon_dir = token;
maximbolduc 34:c2bc9f9be7ff 703 break;
maximbolduc 26:dc00998140af 704 case 7:
maximbolduc 26:dc00998140af 705 vel = token;
maximbolduc 26:dc00998140af 706 break;
maximbolduc 26:dc00998140af 707 case 8:
maximbolduc 26:dc00998140af 708 trk = token;
maximbolduc 26:dc00998140af 709 break;
maximbolduc 34:c2bc9f9be7ff 710 case 9:
maximbolduc 34:c2bc9f9be7ff 711 date = token;
maximbolduc 34:c2bc9f9be7ff 712 break;
maximbolduc 26:dc00998140af 713 case 10:
maximbolduc 26:dc00998140af 714 magv = token;
maximbolduc 26:dc00998140af 715 break;
maximbolduc 38:b5352d6f8166 716 case 11:
maximbolduc 38:b5352d6f8166 717 magd = token;
maximbolduc 38:b5352d6f8166 718 break;
maximbolduc 26:dc00998140af 719 }
maximbolduc 26:dc00998140af 720 token_counter++;
maximbolduc 26:dc00998140af 721 }
maximbolduc 38:b5352d6f8166 722 if (stat!= '\0' && date!= '\0' && time!= '\0') {
maximbolduc 26:dc00998140af 723 hour = (char)((time[0] - '0') * 10) + (time[1] - '0');
maximbolduc 26:dc00998140af 724 minute = (char)((time[2] - '0') * 10) + (time[3] - '0');
maximbolduc 26:dc00998140af 725 second = (char)((time[4] - '0') * 10) + (time[5] - '0');
maximbolduc 26:dc00998140af 726 day = (char)((date[0] - '0') * 10) + (date[1] - '0');
maximbolduc 26:dc00998140af 727 month = (char)((date[2] - '0') * 10) + (date[3] - '0');
maximbolduc 26:dc00998140af 728 year = (int)((date[4] - '0') * 10) + (date[5] - '0') + 2000;
maximbolduc 26:dc00998140af 729 status = stat[0];
maximbolduc 26:dc00998140af 730 velocity = atof(vel);
maximbolduc 26:dc00998140af 731 speed_km = velocity * 1.852;
maximbolduc 26:dc00998140af 732 speed_m_s = speed_km * 3600.0 / 1000.0;
maximbolduc 26:dc00998140af 733 track = atof(trk);
maximbolduc 26:dc00998140af 734 magvar = atof(magv);
maximbolduc 26:dc00998140af 735 }
maximbolduc 39:6767d4c840f9 736 double angle = ((int)((track-90 )* -1 + 360) + 180) % 360 - 180;
maximbolduc 39:6767d4c840f9 737 double diff_angle = Freepilot_bearing - angle;
maximbolduc 39:6767d4c840f9 738 diff_angle = ((int)diff_angle + 180) % 360 - 180;
maximbolduc 39:6767d4c840f9 739
maximbolduc 39:6767d4c840f9 740 // pc.printf("%f %f %f\r\n",diff_angle, Freepilot_bearing, (track - 90) * -1);
maximbolduc 39:6767d4c840f9 741 if ( abs(diff_angle) > 90 ) {
maximbolduc 39:6767d4c840f9 742 if ( (abs(360 - diff_angle)) > 90 ) {
maximbolduc 39:6767d4c840f9 743 Point temp = line_end;
maximbolduc 39:6767d4c840f9 744 line_end = line_start;
maximbolduc 39:6767d4c840f9 745 line_start = temp;
maximbolduc 39:6767d4c840f9 746 Freepilot_bearing = ((int) Freepilot_bearing + 360) % 360 - 180;
maximbolduc 39:6767d4c840f9 747 }
maximbolduc 39:6767d4c840f9 748 }
maximbolduc 38:b5352d6f8166 749 if ( longit != '\0' && latit != '\0' ) {
maximbolduc 38:b5352d6f8166 750 old_position = position;
maximbolduc 38:b5352d6f8166 751 position.SetX(lat_to_deg(latitude, lat_dir[0]));
maximbolduc 38:b5352d6f8166 752 position.SetY(lon_to_deg(longitude, lon_dir[0]));
maximbolduc 38:b5352d6f8166 753 cm_per_deg_lat = 11054000;
maximbolduc 38:b5352d6f8166 754 cm_per_deg_lon = 11132000 * cos(decimal_latitude);
maximbolduc 35:f9caeb8ca31e 755
maximbolduc 42:854d8cc26bbb 756 pitch_and_roll((track-90)*-1);// as to be real bearing
maximbolduc 35:f9caeb8ca31e 757
maximbolduc 38:b5352d6f8166 758 compensation.SetY(compensation.GetY() / cm_per_deg_lon);
maximbolduc 38:b5352d6f8166 759 compensation.SetX(compensation.GetX() / cm_per_deg_lat);
maximbolduc 38:b5352d6f8166 760
maximbolduc 38:b5352d6f8166 761 position = point_add(position,compensation);
maximbolduc 35:f9caeb8ca31e 762
maximbolduc 38:b5352d6f8166 763 double lookaheaddistance = lookaheadtime * speed_m_s;
maximbolduc 38:b5352d6f8166 764 get_latlon_byangle(position.GetX(),position.GetY(),lookaheaddistance,(track-90)*-1,look_ahead_lon,look_ahead_lat);
maximbolduc 38:b5352d6f8166 765 looked_ahead.SetX(look_ahead_lat);
maximbolduc 38:b5352d6f8166 766 looked_ahead.SetY(look_ahead_lon);
maximbolduc 38:b5352d6f8166 767 double filtering = sqrt(111111.0*111111.0 + 111111.0 * cos(decimal_latitude/57.295779513)*111111.0 * cos(decimal_latitude/57.295779513));
maximbolduc 41:a26acd346c2f 768 distance_to_line = dist_Point_to_Line( looked_ahead,line_start,line_end) * isLeft( line_start,line_end,looked_ahead) * filtering;/////////////////////////////////////////////////
maximbolduc 42:854d8cc26bbb 769 SetDigitalFilter(phaseadv,tcenter, 0 );
maximbolduc 35:f9caeb8ca31e 770
maximbolduc 41:a26acd346c2f 771 // int val = freepilot(position, looked_ahead, diff_angle, distance_to_line, scale, filterg , phaseadv,tcenter ,filtering);
maximbolduc 42:854d8cc26bbb 772 string steering = ControlSteerFilter(225, distance_to_line, speed_km , filterg, 20.0, 75.0, scale);
maximbolduc 42:854d8cc26bbb 773 //pc.printf("%f\r\n",distance_to_line);
maximbolduc 35:f9caeb8ca31e 774
maximbolduc 38:b5352d6f8166 775 char command[128];
maximbolduc 41:a26acd346c2f 776 sprintf(command,"%s\r\n\0",steering.c_str()); //(int)((((val/2)-127)/scale)+127),500);
maximbolduc 38:b5352d6f8166 777 pc.puts(command);
maximbolduc 41:a26acd346c2f 778
maximbolduc 38:b5352d6f8166 779 process_ASTEER(command);
maximbolduc 38:b5352d6f8166 780 }
maximbolduc 34:c2bc9f9be7ff 781 string rmc = "";
maximbolduc 38:b5352d6f8166 782 if(time!= '\0') {
maximbolduc 34:c2bc9f9be7ff 783 rmc = "$GPRMC,";
maximbolduc 34:c2bc9f9be7ff 784 rmc += string(time) + ",";
maximbolduc 34:c2bc9f9be7ff 785 } else {
maximbolduc 34:c2bc9f9be7ff 786 rmc = "$GPRMC,,";
maximbolduc 34:c2bc9f9be7ff 787 }
maximbolduc 38:b5352d6f8166 788 if(stat!= '\0') {
maximbolduc 34:c2bc9f9be7ff 789 rmc +=(string(stat) + ",");
maximbolduc 34:c2bc9f9be7ff 790 } else {
maximbolduc 34:c2bc9f9be7ff 791 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 792 }
maximbolduc 38:b5352d6f8166 793 if ( latit != '\0' && lat_dir!= '\0') {
maximbolduc 34:c2bc9f9be7ff 794 rmc +=( string(To_DMS(position.GetX())) + "," + string(lat_dir) +",");
maximbolduc 34:c2bc9f9be7ff 795 } else {
maximbolduc 34:c2bc9f9be7ff 796 rmc += ",,";
maximbolduc 34:c2bc9f9be7ff 797 }
maximbolduc 38:b5352d6f8166 798 if ( longit != '\0' && lon_dir!= '\0' ) {
maximbolduc 34:c2bc9f9be7ff 799 rmc += (string(To_DMS_lon(position.GetY())) + "," + string(lon_dir) + ",");
maximbolduc 34:c2bc9f9be7ff 800 } else {
maximbolduc 34:c2bc9f9be7ff 801 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 802 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 803 }
maximbolduc 38:b5352d6f8166 804 if (vel!= '\0') {
maximbolduc 38:b5352d6f8166 805 rmc += (string(vel) + ",");
maximbolduc 34:c2bc9f9be7ff 806 } else {
maximbolduc 34:c2bc9f9be7ff 807 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 808 }
maximbolduc 38:b5352d6f8166 809 if ((trk)!= '\0') {
maximbolduc 34:c2bc9f9be7ff 810 rmc += string(trk) + ",";
maximbolduc 34:c2bc9f9be7ff 811 } else {
maximbolduc 34:c2bc9f9be7ff 812 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 813 }
maximbolduc 38:b5352d6f8166 814 if (date!= '\0') {
maximbolduc 34:c2bc9f9be7ff 815 rmc += string(date) + ",";
maximbolduc 34:c2bc9f9be7ff 816 } else {
maximbolduc 34:c2bc9f9be7ff 817 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 818 }
maximbolduc 38:b5352d6f8166 819 if (magv!= '\0') {
maximbolduc 34:c2bc9f9be7ff 820 rmc += string(magv) + ",";
maximbolduc 34:c2bc9f9be7ff 821 } else {
maximbolduc 34:c2bc9f9be7ff 822 rmc += ",";
maximbolduc 34:c2bc9f9be7ff 823 }
maximbolduc 38:b5352d6f8166 824 if (magd!= '\0') {
maximbolduc 38:b5352d6f8166 825 rmc += string(magd) + ",W";
maximbolduc 38:b5352d6f8166 826 } else {
maximbolduc 38:b5352d6f8166 827 rmc += ",W";
maximbolduc 38:b5352d6f8166 828 }
maximbolduc 34:c2bc9f9be7ff 829
maximbolduc 34:c2bc9f9be7ff 830 char test[256];
maximbolduc 38:b5352d6f8166 831 sprintf(test,"%s*\0",rmc.c_str());
maximbolduc 38:b5352d6f8166 832 sprintf(output,"%s*%02X\r\n\0",rmc.c_str(),getCheckSum(test));
maximbolduc 39:6767d4c840f9 833
maximbolduc 34:c2bc9f9be7ff 834 bluetooth.puts(output);
maximbolduc 26:dc00998140af 835 }
maximbolduc 35:f9caeb8ca31e 836
maximbolduc 26:dc00998140af 837 void process_FGPSAB(char* ab)
maximbolduc 26:dc00998140af 838 {
maximbolduc 33:3e71c418e90d 839 char *token;
maximbolduc 33:3e71c418e90d 840 int token_counter = 0;
maximbolduc 33:3e71c418e90d 841 char *line_lat = (char *)NULL;
maximbolduc 33:3e71c418e90d 842 char *line_lon = (char *)NULL;
maximbolduc 33:3e71c418e90d 843 char *line_lat1 = (char *)NULL;
maximbolduc 33:3e71c418e90d 844 char *line_lon1 = (char *)NULL;
maximbolduc 38:b5352d6f8166 845 //char *bearing = (char *)NULL;
maximbolduc 38:b5352d6f8166 846 string bearing = "";
maximbolduc 33:3e71c418e90d 847 token = strtok(ab, ",");
maximbolduc 35:f9caeb8ca31e 848 while (token) {
maximbolduc 35:f9caeb8ca31e 849 switch (token_counter) {
maximbolduc 33:3e71c418e90d 850 case 1:
maximbolduc 33:3e71c418e90d 851 line_lat = token;
maximbolduc 33:3e71c418e90d 852 break;
maximbolduc 33:3e71c418e90d 853 case 2:
maximbolduc 33:3e71c418e90d 854 line_lon = token;
maximbolduc 33:3e71c418e90d 855 break;
maximbolduc 33:3e71c418e90d 856 case 3:
maximbolduc 33:3e71c418e90d 857 line_lat1 = token;
maximbolduc 33:3e71c418e90d 858 break;
maximbolduc 33:3e71c418e90d 859 case 4:
maximbolduc 33:3e71c418e90d 860 line_lon1 = token;
maximbolduc 33:3e71c418e90d 861 break;
maximbolduc 33:3e71c418e90d 862 case 5:
maximbolduc 45:ecd8c2e27948 863 /* for (int n=0; n < sizeof(token); n++) {
maximbolduc 38:b5352d6f8166 864 if ( token[n] == '*' ) {
maximbolduc 38:b5352d6f8166 865 break;
maximbolduc 38:b5352d6f8166 866 } else {
maximbolduc 38:b5352d6f8166 867 bearing += token[n];
maximbolduc 38:b5352d6f8166 868 }
maximbolduc 45:ecd8c2e27948 869 }*/
maximbolduc 45:ecd8c2e27948 870 bearing = token;
maximbolduc 33:3e71c418e90d 871 break;
maximbolduc 26:dc00998140af 872 }
maximbolduc 33:3e71c418e90d 873 token = strtok((char *)NULL, ",");
maximbolduc 33:3e71c418e90d 874 token_counter++;
maximbolduc 33:3e71c418e90d 875 }
maximbolduc 39:6767d4c840f9 876 double Freepilot_lon = atof(line_lon);
maximbolduc 39:6767d4c840f9 877 double Freepilot_lat = atof(line_lat);
maximbolduc 39:6767d4c840f9 878 double Freepilot_lon1 = atof(line_lon1);
maximbolduc 39:6767d4c840f9 879 double Freepilot_lat1 = atof(line_lat1);
maximbolduc 39:6767d4c840f9 880 Freepilot_bearing = atof(bearing.c_str()) + 360;
maximbolduc 39:6767d4c840f9 881 Freepilot_bearing = ((int)Freepilot_bearing+ 180) % 360 - 180;
maximbolduc 33:3e71c418e90d 882 line_start.SetX(Freepilot_lat);
maximbolduc 33:3e71c418e90d 883 line_start.SetY(Freepilot_lon);
maximbolduc 33:3e71c418e90d 884 line_end.SetX(Freepilot_lat1);
maximbolduc 33:3e71c418e90d 885 line_end.SetY(Freepilot_lon1);
maximbolduc 39:6767d4c840f9 886
maximbolduc 33:3e71c418e90d 887 active_AB = 1;
maximbolduc 35:f9caeb8ca31e 888
maximbolduc 38:b5352d6f8166 889 sprintf(output, "$ABLINE:%f , %f, %f, %f, %f\r\n",line_start.GetX(),line_start.GetY(),line_end.GetX(),line_end.GetY(),Freepilot_bearing);
maximbolduc 33:3e71c418e90d 890 pc.puts(output);
maximbolduc 26:dc00998140af 891 }
maximbolduc 35:f9caeb8ca31e 892
maximbolduc 26:dc00998140af 893 void process_FGPSAUTO(char* FGPSAUTO)
maximbolduc 26:dc00998140af 894 {
maximbolduc 26:dc00998140af 895 char *token;
maximbolduc 26:dc00998140af 896 int token_counter = 0;
maximbolduc 26:dc00998140af 897 char *ahead = (char *)NULL;
maximbolduc 26:dc00998140af 898 char *center = (char *)NULL;
maximbolduc 26:dc00998140af 899 char *phase = (char *)NULL;
maximbolduc 26:dc00998140af 900 char *scl = (char *)NULL;
maximbolduc 26:dc00998140af 901 char *avg = (char *)NULL;
maximbolduc 26:dc00998140af 902 char *_kp = (char *)NULL;
maximbolduc 26:dc00998140af 903 char *_ki = (char *)NULL;
maximbolduc 35:f9caeb8ca31e 904 char *fg = (char *)NULL;
maximbolduc 26:dc00998140af 905 char *_kd = (char *)NULL;
maximbolduc 39:6767d4c840f9 906
maximbolduc 26:dc00998140af 907 token = strtok(FGPSAUTO, ",");
maximbolduc 35:f9caeb8ca31e 908 while (token) {
maximbolduc 35:f9caeb8ca31e 909 switch (token_counter) {
maximbolduc 26:dc00998140af 910 case 1:
maximbolduc 26:dc00998140af 911 phase = token;
maximbolduc 26:dc00998140af 912 break;
maximbolduc 26:dc00998140af 913 case 2:
maximbolduc 26:dc00998140af 914 center = token;
maximbolduc 26:dc00998140af 915 break;
maximbolduc 34:c2bc9f9be7ff 916 case 3:
maximbolduc 34:c2bc9f9be7ff 917 fg = token;
maximbolduc 34:c2bc9f9be7ff 918 break;
maximbolduc 26:dc00998140af 919 case 4:
maximbolduc 26:dc00998140af 920 scl = token;
maximbolduc 26:dc00998140af 921 break;
maximbolduc 26:dc00998140af 922 case 5:
maximbolduc 26:dc00998140af 923 ahead = token;
maximbolduc 26:dc00998140af 924 break;
maximbolduc 26:dc00998140af 925 case 6:
maximbolduc 26:dc00998140af 926 avg = token;
maximbolduc 26:dc00998140af 927 break;
maximbolduc 26:dc00998140af 928 case 7:
maximbolduc 26:dc00998140af 929 _kp = token;
maximbolduc 26:dc00998140af 930 break;
maximbolduc 26:dc00998140af 931 case 8:
maximbolduc 26:dc00998140af 932 _ki = token;
maximbolduc 26:dc00998140af 933 break;
maximbolduc 26:dc00998140af 934 case 9:
maximbolduc 26:dc00998140af 935 _kd = token;
maximbolduc 26:dc00998140af 936 break;
maximbolduc 26:dc00998140af 937 }
maximbolduc 26:dc00998140af 938 token = strtok((char *)NULL, ",");
maximbolduc 26:dc00998140af 939 token_counter++;
maximbolduc 26:dc00998140af 940 }
maximbolduc 35:f9caeb8ca31e 941 if ( _kp && _ki && _kd ) {
maximbolduc 26:dc00998140af 942 kp = atof(_kp);
maximbolduc 26:dc00998140af 943 ki = atof(_ki);
maximbolduc 26:dc00998140af 944 kd = atof(_kd);
maximbolduc 26:dc00998140af 945 }
maximbolduc 35:f9caeb8ca31e 946 if ( phase && center && scl && avg && ahead ) {
jhedmonton 28:5905886c76ee 947 lookaheadtime = atof(ahead);
maximbolduc 41:a26acd346c2f 948 scale = atof(scl);
maximbolduc 26:dc00998140af 949 phaseadv = atof(phase);
jhedmonton 28:5905886c76ee 950 avgpos = atof(avg);
jhedmonton 28:5905886c76ee 951 tcenter = atof(center);
maximbolduc 34:c2bc9f9be7ff 952 filterg = atof(fg);
maximbolduc 38:b5352d6f8166 953
maximbolduc 41:a26acd346c2f 954 // scale = scale * -1;
maximbolduc 41:a26acd346c2f 955 SetDigitalFilter(phaseadv,tcenter, 0 );
maximbolduc 26:dc00998140af 956 }
maximbolduc 26:dc00998140af 957 }
maximbolduc 35:f9caeb8ca31e 958
maximbolduc 26:dc00998140af 959 void pc_analyse(char* pc_string)
maximbolduc 26:dc00998140af 960 {
maximbolduc 41:a26acd346c2f 961 pc.puts(pc_string);
maximbolduc 35:f9caeb8ca31e 962 if (!strncmp(pc_string, "$ASTEER", 7)) {
maximbolduc 39:6767d4c840f9 963 //stop sending when already exists
maximbolduc 35:f9caeb8ca31e 964 } else if (!strncmp(pc_string, "$BANY",5)) {
jhedmonton 29:23ccb2a50b6f 965 _ID = Config_GetID();
maximbolduc 42:854d8cc26bbb 966 // Config_Save();
maximbolduc 35:f9caeb8ca31e 967 } else if (!strncmp(pc_string, "$GPSBAUD",8)) {
maximbolduc 45:ecd8c2e27948 968
maximbolduc 45:ecd8c2e27948 969 process_GPSBAUD(pc_string);
maximbolduc 42:854d8cc26bbb 970 // Config_Save();
maximbolduc 35:f9caeb8ca31e 971 } else if (!strncmp(pc_string, "$FGPSAUTO",9)) {
maximbolduc 34:c2bc9f9be7ff 972 process_FGPSAUTO(pc_string);
maximbolduc 34:c2bc9f9be7ff 973 sprintf(output,"%s\r\n",pc_string);
maximbolduc 34:c2bc9f9be7ff 974 bluetooth.puts(output);
maximbolduc 42:854d8cc26bbb 975 // Config_Save();
maximbolduc 35:f9caeb8ca31e 976 } else if (!strncmp(pc_string, "$FGPS,",6)) {
maximbolduc 35:f9caeb8ca31e 977 int i=5;
maximbolduc 35:f9caeb8ca31e 978 char c=pc_string[i];
maximbolduc 35:f9caeb8ca31e 979 while (c!=0) {
maximbolduc 35:f9caeb8ca31e 980 i++;
maximbolduc 35:f9caeb8ca31e 981 if (i>255) break; //protect msg buffer!
maximbolduc 35:f9caeb8ca31e 982 c=pc_string[i];
maximbolduc 35:f9caeb8ca31e 983 gps.putc(c);
maximbolduc 35:f9caeb8ca31e 984 pc.putc(c);
maximbolduc 35:f9caeb8ca31e 985 }
maximbolduc 36:8e84b5ade03e 986 } else if (!strncmp(pc_string, "$GPSHEIGHT",10)) {
maximbolduc 26:dc00998140af 987 process_GPSHEIGHT(pc_string);
maximbolduc 26:dc00998140af 988 sprintf(output,"%s\r\n",pc_string);
maximbolduc 26:dc00998140af 989 bluetooth.puts(output);
maximbolduc 42:854d8cc26bbb 990 // Config_Save();
maximbolduc 37:ac60a8a0ae8a 991 } else if (!strncmp(pc_string, "$FGPSAB",7)) {
maximbolduc 26:dc00998140af 992 process_FGPSAB(pc_string);
maximbolduc 35:f9caeb8ca31e 993 } else if (!strncmp(pc_string, "$CALIBRATEACCEL",15)) {
maximbolduc 32:c57bc701d65c 994 calibrateGyroscope();
maximbolduc 30:3afafa1ef16b 995 calibrateAccelerometer();
maximbolduc 42:854d8cc26bbb 996 // Config_Save();
maximbolduc 35:f9caeb8ca31e 997 } else if (!strncmp(pc_string, "$POSITION",9)) {
maximbolduc 32:c57bc701d65c 998 char* pointer;
maximbolduc 32:c57bc701d65c 999 char* Data[5];
maximbolduc 32:c57bc701d65c 1000 int index = 0;
maximbolduc 32:c57bc701d65c 1001 //Split data at commas
maximbolduc 32:c57bc701d65c 1002 pointer = strtok(pc_string, ",");
maximbolduc 32:c57bc701d65c 1003 if(pointer == NULL)
maximbolduc 32:c57bc701d65c 1004 Data[0] = pc_string;
maximbolduc 35:f9caeb8ca31e 1005 while(pointer != NULL) {
maximbolduc 32:c57bc701d65c 1006 Data[index] = pointer;
maximbolduc 32:c57bc701d65c 1007 pointer = strtok(NULL, ",");
maximbolduc 32:c57bc701d65c 1008 index++;
maximbolduc 32:c57bc701d65c 1009 }
maximbolduc 32:c57bc701d65c 1010 gyro_pos = atoi(Data[1]);
maximbolduc 42:854d8cc26bbb 1011 // Config_Save();
maximbolduc 35:f9caeb8ca31e 1012 } else {
maximbolduc 26:dc00998140af 1013 }
maximbolduc 26:dc00998140af 1014 }
maximbolduc 35:f9caeb8ca31e 1015
maximbolduc 26:dc00998140af 1016 void gps_analyse(char* gps_string)
maximbolduc 26:dc00998140af 1017 {
maximbolduc 35:f9caeb8ca31e 1018 if (!strncmp(gps_string, "$GPRMC", 6)) {
maximbolduc 26:dc00998140af 1019 nmea_rmc(gps_string); //analyse and decompose the rmc string
maximbolduc 36:8e84b5ade03e 1020 } else {
maximbolduc 36:8e84b5ade03e 1021 bluetooth.puts(gps_string);
maximbolduc 33:3e71c418e90d 1022 }
maximbolduc 26:dc00998140af 1023 }
maximbolduc 35:f9caeb8ca31e 1024
jhedmonton 27:9ac59b261d87 1025 int i2 = 0;
jhedmonton 27:9ac59b261d87 1026 bool end2 = false;
jhedmonton 27:9ac59b261d87 1027 bool start2 = false;
maximbolduc 35:f9caeb8ca31e 1028
jhedmonton 27:9ac59b261d87 1029 bool getline2()
maximbolduc 26:dc00998140af 1030 {
jhedmonton 27:9ac59b261d87 1031 int gotstring=false;
maximbolduc 35:f9caeb8ca31e 1032 while (1) {
maximbolduc 35:f9caeb8ca31e 1033 if( !bluetooth.readable() ) {
jhedmonton 27:9ac59b261d87 1034 break;
jhedmonton 27:9ac59b261d87 1035 }
jhedmonton 27:9ac59b261d87 1036 char c = bluetooth.getc();
maximbolduc 35:f9caeb8ca31e 1037 if (c == 36 ) {
maximbolduc 33:3e71c418e90d 1038 start2=true;
maximbolduc 33:3e71c418e90d 1039 end2 = false;
maximbolduc 33:3e71c418e90d 1040 i2 = 0;
maximbolduc 33:3e71c418e90d 1041 }
maximbolduc 35:f9caeb8ca31e 1042 if ((start2) && (c == 10)) {
maximbolduc 33:3e71c418e90d 1043 end2=true;
jhedmonton 29:23ccb2a50b6f 1044 start2 = false;
jhedmonton 29:23ccb2a50b6f 1045 }
maximbolduc 35:f9caeb8ca31e 1046 if (start2) {
jhedmonton 27:9ac59b261d87 1047 msg2[i2]=c;
jhedmonton 27:9ac59b261d87 1048 i2++;
jhedmonton 27:9ac59b261d87 1049 if (i2>255) break; //protect msg buffer!
jhedmonton 27:9ac59b261d87 1050 }
maximbolduc 35:f9caeb8ca31e 1051 if (end2) {
maximbolduc 33:3e71c418e90d 1052 msg2[i2]=c;
jhedmonton 27:9ac59b261d87 1053 msg2[i2+1] = 0;
jhedmonton 27:9ac59b261d87 1054 start2 = false;
jhedmonton 27:9ac59b261d87 1055 gotstring = true;
jhedmonton 27:9ac59b261d87 1056 end2=false;
jhedmonton 27:9ac59b261d87 1057 i2=0;
jhedmonton 27:9ac59b261d87 1058 break;
maximbolduc 26:dc00998140af 1059 }
maximbolduc 26:dc00998140af 1060 }
jhedmonton 27:9ac59b261d87 1061 return gotstring;
maximbolduc 26:dc00998140af 1062 }
maximbolduc 35:f9caeb8ca31e 1063
maximbolduc 35:f9caeb8ca31e 1064
jhedmonton 27:9ac59b261d87 1065 int i=0;
jhedmonton 27:9ac59b261d87 1066 bool start=false;
jhedmonton 27:9ac59b261d87 1067 bool end=false;
maximbolduc 35:f9caeb8ca31e 1068
jhedmonton 27:9ac59b261d87 1069 bool getline(bool forward)
maximbolduc 26:dc00998140af 1070 {
maximbolduc 35:f9caeb8ca31e 1071 while (1) {
maximbolduc 35:f9caeb8ca31e 1072 if( !gps.readable() ) {
jhedmonton 27:9ac59b261d87 1073 break;
jhedmonton 27:9ac59b261d87 1074 }
jhedmonton 28:5905886c76ee 1075 char c = gps.getc();
maximbolduc 35:f9caeb8ca31e 1076 if (forward) { //simply forward all to Bluetooth
maximbolduc 35:f9caeb8ca31e 1077 bluetooth.putc(c);
jhedmonton 27:9ac59b261d87 1078 }
maximbolduc 35:f9caeb8ca31e 1079 if (c == 36 ) {
maximbolduc 35:f9caeb8ca31e 1080 start=true;
maximbolduc 35:f9caeb8ca31e 1081 end = false;
maximbolduc 35:f9caeb8ca31e 1082 i = 0;
maximbolduc 35:f9caeb8ca31e 1083 }
maximbolduc 35:f9caeb8ca31e 1084 if ((start) && (c == 10)) {
maximbolduc 35:f9caeb8ca31e 1085 end=true;
jhedmonton 29:23ccb2a50b6f 1086 start = false;
jhedmonton 29:23ccb2a50b6f 1087 }
maximbolduc 35:f9caeb8ca31e 1088 if (start) {
jhedmonton 27:9ac59b261d87 1089 msg[i]=c;
jhedmonton 27:9ac59b261d87 1090 i++;
jhedmonton 27:9ac59b261d87 1091 if (i>255) break; //protect msg buffer!
jhedmonton 27:9ac59b261d87 1092 }
maximbolduc 35:f9caeb8ca31e 1093 if (end) {
maximbolduc 35:f9caeb8ca31e 1094 msg[i]=c;
maximbolduc 26:dc00998140af 1095 msg[i+1] = 0;
jhedmonton 29:23ccb2a50b6f 1096 i=0;
jhedmonton 27:9ac59b261d87 1097 start = false;
jhedmonton 27:9ac59b261d87 1098 end = true;
jhedmonton 27:9ac59b261d87 1099 break;
maximbolduc 26:dc00998140af 1100 }
maximbolduc 26:dc00998140af 1101 }
jhedmonton 27:9ac59b261d87 1102 return end;
maximbolduc 26:dc00998140af 1103 }
maximbolduc 35:f9caeb8ca31e 1104
maximbolduc 26:dc00998140af 1105 void keyPressedHeld( void )
maximbolduc 26:dc00998140af 1106 {
maximbolduc 36:8e84b5ade03e 1107 motor_enable_state = "$ENABLE,0\r\n";
maximbolduc 37:ac60a8a0ae8a 1108 motor_enable = 0;
maximbolduc 37:ac60a8a0ae8a 1109 pwm1 = 0.0;
maximbolduc 37:ac60a8a0ae8a 1110 pwm2 = 0.0;
jhedmonton 28:5905886c76ee 1111 ledGREEN=1; //show green for being ready to steer
maximbolduc 26:dc00998140af 1112 }
maximbolduc 35:f9caeb8ca31e 1113
maximbolduc 26:dc00998140af 1114 void keyReleasedHeld( void )
maximbolduc 26:dc00998140af 1115 {
maximbolduc 34:c2bc9f9be7ff 1116 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
maximbolduc 34:c2bc9f9be7ff 1117 motor_enable_state = "$ENABLE,1\r\n";
maximbolduc 37:ac60a8a0ae8a 1118 motor_enable = 1;
maximbolduc 37:ac60a8a0ae8a 1119 pwm1 = 0.0;
maximbolduc 37:ac60a8a0ae8a 1120 pwm2 = 0.0;
maximbolduc 35:f9caeb8ca31e 1121 ledGREEN=0;
jhedmonton 27:9ac59b261d87 1122 }
maximbolduc 35:f9caeb8ca31e 1123
jhedmonton 27:9ac59b261d87 1124 void boom1PressedHeld( void )
jhedmonton 27:9ac59b261d87 1125 {
maximbolduc 35:f9caeb8ca31e 1126 // ledGREEN=1;
maximbolduc 35:f9caeb8ca31e 1127 boom18=boom18 & 0xFE;
jhedmonton 27:9ac59b261d87 1128 }
maximbolduc 35:f9caeb8ca31e 1129
jhedmonton 27:9ac59b261d87 1130 void boom1ReleasedHeld( void )
jhedmonton 27:9ac59b261d87 1131 {
maximbolduc 35:f9caeb8ca31e 1132 //ledGREEN=0;
maximbolduc 35:f9caeb8ca31e 1133 boom18=boom18 | 0x01;
jhedmonton 27:9ac59b261d87 1134 }
maximbolduc 35:f9caeb8ca31e 1135
jhedmonton 27:9ac59b261d87 1136 void boom2PressedHeld( void )
maximbolduc 35:f9caeb8ca31e 1137 {
maximbolduc 35:f9caeb8ca31e 1138 boom18=boom18 & 0xFD;
maximbolduc 26:dc00998140af 1139 }
maximbolduc 35:f9caeb8ca31e 1140
jhedmonton 27:9ac59b261d87 1141 void boom2ReleasedHeld( void )
jhedmonton 27:9ac59b261d87 1142 {
maximbolduc 35:f9caeb8ca31e 1143 boom18=boom18 | 0x02;
jhedmonton 27:9ac59b261d87 1144 }
jhedmonton 27:9ac59b261d87 1145 void boom3PressedHeld( void )
jhedmonton 27:9ac59b261d87 1146 {
maximbolduc 35:f9caeb8ca31e 1147 boom18=boom18 & 0xFB;
jhedmonton 27:9ac59b261d87 1148 }
maximbolduc 35:f9caeb8ca31e 1149
jhedmonton 27:9ac59b261d87 1150 void boom3ReleasedHeld( void )
jhedmonton 27:9ac59b261d87 1151 {
maximbolduc 35:f9caeb8ca31e 1152 boom18=boom18 | 0x04;
jhedmonton 27:9ac59b261d87 1153 }
maximbolduc 35:f9caeb8ca31e 1154
jhedmonton 27:9ac59b261d87 1155 void boom4PressedHeld( void )
jhedmonton 27:9ac59b261d87 1156 {
maximbolduc 32:c57bc701d65c 1157 boom18=boom18 & 0xF7;
jhedmonton 27:9ac59b261d87 1158 }
maximbolduc 35:f9caeb8ca31e 1159
jhedmonton 27:9ac59b261d87 1160 void boom4ReleasedHeld( void )
jhedmonton 27:9ac59b261d87 1161 {
maximbolduc 32:c57bc701d65c 1162 boom18=boom18 | 0x08;
jhedmonton 27:9ac59b261d87 1163 }
maximbolduc 35:f9caeb8ca31e 1164
maximbolduc 26:dc00998140af 1165 void toprint()
maximbolduc 26:dc00998140af 1166 {
maximbolduc 26:dc00998140af 1167 angle_send = 1;
maximbolduc 26:dc00998140af 1168 }
maximbolduc 35:f9caeb8ca31e 1169
maximbolduc 38:b5352d6f8166 1170 double last_yaw = 0;
maximbolduc 38:b5352d6f8166 1171 int counter = 0;
maximbolduc 38:b5352d6f8166 1172 bool bear = false;
maximbolduc 38:b5352d6f8166 1173 double lastroll = 0;
maximbolduc 38:b5352d6f8166 1174 double lastpitch = 0;
maximbolduc 38:b5352d6f8166 1175
maximbolduc 26:dc00998140af 1176 int main()
maximbolduc 26:dc00998140af 1177 {
jhedmonton 27:9ac59b261d87 1178 bluetooth.baud(115200);
jhedmonton 28:5905886c76ee 1179 gps.baud(38400);
maximbolduc 30:3afafa1ef16b 1180 pc.baud(38400);
maximbolduc 35:f9caeb8ca31e 1181
jhedmonton 27:9ac59b261d87 1182 //JH prepare and send version info
jhedmonton 27:9ac59b261d87 1183 vTimer.start();
jhedmonton 27:9ac59b261d87 1184 vTimer.reset();
maximbolduc 38:b5352d6f8166 1185
jhedmonton 28:5905886c76ee 1186 motTimer.start();
jhedmonton 28:5905886c76ee 1187 motTimer.reset();
jhedmonton 29:23ccb2a50b6f 1188 lastsend_motorstate=motTimer.read_ms()-6500; //should trigger in 5s
maximbolduc 34:c2bc9f9be7ff 1189 motor_enable_state = "$ENABLE,1\r\n";
maximbolduc 36:8e84b5ade03e 1190
jhedmonton 28:5905886c76ee 1191 btTimer.start();
jhedmonton 28:5905886c76ee 1192 btTimer.reset();
maximbolduc 38:b5352d6f8166 1193 lastgetBT= btTimer.read_ms();
maximbolduc 35:f9caeb8ca31e 1194
jhedmonton 27:9ac59b261d87 1195 bluetooth.puts(version);
maximbolduc 38:b5352d6f8166 1196
jhedmonton 29:23ccb2a50b6f 1197 lastsend_version=vTimer.read_ms()-18000;
maximbolduc 38:b5352d6f8166 1198 // pc.puts("test\r\n");
maximbolduc 38:b5352d6f8166 1199 /* Config_Startup();
maximbolduc 38:b5352d6f8166 1200 _ID = Config_GetID();
maximbolduc 38:b5352d6f8166 1201 Config_Save();
maximbolduc 38:b5352d6f8166 1202 */
jhedmonton 27:9ac59b261d87 1203 boom1.attach_asserted_held( &boom1PressedHeld );
jhedmonton 27:9ac59b261d87 1204 boom1.attach_deasserted_held( &boom1ReleasedHeld );
jhedmonton 27:9ac59b261d87 1205 boom1.setSampleFrequency(); //default = 20 ms
jhedmonton 27:9ac59b261d87 1206 boom1.setSamplesTillAssert(5);
jhedmonton 27:9ac59b261d87 1207 boom1.setSamplesTillHeld(5);
jhedmonton 27:9ac59b261d87 1208 boom2.attach_asserted_held( &boom2PressedHeld );
jhedmonton 27:9ac59b261d87 1209 boom2.attach_deasserted_held( &boom2ReleasedHeld );
jhedmonton 27:9ac59b261d87 1210 boom2.setSamplesTillAssert(5);
jhedmonton 27:9ac59b261d87 1211 boom2.setSamplesTillHeld(5);
jhedmonton 27:9ac59b261d87 1212 boom2.setSampleFrequency();
jhedmonton 27:9ac59b261d87 1213 boom3.attach_asserted_held( &boom3PressedHeld );
jhedmonton 27:9ac59b261d87 1214 boom3.attach_deasserted_held( &boom3ReleasedHeld );
jhedmonton 27:9ac59b261d87 1215 boom3.setSamplesTillAssert(5);
jhedmonton 27:9ac59b261d87 1216 boom3.setSamplesTillHeld(5);
jhedmonton 27:9ac59b261d87 1217 boom3.setSampleFrequency();
jhedmonton 27:9ac59b261d87 1218 boom4.attach_asserted_held( &boom4PressedHeld );
jhedmonton 27:9ac59b261d87 1219 boom4.attach_deasserted_held( &boom4ReleasedHeld );
jhedmonton 27:9ac59b261d87 1220 boom4.setSamplesTillAssert(5);
jhedmonton 27:9ac59b261d87 1221 boom4.setSamplesTillHeld(5);
jhedmonton 27:9ac59b261d87 1222 boom4.setSampleFrequency();
maximbolduc 35:f9caeb8ca31e 1223
maximbolduc 44:e9d5cd98273d 1224 //motor_switch.setSampleFrequency(10000);
maximbolduc 44:e9d5cd98273d 1225
maximbolduc 44:e9d5cd98273d 1226 motor_switch.setSamplesTillAssert(5);
maximbolduc 44:e9d5cd98273d 1227 motor_switch.setSamplesTillHeld(5);
maximbolduc 44:e9d5cd98273d 1228 motor_switch.setSampleFrequency();
maximbolduc 26:dc00998140af 1229 motor_switch.attach_asserted_held( &keyPressedHeld );
maximbolduc 26:dc00998140af 1230 motor_switch.attach_deasserted_held( &keyReleasedHeld );
maximbolduc 35:f9caeb8ca31e 1231
maximbolduc 36:8e84b5ade03e 1232 initializeAccelerometer();
maximbolduc 36:8e84b5ade03e 1233 calibrateAccelerometer();
maximbolduc 36:8e84b5ade03e 1234 initializeGyroscope();
maximbolduc 36:8e84b5ade03e 1235 calibrateGyroscope();
maximbolduc 36:8e84b5ade03e 1236
maximbolduc 30:3afafa1ef16b 1237 accelerometerTicker.attach(&sampleAccelerometer, 0.005);
maximbolduc 30:3afafa1ef16b 1238 gyroscopeTicker.attach(&sampleGyroscope, 0.005);
maximbolduc 30:3afafa1ef16b 1239 filterTicker.attach(&filter, FILTER_RATE);
maximbolduc 30:3afafa1ef16b 1240 angle_print.attach(&toprint,0.2);
maximbolduc 26:dc00998140af 1241 activate_antenna();
maximbolduc 36:8e84b5ade03e 1242 autosteer_timeout.start();
maximbolduc 38:b5352d6f8166 1243
maximbolduc 44:e9d5cd98273d 1244 //setTunings(0.25, 5, 1); //for PID
maximbolduc 44:e9d5cd98273d 1245 SetDigitalFilter(phaseadv,tcenter, 0); //for FGPS guidance
maximbolduc 38:b5352d6f8166 1246
maximbolduc 35:f9caeb8ca31e 1247 while(1) {
jhedmonton 27:9ac59b261d87 1248 //JH send version information every 10 seconds to keep Bluetooth alive
maximbolduc 35:f9caeb8ca31e 1249 if ((vTimer.read_ms()-lastsend_version)>25000) {
jhedmonton 27:9ac59b261d87 1250 pc.puts(version);
jhedmonton 27:9ac59b261d87 1251 bluetooth.puts(version);
jhedmonton 27:9ac59b261d87 1252 vTimer.reset();
jhedmonton 27:9ac59b261d87 1253 lastsend_version=vTimer.read_ms();
maximbolduc 35:f9caeb8ca31e 1254 }
maximbolduc 35:f9caeb8ca31e 1255
maximbolduc 36:8e84b5ade03e 1256 if ( autosteer_timeout.read_ms() > 5000 || autosteer_timeout.read_ms() > time_till_stop ) {
maximbolduc 36:8e84b5ade03e 1257 autosteer_timeout.reset();
maximbolduc 36:8e84b5ade03e 1258 enable_motor = 0;
maximbolduc 36:8e84b5ade03e 1259 }
maximbolduc 35:f9caeb8ca31e 1260 if ( antenna_active == 1 && gps.readable()) {
maximbolduc 35:f9caeb8ca31e 1261 if (getline(false)) {
maximbolduc 45:ecd8c2e27948 1262 if ( validate_checksum(msg,result)) {
maximbolduc 38:b5352d6f8166 1263 //pc.puts(msg);
maximbolduc 45:ecd8c2e27948 1264 gps_analyse(result);
maximbolduc 35:f9caeb8ca31e 1265 } else {
maximbolduc 33:3e71c418e90d 1266 pc.puts("INVALID!!!!\r\n");
maximbolduc 32:c57bc701d65c 1267 }
maximbolduc 26:dc00998140af 1268 }
maximbolduc 26:dc00998140af 1269 }
maximbolduc 35:f9caeb8ca31e 1270 if ( bluetooth.readable()) {
maximbolduc 35:f9caeb8ca31e 1271 if (getline2()) {
maximbolduc 45:ecd8c2e27948 1272 if ( validate_checksum(msg2,result)) {
maximbolduc 45:ecd8c2e27948 1273 btTimer.reset();
maximbolduc 45:ecd8c2e27948 1274 lastgetBT= btTimer.read_ms();
maximbolduc 45:ecd8c2e27948 1275 // pc.puts(msg2);
maximbolduc 45:ecd8c2e27948 1276 pc_analyse(result);
maximbolduc 45:ecd8c2e27948 1277 }
maximbolduc 26:dc00998140af 1278 }
maximbolduc 26:dc00998140af 1279 }
maximbolduc 35:f9caeb8ca31e 1280 if ( btTimer.read_ms()-lastgetBT>1000) {
maximbolduc 35:f9caeb8ca31e 1281 //we did not get any commands over BT
maximbolduc 35:f9caeb8ca31e 1282 ledRED=1; //turn red
maximbolduc 35:f9caeb8ca31e 1283 } else ledRED=0;
maximbolduc 35:f9caeb8ca31e 1284
maximbolduc 35:f9caeb8ca31e 1285 if ( ((motTimer.read_ms()-lastsend_motorstate)>8000) || (motor_enable!=lastmotor_enable)) {
maximbolduc 26:dc00998140af 1286 bluetooth.puts(motor_enable_state);
maximbolduc 38:b5352d6f8166 1287 // pc.puts(motor_enable_state);
jhedmonton 28:5905886c76ee 1288 motTimer.reset();
jhedmonton 28:5905886c76ee 1289 lastsend_motorstate=motTimer.read_ms();
jhedmonton 28:5905886c76ee 1290 lastmotor_enable=motor_enable;
maximbolduc 26:dc00998140af 1291 }
maximbolduc 35:f9caeb8ca31e 1292 if (boom18!=lastboom18) {
maximbolduc 35:f9caeb8ca31e 1293 boomstate[4]=boom18 | 0x80; //
maximbolduc 35:f9caeb8ca31e 1294 bluetooth.puts(boomstate);
maximbolduc 38:b5352d6f8166 1295 // pc.puts(boomstate);
maximbolduc 35:f9caeb8ca31e 1296 lastboom18=boom18;
jhedmonton 27:9ac59b261d87 1297 }
maximbolduc 44:e9d5cd98273d 1298 if ( print_euler == 1 && angle_send == 1 ) {
maximbolduc 44:e9d5cd98273d 1299 //&& reading == 0){
maximbolduc 43:e3f064f5eecd 1300 lastpitch = 0.9*lastpitch + 0.1 * (toDegrees(get_pitch()*3.5));
maximbolduc 43:e3f064f5eecd 1301 lastroll = 0.9 * lastroll + 0.1 * toDegrees(get_roll()*3.5);
maximbolduc 38:b5352d6f8166 1302
maximbolduc 38:b5352d6f8166 1303 double dps = - last_yaw;
maximbolduc 38:b5352d6f8166 1304 last_yaw =toDegrees( imuFilter.getYaw()) * -1;
maximbolduc 38:b5352d6f8166 1305 dps = (dps + last_yaw) * 5; // update every 200 ms, so for dps need *5
maximbolduc 38:b5352d6f8166 1306
maximbolduc 38:b5352d6f8166 1307 sprintf(output,"$EULER,%f,%f,%f\r\n",lastroll,lastpitch,dps);
maximbolduc 30:3afafa1ef16b 1308 bluetooth.puts(output);
maximbolduc 26:dc00998140af 1309 angle_send = 0;
maximbolduc 38:b5352d6f8166 1310 counter++;
maximbolduc 38:b5352d6f8166 1311 if ( bear == false && counter > 3 ) { //reinitialise the gyro after 600ms for the reference to be changed.
maximbolduc 38:b5352d6f8166 1312 imuFilter.reset();
maximbolduc 38:b5352d6f8166 1313 bear = true;
maximbolduc 38:b5352d6f8166 1314 }
jhedmonton 27:9ac59b261d87 1315 }
maximbolduc 26:dc00998140af 1316 }
maximbolduc 35:f9caeb8ca31e 1317 }