/* * Copyright (C) Vamsi. 2017-18 All rights reserved. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU General Public License version 2. */ #include "mex.h" #include "mexNs3State.h" #include "ns3/lte-helper.h" using namespace ns3; static int MEXIsLoaded = 0; void cleanup(void) { MEXIsLoaded = 0; } void* getElem(MemMngmt *obj) { return obj->vptr; } typedef enum methodType { LTEHELPER, INSTALLENBDEVICE, INSTALLUEDEVICE, ATTACH, SETEPCHELPER, SETATTRIBUTE, SETSCHEDULERTYPE, SETENBNETDEVICEATTRIBUTE, SETUEDEVICEATTRIBUTE, SETFADINGMODEL, SETENBANTENNAMODELTYPE, SETENBANTENNAMODELATTRIBUTE, ACTIVATEDATARADIOBEARER, ACTIVATEDEDICATEDEPSBEARER, ENABLETRACES, ENABLELOGCOMPONENTS, DELETE, TOTAL_METHODS }methodType_t; static char methodNames[TOTAL_METHODS][CMD_BUFFER_SIZE] = {"new", "InstallEnbDevice", "InstallUeDevice","Attach","SetEpcHelper", "SetAttribute", "SetSchedulerType","SetEnbDeviceAttribute", "SetUeDeviceAttribute", "SetFadingModel", "SetEnbAntennaModelType", "SetEnbAntennaModelAttribute", "ActivateDataRadioBearer","ActivateDedicatedEpsBearer", "EnableTraces","EnableLogComponents","delete"}; methodType_t identifyMethod(const char* cmd) { for (int i = 0; i < TOTAL_METHODS; i++) { if (!strcmp(methodNames[i], cmd)) return methodType_t(i); } return TOTAL_METHODS; } void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (!MEXIsLoaded) { mexAtExit(cleanup); MEXIsLoaded = 1; } uint16_t indx = 0; char cmd[CMD_BUFFER_SIZE]; if (nrhs < 1 || mxGetString(prhs[INPUT_Command_String_Index], cmd, sizeof(cmd))) { mexErrMsgTxt("Check your inputs"); } switch(identifyMethod(cmd)) { case LTEHELPER: { LteHelper *obj = new LteHelper(); MemMngmt *tst = bindMngrNewElem(); tst->vptr = reinterpret_cast(obj); tst->objType = LTEHELPOBJ; plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *((uint64_t *)mxGetData(plhs[0])) = reinterpret_cast((MemMngmt*)tst); break; } case INSTALLENBDEVICE: { if ((nlhs != 1) || (nrhs > 3)) { mexErrMsgTxt("enter correct number of input and output args"); } switch(nrhs) { case 3: { MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); // NodeContainer arg2 = *(reinterpret_cast(tst2->vptr)); // LteHelper *obj = new LteHelper(); NodeContainer *arg2 = new NodeContainer(); NetDeviceContainer *tmp = new NetDeviceContainer ((reinterpret_cast(obj))->InstallEnbDevice(*arg2)); MemMngmt *tst = bindMngrNewElem(); tst->vptr = reinterpret_cast(tmp); tst->objType = NETDEVCONTOBJ; plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *((uint64_t *)mxGetData(plhs[0])) = reinterpret_cast((MemMngmt*)tst); break; } } break; } case INSTALLUEDEVICE: { if ((nlhs != 1) || (nrhs > 3)) { mexErrMsgTxt("enter correct number of input and output args"); } switch(nrhs) { case 3: { MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); NodeContainer const & arg2 = *(reinterpret_cast(tst2->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); NodeContainer nc = arg2.GetGlobal(); // LteHelper *obj = new LteHelper(); char const *a = "llego hasta aqui"; mexPrintf(a); NetDeviceContainer *tmp = new NetDeviceContainer((reinterpret_cast(obj))->InstallUeDevice(nc)); MemMngmt *tst = bindMngrNewElem(); tst->vptr = reinterpret_cast(tmp); tst->objType = NETDEVCONTOBJ; plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *((uint64_t *)mxGetData(plhs[0])) = reinterpret_cast((MemMngmt*)tst); break; } } break; } case ATTACH: { if ((nlhs != 0) || (nrhs > 4)) { mexErrMsgTxt("enter correct number of input and output args"); } switch(nrhs) { case 3: { MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); NetDeviceContainer ueDevices = *(reinterpret_cast(tst2->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->Attach(ueDevices); break; } case 4: { MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); NetDeviceContainer ueDevices = *(reinterpret_cast(tst2->vptr)); MemMngmt *tst3= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); NetDeviceContainer enbDevices = *(reinterpret_cast(tst3->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->AttachToClosestEnb(ueDevices, enbDevices); break; } } break; } case SETEPCHELPER: { if ((nlhs != 0) || (nrhs > 3)) { mexErrMsgTxt("enter correct number of input and output args"); } MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); Ptr h = *(reinterpret_cast*>(tst2)); //Ptr *h2= new Ptr(); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetEpcHelper(h); break; } case SETATTRIBUTE: { std::string n1 = std::string(mxArrayToString(prhs[2])); MemMngmt *tst3= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); AttributeValue const & v1 = *(reinterpret_cast(tst3->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetAttribute(n1, v1); break; } case SETSCHEDULERTYPE: { char subarg[128]; if ((nlhs != 0) || (nrhs !=3)) { mexErrMsgTxt("enter correct number of input and output args"); } mxGetString(prhs[2], subarg, sizeof(subarg)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetSchedulerType(subarg); break; } case SETENBNETDEVICEATTRIBUTE: { std::string n1 = std::string(mxArrayToString(prhs[2])); MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); AttributeValue const & v1 = *(reinterpret_cast(tst2->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetEnbDeviceAttribute(n1,v1); break; } case SETUEDEVICEATTRIBUTE: { std::string n1 = std::string(mxArrayToString(prhs[2])); MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); AttributeValue const & v1 = *(reinterpret_cast(tst2->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetUeDeviceAttribute(n1,v1); break; } case SETENBANTENNAMODELTYPE: { const char *b="estpy aqui"; mexPrintf(b); std::string n1 = std::string(mxArrayToString(prhs[2])); const char *a="leo variables"; mexPrintf(a); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetEnbAntennaModelType(n1); break; } case SETENBANTENNAMODELATTRIBUTE: { std::string n1 = std::string(mxArrayToString(prhs[2])); MemMngmt *tst3= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); AttributeValue const & v1 = *(reinterpret_cast(tst3->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetEnbAntennaModelAttribute(n1, v1); break; } case SETFADINGMODEL: { char subarg[128]; if ((nlhs != 0) || (nrhs > 3)) { mexErrMsgTxt("enter correct number of input and output args"); } mxGetString(prhs[2], subarg, sizeof(subarg)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->SetFadingModel(subarg); break; } case ENABLETRACES: { void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))-> EnableTraces(); break; } case ACTIVATEDATARADIOBEARER: { if ((nlhs != 0) || (nrhs > 5)) { mexErrMsgTxt("enter correct number of input and output args"); } MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); MemMngmt *tst3= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); NetDeviceContainer arg2 = *(reinterpret_cast(tst2->vptr)); EpsBearer const & arg3 = *(reinterpret_cast(tst3->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->ActivateDataRadioBearer(arg2,arg3); break; } case ACTIVATEDEDICATEDEPSBEARER: { if ((nlhs != 0) || (nrhs > 5)) { mexErrMsgTxt("enter correct number of input and output args"); } MemMngmt *tst2= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[2])))); MemMngmt *tst3= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[3])))); MemMngmt *tst4= bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[4])))); NetDeviceContainer arg2 = *(reinterpret_cast(tst2->vptr)); EpsBearer const & arg3 = *(reinterpret_cast(tst3->vptr)); Ptr arg4 =*(reinterpret_cast*>(tst4->vptr)); void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))->ActivateDedicatedEpsBearer(arg2,arg3,arg4); break; } case ENABLELOGCOMPONENTS: { void *obj = getElem(bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1]))))); (reinterpret_cast(obj))-> EnableLogComponents(); break; } case DELETE: { MemMngmt *obj = bindMngrHasListElem ((MemMngmt *)(*((uint64_t *)mxGetData(prhs[1])))); if (obj) { if (obj->objType == LTEHELPOBJ) delete reinterpret_cast(obj->vptr); bindMngrDelSingleElem(obj); } break; } default: break; } }