From fea9e3538962ed5faf22936ee6d373aecbe1030a Mon Sep 17 00:00:00 2001 From: jflyper Date: Thu, 13 Jul 2017 19:43:52 +0900 Subject: [PATCH 01/14] Improved timer assignments --- src/main/target/BETAFLIGHTF3/target.c | 30 ++++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/target/BETAFLIGHTF3/target.c b/src/main/target/BETAFLIGHTF3/target.c index 1b9743ff3d..ff952f3761 100755 --- a/src/main/target/BETAFLIGHTF3/target.c +++ b/src/main/target/BETAFLIGHTF3/target.c @@ -26,14 +26,24 @@ #include "drivers/dma.h" const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { - DEF_TIM(TIM4, CH2, PB7, TIM_USE_PPM, TIMER_INPUT_ENABLED), // PPM IN - DEF_TIM(TIM16,CH1, PA6, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM1 - DEF_TIM(TIM8, CH1N,PA7, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM2 - DEF_TIM(TIM8, CH2, PB8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM3 - DEF_TIM(TIM17,CH1, PB9, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM4 - DEF_TIM(TIM1, CH2N,PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM5 - DEF_TIM(TIM8, CH3N,PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM6 - DEF_TIM(TIM2, CH1, PA0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM7 - DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM8 - DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR | TIM_USE_LED, TIMER_OUTPUT_ENABLED), // LED_STRIP --requires resource remap with dshot (remap to motor 5??)-- + DEF_TIM(TIM4, CH2, PB7, TIM_USE_PPM, TIMER_INPUT_ENABLED), // PPM + DEF_TIM(TIM16,CH1, PA6, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM1 (1,4) + DEF_TIM(TIM8, CH1N,PA7, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM2 (2,3) + DEF_TIM(TIM8, CH2, PB8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM3 (2,5) + DEF_TIM(TIM17,CH1, PB9, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM4 (1,1) + + // For HEXA dshot + DEF_TIM(TIM1, CH2N,PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM5 (1,3) + DEF_TIM(TIM8, CH3N,PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM6 (2,1) + +#if 0 + // For softserial + DEF_TIM(TIM3, CH3, PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM5 (1,2) !LED + DEF_TIM(TIM3, CH4, PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM6 (1,3) +#endif + + DEF_TIM(TIM2, CH4, PA3, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM7/UART2_RX + DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM8/UART2_TX + + DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR | TIM_USE_LED, TIMER_OUTPUT_ENABLED), // LED (1,2) }; From 779d3ceb0af6156a2b375fadd685c819c22c1b2f Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Fri, 14 Jul 2017 00:07:44 +0800 Subject: [PATCH 02/14] Added ESC info display for 'dshotprog 255 6' invocation (all ESCs). --- src/main/fc/cli.c | 57 ++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index f028265434..52a2062544 100755 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -883,7 +883,7 @@ static void cliSerialPassthrough(char *cmdline) serialPortUsage_t *passThroughPortUsage = findSerialPortUsageByIdentifier(id); if (!passThroughPortUsage || passThroughPortUsage->serialPort == NULL) { if (!baud) { - cliPrint("closed, specify baud.\r\n"); + cliPrintLine("closed, specify baud."); return; } if (!mode) @@ -893,7 +893,7 @@ static void cliSerialPassthrough(char *cmdline) baud, mode, SERIAL_NOT_INVERTED); if (!passThroughPort) { - cliPrint("could not be opened.\r\n"); + cliPrintLine("could not be opened."); return; } cliPrintf("opened, baud = %d.\r\n", baud); @@ -901,7 +901,7 @@ static void cliSerialPassthrough(char *cmdline) passThroughPort = passThroughPortUsage->serialPort; // If the user supplied a mode, override the port's mode, otherwise // leave the mode unchanged. serialPassthrough() handles one-way ports. - cliPrint("already open.\r\n"); + cliPrintLine("already open."); if (mode && passThroughPort->mode != mode) { cliPrintf("mode changed from %d to %d.\r\n", passThroughPort->mode, mode); @@ -914,7 +914,7 @@ static void cliSerialPassthrough(char *cmdline) } } - cliPrint("Forwarding, power cycle to exit.\r\n"); + cliPrintLine("Forwarding, power cycle to exit."); serialPassthrough(cliPort, passThroughPort, NULL, NULL); } @@ -2296,13 +2296,33 @@ void printEscInfo(const uint8_t *escInfoBytes, uint8_t bytesRead) cliPrintLinef("3D: %s", escInfoBytes[17] ? "on" : "off"); } } else { - cliPrint("Checksum error."); + cliPrintLine("Checksum error."); } } } if (!escInfoReceived) { - cliPrint("No info."); + cliPrintLine("No info."); + } +} + +static void writeDshotCommand(uint8_t escIndex, uint8_t command) +{ + uint8_t escInfoBuffer[ESC_INFO_V2_EXPECTED_FRAME_SIZE]; + if (command == DSHOT_CMD_ESC_INFO) { + cliPrintLinef("Info for ESC %d:", escIndex); + + delay(10); // Wait for potential ESC telemetry transmission to finish + + startEscDataRead(escInfoBuffer, ESC_INFO_V2_EXPECTED_FRAME_SIZE); + } + + pwmWriteDshotCommand(escIndex, command); + + if (command == DSHOT_CMD_ESC_INFO) { + delay(10); + + printEscInfo(escInfoBuffer, getNumberEscBytesRead()); } } @@ -2334,34 +2354,19 @@ static void cliDshotProg(char *cmdline) if (command >= 0 && command < DSHOT_MIN_THROTTLE) { if (escIndex == ALL_MOTORS) { for (unsigned i = 0; i < getMotorCount(); i++) { - pwmWriteDshotCommand(i, command); + writeDshotCommand(i, command); } - - cliPrintf("Command %d written.\r\n", command); } else { - uint8_t escInfoBuffer[ESC_INFO_V2_EXPECTED_FRAME_SIZE]; - if (command == DSHOT_CMD_ESC_INFO) { - delay(10); // Wait for potential ESC telemetry transmission to finish + writeDshotCommand(escIndex, command); + } - startEscDataRead(escInfoBuffer, ESC_INFO_V2_EXPECTED_FRAME_SIZE); - } - - pwmWriteDshotCommand(escIndex, command); - - if (command == DSHOT_CMD_ESC_INFO) { - delay(10); - - printEscInfo(escInfoBuffer, getNumberEscBytesRead()); - } else { - cliPrintf("Command %d written.\r\n", command); - } - } + cliPrintLinef("Command %d written.", command); if (command <= 5) { delay(10); // wait for sound output to finish } } else { - cliPrintf("Invalid command, range 1 to %d.\r\n", DSHOT_MIN_THROTTLE - 1); + cliPrintLinef("Invalid command, range 1 to %d.", DSHOT_MIN_THROTTLE - 1); } break; From 0c3a4dbd64f3094d7f48e8dfa8b62ef3a815cb02 Mon Sep 17 00:00:00 2001 From: jflyper Date: Fri, 14 Jul 2017 10:49:08 +0900 Subject: [PATCH 03/14] Set hexa dshot as a compile time option --- src/main/target/BETAFLIGHTF3/target.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/target/BETAFLIGHTF3/target.c b/src/main/target/BETAFLIGHTF3/target.c index ff952f3761..421d5297c7 100755 --- a/src/main/target/BETAFLIGHTF3/target.c +++ b/src/main/target/BETAFLIGHTF3/target.c @@ -32,11 +32,11 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { DEF_TIM(TIM8, CH2, PB8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM3 (2,5) DEF_TIM(TIM17,CH1, PB9, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM4 (1,1) +#ifdef BFF3_USE_HEXA_DSHOT // For HEXA dshot DEF_TIM(TIM1, CH2N,PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM5 (1,3) DEF_TIM(TIM8, CH3N,PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM6 (2,1) - -#if 0 +#else // For softserial DEF_TIM(TIM3, CH3, PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM5 (1,2) !LED DEF_TIM(TIM3, CH4, PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED), // PWM6 (1,3) @@ -45,5 +45,6 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { DEF_TIM(TIM2, CH4, PA3, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM7/UART2_RX DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED), // PWM8/UART2_TX + // When using softserial config, LED will have DMA conflict with PB0 (SOFTSERIAL1_RX). DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR | TIM_USE_LED, TIMER_OUTPUT_ENABLED), // LED (1,2) }; From ae21fceafd2c6eacc52fefbd8e21c9d384fc5a62 Mon Sep 17 00:00:00 2001 From: Bas Delfos Date: Fri, 14 Jul 2017 14:21:31 +0200 Subject: [PATCH 04/14] Fixed features in dump command --- src/main/fc/cli.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index f028265434..5a15f9310f 100755 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -147,6 +147,7 @@ static uint32_t bufferIndex = 0; static bool configIsInCopy = false; static const char* const emptyName = "-"; +static const char* const emptryString = ""; #ifndef USE_QUAD_MIXER_ONLY // sync this with mixerMode_e @@ -1911,18 +1912,22 @@ static void printFeature(uint8_t dumpMask, const featureConfig_t *featureConfig, { const uint32_t mask = featureConfig->enabledFeatures; const uint32_t defaultMask = featureConfigDefault->enabledFeatures; - for (uint32_t i = 0; featureNames[i]; i++) { // disable all feature first - const char *format = "feature -%s"; - cliDefaultPrintLinef(dumpMask, (defaultMask | ~mask) & (1 << i), format, featureNames[i]); - cliDumpPrintLinef(dumpMask, (~defaultMask | mask) & (1 << i), format, featureNames[i]); - } - for (uint32_t i = 0; featureNames[i]; i++) { // reenable what we want. - const char *format = "feature %s"; - if (defaultMask & (1 << i)) { - cliDefaultPrintLinef(dumpMask, (~defaultMask | mask) & (1 << i), format, featureNames[i]); + for (uint32_t i = 0; featureNames[i]; i++) { // disabled features first + if (strcmp(featureNames[i], emptryString) != 0) { //Skip unused + const char *format = "feature -%s"; + cliDefaultPrintLinef(dumpMask, (defaultMask | ~mask) & (1 << i), format, featureNames[i]); + cliDumpPrintLinef(dumpMask, (~defaultMask | mask) & (1 << i), format, featureNames[i]); } - if (mask & (1 << i)) { - cliDumpPrintLinef(dumpMask, (defaultMask | ~mask) & (1 << i), format, featureNames[i]); + } + for (uint32_t i = 0; featureNames[i]; i++) { // enabled features + if (strcmp(featureNames[i], emptryString) != 0) { //Skip unused + const char *format = "feature %s"; + if (defaultMask & (1 << i)) { + cliDefaultPrintLinef(dumpMask, (~defaultMask | mask) & (1 << i), format, featureNames[i]); + } + if (mask & (1 << i)) { + cliDumpPrintLinef(dumpMask, (defaultMask | ~mask) & (1 << i), format, featureNames[i]); + } } } } @@ -1946,7 +1951,7 @@ static void cliFeature(char *cmdline) for (uint32_t i = 0; ; i++) { if (featureNames[i] == NULL) break; - if (strcmp(featureNames[i], "") != 0) //Skip unused + if (strcmp(featureNames[i], emptryString) != 0) //Skip unused cliPrintf(" %s", featureNames[i]); } cliPrintLinefeed(); From 905998ba7a6aa7c0868d90a70ae91123c3241a04 Mon Sep 17 00:00:00 2001 From: jflyper Date: Fri, 14 Jul 2017 22:37:08 +0900 Subject: [PATCH 05/14] Use i2c_OLED_send_cmdarray instead of bunch of i2c_OLED_send_cmd --- src/main/drivers/display_ug2864hsweg01.c | 107 +++++++++++++++-------- 1 file changed, 70 insertions(+), 37 deletions(-) diff --git a/src/main/drivers/display_ug2864hsweg01.c b/src/main/drivers/display_ug2864hsweg01.c index 527a81aa57..19e80deaa1 100644 --- a/src/main/drivers/display_ug2864hsweg01.c +++ b/src/main/drivers/display_ug2864hsweg01.c @@ -20,6 +20,8 @@ #include "platform.h" +#include "common/utils.h" + #include "drivers/bus_i2c.h" #include "display_ug2864hsweg01.h" @@ -181,35 +183,61 @@ static bool i2c_OLED_send_cmd(busDevice_t *bus, uint8_t command) return i2cWrite(bus->i2c.device, bus->i2c.address, 0x80, command); } +static bool i2c_OLED_send_cmdarray(busDevice_t *bus, const uint8_t *commands, size_t len) +{ + for (size_t i = 0 ; i < len ; i++) { + if (i2c_OLED_send_cmd(bus, *commands++)) { + return false; + } + } + + return true; +} + static bool i2c_OLED_send_byte(busDevice_t *bus, uint8_t val) { return i2cWrite(bus->i2c.device, bus->i2c.address, 0x40, val); } +static const uint8_t i2c_OLED_cmd_clear_display_pre[] = { + 0xa6, // Set Normal Display + 0xae, // Display OFF + 0x20, // Set Memory Addressing Mode + 0x00, // Set Memory Addressing Mode to Horizontal addressing mode + 0xb0, // set page address to 0 + 0x40, // Display start line register to 0 + 0, // Set low col address to 0 + 0x10, // Set high col address to 0 +}; + +static const uint8_t i2c_OLED_cmd_clear_display_post[] = { + 0x81, // Setup CONTRAST CONTROL, following byte is the contrast Value... always a 2 byte instruction + 200, // Here you can set the brightness 1 = dull, 255 is very bright + 0xaf, // display on +}; + void i2c_OLED_clear_display(busDevice_t *bus) { - i2c_OLED_send_cmd(bus, 0xa6); // Set Normal Display - i2c_OLED_send_cmd(bus, 0xae); // Display OFF - i2c_OLED_send_cmd(bus, 0x20); // Set Memory Addressing Mode - i2c_OLED_send_cmd(bus, 0x00); // Set Memory Addressing Mode to Horizontal addressing mode - i2c_OLED_send_cmd(bus, 0xb0); // set page address to 0 - i2c_OLED_send_cmd(bus, 0x40); // Display start line register to 0 - i2c_OLED_send_cmd(bus, 0); // Set low col address to 0 - i2c_OLED_send_cmd(bus, 0x10); // Set high col address to 0 + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_pre, ARRAYLEN(i2c_OLED_cmd_clear_display_pre)); + for (uint16_t i = 0; i < 1024; i++) { // fill the display's RAM with graphic... 128*64 pixel picture i2c_OLED_send_byte(bus, 0x00); // clear } - i2c_OLED_send_cmd(bus, 0x81); // Setup CONTRAST CONTROL, following byte is the contrast Value... always a 2 byte instruction - i2c_OLED_send_cmd(bus, 200); // Here you can set the brightness 1 = dull, 255 is very bright - i2c_OLED_send_cmd(bus, 0xaf); // display on + + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_post, ARRAYLEN(i2c_OLED_cmd_clear_display_post)); } +static const uint8_t i2c_OLED_cmd_clear_display_quick[] = { + 0xb0, // set page address to 0 + 0x40, // Display start line register to 0 + 0, // Set low col address to 0 + 0x10, // Set high col address to 0 +}; + void i2c_OLED_clear_display_quick(busDevice_t *bus) { - i2c_OLED_send_cmd(bus, 0xb0); // set page address to 0 - i2c_OLED_send_cmd(bus, 0x40); // Display start line register to 0 - i2c_OLED_send_cmd(bus, 0); // Set low col address to 0 - i2c_OLED_send_cmd(bus, 0x10); // Set high col address to 0 + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_quick, ARRAYLEN(i2c_OLED_cmd_clear_display_quick)); + for (uint16_t i = 0; i < 1024; i++) { // fill the display's RAM with graphic... 128*64 pixel picture i2c_OLED_send_byte(bus, 0x00); // clear } @@ -253,6 +281,32 @@ void i2c_OLED_send_string(busDevice_t *bus, const char *string) /** * according to http://www.adafruit.com/datasheets/UG-2864HSWEG01.pdf Chapter 4.4 Page 15 */ + +static const uint8_t i2c_OLED_cmd_init[] = { + 0xD4, // Set Display Clock Divide Ratio / OSC Frequency + 0x80, // Display Clock Divide Ratio / OSC Frequency + 0xA8, // Set Multiplex Ratio + 0x3F, // Multiplex Ratio for 128x64 (64-1) + 0xD3, // Set Display Offset + 0x00, // Display Offset + 0x40, // Set Display Start Line + 0x8D, // Set Charge Pump + 0x14, // Charge Pump (0x10 External, 0x14 Internal DC/DC) + 0xA1, // Set Segment Re-Map + 0xC8, // Set Com Output Scan Direction + 0xDA, // Set COM Hardware Configuration + 0x12, // COM Hardware Configuration + 0x81, // Set Contrast + 0xCF, // Contrast + 0xD9, // Set Pre-Charge Period + 0xF1, // Set Pre-Charge Period (0x22 External, 0xF1 Internal) + 0xDB, // Set VCOMH Deselect Level + 0x40, // VCOMH Deselect Level + 0xA4, // Set all pixels OFF + 0xA6, // Set display not inverted + 0xAF, // Set display On +}; + bool ug2864hsweg01InitI2C(busDevice_t *bus) { @@ -261,28 +315,7 @@ bool ug2864hsweg01InitI2C(busDevice_t *bus) return false; } - i2c_OLED_send_cmd(bus, 0xD4); // Set Display Clock Divide Ratio / OSC Frequency - i2c_OLED_send_cmd(bus, 0x80); // Display Clock Divide Ratio / OSC Frequency - i2c_OLED_send_cmd(bus, 0xA8); // Set Multiplex Ratio - i2c_OLED_send_cmd(bus, 0x3F); // Multiplex Ratio for 128x64 (64-1) - i2c_OLED_send_cmd(bus, 0xD3); // Set Display Offset - i2c_OLED_send_cmd(bus, 0x00); // Display Offset - i2c_OLED_send_cmd(bus, 0x40); // Set Display Start Line - i2c_OLED_send_cmd(bus, 0x8D); // Set Charge Pump - i2c_OLED_send_cmd(bus, 0x14); // Charge Pump (0x10 External, 0x14 Internal DC/DC) - i2c_OLED_send_cmd(bus, 0xA1); // Set Segment Re-Map - i2c_OLED_send_cmd(bus, 0xC8); // Set Com Output Scan Direction - i2c_OLED_send_cmd(bus, 0xDA); // Set COM Hardware Configuration - i2c_OLED_send_cmd(bus, 0x12); // COM Hardware Configuration - i2c_OLED_send_cmd(bus, 0x81); // Set Contrast - i2c_OLED_send_cmd(bus, 0xCF); // Contrast - i2c_OLED_send_cmd(bus, 0xD9); // Set Pre-Charge Period - i2c_OLED_send_cmd(bus, 0xF1); // Set Pre-Charge Period (0x22 External, 0xF1 Internal) - i2c_OLED_send_cmd(bus, 0xDB); // Set VCOMH Deselect Level - i2c_OLED_send_cmd(bus, 0x40); // VCOMH Deselect Level - i2c_OLED_send_cmd(bus, 0xA4); // Set all pixels OFF - i2c_OLED_send_cmd(bus, 0xA6); // Set display not inverted - i2c_OLED_send_cmd(bus, 0xAF); // Set display On + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_init, ARRAYLEN(i2c_OLED_cmd_init)); i2c_OLED_clear_display(bus); From 334dbc3039c0520fcf7f68506eafce5779bd39c0 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 14 Jul 2017 14:44:16 +0100 Subject: [PATCH 06/14] Ensure PID/rate profile is updated before editing values --- src/main/cms/cms_menu_imu.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/cms/cms_menu_imu.c b/src/main/cms/cms_menu_imu.c index 046801d526..1144618b54 100644 --- a/src/main/cms/cms_menu_imu.c +++ b/src/main/cms/cms_menu_imu.c @@ -88,6 +88,7 @@ static long cmsx_profileIndexOnChange(displayPort_t *displayPort, const void *pt UNUSED(ptr); pidProfileIndex = tmpPidProfileIndex - 1; + changePidProfile(pidProfileIndex); return 0; } @@ -98,6 +99,7 @@ static long cmsx_rateProfileIndexOnChange(displayPort_t *displayPort, const void UNUSED(ptr); rateProfileIndex = tmpRateProfileIndex - 1; + changeControlRateProfile(rateProfileIndex); return 0; } From 79c13673befa98b3f75d9c10842e29d0a1004b4b Mon Sep 17 00:00:00 2001 From: Bas Delfos Date: Fri, 14 Jul 2017 16:06:12 +0200 Subject: [PATCH 07/14] Replace dataSize with sbufBytesRemaining() --- src/main/fc/fc_msp.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 908f1db2eb..0895208eb6 100644 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -115,6 +115,9 @@ #define STATIC_ASSERT(condition, name) \ typedef char assert_failed_ ## name [(condition) ? 1 : -1 ] __attribute__((unused)) +#define BYTES_REMAINING_GTE(num) \ + sbufBytesRemaining(src) >= num + static const char * const flightControllerIdentifier = BETAFLIGHT_IDENTIFIER; // 4 UPPER CASE alpha numeric characters that identify the flight controller. static const char * const boardIdentifier = TARGET_BOARD_IDENTIFIER; @@ -1597,7 +1600,7 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) break; case MSP_SET_RC_TUNING: - if (dataSize >= 10) { + if (BYTES_REMAINING_GTE(10)) { currentControlRateProfile->rcRate8 = sbufReadU8(src); currentControlRateProfile->rcExpo8 = sbufReadU8(src); for (int i = 0; i < 3; i++) { @@ -1609,10 +1612,10 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) currentControlRateProfile->thrMid8 = sbufReadU8(src); currentControlRateProfile->thrExpo8 = sbufReadU8(src); currentControlRateProfile->tpa_breakpoint = sbufReadU16(src); - if (dataSize >= 11) { + if (BYTES_REMAINING_GTE(1)) { currentControlRateProfile->rcYawExpo8 = sbufReadU8(src); } - if (dataSize >= 12) { + if (BYTES_REMAINING_GTE(1)) { currentControlRateProfile->rcYawRate8 = sbufReadU8(src); } generateThrottleCurve(); @@ -1738,17 +1741,17 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) gyroConfigMutable()->gyro_soft_lpf_hz = sbufReadU8(src); currentPidProfile->dterm_lpf_hz = sbufReadU16(src); currentPidProfile->yaw_lpf_hz = sbufReadU16(src); - if (dataSize > 5) { + if (BYTES_REMAINING_GTE(8)) { gyroConfigMutable()->gyro_soft_notch_hz_1 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_1 = sbufReadU16(src); currentPidProfile->dterm_notch_hz = sbufReadU16(src); currentPidProfile->dterm_notch_cutoff = sbufReadU16(src); } - if (dataSize > 13) { + if (BYTES_REMAINING_GTE(4)) { gyroConfigMutable()->gyro_soft_notch_hz_2 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_2 = sbufReadU16(src); } - if (dataSize > 17) { + if (BYTES_REMAINING_GTE(1)) { currentPidProfile->dterm_filter_type = sbufReadU8(src); } // reinitialize the gyro filters with the new values @@ -1771,11 +1774,11 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) sbufReadU8(src); // reserved currentPidProfile->rateAccelLimit = sbufReadU16(src); currentPidProfile->yawRateAccelLimit = sbufReadU16(src); - if (dataSize > 17) { + if (BYTES_REMAINING_GTE(2)) { currentPidProfile->levelAngleLimit = sbufReadU8(src); currentPidProfile->levelSensitivity = sbufReadU8(src); } - if (dataSize > 19) { + if (BYTES_REMAINING_GTE(4)) { currentPidProfile->itermThrottleThreshold = sbufReadU16(src); currentPidProfile->itermAcceleratorGain = sbufReadU16(src); } @@ -1928,21 +1931,21 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) rxConfigMutable()->midrc = sbufReadU16(src); rxConfigMutable()->mincheck = sbufReadU16(src); rxConfigMutable()->spektrum_sat_bind = sbufReadU8(src); - if (dataSize > 8) { + if (BYTES_REMAINING_GTE(4)) { rxConfigMutable()->rx_min_usec = sbufReadU16(src); rxConfigMutable()->rx_max_usec = sbufReadU16(src); } - if (dataSize > 12) { + if (BYTES_REMAINING_GTE(4)) { rxConfigMutable()->rcInterpolation = sbufReadU8(src); rxConfigMutable()->rcInterpolationInterval = sbufReadU8(src); rxConfigMutable()->airModeActivateThreshold = sbufReadU16(src); } - if (dataSize > 16) { + if (BYTES_REMAINING_GTE(6)) { rxConfigMutable()->rx_spi_protocol = sbufReadU8(src); rxConfigMutable()->rx_spi_id = sbufReadU32(src); rxConfigMutable()->rx_spi_rf_channel_count = sbufReadU8(src); } - if (dataSize > 22) { + if (BYTES_REMAINING_GTE(1)) { rxConfigMutable()->fpvCamAngleDegrees = sbufReadU8(src); } break; From 43913bea6e33978671bfdff1b9893631777f3791 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 14 Jul 2017 15:07:59 +0100 Subject: [PATCH 08/14] Ensure storage device status is reset after erasing flash --- src/main/cms/cms_menu_blackbox.c | 48 +++++++++++++++++--------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main/cms/cms_menu_blackbox.c b/src/main/cms/cms_menu_blackbox.c index f46e740ed3..baf3104a23 100644 --- a/src/main/cms/cms_menu_blackbox.c +++ b/src/main/cms/cms_menu_blackbox.c @@ -52,29 +52,6 @@ #include "io/flashfs.h" #include "io/beeper.h" - -#ifdef USE_FLASHFS -static long cmsx_EraseFlash(displayPort_t *pDisplay, const void *ptr) -{ - UNUSED(ptr); - - displayClearScreen(pDisplay); - displayWrite(pDisplay, 5, 3, "ERASING FLASH..."); - displayResync(pDisplay); // Was max7456RefreshAll(); Why at this timing? - - flashfsEraseCompletely(); - while (!flashfsIsReady()) { - delay(100); - } - - beeper(BEEPER_BLACKBOX_ERASE); - displayClearScreen(pDisplay); - displayResync(pDisplay); // Was max7456RefreshAll(); wedges during heavy SPI? - - return 0; -} -#endif // USE_FLASHFS - static const char * const cmsx_BlackboxDeviceNames[] = { "NONE", "FLASH ", @@ -163,6 +140,31 @@ static void cmsx_Blackbox_GetDeviceStatus() tfp_sprintf(cmsx_BlackboxDeviceStorageFree, "%ld%s", storageFree, unit); } +#ifdef USE_FLASHFS +static long cmsx_EraseFlash(displayPort_t *pDisplay, const void *ptr) +{ + UNUSED(ptr); + + displayClearScreen(pDisplay); + displayWrite(pDisplay, 5, 3, "ERASING FLASH..."); + displayResync(pDisplay); // Was max7456RefreshAll(); Why at this timing? + + flashfsEraseCompletely(); + while (!flashfsIsReady()) { + delay(100); + } + + beeper(BEEPER_BLACKBOX_ERASE); + displayClearScreen(pDisplay); + displayResync(pDisplay); // Was max7456RefreshAll(); wedges during heavy SPI? + + // Update storage device status to show new used space amount + cmsx_Blackbox_GetDeviceStatus(); + + return 0; +} +#endif // USE_FLASHFS + static long cmsx_Blackbox_onEnter(void) { cmsx_Blackbox_GetDeviceStatus(); From 3c8880d7817adffb5e891db345adc1976c1b225b Mon Sep 17 00:00:00 2001 From: Bas Delfos Date: Fri, 14 Jul 2017 17:11:51 +0200 Subject: [PATCH 09/14] Added `src` as argument to the macro --- src/main/fc/fc_msp.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 0895208eb6..8216bdd06e 100644 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -115,7 +115,7 @@ #define STATIC_ASSERT(condition, name) \ typedef char assert_failed_ ## name [(condition) ? 1 : -1 ] __attribute__((unused)) -#define BYTES_REMAINING_GTE(num) \ +#define BYTES_REMAINING_GTE(src, num) \ sbufBytesRemaining(src) >= num static const char * const flightControllerIdentifier = BETAFLIGHT_IDENTIFIER; // 4 UPPER CASE alpha numeric characters that identify the flight controller. @@ -1600,7 +1600,7 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) break; case MSP_SET_RC_TUNING: - if (BYTES_REMAINING_GTE(10)) { + if (BYTES_REMAINING_GTE(src, 10)) { currentControlRateProfile->rcRate8 = sbufReadU8(src); currentControlRateProfile->rcExpo8 = sbufReadU8(src); for (int i = 0; i < 3; i++) { @@ -1612,10 +1612,10 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) currentControlRateProfile->thrMid8 = sbufReadU8(src); currentControlRateProfile->thrExpo8 = sbufReadU8(src); currentControlRateProfile->tpa_breakpoint = sbufReadU16(src); - if (BYTES_REMAINING_GTE(1)) { + if (BYTES_REMAINING_GTE(src, 1)) { currentControlRateProfile->rcYawExpo8 = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(1)) { + if (BYTES_REMAINING_GTE(src, 1)) { currentControlRateProfile->rcYawRate8 = sbufReadU8(src); } generateThrottleCurve(); @@ -1741,17 +1741,17 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) gyroConfigMutable()->gyro_soft_lpf_hz = sbufReadU8(src); currentPidProfile->dterm_lpf_hz = sbufReadU16(src); currentPidProfile->yaw_lpf_hz = sbufReadU16(src); - if (BYTES_REMAINING_GTE(8)) { + if (BYTES_REMAINING_GTE(src, 8)) { gyroConfigMutable()->gyro_soft_notch_hz_1 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_1 = sbufReadU16(src); currentPidProfile->dterm_notch_hz = sbufReadU16(src); currentPidProfile->dterm_notch_cutoff = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(4)) { + if (BYTES_REMAINING_GTE(src, 4)) { gyroConfigMutable()->gyro_soft_notch_hz_2 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_2 = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(1)) { + if (BYTES_REMAINING_GTE(src, 1)) { currentPidProfile->dterm_filter_type = sbufReadU8(src); } // reinitialize the gyro filters with the new values @@ -1774,11 +1774,11 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) sbufReadU8(src); // reserved currentPidProfile->rateAccelLimit = sbufReadU16(src); currentPidProfile->yawRateAccelLimit = sbufReadU16(src); - if (BYTES_REMAINING_GTE(2)) { + if (BYTES_REMAINING_GTE(src, 2)) { currentPidProfile->levelAngleLimit = sbufReadU8(src); currentPidProfile->levelSensitivity = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(4)) { + if (BYTES_REMAINING_GTE(src, 4)) { currentPidProfile->itermThrottleThreshold = sbufReadU16(src); currentPidProfile->itermAcceleratorGain = sbufReadU16(src); } @@ -1931,21 +1931,21 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) rxConfigMutable()->midrc = sbufReadU16(src); rxConfigMutable()->mincheck = sbufReadU16(src); rxConfigMutable()->spektrum_sat_bind = sbufReadU8(src); - if (BYTES_REMAINING_GTE(4)) { + if (BYTES_REMAINING_GTE(src, 4)) { rxConfigMutable()->rx_min_usec = sbufReadU16(src); rxConfigMutable()->rx_max_usec = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(4)) { + if (BYTES_REMAINING_GTE(src, 4)) { rxConfigMutable()->rcInterpolation = sbufReadU8(src); rxConfigMutable()->rcInterpolationInterval = sbufReadU8(src); rxConfigMutable()->airModeActivateThreshold = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(6)) { + if (BYTES_REMAINING_GTE(src, 6)) { rxConfigMutable()->rx_spi_protocol = sbufReadU8(src); rxConfigMutable()->rx_spi_id = sbufReadU32(src); rxConfigMutable()->rx_spi_rf_channel_count = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(1)) { + if (BYTES_REMAINING_GTE(src, 1)) { rxConfigMutable()->fpvCamAngleDegrees = sbufReadU8(src); } break; From 71903ba6fded1ce140bc513c0781e01fd14e2123 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 14 Jul 2017 17:04:23 +0100 Subject: [PATCH 10/14] Fix a typo in OSD CMS menu for timer element toggling --- src/main/cms/cms_menu_osd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/cms/cms_menu_osd.c b/src/main/cms/cms_menu_osd.c index 4219e6367a..e7522a9ac7 100644 --- a/src/main/cms/cms_menu_osd.c +++ b/src/main/cms/cms_menu_osd.c @@ -66,8 +66,8 @@ OSD_Entry menuOsdActiveElemsEntries[] = {"CROSSHAIRS", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_CROSSHAIRS], 0}, {"HORIZON", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_ARTIFICIAL_HORIZON], 0}, {"HORIZON SIDEBARS", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_HORIZON_SIDEBARS], 0}, - {"TIMER 1", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_TIMER_1], 0}, - {"TIMER 2", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_TIMER_2], 0}, + {"TIMER 1", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_ITEM_TIMER_1], 0}, + {"TIMER 2", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_ITEM_TIMER_2], 0}, {"FLY MODE", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_FLYMODE], 0}, {"NAME", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_CRAFT_NAME], 0}, {"THROTTLE", OME_VISIBLE, NULL, &osdConfig_item_pos[OSD_THROTTLE_POS], 0}, From d8110ec3d3143216e8d25a9b819752a915bf233e Mon Sep 17 00:00:00 2001 From: jflyper Date: Sat, 15 Jul 2017 01:59:09 +0900 Subject: [PATCH 11/14] More conversions --- src/main/drivers/display_ug2864hsweg01.c | 133 +++++++++++------------ 1 file changed, 65 insertions(+), 68 deletions(-) diff --git a/src/main/drivers/display_ug2864hsweg01.c b/src/main/drivers/display_ug2864hsweg01.c index 19e80deaa1..4f29b2d5de 100644 --- a/src/main/drivers/display_ug2864hsweg01.c +++ b/src/main/drivers/display_ug2864hsweg01.c @@ -186,8 +186,9 @@ static bool i2c_OLED_send_cmd(busDevice_t *bus, uint8_t command) static bool i2c_OLED_send_cmdarray(busDevice_t *bus, const uint8_t *commands, size_t len) { for (size_t i = 0 ; i < len ; i++) { - if (i2c_OLED_send_cmd(bus, *commands++)) { - return false; + if (i2c_OLED_send_cmd(bus, commands[i])) { + // XXX Funny, i2cWrite is returning errors!? + // return; } } @@ -199,43 +200,15 @@ static bool i2c_OLED_send_byte(busDevice_t *bus, uint8_t val) return i2cWrite(bus->i2c.device, bus->i2c.address, 0x40, val); } -static const uint8_t i2c_OLED_cmd_clear_display_pre[] = { - 0xa6, // Set Normal Display - 0xae, // Display OFF - 0x20, // Set Memory Addressing Mode - 0x00, // Set Memory Addressing Mode to Horizontal addressing mode - 0xb0, // set page address to 0 - 0x40, // Display start line register to 0 - 0, // Set low col address to 0 - 0x10, // Set high col address to 0 -}; - -static const uint8_t i2c_OLED_cmd_clear_display_post[] = { - 0x81, // Setup CONTRAST CONTROL, following byte is the contrast Value... always a 2 byte instruction - 200, // Here you can set the brightness 1 = dull, 255 is very bright - 0xaf, // display on -}; - -void i2c_OLED_clear_display(busDevice_t *bus) -{ - i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_pre, ARRAYLEN(i2c_OLED_cmd_clear_display_pre)); - - for (uint16_t i = 0; i < 1024; i++) { // fill the display's RAM with graphic... 128*64 pixel picture - i2c_OLED_send_byte(bus, 0x00); // clear - } - - i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_post, ARRAYLEN(i2c_OLED_cmd_clear_display_post)); -} - -static const uint8_t i2c_OLED_cmd_clear_display_quick[] = { - 0xb0, // set page address to 0 - 0x40, // Display start line register to 0 - 0, // Set low col address to 0 - 0x10, // Set high col address to 0 -}; - void i2c_OLED_clear_display_quick(busDevice_t *bus) { + static const uint8_t i2c_OLED_cmd_clear_display_quick[] = { + 0xb0, // set page address to 0 + 0x40, // Display start line register to 0 + 0, // Set low col address to 0 + 0x10, // Set high col address to 0 + }; + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_quick, ARRAYLEN(i2c_OLED_cmd_clear_display_quick)); for (uint16_t i = 0; i < 1024; i++) { // fill the display's RAM with graphic... 128*64 pixel picture @@ -243,18 +216,42 @@ void i2c_OLED_clear_display_quick(busDevice_t *bus) } } +void i2c_OLED_clear_display(busDevice_t *bus) +{ + static const uint8_t i2c_OLED_cmd_clear_display_pre[] = { + 0xa6, // Set Normal Display + 0xae, // Display OFF + 0x20, // Set Memory Addressing Mode + 0x00, // Set Memory Addressing Mode to Horizontal addressing mode + }; + + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_pre, ARRAYLEN(i2c_OLED_cmd_clear_display_pre)); + + i2c_OLED_clear_display_quick(bus); + + static const uint8_t i2c_OLED_cmd_clear_display_post[] = { + 0x81, // Setup CONTRAST CONTROL, following byte is the contrast Value... always a 2 byte instruction + 200, // Here you can set the brightness 1 = dull, 255 is very bright + 0xaf, // display on + }; + + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_clear_display_post, ARRAYLEN(i2c_OLED_cmd_clear_display_post)); +} + void i2c_OLED_set_xy(busDevice_t *bus, uint8_t col, uint8_t row) { - i2c_OLED_send_cmd(bus, 0xb0 + row); //set page address - i2c_OLED_send_cmd(bus, 0x00 + ((CHARACTER_WIDTH_TOTAL * col) & 0x0f)); //set low col address - i2c_OLED_send_cmd(bus, 0x10 + (((CHARACTER_WIDTH_TOTAL * col) >> 4) & 0x0f)); //set high col address + uint8_t i2c_OLED_cmd_set_xy[] = { + 0xb0 + row, //set page address + 0x00 + ((CHARACTER_WIDTH_TOTAL * col) & 0x0f), //set low col address + 0x10 + (((CHARACTER_WIDTH_TOTAL * col) >> 4) & 0x0f) //set high col address + }; + + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_set_xy, ARRAYLEN(i2c_OLED_cmd_set_xy)); } void i2c_OLED_set_line(busDevice_t *bus, uint8_t row) { - i2c_OLED_send_cmd(bus, 0xb0 + row); //set page address - i2c_OLED_send_cmd(bus, 0); //set low col address - i2c_OLED_send_cmd(bus, 0x10); //set high col address + i2c_OLED_set_xy(bus, 0, row); } void i2c_OLED_send_char(busDevice_t *bus, unsigned char ascii) @@ -282,31 +279,6 @@ void i2c_OLED_send_string(busDevice_t *bus, const char *string) * according to http://www.adafruit.com/datasheets/UG-2864HSWEG01.pdf Chapter 4.4 Page 15 */ -static const uint8_t i2c_OLED_cmd_init[] = { - 0xD4, // Set Display Clock Divide Ratio / OSC Frequency - 0x80, // Display Clock Divide Ratio / OSC Frequency - 0xA8, // Set Multiplex Ratio - 0x3F, // Multiplex Ratio for 128x64 (64-1) - 0xD3, // Set Display Offset - 0x00, // Display Offset - 0x40, // Set Display Start Line - 0x8D, // Set Charge Pump - 0x14, // Charge Pump (0x10 External, 0x14 Internal DC/DC) - 0xA1, // Set Segment Re-Map - 0xC8, // Set Com Output Scan Direction - 0xDA, // Set COM Hardware Configuration - 0x12, // COM Hardware Configuration - 0x81, // Set Contrast - 0xCF, // Contrast - 0xD9, // Set Pre-Charge Period - 0xF1, // Set Pre-Charge Period (0x22 External, 0xF1 Internal) - 0xDB, // Set VCOMH Deselect Level - 0x40, // VCOMH Deselect Level - 0xA4, // Set all pixels OFF - 0xA6, // Set display not inverted - 0xAF, // Set display On -}; - bool ug2864hsweg01InitI2C(busDevice_t *bus) { @@ -315,6 +287,31 @@ bool ug2864hsweg01InitI2C(busDevice_t *bus) return false; } + static const uint8_t i2c_OLED_cmd_init[] = { + 0xD4, // Set Display Clock Divide Ratio / OSC Frequency + 0x80, // Display Clock Divide Ratio / OSC Frequency + 0xA8, // Set Multiplex Ratio + 0x3F, // Multiplex Ratio for 128x64 (64-1) + 0xD3, // Set Display Offset + 0x00, // Display Offset + 0x40, // Set Display Start Line + 0x8D, // Set Charge Pump + 0x14, // Charge Pump (0x10 External, 0x14 Internal DC/DC) + 0xA1, // Set Segment Re-Map + 0xC8, // Set Com Output Scan Direction + 0xDA, // Set COM Hardware Configuration + 0x12, // COM Hardware Configuration + 0x81, // Set Contrast + 0xCF, // Contrast + 0xD9, // Set Pre-Charge Period + 0xF1, // Set Pre-Charge Period (0x22 External, 0xF1 Internal) + 0xDB, // Set VCOMH Deselect Level + 0x40, // VCOMH Deselect Level + 0xA4, // Set all pixels OFF + 0xA6, // Set display not inverted + 0xAF, // Set display On + }; + i2c_OLED_send_cmdarray(bus, i2c_OLED_cmd_init, ARRAYLEN(i2c_OLED_cmd_init)); i2c_OLED_clear_display(bus); From b1cb04cbf6de0aab6b8807af0712d943da54f4cb Mon Sep 17 00:00:00 2001 From: kc10kevin Date: Thu, 13 Jul 2017 17:13:29 -0500 Subject: [PATCH 12/14] PPM Fix --- src/main/target/FURYF4/target.c | 3 +-- src/main/target/FURYF4/target.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/target/FURYF4/target.c b/src/main/target/FURYF4/target.c index 52dc1ded35..c2bcb4bfb9 100644 --- a/src/main/target/FURYF4/target.c +++ b/src/main/target/FURYF4/target.c @@ -29,8 +29,7 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { DEF_TIM(TIM8, CH4, PC9, TIM_USE_PPM, TIMER_INPUT_ENABLED, 0 ), // PPM IN DEF_TIM(TIM2, CH4, PA3, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 1 ), // S1_OUT - DMA1_ST6_CH3 DEF_TIM(TIM3, CH3, PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0 ), // S2_OUT - DMA1_ST7_CH5 - DEF_TIM(TIM8, CH3N, PB1, TIM_USE_MOTOR, TIMER_OUTPUT_INVERTED, 0 ), // S3_OUT - DMA2_ST2_CH0 -// DEF_TIM(TIM3, CH4, PB1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0 ), // S3_OUT - DMA1_ST2_CH5 + DEF_TIM(TIM1, CH3N, PB1, TIM_USE_MOTOR, TIMER_OUTPUT_INVERTED, 0 ), // S3_OUT - DMA2_ST6_CH0 DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0 ), // S4_OUT - DMA1_ST1_CH3 DEF_TIM(TIM5, CH1, PA0, TIM_USE_LED, TIMER_OUTPUT_ENABLED, 0 ), // LED_STRIP - DMA1_ST2_CH6 diff --git a/src/main/target/FURYF4/target.h b/src/main/target/FURYF4/target.h index fe0c20d305..4011a8dbe8 100644 --- a/src/main/target/FURYF4/target.h +++ b/src/main/target/FURYF4/target.h @@ -187,4 +187,4 @@ #define TARGET_IO_PORTD (BIT(2)) #define USABLE_TIMER_CHANNEL_COUNT 6 -#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) ) +#define USED_TIMERS ( TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) ) From f0bdc93a25f1c9d154c4ec95f91f19339ce63f61 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 15 Jul 2017 14:51:59 +1000 Subject: [PATCH 13/14] Fix motor twitch when unarmed and using synced protocols. --- src/main/drivers/pwm_output.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index 9c05608fb7..01c0eb8e9f 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -311,13 +311,14 @@ void motorDevInit(const motorDevConfig_t *motorConfig, uint16_t idlePulse, uint8 #endif /* standard PWM outputs */ - const unsigned pwmRateHz = useUnsyncedPwm ? motorConfig->motorPwmRate : ceilf(1 / (sMin + sLen * 2)); + // margin of safety is 4 periods when unsynced + const unsigned pwmRateHz = useUnsyncedPwm ? motorConfig->motorPwmRate : ceilf(1 / ((sMin + sLen) * 4)); const uint32_t clock = timerClock(timerHardware->tim); /* used to find the desired timer frequency for max resolution */ const unsigned prescaler = ((clock / pwmRateHz) + 0xffff) / 0x10000; /* rounding up */ const uint32_t hz = clock / prescaler; - const unsigned period = hz / pwmRateHz; + const unsigned period = useUnsyncedPwm ? hz / pwmRateHz : 0xffff; /* if brushed then it is the entire length of the period. From 807c155cab56188706352586ff810a8e46aead8b Mon Sep 17 00:00:00 2001 From: Bas Delfos Date: Sat, 15 Jul 2017 10:34:53 +0200 Subject: [PATCH 14/14] Replaced macro with actual code --- src/main/fc/fc_msp.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 8216bdd06e..3ec3301573 100644 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -115,9 +115,6 @@ #define STATIC_ASSERT(condition, name) \ typedef char assert_failed_ ## name [(condition) ? 1 : -1 ] __attribute__((unused)) -#define BYTES_REMAINING_GTE(src, num) \ - sbufBytesRemaining(src) >= num - static const char * const flightControllerIdentifier = BETAFLIGHT_IDENTIFIER; // 4 UPPER CASE alpha numeric characters that identify the flight controller. static const char * const boardIdentifier = TARGET_BOARD_IDENTIFIER; @@ -1600,7 +1597,7 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) break; case MSP_SET_RC_TUNING: - if (BYTES_REMAINING_GTE(src, 10)) { + if (sbufBytesRemaining(src) >= 10) { currentControlRateProfile->rcRate8 = sbufReadU8(src); currentControlRateProfile->rcExpo8 = sbufReadU8(src); for (int i = 0; i < 3; i++) { @@ -1612,10 +1609,10 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) currentControlRateProfile->thrMid8 = sbufReadU8(src); currentControlRateProfile->thrExpo8 = sbufReadU8(src); currentControlRateProfile->tpa_breakpoint = sbufReadU16(src); - if (BYTES_REMAINING_GTE(src, 1)) { + if (sbufBytesRemaining(src) >= 1) { currentControlRateProfile->rcYawExpo8 = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(src, 1)) { + if (sbufBytesRemaining(src) >= 1) { currentControlRateProfile->rcYawRate8 = sbufReadU8(src); } generateThrottleCurve(); @@ -1741,17 +1738,17 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) gyroConfigMutable()->gyro_soft_lpf_hz = sbufReadU8(src); currentPidProfile->dterm_lpf_hz = sbufReadU16(src); currentPidProfile->yaw_lpf_hz = sbufReadU16(src); - if (BYTES_REMAINING_GTE(src, 8)) { + if (sbufBytesRemaining(src) >= 8) { gyroConfigMutable()->gyro_soft_notch_hz_1 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_1 = sbufReadU16(src); currentPidProfile->dterm_notch_hz = sbufReadU16(src); currentPidProfile->dterm_notch_cutoff = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(src, 4)) { + if (sbufBytesRemaining(src) >= 4) { gyroConfigMutable()->gyro_soft_notch_hz_2 = sbufReadU16(src); gyroConfigMutable()->gyro_soft_notch_cutoff_2 = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(src, 1)) { + if (sbufBytesRemaining(src) >= 1) { currentPidProfile->dterm_filter_type = sbufReadU8(src); } // reinitialize the gyro filters with the new values @@ -1774,11 +1771,11 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) sbufReadU8(src); // reserved currentPidProfile->rateAccelLimit = sbufReadU16(src); currentPidProfile->yawRateAccelLimit = sbufReadU16(src); - if (BYTES_REMAINING_GTE(src, 2)) { + if (sbufBytesRemaining(src) >= 2) { currentPidProfile->levelAngleLimit = sbufReadU8(src); currentPidProfile->levelSensitivity = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(src, 4)) { + if (sbufBytesRemaining(src) >= 4) { currentPidProfile->itermThrottleThreshold = sbufReadU16(src); currentPidProfile->itermAcceleratorGain = sbufReadU16(src); } @@ -1931,21 +1928,21 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) rxConfigMutable()->midrc = sbufReadU16(src); rxConfigMutable()->mincheck = sbufReadU16(src); rxConfigMutable()->spektrum_sat_bind = sbufReadU8(src); - if (BYTES_REMAINING_GTE(src, 4)) { + if (sbufBytesRemaining(src) >= 4) { rxConfigMutable()->rx_min_usec = sbufReadU16(src); rxConfigMutable()->rx_max_usec = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(src, 4)) { + if (sbufBytesRemaining(src) >= 4) { rxConfigMutable()->rcInterpolation = sbufReadU8(src); rxConfigMutable()->rcInterpolationInterval = sbufReadU8(src); rxConfigMutable()->airModeActivateThreshold = sbufReadU16(src); } - if (BYTES_REMAINING_GTE(src, 6)) { + if (sbufBytesRemaining(src) >= 6) { rxConfigMutable()->rx_spi_protocol = sbufReadU8(src); rxConfigMutable()->rx_spi_id = sbufReadU32(src); rxConfigMutable()->rx_spi_rf_channel_count = sbufReadU8(src); } - if (BYTES_REMAINING_GTE(src, 1)) { + if (sbufBytesRemaining(src) >= 1) { rxConfigMutable()->fpvCamAngleDegrees = sbufReadU8(src); } break;