Function listing and selection.

This commit is contained in:
Ben Vanik
2013-12-22 02:59:42 -08:00
parent a631ada0f7
commit 4ecdfed46f
16 changed files with 314 additions and 65 deletions

View File

@@ -156,21 +156,36 @@ body {
right: 0;
bottom: 0;
padding: 5px;
overflow: scroll;
overflow-x: auto;
overflow-y: scroll;
}
.debugger-fnlist-list > table > tbody > tr > td {
padding: 0;
line-height: 1.2em;
font-family: monospace;
border: 0;
}
.debugger-fnlist-footer {
order: 3;
flex: 0 0 auto;
padding: 5px;
}
.debugger-fnview {
.debugger-fnview-outer {
order: 2;
flex: 1 1 auto;
display: flex;
flex-flow: column nowrap;
position: relative;
border-left: 2px solid #ddd;
border-right: 2px solid #ddd;
}
.debugger-fnview {
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
display: flex;
flex-flow: column nowrap;
}
.debugger-fnview-header {
order: 1;
flex: 0 0 auto;

View File

@@ -1,75 +1,35 @@
<div class="debugger-main" ng-controller="CodeTabController">
<div class="debugger-header">
debug header/toolbar/etc
<div ui-view></div>
</div>
<div class="debugger-body">
<div class="debugger-fnlist">
<div class="debugger-fnlist-header">
<div class="btn-group btn-group-xs full-width">
<button type="button" class="btn btn-default dropdown-toggle full-width" data-toggle="dropdown">
module_name.xex <span class="caret"></span>
{{selectedModule.name}} <span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#">module 1</a></li>
<li><a href="#">module 2</a></li>
<li ng-repeat="module in moduleList"><a href="" ng-click="selectModule(module)">{{module.name}}</a></li>
</ul>
</div>
</div>
<div class="debugger-fnlist-body">
<div class="debugger-fnlist-list">
fn<br/>fn<br/>fn
<table class="table table-hover">
<tr ng-repeat="fn in functionList | filter:functionFilter | orderBy:'address'">
<td><a ui-sref="session.code.function({module: selectedModule.name, function: (fn.address | hex32)})">{{fn.name}}</a></td>
</tr>
</table>
</div>
</div>
<div class="debugger-fnlist-footer">
<div class="input-group input-group-sm">
<span class="input-group-addon">@</span>
<input type="text" class="form-control" placeholder="Filter">
<input type="text" class="form-control" placeholder="Filter" ng-model="functionFilter" ui-escape="functionFilter = ''">
</div>
</div>
</div>
<div class="debugger-fnview">
<div class="debugger-fnview-header">
<div class="debugger-fnview-header-left">
<span class="debugger-fnview-header-name">function name</span>
<span class="debugger-fnview-header-address">(0x80000000-0x80000000)</span>
</div>
<div class="debugger-fnview-header-right">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default" ng-model="radioModel" btn-radio="'PPC'">PPC</button>
<button type="button" class="btn btn-default" ng-model="radioModel" btn-radio="'HIR'">HIR</button>
<button type="button" class="btn btn-default" ng-model="radioModel" btn-radio="'LIR'">LIR</button>
</div>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default">1</button>
<button type="button" class="btn btn-default">2</button>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
Dropdown
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#">Dropdown link</a></li>
<li><a href="#">Dropdown link</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="debugger-fnview-body">
<div class="debugger-fnview-codeview">
<textarea class="debugger-fnview-textarea"></textarea>
</div>
<div class="debugger-fnview-graphview">
graph!
</div>
</div>
<div class="debugger-fnview-footer">
footer
</div>
</div>
<div class="debugger-fnview-outer" ui-view></div>
<div class="debugger-tools">
<div class="debugger-tools-threads">
<div class="btn-group btn-group-xs full-width">

View File

@@ -17,16 +17,42 @@ var module = angular.module('xe.ui.code', [
module.controller('CodeTabController', function(
$rootScope, $scope, app, log) {
$scope.moduleList = [];
$scope.selectedModule = null;
$scope.functionList = [];
$rootScope.$on('refresh', function() {
var dataSource = app.session.dataSource;
dataSource.getModuleList().then(function(list) {
console.log(list);
$scope.moduleList = list;
if (!$scope.selectedModule) {
if (list.length) {
$scope.selectModule(list[0]);
}
} else {
$scope.selectModule($scope.selectedModule);
}
}, function(e) {
log('Unable to fetch module list');
log.error('Unable to fetch module list');
});
console.log('refresh');
});
$scope.selectModule = function(module) {
var moduleChange = module != $scope.selectedModule;
$scope.selectedModule = module;
if (moduleChange) {
$scope.functionList = [];
}
var dataSource = app.session.dataSource;
dataSource.getFunctionList(module.name).then(function(list) {
$scope.functionList = list;
}, function(e) {
log.error('Unable to fetch function list');
});
};
});

View File

@@ -1,2 +1,43 @@
TODO: function
<div ui-view></div>
<div class="debugger-fnview" ng-controller="FunctionViewController">
<div class="debugger-fnview-header">
<div class="debugger-fnview-header-left">
<span class="debugger-fnview-header-name" ng-bind="fn.name"></span>
<span class="debugger-fnview-header-address">(0x{{fn.startAddress | hex32}}-0x{{fn.endAddress | hex32}})</span>
</div>
<div class="debugger-fnview-header-right">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default" ng-model="codeType" btn-radio="'ppc'">PPC</button>
<button type="button" class="btn btn-default" ng-model="codeType" btn-radio="'hir'">HIR</button>
<button type="button" class="btn btn-default" ng-model="codeType" btn-radio="'lir'">LIR</button>
</div>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default">1</button>
<button type="button" class="btn btn-default">2</button>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
Dropdown
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#">Dropdown link</a></li>
<li><a href="#">Dropdown link</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="debugger-fnview-body">
<div ui-view></div>
<div class="debugger-fnview-codeview">
<textarea class="debugger-fnview-textarea"></textarea>
</div>
<div class="debugger-fnview-graphview">
graph!
</div>
</div>
<div class="debugger-fnview-footer">
footer
</div>
</div>

View File

@@ -0,0 +1,33 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2013 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
'use strict';
var module = angular.module('xe.ui.code.functionView', [
'xe.log',
'xe.session'
]);
module.controller('FunctionViewController', function(
$rootScope, $scope, app, log) {
$scope.codeType = 'ppc';
function refresh() {
var dataSource = app.session.dataSource;
dataSource.getFunction($scope.functionAddress).then(function(fn) {
$scope.fn = fn;
}, function(e) {
log.error('Unable to fetch function');
});
};
$rootScope.$on('refresh', refresh);
$scope.$watch('functionAddress', refresh);
});

View File

@@ -26,12 +26,14 @@
<script src="src/app.js"></script>
<script src="src/datasources.js"></script>
<script src="src/directives.js"></script>
<script src="src/filters.js"></script>
<script src="src/log.js"></script>
<script src="src/router.js"></script>
<script src="src/session.js"></script>
<script src="assets/ui/navbar.js"></script>
<script src="assets/ui/console/console.js"></script>
<script src="assets/ui/code/code-tab.js"></script>
<script src="assets/ui/code/function-view.js"></script>
<script src="debugger.js"></script>
</body>

View File

@@ -14,10 +14,12 @@ var module = angular.module('app', [
'ui.router',
'xe.datasources',
'xe.directives',
'xe.filters',
'xe.log',
'xe.router',
'xe.session',
'xe.ui.code',
'xe.ui.code.functionView',
'xe.ui.console',
'xe.ui.navbar'
]);

View File

@@ -63,17 +63,17 @@ module.service('DataSource', function($q) {
});
};
DataSource.prototype.getModule = function(moduleId) {
DataSource.prototype.getModule = function(moduleName) {
return this.issue({
command: 'cpu.get_module',
moduleId: moduleId
module: moduleName
});
};
DataSource.prototype.getFunctionList = function(moduleId) {
DataSource.prototype.getFunctionList = function(moduleName) {
return this.issue({
command: 'cpu.get_function_list',
moduleId: moduleId
module: moduleName
});
};

View File

@@ -24,3 +24,17 @@ module.directive('uiEnter', function() {
});
};
});
module.directive('uiEscape', function() {
return function($scope, element, attrs) {
element.bind("keydown keypress", function(e) {
if(e.which === 27) {
$scope.$apply(function(){
$scope.$eval(attrs.uiEscape);
});
e.preventDefault();
}
});
};
});

23
debugger/src/filters.js Normal file
View File

@@ -0,0 +1,23 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2013 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
'use strict';
var module = angular.module('xe.filters', []);
module.filter("hex32", function() {
return function(number) {
if (number !== null && number !== undefined) {
var str = "" + number.toString(16).toUpperCase();
while (str.length < 8) str = "0" + str;
return str;
}
};
});

View File

@@ -26,7 +26,7 @@ module.config(function($stateProvider, $urlRouterProvider) {
templateUrl: 'assets/ui/session.html',
resolve: {
app: 'app',
session: function($stateParams, $urlRouter, $state, $q, $timeout,
session: function($stateParams, $state, $q,
Session, app) {
// If we are given a session we assume the user is trying to connect to
// it. Attempt that now. If we fail we redirect to home, otherwise we
@@ -100,7 +100,11 @@ module.config(function($stateProvider, $urlRouterProvider) {
$stateProvider.state('session.code.function', {
url: '/:module/:function',
templateUrl: 'assets/ui/code/function-view.html',
controller: function($stateParams) {
controller: function($scope, $stateParams) {
$scope.moduleName = $stateParams.module;
$scope.functionAddress = parseInt($stateParams.function, 16);
$scope.$emit('xxx');
$scope.$broadcast('yyy');
},
onEnter: function() {},
onExit: function() {}