Davi Souza
/
pymite
python
Fork of pymite by
platform/mbed/NativeClassInterface.cpp@2:a2bea117e22e, 2013-03-12 (annotated)
- Committer:
- va009039
- Date:
- Tue Mar 12 11:40:41 2013 +0000
- Revision:
- 2:a2bea117e22e
- Child:
- 3:559c4bd38111
add NativeClassInterface, update mbed.py
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 2:a2bea117e22e | 1 | // NativeClassInterface.cpp 2013/3/12 |
va009039 | 2:a2bea117e22e | 2 | #include "mbed.h" |
va009039 | 2:a2bea117e22e | 3 | #define __DEBUG__ 1 |
va009039 | 2:a2bea117e22e | 4 | #include "pm.h" |
va009039 | 2:a2bea117e22e | 5 | #include "NativeClassInterface.h" |
va009039 | 2:a2bea117e22e | 6 | |
va009039 | 2:a2bea117e22e | 7 | #undef __FILE_ID__ |
va009039 | 2:a2bea117e22e | 8 | #define __FILE_ID__ 0x71 |
va009039 | 2:a2bea117e22e | 9 | |
va009039 | 2:a2bea117e22e | 10 | template<> |
va009039 | 2:a2bea117e22e | 11 | int NativeClassInterface::argv<int>(int n) |
va009039 | 2:a2bea117e22e | 12 | { |
va009039 | 2:a2bea117e22e | 13 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 14 | if (OBJ_GET_TYPE(pn) == OBJ_TYPE_STR) { |
va009039 | 2:a2bea117e22e | 15 | return ((pPmString_t)pn)->val[0]; |
va009039 | 2:a2bea117e22e | 16 | } |
va009039 | 2:a2bea117e22e | 17 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 18 | } |
va009039 | 2:a2bea117e22e | 19 | |
va009039 | 2:a2bea117e22e | 20 | template<> |
va009039 | 2:a2bea117e22e | 21 | bool NativeClassInterface::argv<bool>(int n) |
va009039 | 2:a2bea117e22e | 22 | { |
va009039 | 2:a2bea117e22e | 23 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 24 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 25 | } |
va009039 | 2:a2bea117e22e | 26 | |
va009039 | 2:a2bea117e22e | 27 | template<> |
va009039 | 2:a2bea117e22e | 28 | float NativeClassInterface::argv<float>(int n) |
va009039 | 2:a2bea117e22e | 29 | { |
va009039 | 2:a2bea117e22e | 30 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 31 | return ((pPmFloat_t)pn)->val; |
va009039 | 2:a2bea117e22e | 32 | } |
va009039 | 2:a2bea117e22e | 33 | |
va009039 | 2:a2bea117e22e | 34 | template<> |
va009039 | 2:a2bea117e22e | 35 | char NativeClassInterface::argv<char>(int n) |
va009039 | 2:a2bea117e22e | 36 | { |
va009039 | 2:a2bea117e22e | 37 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 38 | return ((pPmString_t)pn)->val[0]; |
va009039 | 2:a2bea117e22e | 39 | } |
va009039 | 2:a2bea117e22e | 40 | |
va009039 | 2:a2bea117e22e | 41 | template<> |
va009039 | 2:a2bea117e22e | 42 | char* NativeClassInterface::argv<char*>(int n) |
va009039 | 2:a2bea117e22e | 43 | { |
va009039 | 2:a2bea117e22e | 44 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 45 | return reinterpret_cast<char*>(((pPmString_t)pn)->val); |
va009039 | 2:a2bea117e22e | 46 | } |
va009039 | 2:a2bea117e22e | 47 | |
va009039 | 2:a2bea117e22e | 48 | template<> |
va009039 | 2:a2bea117e22e | 49 | const char* NativeClassInterface::argv<const char*>(int n) |
va009039 | 2:a2bea117e22e | 50 | { |
va009039 | 2:a2bea117e22e | 51 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 52 | return reinterpret_cast<const char*>(((pPmString_t)pn)->val); |
va009039 | 2:a2bea117e22e | 53 | } |
va009039 | 2:a2bea117e22e | 54 | |
va009039 | 2:a2bea117e22e | 55 | template<> |
va009039 | 2:a2bea117e22e | 56 | uint16_t NativeClassInterface::argv<uint16_t>(int n) |
va009039 | 2:a2bea117e22e | 57 | { |
va009039 | 2:a2bea117e22e | 58 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 59 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 60 | } |
va009039 | 2:a2bea117e22e | 61 | |
va009039 | 2:a2bea117e22e | 62 | template<> |
va009039 | 2:a2bea117e22e | 63 | PinName NativeClassInterface::argv<PinName>(int n) |
va009039 | 2:a2bea117e22e | 64 | { |
va009039 | 2:a2bea117e22e | 65 | /* PinName lookup table. Converts pin number to PinName. */ |
va009039 | 2:a2bea117e22e | 66 | const PinName pinNumToName[] = { |
va009039 | 2:a2bea117e22e | 67 | NC, LED1, LED2, LED3, LED4, p5, p6, p7, p8, p9, |
va009039 | 2:a2bea117e22e | 68 | p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, |
va009039 | 2:a2bea117e22e | 69 | p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, |
va009039 | 2:a2bea117e22e | 70 | p30 |
va009039 | 2:a2bea117e22e | 71 | }; |
va009039 | 2:a2bea117e22e | 72 | |
va009039 | 2:a2bea117e22e | 73 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 74 | return pinNumToName[((pPmInt_t)pn)->val]; |
va009039 | 2:a2bea117e22e | 75 | } |
va009039 | 2:a2bea117e22e | 76 | |
va009039 | 2:a2bea117e22e | 77 | |
va009039 | 2:a2bea117e22e | 78 | template<> |
va009039 | 2:a2bea117e22e | 79 | PmReturn_t NativeClassInterface::set_return_value<int>(PmType_t ret_type, int value) |
va009039 | 2:a2bea117e22e | 80 | { |
va009039 | 2:a2bea117e22e | 81 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 82 | PmReturn_t retval; |
va009039 | 2:a2bea117e22e | 83 | if (ret_type == OBJ_TYPE_STR) { |
va009039 | 2:a2bea117e22e | 84 | retval = string_newFromChar((uint8_t)value, &pn); |
va009039 | 2:a2bea117e22e | 85 | } else { |
va009039 | 2:a2bea117e22e | 86 | retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 87 | } |
va009039 | 2:a2bea117e22e | 88 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 89 | return retval; |
va009039 | 2:a2bea117e22e | 90 | } |
va009039 | 2:a2bea117e22e | 91 | |
va009039 | 2:a2bea117e22e | 92 | template<> |
va009039 | 2:a2bea117e22e | 93 | PmReturn_t NativeClassInterface::set_return_value<uint16_t>(PmType_t ret_type, uint16_t value) |
va009039 | 2:a2bea117e22e | 94 | { |
va009039 | 2:a2bea117e22e | 95 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 96 | PmReturn_t retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 97 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 98 | return retval; |
va009039 | 2:a2bea117e22e | 99 | } |
va009039 | 2:a2bea117e22e | 100 | |
va009039 | 2:a2bea117e22e | 101 | template<> |
va009039 | 2:a2bea117e22e | 102 | PmReturn_t NativeClassInterface::set_return_value<float>(PmType_t ret_type, float value) |
va009039 | 2:a2bea117e22e | 103 | { |
va009039 | 2:a2bea117e22e | 104 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 105 | PmReturn_t retval = float_new(value, &pn); |
va009039 | 2:a2bea117e22e | 106 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 107 | return retval; |
va009039 | 2:a2bea117e22e | 108 | } |
va009039 | 2:a2bea117e22e | 109 | |
va009039 | 2:a2bea117e22e | 110 | template<typename R> |
va009039 | 2:a2bea117e22e | 111 | PmReturn_t NativeClassInterface::set_return_value(PmType_t ret_type, R value) |
va009039 | 2:a2bea117e22e | 112 | { |
va009039 | 2:a2bea117e22e | 113 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 114 | PmReturn_t retval; |
va009039 | 2:a2bea117e22e | 115 | switch(ret_type) { |
va009039 | 2:a2bea117e22e | 116 | case OBJ_TYPE_INT: |
va009039 | 2:a2bea117e22e | 117 | retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 118 | break; |
va009039 | 2:a2bea117e22e | 119 | case OBJ_TYPE_FLT: |
va009039 | 2:a2bea117e22e | 120 | retval = float_new(value, &pn); |
va009039 | 2:a2bea117e22e | 121 | break; |
va009039 | 2:a2bea117e22e | 122 | } |
va009039 | 2:a2bea117e22e | 123 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 124 | return retval; |
va009039 | 2:a2bea117e22e | 125 | } |
va009039 | 2:a2bea117e22e | 126 | |
va009039 | 2:a2bea117e22e | 127 | PmReturn_t NativeClassInterface::check_argv_type(int arg_n, ...) |
va009039 | 2:a2bea117e22e | 128 | { |
va009039 | 2:a2bea117e22e | 129 | PmReturn_t retval = PM_RET_OK; |
va009039 | 2:a2bea117e22e | 130 | if (NATIVE_GET_NUM_ARGS() != (arg_n+1)) { |
va009039 | 2:a2bea117e22e | 131 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 2:a2bea117e22e | 132 | return retval; |
va009039 | 2:a2bea117e22e | 133 | } |
va009039 | 2:a2bea117e22e | 134 | va_list vl; |
va009039 | 2:a2bea117e22e | 135 | va_start(vl, arg_n); |
va009039 | 2:a2bea117e22e | 136 | for(int n = 1; n <= arg_n; n++) { |
va009039 | 2:a2bea117e22e | 137 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 138 | int ty = va_arg(vl, int); |
va009039 | 2:a2bea117e22e | 139 | if (OBJ_GET_TYPE(pn) != ty) { |
va009039 | 2:a2bea117e22e | 140 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 2:a2bea117e22e | 141 | return retval; |
va009039 | 2:a2bea117e22e | 142 | } |
va009039 | 2:a2bea117e22e | 143 | } |
va009039 | 2:a2bea117e22e | 144 | return retval; |
va009039 | 2:a2bea117e22e | 145 | } |