int uORB::DeviceNode::ioctl(device::file_t *filp, int cmd, unsigned long arg) { //warnx("uORB::DeviceNode::ioctl fd = %d cmd = %d", filp->fd, cmd); SubscriberData *sd = filp_to_sd(filp); switch (cmd) { case ORBIOCLASTUPDATE: *(hrt_abstime *)arg = _last_update; return PX4_OK; case ORBIOCUPDATED: *(bool *)arg = appears_updated(sd); return PX4_OK; case ORBIOCSETINTERVAL: sd->update_interval = arg; return PX4_OK; case ORBIOCGADVERTISER: *(uintptr_t *)arg = (uintptr_t)this; return PX4_OK; case ORBIOCGPRIORITY: *(int *)arg = sd->priority; return PX4_OK; default: /* give it to the superclass */ return VDev::ioctl(filp, cmd, arg); } }
int ORBDevNode::ioctl(struct file *filp, int cmd, unsigned long arg) { SubscriberData *sd = filp_to_sd(filp); switch (cmd) { case ORBIOCLASTUPDATE: *(hrt_abstime *)arg = _last_update; return OK; case ORBIOCUPDATED: *(bool *)arg = appears_updated(sd); return OK; case ORBIOCSETINTERVAL: sd->update_interval = arg; return OK; case ORBIOCGADVERTISER: *(uintptr_t *)arg = (uintptr_t)this; return OK; default: /* give it to the superclass */ return CDev::ioctl(filp, cmd, arg); } }
void ORBDevNode::poll_notify_one(struct pollfd *fds, pollevent_t events) { SubscriberData *sd = filp_to_sd((struct file *)fds->priv); /* * If the topic looks updated to the subscriber, go ahead and notify them. */ if (appears_updated(sd)) CDev::poll_notify_one(fds, events); }
void uORB::DeviceNode::poll_notify_one(px4_pollfd_struct_t *fds, pollevent_t events) { SubscriberData *sd = filp_to_sd((cdev::file_t *)fds->priv); /* * If the topic looks updated to the subscriber, go ahead and notify them. */ if (appears_updated(sd)) { CDev::poll_notify_one(fds, events); } }
pollevent_t ORBDevNode::poll_state(struct file *filp) { SubscriberData *sd = filp_to_sd(filp); /* * If the topic appears updated to the subscriber, say so. */ if (appears_updated(sd)) return POLLIN; return 0; }
pollevent_t uORB::DeviceNode::poll_state(cdev::file_t *filp) { SubscriberData *sd = filp_to_sd(filp); /* * If the topic appears updated to the subscriber, say so. */ if (appears_updated(sd)) { return POLLIN; } return 0; }
int uORB::DeviceNode::ioctl(device::file_t *filp, int cmd, unsigned long arg) { //warnx("uORB::DeviceNode::ioctl fd = %d cmd = %d", filp->fd, cmd); SubscriberData *sd = filp_to_sd(filp); switch (cmd) { case ORBIOCLASTUPDATE: lock(); *(hrt_abstime *)arg = _last_update; unlock(); return PX4_OK; case ORBIOCUPDATED: lock(); *(bool *)arg = appears_updated(sd); unlock(); return PX4_OK; case ORBIOCSETINTERVAL: lock(); sd->update_interval = arg; sd->last_update = hrt_absolute_time(); unlock(); return PX4_OK; case ORBIOCGADVERTISER: *(uintptr_t *)arg = (uintptr_t)this; return PX4_OK; case ORBIOCGPRIORITY: *(int *)arg = sd->priority; return PX4_OK; case ORBIOCSETQUEUESIZE: //no need for locking here, since this is used only during the advertisement call, //and only one advertiser is allowed to open the DeviceNode at the same time. return update_queue_size(arg); case ORBIOCGETINTERVAL: *(unsigned *)arg = sd->update_interval; return OK; default: /* give it to the superclass */ return VDev::ioctl(filp, cmd, arg); } }
int uORB::DeviceNode::ioctl(struct file *filp, int cmd, unsigned long arg) { SubscriberData *sd = filp_to_sd(filp); switch (cmd) { case ORBIOCLASTUPDATE: { irqstate_t state = px4_enter_critical_section(); *(hrt_abstime *)arg = _last_update; px4_leave_critical_section(state); return OK; } case ORBIOCUPDATED: *(bool *)arg = appears_updated(sd); return OK; case ORBIOCSETINTERVAL: { int ret = PX4_OK; lock(); if (arg == 0) { if (sd->update_interval) { delete(sd->update_interval); sd->update_interval = nullptr; } } else { if (sd->update_interval) { sd->update_interval->interval = arg; } else { sd->update_interval = new UpdateIntervalData(); if (sd->update_interval) { memset(&sd->update_interval->update_call, 0, sizeof(hrt_call)); sd->update_interval->interval = arg; } else { ret = -ENOMEM; } } } unlock(); return ret; } case ORBIOCGADVERTISER: *(uintptr_t *)arg = (uintptr_t)this; return OK; case ORBIOCGPRIORITY: *(int *)arg = sd->priority(); return OK; case ORBIOCSETQUEUESIZE: //no need for locking here, since this is used only during the advertisement call, //and only one advertiser is allowed to open the DeviceNode at the same time. return update_queue_size(arg); case ORBIOCGETINTERVAL: if (sd->update_interval) { *(unsigned *)arg = sd->update_interval->interval; } else { *(unsigned *)arg = 0; } return OK; default: /* give it to the superclass */ return CDev::ioctl(filp, cmd, arg); } }
int uORB::DeviceNode::ioctl(cdev::file_t *filp, int cmd, unsigned long arg) { SubscriberData *sd = filp_to_sd(filp); switch (cmd) { case ORBIOCLASTUPDATE: { ATOMIC_ENTER; *(hrt_abstime *)arg = _last_update; ATOMIC_LEAVE; return PX4_OK; } case ORBIOCUPDATED: #ifndef __PX4_NUTTX lock(); #endif *(bool *)arg = appears_updated(sd); #ifndef __PX4_NUTTX unlock(); #endif return PX4_OK; case ORBIOCSETINTERVAL: { int ret = PX4_OK; lock(); if (arg == 0) { if (sd->update_interval) { delete (sd->update_interval); sd->update_interval = nullptr; } } else { if (sd->update_interval) { sd->update_interval->interval = arg; #ifndef __PX4_NUTTX sd->update_interval->last_update = hrt_absolute_time(); #endif } else { sd->update_interval = new UpdateIntervalData(); if (sd->update_interval) { memset(&sd->update_interval->update_call, 0, sizeof(hrt_call)); sd->update_interval->interval = arg; #ifndef __PX4_NUTTX sd->update_interval->last_update = hrt_absolute_time(); #endif } else { ret = -ENOMEM; } } } unlock(); return ret; } case ORBIOCGADVERTISER: *(uintptr_t *)arg = (uintptr_t)this; return PX4_OK; case ORBIOCGPRIORITY: *(int *)arg = sd->priority(); return PX4_OK; case ORBIOCSETQUEUESIZE: //no need for locking here, since this is used only during the advertisement call, //and only one advertiser is allowed to open the DeviceNode at the same time. return update_queue_size(arg); case ORBIOCGETINTERVAL: if (sd->update_interval) { *(unsigned *)arg = sd->update_interval->interval; } else { *(unsigned *)arg = 0; } return OK; case ORBIOCISPUBLISHED: *(unsigned long *)arg = _published; return OK; default: /* give it to the superclass */ return CDev::ioctl(filp, cmd, arg); } }