Davi Souza
/
pymite
python
Fork of pymite by
platform/mbed/NativeClassInterface.cpp@12:d27ad05214e3, 2014-08-28 (annotated)
- Committer:
- kausdev
- Date:
- Thu Aug 28 19:35:16 2014 +0000
- Revision:
- 12:d27ad05214e3
- Parent:
- 4:23becb24acb8
pymte
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 3:559c4bd38111 | 1 | // NativeClassInterface.cpp 2013/3/13 |
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 | 3:559c4bd38111 | 6 | #include "PinNameTable.h" |
va009039 | 2:a2bea117e22e | 7 | |
va009039 | 2:a2bea117e22e | 8 | #undef __FILE_ID__ |
va009039 | 2:a2bea117e22e | 9 | #define __FILE_ID__ 0x71 |
va009039 | 2:a2bea117e22e | 10 | |
va009039 | 2:a2bea117e22e | 11 | template<> |
va009039 | 2:a2bea117e22e | 12 | int NativeClassInterface::argv<int>(int n) |
va009039 | 2:a2bea117e22e | 13 | { |
va009039 | 2:a2bea117e22e | 14 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 15 | if (OBJ_GET_TYPE(pn) == OBJ_TYPE_STR) { |
va009039 | 2:a2bea117e22e | 16 | return ((pPmString_t)pn)->val[0]; |
va009039 | 2:a2bea117e22e | 17 | } |
va009039 | 2:a2bea117e22e | 18 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 19 | } |
va009039 | 2:a2bea117e22e | 20 | |
va009039 | 2:a2bea117e22e | 21 | template<> |
va009039 | 2:a2bea117e22e | 22 | bool NativeClassInterface::argv<bool>(int n) |
va009039 | 2:a2bea117e22e | 23 | { |
va009039 | 2:a2bea117e22e | 24 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 25 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 26 | } |
va009039 | 2:a2bea117e22e | 27 | |
va009039 | 2:a2bea117e22e | 28 | template<> |
va009039 | 2:a2bea117e22e | 29 | float NativeClassInterface::argv<float>(int n) |
va009039 | 2:a2bea117e22e | 30 | { |
va009039 | 2:a2bea117e22e | 31 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 32 | return ((pPmFloat_t)pn)->val; |
va009039 | 2:a2bea117e22e | 33 | } |
va009039 | 2:a2bea117e22e | 34 | |
va009039 | 2:a2bea117e22e | 35 | template<> |
va009039 | 2:a2bea117e22e | 36 | char NativeClassInterface::argv<char>(int n) |
va009039 | 2:a2bea117e22e | 37 | { |
va009039 | 2:a2bea117e22e | 38 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 39 | return ((pPmString_t)pn)->val[0]; |
va009039 | 2:a2bea117e22e | 40 | } |
va009039 | 2:a2bea117e22e | 41 | |
va009039 | 2:a2bea117e22e | 42 | template<> |
va009039 | 2:a2bea117e22e | 43 | char* NativeClassInterface::argv<char*>(int n) |
va009039 | 2:a2bea117e22e | 44 | { |
va009039 | 2:a2bea117e22e | 45 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 46 | return reinterpret_cast<char*>(((pPmString_t)pn)->val); |
va009039 | 2:a2bea117e22e | 47 | } |
va009039 | 2:a2bea117e22e | 48 | |
va009039 | 2:a2bea117e22e | 49 | template<> |
va009039 | 2:a2bea117e22e | 50 | const char* NativeClassInterface::argv<const char*>(int n) |
va009039 | 2:a2bea117e22e | 51 | { |
va009039 | 2:a2bea117e22e | 52 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 53 | return reinterpret_cast<const char*>(((pPmString_t)pn)->val); |
va009039 | 2:a2bea117e22e | 54 | } |
va009039 | 2:a2bea117e22e | 55 | |
va009039 | 2:a2bea117e22e | 56 | template<> |
va009039 | 2:a2bea117e22e | 57 | uint16_t NativeClassInterface::argv<uint16_t>(int n) |
va009039 | 2:a2bea117e22e | 58 | { |
va009039 | 2:a2bea117e22e | 59 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 60 | return ((pPmInt_t)pn)->val; |
va009039 | 2:a2bea117e22e | 61 | } |
va009039 | 2:a2bea117e22e | 62 | |
va009039 | 2:a2bea117e22e | 63 | template<> |
va009039 | 2:a2bea117e22e | 64 | PinName NativeClassInterface::argv<PinName>(int n) |
va009039 | 2:a2bea117e22e | 65 | { |
va009039 | 2:a2bea117e22e | 66 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 3:559c4bd38111 | 67 | if (OBJ_GET_TYPE(pn) == OBJ_TYPE_INT) { |
va009039 | 3:559c4bd38111 | 68 | return (PinName)(((pPmInt_t)pn)->val); |
va009039 | 3:559c4bd38111 | 69 | } |
va009039 | 3:559c4bd38111 | 70 | if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR) { |
va009039 | 3:559c4bd38111 | 71 | return NC; |
va009039 | 3:559c4bd38111 | 72 | } |
va009039 | 3:559c4bd38111 | 73 | int imin = 0; |
va009039 | 3:559c4bd38111 | 74 | int imax = sizeof(pinname_table) / sizeof(pinNameStr) - 1; |
va009039 | 3:559c4bd38111 | 75 | char *key = reinterpret_cast<char*>(((pPmString_t)pn)->val); |
va009039 | 3:559c4bd38111 | 76 | while(imax >= imin) { |
va009039 | 3:559c4bd38111 | 77 | int i = (imin + imax) / 2; |
va009039 | 3:559c4bd38111 | 78 | int c = strcmp(key, pinname_table[i].name); |
va009039 | 3:559c4bd38111 | 79 | if (c == 0) { |
va009039 | 3:559c4bd38111 | 80 | return pinname_table[i].pin; |
va009039 | 3:559c4bd38111 | 81 | } else if (c > 0) { |
va009039 | 3:559c4bd38111 | 82 | imin = i + 1; |
va009039 | 3:559c4bd38111 | 83 | } else { |
va009039 | 3:559c4bd38111 | 84 | imax = i - 1; |
va009039 | 3:559c4bd38111 | 85 | } |
va009039 | 3:559c4bd38111 | 86 | } |
va009039 | 3:559c4bd38111 | 87 | return NC; |
va009039 | 2:a2bea117e22e | 88 | } |
va009039 | 2:a2bea117e22e | 89 | |
va009039 | 2:a2bea117e22e | 90 | template<> |
va009039 | 2:a2bea117e22e | 91 | PmReturn_t NativeClassInterface::set_return_value<int>(PmType_t ret_type, int value) |
va009039 | 2:a2bea117e22e | 92 | { |
va009039 | 2:a2bea117e22e | 93 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 94 | PmReturn_t retval; |
va009039 | 2:a2bea117e22e | 95 | if (ret_type == OBJ_TYPE_STR) { |
va009039 | 2:a2bea117e22e | 96 | retval = string_newFromChar((uint8_t)value, &pn); |
va009039 | 2:a2bea117e22e | 97 | } else { |
va009039 | 2:a2bea117e22e | 98 | retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 99 | } |
va009039 | 2:a2bea117e22e | 100 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 101 | return retval; |
va009039 | 2:a2bea117e22e | 102 | } |
va009039 | 2:a2bea117e22e | 103 | |
va009039 | 2:a2bea117e22e | 104 | template<> |
va009039 | 4:23becb24acb8 | 105 | PmReturn_t NativeClassInterface::set_return_value<uint8_t>(PmType_t ret_type, uint8_t value) |
va009039 | 4:23becb24acb8 | 106 | { |
va009039 | 4:23becb24acb8 | 107 | pPmObj_t pn; |
va009039 | 4:23becb24acb8 | 108 | PmReturn_t retval = int_new(value, &pn); |
va009039 | 4:23becb24acb8 | 109 | NATIVE_SET_TOS(pn); |
va009039 | 4:23becb24acb8 | 110 | return retval; |
va009039 | 4:23becb24acb8 | 111 | } |
va009039 | 4:23becb24acb8 | 112 | |
va009039 | 4:23becb24acb8 | 113 | template<> |
va009039 | 2:a2bea117e22e | 114 | PmReturn_t NativeClassInterface::set_return_value<uint16_t>(PmType_t ret_type, uint16_t value) |
va009039 | 2:a2bea117e22e | 115 | { |
va009039 | 2:a2bea117e22e | 116 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 117 | PmReturn_t retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 118 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 119 | return retval; |
va009039 | 2:a2bea117e22e | 120 | } |
va009039 | 2:a2bea117e22e | 121 | |
va009039 | 2:a2bea117e22e | 122 | template<> |
va009039 | 2:a2bea117e22e | 123 | PmReturn_t NativeClassInterface::set_return_value<float>(PmType_t ret_type, float value) |
va009039 | 2:a2bea117e22e | 124 | { |
va009039 | 2:a2bea117e22e | 125 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 126 | PmReturn_t retval = float_new(value, &pn); |
va009039 | 2:a2bea117e22e | 127 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 128 | return retval; |
va009039 | 2:a2bea117e22e | 129 | } |
va009039 | 2:a2bea117e22e | 130 | |
va009039 | 2:a2bea117e22e | 131 | template<typename R> |
va009039 | 2:a2bea117e22e | 132 | PmReturn_t NativeClassInterface::set_return_value(PmType_t ret_type, R value) |
va009039 | 2:a2bea117e22e | 133 | { |
va009039 | 2:a2bea117e22e | 134 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 135 | PmReturn_t retval; |
va009039 | 2:a2bea117e22e | 136 | switch(ret_type) { |
va009039 | 2:a2bea117e22e | 137 | case OBJ_TYPE_INT: |
va009039 | 2:a2bea117e22e | 138 | retval = int_new(value, &pn); |
va009039 | 2:a2bea117e22e | 139 | break; |
va009039 | 2:a2bea117e22e | 140 | case OBJ_TYPE_FLT: |
va009039 | 2:a2bea117e22e | 141 | retval = float_new(value, &pn); |
va009039 | 2:a2bea117e22e | 142 | break; |
va009039 | 2:a2bea117e22e | 143 | } |
va009039 | 2:a2bea117e22e | 144 | NATIVE_SET_TOS(pn); |
va009039 | 2:a2bea117e22e | 145 | return retval; |
va009039 | 2:a2bea117e22e | 146 | } |
va009039 | 2:a2bea117e22e | 147 | |
va009039 | 2:a2bea117e22e | 148 | PmReturn_t NativeClassInterface::check_argv_type(int arg_n, ...) |
va009039 | 2:a2bea117e22e | 149 | { |
va009039 | 2:a2bea117e22e | 150 | PmReturn_t retval = PM_RET_OK; |
va009039 | 2:a2bea117e22e | 151 | if (NATIVE_GET_NUM_ARGS() != (arg_n+1)) { |
va009039 | 2:a2bea117e22e | 152 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 2:a2bea117e22e | 153 | return retval; |
va009039 | 2:a2bea117e22e | 154 | } |
va009039 | 2:a2bea117e22e | 155 | va_list vl; |
va009039 | 2:a2bea117e22e | 156 | va_start(vl, arg_n); |
va009039 | 2:a2bea117e22e | 157 | for(int n = 1; n <= arg_n; n++) { |
va009039 | 2:a2bea117e22e | 158 | pPmObj_t pn = NATIVE_GET_LOCAL(n); |
va009039 | 2:a2bea117e22e | 159 | int ty = va_arg(vl, int); |
va009039 | 2:a2bea117e22e | 160 | if (OBJ_GET_TYPE(pn) != ty) { |
va009039 | 2:a2bea117e22e | 161 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 2:a2bea117e22e | 162 | return retval; |
va009039 | 2:a2bea117e22e | 163 | } |
va009039 | 2:a2bea117e22e | 164 | } |
va009039 | 2:a2bea117e22e | 165 | return retval; |
va009039 | 2:a2bea117e22e | 166 | } |