diff --git a/sys/include/transceiver.h b/sys/include/transceiver.h index e8025b815f..ad01c7a3fc 100644 --- a/sys/include/transceiver.h +++ b/sys/include/transceiver.h @@ -228,5 +228,15 @@ int transceiver_start(void); */ uint8_t transceiver_register(transceiver_type_t transceivers, int pid); +/** + * @brief unregister a thread for events from certain transceivers + * + * @param transceivers The transceiver types to register for + * @param pid The pid of the thread to register + * + * @return 1 on success, 0 otherwise + */ +uint8_t transceiver_unregister(transceiver_type_t transceivers, int pid); + #endif /* TRANSCEIVER_H */ /** @} */ diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index e712124b1a..ca588a6af0 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -251,6 +251,25 @@ uint8_t transceiver_register(transceiver_type_t t, int pid) } } +/* Unregister an upper layer thread */ +uint8_t transceiver_unregister(transceiver_type_t t, int pid) +{ + uint8_t i; + + /* find pid in unregistered threads or first unused space */ + for (i = 0; ((i < TRANSCEIVER_MAX_REGISTERED) && + (reg[i].pid != pid) && + (reg[i].transceivers != TRANSCEIVER_NONE)); i++); + + if (i >= TRANSCEIVER_MAX_REGISTERED) { + return 0; + } + else if (reg[i].pid == pid) { + reg[i].transceivers ^= t; + } + return 1; +} + /*------------------------------------------------------------------------------------*/ /* Internal functions */ /*------------------------------------------------------------------------------------*/