diff --git a/Makefile b/Makefile index 8a55572e8..f55524cc4 100644 --- a/Makefile +++ b/Makefile @@ -518,6 +518,7 @@ uavobjects_clean: # $(1) = Canonical board name all in lower case (e.g. coptercontrol) # $(2) = Name of board used in source tree (e.g. CopterControl) +# $(3) = Short name for board (e.g CC) define FW_TEMPLATE .PHONY: $(1) fw_$(1) $(1): fw_$(1)_opfw @@ -528,6 +529,8 @@ fw_$(1)_%: uavobjects_flight $(V1) cd $(ROOT_DIR)/flight/$(2) && \ $$(MAKE) -r --no-print-directory \ BOARD_NAME=$(1) \ + BOARD_SHORT_NAME=$(3) \ + BUILD_TYPE=fw \ TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \ REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \ $$* @@ -551,6 +554,8 @@ bl_$(1)_%: $(V1) cd $(ROOT_DIR)/flight/Bootloaders/$(2) && \ $$(MAKE) -r --no-print-directory \ BOARD_NAME=$(1) \ + BOARD_SHORT_NAME=$(3) \ + BUILD_TYPE=bl \ TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \ REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \ $$* @@ -585,6 +590,8 @@ bu_$(1)_%: bl_$(1)_bino $(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \ $$(MAKE) -r --no-print-directory \ BOARD_NAME=$(1) \ + BOARD_SHORT_NAME=$(3) \ + BUILD_TYPE=bu \ TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \ REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \ $$* @@ -600,11 +607,13 @@ define EF_TEMPLATE .PHONY: ef_$(1) ef_$(1): ef_$(1)_bin -ef_$(1)_%: bl_$(1)_bin fw_$(1)_bin +ef_$(1)_%: bl_$(1)_bin fw_$(1)_opfw $(V1) mkdir -p $(BUILD_DIR)/ef_$(1)/dep $(V1) cd $(ROOT_DIR)/flight/EntireFlash && \ $$(MAKE) -r --no-print-directory \ BOARD_NAME=$(1) \ + BOARD_SHORT_NAME=$(3) \ + BUILD_TYPE=ef \ TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \ DFU_CMD="$(DFUUTIL_DIR)/bin/dfu-util" \ $$* @@ -615,6 +624,19 @@ ef_$(1)_clean: $(V1) $(RM) -fr $(BUILD_DIR)/ef_$(1) endef +# When building any of the "all_*" targets, tell all sub makefiles to display +# additional details on each line of output to describe which build and target +# that each line applies to. +ifneq ($(strip $(filter all_%,$(MAKECMDGOALS))),) +export ENABLE_MSG_EXTRA := yes +endif + +# When building more than one goal in a single make invocation, also +# enable the extra context for each output line +ifneq ($(word 2,$(MAKECMDGOALS)),) +export ENABLE_MSG_EXTRA := yes +endif + # $(1) = Canonical board name all in lower case (e.g. coptercontrol) define BOARD_PHONY_TEMPLATE .PHONY: all_$(1) @@ -632,6 +654,12 @@ endef ALL_BOARDS := coptercontrol pipxtreme simposix +# SimPosix only builds on Linux so drop it from the list for +# all other platforms. +ifneq ($(UNAME), Linux) +ALL_BOARDS := $(filter-out simposix, $(ALL_BOARDS)) +endif + # Friendly names of each board (used to find source tree) coptercontrol_friendly := CopterControl pipxtreme_friendly := PipXtreme @@ -644,6 +672,13 @@ ifneq ($(UNAME), Linux) ALL_BOARDS := $(filter-out simposix, $(ALL_BOARDS)) endif +# Short hames of each board (used to display board name in parallel builds) +coptercontrol_short := 'cc ' +pipxtreme_short := 'pipx' +revolution_short := 'revo' +simposix_short := 'posx' +osd_short := 'osd ' + # Start out assuming that we'll build fw, bl and bu for all boards FW_BOARDS := $(ALL_BOARDS) BL_BOARDS := $(ALL_BOARDS) @@ -655,6 +690,12 @@ EF_BOARDS := $(ALL_BOARDS) BL_BOARDS := $(filter-out ins, $(BL_BOARDS)) BU_BOARDS := $(filter-out ins, $(BU_BOARDS)) +# SimPosix doesn't have a BL, BU or EF target so we need to +# filter them out to prevent errors on the all_flight target. +BL_BOARDS := $(filter-out simposix, $(BL_BOARDS)) +BU_BOARDS := $(filter-out simposix, $(BU_BOARDS)) +EF_BOARDS := $(filter-out simposix, $(EF_BOARDS)) + # Generate the targets for whatever boards are left in each list FW_TARGETS := $(addprefix fw_, $(FW_BOARDS)) BL_TARGETS := $(addprefix bl_, $(BL_BOARDS)) @@ -674,7 +715,7 @@ all_bu: $(addsuffix _opfw, $(BU_TARGETS)) all_bu_clean: $(addsuffix _clean, $(BU_TARGETS)) .PHONY: all_ef all_ef_clean -all_ef: $(EF_TARGETS)) +all_ef: $(EF_TARGETS) all_ef_clean: $(addsuffix _clean, $(EF_TARGETS)) .PHONY: all_flight all_flight_clean @@ -685,16 +726,16 @@ all_flight_clean: all_fw_clean all_bl_clean all_bu_clean all_ef_clean $(foreach board, $(ALL_BOARDS), $(eval $(call BOARD_PHONY_TEMPLATE,$(board)))) # Expand the bootloader updater rules -$(foreach board, $(ALL_BOARDS), $(eval $(call BU_TEMPLATE,$(board),$($(board)_friendly)))) +$(foreach board, $(ALL_BOARDS), $(eval $(call BU_TEMPLATE,$(board),$($(board)_friendly),$($(board)_short)))) # Expand the firmware rules -$(foreach board, $(ALL_BOARDS), $(eval $(call FW_TEMPLATE,$(board),$($(board)_friendly)))) +$(foreach board, $(ALL_BOARDS), $(eval $(call FW_TEMPLATE,$(board),$($(board)_friendly),$($(board)_short)))) # Expand the bootloader rules -$(foreach board, $(ALL_BOARDS), $(eval $(call BL_TEMPLATE,$(board),$($(board)_friendly)))) +$(foreach board, $(ALL_BOARDS), $(eval $(call BL_TEMPLATE,$(board),$($(board)_friendly),$($(board)_short)))) # Expand the entire-flash rules -$(foreach board, $(ALL_BOARDS), $(eval $(call EF_TEMPLATE,$(board),$($(board)_friendly)))) +$(foreach board, $(ALL_BOARDS), $(eval $(call EF_TEMPLATE,$(board),$($(board)_friendly),$($(board)_short)))) .PHONY: sim_win32 sim_win32: sim_win32_exe diff --git a/artwork/Misc/multirotor-shapes.svg b/artwork/Misc/multirotor-shapes.svg index 0d7a79c42..c11e74cf6 100644 --- a/artwork/Misc/multirotor-shapes.svg +++ b/artwork/Misc/multirotor-shapes.svg @@ -12,7 +12,7 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg4183" version="1.1" - inkscape:version="0.48.1 r9760" + inkscape:version="0.48.2 r9819" width="4065.2493" height="1760.019" xml:space="preserve" @@ -3559,25 +3559,27 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1366" - inkscape:window-height="691" + inkscape:window-width="1920" + inkscape:window-height="1088" id="namedview4185" showgrid="false" - inkscape:zoom="0.5" - inkscape:cx="361.0721" - inkscape:cy="1046.2043" + inkscape:zoom="0.25" + inkscape:cx="2447.9751" + inkscape:cy="482.05665" inkscape:window-x="0" - inkscape:window-y="24" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="g4191" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" - fit-margin-bottom="0" />/dev/null | tr '\000' '\377' > $@ BL_BIN = $(TOP)/build/bl_$(BOARD_NAME)/bl_$(BOARD_NAME).bin FW_BIN = $(TOP)/build/fw_$(BOARD_NAME)/fw_$(BOARD_NAME).bin $(OUTDIR)/$(TARGET).bin: $(BL_BIN) $(FW_BIN) $(OUTDIR)/$(TARGET).pad - $(V0) @echo " FLASH IMG $@" + $(V0) @echo $(MSG_FLASH_IMG) $@ $(V1) cat $(BL_BIN) $(OUTDIR)/$(TARGET).pad $(FW_BIN) > $@ .PHONY: dfu diff --git a/flight/Modules/Actuator/actuator.c b/flight/Modules/Actuator/actuator.c index 1995355e3..775b71360 100644 --- a/flight/Modules/Actuator/actuator.c +++ b/flight/Modules/Actuator/actuator.c @@ -67,7 +67,8 @@ static xTaskHandle taskHandle; static float lastResult[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; static float lastFilteredResult[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; static float filterAccumulator[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; - +// used to inform the actuator thread that actuator update rate is changed +static uint8_t updateRateChanged = 0; // Private functions static void actuatorTask(void* parameters); @@ -76,10 +77,12 @@ static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutr static void setFailsafe(); static float MixerCurve(const float throttle, const float* curve, uint8_t elements); static bool set_channel(uint8_t mixer_channel, uint16_t value); +static void change_update_rate(); float ProcessMixer(const int index, const float curve1, const float curve2, MixerSettingsData* mixerSettings, ActuatorDesiredData* desired, const float period); +static uint16_t lastChannelUpdateFreq[ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM] = {0,0,0,0}; //this structure is equivalent to the UAVObjects for one mixer. typedef struct { uint8_t type; @@ -157,10 +160,9 @@ static void actuatorTask(void* parameters) int16_t ChannelMax[ACTUATORCOMMAND_CHANNEL_NUMELEM]; int16_t ChannelMin[ACTUATORCOMMAND_CHANNEL_NUMELEM]; int16_t ChannelNeutral[ACTUATORCOMMAND_CHANNEL_NUMELEM]; - uint16_t ChannelUpdateFreq[ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM]; - ActuatorSettingsChannelUpdateFreqGet(ChannelUpdateFreq); - PIOS_Servo_SetHz(&ChannelUpdateFreq[0], ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM); + change_update_rate(); + float * status = (float *)&mixerStatus; //access status objects as an array of floats // Go to the neutral (failsafe) values until an ActuatorDesired update is received @@ -179,6 +181,12 @@ static void actuatorTask(void* parameters) continue; } + if(updateRateChanged!=0) + { + change_update_rate(); + updateRateChanged=0; + } + // Check how long since last update thisSysTime = xTaskGetTickCount(); if(thisSysTime > lastSysTime) // reuse dt in case of wraparound @@ -547,10 +555,27 @@ static void setFailsafe() static void actuator_update_rate(UAVObjEvent * ev) { uint16_t ChannelUpdateFreq[ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM]; - if ( ev->obj == ActuatorSettingsHandle() ) { - ActuatorSettingsChannelUpdateFreqGet(ChannelUpdateFreq); - PIOS_Servo_SetHz(&ChannelUpdateFreq[0], ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM); - } + // ActuatoSettings are not changed + if ( ev->obj != ActuatorSettingsHandle() ) + return; + + ActuatorSettingsChannelUpdateFreqGet(ChannelUpdateFreq); + // check if the any rate setting is changed + if (lastChannelUpdateFreq[0]!=0 && memcmp(&lastChannelUpdateFreq[0], &ChannelUpdateFreq[0], sizeof(int16_t) * ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM) ==0) + return; + // signal to the actuator task that ChannelUpdateFreq are changed + updateRateChanged = 1; +} +/** + * @brief Change the update rates according to the ActuatorSettingsChannelUpdateFreq. + */ +static void change_update_rate() +{ + uint16_t ChannelUpdateFreq[ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM]; + // save the new rates + ActuatorSettingsChannelUpdateFreqGet(ChannelUpdateFreq); + memcpy(lastChannelUpdateFreq, ChannelUpdateFreq, sizeof(int16_t) * ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM); + PIOS_Servo_SetHz(&ChannelUpdateFreq[0], ACTUATORSETTINGS_CHANNELUPDATEFREQ_NUMELEM); } #if defined(ARCH_POSIX) || defined(ARCH_WIN32) diff --git a/flight/PiOS/Common/pios_flash_jedec.c b/flight/PiOS/Common/pios_flash_jedec.c index 997bd5403..ed4a6390b 100644 --- a/flight/PiOS/Common/pios_flash_jedec.c +++ b/flight/PiOS/Common/pios_flash_jedec.c @@ -331,10 +331,10 @@ int32_t PIOS_Flash_Jedec_EraseChip() // Keep polling when bus is busy too int i = 0; while(PIOS_Flash_Jedec_Busy() != 0) { -#if defined(PIOS_INCLUDE_FREERTOS) +#if defined(FLASH_FREERTOS) vTaskDelay(1); #endif - if ((i++) % 100 == 0) + if ((i++) % 10000 == 0) PIOS_LED_Toggle(PIOS_LED_HEARTBEAT); } diff --git a/ground/openpilotgcs/src/plugins/config/images/quad-shapes.svg b/ground/openpilotgcs/src/plugins/config/images/quad-shapes.svg index 1fccbd6ce..c11e74cf6 100644 --- a/ground/openpilotgcs/src/plugins/config/images/quad-shapes.svg +++ b/ground/openpilotgcs/src/plugins/config/images/quad-shapes.svg @@ -12,7 +12,7 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg4183" version="1.1" - inkscape:version="0.48.1 r9760" + inkscape:version="0.48.2 r9819" width="4065.2493" height="1760.019" xml:space="preserve" @@ -3559,25 +3559,27 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1366" - inkscape:window-height="691" + inkscape:window-width="1920" + inkscape:window-height="1088" id="namedview4185" showgrid="false" - inkscape:zoom="0.5" - inkscape:cx="361.0721" - inkscape:cy="1046.2043" + inkscape:zoom="0.25" + inkscape:cx="2447.9751" + inkscape:cy="482.05665" inkscape:window-x="0" - inkscape:window-y="24" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="g4191" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" - fit-margin-bottom="0" /> + inkscape:connector-curvature="0" /> \ No newline at end of file diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro index f567fc401..58475b05f 100644 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro +++ b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro @@ -1,5 +1,5 @@ TEMPLATE = lib -TARGET = HITLV2 +TARGET = HITLv2 QT += network include(../../openpilotgcsplugin.pri) include(hitlv2_dependencies.pri) diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp index f83efe968..1f7a476f0 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp @@ -128,7 +128,7 @@ QList SerialConnection::availableDevices() foreach( QextPortInfo port, ports ) { device d; d.displayName=port.friendName; - d.name=port.friendName; + d.name=port.physName; list.append(d); } } @@ -143,7 +143,7 @@ QIODevice *SerialConnection::openDevice(const QString &deviceName) } QList ports = QextSerialEnumerator::getPorts(); foreach( QextPortInfo port, ports ) { - if(port.friendName == deviceName) + if(port.physName == deviceName) { //we need to handle port settings here... PortSettings set; diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.cpp b/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.cpp index ced1bfcba..a6924e71d 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.cpp @@ -27,6 +27,77 @@ #include "treeitem.h" +/* Constructor */ +HighLightManager::HighLightManager(long checkingInterval) +{ + // Start the timer and connect it to the callback + m_expirationTimer.start(checkingInterval); + connect(&m_expirationTimer, SIGNAL(timeout()), this, SLOT(checkItemsExpired())); +} + +/* + * Called to add item to list. Item is only added if absent. + * Returns true if item was added, otherwise false. + */ +bool HighLightManager::add(TreeItem *itemToAdd) +{ + // Lock to ensure thread safety + QMutexLocker locker(&m_listMutex); + + // Check so that the item isn't already in the list + if(!m_itemsList.contains(itemToAdd)) + { + m_itemsList.append(itemToAdd); + return true; + } + return false; +} + +/* + * Called to remove item from list. + * Returns true if item was removed, otherwise false. + */ +bool HighLightManager::remove(TreeItem *itemToRemove) +{ + // Lock to ensure thread safety + QMutexLocker locker(&m_listMutex); + + // Remove item and return result + return m_itemsList.removeOne(itemToRemove); +} + +/* + * Callback called periodically by the timer. + * This method checks for expired highlights and + * removes them if they are expired. + * Expired highlights are restored. + */ +void HighLightManager::checkItemsExpired() +{ + // Lock to ensure thread safety + QMutexLocker locker(&m_listMutex); + + // Get a mutable iterator for the list + QMutableLinkedListIterator iter(m_itemsList); + + // This is the timestamp to compare with + QTime now = QTime::currentTime(); + + // Loop over all items, check if they expired. + while(iter.hasNext()) + { + TreeItem* item = iter.next(); + if(item->getHiglightExpires() < now) + { + // If expired, call removeHighlight + item->removeHighlight(); + + // Remove from list since it is restored. + iter.remove(); + } + } +} + int TreeItem::m_highlightTimeMs = 500; TreeItem::TreeItem(const QList &data, TreeItem *parent) : @@ -36,7 +107,6 @@ TreeItem::TreeItem(const QList &data, TreeItem *parent) : m_highlight(false), m_changed(false) { - connect(&m_timer, SIGNAL(timeout()), this, SLOT(removeHighlight())); } TreeItem::TreeItem(const QVariant &data, TreeItem *parent) : @@ -46,7 +116,6 @@ TreeItem::TreeItem(const QVariant &data, TreeItem *parent) : m_changed(false) { m_data << data << "" << ""; - connect(&m_timer, SIGNAL(timeout()), this, SLOT(removeHighlight())); } TreeItem::~TreeItem() @@ -108,21 +177,50 @@ void TreeItem::apply() { child->apply(); } +/* + * Called after a value has changed to trigger highlightning of tree item. + */ void TreeItem::setHighlight(bool highlight) { m_highlight = highlight; m_changed = false; if (highlight) { - if (m_timer.isActive()) { - m_timer.stop(); + // Update the expires timestamp + m_highlightExpires = QTime::currentTime().addMSecs(m_highlightTimeMs); + + // Add to highlightmanager + if(m_highlightManager->add(this)) + { + // Only emit signal if it was added + emit updateHighlight(this); } - m_timer.setSingleShot(true); - m_timer.start(m_highlightTimeMs); } - emit updateHighlight(this); + else if(m_highlightManager->remove(this)) + { + // Only emit signal if it was removed + emit updateHighlight(this); + } + + // If we have a parent, call recursively to update highlight status of parents. + // This will ensure that the root of a leaf that is changed also is highlighted. + // Only updates that really changes values will trigger highlight of parents. + if(m_parent) + { + m_parent->setHighlight(highlight); + } } void TreeItem::removeHighlight() { m_highlight = false; - update(); + //update(); emit updateHighlight(this); } + +void TreeItem::setHighlightManager(HighLightManager *mgr) +{ + m_highlightManager = mgr; +} + +QTime TreeItem::getHiglightExpires() +{ + return m_highlightExpires; +} diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.h b/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.h index 937631b05..708513d91 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.h +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/treeitem.h @@ -32,10 +32,58 @@ #include "uavmetaobject.h" #include "uavobjectfield.h" #include +#include #include +#include #include #include +#include +class TreeItem; + +/* +* Small utility class that handles the higlighting of +* tree grid items. +* Basicly it maintains all items due to be restored to +* non highlighted state in a linked list. +* A timer traverses this list periodically to find out +* if any of the items should be restored. All items are +* updated withan expiration timestamp when they expires. +* An item that is beeing restored is removed from the +* list and its removeHighlight() method is called. Items +* that are not expired are left in the list til next time. +* Items that are updated during the expiration time are +* left untouched in the list. This reduces unwanted emits +* of signals to the repaint/update function. +*/ +class HighLightManager : public QObject +{ +Q_OBJECT +public: + // Constructor taking the checking interval in ms. + HighLightManager(long checkingInterval); + + // This is called when an item has been set to + // highlighted = true. + bool add(TreeItem* itemToAdd); + + //This is called when an item is set to highlighted = false; + bool remove(TreeItem* itemToRemove); + +private slots: + // Timer callback method. + void checkItemsExpired(); + +private: + // The timer checking highlight expiration. + QTimer m_expirationTimer; + + // The list holding all items due to be updated. + QLinkedList m_itemsList; + + //Mutex to lock when accessing list. + QMutex m_listMutex; +}; class TreeItem : public QObject { @@ -77,11 +125,16 @@ public: inline bool changed() { return m_changed; } inline void setChanged(bool changed) { m_changed = changed; } + virtual void setHighlightManager(HighLightManager* mgr); + + QTime getHiglightExpires(); + + virtual void removeHighlight(); + signals: void updateHighlight(TreeItem*); private slots: - void removeHighlight(); private: QList m_children; @@ -91,7 +144,8 @@ private: TreeItem *m_parent; bool m_highlight; bool m_changed; - QTimer m_timer; + QTime m_highlightExpires; + HighLightManager* m_highlightManager; public: static const int dataColumn = 1; private: diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp index ac2e4bcee..9bd8b20b4 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp @@ -47,6 +47,8 @@ UAVObjectTreeModel::UAVObjectTreeModel(QObject *parent) : ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject(); + // Create highlight manager, let it run every 300 ms. + m_highlightManager = new HighLightManager(300); connect(objManager, SIGNAL(newObject(UAVObject*)), this, SLOT(newObject(UAVObject*))); connect(objManager, SIGNAL(newInstance(UAVObject*)), this, SLOT(newObject(UAVObject*))); @@ -56,6 +58,7 @@ UAVObjectTreeModel::UAVObjectTreeModel(QObject *parent) : UAVObjectTreeModel::~UAVObjectTreeModel() { + delete m_highlightManager; delete m_rootItem; } @@ -67,9 +70,12 @@ void UAVObjectTreeModel::setupModelData(UAVObjectManager *objManager) m_rootItem = new TreeItem(rootData); m_settingsTree = new TopTreeItem(tr("Settings"), m_rootItem); + m_settingsTree->setHighlightManager(m_highlightManager); m_rootItem->appendChild(m_settingsTree); m_nonSettingsTree = new TopTreeItem(tr("Data Objects"), m_rootItem); + m_nonSettingsTree->setHighlightManager(m_highlightManager); m_rootItem->appendChild(m_nonSettingsTree); + m_rootItem->setHighlightManager(m_highlightManager); connect(m_settingsTree, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); connect(m_nonSettingsTree, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); @@ -96,6 +102,7 @@ void UAVObjectTreeModel::addDataObject(UAVDataObject *obj) addInstance(obj, root->child(index)); } else { DataObjectTreeItem *data = new DataObjectTreeItem(obj->getName() + " (" + QString::number(obj->getNumBytes()) + " bytes)"); + data->setHighlightManager(m_highlightManager); connect(data, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); int index = root->nameIndex(obj->getName()); root->insert(index, data); @@ -110,6 +117,7 @@ void UAVObjectTreeModel::addMetaObject(UAVMetaObject *obj, TreeItem *parent) { connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(highlightUpdatedObject(UAVObject*))); MetaObjectTreeItem *meta = new MetaObjectTreeItem(obj, tr("Meta Data")); + meta->setHighlightManager(m_highlightManager); connect(meta, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); foreach (UAVObjectField *field, obj->getFields()) { if (field->getNumElements() > 1) { @@ -132,6 +140,7 @@ void UAVObjectTreeModel::addInstance(UAVObject *obj, TreeItem *parent) } else { QString name = tr("Instance") + " " + QString::number(obj->getInstID()); item = new InstanceTreeItem(obj, name); + item->setHighlightManager(m_highlightManager); connect(item, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); parent->appendChild(item); } @@ -148,6 +157,7 @@ void UAVObjectTreeModel::addInstance(UAVObject *obj, TreeItem *parent) void UAVObjectTreeModel::addArrayField(UAVObjectField *field, TreeItem *parent) { TreeItem *item = new ArrayFieldTreeItem(field->getName()); + item->setHighlightManager(m_highlightManager); connect(item, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); for (uint i = 0; i < field->getNumElements(); ++i) { addSingleField(i, field, item); @@ -192,6 +202,7 @@ void UAVObjectTreeModel::addSingleField(int index, UAVObjectField *field, TreeIt default: Q_ASSERT(false); } + item->setHighlightManager(m_highlightManager); connect(item, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); parent->appendChild(item); } @@ -352,7 +363,6 @@ void UAVObjectTreeModel::highlightUpdatedObject(UAVObject *obj) Q_ASSERT(obj); ObjectTreeItem *item = findObjectTreeItem(obj); Q_ASSERT(item); - item->setHighlight(true); item->update(); QModelIndex itemIndex = index(item); Q_ASSERT(itemIndex != QModelIndex()); diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.h b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.h index 17399611c..d9787e3a7 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.h +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.h @@ -97,6 +97,9 @@ private: int m_recentlyUpdatedTimeout; QColor m_recentlyUpdatedColor; QColor m_manuallyChangedColor; + + // Highlight manager to handle highlighting of tree items. + HighLightManager *m_highlightManager; }; #endif // UAVOBJECTTREEMODEL_H diff --git a/make/firmware-defs.mk b/make/firmware-defs.mk index 32f2f60bc..3ead53444 100644 --- a/make/firmware-defs.mk +++ b/make/firmware-defs.mk @@ -23,32 +23,41 @@ else quote = endif +# Add a board designator to the terse message text +ifeq ($(ENABLE_MSG_EXTRA),yes) + MSG_EXTRA := [$(BUILD_TYPE)|$(BOARD_SHORT_NAME)] +else + MSG_BOARD := +endif + # Define Messages # English -MSG_FORMATERROR := ${quote} Can not handle output-format${quote} -MSG_MODINIT := ${quote} MODINIT ${quote} -MSG_SIZE := ${quote} SIZE ${quote} -MSG_LOAD_FILE := ${quote} BIN/HEX ${quote} -MSG_BIN_OBJ := ${quote} BINO ${quote} -MSG_STRIP_FILE := ${quote} STRIP ${quote} -MSG_EXTENDED_LISTING := ${quote} LIS ${quote} -MSG_SYMBOL_TABLE := ${quote} NM ${quote} -MSG_LINKING := ${quote} LD ${quote} -MSG_COMPILING := ${quote} CC ${quote} -MSG_COMPILING_ARM := ${quote} CC-ARM ${quote} -MSG_COMPILINGCPP := ${quote} CXX ${quote} -MSG_COMPILINGCPP_ARM := ${quote} CXX-ARM ${quote} -MSG_ASSEMBLING := ${quote} AS ${quote} -MSG_ASSEMBLING_ARM := ${quote} AS-ARM ${quote} -MSG_CLEANING := ${quote} CLEAN ${quote} -MSG_ASMFROMC := ${quote} AS(C) ${quote} -MSG_ASMFROMC_ARM := ${quote} AS(C)-ARM ${quote} -MSG_PYMITEINIT := ${quote} PY ${quote} -MSG_INSTALLING := ${quote} INSTALL ${quote} -MSG_OPFIRMWARE := ${quote} OPFW ${quote} -MSG_FWINFO := ${quote} FWINFO ${quote} -MSG_JTAG_PROGRAM := ${quote} JTAG-PGM ${quote} -MSG_JTAG_WIPE := ${quote} JTAG-WIPE ${quote} +MSG_FORMATERROR = ${quote} Can not handle output-format${quote} +MSG_MODINIT = ${quote} MODINIT $(MSG_EXTRA) ${quote} +MSG_SIZE = ${quote} SIZE $(MSG_EXTRA) ${quote} +MSG_LOAD_FILE = ${quote} BIN/HEX $(MSG_EXTRA) ${quote} +MSG_BIN_OBJ = ${quote} BINO $(MSG_EXTRA) ${quote} +MSG_STRIP_FILE = ${quote} STRIP $(MSG_EXTRA) ${quote} +MSG_EXTENDED_LISTING = ${quote} LIS $(MSG_EXTRA) ${quote} +MSG_SYMBOL_TABLE = ${quote} NM $(MSG_EXTRA) ${quote} +MSG_LINKING = ${quote} LD $(MSG_EXTRA) ${quote} +MSG_COMPILING = ${quote} CC ${MSG_EXTRA} ${quote} +MSG_COMPILING_ARM = ${quote} CC-ARM $(MSG_EXTRA) ${quote} +MSG_COMPILINGCPP = ${quote} CXX $(MSG_EXTRA) ${quote} +MSG_COMPILINGCPP_ARM = ${quote} CXX-ARM $(MSG_EXTRA) ${quote} +MSG_ASSEMBLING = ${quote} AS $(MSG_EXTRA) ${quote} +MSG_ASSEMBLING_ARM = ${quote} AS-ARM $(MSG_EXTRA) ${quote} +MSG_CLEANING = ${quote} CLEAN $(MSG_EXTRA) ${quote} +MSG_ASMFROMC = ${quote} AS(C) $(MSG_EXTRA) ${quote} +MSG_ASMFROMC_ARM = ${quote} AS(C)-ARM $(MSG_EXTRA) ${quote} +MSG_PYMITEINIT = ${quote} PY $(MSG_EXTRA) ${quote} +MSG_INSTALLING = ${quote} INSTALL $(MSG_EXTRA) ${quote} +MSG_OPFIRMWARE = ${quote} OPFW $(MSG_EXTRA) ${quote} +MSG_FWINFO = ${quote} FWINFO $(MSG_EXTRA) ${quote} +MSG_JTAG_PROGRAM = ${quote} JTAG-PGM $(MSG_EXTRA) ${quote} +MSG_JTAG_WIPE = ${quote} JTAG-WIPE $(MSG_EXTRA) ${quote} +MSG_PADDING = ${quote} PADDING $(MSG_EXTRA) ${quote} +MSG_FLASH_IMG = ${quote} FLASH_IMG $(MSG_EXTRA) ${quote} toprel = $(subst $(realpath $(TOP))/,,$(abspath $(1))) diff --git a/package/winx86/openpilotgcs.nsi b/package/winx86/openpilotgcs.nsi index 9e3fa2ec3..c36a4bb39 100644 --- a/package/winx86/openpilotgcs.nsi +++ b/package/winx86/openpilotgcs.nsi @@ -200,6 +200,8 @@ Section "Shortcuts" InSecShortcuts CreateDirectory "$SMPROGRAMS\OpenPilot" CreateShortCut "$SMPROGRAMS\OpenPilot\OpenPilot GCS.lnk" "$INSTDIR\bin\openpilotgcs.exe" \ "" "$INSTDIR\bin\openpilotgcs.exe" 0 "" "" "${PRODUCT_NAME} ${PRODUCT_VERSION}. ${BUILD_DESCRIPTION}" + CreateShortCut "$SMPROGRAMS\OpenPilot\OpenPilot GCS (clean configuration).lnk" "$INSTDIR\bin\openpilotgcs.exe" \ + "-clean-config" "$INSTDIR\bin\openpilotgcs.exe" 0 "" "" "${PRODUCT_NAME} ${PRODUCT_VERSION}. ${BUILD_DESCRIPTION}" CreateShortCut "$SMPROGRAMS\OpenPilot\OpenPilot ChangeLog.lnk" "$INSTDIR\HISTORY.txt" \ "" "$INSTDIR\bin\openpilotgcs.exe" 0 CreateShortCut "$SMPROGRAMS\OpenPilot\OpenPilot Website.lnk" "http://www.openpilot.org" \