From cb6bb631e261e5ec12845d9fdbd8652086c1719c Mon Sep 17 00:00:00 2001 From: Michal Fratczak Date: Tue, 25 Aug 2020 20:42:23 +0100 Subject: [PATCH] Improve nmea_t type and fix altitude not being recorded. Adjust flight state logic. --- tracker/code/main/dynamics_t.cpp | 1 - tracker/code/main/dynamics_t.h | 2 +- tracker/code/main/main.cpp | 31 +++++++++++--------------- tracker/code/nmea/nmea.cpp | 14 ++++++++---- tracker/code/nmea/nmea.h | 38 +++++++++++++++++++++++--------- tracker/tracker.cfg | 13 +++++++++-- 6 files changed, 62 insertions(+), 37 deletions(-) diff --git a/tracker/code/main/dynamics_t.cpp b/tracker/code/main/dynamics_t.cpp index b24ccb7..d5d096f 100644 --- a/tracker/code/main/dynamics_t.cpp +++ b/tracker/code/main/dynamics_t.cpp @@ -7,7 +7,6 @@ #include -// utc_seconds is HHMMSS converted to seconds. return true if sample was accepted void dynamics_t::add(const tp timestamp, const float val) { val_ = val; diff --git a/tracker/code/main/dynamics_t.h b/tracker/code/main/dynamics_t.h index fc269e3..609fe98 100644 --- a/tracker/code/main/dynamics_t.h +++ b/tracker/code/main/dynamics_t.h @@ -82,7 +82,7 @@ public: bool initialised() const { return initialised_; } - void add(const tp timestamp, const float val); // utc_seconds is HHMMSS converted to seconds. return true if sample was accepted + void add(const tp timestamp, const float val); float val() const { return val_; } float min() const { return val_min_; } diff --git a/tracker/code/main/main.cpp b/tracker/code/main/main.cpp index c96de0a..e9417c1 100644 --- a/tracker/code/main/main.cpp +++ b/tracker/code/main/main.cpp @@ -278,23 +278,18 @@ int main1(int argc, char** argv) LOG.log("nmea.log", nmea_str); nmea_t current_nmea; - /* - // REUSE LAT,LON,ALT FROM LAST VALID SENTENCE - // if currently parsed NMEA string has valid lat/lon/alt - // they will be stored in current_nmea - // otherwise we keep last valid - const nmea_t valid_nmea = GLOB::get().nmea_get(); - current_nmea.lat = valid_nmea.lat; - current_nmea.lon = valid_nmea.lon; - current_nmea.alt = valid_nmea.alt; - */ - if( NMEA_parse(nmea_str.c_str(), current_nmea) /*and current_nmea.valid()*/ ) { + // RMC has no altitude, copy from last known value + if( current_nmea.nmea_msg_type_ == nmea_t::nmea_msg_type_t::kRMC ) + current_nmea.alt = GLOB::get().nmea_current().alt; + GLOB::get().nmea_set(current_nmea); - if (current_nmea.valid()) + + if(current_nmea.valid()) GLOB::get().dynamics_add("alt", std::chrono::steady_clock::now(), current_nmea.alt); // cout< 3) - flight_state = flight_state_t::kAscend; else if( abs(dist_from_home.dist_line_) > 2000 and abs(dAltAvg) <= 3 and alt.val() < 2000 ) flight_state = flight_state_t::kLanded; + else if(dAltAvg < -15) + flight_state = flight_state_t::kFreefall; + else if(dAltAvg < 0) + flight_state = flight_state_t::kDescend; + else if(dAltAvg >= 0) + flight_state = flight_state_t::kAscend; } // cout< 0 && utc != 0) @@ -191,6 +194,8 @@ bool NMEA_parse(const char* Buffer, nmea_t& o_nmea) } // GGA else if (strncmp(Buffer+3, "RMC", 3) == 0) { + o_nmea.nmea_msg_type_ = nmea_t::nmea_msg_type_t::kRMC; + speedstring[0] = '\0'; coursestring[0] = '\0'; int scanned_positions = @@ -338,8 +343,9 @@ int nmea_t::utc_as_seconds() const bool nmea_t::valid() const { - // only one at a time can be valid. - // fix_status is from RMC, fix_quality is from GGA - return fix_status == fix_status_t::kValid - or fix_quality != fix_quality_t::kNoFix; + if(nmea_msg_type_ == nmea_msg_type_t::kGGA and fix_quality != fix_quality_t::kNoFix) + return true; + if(nmea_msg_type_ == nmea_msg_type_t::kRMC and fix_status == fix_status_t::kValid) + return true; + return false; } diff --git a/tracker/code/nmea/nmea.h b/tracker/code/nmea/nmea.h index c88519b..b0606e1 100644 --- a/tracker/code/nmea/nmea.h +++ b/tracker/code/nmea/nmea.h @@ -5,26 +5,23 @@ // keep data parsed from GGA __and__ RMC messages +// http://aprs.gids.nl/nmea/#rmc +// http://aprs.gids.nl/nmea/#gga + class nmea_t { public: + // fields provided by both GGA and RMC messages: + // char utc[6] = {'0', '0', '0', '0', '0', '0'}; // HHMMSS float lat = 0; // degree float lon = 0; // degree + + // GGA message fields: + // float alt = 0; // meters - - float speed_over_ground_mps = 0; - float course_over_ground_deg = 0; - int sats = 0; - - enum class fix_status_t : int { - kInvalid=0, // V - kValid=1 // A - }; - fix_status_t fix_status = fix_status_t::kInvalid; - enum class fix_quality_t : int { kNoFix = 0, kAutonomous = 1, @@ -35,6 +32,25 @@ public: }; fix_quality_t fix_quality = fix_quality_t::kNoFix; + + // RMC message fields: + // + float speed_over_ground_mps = 0; + float course_over_ground_deg = 0; + enum class fix_status_t : int { + kInvalid=0, // V + kValid=1 // A + }; + fix_status_t fix_status = fix_status_t::kInvalid; + + enum class nmea_msg_type_t : int { + kUnknown = 0, + kGGA = 1, + kRMC = 2 + }; + nmea_msg_type_t nmea_msg_type_ = nmea_msg_type_t::kUnknown; + + std::string str() const; std::string json() const; diff --git a/tracker/tracker.cfg b/tracker/tracker.cfg index dcd7631..88a619c 100644 --- a/tracker/tracker.cfg +++ b/tracker/tracker.cfg @@ -1,17 +1,22 @@ # tracker options # -callsign = fro +callsign = setcallsign freq = 434.5 baud = 300 port = 6666 ssdv = /tracker/ssdv.bin logsdir = /tracker/logs/ +# number of telemetry packets to send before SSDV packet msg_num = 3 +# launch location latlonalt = 52.1120009 latlonalt = 19.957789 latlonalt = 100 +# enable watchdog +watchdog = 1 # hardware configuration +# hw_pin_radio_on = 22 hw_radio_serial = /dev/serial0 #pi4 @@ -20,9 +25,13 @@ hw_radio_serial = /dev/serial0 hw_ublox_device = /dev/i2c-3 # camera +# cam_dir = /tracker/camera -cam_flip_h = +cam_flip_h = 0 cam_flip_v = 0 +# SSDV image resolution cam_ssdv_res = 128 +# video clip duration in minutes cam_video_dur = 15 +# photo snapshot interval in seconds cam_snapshot_interval = 30