From: Max K. <ma...@du...> - 2012-06-20 12:03:40
|
Damiano, please keep the mailing list on Cc! On 2012/06/20 13:58, Damiano Bortolato <da...@da...> wrote: > On Wed, 2012-06-20 at 11:49 +0200, Max Kellermann wrote: > > Damiano, please post to the mailing list, so others can participate, > > too. > > > > On 2012/06/20 11:39, Damiano Bortolato <da...@da...> wrote: > > > I've a little problem: when I produce fake NMEA sentences it works > > > properly (switch between circling and cruise mode), when I populate > > > directly the NMEAInfo it detects the GPS, (altitude location and speed > > > are ok and the glider is moving on the map) but it is not able to detect > > > the fly mode (circling/cruise). > > > > > > Is some crucial data missing ? > > > > > > > > > bool > > > SilentWingsDevice::DataReceived(const void *data, size_t length, > > > struct NMEAInfo &info) > > > { > > > if(length % sizeof(SilentWingsBinary)){ > > > return false; // malformed data? > > > } > > > > Can there be more than one packet in a datagram? If no, why check for > > modulus? If yes, why not parse all of them? > > May be, I don't know, in that case I take the first and discard the > others (or I may take the last a discard the previous). > > > > > > SilentWingsBinary &binary = *(SilentWingsBinary *)data; > > > > This cast is invalid, because it removes the "const". > > > Ok > > > > info.location.latitude = Angle::Degrees(binary.position_latitude); > > > info.location.longitude = Angle::Degrees(binary.position_longitude); > > > info.gps_altitude = binary.altitude_msl; > > > info.track = Angle::Degrees(binary.heading); > > > > All of the above don't work with FIXED=y. You must cast to "fixed" > > explicitly. (More such errors below) > > > Ok > > > > info.gps.fix_quality = FixQuality::GPS; > > > > This should better be FixQuality::SIMULATION. > > > > I tried also that but nothing changes. This does not affect your problem, but still the code line above is wrong. > > > info.gps.satellites_used = -1; > > > > Why bother filling this attribute when you don't have any data? > > > > > info.gps.real = true; > > > info.gps.simulator = false; > > > > This is both obviously wrong. > > > > Yes I know, they were just trials. > > > > info.ground_speed = sqrt(binary.vx*binary.vx + binary.vy*binary.vy); > > > > Use hypot(). > > > > Ok > > > > info.ground_speed_available.Update(info.clock); > > > info.location_available.Update(info.clock); > > > info.gps_altitude_available.Update(info.clock); > > > info.gps.fix_quality_available.Update(info.clock); > > > info.gps.satellites_used_available.Update(info.clock); > > > info.track_available.Update(info.clock); > > > info.alive.Update(info.clock); > > > > The Validity objects should be updated right after the according > > attribute was set. It's now difficult to see if you missed one. > > > > Ok > > > > info.gps.Expire(binary.timestamp); > > > > What's this? > > > > Another trial. It was not very clear to me what Expire() is supposed to > do (check expiration and clear?) Did you read its API documentation? Anyway, it's not supposed to be called by device drivers. Remove that. > > What is binary.timestamp? And why don't you use the time stamp to > > update NMEAInfo::time? My guess is that there is no time, and XCSoar > > needs a clock for many of its algorithms. > > This is also my opinion (that is why i tried with Expire()), but > info.clock is running, I can see it from the debug print... > > ... > 183097.12 45°24'41"N 11°50'52"E (45.411492, 11.847639) > 183097.32 45°24'41"N 11°50'52"E (45.411515, 11.847683) > 183097.52 45°24'42"N 11°50'52"E (45.411537, 11.847728) > 183097.72 45°24'42"N 11°50'52"E (45.411557, 11.847774) > 183097.92 45°24'42"N 11°50'52"E (45.411576, 11.847820) > 183098.12 45°24'42"N 11°50'52"E (45.411593, 11.847867) > 183098.32 45°24'42"N 11°50'52"E (45.411609, 11.847915) > 183098.52 45°24'42"N 11°50'53"E (45.411622, 11.847963) > ... > > binary timestamp is a timestamp provided by the simulator, it is the > same field used to generate the UTC time on the $GPGGA NMEA sentence. > I'll check everything again. Consider that info.clock and info.time are two different things. > > I forgot to say that it's only a draft version on the code. ;) > > > Damiano |