Subversion Repositories HomeAutomation

Rev

Rev 1203 | Rev 1402 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
969 runge 1
/***************************************************************************
2
 *   Copyright (C) December 10, 2008 by Mattias Runge                             *
3
 *   mattias@runge.se                                                      *
4
 *   virtualmachine.cpp                                            *
5
 *                                                                         *
6
 *   This program is free software; you can redistribute it and/or modify  *
7
 *   it under the terms of the GNU General Public License as published by  *
8
 *   the Free Software Foundation; either version 2 of the License, or     *
9
 *   (at your option) any later version.                                   *
10
 *                                                                         *
11
 *   This program is distributed in the hope that it will be useful,       *
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
14
 *   GNU General Public License for more details.                          *
15
 *                                                                         *
16
 *   You should have received a copy of the GNU General Public License     *
17
 *   along with this program; if not, write to the                         *
18
 *   Free Software Foundation, Inc.,                                       *
19
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
20
 ***************************************************************************/
21
 
22
#include "virtualmachine.h"
23
 
24
VirtualMachine* VirtualMachine::myInstance = NULL;
25
 
26
VirtualMachine& VirtualMachine::getInstance()
27
{
28
	if (myInstance == NULL)
29
	{
30
		myInstance = new VirtualMachine();
31
	}
32
 
33
	return *myInstance;
34
}
35
 
36
void VirtualMachine::deleteInstance()
37
{
38
	if (myInstance != NULL)
39
	{
40
		delete myInstance;
41
		myInstance = NULL;
42
	}
43
}
44
 
45
VirtualMachine::VirtualMachine()
46
{
47
}
48
 
49
VirtualMachine::~VirtualMachine()
50
{
981 runge 51
	stop();
997 runge 52
 
999 runge 53
	myCommandThread.stop();
54
 
997 runge 55
	///FIXME: Verify that this works and does not cause segfaults
1203 arune 56
	for (map<unsigned long int, SocketThread*>::iterator iter = mySocketThreads.begin(); iter != mySocketThreads.end(); iter++)
997 runge 57
	{
999 runge 58
		iter->second->stop();
997 runge 59
		delete iter->second;
999 runge 60
		//mySocketThreads.erase(iter);
997 runge 61
	}
999 runge 62
 
63
	mySocketThreads.clear();
64
 
65
	for (map<int, IntervalThread*>::iterator iter = myIntervalThreads.begin(); iter != myIntervalThreads.end(); iter++)
66
	{
67
		iter->second->stop();
68
		delete iter->second;
69
		//myIntervalThreads.erase(iter);
70
	}
71
 
72
	myIntervalThreads.clear();
969 runge 73
}
74
 
75
void VirtualMachine::run()
76
{
77
	myGlobal = ObjectTemplate::New();
999 runge 78
	myGlobal->Set(String::New("_quit"), FunctionTemplate::New(VirtualMachine::_quit));
79
	myGlobal->Set(String::New("_print"), FunctionTemplate::New(VirtualMachine::_print));
80
	myGlobal->Set(String::New("log"), FunctionTemplate::New(VirtualMachine::_log));
81
	myGlobal->Set(String::New("sendCanMessage"), FunctionTemplate::New(VirtualMachine::_sendCanMessage));
82
	myGlobal->Set(String::New("sendCanNMTMessage"), FunctionTemplate::New(VirtualMachine::_sendCanNMTMessage));
83
	myGlobal->Set(String::New("loadScript"), FunctionTemplate::New(VirtualMachine::_loadScript));
84
	myGlobal->Set(String::New("startIntervalThread"), FunctionTemplate::New(VirtualMachine::_startIntervalThread));
85
	myGlobal->Set(String::New("stopIntervalThread"), FunctionTemplate::New(VirtualMachine::_stopIntervalThread));
1042 runge 86
	myGlobal->Set(String::New("setIntervalThreadTimeout"), FunctionTemplate::New(VirtualMachine::_setIntervalThreadTimeout));
999 runge 87
	myGlobal->Set(String::New("startSocketThread"), FunctionTemplate::New(VirtualMachine::_startSocketThread));
88
	myGlobal->Set(String::New("stopSocketThread"), FunctionTemplate::New(VirtualMachine::_stopSocketThread));
89
	myGlobal->Set(String::New("sendToSocketThread"), FunctionTemplate::New(VirtualMachine::_sendToSocketThread));
1007 runge 90
	myGlobal->Set(String::New("loadDataStore"), FunctionTemplate::New(VirtualMachine::_loadDataStore));
1008 runge 91
	myGlobal->Set(String::New("getFileContents"), FunctionTemplate::New(VirtualMachine::_getFileContents));
1011 runge 92
	myGlobal->Set(String::New("uint2hex"), FunctionTemplate::New(VirtualMachine::_uint2hex));
93
	myGlobal->Set(String::New("hex2bin"), FunctionTemplate::New(VirtualMachine::_hex2bin));
94
	myGlobal->Set(String::New("bin2hex"), FunctionTemplate::New(VirtualMachine::_bin2hex));
95
	myGlobal->Set(String::New("bin2float"), FunctionTemplate::New(VirtualMachine::_bin2float));
96
	myGlobal->Set(String::New("float2bin"), FunctionTemplate::New(VirtualMachine::_float2bin));
97
	myGlobal->Set(String::New("bin2uint"), FunctionTemplate::New(VirtualMachine::_bin2uint));
98
	myGlobal->Set(String::New("uint2bin"), FunctionTemplate::New(VirtualMachine::_uint2bin));
99
	myGlobal->Set(String::New("hex2uint"), FunctionTemplate::New(VirtualMachine::_hex2uint));
1060 runge 100
	myGlobal->Set(String::New("sleep"), FunctionTemplate::New(VirtualMachine::_sleep));
969 runge 101
	myContext = Context::New(NULL, myGlobal);
102
 
103
 
997 runge 104
	if (loadScript("System/Base.js"))
105
	{
106
		loadScript("System/Startup.js");
969 runge 107
 
997 runge 108
		loadScript("Autostart.js");
109
 
110
		Context::Scope contextScope(myContext);
111
 
112
		myFunctionStartup = Handle<Function>::Cast(myContext->Global()->Get(String::New("startup")));
969 runge 113
	}
114
	else
115
	{
997 runge 116
		///FIXME: We should probably exit the application here
117
		return;
969 runge 118
	}
119
 
120
	const int argc = 0;
121
	Handle<Value> argv[argc] = { };
997 runge 122
	Handle<Value> result = myFunctionStartup->Call(myFunctionStartup, argc, argv);
969 runge 123
 
999 runge 124
 
125
	string commandPort = Settings::get("CommandPort");
126
	if (commandPort != "")
127
	{
128
		myCommandThread.setSettings(stoi(commandPort), "Command console");
129
		myCommandThread.start();
130
	}
131
	else
132
	{
1024 runge 133
		Logger &log = Logger::getInstance();
134
		log.add("CommandPort is not defined, can not start Command console socket\n");
999 runge 135
	}
136
 
137
 
969 runge 138
	mySemaphore.lock();
139
 
997 runge 140
	while (true)
969 runge 141
	{
142
		while (myExpressions.size() > 0)
143
		{
999 runge 144
			runExpression(myExpressions.pop());
969 runge 145
		}
146
 
147
		mySemaphore.wait();
148
	}
149
 
150
	mySemaphore.unlock();
151
}
152
 
999 runge 153
void VirtualMachine::queueExpression(Expression expression)
969 runge 154
{
999 runge 155
	myExpressions.push(expression);
969 runge 156
	mySemaphore.broadcast();
157
}
158
 
999 runge 159
string VirtualMachine::formatException(TryCatch* tryCatch)
969 runge 160
{
999 runge 161
	string result;
162
 
163
	HandleScope handleScope;
164
	String::Utf8Value exception(tryCatch->Exception());
165
	Handle<v8::Message> message = tryCatch->Message();
166
 
167
	string strException = *exception;
168
 
169
	if (message.IsEmpty())
170
	{
171
		result += strException + "\n";
172
	}
173
	else
174
	{
175
		String::Utf8Value filename(message->GetScriptResourceName());
176
		string strFilename = *filename;
177
 
178
		result += strFilename + ":" + itos(message->GetLineNumber()) + ": " + strException + "\n";
179
 
180
		String::Utf8Value sourceline(message->GetSourceLine());
181
		string strSourceline = *sourceline;
182
 
183
		result += strSourceline + "\n";
184
 
185
		string underline = rpad("", message->GetStartColumn(), ' ');
186
		underline = rpad(underline, message->GetEndColumn(), '^');
187
 
188
		result += underline + "\n";
189
	}
190
 
191
	return result;
969 runge 192
}
193
 
1007 runge 194
bool VirtualMachine::loadDataStore(string storeName)
195
{
1024 runge 196
	Logger &log = Logger::getInstance();
1007 runge 197
 
198
	string basePath = Settings::get("BasePath") + "Services/DataStores/";
199
	string scriptFileName = basePath + storeName + ".js";
200
 
201
	if (!file_exists(scriptFileName))
202
	{
1024 runge 203
		log.add("Failed to load datastore " + scriptFileName + ", file does not exist.\n");
1007 runge 204
		return false;
205
	}
206
 
207
	string scriptSource = file_get_contents(scriptFileName);
208
 
209
	scriptSource = "DataStore.addStore('" + storeName + "', " + str_replace("\n", "", scriptSource) + ");";
210
 
211
	Handle<String> source =  String::New(scriptSource.c_str(), scriptSource.length());
212
	Handle<String> name = String::New(scriptFileName.c_str(), scriptFileName.length());
213
 
214
	Context::Scope contextScope(myContext);
215
 
216
	TryCatch tryCatch;
217
 
218
	Handle<Script> script = Script::Compile(source, name);
219
 
220
	if (script.IsEmpty())
221
	{
1024 runge 222
		log.add(formatException(&tryCatch));
1007 runge 223
		return false;
224
	}
225
	else
226
	{
227
		Handle<Value> result = script->Run();
228
 
229
		if (result.IsEmpty())
230
		{
1024 runge 231
			log.add(formatException(&tryCatch));
1007 runge 232
			return false;
233
		}
234
 
1024 runge 235
		log.add("Loaded datastore " + storeName + "\n");
1007 runge 236
	}
237
 
238
	return true;
239
}
240
 
969 runge 241
bool VirtualMachine::loadScript(string scriptName)
242
{
1024 runge 243
	Logger &log = Logger::getInstance();
969 runge 244
 
981 runge 245
	string basePath = Settings::get("BasePath") + "Services/";
969 runge 246
	string scriptFileName = basePath + scriptName;
247
 
248
	if (!file_exists(scriptFileName))
249
	{
1024 runge 250
		log.add("Failed to load " + scriptFileName + ", file does not exist.\n");
969 runge 251
		return false;
252
	}
253
 
254
	string scriptSource = file_get_contents(scriptFileName);
255
 
256
	Handle<String> source =  String::New(scriptSource.c_str(), scriptSource.length());
257
	Handle<String> name = String::New(scriptName.c_str(), scriptName.length());
258
 
997 runge 259
	Context::Scope contextScope(myContext);
260
 
995 runge 261
	TryCatch tryCatch;
997 runge 262
 
969 runge 263
	Handle<Script> script = Script::Compile(source, name);
264
 
265
	if (script.IsEmpty())
266
	{
1024 runge 267
		log.addToSyslog(formatException(&tryCatch));
969 runge 268
		return false;
269
	}
270
	else
271
	{
272
		Handle<Value> result = script->Run();
273
 
274
		if (result.IsEmpty())
275
		{
1024 runge 276
			log.addToSyslog(formatException(&tryCatch));
969 runge 277
			return false;
278
		}
977 runge 279
 
1024 runge 280
		log.add("Loaded " + scriptName + "\n");
969 runge 281
	}
282
 
283
	return true;
284
}
285
 
971 runge 286
unsigned int VirtualMachine::startIntervalThread(unsigned int timeout)
969 runge 287
{
999 runge 288
	IntervalThread *intervalThread = new IntervalThread(timeout);
969 runge 289
 
999 runge 290
	myIntervalThreads[intervalThread->getId()] = intervalThread;
291
	myIntervalThreads[intervalThread->getId()]->start();
969 runge 292
 
999 runge 293
	return intervalThread->getId();
969 runge 294
}
295
 
971 runge 296
bool VirtualMachine::stopIntervalThread(unsigned int id)
969 runge 297
{
971 runge 298
	if (myIntervalThreads.find(id) != myIntervalThreads.end())
969 runge 299
	{
1042 runge 300
		myIntervalThreads[id]->stop();
999 runge 301
		delete myIntervalThreads[id];
971 runge 302
		myIntervalThreads.erase(id);
1042 runge 303
 
969 runge 304
		return true;
305
	}
306
 
307
	return false;
308
}
309
 
1042 runge 310
bool VirtualMachine::setIntervalThreadTimeout(unsigned int id, unsigned int timeout)
311
{
312
	if (myIntervalThreads.find(id) != myIntervalThreads.end())
313
	{
314
		myIntervalThreads[id]->setTimeout(timeout);
315
		return true;
316
	}
317
 
318
	return false;
319
}
320
 
976 runge 321
unsigned int VirtualMachine::startSocketThread(string address, int port, unsigned int reconnectTimeout)
322
{
983 runge 323
	SocketThread *socketThread = new SocketThread(address, port, reconnectTimeout);
324
	mySocketThreads[socketThread->getId()] = socketThread;
325
	mySocketThreads[socketThread->getId()]->start();
1203 arune 326
	mySocketThreads[socketThread->getId()]->startSocket();
976 runge 327
 
983 runge 328
	return socketThread->getId();
976 runge 329
}
330
 
331
bool VirtualMachine::stopSocketThread(unsigned int id)
332
{
333
	if (mySocketThreads.find(id) != mySocketThreads.end())
334
	{
983 runge 335
		delete mySocketThreads[id];
976 runge 336
		mySocketThreads.erase(id);
337
		return true;
338
	}
339
 
340
	return false;
341
}
342
 
343
void VirtualMachine::sendToSocketThread(unsigned int id, string data)
344
{
345
	if (mySocketThreads.find(id) != mySocketThreads.end())
346
	{
983 runge 347
		mySocketThreads[id]->send(data);
976 runge 348
	}
349
}
350
 
999 runge 351
void VirtualMachine::disconnectCommandClient(unsigned int id)
969 runge 352
{
999 runge 353
	myCommandThread.disconnectClient(id);
354
}
355
 
356
void VirtualMachine::sendToCommandClient(unsigned int id, string data)
357
{
358
	myCommandThread.sendTo(id, data);
359
}
360
 
361
void VirtualMachine::print(unsigned int id, string data)
362
{
363
	if (id == 0)
364
	{
1024 runge 365
		Logger &log = Logger::getInstance();
366
		log.add(data);
999 runge 367
	}
368
	else
369
	{
370
		VirtualMachine &vm = VirtualMachine::getInstance();
371
		vm.sendToCommandClient(id, data);
372
	}
373
}
374
 
375
bool VirtualMachine::runExpression(Expression expression)
376
{
969 runge 377
	string scriptName = "runExpression";
378
 
999 runge 379
	string scriptData = expression.getScript();
380
 
1008 runge 381
	scriptData = "setClientId(" + itos(expression.getTargetId()) + ");\n" + scriptData + "\n";
999 runge 382
 
383
	Handle<String> source =  String::New(scriptData.c_str(), scriptData.length());
969 runge 384
	Handle<String> name = String::New(scriptName.c_str(), scriptName.length());
385
 
997 runge 386
	Context::Scope contextScope(myContext);
387
 
995 runge 388
	TryCatch tryCatch;
997 runge 389
 
969 runge 390
	Handle<Script> script = Script::Compile(source, name);
391
 
392
	if (script.IsEmpty())
393
	{
999 runge 394
		print(expression.getTargetId(), formatException(&tryCatch));
969 runge 395
		return false;
396
	}
397
	else
398
	{
399
		Handle<Value> result = script->Run();
400
 
401
		if (result.IsEmpty())
402
		{
999 runge 403
			print(expression.getTargetId(), formatException(&tryCatch));
969 runge 404
			return false;
405
		}
999 runge 406
		else if (expression.getTargetId() != 0)
407
		{
408
			 String::AsciiValue ascii(result);
409
			 string resultString = *ascii;
410
 
411
			 if (resultString != "undefined")
412
			 {
413
				print(expression.getTargetId(), resultString + "\n");
414
			 }
415
		}
969 runge 416
	}
417
 
418
	return true;
419
}
420
 
999 runge 421
 
422
Handle<Value> VirtualMachine::_quit(const Arguments& args)
995 runge 423
{
999 runge 424
	VirtualMachine &vm = VirtualMachine::getInstance();
995 runge 425
 
999 runge 426
	vm.disconnectCommandClient(args[0]->Uint32Value());
995 runge 427
 
999 runge 428
	return Undefined();
429
}
995 runge 430
 
999 runge 431
Handle<Value> VirtualMachine::_log(const Arguments& args)
432
{
1024 runge 433
	Logger &log = Logger::getInstance();
995 runge 434
 
999 runge 435
	String::AsciiValue str(args[0]);
995 runge 436
 
1024 runge 437
	log.add(*str);
995 runge 438
 
999 runge 439
	return Undefined();
995 runge 440
}
441
 
999 runge 442
Handle<Value> VirtualMachine::_print(const Arguments& args)
969 runge 443
{
999 runge 444
	VirtualMachine &vm = VirtualMachine::getInstance();
969 runge 445
 
999 runge 446
	String::AsciiValue str(args[1]);
969 runge 447
 
999 runge 448
	vm.print(args[0]->Uint32Value(), *str);
969 runge 449
 
450
	return Undefined();
451
}
452
 
999 runge 453
Handle<Value> VirtualMachine::_sendCanMessage(const Arguments& args)
969 runge 454
{
455
	CanNetManager &canMan = CanNetManager::getInstance();
456
 
457
	CanMessage canMessage;
458
 
459
	String::AsciiValue className(args[0]);
460
	canMessage.setClassName(*className);
461
	String::AsciiValue directionFlag(args[1]);
462
	canMessage.setDirectionFlag(*directionFlag);
463
	String::AsciiValue moduleName(args[2]);
464
	canMessage.setModuleName(*moduleName);
465
	canMessage.setModuleId(args[3]->Uint32Value());
466
	String::AsciiValue commandName(args[4]);
467
	canMessage.setCommandName(*commandName);
468
 
469
	String::AsciiValue dataString(args[5]);
470
 
471
	vector<string> parts = explode(",", trim(*dataString, ','));
472
	map<string, CanVariable> data;
473
 
474
	for (int n = 0; n < parts.size(); n++)
475
	{
476
		vector<string> keyAndValue = explode(":", parts[n]);
477
 
1229 arune 478
		/* decode base64 on the data part */
479
		keyAndValue[1] = base64_decode(keyAndValue[1]);
480
 
969 runge 481
		data[keyAndValue[0]] = CanVariable(keyAndValue[0], keyAndValue[1]);
482
	}
483
 
484
	canMessage.setData(data);
485
 
486
	canMan.sendMessage(canMessage);
487
 
488
	return Undefined();
489
}
490
 
999 runge 491
Handle<Value> VirtualMachine::_sendCanNMTMessage(const Arguments& args)
986 runge 492
{
493
	CanNetManager &canMan = CanNetManager::getInstance();
494
 
495
	CanMessage canMessage;
496
 
497
	String::AsciiValue className(args[0]);
498
	canMessage.setClassName(*className);
499
	String::AsciiValue commandName(args[1]);
500
	canMessage.setCommandName(*commandName);
501
 
502
	String::AsciiValue dataString(args[2]);
503
 
504
	vector<string> parts = explode(",", trim(*dataString, ','));
505
	map<string, CanVariable> data;
506
 
507
	for (int n = 0; n < parts.size(); n++)
508
	{
509
		vector<string> keyAndValue = explode(":", parts[n]);
510
 
511
		data[keyAndValue[0]] = CanVariable(keyAndValue[0], keyAndValue[1]);
512
	}
513
 
514
	canMessage.setData(data);
515
 
516
	canMan.sendMessage(canMessage);
517
 
518
	return Undefined();
519
}
520
 
999 runge 521
Handle<Value> VirtualMachine::_loadScript(const Arguments& args)
969 runge 522
{
523
	VirtualMachine &vm = VirtualMachine::getInstance();
524
 
525
	String::AsciiValue str(args[0]);
526
 
527
	return Boolean::New(vm.loadScript(*str));
528
}
529
 
1007 runge 530
Handle<Value> VirtualMachine::_loadDataStore(const Arguments& args)
531
{
532
	VirtualMachine &vm = VirtualMachine::getInstance();
533
 
534
	String::AsciiValue str(args[0]);
535
 
536
	return Boolean::New(vm.loadDataStore(*str));
537
}
538
 
999 runge 539
Handle<Value> VirtualMachine::_startIntervalThread(const Arguments& args)
969 runge 540
{
541
	VirtualMachine &vm = VirtualMachine::getInstance();
999 runge 542
	return Integer::New(vm.startIntervalThread(args[0]->Uint32Value()));
969 runge 543
}
544
 
999 runge 545
Handle<Value> VirtualMachine::_stopIntervalThread(const Arguments& args)
969 runge 546
{
547
	VirtualMachine &vm = VirtualMachine::getInstance();
999 runge 548
	return Boolean::New(vm.stopIntervalThread(args[0]->Uint32Value()));
969 runge 549
}
976 runge 550
 
1042 runge 551
Handle<Value> VirtualMachine::_setIntervalThreadTimeout(const Arguments& args)
552
{
553
	VirtualMachine &vm = VirtualMachine::getInstance();
554
	return Integer::New(vm.setIntervalThreadTimeout(args[0]->Uint32Value(), args[1]->Uint32Value()));
555
}
556
 
999 runge 557
Handle<Value> VirtualMachine::_startSocketThread(const Arguments& args)
976 runge 558
{
559
	VirtualMachine &vm = VirtualMachine::getInstance();
560
 
561
	String::AsciiValue address(args[0]);
562
 
999 runge 563
	return Integer::New(vm.startSocketThread(*address, args[1]->Uint32Value(), args[2]->Uint32Value()));
976 runge 564
}
565
 
999 runge 566
Handle<Value> VirtualMachine::_stopSocketThread(const Arguments& args)
976 runge 567
{
568
	VirtualMachine &vm = VirtualMachine::getInstance();
569
 
999 runge 570
	return Boolean::New(vm.stopSocketThread(args[0]->Uint32Value()));
976 runge 571
}
572
 
999 runge 573
Handle<Value> VirtualMachine::_sendToSocketThread(const Arguments& args)
976 runge 574
{
575
	VirtualMachine &vm = VirtualMachine::getInstance();
576
 
577
	String::AsciiValue data(args[1]);
578
 
999 runge 579
	vm.sendToSocketThread(args[0]->Uint32Value(), *data);
976 runge 580
 
581
	return Undefined();
582
}
583
 
1008 runge 584
Handle<Value> VirtualMachine::_getFileContents(const Arguments& args)
585
{
586
	String::AsciiValue filename(args[0]);
587
 
588
	if (!file_exists(*filename))
589
	{
590
		return Undefined();
591
	}
592
 
593
	string content = file_get_contents(*filename);
594
 
595
	return String::New(content.c_str());
596
}
597
 
1010 runge 598
Handle<Value> VirtualMachine::_uint2hex(const Arguments& args)
599
{
600
	string hex = uint2hex(args[0]->Uint32Value(), args[1]->Uint32Value());
601
	return String::New(hex.c_str());
602
}
603
 
604
Handle<Value> VirtualMachine::_hex2bin(const Arguments& args)
605
{
606
	String::AsciiValue hex(args[0]);
607
	string bin = hex2bin(*hex);
608
	return String::New(bin.c_str());
609
}
610
 
611
Handle<Value> VirtualMachine::_bin2hex(const Arguments& args)
612
{
613
	String::AsciiValue bin(args[0]);
614
	string hex = bin2hex(*bin);
615
	return String::New(hex.c_str());
616
}
617
 
618
Handle<Value> VirtualMachine::_bin2float(const Arguments& args)
619
{
620
	String::AsciiValue bin(args[0]);
621
	float f = bin2float(*bin);
622
	return Number::New(f);
623
}
624
 
625
Handle<Value> VirtualMachine::_float2bin(const Arguments& args)
626
{
627
	string bin = float2bin(args[0]->NumberValue(), args[1]->Uint32Value());
628
	return String::New(bin.c_str());
629
}
630
 
631
Handle<Value> VirtualMachine::_bin2uint(const Arguments& args)
632
{
633
	String::AsciiValue bin(args[0]);
634
	unsigned int num = bin2uint(*bin);
1012 runge 635
	return Number::New(num);
1010 runge 636
}
637
 
638
Handle<Value> VirtualMachine::_uint2bin(const Arguments& args)
639
{
640
	string bin = uint2bin(args[0]->Uint32Value(), args[1]->Uint32Value());
641
	return String::New(bin.c_str());
642
}
643
 
1011 runge 644
Handle<Value> VirtualMachine::_hex2uint(const Arguments& args)
645
{
646
	String::AsciiValue hex(args[0]);
647
	unsigned int num = hex2uint(*hex);
1012 runge 648
	return Number::New(num);
1011 runge 649
}
1060 runge 650
 
651
Handle<Value> VirtualMachine::_sleep(const Arguments& args)
652
{
653
	usleep(args[0]->Uint32Value());
654
	return Undefined();
655
}