Skip to content

Commit

Permalink
Add vector open telemetry support
Browse files Browse the repository at this point in the history
Not tested with a real telemetry source yet.

This does not require any setting to change the telemetry protocol
in use, because the ground station uses different ports already, we
just listen on each of them in the different telemetry classes and
everything will just work.

Ref: #17
  • Loading branch information
steveatinfincia committed Apr 2, 2020
1 parent 1896943 commit b9fa55b
Show file tree
Hide file tree
Showing 7 changed files with 464 additions and 1 deletion.
4 changes: 3 additions & 1 deletion QOpenHD.pro
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ SOURCES += \
src/openhdtelemetry.cpp \
src/powermicroservice.cpp \
src/qopenhdlink.cpp \
src/util.cpp
src/util.cpp \
src/vectortelemetry.cpp

RESOURCES += qml/qml.qrc

Expand All @@ -93,6 +94,7 @@ HEADERS += \
inc/openhdtelemetry.h \
inc/qopenhdlink.h \
inc/util.h \
inc/vectortelemetry.h \
inc/wifibroadcast.h \
lib/h264bitstream/bs.h \
lib/h264bitstream/h264_avcc.h \
Expand Down
2 changes: 2 additions & 0 deletions inc/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ QString copter_mode_from_enum(COPTER_MODE mode);
QString plane_mode_from_enum(PLANE_MODE mode);
QString tracker_mode_from_enum(TRACKER_MODE mode);

QString vot_mode_from_telemetry(uint8_t mode);

uint map(double input, double input_start, double input_end, uint16_t output_start, uint16_t output_end);

#if defined(__android__)
Expand Down
76 changes: 76 additions & 0 deletions inc/vectortelemetry.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#ifndef VECTORTELEMETRY_H
#define VECTORTELEMETRY_H

#include <QObject>
#include <QtQuick>

#include "constants.h"


enum _serial_state {
IDLE,
HEADER_START1,
HEADER_START2,
HEADER_START3,
HEADER_START4,
HEADER_MSGTYPE
};

class QUdpSocket;

class VectorTelemetry: public QObject {
Q_OBJECT

public:
explicit VectorTelemetry(QObject *parent = nullptr);


Q_PROPERTY(QString last_heartbeat MEMBER m_last_heartbeat WRITE set_last_heartbeat NOTIFY last_heartbeat_changed)
void set_last_heartbeat(QString last_heartbeat);

signals:
void last_heartbeat_changed(QString last_heartbeat);


private slots:
#if defined(__rasp_pi__)
void processVectorFifo();
void restartFifo();
#else
void processVectorDatagrams();
#endif

private:
void init();

uint8_t votread_u8();
uint16_t votread_u16();
uint16_t votbread_u16();
uint32_t votread_u32();
uint32_t votbread_u32();
uint16_t CRC16Worker(uint16_t icrc, uint8_t r0);
uint16_t CalculateCRC(uint8_t * pPacket, uint8_t Size, uint16_t InitCRC);
void vot_read(uint8_t *buf, uint8_t buflen);


void processVectorMessage();

#if defined(__rasp_pi__)
QFuture<void> fifoFuture;
QFutureWatcher<void> watcher;
#else
QUdpSocket *vectorSocket = nullptr;
#endif

QString m_last_heartbeat = "N/A";
qint64 last_heartbeat_timestamp;


enum _serial_state c_state = IDLE;

uint8_t VOTReceiverIndex;
uint8_t VOTReadIndex;
uint16_t VOTRcvChecksum;
};

#endif //VECTORTELEMETRY_H
4 changes: 4 additions & 0 deletions qml/main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ ApplicationWindow {
// id: ltmTelemetry
//}

VectorTelemetry {
id: vectorTelemetry
}

Loader {
anchors.fill: parent
z: 1.1
Expand Down
3 changes: 3 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const QVector<QString> permissions({"android.permission.INTERNET",
#include "frskytelemetry.h"
#include "msptelemetry.h"
#include "ltmtelemetry.h"
#include "vectortelemetry.h"

#include "qopenhdlink.h"

Expand Down Expand Up @@ -135,6 +136,8 @@ int main(int argc, char *argv[]) {
qmlRegisterType<FrSkyTelemetry>("OpenHD", 1, 0, "FrSkyTelemetry");
qmlRegisterType<MSPTelemetry>("OpenHD", 1, 0, "MSPTelemetry");
qmlRegisterType<LTMTelemetry>("OpenHD", 1, 0, "LTMTelemetry");
qmlRegisterType<VectorTelemetry>("OpenHD", 1, 0, "VectorTelemetry");

qmlRegisterType<OpenHDRC>("OpenHD", 1, 0, "OpenHDRC");

qmlRegisterSingletonType<OpenHDPi>("OpenHD", 1, 0, "OpenHDPi", openHDPiSingletonProvider);
Expand Down
41 changes: 41 additions & 0 deletions src/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,47 @@ QString tracker_mode_from_enum(TRACKER_MODE mode) {
return "Unknown";
}

QString vot_mode_from_telemetry(uint8_t mode) {
switch (mode) {
case 0:
return "2D";
case 1:
return "2DAH";
case 2:
return "2DHH";
case 3:
return "2DAHH";
case 4:
return "LOITER";
case 5:
return "3D";
case 6:
return "3DHH";
case 7:
return "RTH";
case 8:
return "LAND";
case 9:
return "CART";
case 10:
return "CARTLOI";
case 11:
return "POLAR";
case 12:
return "POLARLOI";
case 13:
return "CENTERSTICK";
case 14:
return "OFF";
case 15:
return "WAYPOINT";
case 16:
return "MAX";
}
return "Unknown";
}


uint map(double input, double input_start, double input_end, uint16_t output_start, uint16_t output_end) {
double input_range = input_end - input_start;
int output_range = output_end - output_start;
Expand Down
Loading

0 comments on commit b9fa55b

Please sign in to comment.