From 2461973dd66c48984d9ecdddfd50e42e73afebf0 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 8 Nov 2014 01:11:10 +0000 Subject: [PATCH 1/7] There was a little more fixed to do when telemetry was not eanbled. Tested arm/disarm/arm/disarm with telemetry on and off, all working now. See #155. --- src/main/io/serial.c | 11 +++++++++++ src/main/io/serial.h | 1 + src/main/io/serial_msp.c | 12 ++++++++++++ src/main/io/serial_msp.h | 1 + src/main/mw.c | 19 +++++++++++++++---- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/io/serial.c b/src/main/io/serial.c index 301bd45b6..3a185da56 100644 --- a/src/main/io/serial.c +++ b/src/main/io/serial.c @@ -513,6 +513,17 @@ bool isSerialPortFunctionShared(serialPortFunction_e functionToUse, uint16_t fun return result->portFunction->scenario & functionMask; } +serialPort_t *findSharedSerialPort(serialPortFunction_e functionToUse, uint16_t functionMask) +{ + functionConstraint_t *functionConstraint = getConfiguredFunctionConstraint(functionToUse); + serialPortSearchResult_t *result = findSerialPort(functionToUse, functionConstraint); + + if (result->portFunction->scenario & functionMask) { + return result->portFunction->port; + } + return NULL; +} + void applySerialConfigToPortFunctions(serialConfig_t *serialConfig) { uint32_t portIndex = 0, serialPortIdentifier; diff --git a/src/main/io/serial.h b/src/main/io/serial.h index a1a371476..f104b8c15 100644 --- a/src/main/io/serial.h +++ b/src/main/io/serial.h @@ -161,6 +161,7 @@ void applySerialConfigToPortFunctions(serialConfig_t *serialConfig); bool isSerialConfigValid(serialConfig_t *serialConfig); bool doesConfigurationUsePort(serialPortIdentifier_e portIdentifier); bool isSerialPortFunctionShared(serialPortFunction_e functionToUse, uint16_t functionMask); +serialPort_t *findSharedSerialPort(serialPortFunction_e functionToUse, uint16_t functionMask); const serialPortFunctionList_t *getSerialPortFunctionList(void); diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c index 510d78846..82027b638 100755 --- a/src/main/io/serial_msp.c +++ b/src/main/io/serial_msp.c @@ -561,6 +561,18 @@ static void openAllMSPSerialPorts(serialConfig_t *serialConfig) UNUSED(serialPortFunctionList); } +void mspReleasePortIfAllocated(serialPort_t *serialPort) +{ + uint8_t portIndex; + for (portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) { + mspPort_t *candidateMspPort = &mspPorts[portIndex++]; + if (candidateMspPort->port == serialPort) { + endSerialPortFunction(serialPort, FUNCTION_MSP); + memset(candidateMspPort, 0, sizeof(mspPort_t)); + } + } +} + void mspInit(serialConfig_t *serialConfig) { // calculate used boxes based on features and fill availableBoxes[] array diff --git a/src/main/io/serial_msp.h b/src/main/io/serial_msp.h index 6b06b42db..bbc6303f1 100644 --- a/src/main/io/serial_msp.h +++ b/src/main/io/serial_msp.h @@ -24,3 +24,4 @@ void mspProcess(void); void sendMspTelemetry(void); void mspSetTelemetryPort(serialPort_t *mspTelemetryPort); void mspReset(serialConfig_t *serialConfig); +void mspReleasePortIfAllocated(serialPort_t *serialPort); diff --git a/src/main/mw.c b/src/main/mw.c index 4f2fa1915..ee8473b52 100755 --- a/src/main/mw.c +++ b/src/main/mw.c @@ -299,10 +299,12 @@ void mwDisarm(void) DISABLE_ARMING_FLAG(ARMED); #ifdef TELEMETRY - // the telemetry state must be checked immediately so that shared serial ports are released. - checkTelemetryState(); - if (isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP)) { - mspReset(&masterConfig.serialConfig); + if (feature(FEATURE_TELEMETRY)) { + // the telemetry state must be checked immediately so that shared serial ports are released. + checkTelemetryState(); + if (isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP)) { + mspReset(&masterConfig.serialConfig); + } } #endif } @@ -317,6 +319,15 @@ void mwArm(void) if (!ARMING_FLAG(PREVENT_ARMING)) { ENABLE_ARMING_FLAG(ARMED); headFreeModeHold = heading; + +#ifdef TELEMETRY + if (feature(FEATURE_TELEMETRY)) { + serialPort_t *sharedTelemetryAndMspPort = findSharedSerialPort(FUNCTION_TELEMETRY, FUNCTION_MSP); + if (sharedTelemetryAndMspPort) { + mspReleasePortIfAllocated(sharedTelemetryAndMspPort); + } + } +#endif return; } } From 0f10855837838cf951a65d5527db734c0f60cfdf Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 8 Nov 2014 01:12:51 +0000 Subject: [PATCH 2/7] Support 16 channel SBus receivers. Tested with FrSky X4RSB and Taranis+. See also: https://github.com/opentx/opentx/issues/1701 --- src/main/rx/sbus.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/rx/sbus.c b/src/main/rx/sbus.c index fb68ec43b..2a042d80e 100644 --- a/src/main/rx/sbus.c +++ b/src/main/rx/sbus.c @@ -35,7 +35,7 @@ #include "rx/rx.h" #include "rx/sbus.h" -#define SBUS_MAX_CHANNEL 12 +#define SBUS_MAX_CHANNEL 16 #define SBUS_FRAME_SIZE 25 #define SBUS_SYNCBYTE 0x0F #define SBUS_OFFSET 988 @@ -85,6 +85,10 @@ struct sbus_dat { unsigned int chan9 : 11; unsigned int chan10 : 11; unsigned int chan11 : 11; + unsigned int chan12 : 11; + unsigned int chan13 : 11; + unsigned int chan14 : 11; + unsigned int chan15 : 11; } __attribute__ ((__packed__)); typedef union { @@ -127,7 +131,7 @@ bool sbusFrameComplete(void) return false; } sbusFrameDone = false; - if ((sbus.in[22] >> 3) & 0x0001) { + if ((sbus.in[SBUS_FRAME_SIZE - 3] >> 3) & 0x0001) { // internal failsafe enabled and rx failsafe flag set return false; } @@ -143,6 +147,10 @@ bool sbusFrameComplete(void) sbusChannelData[9] = sbus.msg.chan9; sbusChannelData[10] = sbus.msg.chan10; sbusChannelData[11] = sbus.msg.chan11; + sbusChannelData[12] = sbus.msg.chan12; + sbusChannelData[13] = sbus.msg.chan13; + sbusChannelData[14] = sbus.msg.chan14; + sbusChannelData[15] = sbus.msg.chan15; return true; } From 28662e696a2851fb90402a67aa2951f33bc7e4ed Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 8 Nov 2014 01:31:47 +0000 Subject: [PATCH 3/7] Update SBus channel reading calculations. Based on baseflight PR#48 by Geobish/Timecop. --- src/main/rx/sbus.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/rx/sbus.c b/src/main/rx/sbus.c index 2a042d80e..d6e9247f6 100644 --- a/src/main/rx/sbus.c +++ b/src/main/rx/sbus.c @@ -38,7 +38,6 @@ #define SBUS_MAX_CHANNEL 16 #define SBUS_FRAME_SIZE 25 #define SBUS_SYNCBYTE 0x0F -#define SBUS_OFFSET 988 #define SBUS_BAUDRATE 100000 @@ -64,7 +63,7 @@ bool sbusInit(rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig, rcReadRa sBusPort = openSerialPort(FUNCTION_SERIAL_RX, sbusDataReceive, SBUS_BAUDRATE, (portMode_t)(MODE_RX | MODE_SBUS), SERIAL_INVERTED); for (b = 0; b < SBUS_MAX_CHANNEL; b++) - sbusChannelData[b] = 2 * (rxConfig->midrc - SBUS_OFFSET); + sbusChannelData[b] = (1.6f * rxConfig->midrc) - 1408; if (callback) *callback = sbusReadRawRC; rxRuntimeConfig->channelCount = SBUS_MAX_CHANNEL; @@ -157,6 +156,7 @@ bool sbusFrameComplete(void) static uint16_t sbusReadRawRC(rxRuntimeConfig_t *rxRuntimeConfig, uint8_t chan) { UNUSED(rxRuntimeConfig); - return sbusChannelData[chan] / 2 + SBUS_OFFSET; + // Linear fitting values read from OpenTX-ppmus and comparing with values received by X4R + // http://www.wolframalpha.com/input/?i=linear+fit+%7B173%2C+988%7D%2C+%7B1812%2C+2012%7D%2C+%7B993%2C+1500%7D + return (0.625f * sbusChannelData[chan]) + 880; } - From 8ed45bce36b9ed5c5f3b16922e0a9af027d302d2 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 8 Nov 2014 01:58:35 +0000 Subject: [PATCH 5/7] cli `exit` command now reboots without saving. This also prevents excessive wear to the eeprom/flash and makes it the difference between `save` obvious. Fixes #146 --- src/main/io/serial_cli.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 23f71a881..43044ef17 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -90,6 +90,7 @@ static void cliMixer(char *cmdline); static void cliMotor(char *cmdline); static void cliProfile(char *cmdline); static void cliRateProfile(char *cmdline); +static void cliReboot(void); static void cliSave(char *cmdline); static void cliSet(char *cmdline); static void cliGet(char *cmdline); @@ -858,18 +859,14 @@ static void cliEnter(void) static void cliExit(char *cmdline) { - cliPrint("\r\nLeaving CLI mode\r\n"); + UNUSED(cmdline); + cliPrint("\r\nLeaving CLI mode, unsaved changes lost.\r\n"); *cliBuffer = '\0'; bufferIndex = 0; cliMode = 0; // incase a motor was left running during motortest, clear it here mixerResetMotors(); - // save and reboot... I think this makes the most sense - otherwise config changes can be out of sync, maybe just need to applyConfig and return? -#if 1 - cliSave(cmdline); -#else - releaseSerialPort(cliPort, FUNCTION_CLI); -#endif + cliReboot(); } static void cliFeature(char *cmdline) From f42d603b127f3877cb92c8aa67b6e8eef0e7b0eb Mon Sep 17 00:00:00 2001 From: dongie Date: Wed, 22 Oct 2014 19:04:50 +0900 Subject: [PATCH 6/7] Fixing acc_hardware in cli to the new supported sensors range. Conflicts: obj/baseflight.hex src/cli.c --- src/main/io/serial_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 43044ef17..44b8c6797 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -333,7 +333,7 @@ const clivalue_t valueTable[] = { { "gimbal_flags", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].gimbalConfig.gimbal_flags, 0, 255}, - { "acc_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.acc_hardware, 0, 5 }, + { "acc_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.acc_hardware, 0, ACC_NONE }, { "acc_lpf_factor", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].acc_lpf_factor, 0, 250 }, { "accxy_deadband", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].accDeadband.xy, 0, 100 }, { "accz_deadband", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].accDeadband.z, 0, 100 }, From 28da97f8944e137580d13774bead5bada0dae03b Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 8 Nov 2014 11:53:01 +0000 Subject: [PATCH 7/7] Fix MSP/Telemetry Arm/Disarm problems. Tested with two MSP ports, one via softserial. Both with telemetry enabled and without telemetry enabled. --- src/main/io/serial_msp.c | 31 +++++++++++++++---------------- src/main/io/serial_msp.h | 2 +- src/main/mw.c | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c index 82027b638..59b5ab49b 100755 --- a/src/main/io/serial_msp.c +++ b/src/main/io/serial_msp.c @@ -525,12 +525,17 @@ static void resetMspPort(mspPort_t *mspPortToReset, serialPort_t *serialPort, ms // This rate is chosen since softserial supports it. #define MSP_FALLBACK_BAUDRATE 19200 -static void openAllMSPSerialPorts(serialConfig_t *serialConfig) +void mspAllocateSerialPorts(serialConfig_t *serialConfig) { serialPort_t *port; - uint8_t portIndex = 0; - do { + uint8_t portIndex; + + for (portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) { + mspPort_t *mspPort = &mspPorts[portIndex]; + if (mspPort->mspPortUsage != UNUSED_PORT) { + continue; + } uint32_t baudRate = serialConfig->msp_baudrate; @@ -549,12 +554,12 @@ static void openAllMSPSerialPorts(serialConfig_t *serialConfig) } while (!port); if (port && portIndex < MAX_MSP_PORT_COUNT) { - mspPort_t *newMspPort = &mspPorts[portIndex++]; - - resetMspPort(newMspPort, port, FOR_GENERAL_MSP); + resetMspPort(mspPort, port, FOR_GENERAL_MSP); } - - } while (port); + if (!port) { + break; + } + } // XXX this function might help with adding support for MSP on more than one port, if not delete it. const serialPortFunctionList_t *serialPortFunctionList = getSerialPortFunctionList(); @@ -565,7 +570,7 @@ void mspReleasePortIfAllocated(serialPort_t *serialPort) { uint8_t portIndex; for (portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) { - mspPort_t *candidateMspPort = &mspPorts[portIndex++]; + mspPort_t *candidateMspPort = &mspPorts[portIndex]; if (candidateMspPort->port == serialPort) { endSerialPortFunction(serialPort, FUNCTION_MSP); memset(candidateMspPort, 0, sizeof(mspPort_t)); @@ -627,14 +632,8 @@ void mspInit(serialConfig_t *serialConfig) activeBoxIds[activeBoxIdCount++] = BOXSONAR; } - mspReset(serialConfig); -} - -void mspReset(serialConfig_t *serialConfig) -{ memset(mspPorts, 0x00, sizeof(mspPorts)); - - openAllMSPSerialPorts(serialConfig); + mspAllocateSerialPorts(serialConfig); } #define IS_ENABLED(mask) (mask == 0 ? 0 : 1) diff --git a/src/main/io/serial_msp.h b/src/main/io/serial_msp.h index bbc6303f1..80abd0213 100644 --- a/src/main/io/serial_msp.h +++ b/src/main/io/serial_msp.h @@ -23,5 +23,5 @@ void mspProcess(void); void sendMspTelemetry(void); void mspSetTelemetryPort(serialPort_t *mspTelemetryPort); -void mspReset(serialConfig_t *serialConfig); +void mspAllocateSerialPorts(serialConfig_t *serialConfig); void mspReleasePortIfAllocated(serialPort_t *serialPort); diff --git a/src/main/mw.c b/src/main/mw.c index ee8473b52..c752b09fb 100755 --- a/src/main/mw.c +++ b/src/main/mw.c @@ -303,7 +303,7 @@ void mwDisarm(void) // the telemetry state must be checked immediately so that shared serial ports are released. checkTelemetryState(); if (isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP)) { - mspReset(&masterConfig.serialConfig); + mspAllocateSerialPorts(&masterConfig.serialConfig); } } #endif