Test function for CThunk class

Dependencies:   CThunk mbed

Committer:
meriac
Date:
Wed Aug 20 12:19:41 2014 +0000
Revision:
6:45ca54a72865
Parent:
5:64411d876ad4
Child:
8:ac4f1c813c8d
moved callback pointer initialization for first test to constructor of parent class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 0:a6725b4373c6 1 #include <mbed.h>
meriac 0:a6725b4373c6 2
meriac 3:c929fd5a4d3d 3 DigitalOut g_led1(LED1);
meriac 3:c929fd5a4d3d 4 DigitalOut g_led2(LED2);
meriac 3:c929fd5a4d3d 5 DigitalOut g_led3(LED3);
meriac 3:c929fd5a4d3d 6 DigitalOut g_led4(LED4);
meriac 1:2e8f85f1ed3e 7 Serial pc(USBTX, USBRX);
meriac 1:2e8f85f1ed3e 8
meriac 4:97c886c2d89b 9 #include <CThunk.h>
meriac 4:97c886c2d89b 10
meriac 0:a6725b4373c6 11 class CTest
meriac 0:a6725b4373c6 12 {
meriac 0:a6725b4373c6 13 public:
meriac 0:a6725b4373c6 14 CTest(void);
meriac 0:a6725b4373c6 15 void callback1(void);
meriac 0:a6725b4373c6 16 void callback2(void* context);
meriac 0:a6725b4373c6 17 void callback3(void* context);
meriac 1:2e8f85f1ed3e 18 static void callback4(uint32_t r0, uint32_t r1);
meriac 0:a6725b4373c6 19
meriac 0:a6725b4373c6 20 uint32_t counter;
meriac 0:a6725b4373c6 21
meriac 0:a6725b4373c6 22 CThunk<CTest> thunk;
meriac 0:a6725b4373c6 23 };
meriac 0:a6725b4373c6 24
meriac 0:a6725b4373c6 25 CTest::CTest(void)
meriac 6:45ca54a72865 26 :thunk(this, &CTest::callback1)
meriac 0:a6725b4373c6 27 {
meriac 0:a6725b4373c6 28 counter = 0;
meriac 0:a6725b4373c6 29 }
meriac 0:a6725b4373c6 30
meriac 0:a6725b4373c6 31 void CTest::callback1(void)
meriac 0:a6725b4373c6 32 {
meriac 5:64411d876ad4 33 pc.printf("callback1 called (this=0x%0X)\n", this);
meriac 1:2e8f85f1ed3e 34
meriac 0:a6725b4373c6 35 /* increment member variable */
meriac 5:64411d876ad4 36 counter++;
meriac 0:a6725b4373c6 37 }
meriac 0:a6725b4373c6 38
meriac 0:a6725b4373c6 39 void CTest::callback2(void* context)
meriac 0:a6725b4373c6 40 {
meriac 1:2e8f85f1ed3e 41 pc.printf("Called with context value 0x%08X\n", context);
meriac 0:a6725b4373c6 42
meriac 0:a6725b4373c6 43 /* increment member variable */
meriac 5:64411d876ad4 44 counter+=2;
meriac 0:a6725b4373c6 45 }
meriac 0:a6725b4373c6 46
meriac 1:2e8f85f1ed3e 47 void hexdump(const void* data, int length)
meriac 1:2e8f85f1ed3e 48 {
meriac 1:2e8f85f1ed3e 49 int i;
meriac 1:2e8f85f1ed3e 50
meriac 4:97c886c2d89b 51 pc.printf("Dump %u bytes from 0x%08X\n", length, data);
meriac 1:2e8f85f1ed3e 52
meriac 1:2e8f85f1ed3e 53 for(i=0; i<length; i++)
meriac 1:2e8f85f1ed3e 54 {
meriac 1:2e8f85f1ed3e 55 if((i%16) == 0)
meriac 1:2e8f85f1ed3e 56 pc.printf("\n");
meriac 1:2e8f85f1ed3e 57 else
meriac 1:2e8f85f1ed3e 58 if((i%8) == 0)
meriac 1:2e8f85f1ed3e 59 pc.printf(" - ");
meriac 1:2e8f85f1ed3e 60 pc.printf("0x%02X ", ((uint8_t*)data)[i]);
meriac 1:2e8f85f1ed3e 61 }
meriac 1:2e8f85f1ed3e 62 pc.printf("\n");
meriac 1:2e8f85f1ed3e 63 }
meriac 0:a6725b4373c6 64
meriac 3:c929fd5a4d3d 65 static void test(void)
meriac 0:a6725b4373c6 66 {
meriac 0:a6725b4373c6 67 CThunkEntry entry;
meriac 0:a6725b4373c6 68 CTest test;
meriac 0:a6725b4373c6 69
meriac 0:a6725b4373c6 70 /* get 32 bit entry point pointer from thunk */
meriac 0:a6725b4373c6 71 entry = test.thunk;
meriac 0:a6725b4373c6 72 /* TEST1: */
meriac 0:a6725b4373c6 73
meriac 6:45ca54a72865 74 /* callback function has been set in the CTest constructor */
meriac 3:c929fd5a4d3d 75 hexdump((const void*)entry, 16);
meriac 0:a6725b4373c6 76 /* call entry point */
meriac 3:c929fd5a4d3d 77
meriac 5:64411d876ad4 78 pc.printf("before entry 1 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 79 g_led2 = 1;
meriac 0:a6725b4373c6 80 entry();
meriac 5:64411d876ad4 81 pc.printf("after entry 1 (counter=%i)\n", test.counter);
meriac 0:a6725b4373c6 82
meriac 0:a6725b4373c6 83 /* TEST2: */
meriac 0:a6725b4373c6 84
meriac 0:a6725b4373c6 85 /* assign a context ... */
meriac 4:97c886c2d89b 86 test.thunk.context(0xDEADBEEF);
meriac 0:a6725b4373c6 87 /* and switch callback to callback2 */
meriac 4:97c886c2d89b 88 test.thunk.callback(&CTest::callback2);
meriac 4:97c886c2d89b 89
meriac 0:a6725b4373c6 90 /* call entry point */
meriac 5:64411d876ad4 91 pc.printf("before entry 2 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 92 g_led3 = 1;
meriac 0:a6725b4373c6 93 entry();
meriac 5:64411d876ad4 94 pc.printf("after entry 2 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 95 }
meriac 0:a6725b4373c6 96
meriac 3:c929fd5a4d3d 97 int main(void)
meriac 3:c929fd5a4d3d 98 {
meriac 4:97c886c2d89b 99 pc.baud(115200);
meriac 0:a6725b4373c6 100
meriac 4:97c886c2d89b 101 printf("Test 1\n");
meriac 3:c929fd5a4d3d 102 /* run tests */
meriac 4:97c886c2d89b 103 g_led1 = 1;
meriac 3:c929fd5a4d3d 104 test();
meriac 3:c929fd5a4d3d 105
meriac 3:c929fd5a4d3d 106 /* turn both LED's on */
meriac 3:c929fd5a4d3d 107 g_led4 = 1;
meriac 3:c929fd5a4d3d 108 while(1)
meriac 3:c929fd5a4d3d 109 __WFI();
meriac 3:c929fd5a4d3d 110 }