diff --git a/HISTORY.txt b/HISTORY.txt index 0be2551ff..765d790d1 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,5 +1,13 @@ Short summary of changes. For a complete list see the git log. +2011-10-20 +Inputs can be remapped to outputs to allow up to 10 channels of control. The +receiver inputs remap as follows: +Receiver 3 because output channel 7 +Receiver 4 because output channel 8 +Receiver 5 because output channel 9 +Receiver 6 because output channel 10 + 2011-10-11 Fix for the Mac telemetry rates and specifically how long enumeration took. diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index a3e47d45a..b68a1e524 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -410,6 +410,133 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = { }, }; + +static const struct pios_tim_channel pios_tim_servoport_rcvrport_pins[] = { + { + .timer = TIM4, + .timer_chan = TIM_Channel_4, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_9, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM4, + .timer_chan = TIM_Channel_3, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_8, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM4, + .timer_chan = TIM_Channel_2, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_7, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM1, + .timer_chan = TIM_Channel_1, + .pin = { + .gpio = GPIOA, + .init = { + .GPIO_Pin = GPIO_Pin_8, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM3, + .timer_chan = TIM_Channel_1, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_4, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + .remap = GPIO_PartialRemap_TIM3, + }, + { + .timer = TIM2, + .timer_chan = TIM_Channel_3, + .pin = { + .gpio = GPIOA, + .init = { + .GPIO_Pin = GPIO_Pin_2, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + + // Receiver port pins + // S3-S6 inputs are used as outputs in this case + { + .timer = TIM3, + .timer_chan = TIM_Channel_3, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_0, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM3, + .timer_chan = TIM_Channel_4, + .pin = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_1, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM2, + .timer_chan = TIM_Channel_1, + .pin = { + .gpio = GPIOA, + .init = { + .GPIO_Pin = GPIO_Pin_0, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, + { + .timer = TIM2, + .timer_chan = TIM_Channel_2, + .pin = { + .gpio = GPIOA, + .init = { + .GPIO_Pin = GPIO_Pin_1, + .GPIO_Mode = GPIO_Mode_AF_PP, + .GPIO_Speed = GPIO_Speed_2MHz, + }, + }, + }, +}; #if defined(PIOS_INCLUDE_USART) #include "pios_usart_priv.h" @@ -795,6 +922,22 @@ const struct pios_servo_cfg pios_servo_cfg = { .num_channels = NELEMENTS(pios_tim_servoport_all_pins), }; +const struct pios_servo_cfg pios_servo_rcvr_cfg = { + .tim_oc_init = { + .TIM_OCMode = TIM_OCMode_PWM1, + .TIM_OutputState = TIM_OutputState_Enable, + .TIM_OutputNState = TIM_OutputNState_Disable, + .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION, + .TIM_OCPolarity = TIM_OCPolarity_High, + .TIM_OCNPolarity = TIM_OCPolarity_High, + .TIM_OCIdleState = TIM_OCIdleState_Reset, + .TIM_OCNIdleState = TIM_OCNIdleState_Reset, + }, + .channels = pios_tim_servoport_rcvrport_pins, + .num_channels = NELEMENTS(pios_tim_servoport_rcvrport_pins), +}; + + /* * PPM Inputs */ @@ -1190,6 +1333,7 @@ void PIOS_Board_Init(void) { #endif /* PIOS_INCLUDE_PWM */ break; case HWSETTINGS_CC_RCVRPORT_PPM: + case HWSETTINGS_CC_RCVRPORT_PPMSERVO: #if defined(PIOS_INCLUDE_PPM) { uint32_t pios_ppm_id; @@ -1219,7 +1363,17 @@ void PIOS_Board_Init(void) { GPIO_PinRemapConfig( GPIO_Remap_SWJ_NoJTRST, ENABLE); #ifndef PIOS_DEBUG_ENABLE_DEBUG_PINS - PIOS_Servo_Init(&pios_servo_cfg); + switch (hwsettings_rcvrport) { + case HWSETTINGS_CC_RCVRPORT_DISABLED: + case HWSETTINGS_CC_RCVRPORT_PWM: + case HWSETTINGS_CC_RCVRPORT_PPM: + PIOS_Servo_Init(&pios_servo_cfg); + break; + case HWSETTINGS_CC_RCVRPORT_PPMSERVO: + case HWSETTINGS_CC_RCVRPORT_SERVO: + PIOS_Servo_Init(&pios_servo_rcvr_cfg); + break; + } #else PIOS_DEBUG_Init(&pios_tim_servo_all_channels, NELEMENTS(pios_tim_servo_all_channels)); #endif /* PIOS_DEBUG_ENABLE_DEBUG_PINS */ diff --git a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj index b860e748c..0b3b6fe51 100644 --- a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj +++ b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj @@ -99,8 +99,6 @@ 65643CB01413322000A32F59 /* pios_spektrum_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_spektrum_priv.h; sourceTree = ""; }; 65643CB91413456D00A32F59 /* pios_tim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_tim.c; sourceTree = ""; }; 65643CBA141350C200A32F59 /* pios_sbus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_sbus.c; sourceTree = ""; }; - 65643CEC141429A100A32F59 /* NMEA.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = NMEA.c; sourceTree = ""; }; - 65643CEE141429AF00A32F59 /* NMEA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMEA.h; sourceTree = ""; }; 6572CB1613D0F2B200FC2972 /* link_STM32103CB_CC_Rev1_memory.ld */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = link_STM32103CB_CC_Rev1_memory.ld; path = ../../PiOS/STM32F10x/link_STM32103CB_CC_Rev1_memory.ld; sourceTree = SOURCE_ROOT; }; 6572CB1713D0F2B200FC2972 /* link_STM32103CB_CC_Rev1_sections.ld */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = link_STM32103CB_CC_Rev1_sections.ld; path = ../../PiOS/STM32F10x/link_STM32103CB_CC_Rev1_sections.ld; sourceTree = SOURCE_ROOT; }; 657CEEAD121DB6C8007A1FBE /* homelocation.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = homelocation.xml; sourceTree = ""; }; @@ -2658,7 +2656,6 @@ 65C35E5612EFB2F3004811C2 /* attitudeactual.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = attitudeactual.xml; sourceTree = ""; }; 65C35E5812EFB2F3004811C2 /* attituderaw.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = attituderaw.xml; sourceTree = ""; }; 65C35E5912EFB2F3004811C2 /* baroaltitude.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = baroaltitude.xml; sourceTree = ""; }; - 65C35E5A12EFB2F3004811C2 /* batterysettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = batterysettings.xml; sourceTree = ""; }; 65C35E5C12EFB2F3004811C2 /* flightbatterystate.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightbatterystate.xml; sourceTree = ""; }; 65C35E5D12EFB2F3004811C2 /* flightplancontrol.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightplancontrol.xml; sourceTree = ""; }; 65C35E5E12EFB2F3004811C2 /* flightplansettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightplansettings.xml; sourceTree = ""; }; @@ -7436,7 +7433,6 @@ 65C35E4F12EFB2F3004811C2 /* uavobjectdefinition */ = { isa = PBXGroup; children = ( - 65E6D80713E3A4D0002A557A /* hwsettings.xml */, 65E8C788139AA2A800E1F979 /* accessorydesired.xml */, 65C35E5012EFB2F3004811C2 /* actuatorcommand.xml */, 65C35E5112EFB2F3004811C2 /* actuatordesired.xml */, @@ -7448,7 +7444,6 @@ 65C35E5812EFB2F3004811C2 /* attituderaw.xml */, 65E410AE12F65AEA00725888 /* attitudesettings.xml */, 65C35E5912EFB2F3004811C2 /* baroaltitude.xml */, - 65C35E5A12EFB2F3004811C2 /* batterysettings.xml */, 655B1A8E13B2FC0900B0E48D /* camerastabsettings.xml */, 652C8568132B632A00BFCC70 /* firmwareiapobj.xml */, 65C35E5C12EFB2F3004811C2 /* flightbatterystate.xml */, @@ -7463,6 +7458,7 @@ 65C35E6412EFB2F3004811C2 /* gpstime.xml */, 65C35E6512EFB2F3004811C2 /* guidancesettings.xml */, 65C35E6612EFB2F3004811C2 /* homelocation.xml */, + 65E6D80713E3A4D0002A557A /* hwsettings.xml */, 65C35E6712EFB2F3004811C2 /* i2cstats.xml */, 65C35E6812EFB2F3004811C2 /* manualcontrolcommand.xml */, 65C35E6912EFB2F3004811C2 /* manualcontrolsettings.xml */, @@ -7768,24 +7764,8 @@ 65E8F05811EFF25C00BBF654 /* STM32F10x */ = { isa = PBXGroup; children = ( - 65D1FBD813F51865006374A6 /* pios_bmp085.c */, - 6560A39D13EE277E00105DA5 /* pios_iap.c */, - 6560A39E13EE277E00105DA5 /* pios_sbus.c */, - 6560A38E13EE270C00105DA5 /* link_STM3210E_INS_BL_sections.ld */, - 6560A38F13EE270C00105DA5 /* link_STM3210E_INS_memory.ld */, - 6560A39013EE270C00105DA5 /* link_STM3210E_INS_sections.ld */, - 6560A39113EE270C00105DA5 /* link_STM3210E_OP_BL_sections.ld */, - 6560A39213EE270C00105DA5 /* link_STM3210E_OP_memory.ld */, - 6560A39313EE270C00105DA5 /* link_STM3210E_OP_sections.ld */, - 6560A39413EE270C00105DA5 /* link_STM32103CB_AHRS_BL_sections.ld */, - 6560A39513EE270C00105DA5 /* link_STM32103CB_AHRS_memory.ld */, - 6560A39613EE270C00105DA5 /* link_STM32103CB_AHRS_sections.ld */, - 6560A39713EE270C00105DA5 /* link_STM32103CB_CC_Rev1_BL_sections.ld */, 6572CB1613D0F2B200FC2972 /* link_STM32103CB_CC_Rev1_memory.ld */, 6572CB1713D0F2B200FC2972 /* link_STM32103CB_CC_Rev1_sections.ld */, - 6560A39813EE270C00105DA5 /* link_STM32103CB_PIPXTREME_BL_sections.ld */, - 6560A39913EE270C00105DA5 /* link_STM32103CB_PIPXTREME_memory.ld */, - 6560A39A13EE270C00105DA5 /* link_STM32103CB_PIPXTREME_sections.ld */, 65E8F05911EFF25C00BBF654 /* Libraries */, 65E8F0D811EFF25C00BBF654 /* link_stm32f10x_HD.ld */, 65E8F0DB11EFF25C00BBF654 /* link_stm32f10x_MD.ld */, diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index 28e7740c1..c6ab98e09 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -138,46 +138,6 @@ None - - - Channel 1 - - - - - Channel 2 - - - - - Channel 3 - - - - - Channel 4 - - - - - Channel 5 - - - - - Channel 6 - - - - - Channel 7 - - - - - Channel 8 - - @@ -187,46 +147,6 @@ None - - - Channel 1 - - - - - Channel 2 - - - - - Channel 3 - - - - - Channel 4 - - - - - Channel 5 - - - - - Channel 6 - - - - - Channel 7 - - - - - Channel 8 - - @@ -243,46 +163,6 @@ None - - - Channel 1 - - - - - Channel 2 - - - - - Channel 3 - - - - - Channel 4 - - - - - Channel 5 - - - - - Channel 6 - - - - - Channel 7 - - - - - Channel 8 - - diff --git a/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp b/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp index 96393b381..9f118532e 100644 --- a/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp @@ -105,10 +105,13 @@ ConfigAirframeWidget::ConfigAirframeWidget(QWidget *parent) : ConfigTaskWidget(p ffTuningInProgress = false; ffTuningPhase = false; - mixerTypes << "Mixer1Type" << "Mixer2Type" << "Mixer3Type" - << "Mixer4Type" << "Mixer5Type" << "Mixer6Type" << "Mixer7Type" << "Mixer8Type"; - mixerVectors << "Mixer1Vector" << "Mixer2Vector" << "Mixer3Vector" - << "Mixer4Vector" << "Mixer5Vector" << "Mixer6Vector" << "Mixer7Vector" << "Mixer8Vector"; + QStringList channels; + channels << "None"; + for (int i = 0; i < ActuatorSettings::CHANNELADDR_NUMELEM; i++) { + mixerTypes << QString("Mixer%1Type").arg(i+1); + mixerVectors << QString("Mixer%1Vector").arg(i+1); + channels << QString("Channel%1").arg(i+1); + } QStringList airframeTypes; airframeTypes << "Fixed Wing" << "Multirotor" << "Helicopter" << "Custom"; @@ -124,11 +127,6 @@ ConfigAirframeWidget::ConfigAirframeWidget(QWidget *parent) : ConfigTaskWidget(p << "Octo Coax X" << "Hexacopter Y6" << "Tricopter Y"; m_aircraft->multirotorFrameType->addItems(multiRotorTypes); - - - QStringList channels; - channels << "None" << "Channel1" << "Channel2" << "Channel3" << - "Channel4" << "Channel5" << "Channel6" << "Channel7" << "Channel8"; // Now load all the channel assignements for fixed wing m_aircraft->fwElevator1Channel->addItems(channels); m_aircraft->fwElevator2Channel->addItems(channels); diff --git a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp index afbdae760..739de0241 100644 --- a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp @@ -41,12 +41,26 @@ #include "camerastabsettings.h" #include "hwsettings.h" #include "mixersettings.h" +#include "actuatorcommand.h" ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent) { m_camerastabilization = new Ui_CameraStabilizationWidget(); m_camerastabilization->setupUi(this); + QComboBox * selectors[3] = { + m_camerastabilization->rollChannel, + m_camerastabilization->pitchChannel, + m_camerastabilization->yawChannel + }; + + for (int i = 0; i < 3; i++) { + selectors[i]->clear(); + selectors[i]->addItem("None"); + for (int j = 0; j < ActuatorCommand::CHANNEL_NUMELEM; j++) + selectors[i]->addItem(QString("Channel %1").arg(j+1)); + } + connectUpdates(); // Connect buttons diff --git a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp index 6b09238a0..1ed277bd0 100644 --- a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp @@ -38,28 +38,32 @@ #include #include #include +#include "actuatorcommand.h" +#include "systemalarms.h" ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(parent) { m_config = new Ui_OutputWidget(); m_config->setupUi(this); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD); - addUAVObject("ActuatorSettings"); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD); + addUAVObject("ActuatorSettings"); - // First of all, put all the channel widgets into lists, so that we can + // First of all, put all the channel widgets into lists, so that we can // manipulate those: - // NOTE: for historical reasons, we have objects below called ch0 to ch7, but the convention for OP is Channel 1 to Channel 8. + // NOTE: for historical reasons, we have objects below called ch0 to ch7, but the convention for OP is Channel 1 to Channel 8. outLabels << m_config->ch0OutValue - << m_config->ch1OutValue - << m_config->ch2OutValue - << m_config->ch3OutValue - << m_config->ch4OutValue - << m_config->ch5OutValue - << m_config->ch6OutValue - << m_config->ch7OutValue; + << m_config->ch1OutValue + << m_config->ch2OutValue + << m_config->ch3OutValue + << m_config->ch4OutValue + << m_config->ch5OutValue + << m_config->ch6OutValue + << m_config->ch7OutValue + << m_config->ch8OutValue + << m_config->ch9OutValue; outSliders << m_config->ch0OutSlider << m_config->ch1OutSlider @@ -68,7 +72,9 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren << m_config->ch4OutSlider << m_config->ch5OutSlider << m_config->ch6OutSlider - << m_config->ch7OutSlider; + << m_config->ch7OutSlider + << m_config->ch8OutSlider + << m_config->ch9OutSlider; outMin << m_config->ch0OutMin << m_config->ch1OutMin @@ -77,7 +83,9 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren << m_config->ch4OutMin << m_config->ch5OutMin << m_config->ch6OutMin - << m_config->ch7OutMin; + << m_config->ch7OutMin + << m_config->ch8OutMin + << m_config->ch9OutMin; outMax << m_config->ch0OutMax << m_config->ch1OutMax @@ -86,7 +94,9 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren << m_config->ch4OutMax << m_config->ch5OutMax << m_config->ch6OutMax - << m_config->ch7OutMax; + << m_config->ch7OutMax + << m_config->ch8OutMax + << m_config->ch9OutMax; reversals << m_config->ch0Rev << m_config->ch1Rev @@ -95,7 +105,9 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren << m_config->ch4Rev << m_config->ch5Rev << m_config->ch6Rev - << m_config->ch7Rev; + << m_config->ch7Rev + << m_config->ch8Rev + << m_config->ch9Rev; links << m_config->ch0Link << m_config->ch1Link @@ -104,15 +116,23 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren << m_config->ch4Link << m_config->ch5Link << m_config->ch6Link - << m_config->ch7Link; + << m_config->ch7Link + << m_config->ch8Link + << m_config->ch9Link; // Register for ActuatorSettings changes: - for (int i = 0; i < 8; i++) { + for (int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { connect(outMin[i], SIGNAL(editingFinished()), this, SLOT(setChOutRange())); connect(outMax[i], SIGNAL(editingFinished()), this, SLOT(setChOutRange())); connect(reversals[i], SIGNAL(toggled(bool)), this, SLOT(reverseChannel(bool))); // Now connect the channel out sliders to our signal to send updates in test mode connect(outSliders[i], SIGNAL(valueChanged(int)), this, SLOT(sendChannelTest(int))); + + addWidget(outMin[i]); + addWidget(outMax[i]); + addWidget(reversals[i]); + addWidget(outSliders[i]); + addWidget(links[i]); } connect(m_config->channelOutTest, SIGNAL(toggled(bool)), this, SLOT(runChannelTests(bool))); @@ -134,39 +154,7 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren addWidget(m_config->outputRate3); addWidget(m_config->outputRate2); addWidget(m_config->outputRate1); - addWidget(m_config->ch0OutMin); - addWidget(m_config->ch0OutSlider); - addWidget(m_config->ch0OutMax); - addWidget(m_config->ch0Rev); - addWidget(m_config->ch0Link); - addWidget(m_config->ch1OutMin); - addWidget(m_config->ch1OutSlider); - addWidget(m_config->ch1OutMax); - addWidget(m_config->ch1Rev); - addWidget(m_config->ch2OutMin); - addWidget(m_config->ch2OutSlider); - addWidget(m_config->ch2OutMax); - addWidget(m_config->ch2Rev); - addWidget(m_config->ch3OutMin); - addWidget(m_config->ch3OutSlider); - addWidget(m_config->ch3OutMax); - addWidget(m_config->ch3Rev); - addWidget(m_config->ch4OutMin); - addWidget(m_config->ch4OutSlider); - addWidget(m_config->ch4OutMax); - addWidget(m_config->ch4Rev); - addWidget(m_config->ch5OutMin); - addWidget(m_config->ch5OutSlider); - addWidget(m_config->ch5OutMax); - addWidget(m_config->ch5Rev); - addWidget(m_config->ch6OutMin); - addWidget(m_config->ch6OutSlider); - addWidget(m_config->ch6OutMax); - addWidget(m_config->ch6Rev); - addWidget(m_config->ch7OutMin); - addWidget(m_config->ch7OutSlider); - addWidget(m_config->ch7OutMax); - addWidget(m_config->ch7Rev); + addWidget(m_config->spinningArmed); } @@ -215,6 +203,22 @@ void ConfigOutputWidget::linkToggled(bool state) */ void ConfigOutputWidget::runChannelTests(bool state) { + SystemAlarms * systemAlarmsObj = SystemAlarms::GetInstance(getObjectManager()); + SystemAlarms::DataFields systemAlarms = systemAlarmsObj->getData(); + + if(state && systemAlarms.Alarm[SystemAlarms::ALARM_ACTUATOR] != SystemAlarms::ALARM_OK) { + QMessageBox mbox; + mbox.setText(QString(tr("The actuator module is in an error state. This can also occur because there are no inputs. Please fix these before testing outputs."))); + mbox.setStandardButtons(QMessageBox::Ok); + mbox.exec(); + + // Unfortunately must cache this since callback will reoccur + accInitialData = ActuatorCommand::GetInstance(getObjectManager())->getMetadata(); + + m_config->channelOutTest->setChecked(false); + return; + } + // Confirm this is definitely what they want if(state) { QMessageBox mbox; @@ -229,11 +233,7 @@ void ConfigOutputWidget::runChannelTests(bool state) } } - qDebug() << "Running with state " << state; - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - - UAVDataObject* obj = dynamic_cast(objManager->getObject(QString("ActuatorCommand"))); + ActuatorCommand * obj = ActuatorCommand::GetInstance(getObjectManager()); UAVObject::Metadata mdata = obj->getMetadata(); if (state) { @@ -307,6 +307,12 @@ void ConfigOutputWidget::assignOutputChannel(UAVDataObject *obj, QString str) case 7: m_config->ch7Output->setText(str); break; + case 8: + m_config->ch8Output->setText(str); + break; + case 9: + m_config->ch9Output->setText(str); + break; } } @@ -390,14 +396,8 @@ void ConfigOutputWidget::refreshWidgetsValues() UAVObjectManager *objManager = pm->getObject(); // Reset all channel assignements: - m_config->ch0Output->setText("-"); - m_config->ch1Output->setText("-"); - m_config->ch2Output->setText("-"); - m_config->ch3Output->setText("-"); - m_config->ch4Output->setText("-"); - m_config->ch5Output->setText("-"); - m_config->ch6Output->setText("-"); - m_config->ch7Output->setText("-"); + for (int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) + outLabels[i]->setText("-"); // Get the channel assignements: UAVDataObject * obj = dynamic_cast(objManager->getObject(QString("ActuatorSettings"))); @@ -449,7 +449,7 @@ void ConfigOutputWidget::refreshWidgetsValues() // Get Channel ranges: - for (int i=0;i<8;i++) { + for (int i=0;igetField(QString("ChannelMin")); int minValue = field->getValue(i).toInt(); outMin[i]->setValue(minValue); @@ -468,7 +468,7 @@ void ConfigOutputWidget::refreshWidgetsValues() } field = obj->getField(QString("ChannelNeutral")); - for (int i=0; i<8; i++) { + for (int i=0; igetValue(i).toInt(); outSliders[i]->setValue(value); outLabels[i]->setText(QString::number(value)); @@ -489,17 +489,17 @@ void ConfigOutputWidget::updateObjectsFromWidgets() // Now send channel ranges: UAVObjectField * field = obj->getField(QString("ChannelMax")); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { field->setValue(outMax[i]->value(),i); } field = obj->getField(QString("ChannelMin")); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { field->setValue(outMin[i]->value(),i); } field = obj->getField(QString("ChannelNeutral")); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { field->setValue(outSliders[i]->value(),i); } diff --git a/ground/openpilotgcs/src/plugins/config/output.ui b/ground/openpilotgcs/src/plugins/config/output.ui index b7855221f..b66c12cdc 100644 --- a/ground/openpilotgcs/src/plugins/config/output.ui +++ b/ground/openpilotgcs/src/plugins/config/output.ui @@ -970,6 +970,172 @@ p, li { white-space: pre-wrap; } + + + + Channel 9: + + + + + + + Channel 10: + + + + + + + + 9 + + + + - + + + Qt::AlignCenter + + + + + + + + 9 + + + + - + + + Qt::AlignCenter + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + Qt::Horizontal + + + + + + + 9999 + + + Qt::Horizontal + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 0000 + + + + + + + 0000 + + + + + + + + FreeSans + 8 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check to invert the channel.</p></body></html> + + + + + + + + + + + FreeSans + 8 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check to invert the channel.</p></body></html> + + + + + + + + + + Only used with Test Output mode + + + + + + + + + + Only used with Test Output mode + + + + + + diff --git a/ground/uavobjgenerator/generators/generator_common.h b/ground/uavobjgenerator/generators/generator_common.h index 0ae6f470e..719a6c3af 100644 --- a/ground/uavobjgenerator/generators/generator_common.h +++ b/ground/uavobjgenerator/generators/generator_common.h @@ -31,7 +31,7 @@ #include "generator_io.h" // These special chars (regexp) will be removed from C/java identifiers -#define ENUM_SPECIAL_CHARS "[\\.\\-\\s/]" +#define ENUM_SPECIAL_CHARS "[\\.\\-\\s\\+/]" void replaceCommonTags(QString& out, ObjectInfo* info); void replaceCommonTags(QString& out); diff --git a/shared/uavobjectdefinition/actuatorcommand.xml b/shared/uavobjectdefinition/actuatorcommand.xml index 0d7de05a6..c0b65bbbc 100644 --- a/shared/uavobjectdefinition/actuatorcommand.xml +++ b/shared/uavobjectdefinition/actuatorcommand.xml @@ -1,7 +1,7 @@ Contains the pulse duration sent to each of the channels. Set by @ref ActuatorModule - + diff --git a/shared/uavobjectdefinition/actuatorsettings.xml b/shared/uavobjectdefinition/actuatorsettings.xml index a4cf3bc76..1524797b4 100644 --- a/shared/uavobjectdefinition/actuatorsettings.xml +++ b/shared/uavobjectdefinition/actuatorsettings.xml @@ -1,27 +1,27 @@ Settings for the @ref ActuatorModule that controls the channel assignments for the mixer based on AircraftType - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 228d50b5e..714cc9d4f 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -3,7 +3,7 @@ Selection of optional hardware configurations. - + diff --git a/shared/uavobjectdefinition/mixersettings.xml b/shared/uavobjectdefinition/mixersettings.xml index 64aa7604f..e2df02ce0 100644 --- a/shared/uavobjectdefinition/mixersettings.xml +++ b/shared/uavobjectdefinition/mixersettings.xml @@ -24,6 +24,10 @@ + + + +