da bada
/
AntennaTracker
UAV/UAS Tracking Antenna System
tracking.c@0:96bf30dd833a, 2011-05-30 (annotated)
- Committer:
- danidanko
- Date:
- Mon May 30 21:28:33 2011 +0000
- Revision:
- 0:96bf30dd833a
v1.01
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
danidanko | 0:96bf30dd833a | 1 | /* Tracking Antenna for UCSD AUVSI Team DANIEL BEDENKO d.bedenko@gmail.com |
danidanko | 0:96bf30dd833a | 2 | * This is the final project class ECE118 .. This will work with any autopilot |
danidanko | 0:96bf30dd833a | 3 | * software as long as the Serial Input communication must be in the following format |
danidanko | 0:96bf30dd833a | 4 | * 1 Byte 0xFF [Start Byte] |
danidanko | 0:96bf30dd833a | 5 | * 4 bytes Plane Lat [32 bit float little endian] |
danidanko | 0:96bf30dd833a | 6 | * 4 bytes Plane Lon |
danidanko | 0:96bf30dd833a | 7 | * 4 bytes Plane Alt |
danidanko | 0:96bf30dd833a | 8 | * 4 bytes Ground Lat [32 bit float little endian] |
danidanko | 0:96bf30dd833a | 9 | * 4 bytes Ground Lon |
danidanko | 0:96bf30dd833a | 10 | * 4 bytes Gorund Alt |
danidanko | 0:96bf30dd833a | 11 | * 1 byte 0xFE [End Byte] |
danidanko | 0:96bf30dd833a | 12 | * Also one would have to recalibrate the servos to their system this particular system |
danidanko | 0:96bf30dd833a | 13 | * uses one 360 Servo from ServoCity for Azimuth tracking and one 180 Standard Servo for |
danidanko | 0:96bf30dd833a | 14 | * elevation Tracking. Theoretically this will work for a moble ground station |
danidanko | 0:96bf30dd833a | 15 | * Use at own risk. |
danidanko | 0:96bf30dd833a | 16 | */ |
danidanko | 0:96bf30dd833a | 17 | |
danidanko | 0:96bf30dd833a | 18 | #include <HMC6352.h> |
danidanko | 0:96bf30dd833a | 19 | #include <tracker.h> |
danidanko | 0:96bf30dd833a | 20 | |
danidanko | 0:96bf30dd833a | 21 | |
danidanko | 0:96bf30dd833a | 22 | //Magnetometer |
danidanko | 0:96bf30dd833a | 23 | HMC6352 compass(p28, p27); |
danidanko | 0:96bf30dd833a | 24 | //serial ports |
danidanko | 0:96bf30dd833a | 25 | Serial usb_232(USBTX, USBRX); // tx, rx Debugging Port not used in actual Op |
danidanko | 0:96bf30dd833a | 26 | Serial groundStation(p9, p10); // tx, rx |
danidanko | 0:96bf30dd833a | 27 | //leds |
danidanko | 0:96bf30dd833a | 28 | DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); |
danidanko | 0:96bf30dd833a | 29 | |
danidanko | 0:96bf30dd833a | 30 | |
danidanko | 0:96bf30dd833a | 31 | int main() { |
danidanko | 0:96bf30dd833a | 32 | // wgs84 g for ground p for plane lat[deg] lon[deg] alt[m] |
danidanko | 0:96bf30dd833a | 33 | float compas, p_lat, p_lon, p_alt, g_lat, g_lon, g_alt; |
danidanko | 0:96bf30dd833a | 34 | // everything in meters ecef NED is north east down ecef_xyz is the vector pointing |
danidanko | 0:96bf30dd833a | 35 | // from the ground to the plane in ecef. NED is the North East Down vector from |
danidanko | 0:96bf30dd833a | 36 | // ground to plane |
danidanko | 0:96bf30dd833a | 37 | float p_x, p_y, p_z, g_x, g_y, g_z, ecef_x, ecef_y, ecef_z, N, E, D; |
danidanko | 0:96bf30dd833a | 38 | // groundStation pos in Radians |
danidanko | 0:96bf30dd833a | 39 | float g_latR, g_lonR; |
danidanko | 0:96bf30dd833a | 40 | // Azimuth and Elevation Angles [Radians] |
danidanko | 0:96bf30dd833a | 41 | float Az, Ev; |
danidanko | 0:96bf30dd833a | 42 | // Servo commands |
danidanko | 0:96bf30dd833a | 43 | int Az_uS, Ev_uS; |
danidanko | 0:96bf30dd833a | 44 | bool sanDiego; |
danidanko | 0:96bf30dd833a | 45 | |
danidanko | 0:96bf30dd833a | 46 | //Set up serial settings Bits/S 8N1 is default |
danidanko | 0:96bf30dd833a | 47 | usb_232.baud(57600); |
danidanko | 0:96bf30dd833a | 48 | groundStation.baud(57600); |
danidanko | 0:96bf30dd833a | 49 | //HMC6352 Magnetometor Settings //Continuous mode, periodic set/reset, 20Hz rate. |
danidanko | 0:96bf30dd833a | 50 | compass.setOpMode(HMC6352_CONTINUOUS, 1, 20); |
danidanko | 0:96bf30dd833a | 51 | // Set up Leds OFF |
danidanko | 0:96bf30dd833a | 52 | led1 = led2 = led3 = led4 = OFF; |
danidanko | 0:96bf30dd833a | 53 | |
danidanko | 0:96bf30dd833a | 54 | // Set up Servos for Azimuth and Elevation |
danidanko | 0:96bf30dd833a | 55 | PwmOut Az_servo(p21); |
danidanko | 0:96bf30dd833a | 56 | Az_servo.period(0.020); |
danidanko | 0:96bf30dd833a | 57 | PwmOut Ev_servo(p22); |
danidanko | 0:96bf30dd833a | 58 | Ev_servo.period(0.020); |
danidanko | 0:96bf30dd833a | 59 | |
danidanko | 0:96bf30dd833a | 60 | // Set up Initial Servo Position |
danidanko | 0:96bf30dd833a | 61 | Az = torads(90); |
danidanko | 0:96bf30dd833a | 62 | Ev = torads(30); |
danidanko | 0:96bf30dd833a | 63 | Az_uS = (int)(0.9195*Az*Az + 121.18*Az + 1308.43); |
danidanko | 0:96bf30dd833a | 64 | Ev_uS = (int)(-1.223*Ev*Ev - 589.16*Ev + 2376.78); |
danidanko | 0:96bf30dd833a | 65 | |
danidanko | 0:96bf30dd833a | 66 | |
danidanko | 0:96bf30dd833a | 67 | /* |
danidanko | 0:96bf30dd833a | 68 | * Get serial string and figure out if you're in Lexington Part, MD or in San Diego, CA |
danidanko | 0:96bf30dd833a | 69 | * This is competition specific for the san diego team, you have to change these |
danidanko | 0:96bf30dd833a | 70 | * values if you're not flying in san diego or maryland |
danidanko | 0:96bf30dd833a | 71 | * Magnetic Declination in San Diego = 12.1167 EAST Turn on LED 3 |
danidanko | 0:96bf30dd833a | 72 | * Magnetic Declination in Lexington Park, MD = 10.9833 West Turn on LED 4 |
danidanko | 0:96bf30dd833a | 73 | * if SanDiego = 1 you in sandiego else you're in marryland |
danidanko | 0:96bf30dd833a | 74 | */ |
danidanko | 0:96bf30dd833a | 75 | while (1) //set up while |
danidanko | 0:96bf30dd833a | 76 | { |
danidanko | 0:96bf30dd833a | 77 | |
danidanko | 0:96bf30dd833a | 78 | |
danidanko | 0:96bf30dd833a | 79 | //set up servo for turning on |
danidanko | 0:96bf30dd833a | 80 | |
danidanko | 0:96bf30dd833a | 81 | Az_servo.pulsewidth_us(Az_uS); |
danidanko | 0:96bf30dd833a | 82 | Ev_servo.pulsewidth_us(Ev_uS); |
danidanko | 0:96bf30dd833a | 83 | |
danidanko | 0:96bf30dd833a | 84 | |
danidanko | 0:96bf30dd833a | 85 | wait(0.05); |
danidanko | 0:96bf30dd833a | 86 | compas = (compass.sample() / 10.0); |
danidanko | 0:96bf30dd833a | 87 | usb_232.printf("[%f] Heading \n", compas); |
danidanko | 0:96bf30dd833a | 88 | led2 = !led2; //blink untill heading is set |
danidanko | 0:96bf30dd833a | 89 | |
danidanko | 0:96bf30dd833a | 90 | getlla(p_lat, p_lon, p_alt, g_lat, g_lon, g_alt); |
danidanko | 0:96bf30dd833a | 91 | |
danidanko | 0:96bf30dd833a | 92 | if (g_lon < -100){sanDiego = 1; led3 = ON;}//-100 long is about center of US |
danidanko | 0:96bf30dd833a | 93 | else{sanDiego = 0; led4 = ON;} |
danidanko | 0:96bf30dd833a | 94 | |
danidanko | 0:96bf30dd833a | 95 | if (sanDiego == 1 && compas > 346.88 && compas < 348.88) |
danidanko | 0:96bf30dd833a | 96 | {usb_232.printf("[%f] TRUE NORTH = 347.8 Magnetic North -- SD, CA\n", compas); |
danidanko | 0:96bf30dd833a | 97 | led2 = OFF; //reference found enter main loop |
danidanko | 0:96bf30dd833a | 98 | Ev = torads(1); |
danidanko | 0:96bf30dd833a | 99 | Ev_uS = (int)(-1.223*Ev*Ev - 589.16*Ev + 2376.78); |
danidanko | 0:96bf30dd833a | 100 | Ev_servo.pulsewidth_us(Ev_uS); |
danidanko | 0:96bf30dd833a | 101 | break; |
danidanko | 0:96bf30dd833a | 102 | } |
danidanko | 0:96bf30dd833a | 103 | if (sanDiego == 0 && compas < 11.98 && compas > 9.98) |
danidanko | 0:96bf30dd833a | 104 | {usb_232.printf("[%f] TRUE NORTH = 10.98 Magnetic North -- Lexington Park, MD\n", compas); |
danidanko | 0:96bf30dd833a | 105 | led2 = OFF; //reference found enter main loop |
danidanko | 0:96bf30dd833a | 106 | Ev = torads(1); |
danidanko | 0:96bf30dd833a | 107 | Ev_uS = (int)(-1.223*Ev*Ev - 589.16*Ev + 2376.78); |
danidanko | 0:96bf30dd833a | 108 | Ev_servo.pulsewidth_us(Ev_uS); |
danidanko | 0:96bf30dd833a | 109 | break; |
danidanko | 0:96bf30dd833a | 110 | } |
danidanko | 0:96bf30dd833a | 111 | }//end of set up while loop you have now pointed the antenna tracker at TRUE NORTH |
danidanko | 0:96bf30dd833a | 112 | |
danidanko | 0:96bf30dd833a | 113 | |
danidanko | 0:96bf30dd833a | 114 | //Start Main loop |
danidanko | 0:96bf30dd833a | 115 | while(1){ |
danidanko | 0:96bf30dd833a | 116 | |
danidanko | 0:96bf30dd833a | 117 | /* This main loop gets plane coordinates from the serial port |
danidanko | 0:96bf30dd833a | 118 | * converts it to a NED vector pointing from the ground statio |
danidanko | 0:96bf30dd833a | 119 | * to the airplane and then sends servos to point at it |
danidanko | 0:96bf30dd833a | 120 | */ |
danidanko | 0:96bf30dd833a | 121 | |
danidanko | 0:96bf30dd833a | 122 | // get ground and plane coordinates |
danidanko | 0:96bf30dd833a | 123 | getlla(p_lat, p_lon, p_alt, g_lat, g_lon, g_alt); |
danidanko | 0:96bf30dd833a | 124 | |
danidanko | 0:96bf30dd833a | 125 | //convert airplane to ecef |
danidanko | 0:96bf30dd833a | 126 | lla2ecef(p_lat, p_lon, p_alt, p_x, p_y, p_z); |
danidanko | 0:96bf30dd833a | 127 | |
danidanko | 0:96bf30dd833a | 128 | //convert ground to ecef |
danidanko | 0:96bf30dd833a | 129 | lla2ecef(g_lat, g_lon, g_alt, g_x, g_y, g_z); |
danidanko | 0:96bf30dd833a | 130 | |
danidanko | 0:96bf30dd833a | 131 | //subtract plane from ground to get the difference vector |
danidanko | 0:96bf30dd833a | 132 | ecef_x = p_x - g_x; |
danidanko | 0:96bf30dd833a | 133 | ecef_y = p_y - g_y; |
danidanko | 0:96bf30dd833a | 134 | ecef_z = p_z - g_z; |
danidanko | 0:96bf30dd833a | 135 | |
danidanko | 0:96bf30dd833a | 136 | g_latR= torads(g_lat); |
danidanko | 0:96bf30dd833a | 137 | g_lonR= torads(g_lon); |
danidanko | 0:96bf30dd833a | 138 | |
danidanko | 0:96bf30dd833a | 139 | /* translation ecef xyz to north east down |
danidanko | 0:96bf30dd833a | 140 | * |
danidanko | 0:96bf30dd833a | 141 | * TE2L = [ -sin(glat)*cos(glon) -sin(glat)*sin(glon) cos(glat) |
danidanko | 0:96bf30dd833a | 142 | * -sin(glon) cos(glon) 0 |
danidanko | 0:96bf30dd833a | 143 | * -cos(glat)*cos(glon) -cos(glat)*sin(glon) -sin(glat) ] |
danidanko | 0:96bf30dd833a | 144 | * NED = TE2L*ecef |
danidanko | 0:96bf30dd833a | 145 | */ |
danidanko | 0:96bf30dd833a | 146 | |
danidanko | 0:96bf30dd833a | 147 | N = -sin(g_latR)*cos(g_lonR)*ecef_x + -sin(g_latR)*sin(g_lonR)*ecef_y + cos(g_latR)*ecef_z; |
danidanko | 0:96bf30dd833a | 148 | E = -sin(g_lonR)*ecef_x + cos(g_lonR)*ecef_y; |
danidanko | 0:96bf30dd833a | 149 | D = -cos(g_latR)*cos(g_lonR)*ecef_x -cos(g_latR)*sin(g_lonR)*ecef_y + -sin(g_latR)*ecef_z; |
danidanko | 0:96bf30dd833a | 150 | D = (-1)*D; //we are on the ground looking up! :) |
danidanko | 0:96bf30dd833a | 151 | |
danidanko | 0:96bf30dd833a | 152 | Az = atan2(N,E); |
danidanko | 0:96bf30dd833a | 153 | Ev = abs(atan2(D, sqrt(N*N + E*E))); // this will always be positive |
danidanko | 0:96bf30dd833a | 154 | |
danidanko | 0:96bf30dd833a | 155 | // if plane is on the ground next to ground station point north |
danidanko | 0:96bf30dd833a | 156 | if(g_lat == p_lat && g_lon == p_lon) |
danidanko | 0:96bf30dd833a | 157 | {Ev = 0; Az = PI/2;} |
danidanko | 0:96bf30dd833a | 158 | |
danidanko | 0:96bf30dd833a | 159 | //Aling Az is from 0 to 2*pi - no negative numbers |
danidanko | 0:96bf30dd833a | 160 | if (Az < 0) |
danidanko | 0:96bf30dd833a | 161 | Az = Az + 2*PI; |
danidanko | 0:96bf30dd833a | 162 | |
danidanko | 0:96bf30dd833a | 163 | //from here on out it depends on the how the servo pulse width relates to |
danidanko | 0:96bf30dd833a | 164 | //angle her my azimuth servo is defined from 270 -> -90 deg 1900 - 1120 uS |
danidanko | 0:96bf30dd833a | 165 | //and the elevation Servo is defines from 0 - 180 deg 0500 - 2400 uS |
danidanko | 0:96bf30dd833a | 166 | |
danidanko | 0:96bf30dd833a | 167 | |
danidanko | 0:96bf30dd833a | 168 | //blackout region where the azimuth will swing back to Az-PI |
danidanko | 0:96bf30dd833a | 169 | //And Ev = pi - Ev |
danidanko | 0:96bf30dd833a | 170 | if (Az > 17*PI/12 && Az < 19*PI/12) |
danidanko | 0:96bf30dd833a | 171 | {Az = Az - PI; |
danidanko | 0:96bf30dd833a | 172 | Ev = PI - Ev;} |
danidanko | 0:96bf30dd833a | 173 | |
danidanko | 0:96bf30dd833a | 174 | // 270 -> -90 |
danidanko | 0:96bf30dd833a | 175 | if (Az > 3*PI/2 && Az < 2*PI) |
danidanko | 0:96bf30dd833a | 176 | Az = Az - 2*PI; |
danidanko | 0:96bf30dd833a | 177 | |
danidanko | 0:96bf30dd833a | 178 | //now get the uS .. the values below are from polyfit matlab |
danidanko | 0:96bf30dd833a | 179 | //from your servo calibrations to the second degree |
danidanko | 0:96bf30dd833a | 180 | |
danidanko | 0:96bf30dd833a | 181 | Az_uS = (int)(0.9195*Az*Az + 121.18*Az + 1308.43); |
danidanko | 0:96bf30dd833a | 182 | Ev_uS = (int)(-1.223*Ev*Ev - 589.16*Ev + 2376.78); |
danidanko | 0:96bf30dd833a | 183 | |
danidanko | 0:96bf30dd833a | 184 | // Send Servo Commands |
danidanko | 0:96bf30dd833a | 185 | Az_servo.pulsewidth_us(Az_uS); |
danidanko | 0:96bf30dd833a | 186 | Ev_servo.pulsewidth_us(Ev_uS); |
danidanko | 0:96bf30dd833a | 187 | |
danidanko | 0:96bf30dd833a | 188 | |
danidanko | 0:96bf30dd833a | 189 | // usb_232.printf("[%2.2f Az] [%i Az uS] [%2.2f Ev] [%i Az uS] \n", todegs(Az), Az_uS, todegs(Ev), Ev_uS ); |
danidanko | 0:96bf30dd833a | 190 | |
danidanko | 0:96bf30dd833a | 191 | //usb_232.printf("%2.2f Azimuth %2.2f North %2.2f East\n", todegs(Az), N, E ); |
danidanko | 0:96bf30dd833a | 192 | // usb_232.printf("[%f %f %f ] Plane \n", p_lat, p_lon, p_alt ); |
danidanko | 0:96bf30dd833a | 193 | // usb_232.printf("[%f %f %f ] Plane ecef \n ", p_x, p_y, p_z ); |
danidanko | 0:96bf30dd833a | 194 | // usb_232.printf("[%f %f %f ] Ground \n", g_lat, g_lon, g_alt); |
danidanko | 0:96bf30dd833a | 195 | // usb_232.printf("[%f %f %f ] Ground ecef \n ", g_x, g_y, g_z ); |
danidanko | 0:96bf30dd833a | 196 | } |
danidanko | 0:96bf30dd833a | 197 | |
danidanko | 0:96bf30dd833a | 198 | } // end main |
danidanko | 0:96bf30dd833a | 199 | void lla2ecef(float lat, float lon, float alt, float& x, float& y, float& z) |
danidanko | 0:96bf30dd833a | 200 | { |
danidanko | 0:96bf30dd833a | 201 | // WGS84 ellipsoid constants: |
danidanko | 0:96bf30dd833a | 202 | float a = 6378137; //earth semi-major axis |
danidanko | 0:96bf30dd833a | 203 | float esqrd = 0.006694379990141; //Eccentricity |
danidanko | 0:96bf30dd833a | 204 | float N; |
danidanko | 0:96bf30dd833a | 205 | //calculation |
danidanko | 0:96bf30dd833a | 206 | lat = torads(lat); |
danidanko | 0:96bf30dd833a | 207 | lon = torads(lon); |
danidanko | 0:96bf30dd833a | 208 | //The length of normal (N) to the ellipsoid |
danidanko | 0:96bf30dd833a | 209 | N = a / sqrt(1 - esqrd * sin( lat ) * sin( lat ) ) ; |
danidanko | 0:96bf30dd833a | 210 | x = (N+alt) * cos(lat) * cos(lon); |
danidanko | 0:96bf30dd833a | 211 | y = (N+alt) * cos(lat) * sin(lon); |
danidanko | 0:96bf30dd833a | 212 | z = ((1-esqrd) * N + alt) * sin(lat); |
danidanko | 0:96bf30dd833a | 213 | |
danidanko | 0:96bf30dd833a | 214 | } |
danidanko | 0:96bf30dd833a | 215 | float torads(float deg) |
danidanko | 0:96bf30dd833a | 216 | { |
danidanko | 0:96bf30dd833a | 217 | return (deg*PI) / 180 ; //in rads |
danidanko | 0:96bf30dd833a | 218 | } |
danidanko | 0:96bf30dd833a | 219 | float todegs(float rads) |
danidanko | 0:96bf30dd833a | 220 | { |
danidanko | 0:96bf30dd833a | 221 | return (rads*180) / PI ; //in degs |
danidanko | 0:96bf30dd833a | 222 | } |
danidanko | 0:96bf30dd833a | 223 | void servo_calib(void) |
danidanko | 0:96bf30dd833a | 224 | { |
danidanko | 0:96bf30dd833a | 225 | PwmOut servo(p22); |
danidanko | 0:96bf30dd833a | 226 | servo.period(0.020); |
danidanko | 0:96bf30dd833a | 227 | char pwm_uS[5]; |
danidanko | 0:96bf30dd833a | 228 | int pwm_uS_i; |
danidanko | 0:96bf30dd833a | 229 | while(1) |
danidanko | 0:96bf30dd833a | 230 | { |
danidanko | 0:96bf30dd833a | 231 | usb_232.printf(" \n Enter PWM in uS [0600-2400] : "); |
danidanko | 0:96bf30dd833a | 232 | usb_232.scanf("%s", pwm_uS); |
danidanko | 0:96bf30dd833a | 233 | pwm_uS_i = atof ( pwm_uS ); |
danidanko | 0:96bf30dd833a | 234 | servo.pulsewidth_us(pwm_uS_i); |
danidanko | 0:96bf30dd833a | 235 | usb_232.printf("\n You Entered: %i ", pwm_uS_i); |
danidanko | 0:96bf30dd833a | 236 | } |
danidanko | 0:96bf30dd833a | 237 | } |
danidanko | 0:96bf30dd833a | 238 | void getlla(float& p_lat, float& p_lon, float& p_alt, float& g_lat, float& g_lon, float& g_alt) |
danidanko | 0:96bf30dd833a | 239 | { |
danidanko | 0:96bf30dd833a | 240 | uchar msg[26]; |
danidanko | 0:96bf30dd833a | 241 | do{ |
danidanko | 0:96bf30dd833a | 242 | while( (msg[0] = groundStation.getc()) != 0xff); // wait for the start of communication string |
danidanko | 0:96bf30dd833a | 243 | for(int i=1; i<26; i++) { |
danidanko | 0:96bf30dd833a | 244 | msg[i] = groundStation.getc(); //fill message string |
danidanko | 0:96bf30dd833a | 245 | } |
danidanko | 0:96bf30dd833a | 246 | }while(msg[25] != 0xfe); // make sure the last character is 0xFE otherwise re read |
danidanko | 0:96bf30dd833a | 247 | led1 = !led1; //blink :) |
danidanko | 0:96bf30dd833a | 248 | //airplane |
danidanko | 0:96bf30dd833a | 249 | p_lat = tofloat(msg[4], msg[3], msg[2], msg[1]); |
danidanko | 0:96bf30dd833a | 250 | p_lon = tofloat(msg[8], msg[7], msg[6], msg[5]); |
danidanko | 0:96bf30dd833a | 251 | p_alt = tofloat(msg[12], msg[11], msg[10], msg[9]); |
danidanko | 0:96bf30dd833a | 252 | //ground |
danidanko | 0:96bf30dd833a | 253 | g_lat = tofloat(msg[16], msg[15], msg[14], msg[13]); |
danidanko | 0:96bf30dd833a | 254 | g_lon = tofloat(msg[20], msg[19], msg[18], msg[17]); |
danidanko | 0:96bf30dd833a | 255 | g_alt = tofloat(msg[24], msg[23], msg[22], msg[21]); |
danidanko | 0:96bf30dd833a | 256 | |
danidanko | 0:96bf30dd833a | 257 | } |
danidanko | 0:96bf30dd833a | 258 | float tofloat(uchar b0, uchar b1, uchar b2, uchar b3) |
danidanko | 0:96bf30dd833a | 259 | { |
danidanko | 0:96bf30dd833a | 260 | uchar b[] = {b3, b2, b1, b0}; |
danidanko | 0:96bf30dd833a | 261 | float *fp = (float *)b; |
danidanko | 0:96bf30dd833a | 262 | return *fp; |
danidanko | 0:96bf30dd833a | 263 | } |