From 970dbf3c8d091188589618934cbdfd4d730f52a0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 21 Jan 2016 17:55:50 +1100 Subject: [PATCH] GCS_MAVLink: fixed build with MAVLink1 --- libraries/GCS_MAVLink/GCS.h | 9 +++++++++ libraries/GCS_MAVLink/GCS_Common.cpp | 11 ++--------- libraries/GCS_MAVLink/GCS_Signing.cpp | 28 ++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/libraries/GCS_MAVLink/GCS.h b/libraries/GCS_MAVLink/GCS.h index dbefaa3865..d679f7b7a1 100644 --- a/libraries/GCS_MAVLink/GCS.h +++ b/libraries/GCS_MAVLink/GCS.h @@ -203,6 +203,9 @@ public: static void set_dataflash(DataFlash_Class *dataflash) { dataflash_p = dataflash; } + + // update signing timestamp on GPS lock + static void update_signing_timestamp(uint64_t timestamp_usec); private: float adjust_rate_for_stream_trigger(enum streams stream_num); @@ -356,8 +359,14 @@ private: // return true if this channel has hardware flow control bool have_flow_control(void); +#if MAVLINK_PROTOCOL_VERSION >= 2 + mavlink_signing_t signing; + static mavlink_signing_streams_t signing_streams; + + static StorageAccess _signing_storage; void handle_setup_signing(const mavlink_message_t *msg); bool signing_key_save(const struct SigningKey &key); bool signing_key_load(struct SigningKey &key); void load_signing_key(void); +#endif // MAVLINK_PROTOCOL_VERSION }; diff --git a/libraries/GCS_MAVLink/GCS_Common.cpp b/libraries/GCS_MAVLink/GCS_Common.cpp index ed60d3aaeb..65f2f035b6 100644 --- a/libraries/GCS_MAVLink/GCS_Common.cpp +++ b/libraries/GCS_MAVLink/GCS_Common.cpp @@ -49,15 +49,6 @@ GCS_MAVLINK::init(AP_HAL::UARTDriver *port, mavlink_channel_t mav_chan) initialised = true; _queued_parameter = NULL; reset_cli_timeout(); - - // setup for signing - mavlink_status_t *status = mavlink_get_channel_status(chan); - signing.flags = MAVLINK_SIGNING_FLAG_SIGN_OUTGOING; - signing.link_id = chan; - signing.timestamp = 0; - memset(signing.secret_key, 42, sizeof(signing.secret_key)); - status->signing = &signing; - } @@ -110,8 +101,10 @@ GCS_MAVLINK::setup_uart(const AP_SerialManager& serial_manager, AP_SerialManager // and init the gcs instance init(uart, mav_chan); +#if MAVLINK_PROTOCOL_VERSION >= 2 // load signing key load_signing_key(); +#endif } /** diff --git a/libraries/GCS_MAVLink/GCS_Signing.cpp b/libraries/GCS_MAVLink/GCS_Signing.cpp index 135ebd46c0..b7410973f4 100644 --- a/libraries/GCS_MAVLink/GCS_Signing.cpp +++ b/libraries/GCS_MAVLink/GCS_Signing.cpp @@ -21,6 +21,8 @@ extern const AP_HAL::HAL& hal; +#if MAVLINK_PROTOCOL_VERSION >= 2 + // storage object StorageAccess GCS_MAVLINK::_signing_storage(StorageManager::StorageKeys); @@ -124,10 +126,34 @@ void GCS_MAVLINK::load_signing_key(void) } memcpy(signing.secret_key, key.secret_key, 32); signing.link_id = (uint8_t)chan; - signing.timestamp = 1; + signing.timestamp = key.timestamp; signing.flags = MAVLINK_SIGNING_FLAG_SIGN_OUTGOING; signing.accept_unsigned_callback = accept_unsigned_callback; status->signing = &signing; status->signing_streams = &signing_streams; } + +/* + update signing timestamp. This is called when we get GPS lock + timestamp_usec is since 1/1/1970 (the epoch) + */ +void GCS_MAVLINK::update_signing_timestamp(uint64_t timestamp_usec) +{ + uint64_t signing_timestamp = (timestamp_usec / 1000*1000UL); + const uint64_t epoch_offset = 1420070400; + if (signing_timestamp > epoch_offset) { + signing_timestamp -= epoch_offset; + } + for (uint8_t i=0; isigning && status->signing->timestamp < signing_timestamp) { + status->signing->timestamp = signing_timestamp; + } + } +} + +#else +void GCS_MAVLINK::update_signing_timestamp(uint64_t timestamp_usec) {} +#endif // MAVLINK_PROTOCOL_VERSION