Example #1
0
void Debugger::printMenu()
{
	if (screen.isActive() || state == dsStopped)
	{
		screen.SelectForeColor(0, 0, 0);
		screen.SelectBackColor(192, 192, 192);
		printFixed(screen.getFrameBufferWidth() - 25, screen.getFrameBufferHeight() - 1, L" Hardware debugging tool ", 25);
		screen.SetCursorPosition(0, screen.getFrameBufferHeight() - 1);

		if (state == dsRunningPending || state == dsRunning)
		{
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectBackColor(128, 128, 128);
		}
		screen.Write(L"1 Run    ");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		if (state == dsStopped)
		{
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectBackColor(128, 128, 128);
		}
		screen.Write(L"2 Pause  ");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		if (state == dsStepOverPending || state == dsRunningOver)
		{
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectBackColor(128, 128, 128);
		}
		screen.Write(L"3 Stp ovr");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		if (state == dsStepIntoPending)
		{
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectBackColor(128, 128, 128);
		}
		screen.Write(L"4 Stp in ");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		if (state == dsStepOutPending || state == dsRunningOut)
		{
			screen.SelectBackColor(192, 192, 192);
			screen.SelectForeColor(0, 0, 0);
		}
		else if (flowLayers.size() > 1)
		{
			screen.SelectBackColor(128, 128, 128);
			screen.SelectForeColor(0, 0, 0);
		}
		else
		{
			screen.SelectBackColor(0, 0, 0);
			screen.SelectForeColor(128, 128, 128);
		}

		screen.Write(L"5 Stp out");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		if (findBreakpointAt(entries[wSelectedLine].memPos) != breakpoints.end())
		{
			screen.SelectBackColor(192, 192, 192);
			screen.SelectForeColor(0, 0, 0);
		}
		else
		{
			screen.SelectBackColor(128, 128, 128);
			screen.SelectForeColor(0, 0, 0);
		}

		screen.Write(L"6 Breakpt");
		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");

		screen.SelectForeColor(0, 0, 0);
		screen.SelectBackColor(128, 128, 128);
		screen.Write(L"7 Halt   ");

		screen.SelectBackColor(0, 0, 0);
		screen.Write(L" ");
		screen.SetCursorPosition(0, screen.getFrameBufferHeight() - 1);
	}
}
void dWorldExportDIF (dWorldID w, FILE *file, const char *prefix)
{
    PrintingContext c;
    c.file = file;
#if defined(dSINGLE)
    c.precision = 7;
#else
    c.precision = 15;
#endif
    c.indent = 1;

    fprintf (file,"-- Dynamics Interchange Format v0.1\n\n%sworld = dynamics.world {\n",prefix);
    c.print ("gravity",w->gravity);
    c.print ("ODE = {");
    c.indent++;
    c.print ("ERP",w->global_erp);
    c.print ("CFM",w->global_cfm);
    c.print ("auto_disable = {");
    c.indent++;
    c.print ("linear_threshold",w->adis.linear_average_threshold);
    c.print ("angular_threshold",w->adis.angular_average_threshold);
    c.print ("average_samples",(int)w->adis.average_samples);
    c.print ("idle_time",w->adis.idle_time);
    c.print ("idle_steps",w->adis.idle_steps);
    fprintf (file,"\t\t},\n\t},\n}\n");
    c.indent -= 3;

    // bodies
    int num = 0;
    fprintf (file,"%sbody = {}\n",prefix);
    for (dxBody *b=w->firstbody; b; b=(dxBody*)b->next) {
        b->tag = num;
        fprintf (file,"%sbody[%d] = dynamics.body {\n\tworld = %sworld,\n",prefix,num,prefix);
        c.indent++;
        c.print ("pos",b->posr.pos);
        c.print ("q",b->q,4);
        c.print ("lvel",b->lvel);
        c.print ("avel",b->avel);
        c.print ("mass",b->mass.mass);
        fprintf (file,"\tI = {{");
        for (int i=0; i<3; i++) {
            for (int j=0; j<3; j++) {
                c.printReal (b->mass.I[i*4+j]);
                if (j < 2) fputc (',',file);
            }
            if (i < 2) fprintf (file,"},{");
        }
        fprintf (file,"}},\n");
        c.printNonzero ("com",b->mass.c);
        c.print ("ODE = {");
        c.indent++;
        if (b->flags & dxBodyFlagFiniteRotation) c.print ("finite_rotation",1);
        if (b->flags & dxBodyDisabled) c.print ("disabled",1);
        if (b->flags & dxBodyNoGravity) c.print ("no_gravity",1);
        if (b->flags & dxBodyAutoDisable) {
            c.print ("auto_disable = {");
            c.indent++;
            c.print ("linear_threshold",b->adis.linear_average_threshold);
            c.print ("angular_threshold",b->adis.angular_average_threshold);
            c.print ("average_samples",(int)b->adis.average_samples);
            c.print ("idle_time",b->adis.idle_time);
            c.print ("idle_steps",b->adis.idle_steps);
            c.print ("time_left",b->adis_timeleft);
            c.print ("steps_left",b->adis_stepsleft);
            c.indent--;
            c.print ("},");
        }
        c.printNonzero ("facc",b->facc);
        c.printNonzero ("tacc",b->tacc);
        if (b->flags & dxBodyFlagFiniteRotationAxis) {
            c.print ("finite_rotation_axis",b->finite_rot_axis);
        }
        c.indent--;
        c.print ("},");
        if (b->geom) {
            c.print ("geometry = {");
            c.indent++;
            for (dxGeom *g=b->geom; g; g=g->body_next) {
                c.print ("{");
                c.indent++;
                printGeom (c,g);
                c.indent--;
                c.print ("},");
            }
            c.indent--;
            c.print ("},");
        }
        c.indent--;
        c.print ("}");
        num++;
    }

    // joints
    num = 0;
    fprintf (file,"%sjoint = {}\n",prefix);
    for (dxJoint *j=w->firstjoint; j; j=(dxJoint*)j->next) {
        c.indent++;
        const char *name = getJointName (j);
        fprintf (file,
            "%sjoint[%d] = dynamics.%s_joint {\n"
            "\tworld = %sworld,\n"
            "\tbody = {"
            ,prefix,num,name,prefix);

        if ( j->node[0].body )
            fprintf (file,"%sbody[%d]",prefix,j->node[0].body->tag);
        if ( j->node[1].body )
            fprintf (file,",%sbody[%d]",prefix,j->node[1].body->tag);
        fprintf (file,"}\n");

        switch (j->type()) {
            case dJointTypeBall: printBall (c,j); break;
            case dJointTypeHinge: printHinge (c,j); break;
            case dJointTypeSlider: printSlider (c,j); break;
            case dJointTypeContact: printContact (c,j); break;
            case dJointTypeUniversal: printUniversal (c,j); break;
            case dJointTypeHinge2: printHinge2 (c,j); break;
            case dJointTypeFixed: printFixed (c,j); break;
            case dJointTypeAMotor: printAMotor (c,j); break;
            case dJointTypeLMotor: printLMotor (c,j); break;
            case dJointTypePR: printPR (c,j); break;
            case dJointTypePU: printPU (c,j); break;
            case dJointTypePiston: printPiston (c,j); break;
            default: c.print("unknown joint");
        }
        c.indent--;
        c.print ("}");
        num++;
    }
}
Example #3
0
void Debugger::updateUI()
{
	pthread_mutex_lock(&printingMutex);
	if ((screen.isActive() && state == dsRunning) || state == dsStopped)
	{
		if (wSelectedLineFollowsFlow)
		{
			wSelectedLine = findLine(flow);
		}

		// *** Printing code ***

		if (activeWindow == dawCode)
		{
			screen.SelectForeColor(0, 0, 0);
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectForeColor(192, 192, 192);
			screen.SelectBackColor(96, 96, 96);
		}
		printFixed(0, topSpace - 1, L" Code ", screen.getFrameBufferWidth());

		int code_lines = screen.getFrameBufferHeight() - topSpace;
		int up = code_lines / 2;
		int down = code_lines - up - 2;

		int prev_addr = 0;
		for (int i = down; i >= -up; i--)
		{
			int index = wSelectedLine/*findLine(flow)*/ + i;

			int y = topSpace + up + i;

			{
				int colorsCount = 0;
				int bgR = 0, bgG = 0, bgB = 0;
				int fgR = 0, fgG = 0, fgB = 0;

				if (i == 0)	// this line is selected now
				{
					bgR += 192; bgG += 192; bgB += 192;
					colorsCount++;
				}

				for (unsigned int i = 1; i < flowLayers.size(); i++)
				{
					int p = flowLayers.size() - i;
					if (entries[index].memPos == flowLayers[i].lastFlow)
					{
						bgR += 255 / pow(2.0, p);
						bgG += 192 / pow(2.0, p);
						bgB += 64 / pow(2.0, p);
						colorsCount ++;
					}
				}

				if (index == findLine(flow)) // flow is here
				{
					bgR += 255; bgG += 192; bgB += 64;
					colorsCount++;
				}

				if (findBreakpointAt(entries[index].memPos) != breakpoints.end()) // flow is here
				{
					bgR += 192; bgG += 32; bgB += 32;
					colorsCount++;
				}

				if (colorsCount > 0)
				{
					bgR /= colorsCount; bgG /= colorsCount; bgB /= colorsCount;
				}

				if (bgR < 64 && bgG < 64 && bgB < 64)
				{
					fgR = 128; fgG = 128; fgB = 128;
				}
				else
				{
					fgR = 0; fgG = 0; fgB = 0;
				}

				screen.SelectForeColor(fgR, fgG, fgB);
				screen.SelectBackColor(bgR, bgG, bgB);
			}

			wstringstream strs;
			if (index >= 0 && index < (int)entries.size() && entries[index].memPos != prev_addr)
			{
				strs << std::setw(8) << setfill(L'0') << std::hex << uppercase << entries[index].memPos << L" ";
				prev_addr = entries[index].memPos;
			}
			else
			{
				strs << L"         ";
			}
			printFixed(1, y, strs.str().c_str(), 9);


			{
				int colorsCount = 0;
				int bgR = 0, bgG = 0, bgB = 0;
				int fgR = 0, fgG = 0, fgB = 0;

				if (i == 0)	// this line is selected now
				{
					bgR += 192; bgG += 192; bgB += 192;
					colorsCount ++;
				}

				for (unsigned int i = 1; i < flowLayers.size(); i++)
				{
					int p = flowLayers.size() - i;
					if (entries[index].memPos == flowLayers[i].lastFlow)
					{
						bgR += 255 / pow(2.0, p);
						bgG += 192 / pow(2.0, p);
						bgB += 64 / pow(2.0, p);
						colorsCount ++;
					}
				}

				if (index == findLine(flow)) // flow is here
				{
					bgR += 255; bgG += 192; bgB += 64;
					colorsCount++;
				}

				if (findBreakpointAt(entries[index].memPos) != breakpoints.end()) // flow is here
				{
					bgR += 192; bgG += 32; bgB += 32;
					colorsCount++;
				}

				if (colorsCount > 0)
				{
					bgR /= colorsCount; bgG /= colorsCount; bgB /= colorsCount;
				}

				if (bgR < 64 && bgG < 64 && bgB < 64)
				{
					fgR = 192; fgG = 192; fgB = 192;
				}
				else
				{
					fgR = 0; fgG = 0; fgB = 0;
				}

				screen.SelectForeColor(fgR, fgG, fgB);
				screen.SelectBackColor(bgR, bgG, bgB);
			}

			wstringstream strs2;
			if (index >= 0 && index < (int)entries.size())
			{
				//printf("0x%X: %s\n", fl->mem_pos, fl->lines.c_str());
				strs2 << entries[index].codeLine << L"\n";
			}
			else
			{
				//printf("0x%X: <<No such address in debug symbols>>\n");
				wstringstream strs2;
				strs2 << L"<< No such address in debug symbols >>\n";
			}
			printFixed(10, y, strs2.str().c_str(), screen.getFrameBufferWidth() - 11);
		}

		printMenu();


		// ** Printing stack **

		int wStackWindowWidth = 9 + 3 * wStackBytes + wStackBytes + 2;

		if (activeWindow == dawStack)
		{
			screen.SelectForeColor(0, 0, 0);
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectForeColor(192, 192, 192);
			screen.SelectBackColor(96, 96, 96);
		}
		printFixed(0, 0, L" Stack ", wStackWindowWidth);

		screen.SelectBackColor(0, 0, 0);

		for (int row = wStackTopRow; row < wStackTopRow + topSpace - 3; row++)
		{
			int stack_addr = row * wStackBytes;

			wstringstream strs;
			strs << std::setw(8) << setfill(L'0') << std::hex << uppercase << stack_addr << L" ";

			screen.SelectForeColor(128, 128, 128);
			printFixed(1, row - wStackTopRow + 1, strs.str().c_str(), 9);

			wstringstream strs2;
			wstringstream strs3;

			for (; stack_addr < (row + 1) * wStackBytes; stack_addr ++)
			{
				if (stack_addr < stackAllocatedSize)
				{
					unsigned char i1 = *((unsigned char*)(&stack[stack_addr]));

					//wstringstream strs;
					//strs << std::setw(2) << setfill(L'0') << std::hex << uppercase << i1 << " ";
					const wchar_t* hexchars = L"0123456789ABCDEF";
					wchar_t num[4];
					num[3] = 0;
					num[2] = L' ';
					num[1] = hexchars[i1 % 16];
					num[0] = hexchars[i1 / 16];

					wchar_t ch[2];
					if (i1 == 0)
					{
						ch[0] = ' ';
					}
					else
					{
						ch[0] = i1;
					}
					ch[1] = 0;

					screen.SelectForeColor(192, 192, 192);

					strs2 << num;
					strs3 << ch;
					//printFixed(9 + 1 + 3 * (stack_addr % wStackBytes), row - wStackTopRow + 1, num, 3);
					//printFixed(9 + 1 + wStackBytes * 3 + (stack_addr % wStackBytes), row - wStackTopRow + 1, ch, 1);

				}
				else
				{
					strs2 << L"   ";
					strs3 << L" ";

					//printFixed(9 + 1 + 3 * (stack_addr % wStackBytes), row - wStackTopRow + 1, L"   ", 3);
					//printFixed(9 + 1 + wStackBytes * 3 + (stack_addr % wStackBytes), row - wStackTopRow + 1, L" ", 1);
				}
			}

			strs2 << strs3.str();
			printFixed(9 + 1, row - wStackTopRow + 1, strs2.str().c_str(), wStackWindowWidth - 9);
		}

		// ** Printing heap **

		int wHeapWindowWidth = 2 + 9 + 3 * wHeapBytes + wHeapBytes;

		if (activeWindow == dawHeap)
		{
			screen.SelectForeColor(0, 0, 0);
			screen.SelectBackColor(192, 192, 192);
		}
		else
		{
			screen.SelectForeColor(192, 192, 192);
			screen.SelectBackColor(96, 96, 96);
		}
		printFixed(wStackWindowWidth + 2, 0, L" Heap ", wHeapWindowWidth);

		screen.SelectBackColor(0, 0, 0);

		for (int row = wHeapTopRow; row < wHeapTopRow + topSpace - 3; row++)
		{
			int heap_addr = row * wHeapBytes;

			wstringstream strs;
			strs << L" " << std::setw(8) << setfill(L'0') << std::hex << uppercase << heap_addr << L" ";

			screen.SelectForeColor(128, 128, 128);
			printFixed(wStackWindowWidth + 2, row - wHeapTopRow + 1, strs.str().c_str(), 9);

			wstringstream strs2;
			wstringstream strs3;

			for (; heap_addr < (row + 1) * wHeapBytes; heap_addr ++)
			{
				if (heap_addr < heapSize)
				{
					unsigned char i1 = *((unsigned char*)(&heap[heap_addr]));
					//wstringstream strs;
					//strs << std::setw(2) << setfill(L'0') << std::hex << uppercase << i1 << " ";
					const wchar_t* hexchars = L"0123456789ABCDEF";
					wchar_t num[4];
					num[3] = 0;
					num[2] = L' ';
					num[1] = hexchars[(i1 / 0x1)  & 0xF];
					num[0] = hexchars[(i1 / 0x10) & 0xF] ;

					wchar_t ch[2];
					if (i1 == 0)
					{
						ch[0] = ' ';
					}
					else
					{
						ch[0] = i1;
					}
					ch[1] = 0;

					screen.SelectForeColor(192, 192, 192);

					strs2 << num;
					strs3 << ch;
					//printFixed(wStackWindowWidth + 3 + 9 + 3 * (heap_addr % wHeapBytes), row - wHeapTopRow + 1, num, 3);
					//printFixed(wStackWindowWidth + 3 + 9 + wHeapBytes * 3 + (heap_addr % wHeapBytes), row - wStackTopRow + 1, ch, 1);
				}
				else
				{
					strs2 << L"   ";
					strs3 << L" ";
					//printFixed(wStackWindowWidth + 3 + 9 + 3 * (heap_addr % wHeapBytes), row - wHeapTopRow + 1, L"   ", 3);
					//printFixed(wStackWindowWidth + 3 + 9 + wHeapBytes * 3 + (heap_addr % wHeapBytes), row - wStackTopRow + 1, L" ", 1);
				}
			}

			strs2 << strs3.str();
			printFixed(wStackWindowWidth + 3 + 9, row - wHeapTopRow + 1, strs2.str().c_str(), wHeapWindowWidth - 9);
		}

	}
	pthread_mutex_unlock(&printingMutex);
}