Skip to content

Commit

Permalink
Merge branch 'master' into #111-px4io-integrated-mixing
Browse files Browse the repository at this point in the history
Fix a botched merge for #106 at the same time.
  • Loading branch information
px4dev committed Jan 6, 2013
2 parents dbb841b + b3e16b4 commit 9df2aaf
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 30 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Make.dep
*.o
*.a
*~
*.dSYM
Images/*.bin
Images/*.px4
nuttx/Make.defs
Expand Down Expand Up @@ -40,3 +41,4 @@ nsh_romfsimg.h
cscope.out
.configX-e
nuttx-export.zip
dot.gdbinit
22 changes: 0 additions & 22 deletions apps/drivers/boards/px4io/px4io_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,28 +61,6 @@
#define GPIO_LED3 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|\
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10)

/* R/C in/out channels **************************************************************/

/* XXX just GPIOs for now - eventually timer pins */

#define GPIO_CH1_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN0)
#define GPIO_CH2_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN1)
#define GPIO_CH3_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
#define GPIO_CH4_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
#define GPIO_CH5_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN6)
#define GPIO_CH6_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN7)
#define GPIO_CH7_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN0)
#define GPIO_CH8_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN1)

#define GPIO_CH1_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN0)
#define GPIO_CH2_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN1)
#define GPIO_CH3_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN8)
#define GPIO_CH4_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9)
#define GPIO_CH5_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN6)
#define GPIO_CH6_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7)
#define GPIO_CH7_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN0)
#define GPIO_CH8_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN1)

/* Safety switch button *************************************************************/

#define GPIO_BTN_SAFETY (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5)
Expand Down
2 changes: 1 addition & 1 deletion apps/drivers/px4fmu/fmu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg)
/* FALLTHROUGH */
case PWM_SERVO_GET(0):
case PWM_SERVO_GET(1): {
channel = cmd - PWM_SERVO_SET(0);
channel = cmd - PWM_SERVO_GET(0);
*(servo_position_t *)arg = up_pwm_servo_get(channel);
break;
}
Expand Down
32 changes: 31 additions & 1 deletion apps/drivers/px4io/px4io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
#include <drivers/device/device.h>
#include <drivers/drv_rc_input.h>
#include <drivers/drv_pwm_output.h>
#include <drivers/drv_gpio.h>
#include <drivers/drv_hrt.h>
#include <drivers/drv_mixer.h>

Expand Down Expand Up @@ -117,6 +118,8 @@ class PX4IO : public device::CDev

bool _primary_pwm_device; ///< true if we are the default PWM output

uint32_t _relays; ///< state of the PX4IO relays, one bit per relay

volatile bool _switch_armed; ///< PX4IO switch armed state
// XXX how should this work?

Expand Down Expand Up @@ -195,6 +198,7 @@ PX4IO::PX4IO() :
_mix_buf(nullptr),
_mix_buf_len(0),
_primary_pwm_device(false),
_relays(0),
_switch_armed(false),
_send_needed(false),
_config_needed(false)
Expand Down Expand Up @@ -542,7 +546,9 @@ PX4IO::io_send()
/* XXX needs to be based off post-mix values from the IO side */
orb_publish(ORB_ID_VEHICLE_CONTROLS, _t_outputs, &_outputs);

// XXX relays
/* update relays */
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++)
cmd.relay_state[i] = (_relays & (1<< i)) ? true : false;

/* armed and not locked down */
cmd.arm_ok = (_armed.armed && !_armed.lockdown);
Expand Down Expand Up @@ -641,6 +647,30 @@ PX4IO::ioctl(file *filep, int cmd, unsigned long arg)
*(servo_position_t *)arg = _outputs.output[cmd - PWM_SERVO_GET(0)];
break;

case GPIO_RESET:
_relays = 0;
_send_needed = true;
break;

case GPIO_SET:
case GPIO_CLEAR:
/* make sure only valid bits are being set */
if ((arg & ((1UL << PX4IO_RELAY_CHANNELS) - 1)) != arg) {
ret = EINVAL;
break;
}
if (cmd == GPIO_SET) {
_relays |= arg;
} else {
_relays &= ~arg;
}
_send_needed = true;
break;

case GPIO_GET:
*(uint32_t *)arg = _relays;
break;

case MIXERIOCGETOUTPUTCOUNT:
*(unsigned *)arg = PX4IO_CONTROL_CHANNELS;
break;
Expand Down
21 changes: 19 additions & 2 deletions apps/px4io/comms.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,9 +191,26 @@ comms_handle_command(const void *buffer, size_t length)
// if (!system_state.arm_ok && system_state.armed)
// system_state.armed = false;

/* XXX do relay changes here */
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++)
/* handle relay state changes here */
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++) {
if (system_state.relays[i] != cmd->relay_state[i]) {
switch (i) {
case 0:
POWER_ACC1(cmd->relay_state[i]);
break;
case 1:
POWER_ACC2(cmd->relay_state[i]);
break;
case 2:
POWER_RELAY1(cmd->relay_state[i]);
break;
case 3:
POWER_RELAY2(cmd->relay_state[i]);
break;
}
}
system_state.relays[i] = cmd->relay_state[i];
}

irqrestore(flags);
}
Expand Down
4 changes: 2 additions & 2 deletions apps/px4io/px4io.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ extern volatile int timers[TIMER_NUM_TIMERS];
#define LED_SAFETY(_s) stm32_gpiowrite(GPIO_LED3, !(_s))

#define POWER_SERVO(_s) stm32_gpiowrite(GPIO_SERVO_PWR_EN, (_s))
#define POWER_ACC1(_s) stm32_gpiowrite(GPIO_SERVO_ACC1_EN, (_s))
#define POWER_ACC2(_s) stm32_gpiowrite(GPIO_SERVO_ACC2_EN, (_s))
#define POWER_ACC1(_s) stm32_gpiowrite(GPIO_ACC1_PWR_EN, (_s))
#define POWER_ACC2(_s) stm32_gpiowrite(GPIO_ACC2_PWR_EN, (_s))
#define POWER_RELAY1(_s) stm32_gpiowrite(GPIO_RELAY1_EN, (_s))
#define POWER_RELAY2(_s) stm32_gpiowrite(GPIO_RELAY2_EN, (_s))

Expand Down
39 changes: 37 additions & 2 deletions nuttx/drivers/serial/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -660,9 +660,9 @@ static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg)

int ret = dev->ops->ioctl(filep, cmd, arg);

/* Append any higher level TTY flags */
/* If the low-level handler didn't handle the call, see if we can handle it here */

if (ret == OK)
if (ret == -ENOTTY)
{
switch (cmd)
{
Expand All @@ -686,8 +686,43 @@ static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
irqrestore(state);

*(int *)arg = count;
ret = 0;

break;
}

case FIONWRITE:
{
int count;
irqstate_t state = irqsave();

/* determine the number of bytes free in the buffer */

if (dev->xmit.head < dev->xmit.tail)
{
count = dev->xmit.tail - dev->xmit.head - 1;
}
else
{
count = dev->xmit.size - (dev->xmit.head - dev->xmit.tail) - 1;
}

irqrestore(state);

*(int *)arg = count;
ret = 0;

break;
}
}
}

/* Append any higher level TTY flags */

else if (ret == OK)
{
switch (cmd)
{
#ifdef CONFIG_SERIAL_TERMIOS
case TCGETS:
{
Expand Down
4 changes: 4 additions & 0 deletions nuttx/include/nuttx/fs/ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@
* OUT: Bytes readable from this fd
*/

#define FIONWRITE _FIOC(0x0005) /* IN: Location to return value (int *)
* OUT: Bytes writable to this fd
*/

/* NuttX file system ioctl definitions **************************************/

#define _DIOCVALID(c) (_IOC_TYPE(c)==_DIOCBASE)
Expand Down

0 comments on commit 9df2aaf

Please sign in to comment.