mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-03-16 08:29:15 +01:00
LP-104 LP-196 Signal quality implementation for Graupner HoTT. Uncrustification of flight code.
This commit is contained in:
parent
ffa671da78
commit
9e53b35fdc
@ -39,26 +39,26 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* EXBUS frame size and contents definitions */
|
/* EXBUS frame size and contents definitions */
|
||||||
#define EXBUS_HEADER_LENGTH 4
|
#define EXBUS_HEADER_LENGTH 4
|
||||||
#define EXBUS_CRC_LENGTH 2
|
#define EXBUS_CRC_LENGTH 2
|
||||||
#define EXBUS_MAX_CHANNELS 16
|
#define EXBUS_MAX_CHANNELS 16
|
||||||
#define EXBUS_OVERHEAD_LENGTH (EXBUS_HEADER_LENGTH + EXBUS_CRC_LENGTH)
|
#define EXBUS_OVERHEAD_LENGTH (EXBUS_HEADER_LENGTH + EXBUS_CRC_LENGTH)
|
||||||
#define EXBUS_MAX_FRAME_LENGTH (EXBUS_MAX_CHANNELS * 2 + 10 + EXBUS_OVERHEAD_LENGTH)
|
#define EXBUS_MAX_FRAME_LENGTH (EXBUS_MAX_CHANNELS * 2 + 10 + EXBUS_OVERHEAD_LENGTH)
|
||||||
|
|
||||||
#define EXBUS_SYNC_CHANNEL 0x3E
|
#define EXBUS_SYNC_CHANNEL 0x3E
|
||||||
#define EXBUS_SYNC_TELEMETRY 0x3D
|
#define EXBUS_SYNC_TELEMETRY 0x3D
|
||||||
#define EXBUS_BYTE_REQ 0x01
|
#define EXBUS_BYTE_REQ 0x01
|
||||||
#define EXBUS_BYTE_NOREQ 0x03
|
#define EXBUS_BYTE_NOREQ 0x03
|
||||||
|
|
||||||
#define EXBUS_DATA_CHANNEL 0x31
|
#define EXBUS_DATA_CHANNEL 0x31
|
||||||
#define EXBUS_DATA_TELEMETRY 0x3A
|
#define EXBUS_DATA_TELEMETRY 0x3A
|
||||||
#define EXBUS_DATA_JETIBOX 0x3B
|
#define EXBUS_DATA_JETIBOX 0x3B
|
||||||
|
|
||||||
#define EXBUS_LOW_BAUD_RATE 125000
|
#define EXBUS_LOW_BAUD_RATE 125000
|
||||||
#define EXBUS_HIGH_BAUD_RATE 250000
|
#define EXBUS_HIGH_BAUD_RATE 250000
|
||||||
#define EXBUS_BAUD_RATE_LIMIT 64
|
#define EXBUS_BAUD_RATE_LIMIT 64
|
||||||
#define EXBUS_FRAME_TIMEOUT 4
|
#define EXBUS_FRAME_TIMEOUT 4
|
||||||
#define EXBUS_FAILSAFE_TIMEOUT 64
|
#define EXBUS_FAILSAFE_TIMEOUT 64
|
||||||
|
|
||||||
/* With an Ex.Bus frame rate of 10ms (100Hz) averaging over 20 samples
|
/* With an Ex.Bus frame rate of 10ms (100Hz) averaging over 20 samples
|
||||||
* gives about a 200ms response.
|
* gives about a 200ms response.
|
||||||
@ -78,7 +78,7 @@ static uint8_t PIOS_EXBUS_Quality_Get(uint32_t rcvr_id);
|
|||||||
|
|
||||||
/* Local Variables */
|
/* Local Variables */
|
||||||
const struct pios_rcvr_driver pios_exbus_rcvr_driver = {
|
const struct pios_rcvr_driver pios_exbus_rcvr_driver = {
|
||||||
.read = PIOS_EXBUS_Get,
|
.read = PIOS_EXBUS_Get,
|
||||||
.get_quality = PIOS_EXBUS_Quality_Get,
|
.get_quality = PIOS_EXBUS_Quality_Get,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -278,8 +278,8 @@ static void PIOS_EXBUS_UpdateState(struct pios_exbus_dev *exbus_dev, uint8_t byt
|
|||||||
quality_trend = 100;
|
quality_trend = 100;
|
||||||
}
|
}
|
||||||
// Calculate quality trend using weighted average of good frames
|
// Calculate quality trend using weighted average of good frames
|
||||||
state->quality = ((state->quality * (EXBUS_FL_WEIGHTED_AVERAGE - 1)) +
|
state->quality = ((state->quality * (EXBUS_FL_WEIGHTED_AVERAGE - 1)) +
|
||||||
quality_trend) / EXBUS_FL_WEIGHTED_AVERAGE;
|
quality_trend) / EXBUS_FL_WEIGHTED_AVERAGE;
|
||||||
/* get ready for the next frame */
|
/* get ready for the next frame */
|
||||||
state->frame_found = false;
|
state->frame_found = false;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,11 @@
|
|||||||
#define HOTT_FRAME_TIMEOUT 4
|
#define HOTT_FRAME_TIMEOUT 4
|
||||||
#define HOTT_FAILSAFE_TIMEOUT 64
|
#define HOTT_FAILSAFE_TIMEOUT 64
|
||||||
|
|
||||||
|
/* With an Ex.Bus frame rate of 11/22ms (90/45Hz) averaging over 15 samples
|
||||||
|
* gives about a 165/330ms response.
|
||||||
|
*/
|
||||||
|
#define HOTT_FL_WEIGHTED_AVERAGE 20
|
||||||
|
|
||||||
|
|
||||||
/* Forward Declarations */
|
/* Forward Declarations */
|
||||||
static int32_t PIOS_HOTT_Get(uint32_t rcvr_id, uint8_t channel);
|
static int32_t PIOS_HOTT_Get(uint32_t rcvr_id, uint8_t channel);
|
||||||
@ -99,10 +104,12 @@ static uint16_t PIOS_HOTT_RxInCallback(uint32_t context,
|
|||||||
uint16_t *headroom,
|
uint16_t *headroom,
|
||||||
bool *need_yield);
|
bool *need_yield);
|
||||||
static void PIOS_HOTT_Supervisor(uint32_t hott_id);
|
static void PIOS_HOTT_Supervisor(uint32_t hott_id);
|
||||||
|
static uint8_t PIOS_HOTT_Quality_Get(uint32_t rcvr_id);
|
||||||
|
|
||||||
/* Local Variables */
|
/* Local Variables */
|
||||||
const struct pios_rcvr_driver pios_hott_rcvr_driver = {
|
const struct pios_rcvr_driver pios_hott_rcvr_driver = {
|
||||||
.read = PIOS_HOTT_Get,
|
.read = PIOS_HOTT_Get,
|
||||||
|
.get_quality = PIOS_HOTT_Quality_Get,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum pios_hott_dev_magic {
|
enum pios_hott_dev_magic {
|
||||||
@ -118,6 +125,7 @@ struct pios_hott_state {
|
|||||||
uint8_t tx_connected;
|
uint8_t tx_connected;
|
||||||
uint8_t byte_count;
|
uint8_t byte_count;
|
||||||
uint8_t frame_length;
|
uint8_t frame_length;
|
||||||
|
float quality;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pios_hott_dev {
|
struct pios_hott_dev {
|
||||||
@ -162,6 +170,7 @@ static void PIOS_HOTT_ResetState(struct pios_hott_state *state)
|
|||||||
state->failsafe_timer = 0;
|
state->failsafe_timer = 0;
|
||||||
state->frame_found = 0;
|
state->frame_found = 0;
|
||||||
state->tx_connected = 0;
|
state->tx_connected = 0;
|
||||||
|
state->quality = 0.0f;
|
||||||
PIOS_HOTT_ResetChannels(state);
|
PIOS_HOTT_ResetChannels(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,11 +284,17 @@ static void PIOS_HOTT_UpdateState(struct pios_hott_dev *hott_dev, uint8_t byte)
|
|||||||
state->frame_length = HOTT_OVERHEAD_LENGTH + 2 * byte;
|
state->frame_length = HOTT_OVERHEAD_LENGTH + 2 * byte;
|
||||||
}
|
}
|
||||||
if (state->byte_count == state->frame_length) {
|
if (state->byte_count == state->frame_length) {
|
||||||
|
uint8_t quality_trend = 0;
|
||||||
/* full frame received - process and wait for new one */
|
/* full frame received - process and wait for new one */
|
||||||
if (!PIOS_HOTT_UnrollChannels(hott_dev)) {
|
if (!PIOS_HOTT_UnrollChannels(hott_dev)) {
|
||||||
/* data looking good */
|
/* data looking good */
|
||||||
state->failsafe_timer = 0;
|
state->failsafe_timer = 0;
|
||||||
|
quality_trend = 100;
|
||||||
}
|
}
|
||||||
|
// Calculate quality trend using weighted average of good frames
|
||||||
|
state->quality = ((state->quality * (HOTT_FL_WEIGHTED_AVERAGE - 1)) +
|
||||||
|
quality_trend) / HOTT_FL_WEIGHTED_AVERAGE;
|
||||||
|
|
||||||
/* prepare for the next frame */
|
/* prepare for the next frame */
|
||||||
state->frame_found = 0;
|
state->frame_found = 0;
|
||||||
}
|
}
|
||||||
@ -375,6 +390,19 @@ static int32_t PIOS_HOTT_Get(uint32_t rcvr_id, uint8_t channel)
|
|||||||
return hott_dev->state.channel_data[channel];
|
return hott_dev->state.channel_data[channel];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t PIOS_HOTT_Quality_Get(uint32_t hott_id)
|
||||||
|
{
|
||||||
|
struct pios_hott_dev *hott_dev = (struct pios_hott_dev *)hott_id;
|
||||||
|
|
||||||
|
bool valid = PIOS_HOTT_Validate(hott_dev);
|
||||||
|
|
||||||
|
PIOS_Assert(valid);
|
||||||
|
|
||||||
|
struct pios_hott_state *state = &(hott_dev->state);
|
||||||
|
|
||||||
|
return (uint8_t)(state->quality + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input data supervisor is called periodically and provides
|
* Input data supervisor is called periodically and provides
|
||||||
* two functions: frame syncing and failsafe triggering.
|
* two functions: frame syncing and failsafe triggering.
|
||||||
@ -410,6 +438,7 @@ static void PIOS_HOTT_Supervisor(uint32_t hott_id)
|
|||||||
PIOS_HOTT_ResetChannels(state);
|
PIOS_HOTT_ResetChannels(state);
|
||||||
state->failsafe_timer = 0;
|
state->failsafe_timer = 0;
|
||||||
state->tx_connected = 0;
|
state->tx_connected = 0;
|
||||||
|
state->quality = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user