Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic
Fork of mbed-src by
Diff: common/Serial.cpp
- Revision:
- 15:4892fe388435
- Parent:
- 13:0645d8841f51
- Child:
- 36:ab3ee77451e7
--- a/common/Serial.cpp Mon Aug 05 14:54:27 2013 +0000 +++ b/common/Serial.cpp Wed Aug 07 16:43:59 2013 +0300 @@ -44,15 +44,32 @@ return serial_writable(&_serial); } -void Serial::attach(void (*fptr)(void), IrqType type) { +pFunctionPointer_t Serial::attach(void (*fptr)(void), IrqType type) { + pFunctionPointer_t pf = NULL; + _irq[type].clear(); if (fptr) { - _irq[type].attach(fptr); + pf = _irq[type].add(fptr); serial_irq_set(&_serial, (SerialIrq)type, 1); } else { serial_irq_set(&_serial, (SerialIrq)type, 0); } + return pf; } +pFunctionPointer_t Serial::add_handler_helper(void (*fptr)(void), IrqType type, bool front) { + if (NULL == fptr) + return NULL; + pFunctionPointer_t pf = front ? _irq[type].add_front(fptr) : _irq[type].add(fptr); + serial_irq_set(&_serial, (SerialIrq)type, 1); + return pf; +} + +bool Serial::remove_handler(pFunctionPointer_t pf, IrqType type) { + bool res = _irq[type].remove(pf); + if (res && _irq[type].size() == 0) + serial_irq_set(&_serial, (SerialIrq)type, 0); + return res; +} void Serial::_irq_handler(uint32_t id, SerialIrq irq_type) { Serial *handler = (Serial*)id;