aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/px4io/px4io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/px4io/px4io.cpp')
-rw-r--r--src/drivers/px4io/px4io.cpp208
1 files changed, 80 insertions, 128 deletions
diff --git a/src/drivers/px4io/px4io.cpp b/src/drivers/px4io/px4io.cpp
index f6d4f1ed4..d709f1cc8 100644
--- a/src/drivers/px4io/px4io.cpp
+++ b/src/drivers/px4io/px4io.cpp
@@ -181,21 +181,6 @@ public:
int set_failsafe_values(const uint16_t *vals, unsigned len);
/**
- * Set the minimum PWM signals when armed
- */
- int set_min_values(const uint16_t *vals, unsigned len);
-
- /**
- * Set the maximum PWM signal when armed
- */
- int set_max_values(const uint16_t *vals, unsigned len);
-
- /**
- * Set an idle PWM signal that is active right after startup, even when SAFETY_SAFE
- */
- int set_idle_values(const uint16_t *vals, unsigned len);
-
- /**
* Disable RC input handling
*/
int disable_rc_handling();
@@ -409,6 +394,21 @@ private:
int mixer_send(const char *buf, unsigned buflen, unsigned retries=3);
/**
+ * Set the minimum PWM signals when armed
+ */
+ int set_min_values(const uint16_t *vals, unsigned len);
+
+ /**
+ * Set the maximum PWM signal when armed
+ */
+ int set_max_values(const uint16_t *vals, unsigned len);
+
+ /**
+ * Set an idle PWM signal that is active right after startup, even when SAFETY_SAFE
+ */
+ int set_idle_values(const uint16_t *vals, unsigned len);
+
+ /**
* Handle a status update from IO.
*
* Publish IO status information if necessary.
@@ -986,10 +986,8 @@ PX4IO::set_idle_values(const uint16_t *vals, unsigned len)
/* fail with error */
return E2BIG;
- printf("Sending IDLE values\n");
-
/* copy values to registers in IO */
- return io_reg_set(PX4IO_PAGE_IDLE_PWM, 0, vals, len);
+ return io_reg_set(PX4IO_PAGE_DISARMED_PWM, 0, vals, len);
}
@@ -1807,7 +1805,7 @@ PX4IO::print_status()
printf(" %u", io_reg_get(PX4IO_PAGE_FAILSAFE_PWM, i));
printf("\nidle values");
for (unsigned i = 0; i < _max_actuators; i++)
- printf(" %u", io_reg_get(PX4IO_PAGE_IDLE_PWM, i));
+ printf(" %u", io_reg_get(PX4IO_PAGE_DISARMED_PWM, i));
printf("\n");
}
@@ -1839,12 +1837,22 @@ PX4IO::ioctl(file * /*filep*/, int cmd, unsigned long arg)
ret = io_reg_modify(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_ARMING, PX4IO_P_SETUP_ARMING_FMU_ARMED, 0);
break;
+ case PWM_SERVO_GET_DEFAULT_UPDATE_RATE:
+ /* get the default update rate */
+ *(unsigned *)arg = io_reg_get(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_PWM_DEFAULTRATE);
+ break;
+
case PWM_SERVO_SET_UPDATE_RATE:
/* set the requested alternate rate */
ret = io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_PWM_ALTRATE, arg);
break;
- case PWM_SERVO_SELECT_UPDATE_RATE: {
+ case PWM_SERVO_GET_UPDATE_RATE:
+ /* get the alternative update rate */
+ *(unsigned *)arg = io_reg_get(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_PWM_ALTRATE);
+ break;
+
+ case PWM_SERVO_SET_SELECT_UPDATE_RATE: {
/* blindly clear the PWM update alarm - might be set for some other reason */
io_reg_set(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_ALARMS, PX4IO_P_STATUS_ALARMS_PWM_ERROR);
@@ -1861,6 +1869,53 @@ PX4IO::ioctl(file * /*filep*/, int cmd, unsigned long arg)
break;
}
+ case PWM_SERVO_GET_SELECT_UPDATE_RATE:
+
+ *(unsigned *)arg = io_reg_get(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_PWM_RATES);
+ break;
+
+ case PWM_SERVO_SET_DISARMED_PWM: {
+ struct pwm_output_values* pwm = (struct pwm_output_values*)arg;
+ set_idle_values(pwm->values, pwm->channel_count);
+ break;
+ }
+
+ case PWM_SERVO_GET_DISARMED_PWM:
+
+ ret = io_reg_get(PX4IO_PAGE_DISARMED_PWM, 0, (uint16_t*)arg, sizeof(struct pwm_output_values)/sizeof(uint16_t));
+ if (ret != OK) {
+ ret = -EIO;
+ }
+ break;
+
+ case PWM_SERVO_SET_MIN_PWM: {
+ struct pwm_output_values* pwm = (struct pwm_output_values*)arg;
+ set_min_values(pwm->values, pwm->channel_count);
+ break;
+ }
+
+ case PWM_SERVO_GET_MIN_PWM:
+
+ ret = io_reg_get(PX4IO_PAGE_CONTROL_MIN_PWM, 0, (uint16_t*)arg, sizeof(struct pwm_output_values)/sizeof(uint16_t));
+ if (ret != OK) {
+ ret = -EIO;
+ }
+ break;
+
+ case PWM_SERVO_SET_MAX_PWM: {
+ struct pwm_output_values* pwm = (struct pwm_output_values*)arg;
+ set_max_values(pwm->values, pwm->channel_count);
+ break;
+ }
+
+ case PWM_SERVO_GET_MAX_PWM:
+
+ ret = io_reg_get(PX4IO_PAGE_CONTROL_MAX_PWM, 0, (uint16_t*)arg, sizeof(struct pwm_output_values)/sizeof(uint16_t));
+ if (ret != OK) {
+ ret = -EIO;
+ }
+ break;
+
case PWM_SERVO_GET_COUNT:
*(unsigned *)arg = _max_actuators;
break;
@@ -1884,7 +1939,7 @@ PX4IO::ioctl(file * /*filep*/, int cmd, unsigned long arg)
/* TODO: we could go lower for e.g. TurboPWM */
unsigned channel = cmd - PWM_SERVO_SET(0);
- if ((channel >= _max_actuators) || (arg < 900) || (arg > 2100)) {
+ if ((channel >= _max_actuators) || (arg < PWM_MIN) || (arg > PWM_MAX)) {
ret = -EINVAL;
} else {
/* send a direct PWM value */
@@ -2475,10 +2530,10 @@ px4io_main(int argc, char *argv[])
for (unsigned i = 0; i < sizeof(failsafe) / sizeof(failsafe[0]); i++) {
/* set channel to commandline argument or to 900 for non-provided channels */
- if (argc > i + 2) {
+ if ((unsigned)argc > i + 2) {
failsafe[i] = atoi(argv[i+2]);
- if (failsafe[i] < 800 || failsafe[i] > 2200) {
- errx(1, "value out of range of 800 < value < 2200. Aborting.");
+ if (failsafe[i] < PWM_MIN || failsafe[i] > PWM_MAX) {
+ errx(1, "value out of range of %d < value < %d. Aborting.", PWM_MIN, PWM_MAX);
}
} else {
/* a zero value will result in stopping to output any pulse */
@@ -2493,110 +2548,7 @@ px4io_main(int argc, char *argv[])
exit(0);
}
- if (!strcmp(argv[1], "min")) {
-
- if (argc < 3) {
- errx(1, "min command needs at least one channel value (PWM)");
- }
-
- if (g_dev != nullptr) {
-
- /* set values for first 8 channels, fill unassigned channels with 900. */
- uint16_t min[8];
-
- for (unsigned i = 0; i < sizeof(min) / sizeof(min[0]); i++)
- {
- /* set channel to commanline argument or to 900 for non-provided channels */
- if (argc > i + 2) {
- min[i] = atoi(argv[i+2]);
- if (min[i] < 900 || min[i] > 1200) {
- errx(1, "value out of range of 900 < value < 1200. Aborting.");
- }
- } else {
- /* a zero value will the default */
- min[i] = 0;
- }
- }
-
- int ret = g_dev->set_min_values(min, sizeof(min) / sizeof(min[0]));
-
- if (ret != OK)
- errx(ret, "failed setting min values");
- } else {
- errx(1, "not loaded");
- }
- exit(0);
- }
-
- if (!strcmp(argv[1], "max")) {
-
- if (argc < 3) {
- errx(1, "max command needs at least one channel value (PWM)");
- }
-
- if (g_dev != nullptr) {
-
- /* set values for first 8 channels, fill unassigned channels with 2100. */
- uint16_t max[8];
-
- for (unsigned i = 0; i < sizeof(max) / sizeof(max[0]); i++)
- {
- /* set channel to commanline argument or to 2100 for non-provided channels */
- if (argc > i + 2) {
- max[i] = atoi(argv[i+2]);
- if (max[i] < 1800 || max[i] > 2100) {
- errx(1, "value out of range of 1800 < value < 2100. Aborting.");
- }
- } else {
- /* a zero value will the default */
- max[i] = 0;
- }
- }
-
- int ret = g_dev->set_max_values(max, sizeof(max) / sizeof(max[0]));
-
- if (ret != OK)
- errx(ret, "failed setting max values");
- } else {
- errx(1, "not loaded");
- }
- exit(0);
- }
-
- if (!strcmp(argv[1], "idle")) {
- if (argc < 3) {
- errx(1, "max command needs at least one channel value (PWM)");
- }
-
- if (g_dev != nullptr) {
-
- /* set values for first 8 channels, fill unassigned channels with 0. */
- uint16_t idle[8];
-
- for (unsigned i = 0; i < sizeof(idle) / sizeof(idle[0]); i++)
- {
- /* set channel to commanline argument or to 0 for non-provided channels */
- if (argc > i + 2) {
- idle[i] = atoi(argv[i+2]);
- if (idle[i] < 900 || idle[i] > 2100) {
- errx(1, "value out of range of 900 < value < 2100. Aborting.");
- }
- } else {
- /* a zero value will the default */
- idle[i] = 0;
- }
- }
-
- int ret = g_dev->set_idle_values(idle, sizeof(idle) / sizeof(idle[0]));
-
- if (ret != OK)
- errx(ret, "failed setting idle values");
- } else {
- errx(1, "not loaded");
- }
- exit(0);
- }
if (!strcmp(argv[1], "recovery")) {
@@ -2664,5 +2616,5 @@ px4io_main(int argc, char *argv[])
bind(argc, argv);
out:
- errx(1, "need a command, try 'start', 'stop', 'status', 'test', 'monitor', 'debug',\n 'recovery', 'limit', 'current', 'failsafe', 'min, 'max',\n 'idle', 'bind' or 'update'");
+ errx(1, "need a command, try 'start', 'stop', 'status', 'test', 'monitor', 'debug',\n 'recovery', 'limit', 'current', 'failsafe', 'bind' or 'update'");
}