forked from Archive/PX4-Autopilot
add parsing of host frames for D type telemetry
This commit is contained in:
parent
3edf304e55
commit
47337eb4a5
|
@ -45,8 +45,10 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <arch/math.h>
|
#include <arch/math.h>
|
||||||
#include <geo/geo.h>
|
#include <geo/geo.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <uORB/topics/battery_status.h>
|
#include <uORB/topics/battery_status.h>
|
||||||
#include <uORB/topics/sensor_combined.h>
|
#include <uORB/topics/sensor_combined.h>
|
||||||
|
@ -285,3 +287,61 @@ void frsky_send_frame3(int uart)
|
||||||
|
|
||||||
frsky_send_startstop(uart);
|
frsky_send_startstop(uart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* parse 11 byte frames */
|
||||||
|
bool frsky_parse_host(uint8_t * sbuf, int nbytes, struct adc_linkquality * v)
|
||||||
|
{
|
||||||
|
bool data_ready = false;
|
||||||
|
static int dcount = 0;
|
||||||
|
static uint8_t type = 0;
|
||||||
|
static uint8_t data[11];
|
||||||
|
static enum {
|
||||||
|
HEADER = 0,
|
||||||
|
TYPE,
|
||||||
|
DATA,
|
||||||
|
TRAILER
|
||||||
|
} state = HEADER;
|
||||||
|
|
||||||
|
for (int i=0; i<nbytes; i++) {
|
||||||
|
switch (state) {
|
||||||
|
case HEADER:
|
||||||
|
if (sbuf[i] == 0x7E) {
|
||||||
|
state = TYPE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE:
|
||||||
|
if (sbuf[i] != 0x7E) {
|
||||||
|
state = DATA;
|
||||||
|
type = sbuf[i];
|
||||||
|
dcount = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DATA:
|
||||||
|
/* read 8 data bytes */
|
||||||
|
if (dcount < 7) {
|
||||||
|
data[dcount++] = sbuf[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* received all data bytes */
|
||||||
|
state = TRAILER;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRAILER:
|
||||||
|
state = HEADER;
|
||||||
|
if (sbuf[i] != 0x7E) {
|
||||||
|
warnx("host packet error: %x", sbuf[i]);
|
||||||
|
} else {
|
||||||
|
data_ready = true;
|
||||||
|
if (type == 0xFE) {
|
||||||
|
/* this is an adc_linkquality packet */
|
||||||
|
v->ad1 = data[0];
|
||||||
|
v->ad2 = data[1];
|
||||||
|
v->linkq = data[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data_ready;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,19 @@
|
||||||
#ifndef _FRSKY_DATA_H
|
#ifndef _FRSKY_DATA_H
|
||||||
#define _FRSKY_DATA_H
|
#define _FRSKY_DATA_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
// Public functions
|
// Public functions
|
||||||
void frsky_init(void);
|
void frsky_init(void);
|
||||||
void frsky_send_frame1(int uart);
|
void frsky_send_frame1(int uart);
|
||||||
void frsky_send_frame2(int uart);
|
void frsky_send_frame2(int uart);
|
||||||
void frsky_send_frame3(int uart);
|
void frsky_send_frame3(int uart);
|
||||||
|
|
||||||
|
struct adc_linkquality {
|
||||||
|
uint8_t ad1;
|
||||||
|
uint8_t ad2;
|
||||||
|
uint8_t linkq;
|
||||||
|
};
|
||||||
|
bool frsky_parse_host(uint8_t * sbuf, int nbytes, struct adc_linkquality * v);
|
||||||
|
|
||||||
#endif /* _FRSKY_TELEMETRY_H */
|
#endif /* _FRSKY_TELEMETRY_H */
|
||||||
|
|
|
@ -332,23 +332,35 @@ static int frsky_telemetry_thread_main(int argc, char *argv[])
|
||||||
frsky_init();
|
frsky_init();
|
||||||
|
|
||||||
warnx("sending FrSky D type telemetry");
|
warnx("sending FrSky D type telemetry");
|
||||||
|
struct adc_linkquality host_frame;
|
||||||
|
uint8_t dbuf[45];
|
||||||
|
|
||||||
/* send D8 mode telemetry */
|
/* send D8 mode telemetry */
|
||||||
while (!thread_should_exit) {
|
while (!thread_should_exit) {
|
||||||
|
|
||||||
/* Sleep 200 ms */
|
/* Sleep 100 ms */
|
||||||
usleep(200000);
|
usleep(100000);
|
||||||
|
|
||||||
|
/* parse incoming data */
|
||||||
|
int nbytes = read(uart, &dbuf[0], sizeof(dbuf));
|
||||||
|
bool new_input = frsky_parse_host(&dbuf[0], nbytes, &host_frame);
|
||||||
|
if (new_input) {
|
||||||
|
// warnx("host frame: ad1:%u, ad2: %u, rssi: %u",
|
||||||
|
// host_frame.ad1, host_frame.ad2, host_frame.linkq);
|
||||||
|
}
|
||||||
|
|
||||||
/* Send frame 1 (every 200ms): acceleration values, altitude (vario), temperatures, current & voltages, RPM */
|
/* Send frame 1 (every 200ms): acceleration values, altitude (vario), temperatures, current & voltages, RPM */
|
||||||
|
if (iteration % 2 == 0) {
|
||||||
frsky_send_frame1(uart);
|
frsky_send_frame1(uart);
|
||||||
|
}
|
||||||
|
|
||||||
/* Send frame 2 (every 1000ms): course, latitude, longitude, speed, altitude (GPS), fuel level */
|
/* Send frame 2 (every 1000ms): course, latitude, longitude, speed, altitude (GPS), fuel level */
|
||||||
if (iteration % 5 == 0) {
|
if (iteration % 10 == 0) {
|
||||||
frsky_send_frame2(uart);
|
frsky_send_frame2(uart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send frame 3 (every 5000ms): date, time */
|
/* Send frame 3 (every 5000ms): date, time */
|
||||||
if (iteration % 25 == 0) {
|
if (iteration % 50 == 0) {
|
||||||
frsky_send_frame3(uart);
|
frsky_send_frame3(uart);
|
||||||
|
|
||||||
iteration = 0;
|
iteration = 0;
|
||||||
|
|
|
@ -713,9 +713,9 @@ void PX4FMU::fill_rc_in(uint16_t raw_rc_count,
|
||||||
_rc_in.timestamp_last_signal = _rc_in.timestamp_publication;
|
_rc_in.timestamp_last_signal = _rc_in.timestamp_publication;
|
||||||
_rc_in.rc_ppm_frame_length = 0;
|
_rc_in.rc_ppm_frame_length = 0;
|
||||||
|
|
||||||
if (rssi == -1) {
|
/* don't touch rssi if no value was provided */
|
||||||
_rc_in.rssi =
|
if (rssi >= 0) {
|
||||||
(!frame_drop) ? RC_INPUT_RSSI_MAX : (RC_INPUT_RSSI_MAX / 2);
|
_rc_in.rssi = rssi;
|
||||||
}
|
}
|
||||||
|
|
||||||
_rc_in.rc_failsafe = failsafe;
|
_rc_in.rc_failsafe = failsafe;
|
||||||
|
|
Loading…
Reference in New Issue