diff --git a/HISTORY.txt b/HISTORY.txt index b0e1ce8b0..98193adce 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,5 +1,20 @@ Short summary of changes. For a complete list see the git log. +2011-09-12 +Max rate now ONLY applies to attitude and axis lock mode. Manual rate is the +only term that limits the rate mode now (and in axis lock when you push stick +only manual rate applies). Also integrals are reset when unused. + +2011-09-09 +Some large updates to the input system. Now multiple receivers can be +connected at once. A wizard was added for configuring the input channels. A +specific collective pitch channel was added. + +2011-09-04 +Improvements to the failsafe handling code for inputs. PWM power off is now +detected properly. Powering on transmitter for Spektrum Satellite no longer +causes a glitch on servos. + 2011-08-10 Added Camera Stabilization and a gui to configure this. This is a software selectable module from the GUI. However, a restart is required to make it diff --git a/MILESTONES.txt b/MILESTONES.txt index 14db545d6..7029e5c5a 100644 --- a/MILESTONES.txt +++ b/MILESTONES.txt @@ -82,7 +82,7 @@ C: Sami Korhonen (Sambas) D: February 2011 V: http://vimeo.com/20159015 -M: First Position Hold on a Fixed Wing +M: First CopterControl Position Hold on a Fixed Wing C: Eric Price (Corvus Corax) D: March 2011 V: http://www.youtube.com/watch?v=QtaefhmGbio @@ -146,6 +146,12 @@ M: First CopterControl Flybared Heli funnel (4:18), loop (5:35) C: Sergey Solodennikov (alconaft43) D: August 2011 V: http://www.youtube.com/watch?v=8SrfIS7OkB4 + +M: First CopterControl Return to Base Fixed Wing +C: Eric Price (Corvus Corax) +D: AUgust 2011 +V: http://www.youtube.com/watch?v=CugI0oBSQn8 + M: First Altitude Hold using Sonar C: @@ -170,11 +176,11 @@ V: An incomplete list of some future Milestones is below: -* First Y6 CopterControl flight -* First Helicopter flight with OpenPilot +* First Helicopter flight with OpenPilot Pro +* First fixed wing navigation flight on CopterControl * First successful flight using the GCS only and no RC TX * First use of Magic Waypoint -* First Flybarless Helicopter flight with OpenPilot +* First Flybarless Helicopter flight with OpenPilot Pro * First fixed wing navigation flight * First Multirotor navigation flight * First Helicopter navigation flight @@ -183,4 +189,3 @@ An incomplete list of some future Milestones is below: * First "Follow Me" navigation flight * First Channel Crossing with OpenPilot - diff --git a/Makefile b/Makefile index 18cdb3b2e..0413d39a6 100644 --- a/Makefile +++ b/Makefile @@ -183,13 +183,13 @@ qt_sdk_clean: ARM_SDK_DIR := $(TOOLS_DIR)/arm-2011.03 .PHONY: arm_sdk_install -arm_sdk_install: ARM_SDK_URL := http://www.codesourcery.com/sgpp/lite/arm/portal/package8734/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 +arm_sdk_install: ARM_SDK_URL := https://sourcery.mentor.com/sgpp/lite/arm/portal/package8736/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 arm_sdk_install: ARM_SDK_FILE := $(notdir $(ARM_SDK_URL)) # order-only prereq on directory existance: arm_sdk_install: | $(DL_DIR) $(TOOLS_DIR) arm_sdk_install: arm_sdk_clean # download the source only if it's newer than what we already have - $(V1) wget -N -P "$(DL_DIR)" "$(ARM_SDK_URL)" + $(V1) wget --no-check-certificate -N -P "$(DL_DIR)" "$(ARM_SDK_URL)" # binary only release so just extract it $(V1) tar -C $(TOOLS_DIR) -xjf "$(DL_DIR)/$(ARM_SDK_FILE)" diff --git a/artwork/Font/OpenPilot.ttf b/artwork/Font/OpenPilot.ttf index 852f8914a..c3bb5765c 100644 Binary files a/artwork/Font/OpenPilot.ttf and b/artwork/Font/OpenPilot.ttf differ diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 0aafea4fa..1cf41e5bc 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1028,6 +1028,13 @@ void PIOS_Board_Init(void) { if (PIOS_SBUS_Init(&pios_sbus_id, &pios_sbus_cfg, &pios_usart_com_driver, pios_usart_sbus_id)) { PIOS_Assert(0); } + + uint32_t pios_sbus_rcvr_id; + if (PIOS_RCVR_Init(&pios_sbus_rcvr_id, &pios_sbus_rcvr_driver, pios_sbus_id)) { + PIOS_Assert(0); + } + pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_SBUS] = pios_sbus_rcvr_id; + } #endif /* PIOS_INCLUDE_SBUS */ break; diff --git a/flight/Modules/Actuator/actuator.c b/flight/Modules/Actuator/actuator.c index b457d07c5..f50848ddc 100644 --- a/flight/Modules/Actuator/actuator.c +++ b/flight/Modules/Actuator/actuator.c @@ -42,7 +42,7 @@ #include "mixersettings.h" #include "mixerstatus.h" #include "cameradesired.h" - +#include "manualcontrolcommand.h" // Private constants #define MAX_QUEUE_SIZE 2 @@ -238,6 +238,11 @@ static void actuatorTask(void* parameters) case MIXERSETTINGS_CURVE2SOURCE_YAW: curve2 = MixerCurve(desired.Yaw,mixerSettings.ThrottleCurve2,MIXERSETTINGS_THROTTLECURVE2_NUMELEM); break; + case MIXERSETTINGS_CURVE2SOURCE_COLLECTIVE: + ManualControlCommandCollectiveGet(&curve2); + curve2 = MixerCurve(curve2,mixerSettings.ThrottleCurve2, + MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + break; case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY0: case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY1: case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY2: diff --git a/flight/Modules/ManualControl/inc/manualcontrol.h b/flight/Modules/ManualControl/inc/manualcontrol.h index 5cca1a623..1215ca27d 100644 --- a/flight/Modules/ManualControl/inc/manualcontrol.h +++ b/flight/Modules/ManualControl/inc/manualcontrol.h @@ -105,4 +105,11 @@ int32_t ManualControlInitialize(); ( (int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_POSITIONHOLD == (int) FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) \ ) +#define assumptions_channelcount ( \ +( (int)MANUALCONTROLCOMMAND_CHANNEL_NUMELEM == (int)MANUALCONTROLSETTINGS_CHANNELGROUPS_NUMELEM ) && \ +( (int)MANUALCONTROLCOMMAND_CHANNEL_NUMELEM == (int)MANUALCONTROLSETTINGS_CHANNELNUMBER_NUMELEM ) && \ +( (int)MANUALCONTROLCOMMAND_CHANNEL_NUMELEM == (int)MANUALCONTROLSETTINGS_CHANNELMIN_NUMELEM ) && \ +( (int)MANUALCONTROLCOMMAND_CHANNEL_NUMELEM == (int)MANUALCONTROLSETTINGS_CHANNELMAX_NUMELEM ) && \ +( (int)MANUALCONTROLCOMMAND_CHANNEL_NUMELEM == (int)MANUALCONTROLSETTINGS_CHANNELNEUTRAL_NUMELEM ) ) + #endif // MANUALCONTROL_H diff --git a/flight/Modules/ManualControl/manualcontrol.c b/flight/Modules/ManualControl/manualcontrol.c index eab3605be..e8b18fefb 100644 --- a/flight/Modules/ManualControl/manualcontrol.c +++ b/flight/Modules/ManualControl/manualcontrol.c @@ -101,7 +101,7 @@ static struct rcvr_activity_fsm activity_fsm; static void resetRcvrActivity(struct rcvr_activity_fsm * fsm); static bool updateRcvrActivity(struct rcvr_activity_fsm * fsm); -#define assumptions (assumptions1 && assumptions3 && assumptions5 && assumptions7 && assumptions8 && assumptions_flightmode) +#define assumptions (assumptions1 && assumptions3 && assumptions5 && assumptions7 && assumptions8 && assumptions_flightmode && assumptions_channelcount) /** * Module starting @@ -278,6 +278,7 @@ static void manualControlTask(void *parameters) cmd.Roll = 0; cmd.Yaw = 0; cmd.Pitch = 0; + cmd.Collective = 0; //cmd.FlightMode = MANUALCONTROLCOMMAND_FLIGHTMODE_AUTO; // don't do until AUTO implemented and functioning // Important: Throttle < 0 will reset Stabilization coefficients among other things. Either change this, // or leave throttle at IDLE speed or above when going into AUTO-failsafe. @@ -316,6 +317,11 @@ static void manualControlTask(void *parameters) cmd.Throttle = scaledChannel[MANUALCONTROLSETTINGS_CHANNELGROUPS_THROTTLE]; flightMode = scaledChannel[MANUALCONTROLSETTINGS_CHANNELGROUPS_FLIGHTMODE]; + if(cmd.Channel[MANUALCONTROLSETTINGS_CHANNELGROUPS_COLLECTIVE] != PIOS_RCVR_INVALID && + cmd.Channel[MANUALCONTROLSETTINGS_CHANNELGROUPS_COLLECTIVE] != PIOS_RCVR_NODRIVER && + cmd.Channel[MANUALCONTROLSETTINGS_CHANNELGROUPS_COLLECTIVE] != PIOS_RCVR_TIMEOUT) + cmd.Collective = scaledChannel[MANUALCONTROLSETTINGS_CHANNELGROUPS_COLLECTIVE]; + AccessoryDesiredData accessory; // Set Accessory 0 if (settings.ChannelGroups[MANUALCONTROLSETTINGS_CHANNELGROUPS_ACCESSORY0] != @@ -398,8 +404,9 @@ static void resetRcvrActivity(struct rcvr_activity_fsm * fsm) } static void updateRcvrActivitySample(uint32_t rcvr_id, uint16_t samples[], uint8_t max_channels) { - for (uint8_t channel = 0; channel < max_channels; channel++) { - samples[channel] = PIOS_RCVR_Read(rcvr_id, channel); + for (uint8_t channel = 1; channel <= max_channels; channel++) { + // Subtract 1 because channels are 1 indexed + samples[channel - 1] = PIOS_RCVR_Read(rcvr_id, channel); } } @@ -408,12 +415,12 @@ static bool updateRcvrActivityCompare(uint32_t rcvr_id, struct rcvr_activity_fsm bool activity_updated = false; /* Compare the current value to the previous sampled value */ - for (uint8_t channel = 0; - channel < RCVR_ACTIVITY_MONITOR_CHANNELS_PER_GROUP; + for (uint8_t channel = 1; + channel <= RCVR_ACTIVITY_MONITOR_CHANNELS_PER_GROUP; channel++) { uint16_t delta; - uint16_t prev = fsm->prev[channel]; - uint16_t curr = PIOS_RCVR_Read(rcvr_id, channel); + uint16_t prev = fsm->prev[channel - 1]; // Subtract 1 because channels are 1 indexed + uint16_t curr = PIOS_RCVR_Read(rcvr_id, channel); if (curr > prev) { delta = curr - prev; } else { diff --git a/flight/Modules/Stabilization/stabilization.c b/flight/Modules/Stabilization/stabilization.c index 7142c9770..ffc3c53be 100644 --- a/flight/Modules/Stabilization/stabilization.c +++ b/flight/Modules/Stabilization/stabilization.c @@ -235,6 +235,9 @@ static void stabilizationTask(void* parameters) { case STABILIZATIONDESIRED_STABILIZATIONMODE_RATE: rateDesiredAxis[i] = attitudeDesiredAxis[i]; + + // Zero attitude and axis lock accumulators + pids[PID_ROLL + i].iAccumulator = 0; axis_lock_accum[i] = 0; break; @@ -249,11 +252,20 @@ static void stabilizationTask(void* parameters) rateDesiredAxis[i] = attitudeDesiredAxis[i] + weak_leveling; + // Zero attitude and axis lock accumulators + pids[PID_ROLL + i].iAccumulator = 0; axis_lock_accum[i] = 0; break; } case STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE: rateDesiredAxis[i] = ApplyPid(&pids[PID_ROLL + i], local_error[i]); + + if(rateDesiredAxis[i] > settings.MaximumRate[i]) + rateDesiredAxis[i] = settings.MaximumRate[i]; + else if(rateDesiredAxis[i] < -settings.MaximumRate[i]) + rateDesiredAxis[i] = -settings.MaximumRate[i]; + + axis_lock_accum[i] = 0; break; @@ -272,6 +284,12 @@ static void stabilizationTask(void* parameters) rateDesiredAxis[i] = ApplyPid(&pids[PID_ROLL + i], axis_lock_accum[i]); } + + if(rateDesiredAxis[i] > settings.MaximumRate[i]) + rateDesiredAxis[i] = settings.MaximumRate[i]; + else if(rateDesiredAxis[i] < -settings.MaximumRate[i]) + rateDesiredAxis[i] = -settings.MaximumRate[i]; + break; } } @@ -284,11 +302,6 @@ static void stabilizationTask(void* parameters) //Calculate desired command for(int8_t ct=0; ct< MAX_AXES; ct++) { - if(rateDesiredAxis[ct] > settings.MaximumRate[ct]) - rateDesiredAxis[ct] = settings.MaximumRate[ct]; - else if(rateDesiredAxis[ct] < -settings.MaximumRate[ct]) - rateDesiredAxis[ct] = -settings.MaximumRate[ct]; - switch(stabDesired.StabilizationMode[ct]) { case STABILIZATIONDESIRED_STABILIZATIONMODE_RATE: @@ -306,14 +319,20 @@ static void stabilizationTask(void* parameters) case ROLL: actuatorDesiredAxis[ct] = bound(attitudeDesiredAxis[ct]); shouldUpdate = 1; + pids[PID_RATE_ROLL].iAccumulator = 0; + pids[PID_ROLL].iAccumulator = 0; break; case PITCH: actuatorDesiredAxis[ct] = bound(attitudeDesiredAxis[ct]); shouldUpdate = 1; + pids[PID_RATE_PITCH].iAccumulator = 0; + pids[PID_PITCH].iAccumulator = 0; break; case YAW: actuatorDesiredAxis[ct] = bound(attitudeDesiredAxis[ct]); shouldUpdate = 1; + pids[PID_RATE_YAW].iAccumulator = 0; + pids[PID_YAW].iAccumulator = 0; break; } break; diff --git a/flight/PiOS/Common/pios_rcvr.c b/flight/PiOS/Common/pios_rcvr.c index 02778bad4..0f3988d7f 100644 --- a/flight/PiOS/Common/pios_rcvr.c +++ b/flight/PiOS/Common/pios_rcvr.c @@ -87,6 +87,12 @@ out_fail: */ int32_t PIOS_RCVR_Read(uint32_t rcvr_id, uint8_t channel) { + // Publicly facing API uses channel 1 for first channel + if(channel == 0) + return PIOS_RCVR_INVALID; + else + channel--; + if (rcvr_id == 0) return PIOS_RCVR_NODRIVER; diff --git a/flight/PiOS/STM32F10x/pios_sbus.c b/flight/PiOS/STM32F10x/pios_sbus.c index 543da364b..319142dc6 100644 --- a/flight/PiOS/STM32F10x/pios_sbus.c +++ b/flight/PiOS/STM32F10x/pios_sbus.c @@ -34,8 +34,6 @@ #if defined(PIOS_INCLUDE_SBUS) -/* Global Variables */ - /* Provide a RCVR driver */ static int32_t PIOS_SBUS_Get(uint32_t rcvr_id, uint8_t channel); @@ -65,21 +63,17 @@ static void reset_channels(void) /** * unroll_channels() function computes channel_data[] from received_data[] - * For efficiency it unrolls first 8 channels without loops. If other - * 8 channels are needed they can be unrolled using the same code - * starting from s[11] instead of s[0]. Two extra digital channels are - * accessible using (s[22] & SBUS_FLAG_DGx) logical expressions. + * For efficiency it unrolls first 8 channels without loops and does the + * same for other 8 channels. Also 2 discrete channels will be set. */ static void unroll_channels(void) { uint8_t *s = received_data; uint16_t *d = channel_data; -#if (SBUS_NUMBER_OF_CHANNELS != 8) -#error Current S.Bus code unrolls only first 8 channels -#endif - #define F(v,s) ((v) >> s) & 0x7ff + + /* unroll channels 1-8 */ *d++ = F(s[0] | s[1] << 8, 0); *d++ = F(s[1] | s[2] << 8, 3); *d++ = F(s[2] | s[3] << 8 | s[4] << 16, 6); @@ -88,6 +82,20 @@ static void unroll_channels(void) *d++ = F(s[6] | s[7] << 8 | s[8] << 16, 7); *d++ = F(s[8] | s[9] << 8, 2); *d++ = F(s[9] | s[10] << 8, 5); + + /* unroll channels 9-16 */ + *d++ = F(s[11] | s[12] << 8, 0); + *d++ = F(s[12] | s[13] << 8, 3); + *d++ = F(s[13] | s[14] << 8 | s[15] << 16, 6); + *d++ = F(s[15] | s[16] << 8, 1); + *d++ = F(s[16] | s[17] << 8, 4); + *d++ = F(s[17] | s[18] << 8 | s[19] << 16, 7); + *d++ = F(s[19] | s[20] << 8, 2); + *d++ = F(s[20] | s[21] << 8, 5); + + /* unroll discrete channels 17 and 18 */ + *d++ = (s[22] & SBUS_FLAG_DC1) ? SBUS_VALUE_MAX : SBUS_VALUE_MIN; + *d++ = (s[22] & SBUS_FLAG_DC2) ? SBUS_VALUE_MAX : SBUS_VALUE_MIN; } /** diff --git a/flight/PiOS/inc/pios_sbus_priv.h b/flight/PiOS/inc/pios_sbus_priv.h index 4e46b2089..b7e441c30 100644 --- a/flight/PiOS/inc/pios_sbus_priv.h +++ b/flight/PiOS/inc/pios_sbus_priv.h @@ -44,8 +44,8 @@ * 1 byte - 0x0f (start of frame byte) * 22 bytes - channel data (11 bit/channel, 16 channels, LSB first) * 1 byte - bit flags: - * 0x01 - digital channel 1, - * 0x02 - digital channel 2, + * 0x01 - discrete channel 1, + * 0x02 - discrete channel 2, * 0x04 - lost frame flag, * 0x08 - failsafe flag, * 0xf0 - reserved @@ -54,16 +54,20 @@ #define SBUS_FRAME_LENGTH (1+22+1+1) #define SBUS_SOF_BYTE 0x0f #define SBUS_EOF_BYTE 0x00 -#define SBUS_FLAG_DG1 0x01 -#define SBUS_FLAG_DG2 0x02 +#define SBUS_FLAG_DC1 0x01 +#define SBUS_FLAG_DC2 0x02 #define SBUS_FLAG_FL 0x04 #define SBUS_FLAG_FS 0x08 /* - * S.Bus protocol provides up to 16 analog and 2 digital channels. - * Only 8 channels are currently supported by the OpenPilot. + * S.Bus protocol provides 16 proportional and 2 discrete channels. + * Do not change unless driver code is updated accordingly. */ -#define SBUS_NUMBER_OF_CHANNELS 8 +#define SBUS_NUMBER_OF_CHANNELS (16 + 2) + +/* Discrete channels represented as bits, provide values for them */ +#define SBUS_VALUE_MIN 352 +#define SBUS_VALUE_MAX 1696 /* * S.Bus configuration programmable invertor diff --git a/ground/openpilotgcs/src/plugins/config/ccpm.ui b/ground/openpilotgcs/src/plugins/config/ccpm.ui index 7730a7a29..77e33e8ca 100644 --- a/ground/openpilotgcs/src/plugins/config/ccpm.ui +++ b/ground/openpilotgcs/src/plugins/config/ccpm.ui @@ -880,7 +880,7 @@ - + Link Roll/Pitch @@ -890,7 +890,7 @@ - + Link Cyclic/Collective @@ -900,80 +900,6 @@ - - - - QLayout::SetNoConstraint - - - - - true - - - - 0 - 0 - - - - - 80 - 0 - - - - - 80 - 16777215 - - - - - 11 - - - - Qt::LeftToRight - - - Collective Ch - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - - - - - true - - - - 0 - 0 - - - - - 90 - 0 - - - - - 100 - 16777215 - - - - - - diff --git a/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp b/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp index 05eb98c4d..a12d34dca 100644 --- a/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configairframewidget.cpp @@ -2173,7 +2173,6 @@ void ConfigAirframeWidget::addToDirtyMonitor() addWidget(m_aircraft->widget_3->m_ccpm->ccpmCollectivePassthrough); addWidget(m_aircraft->widget_3->m_ccpm->ccpmLinkRoll); addWidget(m_aircraft->widget_3->m_ccpm->ccpmLinkCyclic); - addWidget(m_aircraft->widget_3->m_ccpm->ccpmCollectiveChannel); addWidget(m_aircraft->widget_3->m_ccpm->ccpmRevoSlider); addWidget(m_aircraft->widget_3->m_ccpm->ccpmREVOspinBox); addWidget(m_aircraft->widget_3->m_ccpm->ccpmCollectiveSlider); diff --git a/ground/openpilotgcs/src/plugins/config/configccpmwidget.cpp b/ground/openpilotgcs/src/plugins/config/configccpmwidget.cpp index 4a103987a..6d7a974c2 100644 --- a/ground/openpilotgcs/src/plugins/config/configccpmwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configccpmwidget.cpp @@ -147,9 +147,6 @@ ConfigccpmWidget::ConfigccpmWidget(QWidget *parent) : ConfigTaskWidget(parent) UAVObjectField * curve2source = mixerSettings->getField("Curve2Source"); Q_ASSERT(curve2source); - m_ccpm->ccpmCollectiveChannel->addItems(curve2source->getOptions()); - m_ccpm->ccpmCollectiveChannel->setCurrentIndex(0); - QStringList channels; channels << "Channel1" << "Channel2" << "Channel3" << "Channel4" << "Channel5" << "Channel6" << "Channel7" << "Channel8" << "None"; @@ -219,7 +216,6 @@ ConfigccpmWidget::ConfigccpmWidget(QWidget *parent) : ConfigTaskWidget(parent) connect(m_ccpm->SwashLvlCancelButton, SIGNAL(clicked()), this, SLOT(SwashLvlCancelButtonPressed())); connect(m_ccpm->SwashLvlFinishButton, SIGNAL(clicked()), this, SLOT(SwashLvlFinishButtonPressed())); - connect(m_ccpm->ccpmCollectivePassthrough, SIGNAL(clicked()), this, SLOT(SetUIComponentVisibilities())); connect(m_ccpm->ccpmLinkCyclic, SIGNAL(clicked()), this, SLOT(SetUIComponentVisibilities())); connect(m_ccpm->ccpmLinkRoll, SIGNAL(clicked()), this, SLOT(SetUIComponentVisibilities())); @@ -1016,9 +1012,6 @@ void ConfigccpmWidget::UpdateCCPMOptionsFromUI() //correction angle GUIConfigData.heli.CorrectionAngle = m_ccpm->ccpmCorrectionAngle->value(); - //CollectiveChannel - GUIConfigData.heli.CollectiveChannel = m_ccpm->ccpmCollectiveChannel->currentIndex(); - //update sliders if (useCCPM) { @@ -1058,10 +1051,7 @@ void ConfigccpmWidget::UpdateCCPMUIFromOptions() //correction angle m_ccpm->ccpmCorrectionAngle->setValue(GUIConfigData.heli.CorrectionAngle); - - //CollectiveChannel - m_ccpm->ccpmCollectiveChannel->setCurrentIndex(GUIConfigData.heli.CollectiveChannel); - + //update sliders m_ccpm->ccpmCollectiveScale->setValue(GUIConfigData.heli.SliderValue0); m_ccpm->ccpmCollectiveScaleBox->setValue(GUIConfigData.heli.SliderValue0); @@ -1092,9 +1082,6 @@ void ConfigccpmWidget::SetUIComponentVisibilities() m_ccpm->ccpmPitchMixingBox->setVisible(!GUIConfigData.heli.ccpmCollectivePassthroughState && GUIConfigData.heli.ccpmLinkCyclicState); m_ccpm->ccpmCollectiveScalingBox->setVisible(GUIConfigData.heli.ccpmCollectivePassthroughState || !GUIConfigData.heli.ccpmLinkCyclicState); - m_ccpm->ccpmCollectiveChLabel->setVisible(GUIConfigData.heli.ccpmCollectivePassthroughState); - m_ccpm->ccpmCollectiveChannel->setVisible(GUIConfigData.heli.ccpmCollectivePassthroughState); - m_ccpm->ccpmLinkCyclic->setVisible(!GUIConfigData.heli.ccpmCollectivePassthroughState); m_ccpm->ccpmCyclicScalingBox->setVisible((GUIConfigData.heli.ccpmCollectivePassthroughState || !GUIConfigData.heli.ccpmLinkCyclicState) && GUIConfigData.heli.ccpmLinkRollState); @@ -1316,7 +1303,7 @@ void ConfigccpmWidget::sendccpmUpdate() //MixerSettings.Curve2Source = Throttle,Roll,Pitch,Yaw,Accessory0,Accessory1,Accessory2,Accessory3,Accessory4,Accessory5 //check if we are using throttle or directly from a channel... if (GUIConfigData.heli.ccpmCollectivePassthroughState) - mixerSettingsData.Curve2Source = GUIConfigData.heli.CollectiveChannel; + mixerSettingsData.Curve2Source = MixerSettings::CURVE2SOURCE_COLLECTIVE; else mixerSettingsData.Curve2Source = MixerSettings::CURVE2SOURCE_THROTTLE; diff --git a/ground/openpilotgcs/src/plugins/config/configccpmwidget.h b/ground/openpilotgcs/src/plugins/config/configccpmwidget.h index 56898f0fb..c6bc1b27b 100644 --- a/ground/openpilotgcs/src/plugins/config/configccpmwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configccpmwidget.h @@ -57,7 +57,6 @@ typedef struct { uint ccpmCollectivePassthroughState:1; uint ccpmLinkCyclicState:1; uint ccpmLinkRollState:1; - uint CollectiveChannel:3;//20bits uint SliderValue0:7; uint SliderValue1:7; uint SliderValue2:7;//41bits diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index a8509d091..4eca15bf9 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -169,6 +169,7 @@ void ConfigGadgetWidget::onAutopilotConnect() { void ConfigGadgetWidget::tabAboutToChange(int i,bool * proceed) { + Q_UNUSED(i); *proceed=true; ConfigTaskWidget * wid=qobject_cast(ftw->currentWidget()); if(!wid) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 1590f52f0..6982ef91d 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -46,7 +46,7 @@ #define STICK_MIN_MOVE -8 #define STICK_MAX_MOVE 8 -ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent),wizardStep(wizardWelcome),loop(NULL),skipflag(false),goWizard(NULL) +ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent),wizardStep(wizardNone),loop(NULL),skipflag(false),transmitterType(heli) { manualCommandObj = ManualControlCommand::GetInstance(getObjectManager()); manualSettingsObj = ManualControlSettings::GetInstance(getObjectManager()); @@ -56,11 +56,12 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent) setupButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD); - int index=0; + unsigned int index=0; foreach(QString name,manualSettingsObj->getFields().at(0)->getElementNames()) { + Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM); inputChannelForm * inp=new inputChannelForm(this,index==0); - m_config->advancedPage->layout()->addWidget(inp); + m_config->channelSettings->layout()->addWidget(inp); inp->ui->channelName->setText(name); addUAVObjectToWidgetRelation("ManualControlSettings","ChannelGroups",inp->ui->channelGroup,index); addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNumber",inp->ui->channelNumber,index); @@ -69,12 +70,9 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent) addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMax",inp->ui->channelMax,index); ++index; } - goWizard=new QPushButton(tr("Start Wizard"),this); - m_config->advancedPage->layout()->addWidget(goWizard); - connect(goWizard,SIGNAL(clicked()),this,SLOT(goToNormalWizard())); - goSimpleWizard=new QPushButton(tr("Start Simple Wizard"),this); - m_config->advancedPage->layout()->addWidget(goSimpleWizard); - connect(goSimpleWizard,SIGNAL(clicked()),this,SLOT(goToSimpleWizard())); + + connect(m_config->configurationWizard,SIGNAL(clicked()),this,SLOT(goToWizard())); + connect(m_config->runCalibration,SIGNAL(toggled(bool)),this, SLOT(simpleCalibration(bool))); connect(m_config->wzNext,SIGNAL(clicked()),this,SLOT(wzNext())); connect(m_config->wzCancel,SIGNAL(clicked()),this,SLOT(wzCancel())); @@ -98,8 +96,6 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent) addUAVObjectToWidgetRelation("ManualControlSettings","Arming",m_config->armControl); addUAVObjectToWidgetRelation("ManualControlSettings","ArmedTimeout",m_config->armTimeout,0,1000); connect( ManualControlCommand::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(moveFMSlider())); - addWidget(goWizard); - addWidget(goSimpleWizard); enableControls(false); populateWidgets(); @@ -227,6 +223,25 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent) m_config->graphicsView->fitInView(m_txMainBody, Qt::KeepAspectRatio ); animate=new QTimer(this); connect(animate,SIGNAL(timeout()),this,SLOT(moveTxControls())); + + heliChannelOrder << ManualControlSettings::CHANNELGROUPS_COLLECTIVE << + ManualControlSettings::CHANNELGROUPS_THROTTLE << + ManualControlSettings::CHANNELGROUPS_ROLL << + ManualControlSettings::CHANNELGROUPS_PITCH << + ManualControlSettings::CHANNELGROUPS_YAW << + ManualControlSettings::CHANNELGROUPS_FLIGHTMODE << + ManualControlSettings::CHANNELGROUPS_ACCESSORY0 << + ManualControlSettings::CHANNELGROUPS_ACCESSORY1 << + ManualControlSettings::CHANNELGROUPS_ACCESSORY2; + + acroChannelOrder << ManualControlSettings::CHANNELGROUPS_THROTTLE << + ManualControlSettings::CHANNELGROUPS_ROLL << + ManualControlSettings::CHANNELGROUPS_PITCH << + ManualControlSettings::CHANNELGROUPS_YAW << + ManualControlSettings::CHANNELGROUPS_FLIGHTMODE << + ManualControlSettings::CHANNELGROUPS_ACCESSORY0 << + ManualControlSettings::CHANNELGROUPS_ACCESSORY1 << + ManualControlSettings::CHANNELGROUPS_ACCESSORY2; } void ConfigInputWidget::resetTxControls() { @@ -257,16 +272,6 @@ void ConfigInputWidget::openHelp() QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Input+Configuration", QUrl::StrictMode) ); } -void ConfigInputWidget::goToSimpleWizard() -{ - isSimple=true; - goToWizard(); -} -void ConfigInputWidget::goToNormalWizard() -{ - isSimple=false; - goToWizard(); -} void ConfigInputWidget::goToWizard() { QMessageBox msgBox; @@ -275,7 +280,7 @@ void ConfigInputWidget::goToWizard() msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); - setupWizardWidget(wizardWelcome); + wizardSetUpStep(wizardWelcome); m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio ); } @@ -284,228 +289,51 @@ void ConfigInputWidget::wzCancel() dimOtherControls(false); manualCommandObj->setMetadata(manualCommandObj->getDefaultMetadata()); m_config->stackedWidget->setCurrentIndex(0); - foreach (QWidget * wd, extraWidgets) - { - if(wd) - delete wd; - } - extraWidgets.clear(); - switch(wizardStep) - { - case wizardWelcome: - break; - case wizardChooseMode: - break; - case wizardIdentifySticks: - disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); - break; - case wizardIdentifyCenter: - break; - case wizardIdentifyLimits: - disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyLimits())); - manualSettingsObj->setData(manualSettingsData); - break; - case wizardIdentifyInverted: - break; - case wizardFinish: - break; - default: - break; - } - wizardStep=wizardWelcome; + + if(wizardStep != wizardNone) + wizardTearDownStep(wizardStep); + wizardStep=wizardNone; + + // Load settings back from beginning of wizard + manualSettingsObj->setData(previousManualSettingsData); } void ConfigInputWidget::wzNext() { - setupWizardWidget(wizardStep+1); -} + // In identify sticks mode the next button can indicate + // channel advance + if(wizardStep != wizardNone && + wizardStep != wizardIdentifySticks) + wizardTearDownStep(wizardStep); -void ConfigInputWidget::wzBack() -{ - setupWizardWidget(wizardStep-1); -} - -void ConfigInputWidget::setupWizardWidget(int step) -{ - if(step==wizardWelcome) - { - m_config->graphicsView->setVisible(false); - setTxMovement(nothing); - if(wizardStep==wizardChooseMode) - { - delete extraWidgets.at(0); - delete extraWidgets.at(1); - extraWidgets.clear(); + // State transitions for next button + switch(wizardStep) { + case wizardWelcome: + wizardSetUpStep(wizardChooseMode); + break; + case wizardChooseMode: + wizardSetUpStep(wizardChooseType); + break; + case wizardChooseType: + wizardSetUpStep(wizardIdentifySticks); + break; + case wizardIdentifySticks: + nextChannel(); + if(currentChannelNum==-1) { // Gone through all channels + wizardTearDownStep(wizardIdentifySticks); + wizardSetUpStep(wizardIdentifyCenter); } - manualSettingsData=manualSettingsObj->getData(); - manualSettingsData.Arming=ManualControlSettings::ARMING_ALWAYSDISARMED; - manualSettingsObj->setData(manualSettingsData); - m_config->wzText->setText(tr("Welcome to the inputs configuration wizard.\n" - "Please follow the instructions on the screen and only move your controls when asked to.\n" - "Make sure you already configured your hardware settings on the proper tab and restarted your board.\n" - "At any time you can press 'back' to return to the previous screeen or 'Cancel' to cancel the wizard.\n")); - m_config->stackedWidget->setCurrentIndex(1); - m_config->wzBack->setEnabled(false); - wizardStep=wizardWelcome; - } - else if(step==wizardChooseMode) - { - m_config->graphicsView->setVisible(true); - setTxMovement(nothing); - if(wizardStep==wizardIdentifySticks) - { - disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); - m_config->wzNext->setEnabled(true); - } - m_config->wzText->setText(tr("Please choose your transmiter type.\n" - "Mode 1 means your throttle stick is on the right\n" - "Mode 2 means your throttle stick is on the left\n")); - m_config->wzBack->setEnabled(true); - QRadioButton * mode1=new QRadioButton(tr("Mode 1"),this); - QRadioButton * mode2=new QRadioButton(tr("Mode 2"),this); - mode2->setChecked(true); - extraWidgets.clear(); - extraWidgets.append(mode1); - extraWidgets.append(mode2); - m_config->checkBoxesLayout->layout()->addWidget(mode1); - m_config->checkBoxesLayout->layout()->addWidget(mode2); - wizardStep=wizardChooseMode; - } - else if(step==wizardIdentifySticks && !isSimple) - { - usedChannels.clear(); - if(wizardStep==wizardChooseMode) - { - QRadioButton * mode=qobject_cast(extraWidgets.at(0)); - if(mode->isChecked()) - transmitterMode=mode1; - else - transmitterMode=mode2; - delete extraWidgets.at(0); - delete extraWidgets.at(1); - extraWidgets.clear(); - } - wizardStep=wizardIdentifySticks; - currentCommand=0; - setMoveFromCommand(currentCommand); - m_config->wzText->setText(QString(tr("Please move each control once at a time according to the instructions and picture below.\n\n" - "Move the %1 stick")).arg(manualSettingsObj->getField("ChannelGroups")->getElementNames().at(currentCommand))); - manualSettingsData=manualSettingsObj->getData(); - connect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); - m_config->wzNext->setEnabled(false); - } - else if(step==wizardIdentifyCenter || (isSimple && step==wizardIdentifySticks)) - { - if(wizardStep==wizardChooseMode) - { - QRadioButton * mode=qobject_cast(extraWidgets.at(0)); - if(mode->isChecked()) - transmitterMode=mode1; - else - transmitterMode=mode2; - delete extraWidgets.at(0); - delete extraWidgets.at(1); - extraWidgets.clear(); - } - setTxMovement(centerAll); - if(wizardStep==wizardIdentifySticks) - disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); - else - { - disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyLimits())); - manualSettingsObj->setData(manualSettingsData); - manualCommandObj->setMetadata(manualCommandObj->getDefaultMetadata()); - } - wizardStep=wizardIdentifyCenter; - m_config->wzText->setText(QString(tr("Please center all control controls and press next when ready (if your FlightMode switch has only two positions, leave it on either position)"))); - } - else if(step==wizardIdentifyLimits) - { - dimOtherControls(false); - setTxMovement(moveAll); - if(wizardStep==wizardIdentifyCenter) - { - wizardStep=wizardIdentifyLimits; - manualCommandData=manualCommandObj->getData(); - manualSettingsData=manualSettingsObj->getData(); - for(unsigned int i=0;isetData(manualSettingsData); - } - if(wizardStep==wizardIdentifyInverted) - { - foreach(QWidget * wd,extraWidgets) - { - QCheckBox * cb=qobject_cast(wd); - if(cb) - { - disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); - delete cb; - } - } - } - extraWidgets.clear(); - disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); - wizardStep=wizardIdentifyLimits; - m_config->wzText->setText(QString(tr("Please move all controls to their maximum extents on both directions and press next when ready"))); - UAVObject::Metadata mdata= manualCommandObj->getMetadata(); - mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; - mdata.flightTelemetryUpdatePeriod = 150; - manualCommandObj->setMetadata(mdata); - manualSettingsData=manualSettingsObj->getData(); - for(uint i=0;isetData(manualSettingsData); - } - extraWidgets.clear(); - foreach(QString name,manualSettingsObj->getFields().at(0)->getElementNames()) - { - if(!name.contains("Access") && !name.contains("Flight")) - { - QCheckBox * cb=new QCheckBox(name,this); - extraWidgets.append(cb); - m_config->checkBoxesLayout->layout()->addWidget(cb); - connect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); - } - } - connect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); - wizardStep=wizardIdentifyInverted; - m_config->wzText->setText(QString(tr("Please check the picture below and check all the sticks which show an inverted movement and press next when ready"))); - } - else if(step==wizardFinish) - { - foreach(QWidget * wd,extraWidgets) - { - QCheckBox * cb=qobject_cast(wd); - if(cb) - { - disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); - delete cb; - } - } - wizardStep=wizardFinish; - extraWidgets.clear(); - m_config->wzText->setText(QString(tr("You have completed this wizard, please check below if the picture below mimics your sticks movement.\n" - "This new settings aren't saved to the board yet, after pressing next you will go to the initial screen where you can do that."))); - - } - - else if(step==wizardFinish+1) - { + break; + case wizardIdentifyCenter: + wizardSetUpStep(wizardIdentifyLimits); + break; + case wizardIdentifyLimits: + wizardSetUpStep(wizardIdentifyInverted); + break; + case wizardIdentifyInverted: + wizardSetUpStep(wizardFinish); + break; + case wizardFinish: setTxMovement(nothing); manualCommandObj->setMetadata(manualCommandObj->getDefaultMetadata()); disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); @@ -522,14 +350,560 @@ void ConfigInputWidget::setupWizardWidget(int step) } manualSettingsObj->setData(manualSettingsData); m_config->stackedWidget->setCurrentIndex(0); - wizardStep=wizardWelcome; + wizardStep=wizardNone; + break; + default: + Q_ASSERT(0); } +} +void ConfigInputWidget::wzBack() +{ + if(wizardStep != wizardNone && + wizardStep != wizardIdentifySticks) + wizardTearDownStep(wizardStep); + + // State transitions for next button + switch(wizardStep) { + case wizardChooseMode: + wizardSetUpStep(wizardWelcome); + break; + case wizardChooseType: + wizardSetUpStep(wizardChooseMode); + break; + case wizardIdentifySticks: + prevChannel(); + if(currentChannelNum == -1) { + wizardTearDownStep(wizardIdentifySticks); + wizardSetUpStep(wizardChooseType); + } + break; + case wizardIdentifyCenter: + wizardSetUpStep(wizardIdentifySticks); + break; + case wizardIdentifyLimits: + wizardSetUpStep(wizardIdentifyCenter); + break; + case wizardIdentifyInverted: + wizardSetUpStep(wizardIdentifyLimits); + break; + case wizardFinish: + wizardSetUpStep(wizardIdentifyInverted); + break; + default: + Q_ASSERT(0); + } +} + +void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step) +{ + switch(step) { + case wizardWelcome: + m_config->graphicsView->setVisible(false); + setTxMovement(nothing); + manualSettingsData=manualSettingsObj->getData(); + manualSettingsData.Arming=ManualControlSettings::ARMING_ALWAYSDISARMED; + previousManualSettingsData = manualSettingsData; + manualSettingsObj->setData(manualSettingsData); + m_config->wzText->setText(tr("Welcome to the inputs configuration wizard.\n" + "Please follow the instructions on the screen and only move your controls when asked to.\n" + "Make sure you already configured your hardware settings on the proper tab and restarted your board.\n" + "At any time you can press 'back' to return to the previous screeen or 'Cancel' to cancel the wizard.\n")); + m_config->stackedWidget->setCurrentIndex(1); + m_config->wzBack->setEnabled(false); + break; + case wizardChooseMode: + { + m_config->graphicsView->setVisible(true); + setTxMovement(nothing); + m_config->wzText->setText(tr("Please choose your transmiter type.\n" + "Mode 1 means your throttle stick is on the right\n" + "Mode 2 means your throttle stick is on the left\n")); + m_config->wzBack->setEnabled(true); + QRadioButton * mode1=new QRadioButton(tr("Mode 1"),this); + QRadioButton * mode2=new QRadioButton(tr("Mode 2"),this); + mode2->setChecked(true); + extraWidgets.clear(); + extraWidgets.append(mode1); + extraWidgets.append(mode2); + m_config->checkBoxesLayout->layout()->addWidget(mode1); + m_config->checkBoxesLayout->layout()->addWidget(mode2); + } + break; + case wizardChooseType: + { + m_config->wzText->setText(tr("Please choose your transmiter mode.\n" + "Acro means normal transmitter\n" + "Heli means there is a collective pitch and throttle input\n" + "If you are using a heli transmitter please engage throttle hold now please.\n")); + m_config->wzBack->setEnabled(true); + QRadioButton * typeAcro=new QRadioButton(tr("Acro"),this); + QRadioButton * typeHeli=new QRadioButton(tr("Heli"),this); + typeAcro->setChecked(true); + typeHeli->setChecked(false); + extraWidgets.clear(); + extraWidgets.append(typeAcro); + extraWidgets.append(typeHeli); + m_config->checkBoxesLayout->layout()->addWidget(typeAcro); + m_config->checkBoxesLayout->layout()->addWidget(typeHeli); + wizardStep=wizardChooseType; + } + break; + case wizardIdentifySticks: + usedChannels.clear(); + currentChannelNum=-1; + nextChannel(); + manualSettingsData=manualSettingsObj->getData(); + connect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); + m_config->wzNext->setEnabled(false); + break; + case wizardIdentifyCenter: + setTxMovement(centerAll); + m_config->wzText->setText(QString(tr("Please center all control controls and press next when ready (if your FlightMode switch has only two positions, leave it on either position)"))); + break; + case wizardIdentifyLimits: + { + dimOtherControls(false); + setTxMovement(moveAll); + m_config->wzText->setText(QString(tr("Please move all controls to their maximum extents on both directions and press next when ready"))); + fastMdata(); + manualSettingsData=manualSettingsObj->getData(); + for(uint i=0;igetFields().at(0)->getElementNames()) + { + if(!name.contains("Access") && !name.contains("Flight")) + { + QCheckBox * cb=new QCheckBox(name,this); + extraWidgets.append(cb); + m_config->checkBoxesLayout->layout()->addWidget(cb); + connect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); + } + } + connect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); + m_config->wzText->setText(QString(tr("Please check the picture below and check all the sticks which show an inverted movement and press next when ready"))); + fastMdata(); + break; + case wizardFinish: + foreach(QWidget * wd,extraWidgets) + { + QCheckBox * cb=qobject_cast(wd); + if(cb) + { + disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); + delete cb; + } + } + extraWidgets.clear(); + connect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); + m_config->wzText->setText(QString(tr("You have completed this wizard, please check below if the picture below mimics your sticks movement.\n" + "This new settings aren't saved to the board yet, after pressing next you will go to the initial screen where you can do that."))); + fastMdata(); + + manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE]= + manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]+ + ((manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_THROTTLE]- + manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE])*0.02); + if((abs(manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_FLIGHTMODE]-manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE])<100) || + (abs(manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE]-manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE])<100)) + { + manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE]=manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE]+ + (manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_FLIGHTMODE]-manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE])/2; + } + manualSettingsObj->setData(manualSettingsData); + break; + default: + Q_ASSERT(0); + } + wizardStep = step; +} + +void ConfigInputWidget::wizardTearDownStep(enum wizardSteps step) +{ + QRadioButton * mode, * type; + Q_ASSERT(step == wizardStep); + switch(step) { + case wizardWelcome: + break; + case wizardChooseMode: + mode=qobject_cast(extraWidgets.at(0)); + if(mode->isChecked()) + transmitterMode=mode1; + else + transmitterMode=mode2; + delete extraWidgets.at(0); + delete extraWidgets.at(1); + extraWidgets.clear(); + break; + case wizardChooseType: + type=qobject_cast(extraWidgets.at(0)); + if(type->isChecked()) + transmitterType=acro; + else + transmitterType=heli; + delete extraWidgets.at(0); + delete extraWidgets.at(1); + extraWidgets.clear(); + break; + case wizardIdentifySticks: + disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); + m_config->wzNext->setEnabled(true); + break; + case wizardIdentifyCenter: + manualCommandData=manualCommandObj->getData(); + manualSettingsData=manualSettingsObj->getData(); + for(unsigned int i=0;isetData(manualSettingsData); + break; + case wizardIdentifyLimits: + disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyLimits())); + manualSettingsObj->setData(manualSettingsData); + restoreMdata(); + break; + case wizardIdentifyInverted: + foreach(QWidget * wd,extraWidgets) + { + QCheckBox * cb=qobject_cast(wd); + if(cb) + { + disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); + delete cb; + } + } + extraWidgets.clear(); + disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); + restoreMdata(); + break; + case wizardFinish: + setTxMovement(nothing); + m_config->stackedWidget->setCurrentIndex(0); + disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); + restoreMdata(); + break; + default: + Q_ASSERT(0); + } +} + +/** + * Set manual control command to fast updates + */ +void ConfigInputWidget::fastMdata() +{ + manualControlMdata = manualCommandObj->getMetadata(); + UAVObject::Metadata mdata = manualControlMdata; + mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; + mdata.flightTelemetryUpdatePeriod = 150; + manualCommandObj->setMetadata(mdata); +} + +/** + * Restore previous update settings for manual control data + */ +void ConfigInputWidget::restoreMdata() +{ + manualCommandObj->setMetadata(manualControlMdata); +} + +//void ConfigInputWidget::setupWizardWidget(int step) +//{ +// if(step==wizardWelcome) +// { +// m_config->graphicsView->setVisible(false); +// setTxMovement(nothing); +// if(wizardStep==wizardChooseMode) +// { +// delete extraWidgets.at(0); +// delete extraWidgets.at(1); +// extraWidgets.clear(); +// } +// manualSettingsData=manualSettingsObj->getData(); +// manualSettingsData.Arming=ManualControlSettings::ARMING_ALWAYSDISARMED; +// manualSettingsObj->setData(manualSettingsData); +// m_config->wzText->setText(tr("Welcome to the inputs configuration wizard.\n" +// "Please follow the instructions on the screen and only move your controls when asked to.\n" +// "Make sure you already configured your hardware settings on the proper tab and restarted your board.\n" +// "At any time you can press 'back' to return to the previous screeen or 'Cancel' to cancel the wizard.\n")); +// m_config->stackedWidget->setCurrentIndex(1); +// m_config->wzBack->setEnabled(false); +// wizardStep=wizardWelcome; +// } +// else if(step==wizardChooseMode) +// { +// m_config->graphicsView->setVisible(true); +// setTxMovement(nothing); +// if(wizardStep==wizardIdentifySticks) +// { +// disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); +// m_config->wzNext->setEnabled(true); +// } +// m_config->wzText->setText(tr("Please choose your transmiter type.\n" +// "Mode 1 means your throttle stick is on the right\n" +// "Mode 2 means your throttle stick is on the left\n")); +// m_config->wzBack->setEnabled(true); +// QRadioButton * mode1=new QRadioButton(tr("Mode 1"),this); +// QRadioButton * mode2=new QRadioButton(tr("Mode 2"),this); +// mode2->setChecked(true); +// extraWidgets.clear(); +// extraWidgets.append(mode1); +// extraWidgets.append(mode2); +// m_config->checkBoxesLayout->layout()->addWidget(mode1); +// m_config->checkBoxesLayout->layout()->addWidget(mode2); +// wizardStep=wizardChooseMode; +// } +// else if(step==wizardChooseType) +// { +// if(wizardStep==wizardChooseMode) +// { +// QRadioButton * mode=qobject_cast(extraWidgets.at(0)); +// if(mode->isChecked()) +// transmitterMode=mode1; +// else +// transmitterMode=mode2; +// delete extraWidgets.at(0); +// delete extraWidgets.at(1); +// extraWidgets.clear(); +// } + +// m_config->wzText->setText(tr("Please choose your transmiter mode.\n" +// "Acro means normal transmitter\n" +// "Heli means there is a collective pitch and throttle input\n")); +// m_config->wzBack->setEnabled(true); +// QRadioButton * typeAcro=new QRadioButton(tr("Acro"),this); +// QRadioButton * typeHeli=new QRadioButton(tr("Heli"),this); +// typeAcro->setChecked(true); +// typeHeli->setChecked(false); +// extraWidgets.clear(); +// extraWidgets.append(typeAcro); +// extraWidgets.append(typeHeli); +// m_config->checkBoxesLayout->layout()->addWidget(typeAcro); +// m_config->checkBoxesLayout->layout()->addWidget(typeHeli); +// wizardStep=wizardChooseType; +// } else if(step==wizardIdentifySticks && !isSimple) { +// usedChannels.clear(); +// if(wizardStep==wizardChooseType) +// { +// qDebug() << "Chosing type"; +// QRadioButton * type=qobject_cast(extraWidgets.at(0)); +// if(type->isChecked()) +// transmitterType=acro; +// else +// transmitterType=heli; +// qDebug() << "Checked: " << type->isChecked() << " " << "type is" << transmitterType; +// delete extraWidgets.at(0); +// delete extraWidgets.at(1); +// extraWidgets.clear(); +// } +// wizardStep=wizardIdentifySticks; +// currentCommand=0; +// getChannelFromStep(currentCommand); +// manualSettingsData=manualSettingsObj->getData(); +// connect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); +// m_config->wzNext->setEnabled(false); +// } +// else if(step==wizardIdentifyCenter || (isSimple && step==wizardIdentifySticks)) +// { +// setTxMovement(centerAll); +// if(wizardStep==wizardIdentifySticks) +// disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); +// else +// { +// disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyLimits())); +// manualSettingsObj->setData(manualSettingsData); +// manualCommandObj->setMetadata(manualCommandObj->getDefaultMetadata()); +// } +// wizardStep=wizardIdentifyCenter; +// m_config->wzText->setText(QString(tr("Please center all control controls and press next when ready (if your FlightMode switch has only two positions, leave it on either position)"))); +// } +// else if(step==wizardIdentifyLimits) +// { +// dimOtherControls(false); +// setTxMovement(moveAll); +// if(wizardStep==wizardIdentifyCenter) +// { +// wizardStep=wizardIdentifyLimits; +// manualCommandData=manualCommandObj->getData(); +// manualSettingsData=manualSettingsObj->getData(); +// for(unsigned int i=0;isetData(manualSettingsData); +// } +// if(wizardStep==wizardIdentifyInverted) +// { +// foreach(QWidget * wd,extraWidgets) +// { +// QCheckBox * cb=qobject_cast(wd); +// if(cb) +// { +// disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); +// delete cb; +// } +// } +// } +// extraWidgets.clear(); +// disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); +// wizardStep=wizardIdentifyLimits; +// m_config->wzText->setText(QString(tr("Please move all controls to their maximum extents on both directions and press next when ready"))); +// UAVObject::Metadata mdata= manualCommandObj->getMetadata(); +// mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; +// mdata.flightTelemetryUpdatePeriod = 150; +// manualCommandObj->setMetadata(mdata); +// manualSettingsData=manualSettingsObj->getData(); +// for(uint i=0;isetData(manualSettingsData); +// } +// extraWidgets.clear(); +// foreach(QString name,manualSettingsObj->getFields().at(0)->getElementNames()) +// { +// if(!name.contains("Access") && !name.contains("Flight")) +// { +// QCheckBox * cb=new QCheckBox(name,this); +// extraWidgets.append(cb); +// m_config->checkBoxesLayout->layout()->addWidget(cb); +// connect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); +// } +// } +// connect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); +// wizardStep=wizardIdentifyInverted; +// m_config->wzText->setText(QString(tr("Please check the picture below and check all the sticks which show an inverted movement and press next when ready"))); +// } +// else if(step==wizardFinish) +// { +// foreach(QWidget * wd,extraWidgets) +// { +// QCheckBox * cb=qobject_cast(wd); +// if(cb) +// { +// disconnect(cb,SIGNAL(toggled(bool)),this,SLOT(invertControls())); +// delete cb; +// } +// } +// wizardStep=wizardFinish; +// extraWidgets.clear(); +// m_config->wzText->setText(QString(tr("You have completed this wizard, please check below if the picture below mimics your sticks movement.\n" +// "This new settings aren't saved to the board yet, after pressing next you will go to the initial screen where you can do that."))); + +// } + +// else if(step==wizardFinish+1) +// { +// setTxMovement(nothing); +// manualCommandObj->setMetadata(manualCommandObj->getDefaultMetadata()); +// disconnect(manualCommandObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); +// manualSettingsData=manualSettingsObj->getData(); +// manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE]= +// manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]+ +// ((manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_THROTTLE]- +// manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE])*0.02); +// if((abs(manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_FLIGHTMODE]-manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE])<100) || +// (abs(manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE]-manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE])<100)) +// { +// manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE]=manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE]+ +// (manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_FLIGHTMODE]-manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE])/2; +// } +// manualSettingsObj->setData(manualSettingsData); +// m_config->stackedWidget->setCurrentIndex(0); +// wizardStep=wizardWelcome; +// } + +//} + +/** + * Set the display to indicate which channel the person should move + */ +void ConfigInputWidget::setChannel(int newChan) +{ + if(newChan == ManualControlSettings::CHANNELGROUPS_COLLECTIVE) + m_config->wzText->setText(QString(tr("Please enable throttle hold mode and move the collective pitch stick"))); + else if (newChan == ManualControlSettings::CHANNELGROUPS_FLIGHTMODE) + m_config->wzText->setText(QString(tr("Please flick the flight mode switch. For switches you may have to repeat this rapidly."))); + else + m_config->wzText->setText(QString(tr("Please move each control once at a time according to the instructions and picture below.\n\n" + "Move the %1 stick")).arg(manualSettingsObj->getField("ChannelGroups")->getElementNames().at(newChan))); + + if(manualSettingsObj->getField("ChannelGroups")->getElementNames().at(newChan).contains("Accessory")) + m_config->wzNext->setEnabled(true); + + setMoveFromCommand(newChan); + + currentChannelNum = newChan; +} + +/** + * Unfortunately order of channel should be different in different conditions. Selects + * next channel based on heli or acro mode + */ +void ConfigInputWidget::nextChannel() +{ + QList order = (transmitterType == heli) ? heliChannelOrder : acroChannelOrder; + + if(currentChannelNum == -1) { + setChannel(order[0]); + return; + } + for (int i = 0; i < order.length() - 1; i++) { + if(order[i] == currentChannelNum) { + setChannel(order[i+1]); + return; + } + } + currentChannelNum = -1; // hit end of list +} + +/** + * Unfortunately order of channel should be different in different conditions. Selects + * previous channel based on heli or acro mode + */ +void ConfigInputWidget::prevChannel() +{ + QList order = transmitterType == heli ? heliChannelOrder : acroChannelOrder; + + // No previous from unset channel or next state + if(currentChannelNum == -1) + return; + + for (int i = 1; i < order.length(); i++) { + if(order[i] == currentChannelNum) { + setChannel(order[i-1]); + usedChannels.removeLast(); + return; + } + } + currentChannelNum = -1; // hit end of list } void ConfigInputWidget::identifyControls() { static int debounce=0; + receiverActivityData=receiverActivityObj->getData(); if(receiverActivityData.ActiveChannel==255) return; @@ -547,26 +921,18 @@ void ConfigInputWidget::identifyControls() debounce=0; usedChannels.append(lastChannel); manualSettingsData=manualSettingsObj->getData(); - manualSettingsData.ChannelGroups[currentCommand]=currentChannel.group; - manualSettingsData.ChannelNumber[currentCommand]=currentChannel.number; + manualSettingsData.ChannelGroups[currentChannelNum]=currentChannel.group; + manualSettingsData.ChannelNumber[currentChannelNum]=currentChannel.number; manualSettingsObj->setData(manualSettingsData); } else return; } - ++currentCommand; - setMoveFromCommand(currentCommand); - if(currentCommand>ManualControlSettings::CHANNELGROUPS_NUMELEM-1) - { - disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(identifyControls())); - m_config->wzNext->setEnabled(true); - } - m_config->wzText->setText(QString(tr("Please move each control once at a time according to the instructions and picture below.\n\n" - "Move the %1 stick")).arg(manualSettingsObj->getFields().at(0)->getElementNames().at(currentCommand))); - if(manualSettingsObj->getField("ChannelGroups")->getElementNames().at(currentCommand).contains("Accessory")) - { - m_config->wzNext->setEnabled(true); - } + + m_config->wzText->clear(); + setTxMovement(nothing); + + QTimer::singleShot(300, this, SLOT(wzNext())); } void ConfigInputWidget::identifyLimits() @@ -605,6 +971,13 @@ void ConfigInputWidget::setMoveFromCommand(int command) else setTxMovement(moveRightVerticalStick); } + else if(command==ManualControlSettings::CHANNELNUMBER_COLLECTIVE) + { + if(transmitterMode==mode2) + setTxMovement(moveLeftVerticalStick); + else + setTxMovement(moveRightVerticalStick); + } else if(command==ManualControlSettings::CHANNELNUMBER_FLIGHTMODE) { setTxMovement(moveFlightMode); @@ -912,11 +1285,9 @@ void ConfigInputWidget::dimOtherControls(bool value) void ConfigInputWidget::enableControls(bool enable) { - if(goWizard) - { - goWizard->setEnabled(enable); - goSimpleWizard->setEnabled(enable); - } + m_config->configurationWizard->setEnabled(enable); + m_config->runCalibration->setEnabled(enable); + ConfigTaskWidget::enableControls(enable); } @@ -978,3 +1349,73 @@ void ConfigInputWidget::moveFMSlider() m_config->fmsSlider->setValue(0); } } + +void ConfigInputWidget::updateCalibration() +{ + manualCommandData=manualCommandObj->getData(); + for(uint i=0;imanualCommandData.Channel[i]) || + (reverse[i] && manualSettingsData.ChannelMin[i]manualCommandData.Channel[i])) + manualSettingsData.ChannelMax[i]=manualCommandData.Channel[i]; + manualSettingsData.ChannelNeutral[i] = manualCommandData.Channel[i]; + } + + manualSettingsObj->setData(manualSettingsData); + manualSettingsObj->updated(); +} + +void ConfigInputWidget::simpleCalibration(bool enable) +{ + if (enable) { + QMessageBox msgBox; + msgBox.setText(tr("Arming Settings are now set to Always Disarmed for your safety.")); + msgBox.setDetailedText(tr("You will have to reconfigure arming settings yourself afterwards.")); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); + + manualCommandData = manualCommandObj->getData(); + + manualSettingsData=manualSettingsObj->getData(); + manualSettingsData.Arming=ManualControlSettings::ARMING_ALWAYSDISARMED; + manualSettingsObj->setData(manualSettingsData); + + for (unsigned int i = 0; i < ManualControlCommand::CHANNEL_NUMELEM; i++) { + reverse[i] = manualSettingsData.ChannelMax[i] < manualSettingsData.ChannelMin[i]; + manualSettingsData.ChannelMin[i] = manualCommandData.Channel[i]; + manualSettingsData.ChannelNeutral[i] = manualCommandData.Channel[i]; + manualSettingsData.ChannelMax[i] = manualCommandData.Channel[i]; + } + + fastMdata(); + + connect(manualCommandObj, SIGNAL(objectUnpacked(UAVObject*)), this, SLOT(updateCalibration())); + } else { + manualCommandData = manualCommandObj->getData(); + manualSettingsData = manualSettingsObj->getData(); + + restoreMdata(); + + for (int i = 0; i < ManualControlCommand::CHANNEL_NUMELEM; i++) + manualSettingsData.ChannelNeutral[i] = manualCommandData.Channel[i]; + + // Force flight mode neutral to middle + manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE] = + (manualSettingsData.ChannelMax[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE] + + manualSettingsData.ChannelMin[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE]) / 2; + + // Force throttle to be near min + manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE]= + manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]+ + ((manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_THROTTLE]- + manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE])*0.02); + + manualSettingsObj->setData(manualSettingsData); + + disconnect(manualCommandObj, SIGNAL(objectUnpacked(UAVObject*)), this, SLOT(updateCalibration())); + } +} diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.h b/ground/openpilotgcs/src/plugins/config/configinputwidget.h index 2249528cb..4828c2a20 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.h @@ -52,22 +52,24 @@ class ConfigInputWidget: public ConfigTaskWidget public: ConfigInputWidget(QWidget *parent = 0); ~ConfigInputWidget(); - enum wizardSteps{wizardWelcome,wizardChooseMode,wizardIdentifySticks,wizardIdentifyCenter,wizardIdentifyLimits,wizardIdentifyInverted,wizardFinish}; + enum wizardSteps{wizardWelcome,wizardChooseMode,wizardChooseType,wizardIdentifySticks,wizardIdentifyCenter,wizardIdentifyLimits,wizardIdentifyInverted,wizardFinish,wizardNone}; enum txMode{mode1,mode2}; enum txMovements{moveLeftVerticalStick,moveRightVerticalStick,moveLeftHorizontalStick,moveRightHorizontalStick,moveAccess0,moveAccess1,moveAccess2,moveFlightMode,centerAll,moveAll,nothing}; enum txMovementType{vertical,horizontal,jump,mix}; + enum txType {acro, heli}; public slots: private: bool growing; + bool reverse[ManualControlSettings::CHANNELNEUTRAL_NUMELEM]; txMovements currentMovement; int movePos; void setTxMovement(txMovements movement); Ui_InputWidget *m_config; wizardSteps wizardStep; - void setupWizardWidget(int step); QList extraWidgets; txMode transmitterMode; + txType transmitterType; struct channelsStruct { bool operator ==(const channelsStruct& rhs) const @@ -82,12 +84,16 @@ private: QEventLoop * loop; bool skipflag; - uint currentCommand; + int currentChannelNum; + QList heliChannelOrder; + QList acroChannelOrder; ManualControlCommand * manualCommandObj; ManualControlCommand::DataFields manualCommandData; + UAVObject::Metadata manualControlMdata; ManualControlSettings * manualSettingsObj; ManualControlSettings::DataFields manualSettingsData; + ManualControlSettings::DataFields previousManualSettingsData; ReceiverActivity * receiverActivityObj; ReceiverActivity::DataFields receiverActivityData; @@ -116,16 +122,22 @@ private: QTimer * animate; void resetTxControls(); void setMoveFromCommand(int command); - QPushButton * goWizard; - QPushButton * goSimpleWizard; - bool isSimple; - void goToWizard(); + + void fastMdata(); + void restoreMdata(); + + void setChannel(int); + void nextChannel(); + void prevChannel(); + + void wizardSetUpStep(enum wizardSteps); + void wizardTearDownStep(enum wizardSteps); private slots: void wzNext(); void wzBack(); void wzCancel(); - void goToNormalWizard(); - void goToSimpleWizard(); + void goToWizard(); + void openHelp(); void identifyControls(); void identifyLimits(); @@ -134,6 +146,8 @@ private slots: void dimOtherControls(bool value); void moveFMSlider(); void invertControls(); + void simpleCalibration(bool state); + void updateCalibration(); protected: void resizeEvent(QResizeEvent *event); virtual void enableControls(bool enable); diff --git a/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp index eeb6c08aa..98b10683c 100644 --- a/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp @@ -48,7 +48,9 @@ void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString fiel UAVObject *obj=NULL; UAVObjectField *_field=NULL; obj = objManager->getObject(QString(object)); + Q_ASSERT(obj); _field = obj->getField(QString(field)); + Q_ASSERT(_field); addUAVObjectToWidgetRelation(object,field,widget,_field->getElementNames().indexOf(index)); } @@ -59,6 +61,7 @@ void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString fiel if(!object.isEmpty()) { obj = objManager->getObject(QString(object)); + Q_ASSERT(obj); connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues())); } //smartsave->addObject(obj); @@ -182,6 +185,10 @@ void ConfigTaskWidget::populateWidgets() { cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); } + else if(QSlider * cb=qobject_cast(ow->widget)) + { + cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); + } } setDirty(dirtyBack); } @@ -207,6 +214,10 @@ void ConfigTaskWidget::refreshWidgetsValues() { cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); } + else if(QSlider * cb=qobject_cast(ow->widget)) + { + cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); + } } setDirty(dirtyBack); } @@ -231,6 +242,10 @@ void ConfigTaskWidget::updateObjectsFromWidgets() { ow->field->setValue(cb->value()* ow->scale,ow->index); } + else if(QSlider * cb=qobject_cast(ow->widget)) + { + ow->field->setValue(cb->value()* ow->scale,ow->index); + } } } diff --git a/ground/openpilotgcs/src/plugins/config/input.ui b/ground/openpilotgcs/src/plugins/config/input.ui index 0ec15f063..2fac45ec9 100644 --- a/ground/openpilotgcs/src/plugins/config/input.ui +++ b/ground/openpilotgcs/src/plugins/config/input.ui @@ -30,7 +30,38 @@ 1 - + + + + + + + + Start Configuration Wizard + + + + + + + Run Calibration + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + @@ -48,13 +79,6 @@ 70 - - - 10 - 75 - true - - TextLabel diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp index 904918a8e..70223d57f 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp @@ -1,6 +1,8 @@ #include "inputchannelform.h" #include "ui_inputchannelform.h" +#include "manualcontrolsettings.h" + inputChannelForm::inputChannelForm(QWidget *parent,bool showlegend) : QWidget(parent), ui(new Ui::inputChannelForm) @@ -21,9 +23,103 @@ inputChannelForm::inputChannelForm(QWidget *parent,bool showlegend) : delete ui->legend4; delete ui->legend5; } + + connect(ui->channelMin,SIGNAL(valueChanged(int)),this,SLOT(minMaxUpdated())); + connect(ui->channelMax,SIGNAL(valueChanged(int)),this,SLOT(minMaxUpdated())); + connect(ui->channelGroup,SIGNAL(currentIndexChanged(int)),this,SLOT(groupUpdated())); + connect(ui->channelNeutral,SIGNAL(valueChanged(int)), this, SLOT(neutralUpdated(int))); + + // This is awkward but since we want the UI to be a dropdown but the field is not an enum + // it breaks the UAUVObject widget relation of the task gadget. Running the data through + // a spin box fixes this + connect(ui->channelNumberDropdown,SIGNAL(currentIndexChanged(int)),this,SLOT(channelDropdownUpdated(int))); + connect(ui->channelNumber,SIGNAL(valueChanged(int)),this,SLOT(channelNumberUpdated(int))); } inputChannelForm::~inputChannelForm() { delete ui; } + +/** + * Update the direction of the slider and boundaries + */ +void inputChannelForm::minMaxUpdated() +{ + bool reverse = ui->channelMin->value() > ui->channelMax->value(); + if(reverse) { + ui->channelNeutral->setMinimum(ui->channelMax->value()); + ui->channelNeutral->setMaximum(ui->channelMin->value()); + } else { + ui->channelNeutral->setMinimum(ui->channelMin->value()); + ui->channelNeutral->setMaximum(ui->channelMax->value()); + } + ui->channelRev->setChecked(reverse); + ui->channelNeutral->setInvertedAppearance(reverse); + ui->channelNeutral->setInvertedControls(reverse); +} + +void inputChannelForm::neutralUpdated(int newval) +{ + ui->neutral->setText(QString::number(newval)); +} + +/** + * Update the channel options based on the selected receiver type + * + * I fully admit this is terrible practice to embed data within UI + * like this. Open to suggestions. JC 2011-09-07 + */ +void inputChannelForm::groupUpdated() +{ + ui->channelNumberDropdown->clear(); + ui->channelNumberDropdown->addItem("Disabled"); + + quint8 count = 0; + + switch(ui->channelGroup->currentIndex()) { + case -1: // Nothing selected + count = 0; + break; + case ManualControlSettings::CHANNELGROUPS_PWM: + count = 8; // Need to make this 6 for CC + break; + case ManualControlSettings::CHANNELGROUPS_PPM: + case ManualControlSettings::CHANNELGROUPS_SPEKTRUM1: + case ManualControlSettings::CHANNELGROUPS_SPEKTRUM2: + count = 12; + break; + case ManualControlSettings::CHANNELGROUPS_SBUS: + count = 18; + break; + case ManualControlSettings::CHANNELGROUPS_GCS: + count = 5; + case ManualControlSettings::CHANNELGROUPS_NONE: + count = 0; + break; + default: + Q_ASSERT(0); + } + + for (int i = 0; i < count; i++) + ui->channelNumberDropdown->addItem(QString(tr("Chan %1").arg(i+1))); + + ui->channelNumber->setMaximum(count); + ui->channelNumber->setMinimum(0); +} + +/** + * Update the dropdown from the hidden control + */ +void inputChannelForm::channelDropdownUpdated(int newval) +{ + ui->channelNumber->setValue(newval); +} + +/** + * Update the hidden control from the dropdown + */ +void inputChannelForm::channelNumberUpdated(int newval) +{ + ui->channelNumberDropdown->setCurrentIndex(newval); +} diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.h b/ground/openpilotgcs/src/plugins/config/inputchannelform.h index 50615cb2c..eb8ad7d18 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.h @@ -16,6 +16,13 @@ public: ~inputChannelForm(); friend class ConfigInputWidget; +private slots: + void minMaxUpdated(); + void neutralUpdated(int); + void groupUpdated(); + void channelDropdownUpdated(int); + void channelNumberUpdated(int); + private: Ui::inputChannelForm *ui; }; diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index ac4c9e015..b1b69c052 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -6,8 +6,8 @@ 0 0 - 404 - 43 + 543 + 49 @@ -26,47 +26,7 @@ 0 - - - - true - - - Number - - - - - - - true - - - Min - - - - - - - true - - - Function - - - - - - - true - - - Group - - - - + @@ -85,41 +45,79 @@ - - - - - - - 255 + + + + + 6 + 0 + + + + + 100 + 16777215 + - - + + + + QAbstractSpinBox::NoButtons + + + 9999 + + + 1000 + + + + + + + QAbstractSpinBox::NoButtons + + + 9999 + + + 1000 + + + + + true - Neutral + Function - - - - 9999 + + + + true + + + Number - - - - 9999 + + + + true + + + Type - + true @@ -129,13 +127,132 @@ - - - - 9999 + + + + true + + + Min + + + + true + + + Neutral + + + + + + + Qt::Horizontal + + + + + + + + 4 + 0 + + + + + 80 + 16777215 + + + + 7 + + + + + + + true + + + + 0 + 0 + + + + + + + + false + + + Rev + + + + + + + + 0 + 0 + + + + + 30 + 0 + + + + + 30 + 16777215 + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + diff --git a/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Bottom.pdf b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Bottom.pdf new file mode 100644 index 000000000..105fe1b5e Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Bottom.pdf differ diff --git a/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Top.pdf b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Top.pdf new file mode 100644 index 000000000..1bd25ba23 Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure 3D Top.pdf differ diff --git a/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure Assembly.pdf b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure Assembly.pdf new file mode 100644 index 000000000..1120227fc Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/Assembly/CC Mag & Pressure Assembly.pdf differ diff --git a/hardware/beta/CopterControl Mag & Pressure/BOM/CC Mag & Pressure BOM.xls b/hardware/beta/CopterControl Mag & Pressure/BOM/CC Mag & Pressure BOM.xls new file mode 100644 index 000000000..cb2ba6d5d Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/BOM/CC Mag & Pressure BOM.xls differ diff --git a/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure Schematic.pdf b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure Schematic.pdf new file mode 100644 index 000000000..cca52e507 Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure Schematic.pdf differ diff --git a/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PcbDoc b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PcbDoc new file mode 100644 index 000000000..0d16ed0a9 Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PcbDoc differ diff --git a/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PrjPcb b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PrjPcb new file mode 100644 index 000000000..d325f7dd6 --- /dev/null +++ b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.PrjPcb @@ -0,0 +1,975 @@ +[Design] +Version=1.0 +HierarchyMode=0 +ChannelRoomNamingStyle=0 +OutputPath=Project Outputs for CopterControl Mag & Pressure +LogFolderPath=Project Logs for CopterControl Mag & Pressure +ChannelDesignatorFormatString=$Component_$RoomName +ChannelRoomLevelSeperator=_ +OpenOutputs=1 +ArchiveProject=0 +TimestampOutput=0 +SeparateFolders=0 +PinSwapBy_Netlabel=1 +PinSwapBy_Pin=1 +AllowPortNetNames=0 +AllowSheetEntryNetNames=1 +AppendSheetNumberToLocalNets=0 +NetlistSinglePinNets=0 +DefaultConfiguration= +UserID=0xFFFFFFFF +DefaultPcbProtel=1 +DefaultPcbPcad=0 +ReorderDocumentsOnCompile=1 +NameNetsHierarchically=0 +PowerPortNamesTakePriority=0 +PushECOToAnnotationFile=1 +DItemRevisionGUID= + +[Document1] +DocumentPath=CopterControl Mag & Pressure.PcbDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=1 +ClassGenNCAutoScope=None +DItemRevisionGUID= + +[Document2] +DocumentPath=CopterControl Mag & Pressure.SchDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= + +[GeneratedDocument1] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure-Plated.TXT +DItemRevisionGUID= + +[GeneratedDocument2] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.DRL +DItemRevisionGUID= + +[GeneratedDocument3] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.DRR +DItemRevisionGUID= + +[GeneratedDocument4] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.EXTREP +DItemRevisionGUID= + +[GeneratedDocument5] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GBL +DItemRevisionGUID= + +[GeneratedDocument6] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GBO +DItemRevisionGUID= + +[GeneratedDocument7] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GBP +DItemRevisionGUID= + +[GeneratedDocument8] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GBS +DItemRevisionGUID= + +[GeneratedDocument9] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GD1 +DItemRevisionGUID= + +[GeneratedDocument10] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GG1 +DItemRevisionGUID= + +[GeneratedDocument11] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GKO +DItemRevisionGUID= + +[GeneratedDocument12] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GM1 +DItemRevisionGUID= + +[GeneratedDocument13] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GPB +DItemRevisionGUID= + +[GeneratedDocument14] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GPT +DItemRevisionGUID= + +[GeneratedDocument15] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GTL +DItemRevisionGUID= + +[GeneratedDocument16] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GTO +DItemRevisionGUID= + +[GeneratedDocument17] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GTP +DItemRevisionGUID= + +[GeneratedDocument18] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.GTS +DItemRevisionGUID= + +[GeneratedDocument19] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.LDP +DItemRevisionGUID= + +[GeneratedDocument20] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.REP +DItemRevisionGUID= + +[GeneratedDocument21] +DocumentPath=Project Outputs for CopterControl Mag & Pressure\CopterControl Mag & Pressure.RUL +DItemRevisionGUID= + +[Generic_SmartPDF] +AutoOpenFile=-1 +AutoOpenOutJob=-1 + +[Generic_SmartPDFSettings] +ProjectMode=0 +ZoomPrecision=50 +AddNetsInformation=-1 +AddNetPins=-1 +AddNetNetLabels=-1 +AddNetPorts=-1 +ExportBOM=0 +TemplateFilename= +TemplateStoreRelative=-1 +PCB_PrintColor=0 +SCH_PrintColor=0 +SCH_ShowNoErc=0 +SCH_ShowParameter=0 +SCH_ShowProbes=0 +SCH_ShowBlankets=0 +OutputFileName=CopterControl Mag & Pressure.SchDoc=C:\Users\David\Documents\SVN\OP-WIP\trunk\hardware\production\CopterControl Mag\CopterControl Mag & Pressure Schematic.pdf +SCH_ExpandLogicalToPhysical=0 +SCH_VariantName=[No Variations] +SCH_ExpandComponentDesignators=-1 +SCH_ExpandNetlabels=0 +SCH_ExpandPorts=0 +SCH_ExpandSheetNumber=0 +SCH_ExpandDocumentNumber=0 +SCH_HasExpandLogicalToPhysicalSheets=-1 +SaveSettingsToOutJob=0 + +[OutputGroup1] +Name=Netlist Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=CadnetixNetlist +OutputName1=Cadnetix Netlist +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=CalayNetlist +OutputName2=Calay Netlist +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=EDIF +OutputName3=EDIF for PCB +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=EESofNetlist +OutputName4=EESof Netlist +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +OutputType5=IntergraphNetlist +OutputName5=Intergraph Netlist +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +OutputType6=MentorBoardStationNetlist +OutputName6=Mentor BoardStation Netlist +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +OutputType7=MultiWire +OutputName7=MultiWire +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +OutputType8=OrCadPCB2Netlist +OutputName8=Orcad/PCB2 Netlist +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +OutputType9=PADSNetlist +OutputName9=PADS ASCII Netlist +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +OutputType10=Pcad +OutputName10=Pcad for PCB +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +OutputType11=PCADNetlist +OutputName11=PCAD Netlist +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +OutputType12=PCADnltNetlist +OutputName12=PCADnlt Netlist +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +OutputType13=Protel2Netlist +OutputName13=Protel2 Netlist +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +OutputType14=ProtelNetlist +OutputName14=Protel +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +OutputType15=RacalNetlist +OutputName15=Racal Netlist +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +OutputType16=RINFNetlist +OutputName16=RINF Netlist +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +OutputType17=SciCardsNetlist +OutputName17=SciCards Netlist +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +OutputType18=SIMetrixNetlist +OutputName18=SIMetrix +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 +OutputType19=SIMPLISNetlist +OutputName19=SIMPLIS +OutputDocumentPath19= +OutputVariantName19= +OutputDefault19=0 +OutputType20=TangoNetlist +OutputName20=Tango Netlist +OutputDocumentPath20= +OutputVariantName20= +OutputDefault20=0 +OutputType21=TelesisNetlist +OutputName21=Telesis Netlist +OutputDocumentPath21= +OutputVariantName21= +OutputDefault21=0 +OutputType22=Verilog +OutputName22=Verilog File +OutputDocumentPath22= +OutputVariantName22= +OutputDefault22=0 +OutputType23=VHDL +OutputName23=VHDL File +OutputDocumentPath23= +OutputVariantName23= +OutputDefault23=0 +OutputType24=WireListNetlist +OutputName24=WireList Netlist +OutputDocumentPath24= +OutputVariantName24= +OutputDefault24=0 +OutputType25=XSpiceNetlist +OutputName25=XSpice Netlist +OutputDocumentPath25= +OutputVariantName25= +OutputDefault25=0 + +[OutputGroup2] +Name=Simulator Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=AdvSimNetlist +OutputName1=Mixed Sim +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=SIMetrix_Sim +OutputName2=SIMetrix +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=SIMPLIS_Sim +OutputName3=SIMPLIS +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 + +[OutputGroup3] +Name=Documentation Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Composite +OutputName1=Composite Drawing +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType2=Logic Analyser Print +OutputName2=Logic Analyser Prints +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType3=OpenBus Print +OutputName3=OpenBus Prints +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType4=PCB 3D Print +OutputName4=PCB 3D Prints +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType5=PCB Print +OutputName5=PCB Prints +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType6=Schematic Print +OutputName6=Schematic Prints +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType7=SimView Print +OutputName7=SimView Prints +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType8=Wave Print +OutputName8=Wave Prints +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType9=WaveSim Print +OutputName9=WaveSim Prints +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 + +[OutputGroup4] +Name=Assembly Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Assembly +OutputName1=Assembly Drawings +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType2=Pick Place +OutputName2=Generates pick and place files +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=Test Points For Assembly +OutputName3=Test Point Report +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 + +[OutputGroup5] +Name=Fabrication Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Drill +OutputName1=Drill Drawing/Guides +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType2=Mask +OutputName2=Solder/Paste Mask Prints +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType3=Final +OutputName3=Final Artwork Prints +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType4=CompositeDrill +OutputName4=Composite Drill Drawing +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType5=NC Drill +OutputName5=NC Drill Files +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +Configuration5_Name1=OutputConfigurationParameter1 +Configuration5_Item1=BoardEdgeRoutToolDia=2000000|GenerateBoardEdgeRout=False|GenerateDrilledSlotsG85=False|GenerateSeparatePlatedNonPlatedFiles=True|NumberOfDecimals=5|NumberOfUnits=2|OptimizeChangeLocationCommands=True|OriginPosition=Relative|Record=DrillView|Units=Imperial|ZeroesMode=SuppressTrailingZeroes +OutputType6=ODB +OutputName6=ODB++ Files +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +OutputType7=Plane +OutputName7=Power-Plane Prints +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType8=Test Points +OutputName8=Test Point Report +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +OutputType9=Gerber +OutputName9=Gerber Files +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +Configuration9_Name1=OutputConfigurationParameter1 +Configuration9_Item1=AddToAllPlots.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|CentrePlots=False|DrillDrawingSymbol=GraphicsSymbol|DrillDrawingSymbolSize=500000|EmbeddedApertures=True|FilmBorderSize=10000000|FilmXSize=200000000|FilmYSize=160000000|FlashAllFills=False|FlashPadShapes=True|G54OnApertureChange=False|GenerateDRCRulesFile=True|GenerateReliefShapes=True|GerberUnit=Imperial|IncludeUnconnectedMidLayerPads=False|LeadingAndTrailingZeroesMode=SuppressLeadingZeroes|MaxApertureSize=2500000|MinusApertureTolerance=50|Mirror.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|MirrorDrillDrawingPlots=False|MirrorDrillGuidePlots=False|NumberOfDecimals=5|OptimizeChangeLocationCommands=True|OriginPosition=Relative|Panelize=False|Plot.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,16973830~1,16973832~1,16973834~1,16777217~1,16842751~1,16973835~1,16973833~1,16973831~1,16908289~1,16973837~1,16973848~1,16973849~1|PlotPositivePlaneLayers=False|PlotUsedDrillDrawingLayerPairs=True|PlotUsedDrillGuideLayerPairs=True|PlusApertureTolerance=50|Record=GerberView|SoftwareArcs=False|Sorted=False + +[OutputGroup6] +Name=Report Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=BOM_PartType +OutputName1=Bill of Materials +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +Configuration1_Name1=Filter +Configuration1_Item1=545046300E5446696C74657257726170706572000D46696C7465722E416374697665090F46696C7465722E43726974657269610A04000000000000000000 +Configuration1_Name2=General +Configuration1_Item2=OpenExported=True|AddToProject=False|ForceFit=False|NotFitted=False|Database=False|IncludePCBData=False|ShowExportOptions=True|TemplateFilename=..\Altium\BOM OpenPilot.xlt|BatchMode=5|FormWidth=1456|FormHeight=598|SupplierProdQty=1|SupplierAutoQty=True|SupplierUseCachedPricing=True|SupplierCurrency= +Configuration1_Name3=GroupOrder +Configuration1_Item3=Supplier Part Number 1=True|Comment=True|Footprint=True +Configuration1_Name4=OutputConfigurationParameter1 +Configuration1_Item4=Record=BOMPrintView|ShowNoERC=True|ShowParamSet=True|ShowProbe=True|ShowBlanket=True|ExpandDesignator=True|ExpandNetLabel=False|ExpandPort=False|ExpandSheetNum=False|ExpandDocNum=False +Configuration1_Name5=SortOrder +Configuration1_Item5=Designator=Up|Comment=Up|Footprint=Up +Configuration1_Name6=VisibleOrder +Configuration1_Item6=Comment=100|Description=100|Designator=100|Footprint=100|LibRef=100|Quantity=100|Manufacturer 1=100|Manufacturer Part Number 1=100|Supplier 1=100|Supplier Order Qty 1=100|Supplier Part Number 1=100|Supplier Stock 1=100|Supplier Subtotal 1=100|Supplier Unit Price 1=100|Value=100 +OutputType2=ComponentCrossReference +OutputName2=Component Cross Reference Report +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=Design Rules Check +OutputName3=Design Rules Check +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType4=Electrical Rules Check +OutputName4=Electrical Rules Check +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType5=ReportHierarchy +OutputName5=Report Project Hierarchy +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +OutputType6=Script +OutputName6=Script Output +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +OutputType7=SimpleBOM +OutputName7=Simple BOM +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +OutputType8=SinglePinNetReporter +OutputName8=Report Single Pin Nets +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 + +[OutputGroup7] +Name=Other Outputs +Description= +TargetPrinter=Microsoft XPS Document Writer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Text Print +OutputName1=Text Print +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=Letter|PrintScaleMode=1 +OutputType2=Text Print +OutputName2=Text Print +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType3=Text Print +OutputName3=Text Print +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType4=Text Print +OutputName4=Text Print +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType5=Text Print +OutputName5=Text Print +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType6=Text Print +OutputName6=Text Print +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType7=Text Print +OutputName7=Text Print +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType8=Text Print +OutputName8=Text Print +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType9=Text Print +OutputName9=Text Print +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType10=Text Print +OutputName10=Text Print +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType11=Text Print +OutputName11=Text Print +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType12=Text Print +OutputName12=Text Print +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType13=Text Print +OutputName13=Text Print +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType14=Text Print +OutputName14=Text Print +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +PageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType15=Text Print +OutputName15=Text Print +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +PageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType16=Text Print +OutputName16=Text Print +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +PageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType17=Text Print +OutputName17=Text Print +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +PageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType18=Text Print +OutputName18=Text Print +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 +PageOptions18=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType19=Text Print +OutputName19=Text Print +OutputDocumentPath19= +OutputVariantName19= +OutputDefault19=0 +PageOptions19=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType20=Text Print +OutputName20=Text Print +OutputDocumentPath20= +OutputVariantName20= +OutputDefault20=0 +PageOptions20=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType21=Text Print +OutputName21=Text Print +OutputDocumentPath21= +OutputVariantName21= +OutputDefault21=0 +PageOptions21=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType22=Text Print +OutputName22=Text Print +OutputDocumentPath22= +OutputVariantName22= +OutputDefault22=0 +PageOptions22=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType23=Text Print +OutputName23=Text Print +OutputDocumentPath23= +OutputVariantName23= +OutputDefault23=0 +PageOptions23=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType24=Text Print +OutputName24=Text Print +OutputDocumentPath24= +OutputVariantName24= +OutputDefault24=0 +PageOptions24=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType25=Text Print +OutputName25=Text Print +OutputDocumentPath25= +OutputVariantName25= +OutputDefault25=0 +PageOptions25=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType26=Text Print +OutputName26=Text Print +OutputDocumentPath26= +OutputVariantName26= +OutputDefault26=0 +PageOptions26=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType27=Text Print +OutputName27=Text Print +OutputDocumentPath27= +OutputVariantName27= +OutputDefault27=0 +PageOptions27=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType28=Text Print +OutputName28=Text Print +OutputDocumentPath28= +OutputVariantName28= +OutputDefault28=0 +PageOptions28=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 + +[Modification Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 +Type37=1 +Type38=1 +Type39=1 +Type40=1 +Type41=1 +Type42=1 +Type43=1 +Type44=1 +Type45=1 +Type46=1 +Type47=1 +Type48=1 +Type49=1 +Type50=1 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=1 +Type57=1 +Type58=1 +Type59=1 +Type60=1 +Type61=1 +Type62=1 +Type63=1 +Type64=1 +Type65=1 +Type66=1 +Type67=1 +Type68=1 + +[Difference Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 + +[Electrical Rules Check] +Type1=1 +Type2=1 +Type3=2 +Type4=1 +Type5=2 +Type6=2 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=2 +Type12=2 +Type13=2 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=2 +Type26=2 +Type27=2 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=2 +Type33=2 +Type34=2 +Type35=1 +Type36=2 +Type37=1 +Type38=2 +Type39=2 +Type40=2 +Type41=0 +Type42=2 +Type43=1 +Type44=1 +Type45=2 +Type46=1 +Type47=2 +Type48=2 +Type49=1 +Type50=2 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=2 +Type57=1 +Type58=1 +Type59=0 +Type60=1 +Type61=2 +Type62=2 +Type63=1 +Type64=0 +Type65=2 +Type66=3 +Type67=2 +Type68=2 +Type69=1 +Type70=2 +Type71=2 +Type72=2 +Type73=2 +Type74=1 +Type75=2 +Type76=1 +Type77=1 +Type78=1 +Type79=1 +Type80=2 +Type81=3 +Type82=3 +Type83=3 +Type84=3 +Type85=3 +Type86=2 +Type87=2 +Type88=2 +Type89=1 +Type90=1 +Type91=3 +Type92=3 +Type93=2 +Type94=2 +Type95=2 +Type96=2 +Type97=2 +Type98=0 + +[ERC Connection Matrix] +L1=NNNNNNNNNNNWNNNWW +L2=NNWNNNNWWWNWNWNWN +L3=NWEENEEEENEWNEEWN +L4=NNENNNWEENNWNENWN +L5=NNNNNNNNNNNNNNNNN +L6=NNENNNNEENNWNENWN +L7=NNEWNNWEENNWNENWN +L8=NWEENEENEEENNEENN +L9=NWEENEEEENEWNEEWW +L10=NWNNNNNENNEWNNEWN +L11=NNENNNNEEENWNENWN +L12=WWWWNWWNWWWNWWWNN +L13=NNNNNNNNNNNWNNNWW +L14=NWEENEEEENEWNEEWW +L15=NNENNNNEEENWNENWW +L16=WWWWNWWNWWWNWWWNW +L17=WNNNNNNNWNNNWWWWN + +[Annotate] +SortOrder=3 +MatchParameter1=Comment +MatchStrictly1=1 +MatchParameter2=Library Reference +MatchStrictly2=1 +PhysicalNamingFormat=$Component_$RoomName +GlobalIndexSortOrder=3 + +[PrjClassGen] +CompClassManualEnabled=0 +CompClassManualRoomEnabled=0 +NetClassAutoBusEnabled=1 +NetClassAutoCompEnabled=0 +NetClassAutoNamedHarnessEnabled=0 +NetClassManualEnabled=1 + +[LibraryUpdateOptions] +SelectedOnly=0 +PartTypes=0 +FullReplace=1 +UpdateDesignatorLock=1 +UpdatePartIDLock=1 +DoGraphics=1 +DoParameters=1 +DoModels=1 +AddParameters=0 +RemoveParameters=0 +AddModels=1 +RemoveModels=1 +UpdateCurrentModels=1 + +[DatabaseUpdateOptions] +SelectedOnly=0 +PartTypes=0 + +[Comparison Options] +ComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|Confirm=0|UseName=0|InclAllRules=0 + +[SmartPDF] +PageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 + diff --git a/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.SchDoc b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.SchDoc new file mode 100644 index 000000000..60dd402e2 Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/CopterControl Mag & Pressure.SchDoc differ diff --git a/hardware/beta/CopterControl Mag & Pressure/Gerbers/Gerbers for CopterControl Mag & Pressure.zip b/hardware/beta/CopterControl Mag & Pressure/Gerbers/Gerbers for CopterControl Mag & Pressure.zip new file mode 100644 index 000000000..f94998911 Binary files /dev/null and b/hardware/beta/CopterControl Mag & Pressure/Gerbers/Gerbers for CopterControl Mag & Pressure.zip differ diff --git a/shared/uavobjectdefinition/manualcontrolcommand.xml b/shared/uavobjectdefinition/manualcontrolcommand.xml index ef74c2576..d8dba78d6 100644 --- a/shared/uavobjectdefinition/manualcontrolcommand.xml +++ b/shared/uavobjectdefinition/manualcontrolcommand.xml @@ -2,11 +2,12 @@ The output from the @ref ManualControlModule which descodes the receiver inputs. Overriden by GCS for fly-by-wire control. - + + - - + + diff --git a/shared/uavobjectdefinition/manualcontrolsettings.xml b/shared/uavobjectdefinition/manualcontrolsettings.xml index d6d7b90a3..ae7c9b24c 100644 --- a/shared/uavobjectdefinition/manualcontrolsettings.xml +++ b/shared/uavobjectdefinition/manualcontrolsettings.xml @@ -2,16 +2,16 @@ Settings to indicate how to decode receiver input by @ref ManualControlModule. - + + elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/> + elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/> + elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/> diff --git a/shared/uavobjectdefinition/mixersettings.xml b/shared/uavobjectdefinition/mixersettings.xml index e070814c5..64aa7604f 100644 --- a/shared/uavobjectdefinition/mixersettings.xml +++ b/shared/uavobjectdefinition/mixersettings.xml @@ -6,7 +6,7 @@ - +