From 915f728145eae90a8184149978fc0d5ad1f655ed Mon Sep 17 00:00:00 2001 From: Simone Guscetti Date: Mon, 13 Mar 2017 14:09:34 +0100 Subject: [PATCH] libtunes: Separate the default tunes from tunes.cpp --- src/lib/tunes/CMakeLists.txt | 1 + src/lib/tunes/default_tunes.cpp | 61 ++++++++++++++ src/lib/tunes/tunes.cpp | 84 ++++++++------------ src/lib/tunes/tunes.h | 5 +- src/systemcmds/tune_control/tune_control.cpp | 2 +- 5 files changed, 102 insertions(+), 51 deletions(-) create mode 100644 src/lib/tunes/default_tunes.cpp diff --git a/src/lib/tunes/CMakeLists.txt b/src/lib/tunes/CMakeLists.txt index de9cfff09c..97b4c15dc9 100644 --- a/src/lib/tunes/CMakeLists.txt +++ b/src/lib/tunes/CMakeLists.txt @@ -34,6 +34,7 @@ px4_add_module( MODULE lib__tunes SRCS tunes.cpp + default_tunes.cpp DEPENDS platforms__common modules__uORB diff --git a/src/lib/tunes/default_tunes.cpp b/src/lib/tunes/default_tunes.cpp new file mode 100644 index 0000000000..3c44dd5084 --- /dev/null +++ b/src/lib/tunes/default_tunes.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * Copyright (c) 2017 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file default_tunes.h + */ + +#include "tunes.h" + +// initialise default tunes +const char *Tunes::_default_tunes[] = { + "", // empty to align with the index + "MFT240L8 O4aO5dc O4aO5dc O4aO5dc L16dcdcdcdc", // startup tune + "MBT200a8a8a8PaaaP", // ERROR tone + "MFT200e8a8a", // Notify Positive tone + "MFT200e8e", // Notify Neutral tone + "MFT200e8c8e8c8e8c8", // Notify Negative tone + "MNT75L1O2G", //arming warning + "MBNT100a8", //battery warning slow + "MBNT255a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8", //battery warning fast + "MFT255L4AAAL1F#", //gps warning slow + "MFT255L4<<G#6A#6B#4", // home set tune +}; + +// set default_tunes array size +const unsigned int Tunes::_default_tunes_size = sizeof(_default_tunes) / sizeof(_default_tunes[0]); diff --git a/src/lib/tunes/tunes.cpp b/src/lib/tunes/tunes.cpp index 8765f63ed4..5687d7bfb5 100644 --- a/src/lib/tunes/tunes.cpp +++ b/src/lib/tunes/tunes.cpp @@ -49,26 +49,6 @@ #define BEAT_TIME_CONVERSION_US BEAT_TIME_CONVERSION_MS * 1000 #define BEAT_TIME_CONVERSION BEAT_TIME_CONVERSION_US -// initialise default tunes -const char *Tunes::_default_tunes[] = { - "", // empty to align with the index - "MFT240L8 O4aO5dc O4aO5dc O4aO5dc L16dcdcdcdc", // startup tune - "MBT200a8a8a8PaaaP", // ERROR tone - "MFT200e8a8a", // Notify Positive tone - "MFT200e8e", // Notify Neutral tone - "MFT200e8c8e8c8e8c8", // Notify Negative tone - "MNT75L1O2G", //arming warning - "MBNT100a8", //battery warning slow - "MBNT255a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8", //battery warning fast - "MFT255L4AAAL1F#", //gps warning slow - "MFT255L4<<G#6A#6B#4", // home set tune -}; - // semitone offsets from C for the characters 'A'-'G' const uint8_t Tunes::_note_tab[] = {9, 11, 0, 2, 4, 5, 7}; @@ -102,40 +82,46 @@ void Tunes::set_control(const tune_control_s &tune_control) { bool reset_playing_tune = false; - switch (tune_control.tune_id) { - case tune_control_s::TUNE_ID_STARTUP: - case tune_control_s::TUNE_ID_ERROR: - case tune_control_s::TUNE_ID_NOTIFY_POSITIVE: - case tune_control_s::TUNE_ID_NOTIFY_NEUTRAL: - case tune_control_s::TUNE_ID_NOTIFY_NEGATIVE: - reset_playing_tune = true; - config_tone(); + if (tune_control.tune_id < _default_tunes_size) { + switch (tune_control.tune_id) { + case tune_control_s::TUNE_ID_CUSTOM: + _frequency = (unsigned)tune_control.frequency; + _duration = (unsigned)tune_control.duration; + _using_custom_msg = true; + break; - case tune_control_s::TUNE_ID_ARMING_WARNING: - case tune_control_s::TUNE_ID_BATTERY_WARNING_SLOW: - case tune_control_s::TUNE_ID_BATTERY_WARNING_FAST: - case tune_control_s::TUNE_ID_GPS_WARNING: - case tune_control_s::TUNE_ID_PARACHUTE_RELEASE: - case tune_control_s::TUNE_ID_EKF_WARNING: - case tune_control_s::TUNE_ID_BARO_WARNING: - case tune_control_s::TUNE_ID_SINGLE_BEEP: - case tune_control_s::TUNE_ID_HOME_SET: + case tune_control_s::TUNE_ID_STARTUP: + case tune_control_s::TUNE_ID_ERROR: + case tune_control_s::TUNE_ID_NOTIFY_POSITIVE: + case tune_control_s::TUNE_ID_NOTIFY_NEUTRAL: + case tune_control_s::TUNE_ID_NOTIFY_NEGATIVE: + reset_playing_tune = true; + config_tone(); - // TODO: come up with a better strategy - if (_tune == nullptr || reset_playing_tune || tune_control.tune_override) { - _tune = _default_tunes[tune_control.tune_id]; - _next = _tune; + case tune_control_s::TUNE_ID_ARMING_WARNING: + case tune_control_s::TUNE_ID_BATTERY_WARNING_SLOW: + case tune_control_s::TUNE_ID_BATTERY_WARNING_FAST: + case tune_control_s::TUNE_ID_GPS_WARNING: + case tune_control_s::TUNE_ID_PARACHUTE_RELEASE: + case tune_control_s::TUNE_ID_EKF_WARNING: + case tune_control_s::TUNE_ID_BARO_WARNING: + case tune_control_s::TUNE_ID_SINGLE_BEEP: + case tune_control_s::TUNE_ID_HOME_SET: + default: + + // TODO: come up with a better strategy + if (_tune == nullptr || reset_playing_tune || tune_control.tune_override) { + _tune = _default_tunes[tune_control.tune_id]; + _next = _tune; + } + + break; } - break; - - case tune_control_s::TUNE_ID_CUSTOM: - default: - _frequency = (unsigned)tune_control.frequency; - _duration = (unsigned)tune_control.duration; - _using_custom_msg = true; - break; + } else { + PX4_WARN("Tune ID not recognized."); } + } void Tunes::set_string(const char *string) diff --git a/src/lib/tunes/tunes.h b/src/lib/tunes/tunes.h index 50f031c2f6..d7ba83a9f6 100644 --- a/src/lib/tunes/tunes.h +++ b/src/lib/tunes/tunes.h @@ -87,9 +87,12 @@ public: */ int get_next_tune(unsigned &frequency, unsigned &duration, unsigned &silence); + unsigned int get_default_tunes_size() {return _default_tunes_size;} + private: - static const char *_default_tunes[TONE_NUMBER_OF_TUNES]; + static const char *_default_tunes[]; static const uint8_t _note_tab[]; + static const unsigned int _default_tunes_size; bool _repeat; ///< if true, tune restarts at end const char *_tune = nullptr; ///< current tune string diff --git a/src/systemcmds/tune_control/tune_control.cpp b/src/systemcmds/tune_control/tune_control.cpp index 59a26ee073..1e339cebe4 100644 --- a/src/systemcmds/tune_control/tune_control.cpp +++ b/src/systemcmds/tune_control/tune_control.cpp @@ -121,7 +121,7 @@ tune_control_main(int argc, char *argv[]) case 't': value = (uint8_t)(strtol(myoptarg, NULL, 0)); - if (value >= 1 && value <= 15) { + if (value > 0 && value < tunes.get_default_tunes_size()) { tune_control.tune_id = value; } else {