TODO: added vehicle parameters & general device / openpilot / drive information

pull/4/head
Florian Brede 2021-05-30 03:06:27 +02:00
parent 094e9c2790
commit 61f2f8ecd5
2 changed files with 100 additions and 6 deletions

View File

@ -406,11 +406,24 @@ router.get('/useradmin/device/:dongleId', runAsyncWrapper(async (req, res) => {
response += `<b>Drives (non-preserved drives expire ` + config.deviceDriveExpirationDays + ` days after upload):</b><br>
<table border=1 cellpadding=2 cellspacing=2>
<tr><th>identifier</th><th>filesize</th><th>duration</th><th>distance_meters</th><th>upload_complete</th><th>is_processed</th><th>upload_date</th><th>actions</th></tr>
<tr><th>identifier</th><th>car</th><th>version</th><th>filesize</th><th>duration</th><th>distance_meters</th><th>upload_complete</th><th>is_processed</th><th>upload_date</th><th>actions</th></tr>
`;
for (var i in drives) {
response += '<tr><td><a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '">' + (drives[i].is_preserved ? '<b>' : '') + drives[i].identifier + (drives[i].is_preserved ? '</b>' : '') + '</a></td><td>' + Math.round(drives[i].filesize / 1024) + ' MiB</td><td>' + controllers.helpers.formatDuration(drives[i].duration) + '</td><td>' + Math.round(drives[i].distance_meters / 1000) + ' km</td><td>' + drives[i].upload_complete + '</td><td>' + drives[i].is_processed + '</td><td>' + controllers.helpers.formatDate(drives[i].created) + '</td><td>' + '[<a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '/delete" onclick="return confirm(\'Permanently delete this drive?\')">delete</a>]' + (drives[i].is_preserved ? '' : '&nbsp;&nbsp;[<a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '/preserve">preserve</a>]') + '</tr>';
let vehicle="";
let version="";
let metadata={};
try {
metadata=JSON.parse(drives[i].metadata);
if (metadata['InitData']!=undefined && metadata['InitData']['Version']!=undefined)
version = htmlspecialchars(metadata['InitData']['Version']);
if (metadata['CarParams']!=undefined && metadata['CarParams']['CarName']!=undefined)
vehicle += htmlspecialchars(metadata['CarParams']['CarName'].toUpperCase())+" ";
if (metadata['CarParams']!=undefined && metadata['CarParams']['CarFingerprint']!=undefined)
vehicle += htmlspecialchars(metadata['CarParams']['CarFingerprint'].toUpperCase());
} catch (exception) {}
response += '<tr><td><a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '">' + (drives[i].is_preserved ? '<b>' : '') + drives[i].identifier + (drives[i].is_preserved ? '</b>' : '') + '</a></td><td>'+vehicle+'</td><td>'+version+'</td><td>' + Math.round(drives[i].filesize / 1024) + ' MiB</td><td>' + controllers.helpers.formatDuration(drives[i].duration) + '</td><td>' + Math.round(drives[i].distance_meters / 1000) + ' km</td><td>' + drives[i].upload_complete + '</td><td>' + drives[i].is_processed + '</td><td>' + controllers.helpers.formatDate(drives[i].created) + '</td><td>' + '[<a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '/delete" onclick="return confirm(\'Permanently delete this drive?\')">delete</a>]' + (drives[i].is_preserved ? '' : '&nbsp;&nbsp;[<a href="/useradmin/drive/' + drives[i].dongle_id + '/' + drives[i].identifier + '/preserve">preserve</a>]') + '</tr>';
}
response += `</table>
<br>
@ -499,6 +512,29 @@ router.get('/useradmin/drive/:dongleId/:driveIdentifier', runAsyncWrapper(async
cabanaUrl = config.cabanaUrl + '?retropilotIdentifier=' + device.dongle_id + '|' + dongleIdHash + '|' + drive.identifier + '|' + driveIdentifierHash + '&retropilotHost=' + encodeURIComponent(config.baseUrl) + '&demo=1"';
}
let vehicle="";
let version="";
let gitRemote="";
let gitBranch="";
let gitCommit="";
let metadata={};
try {
metadata=JSON.parse(drive.metadata);
if (metadata['InitData']!=undefined && metadata['InitData']['Version']!=undefined)
version = htmlspecialchars(metadata['InitData']['Version']);
if (metadata['InitData']!=undefined && metadata['InitData']['GitRemote']!=undefined)
gitRemote = htmlspecialchars(metadata['InitData']['GitRemote']);
if (metadata['InitData']!=undefined && metadata['InitData']['GitBranch']!=undefined)
gitBranch = htmlspecialchars(metadata['InitData']['GitBranch']);
if (metadata['InitData']!=undefined && metadata['InitData']['GitCommit']!=undefined)
gitCommit = htmlspecialchars(metadata['InitData']['GitCommit']);
if (metadata['CarParams']!=undefined && metadata['CarParams']['CarName']!=undefined)
vehicle += htmlspecialchars(metadata['CarParams']['CarName'].toUpperCase())+" ";
if (metadata['CarParams']!=undefined && metadata['CarParams']['CarFingerprint']!=undefined)
vehicle += htmlspecialchars(metadata['CarParams']['CarFingerprint'].toUpperCase());
} catch (exception) {}
const directoryTree = dirTree(config.storagePath + device.dongle_id + "/" + dongleIdHash + "/" + driveIdentifierHash + "/" + drive.identifier);
@ -507,7 +543,12 @@ router.get('/useradmin/drive/:dongleId/:driveIdentifier', runAsyncWrapper(async
<a href="/useradmin/device/` + device.dongle_id + `">< < < Back To Device ` + device.dongle_id + `</a>
<br><br><h3>Drive ` + drive.identifier + ` on ` + drive.dongle_id + `</h3>
<b>Drive Date:</b> ` + controllers.helpers.formatDate(drive.drive_date) + `<br>
<b>Upload Date:</b> ` + controllers.helpers.formatDate(drive.created) + `<br>
<b>Upload Date:</b> ` + controllers.helpers.formatDate(drive.created) + `<br><br>
<b>Vehicle:</b> ` + vehicle + `<br>
<b>Openpilot Version:</b> ` + version + `<br><br>
<b>GIT Remote:</b> ` + gitRemote + `<br>
<b>GIT Branch:</b> ` + gitBranch + `<br>
<b>GIT Commit:</b> ` + gitCommit + `<br><br>
<b>Num Segments:</b> ` + (drive.max_segment + 1) + `<br>
<b>Storage:</b> ` + Math.round(drive.filesize / 1024) + ` MiB<br>
<b>Duration:</b> ` + controllers.helpers.formatDuration(drive.duration) + `<br>
@ -515,6 +556,22 @@ router.get('/useradmin/drive/:dongleId/:driveIdentifier', runAsyncWrapper(async
<b>Is Preserved:</b> ` + drive.is_preserved + `<br>
<b>Upload Complete:</b> ` + drive.upload_complete + `<br>
<b>Processed:</b> ` + drive.is_processed + `<br>
<br>
<b>Car Parameters:</b>
<a id="show-button" href="#" onclick="
document.getElementById('hide-button').style.display = 'inline';
document.getElementById('show-button').style.display = 'none';
document.getElementById('car-parameter-div').style.display = 'block';
return false;">Show</a>
<a id="hide-button" style="display: none;" href="#" onclick="
document.getElementById('hide-button').style.display = 'none';
document.getElementById('show-button').style.display = 'inline';
document.getElementById('car-parameter-div').style.display = 'none';
return false;">Hide</a>
<br><pre id="car-parameter-div" style="display: none; font-size: 0.8em">` + JSON.stringify(metadata['CarParams']!=undefined ? metadata['CarParams'] : {}, null, 2).replace(/\r?\n|\r/g, "<br>") + `</pre>
<br>
<br><br>
` + (cabanaUrl ? '<a href="' + cabanaUrl + '" target=_blank><b>View Drive in CABANA</b></a><br><br>' : '') + `
<b>Files:</b><br>

View File

@ -194,6 +194,9 @@ var segmentProcessQueue=[];
var segmentProcessPosition=0;
var affectedDrives={};
var affectedDriveInitData={};
var affectedDriveCarParams={};
var affectedDevices={};
@ -218,6 +221,8 @@ function processSegmentRLog(rLogPath) {
rlog_prevLatExternal=-1000;
rlog_prevLngExternal=-1000;
rlog_totalDistExternal = 0;
rlog_CarParams=null;
rlog_InitData=null;
return new Promise(
function(resolve, reject) {
@ -287,6 +292,14 @@ function processSegmentRLog(rLogPath) {
rlog_prevLngExternal=obj['GpsLocationExternal']['Longitude'];
rlog_lastTsExternal = obj['LogMonoTime'];
}
else if (obj['LogMonoTime']!==undefined && obj['CarParams']!==undefined && rlog_CarParams==null) {
rlog_CarParams = obj['CarParams'];
logger.info("SET CAR PARAMS TO: "+rlog_CarParams);
}
else if (obj['LogMonoTime']!==undefined && obj['InitData']!==undefined && rlog_InitData==null) {
rlog_InitData = obj['InitData'];
}
} catch(exception) {
}
@ -337,6 +350,11 @@ function processSegmentsRecursive() {
segment.id
);
affectedDrives[driveIdentifier]=true;
if (rlog_CarParams!=null)
affectedDriveCarParams[driveIdentifier]=rlog_CarParams;
if (rlog_InitData!=null)
affectedDriveInitData[driveIdentifier]=rlog_InitData;
segmentProcessPosition++;
setTimeout(function() {processSegmentsRecursive();}, 0);
})();
@ -349,6 +367,8 @@ async function updateSegments() {
segmentProcessQueue=[];
segmentProcessPosition=0;
affectedDrives={};
affectedDriveCarParams={};
affectedDriveInitData={};
const drive_segments = await db.all('SELECT * FROM drive_segments WHERE upload_complete = ? AND is_stalled = ? ORDER BY created ASC', false, false);
for (var t=0; t<drive_segments.length; t++) {
@ -397,7 +417,7 @@ async function updateSegments() {
}
if (segmentProcessQueue.length>=50) // we process at most 50 segments per batch
if (segmentProcessQueue.length>=1) // we process at most 50 segments per batch
break;
}
@ -471,11 +491,28 @@ async function updateDrives() {
}
catch (exception) {}
}
let metadata = {};
try {
metadata = JSON.parse(drive.metadata);
} catch (exception) {logger.error(exception);}
if (metadata==null) metadata={};
console.log(affectedDriveInitData);
if (affectedDriveInitData[key]!=undefined && metadata['InitData']==undefined) {
metadata['InitData']=affectedDriveInitData[key];
logger.info("updateDrives drive "+dongleId+" "+driveIdentifier+" InitData: "+metadata['InitData']);
}
if (affectedDriveCarParams[key]!=undefined && metadata['CarParams']==undefined) {
metadata['CarParams']=affectedDriveCarParams[key];
logger.info("updateDrives drive "+dongleId+" "+driveIdentifier+" CarParams: "+metadata['CarParams']);
}
logger.info("updateDrives drive "+dongleId+" "+driveIdentifier+" uploadComplete: "+uploadComplete);
const driveResult = await db.run(
'UPDATE drives SET distance_meters = ?, duration = ?, upload_complete = ?, is_processed = ?, filesize = ? WHERE id = ?',
Math.round(totalDistanceMeters), totalDurationSeconds, uploadComplete, isProcessed, filesize, drive.id);
'UPDATE drives SET distance_meters = ?, duration = ?, upload_complete = ?, is_processed = ?, filesize = ?, metadata = ? WHERE id = ?',
Math.round(totalDistanceMeters), totalDurationSeconds, uploadComplete, isProcessed, filesize, JSON.stringify(metadata), drive.id);
affectedDevices[dongleId]=true;