python-on-a-chip online compiler

Dependencies:   mbed TSI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers NativeClassInterface.cpp Source File

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 }