1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <eigen/dense>
using namespace Eigen;

#include "matlab_utils.h"

#ifdef ENABLE_MATLAB

MatlabEngine gMatEngine;

// Matlab engine
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")

bool MatlabEngine::connect(const std::string &dir, bool closeAll)
{
    if (eng)
        return true;

    if (0) {
		// 0 = success
		// -2 = error - second argument must be NULL
		// -3 = error - engOpenSingleUse failed
		int retstatus;
		if ( !(eng = engOpenSingleUse("\0", NULL, &retstatus)) ) {
            fprintf(stderr, "Can't start MATLAB engine: %d\n", retstatus);
			return false;
		}
    }
    else {
        printf( "Starting MATLAB engine ... " );
        if (!(eng = engOpen("\0"))) {
            fprintf(stderr, "Failed!\n");
			return false;
		}
        printf( "Succeed!\n");
	}

	engBuffer[lenEngBuffer-1] = '\0';
	engOutputBuffer(eng, engBuffer, lenEngBuffer); 

	// set current path
    engEvalString(eng, ("cd " + dir).c_str());

	//engEvalString(eng, "clear all; clc; rehash;"); 
    if (closeAll)
		engEvalString(eng, "close all;"); 

	return true;
}

void MatlabEngine::eval(const std::string &cmd, bool PrintInfo)
{
    ensure(connected(), "Not connected to Matlab!");

    if (consoleOutput) 
        engOutputBuffer(eng, engBuffer, lenEngBuffer);
    else
        engOutputBuffer(eng, nullptr, 0);

    //engEvalString(eng, "dbclear all;");
    //engEvalString(eng, "if ~isempty(dbstatus), warning('Clear all breakpoint, Matlab cannot be debugged from C++!'); dbclear all; end"); // debug will cause matlab to crash
    if (consoleOutput && *engBuffer) fprintf(stderr, "%s\n", engBuffer);

    int r = engEvalString(eng, cmd.c_str());
    if (r != 0) {
        if (r == 1) fprintf(stderr, "Engine session no longer running!\n");

        fprintf(stderr, "engEvalString error!\n");
    }

    if (consoleOutput && *engBuffer) {
		if(PrintInfo)
			fprintf(stdout, "--------------\n%s\n--------------\n%s\n", cmd.c_str(), engBuffer);
		else
			fprintf(stdout, "--------------\n%s\n", engBuffer);
	}
}


void MatlabEngine::close()
{
    printf( "Shutting down MATLAB engine ... " );
	engClose(eng);
	printf( "done!\n" );
	eng = nullptr;
}

MatlabEngine& getMatEngine() 
{	
	return gMatEngine; 
}

#endif