From 12e8adbdc4a2dbe3d5d1da07c7057eb4e75bcc93 Mon Sep 17 00:00:00 2001 From: Brian Webb Date: Thu, 2 May 2013 04:23:26 +0100 Subject: [PATCH] OP-932: Fixes vitual com port and (not tested) raw comms over a UART on the OPLink. --- .../modules/RadioComBridge/RadioComBridge.c | 75 +++++++++++++++---- flight/pios/common/pios_rfm22b.c | 1 - .../targets/boards/oplinkmini/board-info.mk | 12 +-- flight/targets/boards/oplinkmini/pios_board.h | 7 +- 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/flight/modules/RadioComBridge/RadioComBridge.c b/flight/modules/RadioComBridge/RadioComBridge.c index ea1579c6f..7bea6b917 100644 --- a/flight/modules/RadioComBridge/RadioComBridge.c +++ b/flight/modules/RadioComBridge/RadioComBridge.c @@ -71,6 +71,7 @@ typedef struct { // The task handles. xTaskHandle telemetryTxTaskHandle; + xTaskHandle telemetryRxTaskHandle; xTaskHandle radioRxTaskHandle; xTaskHandle radioTxTaskHandle; @@ -103,6 +104,7 @@ typedef struct { // Private functions static void telemetryTxTask(void *parameters); +static void telemetryRxTask(void *parameters); static void radioRxTask(void *parameters); static void radioTxTask(void *parameters); static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length); @@ -172,26 +174,38 @@ static int32_t RadioComBridgeStart(void) // Set the frequency range. PIOS_RFM22B_SetFrequencyRange(pios_rfm22b_id, oplinkSettings.MinFrequency, oplinkSettings.MaxFrequency, oplinkSettings.ChannelSpacing); - + // Reinitilize the modem. PIOS_RFM22B_Reinit(pios_rfm22b_id); + + // 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 initial frequency. PIOS_RFM22B_SetInitialFrequency(pios_rfm22b_id, oplinkSettings.InitFrequency); // Start the primary tasks for receiving/sending UAVTalk packets from the GCS. - xTaskCreate(telemetryTxTask, (signed char *)"telemTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->telemetryTxTaskHandle)); + xTaskCreate(telemetryTxTask, (signed char *)"telemetryTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->telemetryTxTaskHandle)); + xTaskCreate(telemetryRxTask, (signed char *)"telemetryRxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->telemetryRxTaskHandle)); xTaskCreate(radioRxTask, (signed char *)"radioRxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioRxTaskHandle)); - xTaskCreate(radioTxTask, (signed char *)"radioTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioTxTaskHandle)); // Register the watchdog timers. #ifdef PIOS_INCLUDE_WDG - PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRY); + PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYTX); + PIOS_WDG_RegisterFlag(PIOS_WDG_TELEMETRYRX); PIOS_WDG_RegisterFlag(PIOS_WDG_RADIORX); - PIOS_WDG_RegisterFlag(PIOS_WDG_RADIOTX); #endif + // If we're doing raw comms, we need to have another thread that relays data from the com port to the radio. + if (!data->parseUAVTalk) { + xTaskCreate(radioTxTask, (signed char *)"radioTxTask", STACK_SIZE_BYTES, NULL, TASK_PRIORITY, &(data->radioTxTaskHandle)); +#ifdef PIOS_INCLUDE_WDG + PIOS_WDG_RegisterFlag(PIOS_WDG_RADIOTX); +#endif + } return 0; } @@ -234,7 +248,7 @@ static int32_t RadioComBridgeInitialize(void) data->comTxErrors = 0; data->comTxRetries = 0; data->UAVTalkErrors = 0; - data->parseUAVTalk = false; + data->parseUAVTalk = true; data->configured = false; data->comSpeed = OPLINKSETTINGS_COMSPEED_9600; PIOS_COM_RADIO = PIOS_COM_RFM22B; @@ -255,7 +269,7 @@ static void telemetryTxTask(void *parameters) // Loop forever while (1) { #ifdef PIOS_INCLUDE_WDG - PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRY); + PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYTX); #endif // Wait for queue message if (xQueueReceive(data->uavtalkEventQueue, &ev, MAX_PORT_DELAY) == pdTRUE) { @@ -309,17 +323,22 @@ static void radioRxTask(void *parameters) uint8_t serial_data[1]; uint16_t bytes_to_process = PIOS_COM_ReceiveBuffer(PIOS_COM_RADIO, serial_data, sizeof(serial_data), MAX_PORT_DELAY); if (bytes_to_process > 0) { - for (uint8_t i = 0; i < bytes_to_process; i++) { - if (UAVTalkRelayInputStream(data->outUAVTalkCon, serial_data[i]) == UAVTALK_STATE_ERROR) { - data->UAVTalkErrors++; + // Either pass the data through the UAVTalk parser, or just send it to the radio (if we're doing raw comms). + if (data->parseUAVTalk) { + for (uint8_t i = 0; i < bytes_to_process; i++) { + if (UAVTalkRelayInputStream(data->outUAVTalkCon, serial_data[i]) == UAVTALK_STATE_ERROR) { + data->UAVTalkErrors++; + } } + } else if (PIOS_COM_TELEMETRY) { + PIOS_COM_SendBufferNonBlocking(PIOS_COM_TELEMETRY, serial_data, bytes_to_process); } } } } /** - * Radio rx task. Receive data from a com port and pass it on to the radio. + * Radio tx task. Receive data packets from the com port and send to the radio. * * @param[in] parameters The task parameters */ @@ -327,10 +346,38 @@ static void radioTxTask(void *parameters) { // Task loop while (1) { - uint32_t inputPort = PIOS_COM_TELEMETRY; #ifdef PIOS_INCLUDE_WDG PIOS_WDG_UpdateFlag(PIOS_WDG_RADIOTX); #endif + + // Wait until the com port is available. + if (!PIOS_COM_TELEMETRY) { + vTaskDelay(5); + continue; + } + + // Read from the com port. + uint8_t serial_data[1]; + uint16_t bytes_to_process = PIOS_COM_ReceiveBuffer(PIOS_COM_TELEMETRY, serial_data, sizeof(serial_data), MAX_PORT_DELAY); + if (bytes_to_process > 0) { + PIOS_COM_SendBufferNonBlocking(PIOS_COM_RADIO, serial_data, bytes_to_process); + } + } +} + +/** + * Receive telemetry from the USB/COM port. + * + * @param[in] parameters The task parameters + */ +static void telemetryRxTask(void *parameters) +{ + // Task loop + while (1) { + uint32_t inputPort = data->parseUAVTalk ? PIOS_COM_TELEMETRY : 0; +#ifdef PIOS_INCLUDE_WDG + PIOS_WDG_UpdateFlag(PIOS_WDG_TELEMETRYRX); +#endif #if defined(PIOS_INCLUDE_USB) // Determine output port (USB takes priority over telemetry port) if (PIOS_USB_CheckAvailable(0) && PIOS_COM_TELEM_USB_HID) { @@ -360,7 +407,7 @@ static void radioTxTask(void *parameters) */ static int32_t UAVTalkSendHandler(uint8_t *buf, int32_t length) { - uint32_t outputPort = PIOS_COM_TELEMETRY; + uint32_t outputPort = data->parseUAVTalk ? PIOS_COM_TELEMETRY : 0; #if defined(PIOS_INCLUDE_USB) // Determine output port (USB takes priority over telemetry port) if (PIOS_COM_TELEM_USB_HID && PIOS_COM_Available(PIOS_COM_TELEM_USB_HID)) { @@ -604,7 +651,6 @@ static void updateSettings() bool is_coordinator = PIOS_RFM22B_IsCoordinator(pios_rfm22b_id); switch (oplinkSettings.MainPort) { case OPLINKSETTINGS_MAINPORT_TELEMETRY: - data->parseUAVTalk = true; case OPLINKSETTINGS_MAINPORT_SERIAL: /* Configure the main port for uart serial */ PIOS_InitUartMainPort(); @@ -620,7 +666,6 @@ static void updateSettings() // Configure the flexi port switch (oplinkSettings.FlexiPort) { case OPLINKSETTINGS_FLEXIPORT_TELEMETRY: - data->parseUAVTalk = true; case OPLINKSETTINGS_FLEXIPORT_SERIAL: /* Configure the flexi port as uart serial */ PIOS_InitUartFlexiPort(); diff --git a/flight/pios/common/pios_rfm22b.c b/flight/pios/common/pios_rfm22b.c index c236fe622..190ca883f 100644 --- a/flight/pios/common/pios_rfm22b.c +++ b/flight/pios/common/pios_rfm22b.c @@ -2192,7 +2192,6 @@ static enum pios_rfm22b_event rfm22_receiveAck(struct pios_rfm22b_dev *rfm22b_de portTickType local_tx_time = rfm22_coordinatorTime(rfm22b_dev, rfm22b_dev->tx_complete_ticks); portTickType remote_rx_time = aph->packet_recv_time; // Adjust the time delta based on the difference between our estimated time offset and the coordinator offset. - // This is not working yet rfm22b_dev->time_delta += remote_rx_time - local_tx_time; } diff --git a/flight/targets/boards/oplinkmini/board-info.mk b/flight/targets/boards/oplinkmini/board-info.mk index 29607fa0a..b526c5fa1 100644 --- a/flight/targets/boards/oplinkmini/board-info.mk +++ b/flight/targets/boards/oplinkmini/board-info.mk @@ -9,16 +9,8 @@ BOARD := STM32103CB_OPLINKMINI MODEL := MD MODEL_SUFFIX := _PX -OPENOCD_CONFIG := stm32f1x.cfg - -OPENOCD_JTAG_CONFIG := foss-jtag.revb.cfg -OPENOCD_CONFIG := stm32f1x.cfg - -OPENOCD_JTAG_CONFIG := foss-jtag.revb.cfg -OPENOCD_CONFIG := stm32f1x.cfg - -OPENOCD_JTAG_CONFIG := foss-jtag.revb.cfg -OPENOCD_CONFIG := stm32f1x.cfg +OPENOCD_JTAG_CONFIG := stlink-v2.cfg +OPENOCD_CONFIG := stm32f1x.stlink.cfg # Note: These must match the values in link_$(BOARD)_memory.ld BL_BANK_BASE := 0x08000000 # Start of bootloader flash diff --git a/flight/targets/boards/oplinkmini/pios_board.h b/flight/targets/boards/oplinkmini/pios_board.h index 4bc0bc115..786508844 100644 --- a/flight/targets/boards/oplinkmini/pios_board.h +++ b/flight/targets/boards/oplinkmini/pios_board.h @@ -71,10 +71,11 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1 //------------------------ #define PIOS_WATCHDOG_TIMEOUT 500 #define PIOS_WDG_REGISTER BKP_DR4 -#define PIOS_WDG_TELEMETRY 0x0001 -#define PIOS_WDG_RADIORX 0x0002 +#define PIOS_WDG_TELEMETRYTX 0x0001 +#define PIOS_WDG_TELEMETRYRX 0x0002 #define PIOS_WDG_RADIOTX 0x0004 -#define PIOS_WDG_RFM22B 0x0008 +#define PIOS_WDG_RADIORX 0x0008 +#define PIOS_WDG_RFM22B 0x0016 //------------------------ // TELEMETRY