Preliminary main mbed library for nexpaq development
Diff: libraries/tests/mbed/interrupt_chaining/main.cpp
- Revision:
- 0:6c56fb4bc5f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/tests/mbed/interrupt_chaining/main.cpp Fri Nov 04 20:27:58 2016 +0000 @@ -0,0 +1,117 @@ +#include "mbed.h" +#include "InterruptManager.h" +#include "cmsis.h" +#include "test_env.h" + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC4088) +#define TIMER_IRQ TIMER3_IRQn +#elif defined(TARGET_LPC11U24) || defined(TARGET_LPC1114) +#define TIMER_IRQ TIMER_32_1_IRQn +#elif defined(TARGET_KL25Z) +#define TIMER_IRQ LPTimer_IRQn +#elif defined(TARGET_LPC2368) || defined(TARGET_LPC2460) +#define TIMER_IRQ TIMER3_IRQn +#elif defined(TARGET_SAMR21G18A) || defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) +#define TIMER_IRQ TC4_IRQn +#elif defined(TARGET_SAML21J18A) +#define TIMER_IRQ TC0_IRQn +#else +#error [NOT_SUPPORTED] This test can't run on this target. +#endif + +Serial pc(USBTX, USBRX); + +Ticker flipper_1; +DigitalOut led1(LED1); +int led1_state = 0; +void flip_1() { + if (led1_state) { + led1 = 0; led1_state = 0; + } else { + led1 = 1; led1_state = 1; + } +} + +class Sender { +public: + Sender(Serial&s, char c): _s(s), _c(c) {} + void send() { _s.putc(_c); } +private: + Serial& _s; + char _c; +}; +Ticker flipper_2; +Sender s1(pc, '1'); +Sender s2(pc, '2'); + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC2368) || defined(TARGET_LPC1114) || defined(TARGET_LPC2460) +# define LED_NAME LED2 +#elif defined(TARGET_KL05Z) +# define LED_NAME LED2 +#elif defined(TARGET_SAMR21G18A) || defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A) /*to avoid build errors*/ +# define LED_NAME LED2 /*Only 1 LED available*/ +#else +# define LED_NAME PTE31 +#endif + +DigitalOut led2(LED_NAME); +int led2_state = 0; +void flip_2() { + if (led2_state) { + led2 = 0; led2_state = 0; + } else { + led2 = 1; led2_state = 1; + } +} + +void testme(void) { + pc.putc('!'); +} + +class Counter { +public: + void inc(void) { + count ++; + } + int get_count(void) const { + return count; + } +private: + static int count; +}; + +int Counter::count = 0; + +int main() { + led1 = 0; + led2 = 0; + uint32_t initial_handler, final_handler; + Counter c; + + // Test chaining inside Serial class + flipper_1.attach(&flip_1, 1.0); // the address of the function to be attached (flip) and the interval (1 second) + flipper_2.attach(&flip_2, 2.0); // the address of the function to be attached (flip) and the interval (2 seconds) + + // Test global chaining (InterruptManager) + printf("Handler initially: %08X\n", initial_handler = NVIC_GetVector(TIMER_IRQ)); + InterruptManager *pManager = InterruptManager::get(); + pFunctionPointer_t ptm = pManager->add_handler(testme, TIMER_IRQ); + pFunctionPointer_t pinc = pManager->add_handler_front(&c, &Counter::inc, TIMER_IRQ); + printf("Handler after calling InterruptManager: %08X\n", NVIC_GetVector(TIMER_IRQ)); + + wait(4.0); + + if (!pManager->remove_handler(ptm, TIMER_IRQ) || !pManager->remove_handler(pinc, TIMER_IRQ)) { + printf ("remove handler failed.\n"); + notify_completion(false); + } + printf("Interrupt handler calls: %d\n", c.get_count()); + printf("Handler after removing previously added functions: %08X\n", final_handler = NVIC_GetVector(TIMER_IRQ)); + + if (initial_handler != final_handler) { + printf( "InteruptManager test failed.\n"); + notify_completion(false); + } + + while(1); +}