Milosch Meriac
/
cthunk_example
Test function for CThunk class
main.cpp@8:ac4f1c813c8d, 2014-08-20 (annotated)
- Committer:
- meriac
- Date:
- Wed Aug 20 14:15:10 2014 +0000
- Revision:
- 8:ac4f1c813c8d
- Parent:
- 6:45ca54a72865
- Child:
- 10:47bfaa986895
Moved global peripheral descriptions into CTest class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
meriac | 0:a6725b4373c6 | 1 | #include <mbed.h> |
meriac | 4:97c886c2d89b | 2 | #include <CThunk.h> |
meriac | 4:97c886c2d89b | 3 | |
meriac | 0:a6725b4373c6 | 4 | class CTest |
meriac | 0:a6725b4373c6 | 5 | { |
meriac | 0:a6725b4373c6 | 6 | public: |
meriac | 0:a6725b4373c6 | 7 | CTest(void); |
meriac | 8:ac4f1c813c8d | 8 | void test(void); |
meriac | 8:ac4f1c813c8d | 9 | void hexdump(const void* data, int length); |
meriac | 8:ac4f1c813c8d | 10 | |
meriac | 8:ac4f1c813c8d | 11 | Serial pc; |
meriac | 8:ac4f1c813c8d | 12 | CThunk<CTest> thunk; |
meriac | 8:ac4f1c813c8d | 13 | |
meriac | 0:a6725b4373c6 | 14 | void callback2(void* context); |
meriac | 8:ac4f1c813c8d | 15 | |
meriac | 8:ac4f1c813c8d | 16 | private: |
meriac | 8:ac4f1c813c8d | 17 | DigitalOut m_led1, m_led2; |
meriac | 0:a6725b4373c6 | 18 | |
meriac | 8:ac4f1c813c8d | 19 | void callback1(void); |
meriac | 0:a6725b4373c6 | 20 | |
meriac | 8:ac4f1c813c8d | 21 | uint32_t m_counter; |
meriac | 0:a6725b4373c6 | 22 | }; |
meriac | 0:a6725b4373c6 | 23 | |
meriac | 0:a6725b4373c6 | 24 | CTest::CTest(void) |
meriac | 8:ac4f1c813c8d | 25 | :pc(USBTX, USBRX), |
meriac | 8:ac4f1c813c8d | 26 | thunk(this, &CTest::callback1), |
meriac | 8:ac4f1c813c8d | 27 | m_led1(LED1), |
meriac | 8:ac4f1c813c8d | 28 | m_led2(LED2) |
meriac | 0:a6725b4373c6 | 29 | { |
meriac | 8:ac4f1c813c8d | 30 | m_counter = 0; |
meriac | 8:ac4f1c813c8d | 31 | |
meriac | 8:ac4f1c813c8d | 32 | pc.baud(115200); |
meriac | 0:a6725b4373c6 | 33 | } |
meriac | 0:a6725b4373c6 | 34 | |
meriac | 0:a6725b4373c6 | 35 | void CTest::callback1(void) |
meriac | 0:a6725b4373c6 | 36 | { |
meriac | 8:ac4f1c813c8d | 37 | pc.printf("callback1: called (this=0x%0X)\n", this); |
meriac | 8:ac4f1c813c8d | 38 | |
meriac | 8:ac4f1c813c8d | 39 | /* turn on LED1 */ |
meriac | 8:ac4f1c813c8d | 40 | m_led1 = 1; |
meriac | 1:2e8f85f1ed3e | 41 | |
meriac | 0:a6725b4373c6 | 42 | /* increment member variable */ |
meriac | 8:ac4f1c813c8d | 43 | pc.printf("callback1: m_counter before: %i\n", m_counter); |
meriac | 8:ac4f1c813c8d | 44 | m_counter++; |
meriac | 8:ac4f1c813c8d | 45 | pc.printf("callback1: m_counter after : %i\n", m_counter); |
meriac | 0:a6725b4373c6 | 46 | } |
meriac | 0:a6725b4373c6 | 47 | |
meriac | 0:a6725b4373c6 | 48 | void CTest::callback2(void* context) |
meriac | 0:a6725b4373c6 | 49 | { |
meriac | 8:ac4f1c813c8d | 50 | pc.printf("callback2: called with context value 0x%08X\n", context); |
meriac | 8:ac4f1c813c8d | 51 | |
meriac | 8:ac4f1c813c8d | 52 | /* turn on LED2 */ |
meriac | 8:ac4f1c813c8d | 53 | m_led2 = 1; |
meriac | 0:a6725b4373c6 | 54 | |
meriac | 0:a6725b4373c6 | 55 | /* increment member variable */ |
meriac | 8:ac4f1c813c8d | 56 | pc.printf("callback2: m_counter before: %i\n", m_counter); |
meriac | 8:ac4f1c813c8d | 57 | m_counter+=2; |
meriac | 8:ac4f1c813c8d | 58 | pc.printf("callback2: m_counter after : %i\n", m_counter); |
meriac | 0:a6725b4373c6 | 59 | } |
meriac | 0:a6725b4373c6 | 60 | |
meriac | 8:ac4f1c813c8d | 61 | void CTest::hexdump(const void* data, int length) |
meriac | 1:2e8f85f1ed3e | 62 | { |
meriac | 1:2e8f85f1ed3e | 63 | int i; |
meriac | 1:2e8f85f1ed3e | 64 | |
meriac | 4:97c886c2d89b | 65 | pc.printf("Dump %u bytes from 0x%08X\n", length, data); |
meriac | 1:2e8f85f1ed3e | 66 | |
meriac | 1:2e8f85f1ed3e | 67 | for(i=0; i<length; i++) |
meriac | 1:2e8f85f1ed3e | 68 | { |
meriac | 1:2e8f85f1ed3e | 69 | if((i%16) == 0) |
meriac | 1:2e8f85f1ed3e | 70 | pc.printf("\n"); |
meriac | 1:2e8f85f1ed3e | 71 | else |
meriac | 1:2e8f85f1ed3e | 72 | if((i%8) == 0) |
meriac | 1:2e8f85f1ed3e | 73 | pc.printf(" - "); |
meriac | 1:2e8f85f1ed3e | 74 | pc.printf("0x%02X ", ((uint8_t*)data)[i]); |
meriac | 1:2e8f85f1ed3e | 75 | } |
meriac | 1:2e8f85f1ed3e | 76 | pc.printf("\n"); |
meriac | 1:2e8f85f1ed3e | 77 | } |
meriac | 0:a6725b4373c6 | 78 | |
meriac | 8:ac4f1c813c8d | 79 | int main(void) |
meriac | 0:a6725b4373c6 | 80 | { |
meriac | 8:ac4f1c813c8d | 81 | /* allocate thunking test class */ |
meriac | 0:a6725b4373c6 | 82 | CTest test; |
meriac | 8:ac4f1c813c8d | 83 | /* allocate 32 bit pointer to thunk-entry */ |
meriac | 8:ac4f1c813c8d | 84 | CThunkEntry entry; |
meriac | 0:a6725b4373c6 | 85 | |
meriac | 8:ac4f1c813c8d | 86 | /* to make a point: get 32 bit entry point pointer from thunk */ |
meriac | 8:ac4f1c813c8d | 87 | entry = test.thunk; |
meriac | 3:c929fd5a4d3d | 88 | |
meriac | 8:ac4f1c813c8d | 89 | /* TEST1: */ |
meriac | 8:ac4f1c813c8d | 90 | /* callback function has been set in the CTest constructor */ |
meriac | 8:ac4f1c813c8d | 91 | test.hexdump((const void*)entry, 20); |
meriac | 8:ac4f1c813c8d | 92 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 93 | entry(); |
meriac | 0:a6725b4373c6 | 94 | |
meriac | 0:a6725b4373c6 | 95 | /* TEST2: */ |
meriac | 0:a6725b4373c6 | 96 | /* assign a context ... */ |
meriac | 4:97c886c2d89b | 97 | test.thunk.context(0xDEADBEEF); |
meriac | 0:a6725b4373c6 | 98 | /* and switch callback to callback2 */ |
meriac | 4:97c886c2d89b | 99 | test.thunk.callback(&CTest::callback2); |
meriac | 0:a6725b4373c6 | 100 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 101 | entry(); |
meriac | 3:c929fd5a4d3d | 102 | |
meriac | 3:c929fd5a4d3d | 103 | /* turn both LED's on */ |
meriac | 3:c929fd5a4d3d | 104 | while(1) |
meriac | 3:c929fd5a4d3d | 105 | __WFI(); |
meriac | 3:c929fd5a4d3d | 106 | } |