Milosch Meriac
/
cthunk_example
Test function for CThunk class
main.cpp@0:a6725b4373c6, 2014-08-13 (annotated)
- Committer:
- meriac
- Date:
- Wed Aug 13 07:44:05 2014 +0000
- Revision:
- 0:a6725b4373c6
- Child:
- 1:2e8f85f1ed3e
Created demo firmware to show CThunk usage
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
meriac | 0:a6725b4373c6 | 1 | #include <mbed.h> |
meriac | 0:a6725b4373c6 | 2 | #include <CThunk.h> |
meriac | 0:a6725b4373c6 | 3 | |
meriac | 0:a6725b4373c6 | 4 | class CTest |
meriac | 0:a6725b4373c6 | 5 | { |
meriac | 0:a6725b4373c6 | 6 | public: |
meriac | 0:a6725b4373c6 | 7 | CTest(void); |
meriac | 0:a6725b4373c6 | 8 | void callback1(void); |
meriac | 0:a6725b4373c6 | 9 | void callback2(void* context); |
meriac | 0:a6725b4373c6 | 10 | void callback3(void* context); |
meriac | 0:a6725b4373c6 | 11 | |
meriac | 0:a6725b4373c6 | 12 | uint32_t counter; |
meriac | 0:a6725b4373c6 | 13 | |
meriac | 0:a6725b4373c6 | 14 | CThunk<CTest> thunk; |
meriac | 0:a6725b4373c6 | 15 | |
meriac | 0:a6725b4373c6 | 16 | private: |
meriac | 0:a6725b4373c6 | 17 | DigitalOut m_led; |
meriac | 0:a6725b4373c6 | 18 | }; |
meriac | 0:a6725b4373c6 | 19 | |
meriac | 0:a6725b4373c6 | 20 | CTest::CTest(void) |
meriac | 0:a6725b4373c6 | 21 | :m_led(LED1) |
meriac | 0:a6725b4373c6 | 22 | { |
meriac | 0:a6725b4373c6 | 23 | counter = 0; |
meriac | 0:a6725b4373c6 | 24 | } |
meriac | 0:a6725b4373c6 | 25 | |
meriac | 0:a6725b4373c6 | 26 | void CTest::callback1(void) |
meriac | 0:a6725b4373c6 | 27 | { |
meriac | 0:a6725b4373c6 | 28 | /* increment member variable */ |
meriac | 0:a6725b4373c6 | 29 | counter++; |
meriac | 0:a6725b4373c6 | 30 | } |
meriac | 0:a6725b4373c6 | 31 | |
meriac | 0:a6725b4373c6 | 32 | void CTest::callback2(void* context) |
meriac | 0:a6725b4373c6 | 33 | { |
meriac | 0:a6725b4373c6 | 34 | printf("Called with context value 0x%08X\n", context); |
meriac | 0:a6725b4373c6 | 35 | |
meriac | 0:a6725b4373c6 | 36 | /* increment member variable */ |
meriac | 0:a6725b4373c6 | 37 | counter = (uint32_t)context; |
meriac | 0:a6725b4373c6 | 38 | } |
meriac | 0:a6725b4373c6 | 39 | |
meriac | 0:a6725b4373c6 | 40 | void CTest::callback3(void* context) |
meriac | 0:a6725b4373c6 | 41 | { |
meriac | 0:a6725b4373c6 | 42 | Ticker* sender = static_cast<Ticker*>(context); |
meriac | 0:a6725b4373c6 | 43 | |
meriac | 0:a6725b4373c6 | 44 | printf("Called by ticker object 0x%08X: \n", sender); |
meriac | 0:a6725b4373c6 | 45 | |
meriac | 0:a6725b4373c6 | 46 | m_led = !m_led; |
meriac | 0:a6725b4373c6 | 47 | } |
meriac | 0:a6725b4373c6 | 48 | |
meriac | 0:a6725b4373c6 | 49 | |
meriac | 0:a6725b4373c6 | 50 | int main(void) |
meriac | 0:a6725b4373c6 | 51 | { |
meriac | 0:a6725b4373c6 | 52 | Ticker tick; |
meriac | 0:a6725b4373c6 | 53 | CThunkEntry entry; |
meriac | 0:a6725b4373c6 | 54 | CTest test; |
meriac | 0:a6725b4373c6 | 55 | |
meriac | 0:a6725b4373c6 | 56 | /* get 32 bit entry point pointer from thunk */ |
meriac | 0:a6725b4373c6 | 57 | entry = test.thunk; |
meriac | 0:a6725b4373c6 | 58 | |
meriac | 0:a6725b4373c6 | 59 | /* TEST1: */ |
meriac | 0:a6725b4373c6 | 60 | |
meriac | 0:a6725b4373c6 | 61 | /* assign callback1 to thunk - no context needed */ |
meriac | 0:a6725b4373c6 | 62 | test.thunk = &CTest::callback1; |
meriac | 0:a6725b4373c6 | 63 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 64 | entry(); |
meriac | 0:a6725b4373c6 | 65 | |
meriac | 0:a6725b4373c6 | 66 | |
meriac | 0:a6725b4373c6 | 67 | /* TEST2: */ |
meriac | 0:a6725b4373c6 | 68 | |
meriac | 0:a6725b4373c6 | 69 | /* assign a context ... */ |
meriac | 0:a6725b4373c6 | 70 | test.thunk = 0xDEADBEEF; |
meriac | 0:a6725b4373c6 | 71 | /* and switch callback to callback2 */ |
meriac | 0:a6725b4373c6 | 72 | test.thunk = &CTest::callback2; |
meriac | 0:a6725b4373c6 | 73 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 74 | entry(); |
meriac | 0:a6725b4373c6 | 75 | |
meriac | 0:a6725b4373c6 | 76 | |
meriac | 0:a6725b4373c6 | 77 | /* TEST3: */ |
meriac | 0:a6725b4373c6 | 78 | |
meriac | 0:a6725b4373c6 | 79 | /* try ticker */ |
meriac | 0:a6725b4373c6 | 80 | tick.attach(test.thunk, 1.0); |
meriac | 0:a6725b4373c6 | 81 | /* assign a context ... */ |
meriac | 0:a6725b4373c6 | 82 | test.thunk = (void*)&tick; |
meriac | 0:a6725b4373c6 | 83 | /* change the callback function */ |
meriac | 0:a6725b4373c6 | 84 | test.thunk = &CTest::callback3; |
meriac | 0:a6725b4373c6 | 85 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 86 | entry(); |
meriac | 0:a6725b4373c6 | 87 | } |