Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
NativeClassInterface.cpp
00001 // NativeClassInterface.cpp 2013/3/13 00002 #include "mbed.h" 00003 #define __DEBUG__ 1 00004 #include "pm.h" 00005 #include "NativeClassInterface.h" 00006 #include "PinNameTable.h" 00007 00008 #undef __FILE_ID__ 00009 #define __FILE_ID__ 0x71 00010 00011 template<> 00012 int NativeClassInterface::argv<int>(int n) 00013 { 00014 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00015 if (OBJ_GET_TYPE(pn) == OBJ_TYPE_STR) { 00016 return ((pPmString_t)pn)->val[0]; 00017 } 00018 return ((pPmInt_t)pn)->val; 00019 } 00020 00021 template<> 00022 bool NativeClassInterface::argv<bool>(int n) 00023 { 00024 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00025 return ((pPmInt_t)pn)->val; 00026 } 00027 00028 template<> 00029 float NativeClassInterface::argv<float>(int n) 00030 { 00031 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00032 return ((pPmFloat_t)pn)->val; 00033 } 00034 00035 template<> 00036 char NativeClassInterface::argv<char>(int n) 00037 { 00038 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00039 return ((pPmString_t)pn)->val[0]; 00040 } 00041 00042 template<> 00043 char* NativeClassInterface::argv<char*>(int n) 00044 { 00045 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00046 return reinterpret_cast<char*>(((pPmString_t)pn)->val); 00047 } 00048 00049 template<> 00050 const char* NativeClassInterface::argv<const char*>(int n) 00051 { 00052 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00053 return reinterpret_cast<const char*>(((pPmString_t)pn)->val); 00054 } 00055 00056 template<> 00057 uint16_t NativeClassInterface::argv<uint16_t>(int n) 00058 { 00059 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00060 return ((pPmInt_t)pn)->val; 00061 } 00062 00063 template<> 00064 PinName NativeClassInterface::argv<PinName>(int n) 00065 { 00066 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00067 if (OBJ_GET_TYPE(pn) == OBJ_TYPE_INT) { 00068 return (PinName)(((pPmInt_t)pn)->val); 00069 } 00070 if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR) { 00071 return NC; 00072 } 00073 int imin = 0; 00074 int imax = sizeof(pinname_table) / sizeof(pinNameStr) - 1; 00075 char *key = reinterpret_cast<char*>(((pPmString_t)pn)->val); 00076 while(imax >= imin) { 00077 int i = (imin + imax) / 2; 00078 int c = strcmp(key, pinname_table[i].name); 00079 if (c == 0) { 00080 return pinname_table[i].pin; 00081 } else if (c > 0) { 00082 imin = i + 1; 00083 } else { 00084 imax = i - 1; 00085 } 00086 } 00087 return NC; 00088 } 00089 00090 template<> 00091 PmReturn_t NativeClassInterface::set_return_value<int>(PmType_t ret_type, int value) 00092 { 00093 pPmObj_t pn; 00094 PmReturn_t retval; 00095 if (ret_type == OBJ_TYPE_STR) { 00096 retval = string_newFromChar((uint8_t)value, &pn); 00097 } else { 00098 retval = int_new(value, &pn); 00099 } 00100 NATIVE_SET_TOS(pn); 00101 return retval; 00102 } 00103 00104 template<> 00105 PmReturn_t NativeClassInterface::set_return_value<uint8_t>(PmType_t ret_type, uint8_t value) 00106 { 00107 pPmObj_t pn; 00108 PmReturn_t retval = int_new(value, &pn); 00109 NATIVE_SET_TOS(pn); 00110 return retval; 00111 } 00112 00113 template<> 00114 PmReturn_t NativeClassInterface::set_return_value<uint16_t>(PmType_t ret_type, uint16_t value) 00115 { 00116 pPmObj_t pn; 00117 PmReturn_t retval = int_new(value, &pn); 00118 NATIVE_SET_TOS(pn); 00119 return retval; 00120 } 00121 00122 template<> 00123 PmReturn_t NativeClassInterface::set_return_value<float>(PmType_t ret_type, float value) 00124 { 00125 pPmObj_t pn; 00126 PmReturn_t retval = float_new(value, &pn); 00127 NATIVE_SET_TOS(pn); 00128 return retval; 00129 } 00130 00131 template<typename R> 00132 PmReturn_t NativeClassInterface::set_return_value(PmType_t ret_type, R value) 00133 { 00134 pPmObj_t pn; 00135 PmReturn_t retval; 00136 switch(ret_type) { 00137 case OBJ_TYPE_INT: 00138 retval = int_new(value, &pn); 00139 break; 00140 case OBJ_TYPE_FLT: 00141 retval = float_new(value, &pn); 00142 break; 00143 } 00144 NATIVE_SET_TOS(pn); 00145 return retval; 00146 } 00147 00148 PmReturn_t NativeClassInterface::check_argv_type(int arg_n, ...) 00149 { 00150 PmReturn_t retval = PM_RET_OK; 00151 if (NATIVE_GET_NUM_ARGS() != (arg_n+1)) { 00152 PM_RAISE(retval, PM_RET_EX_TYPE); 00153 return retval; 00154 } 00155 va_list vl; 00156 va_start(vl, arg_n); 00157 for(int n = 1; n <= arg_n; n++) { 00158 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00159 int ty = va_arg(vl, int); 00160 if (OBJ_GET_TYPE(pn) != ty) { 00161 PM_RAISE(retval, PM_RET_EX_TYPE); 00162 return retval; 00163 } 00164 } 00165 return retval; 00166 }
Generated on Tue Jul 12 2022 23:13:47 by
1.7.2