1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-29 07:24:13 +01:00

LP-499 Adds support for bridging either radio primary, radio auxilary, and/or VCP to any of the output ports (main, flexi, VCP, HID). Also adds the ability to configure the com speed of the UARTs independent of the air data rate.

This commit is contained in:
Brian Webb 2017-03-30 20:06:03 -07:00
parent a9ca744293
commit dc5eef0cb5
17 changed files with 962 additions and 605 deletions

View File

@ -122,6 +122,11 @@ static void systemTask(__attribute__((unused)) void *parameters)
while (!initTaskDone) { while (!initTaskDone) {
vTaskDelay(10); vTaskDelay(10);
} }
#ifndef PIOS_INCLUDE_WDG
// if no watchdog is enabled, don't reset watchdog in MODULE_TASKCREATE_ALL loop
#define PIOS_WDG_Clear()
#endif
/* create all modules thread */ /* create all modules thread */
MODULE_TASKCREATE_ALL; MODULE_TASKCREATE_ALL;

View File

@ -41,23 +41,21 @@
#include <uavtalk_priv.h> #include <uavtalk_priv.h>
#include <pios_rfm22b.h> #include <pios_rfm22b.h>
#include <ecc.h> #include <ecc.h>
#if defined(PIOS_INCLUDE_FLASH_EEPROM)
#include <pios_eeprom.h>
#endif
#include <stdbool.h> #include <stdbool.h>
// **************** // ****************
// Private constants // Private constants
#define STACK_SIZE_BYTES 150 #define TELEM_STACK_SIZE_WORDS 150
#define TASK_PRIORITY (tskIDLE_PRIORITY + 1) #define PPM_STACK_SIZE_WORDS 150
#define MAX_RETRIES 2 #define TASK_PRIORITY (tskIDLE_PRIORITY + 1)
#define RETRY_TIMEOUT_MS 20 #define MAX_RETRIES 2
#define EVENT_QUEUE_SIZE 10 #define RETRY_TIMEOUT_MS 20
#define MAX_PORT_DELAY 200 #define EVENT_QUEUE_SIZE 10
#define SERIAL_RX_BUF_LEN 100 #define MAX_PORT_DELAY 200
#define PPM_INPUT_TIMEOUT 100 #define SERIAL_RX_BUF_LEN 100
#define PPM_INPUT_TIMEOUT 100
// **************** // ****************
@ -67,10 +65,9 @@ typedef struct {
// The task handles. // The task handles.
xTaskHandle telemetryTxTaskHandle; xTaskHandle telemetryTxTaskHandle;
xTaskHandle telemetryRxTaskHandle; xTaskHandle telemetryRxTaskHandle;
xTaskHandle radioTxTaskHandle; xTaskHandle telemRadioTxTaskHandle;
xTaskHandle radioRxTaskHandle; xTaskHandle telemRadioRxTaskHandle;
xTaskHandle PPMInputTaskHandle; xTaskHandle PPMInputTaskHandle;
xTaskHandle serialRxTaskHandle;
// The UAVTalk connection on the com side. // The UAVTalk connection on the com side.
UAVTalkConnection telemUAVTalkCon; UAVTalkConnection telemUAVTalkCon;
@ -80,21 +77,12 @@ typedef struct {
xQueueHandle uavtalkEventQueue; xQueueHandle uavtalkEventQueue;
xQueueHandle radioEventQueue; xQueueHandle radioEventQueue;
// The raw serial Rx buffer
uint8_t serialRxBuf[SERIAL_RX_BUF_LEN];
// Error statistics. // Error statistics.
uint32_t telemetryTxRetries; uint32_t telemetryTxRetries;
uint32_t radioTxRetries; uint32_t radioTxRetries;
// Is this modem the coordinator // Is this modem the coordinator
bool isCoordinator; bool isCoordinator;
// Should we parse UAVTalk?
bool parseUAVTalk;
// The current configured uart speed
OPLinkSettingsComSpeedOptions comSpeed;
} RadioComBridgeData; } RadioComBridgeData;
// **************** // ****************
@ -102,9 +90,8 @@ typedef struct {
static void telemetryTxTask(void *parameters); static void telemetryTxTask(void *parameters);
static void telemetryRxTask(void *parameters); static void telemetryRxTask(void *parameters);
static void serialRxTask(void *parameters); static void telemRadioTxTask(void *parameters);
static void radioTxTask(void *parameters); static void telemRadioRxTask(void *parameters);
static void radioRxTask(void *parameters);
static void PPMInputTask(void *parameters); static void PPMInputTask(void *parameters);
static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length); static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length);
static int32_t RadioSendHandler(uint8_t *buf, int32_t length); static int32_t RadioSendHandler(uint8_t *buf, int32_t length);
@ -133,11 +120,6 @@ static int32_t RadioComBridgeStart(void)
// Check if this is the coordinator modem // Check if this is the coordinator modem
data->isCoordinator = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPLINKCOORDINATOR); data->isCoordinator = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPLINKCOORDINATOR);
// We will not parse/send UAVTalk if any ports are configured as Serial (except for over the USB HID port).
data->parseUAVTalk = ((oplinkSettings.MainPort != OPLINKSETTINGS_MAINPORT_SERIAL) &&
(oplinkSettings.FlexiPort != OPLINKSETTINGS_FLEXIPORT_SERIAL) &&
(oplinkSettings.VCPPort != OPLINKSETTINGS_VCPPORT_SERIAL));
// Set the maximum radio RF power. // Set the maximum radio RF power.
switch (oplinkSettings.MaxRFPower) { switch (oplinkSettings.MaxRFPower) {
case OPLINKSETTINGS_MAXRFPOWER_125: case OPLINKSETTINGS_MAXRFPOWER_125:
@ -186,34 +168,37 @@ static int32_t RadioComBridgeStart(void)
ObjectPersistenceConnectCallback(&objectPersistenceUpdatedCb); ObjectPersistenceConnectCallback(&objectPersistenceUpdatedCb);
// Start the primary tasks for receiving/sending UAVTalk packets from the GCS. // Start the primary tasks for receiving/sending UAVTalk packets from the GCS.
xTaskCreate(telemetryTxTask, "telemetryTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->telemetryTxTaskHandle)); // These tasks are always needed at least for configuration over HID.
xTaskCreate(telemetryRxTask, "telemetryRxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->telemetryRxTaskHandle)); xTaskCreate(telemetryTxTask, "telemetryTxTask", TELEM_STACK_SIZE_WORDS, NULL, TASK_PRIORITY, &(data->telemetryTxTaskHandle));
if (PIOS_PPM_RECEIVER != 0) { xTaskCreate(telemetryRxTask, "telemetryRxTask", TELEM_STACK_SIZE_WORDS, NULL, TASK_PRIORITY, &(data->telemetryRxTaskHandle));
xTaskCreate(PPMInputTask, "PPMInputTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->PPMInputTaskHandle)); #if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMETRYTX)
#ifdef PIOS_INCLUDE_WDG PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYTX);
#endif
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMETRYRX)
PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYRX);
#endif
// Start the tasks for sending/receiving telemetry over a radio link if a telemetry (GCS) link configured.
if (PIOS_COM_GCS_OUT) {
xTaskCreate(telemRadioTxTask, "telemRadioTxTask", TELEM_STACK_SIZE_WORDS, NULL, TASK_PRIORITY, &(data->telemRadioTxTaskHandle));
xTaskCreate(telemRadioRxTask, "telemRadioRxTask", TELEM_STACK_SIZE_WORDS, NULL, TASK_PRIORITY, &(data->telemRadioRxTaskHandle));
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMRADIOTX)
PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMRADIOTX);
#endif
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMRADIORX)
PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMRADIORX);
#endif
}
// Start the task for reading and processing PPM data if it's configured.
if (PIOS_PPM_RECEIVER) {
xTaskCreate(PPMInputTask, "PPMInputTask", PPM_STACK_SIZE_WORDS, NULL, TASK_PRIORITY, &(data->PPMInputTaskHandle));
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_PPMINPUT)
PIOS_WDG_RegisterFlag(PIOS_WDG_PPMINPUT); PIOS_WDG_RegisterFlag(PIOS_WDG_PPMINPUT);
#endif #endif
} }
if (!data->parseUAVTalk) {
// If the user wants raw serial communication, we need to spawn another thread to handle it.
xTaskCreate(serialRxTask, "serialRxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->serialRxTaskHandle));
#ifdef PIOS_INCLUDE_WDG
PIOS_WDG_RegisterFlag(PIOS_WDG_SERIALRX);
#endif
}
xTaskCreate(radioTxTask, "radioTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioTxTaskHandle));
xTaskCreate(radioRxTask, "radioRxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioRxTaskHandle));
// Register the watchdog timers.
#ifdef PIOS_INCLUDE_WDG
PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYTX);
PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYRX);
PIOS_WDG_RegisterFlag(PIOS_WDG_RADIOTX);
PIOS_WDG_RegisterFlag(PIOS_WDG_RADIORX);
#endif
return 0; return 0;
} }
return -1; return -1;
} }
@ -248,10 +233,6 @@ static int32_t RadioComBridgeInitialize(void)
data->telemetryTxRetries = 0; data->telemetryTxRetries = 0;
data->radioTxRetries = 0; data->radioTxRetries = 0;
data->parseUAVTalk = true;
data->comSpeed = OPLINKSETTINGS_COMSPEED_9600;
PIOS_COM_RADIO = PIOS_COM_RFM22B;
return 0; return 0;
} }
MODULE_INITCALL(RadioComBridgeInitialize, RadioComBridgeStart); MODULE_INITCALL(RadioComBridgeInitialize, RadioComBridgeStart);
@ -323,9 +304,48 @@ static void updateRadioComBridgeStats()
} }
/** /**
* @brief Telemetry transmit task, regular priority * @brief Reads the PPM input device and sends out OPLinkReceiver objects.
* *
* @param[in] parameters The task parameters * @param[in] parameters The task parameters (unused)
*/
static void PPMInputTask(__attribute__((unused)) void *parameters)
{
xSemaphoreHandle sem = PIOS_RCVR_GetSemaphore(PIOS_PPM_RECEIVER, 1);
int16_t channels[RFM22B_PPM_NUM_CHANNELS];
while (1) {
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_PPMINPUT)
PIOS_WDG_UpdateFlag(PIOS_WDG_PPMINPUT);
#endif
// Wait for the receiver semaphore.
if (xSemaphoreTake(sem, PPM_INPUT_TIMEOUT) == pdTRUE) {
// Read the receiver inputs.
for (uint8_t i = 0; i < RFM22B_PPM_NUM_CHANNELS; ++i) {
channels[i] = PIOS_RCVR_Read(PIOS_PPM_RECEIVER, i + 1);
}
} else {
// Failsafe
for (uint8_t i = 0; i < RFM22B_PPM_NUM_CHANNELS; ++i) {
channels[i] = PIOS_RCVR_INVALID;
}
}
// Pass the channel values to the radio device.
PIOS_RFM22B_PPMSet(pios_rfm22b_id, channels, RFM22B_PPM_NUM_CHANNELS);
}
}
/****************************************************************************
* Telemetry tasks and functions
****************************************************************************/
/**
* @brief Receives events on the Radio->GCS telemetry stream and sends
* the requested object(s) to the GCS.
*
* @param[in] parameters None.
*/ */
static void telemetryTxTask(__attribute__((unused)) void *parameters) static void telemetryTxTask(__attribute__((unused)) void *parameters)
{ {
@ -333,7 +353,7 @@ static void telemetryTxTask(__attribute__((unused)) void *parameters)
// Loop forever // Loop forever
while (1) { while (1) {
#ifdef PIOS_INCLUDE_WDG #if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMETRYTX)
PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYTX); PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYTX);
#endif #endif
// Wait for queue message // Wait for queue message
@ -357,16 +377,17 @@ static void telemetryTxTask(__attribute__((unused)) void *parameters)
} }
/** /**
* @brief Radio tx task. Receive data packets from the com port and send to the radio. * @brief Receives events on the GCS->Radio telemetry stream and sends
* the requested object(s) over the radio telenetry stream.
* *
* @param[in] parameters The task parameters * @param[in] parameters none.
*/ */
static void radioTxTask(__attribute__((unused)) void *parameters) static void telemRadioTxTask(__attribute__((unused)) void *parameters)
{ {
// Task loop // Task loop
while (1) { while (1) {
#ifdef PIOS_INCLUDE_WDG #if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMRADIOTX)
PIOS_WDG_UpdateFlag(PIOS_WDG_RADIOTX); PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMRADIOTX);
#endif #endif
// Process the radio event queue, sending UAVObjects over the radio link as necessary. // Process the radio event queue, sending UAVObjects over the radio link as necessary.
@ -391,34 +412,24 @@ static void radioTxTask(__attribute__((unused)) void *parameters)
} }
/** /**
* @brief Radio rx task. Receive data packets from the radio and pass them on. * @brief Reads data from the radio telemetry port and processes it
* through the Radio->GCS telemetry stream.
* *
* @param[in] parameters The task parameters * @param[in] parameters The task parameters
*/ */
static void radioRxTask(__attribute__((unused)) void *parameters) static void telemRadioRxTask(__attribute__((unused)) void *parameters)
{ {
// Task loop // Task loop
while (1) { while (1) {
#ifdef PIOS_INCLUDE_WDG #if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMRADIORX)
PIOS_WDG_UpdateFlag(PIOS_WDG_RADIORX); PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMRADIORX);
#endif #endif
if (PIOS_COM_RADIO) { if (PIOS_COM_GCS_OUT) {
uint8_t serial_data[16]; uint8_t serial_data[16];
uint16_t bytes_to_process = PIOS_COM_ReceiveBuffer(PIOS_COM_RADIO, serial_data, sizeof(serial_data), MAX_PORT_DELAY); uint16_t bytes_to_process = PIOS_COM_ReceiveBuffer(PIOS_COM_GCS_OUT, serial_data, sizeof(serial_data), MAX_PORT_DELAY);
if (bytes_to_process > 0) { if (bytes_to_process > 0) {
if (data->parseUAVTalk) { // Pass the data through the UAVTalk parser.
// Pass the data through the UAVTalk parser. ProcessRadioStream(data->radioUAVTalkCon, data->telemUAVTalkCon, serial_data, bytes_to_process);
ProcessRadioStream(data->radioUAVTalkCon, data->telemUAVTalkCon, serial_data, bytes_to_process);
} else if (PIOS_COM_TELEMETRY) {
// Send the data straight to the telemetry port.
// Following call can fail with -2 error code (buffer full) or -3 error code (could not acquire send mutex)
// It is the caller responsibility to retry in such cases...
int32_t ret = -2;
uint8_t count = 5;
while (count-- > 0 && ret < -1) {
ret = PIOS_COM_SendBufferNonBlocking(PIOS_COM_TELEMETRY, serial_data, bytes_to_process);
}
}
} }
} else { } else {
vTaskDelay(5); vTaskDelay(5);
@ -427,7 +438,8 @@ static void radioRxTask(__attribute__((unused)) void *parameters)
} }
/** /**
* @brief Receive telemetry from the USB/COM port. * @brief Reads data from the GCS telemetry port and processes it
* through the GCS->Radio telemetry stream.
* *
* @param[in] parameters The task parameters * @param[in] parameters The task parameters
*/ */
@ -435,14 +447,15 @@ static void telemetryRxTask(__attribute__((unused)) void *parameters)
{ {
// Task loop // Task loop
while (1) { while (1) {
uint32_t inputPort = data->parseUAVTalk ? PIOS_COM_TELEMETRY : 0; // uint32_t inputPort = data->parseUAVTalk ? PIOS_COM_TELEMETRY : 0;
#ifdef PIOS_INCLUDE_WDG uint32_t inputPort = PIOS_COM_GCS;
#if defined(PIOS_INCLUDE_WDG) && defined(PIOS_WDG_TELEMETRYRX)
PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYRX); PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYRX);
#endif #endif
#if defined(PIOS_INCLUDE_USB) #if defined(PIOS_INCLUDE_USB)
// Determine output port (USB takes priority over telemetry port) // Determine output port (USB takes priority over telemetry port)
if (PIOS_USB_CheckAvailable(0) && PIOS_COM_TELEM_USB_HID) { if (PIOS_USB_CheckAvailable(0) && PIOS_COM_HID) {
inputPort = PIOS_COM_TELEM_USB_HID; inputPort = PIOS_COM_HID;
} }
#endif /* PIOS_INCLUDE_USB */ #endif /* PIOS_INCLUDE_USB */
if (inputPort) { if (inputPort) {
@ -458,73 +471,7 @@ static void telemetryRxTask(__attribute__((unused)) void *parameters)
} }
/** /**
* @brief Reads the PPM input device and sends out OPLinkReceiver objects. * @brief Send data from the Radio->GCS telemetry stream to the GCS port.
*
* @param[in] parameters The task parameters (unused)
*/
static void PPMInputTask(__attribute__((unused)) void *parameters)
{
xSemaphoreHandle sem = PIOS_RCVR_GetSemaphore(PIOS_PPM_RECEIVER, 1);
int16_t channels[RFM22B_PPM_NUM_CHANNELS];
while (1) {
#ifdef PIOS_INCLUDE_WDG
PIOS_WDG_UpdateFlag(PIOS_WDG_PPMINPUT);
#endif
// Wait for the receiver semaphore.
if (xSemaphoreTake(sem, PPM_INPUT_TIMEOUT) == pdTRUE) {
// Read the receiver inputs.
for (uint8_t i = 0; i < RFM22B_PPM_NUM_CHANNELS; ++i) {
channels[i] = PIOS_RCVR_Read(PIOS_PPM_RECEIVER, i + 1);
}
} else {
// Failsafe
for (uint8_t i = 0; i < RFM22B_PPM_NUM_CHANNELS; ++i) {
channels[i] = PIOS_RCVR_INVALID;
}
}
// Pass the channel values to the radio device.
PIOS_RFM22B_PPMSet(pios_rfm22b_id, channels, RFM22B_PPM_NUM_CHANNELS);
}
}
/**
* @brief Receive raw serial data from the USB/COM port.
*
* @param[in] parameters The task parameters
*/
static void serialRxTask(__attribute__((unused)) void *parameters)
{
// Task loop
while (1) {
uint32_t inputPort = PIOS_COM_TELEMETRY;
#ifdef PIOS_INCLUDE_WDG
PIOS_WDG_UpdateFlag(PIOS_WDG_SERIALRX);
#endif
if (inputPort && PIOS_COM_RADIO) {
// Receive some data.
uint16_t bytes_to_process = PIOS_COM_ReceiveBuffer(inputPort, data->serialRxBuf, sizeof(data->serialRxBuf), MAX_PORT_DELAY);
if (bytes_to_process > 0) {
// Send the data over the radio link.
// Following call can fail with -2 error code (buffer full) or -3 error code (could not acquire send mutex)
// It is the caller responsibility to retry in such cases...
int32_t ret = -2;
uint8_t count = 5;
while (count-- > 0 && ret < -1) {
ret = PIOS_COM_SendBufferNonBlocking(PIOS_COM_RADIO, data->serialRxBuf, bytes_to_process);
}
}
} else {
vTaskDelay(5);
}
}
}
/**
* @brief Transmit data buffer to the com port.
* *
* @param[in] buf Data buffer to send * @param[in] buf Data buffer to send
* @param[in] length Length of buffer * @param[in] length Length of buffer
@ -534,12 +481,12 @@ static void serialRxTask(__attribute__((unused)) void *parameters)
static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length) static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length)
{ {
int32_t ret; int32_t ret;
uint32_t outputPort = data->parseUAVTalk ? PIOS_COM_TELEMETRY : 0; uint32_t outputPort = PIOS_COM_GCS;
#if defined(PIOS_INCLUDE_USB) #if defined(PIOS_INCLUDE_USB)
// Determine output port (USB takes priority over telemetry port) // Determine output port (USB takes priority over telemetry port)
if (PIOS_COM_TELEM_USB_HID && PIOS_COM_Available(PIOS_COM_TELEM_USB_HID)) { if (PIOS_COM_HID && PIOS_COM_Available(PIOS_COM_HID)) {
outputPort = PIOS_COM_TELEM_USB_HID; outputPort = PIOS_COM_HID;
} }
#endif /* PIOS_INCLUDE_USB */ #endif /* PIOS_INCLUDE_USB */
if (outputPort) { if (outputPort) {
@ -557,7 +504,7 @@ static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length)
} }
/** /**
* Transmit data buffer to the com port. * @brief Send data from the GCS telemetry stream to the Radio->GCS port.
* *
* @param[in] buf Data buffer to send * @param[in] buf Data buffer to send
* @param[in] length Length of buffer * @param[in] length Length of buffer
@ -566,10 +513,7 @@ static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length)
*/ */
static int32_t RadioSendHandler(uint8_t *buf, int32_t length) static int32_t RadioSendHandler(uint8_t *buf, int32_t length)
{ {
if (!data->parseUAVTalk) { uint32_t outputPort = PIOS_COM_GCS_OUT;
return length;
}
uint32_t outputPort = PIOS_COM_RADIO;
// Don't send any data unless the radio port is available. // Don't send any data unless the radio port is available.
if (outputPort && PIOS_COM_Available(outputPort)) { if (outputPort && PIOS_COM_Available(outputPort)) {

View File

@ -808,6 +808,44 @@ int32_t PIOS_COM_RegisterAvailableCallback(uint32_t com_id, pios_com_callback_av
return 0; return 0;
} }
/*
* Callback used to pass data from one ocm port to another in PIOS_COM_LinkComPare.
* \param[in] context The "to" com port
* \param[in] buf The data buffer
* \param[in] buf_len The number of bytes received
* \param[in] headroom Not used
* \param[in] task_woken Not used
*/
static uint16_t PIOS_COM_LinkComPairRxCallback(uint32_t context, uint8_t *buf, uint16_t buf_len, __attribute__((unused)) uint16_t *headroom, __attribute__((unused)) bool *task_woken)
{
int32_t sent = PIOS_COM_SendBufferNonBlocking(context, buf, buf_len);
if (sent > 0) {
return sent;
}
return 0;
}
/*
* Link a pair of com ports so that any data arriving on one is sent out the other.
* \param[in] com1_id The first com port
* \param[in] com2_id The second com port
*/
void PIOS_COM_LinkComPair(uint32_t com1_id, uint32_t com2_id, bool link_ctrl_line, bool link_baud_rate)
{
PIOS_COM_ASYNC_RegisterRxCallback(com1_id, PIOS_COM_LinkComPairRxCallback, com2_id);
PIOS_COM_ASYNC_RegisterRxCallback(com2_id, PIOS_COM_LinkComPairRxCallback, com1_id);
// Optionally link the control like and baudrate changes between the two.
if (link_ctrl_line) {
PIOS_COM_RegisterCtrlLineCallback(com1_id, (pios_com_callback_ctrl_line)PIOS_COM_SetCtrlLine, com2_id);
PIOS_COM_RegisterCtrlLineCallback(com2_id, (pios_com_callback_ctrl_line)PIOS_COM_SetCtrlLine, com1_id);
}
if (link_baud_rate) {
PIOS_COM_RegisterBaudRateCallback(com1_id, (pios_com_callback_baud_rate)PIOS_COM_ChangeBaud, com2_id);
PIOS_COM_RegisterBaudRateCallback(com2_id, (pios_com_callback_baud_rate)PIOS_COM_ChangeBaud, com1_id);
}
}
#endif /* PIOS_INCLUDE_COM */ #endif /* PIOS_INCLUDE_COM */
/** /**

View File

@ -808,9 +808,8 @@ bool PIOS_RFM22B_TransmitPacket(uint32_t rfm22b_id, uint8_t *p, uint8_t len)
return false; return false;
} }
rfm22b_dev->tx_packet_handle = p; rfm22b_dev->tx_packet_handle = p;
rfm22b_dev->stats.tx_byte_count += len; rfm22b_dev->packet_start_ticks = xTaskGetTickCount();
rfm22b_dev->packet_start_ticks = xTaskGetTickCount();
if (rfm22b_dev->packet_start_ticks == 0) { if (rfm22b_dev->packet_start_ticks == 0) {
rfm22b_dev->packet_start_ticks = 1; rfm22b_dev->packet_start_ticks = 1;
} }
@ -873,8 +872,6 @@ bool PIOS_RFM22B_TransmitPacket(uint32_t rfm22b_id, uint8_t *p, uint8_t len)
// We're in Tx mode. // We're in Tx mode.
rfm22b_dev->rfm22b_state = RFM22B_STATE_TX_MODE; rfm22b_dev->rfm22b_state = RFM22B_STATE_TX_MODE;
TX_LED_ON;
#ifdef PIOS_RFM22B_DEBUG_ON_TELEM #ifdef PIOS_RFM22B_DEBUG_ON_TELEM
D1_LED_ON; D1_LED_ON;
#endif #endif
@ -1925,6 +1922,12 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
len += RS_ECC_NPARITY; len += RS_ECC_NPARITY;
} }
// Only count the packet if it contains valid data.
if (radio_dev->ppm_only_mode || (len > RS_ECC_NPARITY)) {
TX_LED_ON;
radio_dev->stats.tx_byte_count += len;
}
// Transmit the packet. // Transmit the packet.
PIOS_RFM22B_TransmitPacket((uint32_t)radio_dev, p, len); PIOS_RFM22B_TransmitPacket((uint32_t)radio_dev, p, len);

View File

@ -115,6 +115,8 @@ extern int32_t PIOS_COM_ASYNC_RxStart(uint32_t id, uint16_t rx_bytes_avail);
extern int32_t PIOS_COM_ASYNC_RegisterRxCallback(uint32_t id, pios_com_callback rx_in_cb, uint32_t context); extern int32_t PIOS_COM_ASYNC_RegisterRxCallback(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
extern int32_t PIOS_COM_ASYNC_RegisterTxCallback(uint32_t id, pios_com_callback tx_out_cb, uint32_t context); extern int32_t PIOS_COM_ASYNC_RegisterTxCallback(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
extern void PIOS_COM_LinkComPair(uint32_t com1_id, uint32_t com2_id, bool link_ctrl_line, bool link_baud_rate);
#define COM_AVAILABLE_NONE (0) #define COM_AVAILABLE_NONE (0)
#define COM_AVAILABLE_RX (1 << 0) #define COM_AVAILABLE_RX (1 << 0)
#define COM_AVAILABLE_TX (1 << 1) #define COM_AVAILABLE_TX (1 << 1)

View File

@ -691,7 +691,7 @@ const struct pios_ppm_out_cfg pios_flexi_ppm_out_cfg = {
/* /*
* SERIAL USART * SERIAL USART
*/ */
static const struct pios_usart_cfg pios_usart_serial_cfg = { static const struct pios_usart_cfg pios_usart_main_cfg = {
.regs = USART1, .regs = USART1,
.init = { .init = {
.USART_BaudRate = 57600, .USART_BaudRate = 57600,
@ -727,7 +727,7 @@ static const struct pios_usart_cfg pios_usart_serial_cfg = {
}, },
}; };
static const struct pios_usart_cfg pios_usart_telem_flexi_cfg = { static const struct pios_usart_cfg pios_usart_flexi_cfg = {
.regs = USART3, .regs = USART3,
.init = { .init = {
.USART_BaudRate = 57600, .USART_BaudRate = 57600,

View File

@ -56,6 +56,8 @@ uint32_t sweep_steps2 = 100; // * 5 mS -> 500 mS
//////////////////////////////////////// ////////////////////////////////////////
uint8_t tempcount = 0; uint8_t tempcount = 0;
extern uint32_t pios_com_telem_usb_id;
/* Extern variables ----------------------------------------------------------*/ /* Extern variables ----------------------------------------------------------*/
DFUStates DeviceState; DFUStates DeviceState;
int16_t status = 0; int16_t status = 0;
@ -211,7 +213,7 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count)
uint8_t processRX() uint8_t processRX()
{ {
if (PIOS_COM_MSG_Receive(PIOS_COM_TELEM_USB, mReceive_Buffer, sizeof(mReceive_Buffer))) { if (PIOS_COM_MSG_Receive(pios_com_telem_usb_id, mReceive_Buffer, sizeof(mReceive_Buffer))) {
processComand(mReceive_Buffer); processComand(mReceive_Buffer);
} }
return TRUE; return TRUE;
@ -219,5 +221,5 @@ uint8_t processRX()
int32_t platform_senddata(const uint8_t *msg, uint16_t msg_len) int32_t platform_senddata(const uint8_t *msg, uint16_t msg_len)
{ {
return PIOS_COM_MSG_Send(PIOS_COM_TELEM_USB, msg, msg_len); return PIOS_COM_MSG_Send(pios_com_telem_usb_id, msg, msg_len);
} }

View File

@ -31,7 +31,7 @@ override USE_DSP_LIB := NO
MODULES += RadioComBridge MODULES += RadioComBridge
# List of optional modules to include # List of optional modules to include
OPTMODULES = ComUsbBridge OPTMODULES =
# List C source files here (C dependencies are automatically generated). # List C source files here (C dependencies are automatically generated).
# Use file-extension c for "c-only"-files # Use file-extension c for "c-only"-files

View File

@ -146,26 +146,20 @@
/* #define PIOS_QUATERNION_STABILIZATION */ /* #define PIOS_QUATERNION_STABILIZATION */
/* Performance counters */ /* Performance counters */
#define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 1995998 #define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 1995998
/* Alarm Thresholds */ /* Alarm Thresholds */
#define HEAP_LIMIT_WARNING 220 #define HEAP_LIMIT_WARNING 220
#define HEAP_LIMIT_CRITICAL 40 #define HEAP_LIMIT_CRITICAL 40
#define IRQSTACK_LIMIT_WARNING 100 #define IRQSTACK_LIMIT_WARNING 100
#define IRQSTACK_LIMIT_CRITICAL 60 #define IRQSTACK_LIMIT_CRITICAL 60
#define CPULOAD_LIMIT_WARNING 85 #define CPULOAD_LIMIT_WARNING 85
#define CPULOAD_LIMIT_CRITICAL 95 #define CPULOAD_LIMIT_CRITICAL 95
/* Task stack sizes */ /* Task stack sizes */
#define PIOS_ACTUATOR_STACK_SIZE 1020
#define PIOS_MANUAL_STACK_SIZE 724
#define PIOS_SYSTEM_STACK_SIZE 460
#define PIOS_STABILIZATION_STACK_SIZE 524
#define PIOS_TELEM_STACK_SIZE 800
#define PIOS_EVENTDISPATCHER_STACK_SIZE 130
/* This can't be too high to stop eventdispatcher thread overflowing */ /* This can't be too high to stop eventdispatcher thread overflowing */
#define PIOS_EVENTDISAPTCHER_QUEUE 10 #define PIOS_EVENTDISAPTCHER_QUEUE 10
#endif /* PIOS_CONFIG_H */ #endif /* PIOS_CONFIG_H */
/** /**

View File

@ -48,43 +48,44 @@
*/ */
#include "../board_hw_defs.c" #include "../board_hw_defs.c"
#define PIOS_COM_TELEM_USB_RX_BUF_LEN 256 #define PIOS_COM_TELEM_USB_RX_BUF_LEN 128
#define PIOS_COM_TELEM_USB_TX_BUF_LEN 256 #define PIOS_COM_TELEM_USB_TX_BUF_LEN 128
#define PIOS_COM_TELEM_VCP_RX_BUF_LEN 256 #define PIOS_COM_TELEM_VCP_RX_BUF_LEN 128
#define PIOS_COM_TELEM_VCP_TX_BUF_LEN 256 #define PIOS_COM_TELEM_VCP_TX_BUF_LEN 128
#define PIOS_COM_RFM22B_RF_RX_BUF_LEN 256 #define PIOS_COM_RFM22B_RF_RX_BUF_LEN 128
#define PIOS_COM_RFM22B_RF_TX_BUF_LEN 256 #define PIOS_COM_RFM22B_RF_TX_BUF_LEN 128
#define PIOS_COM_TELEM_RX_BUF_LEN 256 #define PIOS_COM_TELEM_RX_BUF_LEN 128
#define PIOS_COM_TELEM_TX_BUF_LEN 256 #define PIOS_COM_TELEM_TX_BUF_LEN 128
uint32_t pios_com_telem_usb_id = 0; uint32_t pios_com_hid_id = 0;
uint32_t pios_com_telem_vcp_id = 0; uint32_t pios_com_vcp_id = 0;
uint32_t pios_com_telem_uart_main_id = 0; uint32_t pios_com_main_id = 0;
uint32_t pios_com_telem_uart_flexi_id = 0; uint32_t pios_com_flexi_id = 0;
uint32_t pios_com_telemetry_id = 0; uint32_t pios_com_bridge_id = 0;
uint32_t pios_com_bridge_id = 0; uint32_t pios_com_gcs_id = 0;
uint32_t pios_com_vcp_id = 0; uint32_t pios_com_gcs_out_id = 0;
#if defined(PIOS_INCLUDE_PPM) #if defined(PIOS_INCLUDE_PPM)
uint32_t pios_ppm_rcvr_id = 0; uint32_t pios_ppm_rcvr_id = 0;
#endif #endif
#if defined(PIOS_INCLUDE_PPM_OUT) #if defined(PIOS_INCLUDE_PPM_OUT)
uint32_t pios_ppm_out_id = 0; uint32_t pios_ppm_out_id = 0;
#endif #endif
#if defined(PIOS_INCLUDE_RFM22B) #if defined(PIOS_INCLUDE_RFM22B)
#include <pios_rfm22b_com.h> #include <pios_rfm22b_com.h>
uint32_t pios_rfm22b_id = 0; uint32_t pios_rfm22b_id = 0;
uint32_t pios_com_rfm22b_id = 0; uint32_t pios_com_pri_radio_id = 0;
uint32_t pios_com_radio_id = 0; uint32_t pios_com_aux_radio_id = 0;
uint32_t pios_com_pri_radio_out_id = 0;
uint32_t pios_com_aux_radio_out_id = 0;
#endif #endif
uintptr_t pios_uavo_settings_fs_id; uintptr_t pios_uavo_settings_fs_id;
uintptr_t pios_user_fs_id = 0; uintptr_t pios_user_fs_id = 0;
uint8_t servo_count = 0; static uint8_t servo_count = 0;
/* /*
* Setup a com port based on the passed cfg, driver and buffer sizes. * Setup a com port based on the passed cfg, driver and buffer sizes.
@ -188,6 +189,22 @@ void PIOS_Board_Init(void)
OPLinkStatusInitialize(); OPLinkStatusInitialize();
#endif /* PIOS_INCLUDE_RFM22B */ #endif /* PIOS_INCLUDE_RFM22B */
/* Retrieve the settings object. */
OPLinkSettingsData oplinkSettings;
OPLinkSettingsGet(&oplinkSettings);
/* Determine the modem protocols */
bool is_coordinator = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPLINKCOORDINATOR);
bool openlrs = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPENLRS);
bool ppm_only = (oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL);
bool data_mode = ((oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATA) ||
(oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATAANDCONTROL));
bool is_enabled = ((oplinkSettings.Protocol != OPLINKSETTINGS_PROTOCOL_DISABLED) &&
((oplinkSettings.MaxRFPower != OPLINKSETTINGS_MAXRFPOWER_0) || openlrs));
bool ppm_mode = ((oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL) ||
(oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATAANDCONTROL));
bool servo_main = false;
bool servo_flexi = false;
#if defined(PIOS_INCLUDE_TIM) #if defined(PIOS_INCLUDE_TIM)
/* Set up pulse timers */ /* Set up pulse timers */
@ -229,7 +246,7 @@ void PIOS_Board_Init(void)
uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_USB_TX_BUF_LEN);
PIOS_Assert(rx_buffer); PIOS_Assert(rx_buffer);
PIOS_Assert(tx_buffer); PIOS_Assert(tx_buffer);
if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, if (PIOS_COM_Init(&pios_com_hid_id, &pios_usb_hid_com_driver, pios_usb_hid_id,
rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN,
tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) {
PIOS_Assert(0); PIOS_Assert(0);
@ -247,7 +264,7 @@ void PIOS_Board_Init(void)
uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_VCP_TX_BUF_LEN); uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_VCP_TX_BUF_LEN);
PIOS_Assert(rx_buffer); PIOS_Assert(rx_buffer);
PIOS_Assert(tx_buffer); PIOS_Assert(tx_buffer);
if (PIOS_COM_Init(&pios_com_telem_vcp_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id, if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id,
rx_buffer, PIOS_COM_TELEM_VCP_RX_BUF_LEN, rx_buffer, PIOS_COM_TELEM_VCP_RX_BUF_LEN,
tx_buffer, PIOS_COM_TELEM_VCP_TX_BUF_LEN)) { tx_buffer, PIOS_COM_TELEM_VCP_TX_BUF_LEN)) {
PIOS_Assert(0); PIOS_Assert(0);
@ -256,40 +273,40 @@ void PIOS_Board_Init(void)
#endif #endif
// Configure the main port // Configure the main port
OPLinkSettingsData oplinkSettings; uint32_t mainComSpeed = 0;
OPLinkSettingsGet(&oplinkSettings); switch (oplinkSettings.MainComSpeed) {
bool is_coordinator = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPLINKCOORDINATOR); case OPLINKSETTINGS_MAINCOMSPEED_4800:
bool openlrs = (oplinkSettings.Protocol == OPLINKSETTINGS_PROTOCOL_OPENLRS); mainComSpeed = 4800;
bool ppm_only = (oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL); break;
bool data_mode = ((oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATA) || case OPLINKSETTINGS_MAINCOMSPEED_9600:
(oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATAANDCONTROL)); mainComSpeed = 9600;
bool is_enabled = ((oplinkSettings.Protocol != OPLINKSETTINGS_PROTOCOL_DISABLED) && break;
((oplinkSettings.MaxRFPower != OPLINKSETTINGS_MAXRFPOWER_0) || openlrs)); case OPLINKSETTINGS_MAINCOMSPEED_19200:
bool ppm_mode = ((oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL) || mainComSpeed = 19200;
(oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATAANDCONTROL)); break;
bool servo_main = false; case OPLINKSETTINGS_MAINCOMSPEED_38400:
bool servo_flexi = false; mainComSpeed = 38400;
break;
case OPLINKSETTINGS_MAINCOMSPEED_57600:
mainComSpeed = 57600;
break;
case OPLINKSETTINGS_MAINCOMSPEED_115200:
mainComSpeed = 115200;
break;
case OPLINKSETTINGS_MAINCOMSPEED_DISABLED:
break;
}
switch (oplinkSettings.MainPort) { switch (oplinkSettings.MainPort) {
case OPLINKSETTINGS_MAINPORT_TELEMETRY: case OPLINKSETTINGS_MAINPORT_TELEMETRY:
case OPLINKSETTINGS_MAINPORT_SERIAL: case OPLINKSETTINGS_MAINPORT_SERIAL:
{
/* Configure the main port for uart serial */
#ifndef PIOS_RFM22B_DEBUG_ON_TELEM #ifndef PIOS_RFM22B_DEBUG_ON_TELEM
PIOS_Board_configure_com(&pios_usart_serial_cfg, PIOS_Board_configure_com(&pios_usart_main_cfg,
PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN, PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN,
&pios_usart_com_driver, &pios_com_telem_uart_main_id); &pios_usart_com_driver, &pios_com_main_id);
PIOS_COM_ChangeBaud(pios_com_main_id, mainComSpeed);
PIOS_COM_TELEMETRY = PIOS_COM_TELEM_UART_MAIN; #endif /* !PIOS_RFM22B_DEBUG_ON_TELEM */
#endif
break;
}
case OPLINKSETTINGS_MAINPORT_COMBRIDGE:
PIOS_Board_configure_com(&pios_usart_serial_cfg,
PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN,
&pios_usart_com_driver, &pios_com_bridge_id);
break; break;
case OPLINKSETTINGS_MAINPORT_PPM: case OPLINKSETTINGS_MAINPORT_PPM:
{
#if defined(PIOS_INCLUDE_PPM) #if defined(PIOS_INCLUDE_PPM)
/* PPM input is configured on the coordinator modem and output on the remote modem. */ /* PPM input is configured on the coordinator modem and output on the remote modem. */
if (is_coordinator) { if (is_coordinator) {
@ -308,35 +325,47 @@ void PIOS_Board_Init(void)
#endif /* PIOS_INCLUDE_PPM_OUT */ #endif /* PIOS_INCLUDE_PPM_OUT */
#endif /* PIOS_INCLUDE_PPM */ #endif /* PIOS_INCLUDE_PPM */
break; break;
}
case OPLINKSETTINGS_MAINPORT_PWM: case OPLINKSETTINGS_MAINPORT_PWM:
servo_main = true; servo_main = true;
break; default:
case OPLINKSETTINGS_MAINPORT_DISABLED:
break; break;
} }
// Configure the flexi port // Configure the flexi port
uint32_t flexiComSpeed = 0;
switch (oplinkSettings.FlexiComSpeed) {
case OPLINKSETTINGS_FLEXICOMSPEED_4800:
flexiComSpeed = 4800;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_9600:
flexiComSpeed = 9600;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_19200:
flexiComSpeed = 19200;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_38400:
flexiComSpeed = 38400;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_57600:
flexiComSpeed = 57600;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_115200:
flexiComSpeed = 115200;
break;
case OPLINKSETTINGS_FLEXICOMSPEED_DISABLED:
break;
}
switch (oplinkSettings.FlexiPort) { switch (oplinkSettings.FlexiPort) {
case OPLINKSETTINGS_FLEXIPORT_TELEMETRY: case OPLINKSETTINGS_FLEXIPORT_TELEMETRY:
case OPLINKSETTINGS_FLEXIPORT_SERIAL: case OPLINKSETTINGS_FLEXIPORT_SERIAL:
{ #ifndef PIOS_RFM22B_DEBUG_ON_TELEM
/* Configure the flexi port as uart serial */ PIOS_Board_configure_com(&pios_usart_flexi_cfg,
PIOS_Board_configure_com(&pios_usart_telem_flexi_cfg,
PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN, PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN,
&pios_usart_com_driver, &pios_usart_com_driver, &pios_com_flexi_id);
&pios_com_telem_uart_flexi_id); PIOS_COM_ChangeBaud(pios_com_flexi_id, flexiComSpeed);
PIOS_COM_TELEMETRY = PIOS_COM_TELEM_UART_FLEXI; #endif /* !PIOS_RFM22B_DEBUG_ON_TELEM */
break;
}
case OPLINKSETTINGS_FLEXIPORT_COMBRIDGE:
PIOS_Board_configure_com(&pios_usart_telem_flexi_cfg,
PIOS_COM_TELEM_RX_BUF_LEN, PIOS_COM_TELEM_TX_BUF_LEN,
&pios_usart_com_driver,
&pios_com_bridge_id);
break; break;
case OPLINKSETTINGS_FLEXIPORT_PPM: case OPLINKSETTINGS_FLEXIPORT_PPM:
{
#if defined(PIOS_INCLUDE_PPM) #if defined(PIOS_INCLUDE_PPM)
/* PPM input is configured on the coordinator modem and output on the remote modem. */ /* PPM input is configured on the coordinator modem and output on the remote modem. */
if (is_coordinator) { if (is_coordinator) {
@ -346,31 +375,22 @@ void PIOS_Board_Init(void)
if (PIOS_RCVR_Init(&pios_ppm_rcvr_id, &pios_ppm_rcvr_driver, pios_ppm_id)) { if (PIOS_RCVR_Init(&pios_ppm_rcvr_id, &pios_ppm_rcvr_driver, pios_ppm_id)) {
PIOS_Assert(0); PIOS_Assert(0);
} }
} else { }
// For some reason, PPM output on the flexi port doesn't work.
#if defined(PIOS_INCLUDE_PPM_OUT)
else {
PIOS_PPM_Out_Init(&pios_ppm_out_id, &pios_flexi_ppm_out_cfg); PIOS_PPM_Out_Init(&pios_ppm_out_id, &pios_flexi_ppm_out_cfg);
} }
#endif /* PIOS_INCLUDE_PPM_OUT */
#endif /* PIOS_INCLUDE_PPM */ #endif /* PIOS_INCLUDE_PPM */
break; break;
}
case OPLINKSETTINGS_FLEXIPORT_PWM: case OPLINKSETTINGS_FLEXIPORT_PWM:
servo_flexi = true; servo_flexi = true;
break; default:
case OPLINKSETTINGS_FLEXIPORT_DISABLED:
break;
}
// Configure the USB VCP port
switch (oplinkSettings.VCPPort) {
case OPLINKSETTINGS_VCPPORT_SERIAL:
PIOS_COM_TELEMETRY = PIOS_COM_TELEM_USB_VCP;
break;
case OPLINKSETTINGS_VCPPORT_COMBRIDGE:
PIOS_COM_VCP = PIOS_COM_TELEM_USB_VCP;
break;
case OPLINKSETTINGS_VCPPORT_DISABLED:
break; break;
} }
/* Configure the PWM servo outputs. */
#if defined(PIOS_INCLUDE_SERVO) #if defined(PIOS_INCLUDE_SERVO)
if (servo_main) { if (servo_main) {
if (servo_flexi) { if (servo_flexi) {
@ -429,33 +449,53 @@ void PIOS_Board_Init(void)
uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_RFM22B_RF_TX_BUF_LEN); uint8_t *tx_buffer = (uint8_t *)pios_malloc(PIOS_COM_RFM22B_RF_TX_BUF_LEN);
PIOS_Assert(rx_buffer); PIOS_Assert(rx_buffer);
PIOS_Assert(tx_buffer); PIOS_Assert(tx_buffer);
if (PIOS_COM_Init(&pios_com_rfm22b_id, &pios_rfm22b_com_driver, pios_rfm22b_id, if (PIOS_COM_Init(&pios_com_pri_radio_id, &pios_rfm22b_com_driver, pios_rfm22b_id,
rx_buffer, PIOS_COM_RFM22B_RF_RX_BUF_LEN, rx_buffer, PIOS_COM_RFM22B_RF_RX_BUF_LEN,
tx_buffer, PIOS_COM_RFM22B_RF_TX_BUF_LEN)) { tx_buffer, PIOS_COM_RFM22B_RF_TX_BUF_LEN)) {
PIOS_Assert(0); PIOS_Assert(0);
} }
// Set the RF data rate on the modem to ~2X the selected buad rate because the modem is half duplex. // Initialize the aux radio com interface
uint8_t *auxrx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_RX_BUF_LEN);
uint8_t *auxtx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_TX_BUF_LEN);
PIOS_Assert(auxrx_buffer);
PIOS_Assert(auxtx_buffer);
if (PIOS_COM_Init(&pios_com_aux_radio_id, &pios_rfm22b_aux_com_driver, pios_rfm22b_id,
auxrx_buffer, PIOS_COM_TELEM_RX_BUF_LEN,
auxtx_buffer, PIOS_COM_TELEM_TX_BUF_LEN)) {
PIOS_Assert(0);
}
// Set the modem (over the air) datarate.
enum rfm22b_datarate datarate = RFM22_datarate_64000; enum rfm22b_datarate datarate = RFM22_datarate_64000;
switch (oplinkSettings.ComSpeed) { switch (oplinkSettings.AirDataRate) {
case OPLINKSETTINGS_COMSPEED_4800: case OPLINKSETTINGS_AIRDATARATE_9600:
datarate = RFM22_datarate_9600; datarate = RFM22_datarate_9600;
break; break;
case OPLINKSETTINGS_COMSPEED_9600: case OPLINKSETTINGS_AIRDATARATE_19200:
datarate = RFM22_datarate_19200; datarate = RFM22_datarate_19200;
break; break;
case OPLINKSETTINGS_COMSPEED_19200: case OPLINKSETTINGS_AIRDATARATE_32000:
datarate = RFM22_datarate_32000; datarate = RFM22_datarate_32000;
break; break;
case OPLINKSETTINGS_COMSPEED_38400: case OPLINKSETTINGS_AIRDATARATE_57600:
datarate = RFM22_datarate_57600;
break;
case OPLINKSETTINGS_AIRDATARATE_64000:
datarate = RFM22_datarate_64000; datarate = RFM22_datarate_64000;
break; break;
case OPLINKSETTINGS_COMSPEED_57600: case OPLINKSETTINGS_AIRDATARATE_100000:
datarate = RFM22_datarate_100000; datarate = RFM22_datarate_100000;
break; break;
case OPLINKSETTINGS_COMSPEED_115200: case OPLINKSETTINGS_AIRDATARATE_128000:
datarate = RFM22_datarate_128000;
break;
case OPLINKSETTINGS_AIRDATARATE_192000:
datarate = RFM22_datarate_192000; datarate = RFM22_datarate_192000;
break; break;
case OPLINKSETTINGS_AIRDATARATE_256000:
datarate = RFM22_datarate_256000;
break;
} }
/* Set the modem Tx power level */ /* Set the modem Tx power level */
@ -499,61 +539,92 @@ void PIOS_Board_Init(void)
if (ppm_mode || (ppm_only && !is_coordinator)) { if (ppm_mode || (ppm_only && !is_coordinator)) {
PIOS_RFM22B_SetPPMCallback(pios_rfm22b_id, PIOS_Board_PPM_callback, 0); PIOS_RFM22B_SetPPMCallback(pios_rfm22b_id, PIOS_Board_PPM_callback, 0);
} }
// Reinitialize the modem to affect the changes.
PIOS_RFM22B_Reinit(pios_rfm22b_id);
uint8_t oplinksettings_radioaux;
OPLinkSettingsRadioAuxStreamGet(&oplinksettings_radioaux);
switch (oplinksettings_radioaux) {
case OPLINKSETTINGS_RADIOAUXSTREAM_DISABLED:
break;
case OPLINKSETTINGS_RADIOAUXSTREAM_COMBRIDGE:
{
uint8_t *auxrx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_RX_BUF_LEN);
uint8_t *auxtx_buffer = (uint8_t *)pios_malloc(PIOS_COM_TELEM_TX_BUF_LEN);
PIOS_Assert(auxrx_buffer);
PIOS_Assert(auxtx_buffer);
if (PIOS_COM_Init(&pios_com_bridge_id, &pios_rfm22b_aux_com_driver, pios_rfm22b_id,
auxrx_buffer, PIOS_COM_TELEM_RX_BUF_LEN,
auxtx_buffer, PIOS_COM_TELEM_TX_BUF_LEN)) {
PIOS_Assert(0);
}
}
}
} // openlrs } // openlrs
} else { } else {
oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_DISABLED; oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_DISABLED;
} }
// Configure the primary radio stream destination.
switch (oplinkSettings.RadioPriStream) {
case OPLINKSETTINGS_RADIOPRISTREAM_DISABLED:
break;
case OPLINKSETTINGS_RADIOPRISTREAM_HID:
// HID is always connected to GCS
pios_com_gcs_id = pios_com_hid_id;
pios_com_gcs_out_id = pios_com_pri_radio_id;
break;
case OPLINKSETTINGS_RADIOPRISTREAM_MAIN:
// Is the main port configured for telemetry (GCS)?
if (oplinkSettings.MainPort == OPLINKSETTINGS_MAINPORT_TELEMETRY) {
pios_com_gcs_id = pios_com_main_id;
pios_com_gcs_out_id = pios_com_pri_radio_id;
} else {
PIOS_COM_LinkComPair(pios_com_pri_radio_id, pios_com_main_id, false, false);
}
break;
case OPLINKSETTINGS_RADIOPRISTREAM_FLEXI:
// Is the flexi port configured for telemetry (GCS)?
if (oplinkSettings.FlexiPort == OPLINKSETTINGS_FLEXIPORT_TELEMETRY) {
pios_com_gcs_id = pios_com_flexi_id;
pios_com_gcs_out_id = pios_com_pri_radio_id;
} else {
PIOS_COM_LinkComPair(pios_com_pri_radio_id, pios_com_flexi_id, false, false);
}
break;
case OPLINKSETTINGS_RADIOPRISTREAM_VCP:
// VCP is never connected to GCS
PIOS_COM_LinkComPair(pios_com_pri_radio_id, pios_com_vcp_id, false, false);
break;
}
// Configure the Auxiliary radio stream destination.
switch (oplinkSettings.RadioAuxStream) {
case OPLINKSETTINGS_RADIOAUXSTREAM_DISABLED:
break;
case OPLINKSETTINGS_RADIOAUXSTREAM_HID:
// HID is always connected to GCS
pios_com_gcs_id = pios_com_hid_id;
pios_com_gcs_out_id = pios_com_aux_radio_id;
break;
case OPLINKSETTINGS_RADIOAUXSTREAM_MAIN:
// Is the main port configured for telemetry (GCS)?
if (oplinkSettings.MainPort == OPLINKSETTINGS_MAINPORT_TELEMETRY) {
pios_com_gcs_id = pios_com_main_id;
pios_com_gcs_out_id = pios_com_aux_radio_id;
} else {
PIOS_COM_LinkComPair(pios_com_aux_radio_id, pios_com_main_id, false, false);
}
break;
case OPLINKSETTINGS_RADIOAUXSTREAM_FLEXI:
// Is the flexi port configured for telemetry (GCS)?
if (oplinkSettings.FlexiPort == OPLINKSETTINGS_FLEXIPORT_TELEMETRY) {
pios_com_gcs_id = pios_com_flexi_id;
pios_com_gcs_out_id = pios_com_aux_radio_id;
} else {
PIOS_COM_LinkComPair(pios_com_aux_radio_id, pios_com_flexi_id, false, false);
}
break;
case OPLINKSETTINGS_RADIOAUXSTREAM_VCP:
// VCP is never connected to GCS
PIOS_COM_LinkComPair(pios_com_aux_radio_id, pios_com_vcp_id, false, false);
break;
}
// Configure the VCP COM bridge
switch (oplinkSettings.VCPBridge) {
case OPLINKSETTINGS_VCPBRIDGE_MAIN:
PIOS_COM_LinkComPair(pios_com_vcp_id, pios_com_main_id, true, true);
break;
case OPLINKSETTINGS_VCPBRIDGE_FLEXI:
PIOS_COM_LinkComPair(pios_com_vcp_id, pios_com_flexi_id, true, true);
break;
case OPLINKSETTINGS_VCPBRIDGE_DISABLED:
break;
}
// Update the object // Update the object
OPLinkStatusSet(&oplinkStatus); OPLinkStatusSet(&oplinkStatus);
// Update the com baud rate.
uint32_t comBaud = 9600;
switch (oplinkSettings.ComSpeed) {
case OPLINKSETTINGS_COMSPEED_4800:
comBaud = 4800;
break;
case OPLINKSETTINGS_COMSPEED_9600:
comBaud = 9600;
break;
case OPLINKSETTINGS_COMSPEED_19200:
comBaud = 19200;
break;
case OPLINKSETTINGS_COMSPEED_38400:
comBaud = 38400;
break;
case OPLINKSETTINGS_COMSPEED_57600:
comBaud = 57600;
break;
case OPLINKSETTINGS_COMSPEED_115200:
comBaud = 115200;
break;
}
if (PIOS_COM_TELEMETRY) {
PIOS_COM_ChangeBaud(PIOS_COM_TELEMETRY, comBaud);
}
/* Remap AFIO pin */ /* Remap AFIO pin */
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);

View File

@ -73,11 +73,10 @@
#define PIOS_WDG_REGISTER BKP_DR4 #define PIOS_WDG_REGISTER BKP_DR4
#define PIOS_WDG_TELEMETRYTX 0x0001 #define PIOS_WDG_TELEMETRYTX 0x0001
#define PIOS_WDG_TELEMETRYRX 0x0002 #define PIOS_WDG_TELEMETRYRX 0x0002
#define PIOS_WDG_RADIOTX 0x0004 #define PIOS_WDG_TELEMRADIOTX 0x0004
#define PIOS_WDG_RADIORX 0x0008 #define PIOS_WDG_TELEMRADIORX 0x0008
#define PIOS_WDG_RFM22B 0x000f #define PIOS_WDG_RFM22B 0x000f
#define PIOS_WDG_PPMINPUT 0x0010 #define PIOS_WDG_PPMINPUT 0x0010
#define PIOS_WDG_SERIALRX 0x0020
// ------------------------ // ------------------------
// TELEMETRY // TELEMETRY
@ -174,30 +173,40 @@ extern uint32_t pios_i2c_flexi_adapter_id;
// ------------------------- // -------------------------
#define PIOS_COM_MAX_DEVS 5 #define PIOS_COM_MAX_DEVS 5
extern uint32_t pios_com_telem_usb_id; // The direct com ports
extern uint32_t pios_com_telem_vcp_id; extern uint32_t pios_com_hid_id;
extern uint32_t pios_com_telem_uart_main_id;
extern uint32_t pios_com_telem_uart_flexi_id;
extern uint32_t pios_com_telemetry_id;
extern uint32_t pios_com_rfm22b_id;
extern uint32_t pios_com_radio_id;
extern uint32_t pios_com_bridge_id;
extern uint32_t pios_com_vcp_id; extern uint32_t pios_com_vcp_id;
extern uint32_t pios_com_main_id;
extern uint32_t pios_com_flexi_id;
extern uint32_t pios_com_pri_radio_id;
extern uint32_t pios_com_aux_radio_id;
// The port that the GCS is connected to
extern uint32_t pios_com_gcs_id;
// The destination port from the GCS port
extern uint32_t pios_com_gcs_out_id;
// The destination port from the VCP com bridge
extern uint32_t pios_com_bridge_id;
// The destination port for the primary radio port
extern uint32_t pios_com_pri_radio_out_id;
// The destination port for the auxiliary radio port.
extern uint32_t pios_com_aux_radio_out_id;
// The PPM IDs
extern uint32_t pios_ppm_rcvr_id; extern uint32_t pios_ppm_rcvr_id;
extern uint32_t pios_ppm_out_id; extern uint32_t pios_ppm_out_id;
#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_id) #define PIOS_COM_HID (pios_com_hid_id)
#define PIOS_COM_TELEM_USB PIOS_COM_TELEM_USB_HID #define PIOS_COM_VCP (pios_com_vcp_id)
#define PIOS_COM_TELEM_USB_VCP (pios_com_telem_vcp_id) #define PIOS_COM_MAIN (pios_com_main_id)
#define PIOS_COM_VCP (pios_com_vcp_id) #define PIOS_COM_FLEXI (pios_com_flexi_id)
#define PIOS_COM_TELEM_UART_MAIN (pios_com_telem_uart_main_id) #define PIOS_COM_PRI_RADIO (pios_com_pri_radio_id)
#define PIOS_COM_TELEM_UART_FLEXI (pios_com_telem_uart_flexi_id) #define PIOS_COM_AUX_RADIO (pios_com_aux_radio_id)
#define PIOS_COM_TELEMETRY (pios_com_telemetry_id) #define PIOS_COM_PRI_RADIO_OUT (pios_com_pri_radio_out_id)
#define PIOS_COM_RFM22B (pios_com_rfm22b_id) #define PIOS_COM_AUX_RADIO_OUT (pios_com_aux_radio_out_id)
#define PIOS_COM_RADIO (pios_com_radio_id) #define PIOS_COM_GCS (pios_com_gcs_id)
#define PIOS_COM_BRIDGE (pios_com_bridge_id) #define PIOS_COM_GCS_OUT (pios_com_gcs_out_id)
#define PIOS_PPM_RECEIVER (pios_ppm_rcvr_id) #define PIOS_COM_BRIDGE (pios_com_bridge_id)
#define PIOS_PPM_OUTPUT (pios_ppm_out_id) #define PIOS_PPM_RECEIVER (pios_ppm_rcvr_id)
#define RFM22_DEBUG 1 #define PIOS_PPM_OUTPUT (pios_ppm_out_id)
#define RFM22_DEBUG 1
// ------------------------- // -------------------------
// ADC // ADC

View File

@ -931,27 +931,36 @@ void PIOS_Board_Init(void)
oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_ENABLED; oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_ENABLED;
// Set the RF data rate on the modem to ~2X the selected buad rate because the modem is half duplex. // Set the modem (over the air) datarate.
enum rfm22b_datarate datarate = RFM22_datarate_64000; enum rfm22b_datarate datarate = RFM22_datarate_64000;
switch (oplinkSettings.ComSpeed) { switch (oplinkSettings.AirDataRate) {
case OPLINKSETTINGS_COMSPEED_4800: case OPLINKSETTINGS_AIRDATARATE_9600:
datarate = RFM22_datarate_9600; datarate = RFM22_datarate_9600;
break; break;
case OPLINKSETTINGS_COMSPEED_9600: case OPLINKSETTINGS_AIRDATARATE_19200:
datarate = RFM22_datarate_19200; datarate = RFM22_datarate_19200;
break; break;
case OPLINKSETTINGS_COMSPEED_19200: case OPLINKSETTINGS_AIRDATARATE_32000:
datarate = RFM22_datarate_32000; datarate = RFM22_datarate_32000;
break; break;
case OPLINKSETTINGS_COMSPEED_38400: case OPLINKSETTINGS_AIRDATARATE_57600:
datarate = RFM22_datarate_57600;
break;
case OPLINKSETTINGS_AIRDATARATE_64000:
datarate = RFM22_datarate_64000; datarate = RFM22_datarate_64000;
break; break;
case OPLINKSETTINGS_COMSPEED_57600: case OPLINKSETTINGS_AIRDATARATE_100000:
datarate = RFM22_datarate_100000; datarate = RFM22_datarate_100000;
break; break;
case OPLINKSETTINGS_COMSPEED_115200: case OPLINKSETTINGS_AIRDATARATE_128000:
datarate = RFM22_datarate_128000;
break;
case OPLINKSETTINGS_AIRDATARATE_192000:
datarate = RFM22_datarate_192000; datarate = RFM22_datarate_192000;
break; break;
case OPLINKSETTINGS_AIRDATARATE_256000:
datarate = RFM22_datarate_256000;
break;
} }
/* Set the radio configuration parameters. */ /* Set the radio configuration parameters. */

View File

@ -861,27 +861,36 @@ void PIOS_Board_Init(void)
oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_ENABLED; oplinkStatus.LinkState = OPLINKSTATUS_LINKSTATE_ENABLED;
// Set the RF data rate on the modem to ~2X the selected buad rate because the modem is half duplex. // Set the modem (over the air) datarate.
enum rfm22b_datarate datarate = RFM22_datarate_64000; enum rfm22b_datarate datarate = RFM22_datarate_64000;
switch (oplinkSettings.ComSpeed) { switch (oplinkSettings.AirDataRate) {
case OPLINKSETTINGS_COMSPEED_4800: case OPLINKSETTINGS_AIRDATARATE_9600:
datarate = RFM22_datarate_9600; datarate = RFM22_datarate_9600;
break; break;
case OPLINKSETTINGS_COMSPEED_9600: case OPLINKSETTINGS_AIRDATARATE_19200:
datarate = RFM22_datarate_19200; datarate = RFM22_datarate_19200;
break; break;
case OPLINKSETTINGS_COMSPEED_19200: case OPLINKSETTINGS_AIRDATARATE_32000:
datarate = RFM22_datarate_32000; datarate = RFM22_datarate_32000;
break; break;
case OPLINKSETTINGS_COMSPEED_38400: case OPLINKSETTINGS_AIRDATARATE_57600:
datarate = RFM22_datarate_57600;
break;
case OPLINKSETTINGS_AIRDATARATE_64000:
datarate = RFM22_datarate_64000; datarate = RFM22_datarate_64000;
break; break;
case OPLINKSETTINGS_COMSPEED_57600: case OPLINKSETTINGS_AIRDATARATE_100000:
datarate = RFM22_datarate_100000; datarate = RFM22_datarate_100000;
break; break;
case OPLINKSETTINGS_COMSPEED_115200: case OPLINKSETTINGS_AIRDATARATE_128000:
datarate = RFM22_datarate_128000;
break;
case OPLINKSETTINGS_AIRDATARATE_192000:
datarate = RFM22_datarate_192000; datarate = RFM22_datarate_192000;
break; break;
case OPLINKSETTINGS_AIRDATARATE_256000:
datarate = RFM22_datarate_256000;
break;
} }
/* Set the radio configuration parameters. */ /* Set the radio configuration parameters. */

View File

@ -79,11 +79,14 @@ ConfigOPLinkWidget::ConfigOPLinkWidget(QWidget *parent) : ConfigTaskWidget(paren
addWidgetBinding("OPLinkSettings", "MinChannel", m_oplink->MinimumChannel); addWidgetBinding("OPLinkSettings", "MinChannel", m_oplink->MinimumChannel);
addWidgetBinding("OPLinkSettings", "MaxChannel", m_oplink->MaximumChannel); addWidgetBinding("OPLinkSettings", "MaxChannel", m_oplink->MaximumChannel);
addWidgetBinding("OPLinkSettings", "MaxRFPower", m_oplink->MaxRFTxPower); addWidgetBinding("OPLinkSettings", "MaxRFPower", m_oplink->MaxRFTxPower);
addWidgetBinding("OPLinkSettings", "ComSpeed", m_oplink->ComSpeed);
addWidgetBinding("OPLinkSettings", "MainPort", m_oplink->MainPort); addWidgetBinding("OPLinkSettings", "MainPort", m_oplink->MainPort);
addWidgetBinding("OPLinkSettings", "FlexiPort", m_oplink->FlexiPort); addWidgetBinding("OPLinkSettings", "FlexiPort", m_oplink->FlexiPort);
addWidgetBinding("OPLinkSettings", "VCPPort", m_oplink->VCPPort); addWidgetBinding("OPLinkSettings", "RadioPriStream", m_oplink->RadioPriStream);
addWidgetBinding("OPLinkSettings", "RadioAuxStream", m_oplink->RadioAuxPort); addWidgetBinding("OPLinkSettings", "RadioAuxStream", m_oplink->RadioAuxStream);
addWidgetBinding("OPLinkSettings", "VCPBridge", m_oplink->VCPBridge);
addWidgetBinding("OPLinkSettings", "MainComSpeed", m_oplink->MainComSpeed);
addWidgetBinding("OPLinkSettings", "FlexiComSpeed", m_oplink->FlexiComSpeed);
addWidgetBinding("OPLinkSettings", "AirDataRate", m_oplink->AirDataRate);
addWidgetBinding("OPLinkSettings", "RFXtalCap", m_oplink->RFXtalCapValue); addWidgetBinding("OPLinkSettings", "RFXtalCap", m_oplink->RFXtalCapValue);
addWidgetBinding("OPLinkSettings", "RFXtalCap", m_oplink->RFXtalCapSlider); addWidgetBinding("OPLinkSettings", "RFXtalCap", m_oplink->RFXtalCapSlider);
@ -121,7 +124,9 @@ ConfigOPLinkWidget::ConfigOPLinkWidget(QWidget *parent) : ConfigTaskWidget(paren
connect(m_oplink->MaximumChannel, SIGNAL(valueChanged(int)), this, SLOT(maxChannelChanged())); connect(m_oplink->MaximumChannel, SIGNAL(valueChanged(int)), this, SLOT(maxChannelChanged()));
connect(m_oplink->MainPort, SIGNAL(currentIndexChanged(int)), this, SLOT(mainPortChanged())); connect(m_oplink->MainPort, SIGNAL(currentIndexChanged(int)), this, SLOT(mainPortChanged()));
connect(m_oplink->FlexiPort, SIGNAL(currentIndexChanged(int)), this, SLOT(flexiPortChanged())); connect(m_oplink->FlexiPort, SIGNAL(currentIndexChanged(int)), this, SLOT(flexiPortChanged()));
connect(m_oplink->VCPPort, SIGNAL(currentIndexChanged(int)), this, SLOT(vcpPortChanged())); connect(m_oplink->RadioPriStream, SIGNAL(currentIndexChanged(int)), this, SLOT(radioPriStreamChanged()));
connect(m_oplink->RadioAuxStream, SIGNAL(currentIndexChanged(int)), this, SLOT(radioAuxStreamChanged()));
connect(m_oplink->VCPBridge, SIGNAL(currentIndexChanged(int)), this, SLOT(vcpBridgeChanged()));
// Connect the Unbind button // Connect the Unbind button
connect(m_oplink->UnbindButton, SIGNAL(released()), this, SLOT(unbind())); connect(m_oplink->UnbindButton, SIGNAL(released()), this, SLOT(unbind()));
@ -203,14 +208,22 @@ void ConfigOPLinkWidget::updateStatus()
void ConfigOPLinkWidget::setPortsVisible(bool visible) void ConfigOPLinkWidget::setPortsVisible(bool visible)
{ {
m_oplink->UartsLabel->setVisible(visible);
m_oplink->MainPort->setVisible(visible); m_oplink->MainPort->setVisible(visible);
m_oplink->MainPortLabel->setVisible(visible); m_oplink->MainPortLabel->setVisible(visible);
m_oplink->FlexiPort->setVisible(visible); m_oplink->FlexiPort->setVisible(visible);
m_oplink->FlexiPortLabel->setVisible(visible); m_oplink->FlexiPortLabel->setVisible(visible);
m_oplink->VCPPort->setVisible(visible); m_oplink->ConnectionsLabel->setVisible(visible);
m_oplink->VCPPortLabel->setVisible(visible); m_oplink->RadioPriStream->setVisible(visible);
m_oplink->RadioAuxPort->setVisible(visible); m_oplink->RadioPriStreamLabel->setVisible(visible);
m_oplink->RadioAuxPortLabel->setVisible(visible); m_oplink->RadioAuxStream->setVisible(visible);
m_oplink->RadioAuxStreamLabel->setVisible(visible);
m_oplink->MainComSpeed->setVisible(visible);
m_oplink->MainComSpeedLabel->setVisible(visible);
m_oplink->FlexiComSpeed->setVisible(visible);
m_oplink->FlexiComSpeedLabel->setVisible(visible);
m_oplink->VCPBridge->setVisible(visible);
m_oplink->VCPBridgeLabel->setVisible(visible);
} }
void ConfigOPLinkWidget::updateInfo() void ConfigOPLinkWidget::updateInfo()
@ -255,30 +268,35 @@ void ConfigOPLinkWidget::updateSettings()
{ {
// qDebug() << "ConfigOPLinkWidget::updateSettings"; // qDebug() << "ConfigOPLinkWidget::updateSettings";
bool is_enabled = !isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_DISABLED); bool is_enabled = !isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_DISABLED);
bool is_coordinator = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPLINKCOORDINATOR); bool is_coordinator = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPLINKCOORDINATOR);
bool is_receiver = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPLINKRECEIVER); bool is_receiver = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPLINKRECEIVER);
bool is_openlrs = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPENLRS); bool is_openlrs = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPENLRS);
bool is_ppm_only = isComboboxOptionSelected(m_oplink->LinkType, OPLinkSettings::LINKTYPE_CONTROL); bool is_ppm_only = isComboboxOptionSelected(m_oplink->LinkType, OPLinkSettings::LINKTYPE_CONTROL);
bool is_main_serial = isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
bool is_main_telem = isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY);
bool is_flexi_serial = isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
bool is_flexi_telem = isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY);
bool is_vcp_main = isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_MAIN);
bool is_vcp_flexi = isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_FLEXI);
bool is_bound = (m_oplink->CoordID->text() != ""); bool is_bound = (m_oplink->CoordID->text() != "");
m_oplink->ComSpeed->setEnabled(is_enabled && !is_ppm_only && !is_openlrs); m_oplink->MainPort->setEnabled(is_enabled || is_vcp_main);
m_oplink->FlexiPort->setEnabled(is_enabled || is_vcp_flexi);
m_oplink->MainComSpeed->setEnabled((is_enabled || is_vcp_main) && !is_ppm_only && !is_openlrs && (is_main_serial || is_main_telem));
m_oplink->FlexiComSpeed->setEnabled((is_enabled || is_vcp_flexi) && !is_ppm_only && !is_openlrs && (is_flexi_serial || is_flexi_telem));
m_oplink->CoordID->setEnabled(is_enabled && is_receiver); m_oplink->CoordID->setEnabled(is_enabled && is_receiver);
m_oplink->UnbindButton->setEnabled(is_enabled && is_bound && !is_coordinator); m_oplink->UnbindButton->setEnabled(is_enabled && is_bound && !is_coordinator);
m_oplink->CustomDeviceID->setEnabled(is_coordinator); m_oplink->CustomDeviceID->setEnabled(is_coordinator);
m_oplink->RadioAuxPort->setEnabled(is_receiver || is_coordinator); m_oplink->RadioPriStream->setEnabled((is_receiver || is_coordinator) && !is_ppm_only);
m_oplink->RadioAuxStream->setEnabled((is_receiver || is_coordinator) && !is_ppm_only);
m_oplink->AirDataRate->setEnabled((is_receiver || is_coordinator) && !is_ppm_only);
m_oplink->RFBand->setEnabled(is_receiver || is_coordinator); m_oplink->RFBand->setEnabled(is_receiver || is_coordinator);
m_oplink->MinimumChannel->setEnabled(is_receiver || is_coordinator); m_oplink->MinimumChannel->setEnabled(is_receiver || is_coordinator);
m_oplink->MaximumChannel->setEnabled(is_receiver || is_coordinator); m_oplink->MaximumChannel->setEnabled(is_receiver || is_coordinator);
enableComboBoxOptionItem(m_oplink->VCPPort, OPLinkSettings::VCPPORT_SERIAL, (is_receiver || is_coordinator));
if (isComboboxOptionSelected(m_oplink->VCPPort, OPLinkSettings::VCPPORT_SERIAL) && !(is_receiver || is_coordinator)) {
setComboboxSelectedOption(m_oplink->VCPPort, OPLinkSettings::VCPPORT_DISABLED);
}
m_oplink->LinkType->setEnabled(is_enabled && !is_openlrs); m_oplink->LinkType->setEnabled(is_enabled && !is_openlrs);
m_oplink->MaxRFTxPower->setEnabled(is_enabled && !is_openlrs); m_oplink->MaxRFTxPower->setEnabled(is_enabled && !is_openlrs);
} }
@ -366,22 +384,28 @@ void ConfigOPLinkWidget::updateFrequencyDisplay()
void ConfigOPLinkWidget::mainPortChanged() void ConfigOPLinkWidget::mainPortChanged()
{ {
switch (getComboboxSelectedOption(m_oplink->MainPort)) { switch (getComboboxSelectedOption(m_oplink->MainPort)) {
case OPLinkSettings::MAINPORT_TELEMETRY:
case OPLinkSettings::MAINPORT_SERIAL:
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY)
|| isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_DISABLED);
}
break;
case OPLinkSettings::MAINPORT_COMBRIDGE:
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_COMBRIDGE)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_DISABLED);
}
break;
case OPLinkSettings::MAINPORT_PPM: case OPLinkSettings::MAINPORT_PPM:
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_PPM)) { case OPLinkSettings::MAINPORT_PWM:
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_DISABLED); case OPLinkSettings::MAINPORT_DISABLED:
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
} }
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_MAIN)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
m_oplink->MainComSpeed->setEnabled(false);
break;
case OPLinkSettings::MAINPORT_TELEMETRY:
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
}
case OPLinkSettings::MAINPORT_SERIAL:
m_oplink->MainComSpeed->setEnabled(true);
break;
default:
break; break;
} }
} }
@ -389,41 +413,161 @@ void ConfigOPLinkWidget::mainPortChanged()
void ConfigOPLinkWidget::flexiPortChanged() void ConfigOPLinkWidget::flexiPortChanged()
{ {
switch (getComboboxSelectedOption(m_oplink->FlexiPort)) { switch (getComboboxSelectedOption(m_oplink->FlexiPort)) {
case OPLinkSettings::FLEXIPORT_TELEMETRY:
case OPLinkSettings::FLEXIPORT_SERIAL:
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY)
|| isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED);
}
break;
case OPLinkSettings::FLEXIPORT_COMBRIDGE:
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_COMBRIDGE)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED);
}
break;
case OPLinkSettings::FLEXIPORT_PPM: case OPLinkSettings::FLEXIPORT_PPM:
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_PPM)) { case OPLinkSettings::FLEXIPORT_PWM:
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED); case OPLinkSettings::FLEXIPORT_DISABLED:
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
} }
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_FLEXI)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
m_oplink->FlexiComSpeed->setEnabled(false);
break;
case OPLinkSettings::FLEXIPORT_TELEMETRY:
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
}
m_oplink->FlexiComSpeed->setEnabled(true);
break;
case OPLinkSettings::FLEXIPORT_SERIAL:
m_oplink->FlexiComSpeed->setEnabled(true);
break;
default:
break; break;
} }
} }
void ConfigOPLinkWidget::vcpPortChanged() void ConfigOPLinkWidget::radioPriStreamChanged()
{ {
bool vcpComBridgeEnabled = isComboboxOptionSelected(m_oplink->VCPPort, OPLinkSettings::VCPPORT_COMBRIDGE); switch (getComboboxSelectedOption(m_oplink->RadioPriStream)) {
case OPLinkSettings::RADIOPRISTREAM_DISABLED:
enableComboBoxOptionItem(m_oplink->MainPort, OPLinkSettings::MAINPORT_COMBRIDGE, vcpComBridgeEnabled); break;
enableComboBoxOptionItem(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_COMBRIDGE, vcpComBridgeEnabled); case OPLinkSettings::RADIOPRISTREAM_HID:
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_HID)) {
if (!vcpComBridgeEnabled) { setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_COMBRIDGE)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED);
} }
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_COMBRIDGE)) { break;
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_DISABLED); case OPLinkSettings::RADIOPRISTREAM_MAIN:
if (!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
} }
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_MAIN)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
break;
case OPLinkSettings::RADIOPRISTREAM_FLEXI:
if (!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
}
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_FLEXI)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
break;
case OPLinkSettings::RADIOPRISTREAM_VCP:
if (!isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_VCP)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
break;
} }
updateSettings();
}
void ConfigOPLinkWidget::radioAuxStreamChanged()
{
switch (getComboboxSelectedOption(m_oplink->RadioAuxStream)) {
case OPLinkSettings::RADIOAUXSTREAM_DISABLED:
break;
case OPLinkSettings::RADIOAUXSTREAM_HID:
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_HID)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
break;
case OPLinkSettings::RADIOAUXSTREAM_MAIN:
if (!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
}
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_MAIN)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
break;
case OPLinkSettings::RADIOAUXSTREAM_FLEXI:
if (!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
}
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_MAIN)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
break;
case OPLinkSettings::RADIOAUXSTREAM_VCP:
if (!isComboboxOptionSelected(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED)) {
setComboboxSelectedOption(m_oplink->VCPBridge, OPLinkSettings::VCPBRIDGE_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_VCP)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
break;
}
updateSettings();
}
void ConfigOPLinkWidget::vcpBridgeChanged()
{
switch (getComboboxSelectedOption(m_oplink->VCPBridge)) {
case OPLinkSettings::VCPBRIDGE_DISABLED:
break;
case OPLinkSettings::VCPBRIDGE_MAIN:
if (!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
}
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_VCP) ||
isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_VCP) ||
isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_MAIN)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
break;
case OPLinkSettings::VCPBRIDGE_FLEXI:
if (!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_TELEMETRY) &&
!isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL)) {
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
}
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_VCP) ||
isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_DISABLED);
}
if (isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_VCP) ||
isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_FLEXI)) {
setComboboxSelectedOption(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_DISABLED);
}
break;
}
updateSettings();
} }
void ConfigOPLinkWidget::unbind() void ConfigOPLinkWidget::unbind()

View File

@ -78,7 +78,9 @@ private slots:
void mainPortChanged(); void mainPortChanged();
void flexiPortChanged(); void flexiPortChanged();
void vcpPortChanged(); void radioPriStreamChanged();
void radioAuxStreamChanged();
void vcpBridgeChanged();
void unbind(); void unbind();
}; };

View File

@ -101,7 +101,7 @@
<string>Configuration</string> <string>Configuration</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="3" column="1"> <item row="5" column="1">
<widget class="QLineEdit" name="CoordID"> <widget class="QLineEdit" name="CoordID">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@ -138,7 +138,7 @@ The device must be rebooted for the binding to take place.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="CustomDeviceID"> <widget class="QLineEdit" name="CustomDeviceID">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@ -196,7 +196,29 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="6"> <item row="0" column="5">
<widget class="QLabel" name="UartsLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Serial Ports</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QLabel" name="MainPortLabel"> <widget class="QLabel" name="MainPortLabel">
<property name="font"> <property name="font">
<font> <font>
@ -212,7 +234,227 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="1" column="6">
<widget class="QComboBox" name="MainPort">
<property name="toolTip">
<string>Choose a function for the main port.</string>
</property>
</widget>
</item>
<item row="1" column="7">
<widget class="QLabel" name="MainComSpeedLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Speed</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="8">
<widget class="QComboBox" name="MainComSpeed">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the baud rate for the main com port.</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QLabel" name="FlexiPortLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Flexi Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QComboBox" name="FlexiPort">
<property name="toolTip">
<string>Choose a function for the flexi port.</string>
</property>
</widget>
</item>
<item row="2" column="7">
<widget class="QLabel" name="FlexiComSpeedLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Speed</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="8">
<widget class="QComboBox" name="FlexiComSpeed">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the baud rate for the main com port.</string>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QLabel" name="ConnectionsLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Connections</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="5">
<widget class="QLabel" name="RadioPriStreamLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Radio Primary</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QComboBox" name="RadioPriStream">
<property name="toolTip">
<string>Choose a destination for the primary radio stream.</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="AirDataRateLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Air Data Rate</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="AirDataRate">
<property name="maximumSize">
<size>
<width>90</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the over-the-air baud rate for the radio.</string>
</property>
</widget>
</item>
<item row="6" column="5">
<widget class="QLabel" name="RadioAuxStreamLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Radio Auxiliary</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="6" column="6">
<widget class="QComboBox" name="RadioAuxStream">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose a destination for the auxiliary radio stream.</string>
</property>
</widget>
</item>
<item row="7" column="5">
<widget class="QLabel" name="VCPBridgeLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>VCP Bridge</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="7" column="6">
<widget class="QComboBox" name="VCPBridge">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose a destination for the Virtual Com Port bridge connection.</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="MaximumChannelLabel"> <widget class="QLabel" name="MaximumChannelLabel">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -259,41 +501,6 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="7">
<widget class="QComboBox" name="MainPort">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the function for the main port.</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="MaxRFTxPowerLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Max Power</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="5"> <item row="1" column="5">
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">
@ -307,7 +514,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="5" column="1"> <item row="7" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QSpinBox" name="MaximumChannel"> <widget class="QSpinBox" name="MaximumChannel">
@ -358,20 +565,7 @@ Leave blank to use autogenerated Device ID.</string>
</item> </item>
</layout> </layout>
</item> </item>
<item row="3" column="7"> <item row="4" column="2">
<widget class="QComboBox" name="FlexiPort">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the function for the flexi port.</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="UnbindButton"> <widget class="QPushButton" name="UnbindButton">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::NoFocus</enum> <enum>Qt::NoFocus</enum>
@ -384,7 +578,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="8" column="0">
<widget class="QLabel" name="MinimumChannelLabel"> <widget class="QLabel" name="MinimumChannelLabel">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -428,29 +622,6 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="6">
<widget class="QLabel" name="ComSpeedLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Com Speed</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="7">
<widget class="QComboBox" name="ComSpeed">
<property name="toolTip">
<string>Com speed in bps.</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="LinkTypeLabel"> <widget class="QLabel" name="LinkTypeLabel">
<property name="font"> <property name="font">
@ -467,7 +638,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="1"> <item row="8" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="QSpinBox" name="MinimumChannel"> <widget class="QSpinBox" name="MinimumChannel">
@ -518,7 +689,7 @@ Leave blank to use autogenerated Device ID.</string>
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0"> <item row="4" column="0">
<widget class="QLabel" name="CustomDeviceIDLabel"> <widget class="QLabel" name="CustomDeviceIDLabel">
<property name="font"> <property name="font">
<font> <font>
@ -534,23 +705,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="6"> <item row="5" column="0">
<widget class="QLabel" name="FlexiPortLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Flexi Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="CoordIDLabel"> <widget class="QLabel" name="CoordIDLabel">
<property name="font"> <property name="font">
<font> <font>
@ -588,11 +743,33 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="7"> <item row="2" column="0">
<widget class="QLabel" name="MaxRFTxPowerLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Max Power</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="MaxRFTxPower"> <widget class="QComboBox" name="MaxRFTxPower">
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>90</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
@ -608,7 +785,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="6" column="0">
<widget class="QLabel" name="BandLabel"> <widget class="QLabel" name="BandLabel">
<property name="font"> <property name="font">
<font> <font>
@ -624,7 +801,7 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="6" column="1">
<widget class="QComboBox" name="RFBand"> <widget class="QComboBox" name="RFBand">
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
@ -643,64 +820,6 @@ Leave blank to use autogenerated Device ID.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="6">
<widget class="QLabel" name="VCPPortLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>VCP Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="7">
<widget class="QComboBox" name="VCPPort">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the function for the USB virtual com port.</string>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QLabel" name="RadioAuxPortLabel">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Radio Aux Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="7">
<widget class="QComboBox" name="RadioAuxPort">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Choose the function for the Radio Auxiliary virtual com port.</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View File

@ -3,27 +3,33 @@
<description>OPLink configurations options.</description> <description>OPLink configurations options.</description>
<field name="Protocol" units="" type="enum" elements="1" options="Disabled,OPLinkReceiver,OPLinkCoordinator,OpenLRS" defaultvalue="Disabled"/> <field name="Protocol" units="" type="enum" elements="1" options="Disabled,OPLinkReceiver,OPLinkCoordinator,OpenLRS" defaultvalue="Disabled"/>
<field name="LinkType" units="" type="enum" elements="1" options="Data,Control,DataAndControl" defaultvalue="Data"/> <field name="LinkType" units="" type="enum" elements="1" options="Data,Control,DataAndControl" defaultvalue="Data"/>
<field name="CoordID" units="hex" type="uint32" elements="1" defaultvalue="0"/> <field name="CoordID" units="hex" type="uint32" elements="1" defaultvalue="0"/>
<field name="MainPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,ComBridge,PPM,PWM" defaultvalue="Disabled"/>
<field name="FlexiPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,ComBridge,PPM,PWM" defaultvalue="Disabled"/>
<field name="VCPPort" units="" type="enum" elements="1" options="Disabled,Serial,ComBridge" defaultvalue="Disabled"/>
<field name="ComSpeed" units="bps" type="enum" elements="1" options="4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
<field name="MaxRFPower" units="mW" type="enum" elements="1" options="0,1.25,1.6,3.16,6.3,12.6,25,50,100" defaultvalue="0"/>
<field name="RFBand" units="" type="enum" elements="1" options="433MHz,868MHz,915MHz" defaultvalue="433MHz"/>
<field name="MinChannel" units="" type="uint8" elements="1" defaultvalue="0"/>
<field name="MaxChannel" units="" type="uint8" elements="1" defaultvalue="250"/>
<field name="CustomDeviceID" units="hex" type="uint32" elements="1" defaultvalue="0"/> <field name="CustomDeviceID" units="hex" type="uint32" elements="1" defaultvalue="0"/>
<field name="RFXtalCap" units="" type="uint8" elements="1" defaultvalue="127" limits="%BE:0:171" description="0 to 171 range, default 127"/>
<!-- OpenLRS options --> <!-- port options -->
<field name="MainPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,PPM,PWM" defaultvalue="Disabled"/>
<field name="FlexiPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,PPM,PWM" defaultvalue="Disabled"/>
<field name="RadioPriStream" units="connection" type="enum" elements="1" options="Disabled,HID,Main,Flexi,VCP" defaultvalue="HID"/>
<field name="RadioAuxStream" units="connection" type="enum" elements="1" options="Disabled,HID,Main,Flexi,VCP" defaultvalue="Disabled"/>
<field name="VCPBridge" units="connection" type="enum" elements="1" options="Disabled,Main,Flexi" defaultvalue="Disabled"/>
<field name="MainComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
<field name="FlexiComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
<field name="AirDataRate" units="bps" type="enum" elements="1" options="9600,19200,32000,57600,64000,100000,128000,192000,256000" defaultvalue="64000"/>
<!-- OpenLRS options -->
<field name="Version" units="" type="uint8" elements="1" defaultvalue="0"/> <field name="Version" units="" type="uint8" elements="1" defaultvalue="0"/>
<field name="SerialBaudrate" units="bps" type="uint32" elements="1" defaultvalue="0"/> <field name="SerialBaudrate" units="bps" type="uint32" elements="1" defaultvalue="0"/>
<field name="RFFrequency" units="Hz" type="uint32" elements="1" defaultvalue="0"/> <field name="RFFrequency" units="Hz" type="uint32" elements="1" defaultvalue="0"/>
<field name="FailsafeDelay" units="ms" type="uint32" elements="1" defaultvalue="1000"/> <field name="FailsafeDelay" units="ms" type="uint32" elements="1" defaultvalue="1000"/>
<field name="RSSIType" units="function" type="enum" elements="1" options="Combined,RSSI,LinkQuality" defaultvalue="Combined"/> <field name="RSSIType" units="function" type="enum" elements="1" options="Combined,RSSI,LinkQuality" defaultvalue="Combined"/>
<field name="RadioAuxStream" units="function" type="enum" elements="1" options="ComBridge,Disabled" defaultvalue="Disabled"/>
<!-- rf_magic === CoordID -->
<field name="RFPower" units="" type="uint8" elements="1" defaultvalue="0"/> <field name="RFPower" units="" type="uint8" elements="1" defaultvalue="0"/>
<!-- RF options -->
<field name="RFXtalCap" units="" type="uint8" elements="1" defaultvalue="127" limits="%BE:0:171" description="0 to 171 range, default 127"/>
<field name="MinChannel" units="" type="uint8" elements="1" defaultvalue="0"/>
<field name="MaxChannel" units="" type="uint8" elements="1" defaultvalue="250"/>
<field name="RFBand" units="" type="enum" elements="1" options="433MHz,868MHz,915MHz" defaultvalue="433MHz"/>
<field name="MaxRFPower" units="mW" type="enum" elements="1" options="0,1.25,1.6,3.16,6.3,12.6,25,50,100" defaultvalue="0"/>
<field name="RFChannelSpacing" units="Hz" type="uint8" elements="1" defaultvalue="0"/> <field name="RFChannelSpacing" units="Hz" type="uint8" elements="1" defaultvalue="0"/>
<field name="HopChannel" units="" type="uint8" elements="24" defaultvalue="0"/> <field name="HopChannel" units="" type="uint8" elements="24" defaultvalue="0"/>
<field name="ModemParams" units="" type="uint8" elements="1" defaultvalue="0"/> <field name="ModemParams" units="" type="uint8" elements="1" defaultvalue="0"/>