/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* MSP version 1 and 2 protocol library, based on betaflight/iNav implementations code by Alex Apostoli */ #pragma once #include #include "AP_MSP_Telem_Backend.h" #if HAL_MSP_ENABLED #define MSP_MAX_INSTANCES 3 #define MSP_OSD_START 2048 #define MSP_OSD_STEP_X 1 #define MSP_OSD_STEP_Y 32 #define MSP_OSD_POS(osd_setting) (MSP_OSD_START + osd_setting->xpos*MSP_OSD_STEP_X + osd_setting->ypos*MSP_OSD_STEP_Y) class AP_MSP { friend class AP_MSP_Telem_Generic; friend class AP_MSP_Telem_DJI; friend class AP_MSP_Telem_Backend; public: AP_MSP(); /* Do not allow copies */ AP_MSP(const AP_MSP &other) = delete; AP_MSP &operator=(const AP_MSP&) = delete; // User settable parameters static const struct AP_Param::GroupInfo var_info[]; // init - perform required initialisation void init(); static AP_MSP *get_singleton(void) { return _singleton; } private: enum msp_option_e : uint8_t { OPTION_TELEMETRY_MODE = 1U<<0, OPTION_TELEMETRY_DJI_WORKAROUNDS = 1U<<1 }; AP_MSP_Telem_Backend *_backends[MSP_MAX_INSTANCES]; AP_Int8 _options; AP_Int8 _cellcount; // these are the osd items we support for MSP OSD AP_OSD_Setting* _osd_item_settings[MSP::OSD_ITEM_COUNT]; MSP::osd_config_t _osd_config; struct { bool flashing_on; // OSD item flashing support uint8_t last_flight_mode = 255; uint32_t last_flight_mode_change_ms; bool flight_mode_focus; // do we need to steal focus from text messages bool osd_initialized; // for one time osd initialization uint8_t backend_count; // actual count of active bacends } _msp_status; bool init_backend(uint8_t backend_idx, AP_HAL::UARTDriver *uart, AP_SerialManager::SerialProtocol protocol); void init_osd(); void loop(void); bool check_option(const msp_option_e option); static AP_MSP *_singleton; }; namespace AP { AP_MSP *msp(); }; #endif //HAL_MSP_ENABLED