mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-20 14:55:21 +03:00
Combine ibus serial rx and ibus telemetry on the same fc uart on a single pin.
``` +---------+ | FS-iA6B | | | | Ser RX |---|<---\ +------------+ | | | | FC | | Sensor |---[R]--*-------| Uart TX | +---------+ +------------+ ``` R = 10Kohm, Diode 1N4148 or similar. Both uart tx and rx channels are used so it's not possible to use the spare pin for rx of something else. Configure the serial port like this to get both serial rx and ibus telemetry on the same port: ``` serial 1 4160 115200 57600 115200 115200 ``` It is still possible to run the serial rx and ibus telemetry on two uarts like before, an example: ``` serial 1 64 115200 57600 0 115200 serial 2 4096 115200 57600 115200 115200 ```
This commit is contained in:
parent
355c7cc215
commit
b13d4694bb
12 changed files with 640 additions and 347 deletions
|
@ -26,7 +26,7 @@ extern "C" {
|
|||
#include "fc/rc_controls.h"
|
||||
#include "telemetry/telemetry.h"
|
||||
#include "telemetry/ibus.h"
|
||||
#include "sensors/barometer.h"
|
||||
#include "sensors/gyro.h"
|
||||
#include "sensors/battery.h"
|
||||
#include "scheduler/scheduler.h"
|
||||
#include "fc/fc_tasks.h"
|
||||
|
@ -39,11 +39,19 @@ extern "C" {
|
|||
extern "C" {
|
||||
uint8_t batteryCellCount = 3;
|
||||
int16_t rcCommand[4] = {0, 0, 0, 0};
|
||||
int16_t telemTemperature1 = 0;
|
||||
baro_t baro = { .baroTemperature = 50 };
|
||||
telemetryConfig_t telemetryConfig_System;
|
||||
}
|
||||
|
||||
static int16_t gyroTemperature;
|
||||
int16_t gyroGetTemperature(void) {
|
||||
return gyroTemperature;
|
||||
}
|
||||
|
||||
static uint16_t vbat = 100;
|
||||
uint16_t getVbat(void)
|
||||
{
|
||||
return vbat;
|
||||
}
|
||||
|
||||
#define SERIAL_BUFFER_SIZE 256
|
||||
|
||||
|
@ -54,12 +62,6 @@ typedef struct serialPortStub_s {
|
|||
} serialPortStub_t;
|
||||
|
||||
|
||||
static uint16_t vbat = 100;
|
||||
uint16_t getVbat(void)
|
||||
{
|
||||
return vbat;
|
||||
}
|
||||
|
||||
static serialPortStub_t serialWriteStub;
|
||||
static serialPortStub_t serialReadStub;
|
||||
|
||||
|
@ -72,6 +74,7 @@ serialPortConfig_t serialTestInstanceConfig = {
|
|||
|
||||
static serialPortConfig_t *findSerialPortConfig_stub_retval;
|
||||
static portSharing_e determinePortSharing_stub_retval;
|
||||
static bool portIsShared = false;
|
||||
static bool openSerial_called = false;
|
||||
static bool telemetryDetermineEnabledState_stub_retval;
|
||||
|
||||
|
@ -105,6 +108,17 @@ bool telemetryDetermineEnabledState(portSharing_e portSharing)
|
|||
}
|
||||
|
||||
|
||||
bool isSerialPortShared(const serialPortConfig_t *portConfig,
|
||||
uint16_t functionMask,
|
||||
serialPortFunction_e sharedWithFunction)
|
||||
{
|
||||
EXPECT_EQ(portConfig, findSerialPortConfig_stub_retval);
|
||||
EXPECT_EQ(functionMask, FUNCTION_RX_SERIAL);
|
||||
EXPECT_EQ(sharedWithFunction, FUNCTION_TELEMETRY_IBUS);
|
||||
return portIsShared;
|
||||
}
|
||||
|
||||
|
||||
serialPortConfig_t *findSerialPortConfig(uint16_t mask)
|
||||
{
|
||||
EXPECT_EQ(mask, FUNCTION_TELEMETRY_IBUS);
|
||||
|
@ -179,6 +193,7 @@ void serialTestResetBuffers()
|
|||
|
||||
void serialTestResetPort()
|
||||
{
|
||||
portIsShared = false;
|
||||
openSerial_called = false;
|
||||
determinePortSharing_stub_retval = PORTSHARING_UNUSED;
|
||||
telemetryDetermineEnabledState_stub_retval = true;
|
||||
|
@ -235,11 +250,31 @@ TEST_F(IbusTelemteryInitUnitTest, Test_IbusInitEnabled)
|
|||
}
|
||||
|
||||
|
||||
TEST_F(IbusTelemteryInitUnitTest, Test_IbusInitSerialRxAndTelemetryEnabled)
|
||||
{
|
||||
findSerialPortConfig_stub_retval = &serialTestInstanceConfig;
|
||||
|
||||
//given stuff in serial read
|
||||
serialReadStub.end++;
|
||||
//and serial rx enabled too
|
||||
portIsShared = true;
|
||||
|
||||
//when initializing and polling ibus
|
||||
initIbusTelemetry();
|
||||
checkIbusTelemetryState();
|
||||
handleIbusTelemetry();
|
||||
|
||||
//then all is read from serial port
|
||||
EXPECT_NE(serialReadStub.pos, serialReadStub.end);
|
||||
EXPECT_FALSE(openSerial_called);
|
||||
}
|
||||
|
||||
class IbusTelemetryProtocolUnitTestBase : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
virtual void SetUp()
|
||||
{
|
||||
serialTestResetPort();
|
||||
telemetryConfigMutable()->report_cell_voltage = false;
|
||||
serialTestResetBuffers();
|
||||
initIbusTelemetry();
|
||||
|
@ -373,33 +408,20 @@ TEST_F(IbusTelemteryProtocolUnitTest, Test_IbusRespondToGetMeasurementVbattPackV
|
|||
|
||||
TEST_F(IbusTelemteryProtocolUnitTest, Test_IbusRespondToGetMeasurementTemperature)
|
||||
{
|
||||
#ifdef BARO
|
||||
//Given ibus command: Sensor at address 2, please send your measurement
|
||||
//then we respond
|
||||
baro.baroTemperature = 50;
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x95\x01\xc1\xFE", 6);
|
||||
gyroTemperature = 50;
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x84\x03\xd0\xfe", 6);
|
||||
|
||||
//Given ibus command: Sensor at address 2, please send your measurement
|
||||
//then we respond
|
||||
baro.baroTemperature = 59; //test integer rounding
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x96\x01\xc0\xFE", 6);
|
||||
gyroTemperature = 59; //test integer rounding
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\xde\x03\x76\xfe", 6);
|
||||
|
||||
//Given ibus command: Sensor at address 2, please send your measurement
|
||||
//then we respond
|
||||
baro.baroTemperature = 150;
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x9f\x01\xb7\xFE", 6);
|
||||
#else
|
||||
#error not tested, may be obsolete
|
||||
// //Given ibus command: Sensor at address 2, please send your measurement
|
||||
// //then we respond with: I'm reading 0 degrees + constant offset 0x190
|
||||
// telemTemperature1 = 0;
|
||||
// checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x90\x01\xC6\xFE", 6);
|
||||
|
||||
// //Given ibus command: Sensor at address 2, please send your measurement
|
||||
// //then we respond with: I'm reading 100 degrees + constant offset 0x190
|
||||
// telemTemperature1 = 100;
|
||||
// checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\xF4\x01\x62\xFE", 6);
|
||||
#endif
|
||||
gyroTemperature = 150;
|
||||
checkResponseToCommand("\x04\xA2\x59\xff", 4, "\x06\xA2\x6c\x07\xe4\xfe", 6);
|
||||
}
|
||||
|
||||
|
||||
|
@ -468,19 +490,12 @@ TEST_F(IbusTelemteryProtocolUnitTestDaisyChained, Test_IbusRespondToGetMeasureme
|
|||
//then we respond with: I'm reading 0.1 volts
|
||||
batteryCellCount = 1;
|
||||
vbat = 10;
|
||||
checkResponseToCommand("\x04\xA3\x58\xff", 4, "\x06\xA3\x64\x00\xf2\xFe", 6);
|
||||
checkResponseToCommand("\x04\xA3\x58\xff", 4, "\x06\xA3\x64\x00\xf2\xfe", 6);
|
||||
|
||||
#ifdef BARO
|
||||
//Given ibus command: Sensor at address 4, please send your measurement
|
||||
//then we respond
|
||||
baro.baroTemperature = 150;
|
||||
checkResponseToCommand("\x04\xA4\x57\xff", 4, "\x06\xA4\x9f\x01\xb5\xFE", 6);
|
||||
#else
|
||||
//Given ibus command: Sensor at address 4, please send your measurement
|
||||
//then we respond with: I'm reading 100 degrees + constant offset 0x190
|
||||
telemTemperature1 = 100;
|
||||
checkResponseToCommand("\x04\xA4\x57\xff", 4, "\x06\xA4\xF4\x01\x60\xFE", 6);
|
||||
#endif
|
||||
gyroTemperature = 150;
|
||||
checkResponseToCommand("\x04\xA4\x57\xff", 4, "\x06\xA4\x6c\x07\xe2\xfe", 6);
|
||||
|
||||
//Given ibus command: Sensor at address 5, please send your measurement
|
||||
//then we respond with: I'm reading 100 rpm
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue