Test function for CThunk class

Dependencies:   CThunk mbed

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?

UserRevisionLine numberNew 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 }