diff --git a/artwork/Logo/CopterControl Logo.svg b/artwork/Logo/CopterControl Logo.svg
new file mode 100644
index 000000000..359f05e70
--- /dev/null
+++ b/artwork/Logo/CopterControl Logo.svg
@@ -0,0 +1,270 @@
+
+
+
+
\ No newline at end of file
diff --git a/flight/Modules/Attitude/attitude.c b/flight/Modules/Attitude/attitude.c
index ab9d24df6..d6b52d2fa 100644
--- a/flight/Modules/Attitude/attitude.c
+++ b/flight/Modules/Attitude/attitude.c
@@ -307,7 +307,6 @@ static void settingsUpdatedCb(UAVObjEvent * objEv) {
AttitudeSettingsData attitudeSettings;
AttitudeSettingsGet(&attitudeSettings);
- float rotationQuat[4];
accelKp = attitudeSettings.AccelKp;
accelKi = attitudeSettings.AccelKi;
@@ -319,37 +318,22 @@ static void settingsUpdatedCb(UAVObjEvent * objEv) {
accelbias[2] = attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_Z];
// Indicates not to expend cycles on rotation
- if(attitudeSettings.RotationQuaternion[0] == 126) {
- rotate = 0;
- rotationQuat[0] = 1;
- rotationQuat[1] = rotationQuat[2] = rotationQuat[3] = 0;
- return;
- }
-
- rotate = 1;
-
- rotationQuat[0] = (float) attitudeSettings.RotationQuaternion[0] / 127.0;
- rotationQuat[1] = (float) attitudeSettings.RotationQuaternion[1] / 127.0f;
- rotationQuat[2] = (float) attitudeSettings.RotationQuaternion[2] / 127.0f;
- rotationQuat[3] = (float) attitudeSettings.RotationQuaternion[3] / 127.0f;
-
- float len = sqrt(rotationQuat[0] * rotationQuat[0] + rotationQuat[1] * rotationQuat[1] +
- rotationQuat[2] * rotationQuat[2] + rotationQuat[3] * rotationQuat[3]);
-
- // Sanitize input. Shouldn't do anything functional.
- if(len < 1e-3) {
- // Really wrong value
- rotationQuat[0] = 1;
- rotationQuat[1] = rotationQuat[2] = rotationQuat[3] = 0;
+ if(attitudeSettings.BoardRotation[0] == 0 && attitudeSettings.BoardRotation[1] == 0 &&
+ attitudeSettings.BoardRotation[2] == 0) {
rotate = 0;
+
+ // Shouldn't be used but to be safe
+ float rotationQuat[4] = {1,0,0,0};
+ Quaternion2R(rotationQuat, R);
} else {
- rotationQuat[0] /= len;
- rotationQuat[1] /= len;
- rotationQuat[2] /= len;
- rotationQuat[3] /= len;
- }
-
- Quaternion2R(rotationQuat, R);
+ float rotationQuat[4];
+ const float rpy[3] = {attitudeSettings.BoardRotation[ATTITUDESETTINGS_BOARDROTATION_ROLL],
+ attitudeSettings.BoardRotation[ATTITUDESETTINGS_BOARDROTATION_PITCH],
+ attitudeSettings.BoardRotation[ATTITUDESETTINGS_BOARDROTATION_YAW]};
+ RPY2Quaternion(rpy, rotationQuat);
+ Quaternion2R(rotationQuat, R);
+ rotate = 1;
+ }
}
/**
* @}
diff --git a/flight/Modules/Osd/OsdEtStd/OsdEtStd.c b/flight/Modules/Osd/OsdEtStd/OsdEtStd.c
index 16820c461..69c4c222d 100644
--- a/flight/Modules/Osd/OsdEtStd/OsdEtStd.c
+++ b/flight/Modules/Osd/OsdEtStd/OsdEtStd.c
@@ -34,6 +34,7 @@
#include "flightbatterystate.h"
#include "gpsposition.h"
#include "attitudeactual.h"
+#include "baroaltitude.h"
//
// Configuration
@@ -62,6 +63,8 @@
#define OSD_ADDRESS 0x30
#define OSDMSG_V_LS_IDX 10
+#define OSDMSG_BALT_IDX1 11
+#define OSDMSG_BALT_IDX2 12
#define OSDMSG_A_LS_IDX 17
#define OSDMSG_VA_MS_IDX 18
#define OSDMSG_LAT_IDX 33
@@ -99,14 +102,15 @@ static const char *DumpConfFilePath = "/etosd/dump.ocf";
// Private variables
//
-// | Header / cmd?| | V | | V | | LAT: 37 57.0000 | LONG: 24 00.4590 | | Hom<-179| Alt 545.4 m | |#sat|stat|
+// | Header / cmd?| | V | E3 | V | | LAT: 37 57.0000 | LONG: 24 00.4590 | | Hom<-179| Alt 545.4 m | |#sat|stat|
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
uint8_t msg[63] =
- { 0x03, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ { 0x03, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0A, 0x00, 0xE4, 0x30, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x60, 0x10, 0x02, 0x00, 0x00, 0x90, 0x00,
0x54, 0x54, 0x00, 0x00, 0x33, 0x28, 0x13, 0x00, 0x00, 0x08, 0x00, 0x00, 0x90, 0x0A };
static volatile bool newPosData = FALSE;
static volatile bool newBattData = FALSE;
+static volatile bool newBaroData = FALSE;
static enum
{
@@ -167,6 +171,16 @@ static void SetCourse(uint16_t dir)
WriteToMsg16(OSDMSG_HOME_IDX, dir);
}
+static void SetBaroAltitude(int16_t altitudeMeter)
+{
+ // calculated formula
+ // ET OSD uses first update as zeropoint and then +- from that
+ altitudeMeter=(4571-altitudeMeter)/0.37;
+ msg[OSDMSG_BALT_IDX1] = (uint8_t)(altitudeMeter&0x00FF);
+ msg[OSDMSG_BALT_IDX2] = (altitudeMeter >> 8)&0x3F;
+}
+
+
static void SetAltitude(uint32_t altitudeMeter)
{
WriteToMsg32(OSDMSG_ALT_IDX, altitudeMeter * 10);
@@ -202,6 +216,11 @@ static void GPSPositionUpdatedCb(UAVObjEvent * ev)
newPosData = TRUE;
}
+static void BaroAltitudeUpdatedCb(UAVObjEvent * ev)
+{
+ newBaroData = TRUE;
+}
+
static bool Read(uint32_t start, uint8_t length, uint8_t * buffer)
{
uint8_t cmd[5];
@@ -451,6 +470,14 @@ static void Run(void)
} else {
msg[OSDMSG_GPS_STAT] &= ~OSDMSG_GPS_STAT_HB_FLAG;
}
+ if (newBaroData) {
+ BaroAltitudeData baroData;
+
+ BaroAltitudeGet(&baroData);
+ SetBaroAltitude(baroData.Altitude);
+
+ newBaroData = FALSE;
+ }
DEBUG_MSG("SendMsg %d\n",cnt);
{
@@ -470,7 +497,6 @@ static void Run(void)
}
cnt++;
-
}
static void onTimer(UAVObjEvent * ev)
@@ -522,6 +548,7 @@ int32_t OsdEtStdInitialize(void)
{
GPSPositionConnectCallback(GPSPositionUpdatedCb);
FlightBatteryStateConnectCallback(FlightBatteryStateUpdatedCb);
+ BaroAltitudeConnectCallback(BaroAltitudeUpdatedCb);
memset(&ev,0,sizeof(UAVObjEvent));
EventPeriodicCallbackCreate(&ev, onTimer, 100 / portTICK_RATE_MS);
diff --git a/ground/openpilotgcs/src/plugins/config/ccattitude.ui b/ground/openpilotgcs/src/plugins/config/ccattitude.ui
index 42bd28b5e..59afdeaf8 100644
--- a/ground/openpilotgcs/src/plugins/config/ccattitude.ui
+++ b/ground/openpilotgcs/src/plugins/config/ccattitude.ui
@@ -239,8 +239,6 @@
- verticalLayoutWidget
- groupBox_2
-
@@ -258,6 +256,20 @@
+ -
+
+
+ Get Current
+
+
+
+ -
+
+
+ Apply
+
+
+
-
diff --git a/ground/openpilotgcs/src/plugins/config/configccattitudewidget.cpp b/ground/openpilotgcs/src/plugins/config/configccattitudewidget.cpp
index a63266998..384e42090 100644
--- a/ground/openpilotgcs/src/plugins/config/configccattitudewidget.cpp
+++ b/ground/openpilotgcs/src/plugins/config/configccattitudewidget.cpp
@@ -37,10 +37,13 @@ ConfigCCAttitudeWidget::ConfigCCAttitudeWidget(QWidget *parent) :
{
ui->setupUi(this);
connect(ui->zeroBias,SIGNAL(clicked()),this,SLOT(startAccelCalibration()));
- connect(ui->saveButton,SIGNAL(clicked()),this,SLOT(saveAttitudeSettings()));
- connect(ui->rollBias,SIGNAL(valueChanged(int)),this,SLOT(attitudeBiasChanged(int)));
- connect(ui->pitchBias,SIGNAL(valueChanged(int)),this,SLOT(attitudeBiasChanged(int)));
- connect(ui->yawBias,SIGNAL(valueChanged(int)),this,SLOT(attitudeBiasChanged(int)));
+ connect(ui->saveButton,SIGNAL(clicked()),this,SLOT(saveAttitudeSettings()));
+ connect(ui->applyButton,SIGNAL(clicked()),this,SLOT(applyAttitudeSettings()));
+ connect(ui->getCurrentButton,SIGNAL(clicked()),this,SLOT(getCurrentAttitudeSettings()));
+
+ // Make it smart:
+ connect(parent, SIGNAL(autopilotConnected()),this, SLOT(getCurrentAttitudeSettings()));
+ getCurrentAttitudeSettings(); // The 1st time this panel is instanciated, the autopilot is already connected.
}
ConfigCCAttitudeWidget::~ConfigCCAttitudeWidget()
@@ -97,25 +100,26 @@ void ConfigCCAttitudeWidget::timeout() {
}
-void ConfigCCAttitudeWidget::attitudeBiasChanged(int val) {
+void ConfigCCAttitudeWidget::applyAttitudeSettings() {
UAVDataObject * settings = dynamic_cast(getObjectManager()->getObject(QString("AttitudeSettings")));
- UAVObjectField * field = settings->getField("RotationQuaternion");
+ UAVObjectField * field = settings->getField("BoardRotation");
- float RPY[3], q[4];
- RPY[0] = ui->rollBias->value();
- RPY[1] = ui->pitchBias->value();
- RPY[2] = ui->yawBias->value();
-
- Utils::CoordinateConversions().RPY2Quaternion(RPY,q);
-
- field->setDouble(q[0]*127,0);
- field->setDouble(q[1]*127,1);
- field->setDouble(q[2]*127,2);
- field->setDouble(q[3]*127,3);
+ field->setValue(ui->rollBias->value(),0);
+ field->setValue(ui->pitchBias->value(),1);
+ field->setValue(ui->yawBias->value(),2);
settings->updated();
}
+void ConfigCCAttitudeWidget::getCurrentAttitudeSettings() {
+ UAVDataObject * settings = dynamic_cast(getObjectManager()->getObject(QString("AttitudeSettings")));
+ settings->requestUpdate();
+ UAVObjectField * field = settings->getField("BoardRotation");
+ ui->rollBias->setValue(field->getDouble(0));
+ ui->pitchBias->setValue(field->getDouble(1));
+ ui->yawBias->setValue(field->getDouble(2));
+}
+
void ConfigCCAttitudeWidget::startAccelCalibration() {
QMutexLocker locker(&startStop);
@@ -144,6 +148,8 @@ void ConfigCCAttitudeWidget::startAccelCalibration() {
}
void ConfigCCAttitudeWidget::saveAttitudeSettings() {
+ applyAttitudeSettings();
+
UAVDataObject * obj = dynamic_cast(getObjectManager()->getObject(QString("AttitudeSettings")));
saveObjectToSD(obj);
}
diff --git a/ground/openpilotgcs/src/plugins/config/configccattitudewidget.h b/ground/openpilotgcs/src/plugins/config/configccattitudewidget.h
index 14d34dbde..888fd9754 100644
--- a/ground/openpilotgcs/src/plugins/config/configccattitudewidget.h
+++ b/ground/openpilotgcs/src/plugins/config/configccattitudewidget.h
@@ -47,11 +47,12 @@ public:
~ConfigCCAttitudeWidget();
private slots:
- void attitudeRawUpdated(UAVObject *);
+ void attitudeRawUpdated(UAVObject * obj);
void timeout();
void startAccelCalibration();
- void attitudeBiasChanged(int val);
void saveAttitudeSettings();
+ void applyAttitudeSettings();
+ void getCurrentAttitudeSettings();
private:
QMutex startStop;
diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h
index da6b8ea73..0d0eb50d8 100644
--- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h
+++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h
@@ -35,10 +35,10 @@
#include "notifypluginconfiguration.h"
#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
class NotifyPluginOptionsPage;
diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h
index d6a83d4b6..9d159e2a4 100644
--- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h
+++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h
@@ -38,10 +38,10 @@
#include
#include
#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
class NotifyTableModel;
diff --git a/ground/openpilotgcs/src/plugins/welcome/communitywelcomepagewidget.cpp b/ground/openpilotgcs/src/plugins/welcome/communitywelcomepagewidget.cpp
index 32da11b53..f8819e83f 100644
--- a/ground/openpilotgcs/src/plugins/welcome/communitywelcomepagewidget.cpp
+++ b/ground/openpilotgcs/src/plugins/welcome/communitywelcomepagewidget.cpp
@@ -52,14 +52,15 @@ CommunityWelcomePageWidget::CommunityWelcomePageWidget(QWidget *parent) :
connect(m_rssFetcher, SIGNAL(newsItemReady(QString, QString, QString)),
ui->newsTreeWidget, SLOT(slotAddNewsItem(QString, QString, QString)));
//: Add localized feed here only if one exists
- m_rssFetcher->fetch(QUrl(tr("http://newwww.openpilot.org/rss.xml")));
+ m_rssFetcher->fetch(QUrl(tr("http://www.openpilot.org/feed/")));
QList > sites;
sites << qMakePair(tr("OpenPilot Home"), QString(QLatin1String("http://www.openpilot.org")));
sites << qMakePair(tr("OpenPilot Wiki"), QString(QLatin1String("http://wiki.openpilot.org")));
- sites << qMakePair(tr("OpenPilot Store"), QString(QLatin1String("http://www.openpilot.org/store")));
+ sites << qMakePair(tr("OpenPilot Store"), QString(QLatin1String("http://www.openpilot.org/hardware/get-hardware/")));
sites << qMakePair(tr("OpenPilot Forums"), QString(QLatin1String("http://forums.openpilot.org")));
- sites << qMakePair(tr("OpenPilot Progress Tracker"), QString(QLatin1String("http://progress.openpilot.org")));
+ sites << qMakePair(tr("OpenPilot Code Reviews"), QString(QLatin1String("http://git.openpilot.org")));
+ sites << qMakePair(tr("OpenPilot Progress Tracker"), QString(QLatin1String("http://progress.openpilot.org")));
QListIterator > it(sites);
while (it.hasNext()) {
diff --git a/shared/uavobjectdefinition/attitudesettings.xml b/shared/uavobjectdefinition/attitudesettings.xml
index 48dd637e6..db067b7e6 100644
--- a/shared/uavobjectdefinition/attitudesettings.xml
+++ b/shared/uavobjectdefinition/attitudesettings.xml
@@ -2,7 +2,7 @@