pull/153/head
openbuilds-engineer 2020-03-27 17:10:53 +02:00
rodzic 617725a218
commit 3def5c050c
6 zmienionych plików z 183 dodań i 99 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
v1.0.216: Internal Testing Build
v1.0.216: Internal Testing Build
v1.0.215: Fixed bug with Z Plate retract where plate is thicker than 10mm
v1.0.214: Fixed bug with Z-Zero plate probing routine, added Z Plate thickness setting back
v1.0.213: Updated Authenticode Signing certificate

Wyświetl plik

@ -578,7 +578,7 @@
</td>
<td>
<button class="button light square large jogbtn" id="yP" data-role="ripple" data-ripple-color="#5de21b">
<button class="button light square large jogbtn yP" id="yP" data-role="ripple" data-ripple-color="#5de21b">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-up fg-green" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-green" data-fa-transform="shrink-5 up-8" style="font-weight:600">Y+</span>
@ -591,7 +591,7 @@
<td>
<button class="button light square large jogbtn" id="zP" data-role="ripple" data-ripple-color="#1ba1e2">
<button class="button light square large jogbtn zP" id="zP" data-role="ripple" data-ripple-color="#1ba1e2">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-up fg-blue" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-blue" data-fa-transform="shrink-5 up-8" style="font-weight:600">Z+</span>
@ -599,7 +599,7 @@
</button>
</td>
<td class="servo-active" style="display: none;">
<button class="button light square large jogbtn" id="pP" data-role="ripple" data-ripple-color="#1ba1e2">
<button class="button light square large jogbtn pP" id="pP" data-role="ripple" data-ripple-color="#1ba1e2">
<span class="fa-layers fa-fw">
<i class="fas fa-pen fg-darkBlue" data-fa-transform="shrink-2 down-8.5"></i>
<i class="fas fa-ban fg-red" data-fa-transform="shrink-0.5 down-8.5"></i>
@ -611,7 +611,7 @@
</tr>
<tr>
<td>
<button class="button light square large jogbtn" id="xM" data-role="ripple" data-ripple-color="#e21b1b">
<button class="button light square large jogbtn xM" id="xM" data-role="ripple" data-ripple-color="#e21b1b">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-left fg-red" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-red" data-fa-transform="shrink-5 up-8" style="font-weight:600">X-</span>
@ -620,7 +620,7 @@
</td>
<td>
<button class="button light square large jogbtn" id="yM" data-role="ripple" data-ripple-color="#5de21b">
<button class="button light square large jogbtn yM" id="yM" data-role="ripple" data-ripple-color="#5de21b">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-down fg-green" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-green" data-fa-transform="shrink-5 up-8" style="font-weight:600">Y-</span>
@ -629,7 +629,7 @@
</td>
<td>
<button class="button light square large jogbtn" id="xP" data-role="ripple" data-ripple-color="#e21b1b">
<button class="button light square large jogbtn xP" id="xP" data-role="ripple" data-ripple-color="#e21b1b">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-right fg-red" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-red" data-fa-transform="shrink-5 up-8" style="font-weight:600">X+</span>
@ -637,7 +637,7 @@
</button>
</td>
<td>
<button class="button light square large jogbtn" id="zM" data-role="ripple" data-ripple-color="#1ba1e2">
<button class="button light square large jogbtn zM" id="zM" data-role="ripple" data-ripple-color="#1ba1e2">
<span class="fa-layers fa-fw">
<i class="fas fa-arrow-down fg-blue" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-blue" data-fa-transform="shrink-5 up-8" style="font-weight:600">Z-</span>
@ -645,7 +645,7 @@
</button>
</td>
<td class="servo-active" style="display: none;">
<button class="button light square large jogbtn" id="pM" data-role="ripple" data-ripple-color="#1ba1e2">
<button class="button light square large jogbtn pM" id="pM" data-role="ripple" data-ripple-color="#1ba1e2">
<span class="fa-layers fa-fw">
<i class="fas fa-pen fg-darkBlue" data-fa-transform="shrink-2 down-8.5"></i>
<span class="fa-layers-text fg-darkBlue" data-fa-transform="shrink-10 up-12" style="font-weight:600">PEN</span>
@ -1280,37 +1280,37 @@
determine endmill diameter. </small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
on the magnetic connecting clip, then click the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
</div>
<div id="probe-xyz" class="probe-tab-content">
<small>XYZ Probe Routine: This routine is used to find the XYZ origins</small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
on the magnetic connecting clip, then click the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
</div>
<div id="probe-x" class="probe-tab-content" style="display: none;">
<small>X Probe Routine: This routine is used to find the X origin</small>
<hr>
<small>Position the endmill to the left of the probe plate as shown, clip on the magnetic connecting clip,
then click Probe</small>
then click the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
</div>
<div id="probe-y" class="probe-tab-content" style="display: none;">
<small>Y Probe Routine: This routine is used to find the Y origin</small>
<hr>
<small>Position the endmill in front of the probe plate as shown, clip on the magnetic connecting clip, then
click Probe</small>
click the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
</div>
<div id="probe-z" class="probe-tab-content" style="display: none;">
<small>Z Probe Routine: This routine is used to find the Z origin</small>
<hr>
<small>Position the endmill above the probe plate as shown, clip on the magnetic connecting clip, then click
Probe</small>
the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
</div>
<div id="probe-endmill" class="probe-tab-content" style="display: none;">
<small>Endmill Probe Routine: This routine is used to find the Endmill Diameter</small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
on the magnetic connecting clip, then click the <span class="fg-cobalt">Confirm Probe Position</span> button to continue...</small>
<hr>
<small>
This operation will perform an XYZ probe to establish the plate position, then using the hole in the plate,
@ -1318,6 +1318,46 @@
any work-coordinates!
</small>
</div>
<div id="probeJogWindow">
<hr>
<table>
<tr>
<td>
&nbsp;
</td>
<td>
<button class="button success small rounded outline m-1 yP" id="yPprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#5de21b">Y+</button>
</td>
<td>
&nbsp;
</td>
<td>
<button class="button primary small rounded outline m-1 zP" id="zPprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#1ba1e2">Z+</button>
</td>
</tr>
<tr>
<td>
<button class="button alert small rounded outline m-1 xM" id="xMprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#e21b1b">X-</button>
</td>
<td>
<button class="button success small rounded outline m-1 yM" id="yMprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#5de21b">Y-</button>
</td>
<td>
<button class="button alert small rounded outline m-1 xP" id="xPprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#e21b1b">X+</button>
</td>
<td>
<button class="button primary small rounded outline m-1 zM" id="zMprobe" style="width: 40px;" data-role="ripple" data-ripple-color="#1ba1e2">Z-</button>
</td>
</tr>
<tr>
<td colspan="4">
<center>
<span class="text-small">Or use the Keyboard to Jog</span>
</center>
</td>
</tr>
</table>
</div>
<hr>
<div id="endmilldiameterform">
<label>Endmill Diameter</label>
@ -1428,27 +1468,16 @@
<li class="divider"></li>
<!-- li onclick="probetype('custom');"><a href="#">Custom</a></li -->
</ul>
<span style="padding-left: 200px;"></span>
<button class="button js-dialog-close" onclick="Metro.dialog.close('#xyzProbeWindow');">Cancel</button>
<button class="button success js-dialog-close" onclick="confirmProbeInPlace();">Probe</button>
<span style="padding-left: 50px;"></span>
<button class="button alert js-dialog-close" onclick="resetJogModeAfterProbe(); Metro.dialog.close('#xyzProbeWindow');">Cancel</button>
<button class="button primary" onclick="confirmProbeInPlace();" id="confirmNewProbeBtn">Confirm Probe Position</button>
<button class="button success js-dialog-close disabled" onclick="runProbeNew();" id="runNewProbeBtn">Probe</button>
</div>
</div>
<!-- End XYZ Probe -->
<!-- XYZ Probe confirmation -->
<div class="dialog dark" id="confirmXYZprobeModal" data-role="dialog" data-overlay-click-close="true">
<div class="dialog-title"><i class='fas fa-podcast' data-fa-transform='rotate-180'></i> Confirm Probe Hardware</div>
<div class="dialog-content" id="confirmXYZprobeDiv">
</div>
<div class="dialog-actions">
<div class="float-right">
<button class="button js-dialog-close">Cancel</button>
<button onclick="runProbeNew()" class="button success js-dialog-close">Probe</button>
</div>
</div>
</div>
<!-- end XYZ Probe confirmation -->
<!-- job completion confirmation -->

Wyświetl plik

@ -273,55 +273,67 @@ $(document).ready(function() {
sendGcode('G0 Z0');
});
$('#xM').on('click', function(ev) {
$('.xM').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('X', '-' + jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#xP').on('click', function(ev) {
$('.xP').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('X', jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#yM').on('click', function(ev) {
$('.yM').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('Y', '-' + jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#yP').on('click', function(ev) {
$('.yP').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('Y', jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#zM').on('click', function(ev) {
$('.zM').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('Z', '-' + jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#zP').on('click', function(ev) {
$('.zP').on('click', function(ev) {
if (!allowContinuousJog) {
var dir = 'X-';
var feedrate = $('#jograte').val();
jog('Z', jogdist, feedrate);
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
})
$('#xM').on('mousedown', function(ev) {
$('.xM').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "X-";
var distance = 1000;
@ -338,16 +350,16 @@ $(document).ready(function() {
var feed = $('#jograte').val();
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#xM').click();
$('.xM').click();
}
});
$('#xM').on('mouseup', function(ev) {
$('.xM').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}
});
$('#xP').on('mousedown', function(ev) {
$('.xP').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "X";
var distance = 1000;
@ -363,16 +375,16 @@ $(document).ready(function() {
var feed = $('#jograte').val();
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#xP').click();
$('.xP').click();
}
});
$('#xP').on('mouseup', function(ev) {
$('.xP').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}
});
$('#yM').on('mousedown', function(ev) {
$('.yM').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "Y-";
var distance = 1000;
@ -390,16 +402,16 @@ $(document).ready(function() {
var feed = $('#jograte').val();
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#yM').click();
$('.yM').click();
}
});
$('#yM').on('mouseup', function(ev) {
$('.yM').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}
});
$('#yP').on('mousedown', function(ev) {
$('.yP').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "Y";
var distance = 1000;
@ -420,13 +432,13 @@ $(document).ready(function() {
$('#yP').click();
}
});
$('#yP').on('mouseup', function(ev) {
$('.yP').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}
});
$('#zM').on('mousedown', function(ev) {
$('.zM').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "Z-";
var distance = 1000;
@ -444,16 +456,16 @@ $(document).ready(function() {
var feed = $('#jograte').val();
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#zM').click();
$('.zM').click();
}
});
$('#zM').on('mouseup', function(ev) {
$('.zM').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}
});
$('#zP').on('mousedown', function(ev) {
$('.zP').on('mousedown', function(ev) {
if (allowContinuousJog) { // startJog();
var direction = "Z";
var distance = 1000;
@ -471,10 +483,10 @@ $(document).ready(function() {
var feed = $('#jograte').val();
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#zP').click();
$('.zP').click();
}
});
$('#zP').on('mouseup', function(ev) {
$('.zP').on('mouseup', function(ev) {
if (allowContinuousJog) {
cancelJog()
}

Wyświetl plik

@ -104,6 +104,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#xM').click();
rippleEffect($('#xMprobe'), "#e21b1b")
}
} else {
$('#xM').click();
@ -134,6 +135,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#xP').click();
rippleEffect($('#xPprobe'), "#e21b1b")
}
} else {
$('#xP').click();
@ -167,6 +169,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#yM').click();
rippleEffect($('#yMprobe'), "#5de21b")
}
} else {
$('#yM').click();
@ -200,6 +203,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#yP').click();
rippleEffect($('#yPprobe'), "#5de21b")
}
} else {
$('#yP').click();
@ -232,6 +236,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#zM').click();
rippleEffect($('#zMprobe'), "#1ba1e2")
}
} else {
$('#zM').click();
@ -264,6 +269,7 @@ function bindKeys() {
socket.emit('runCommand', "$J=G91 G21 " + direction + distance + " F" + feed + "\n");
continuousJogRunning = true;
$('#zP').click();
rippleEffect($('#zPprobe'), "#1ba1e2")
}
} else {
$('#zP').click();

Wyświetl plik

@ -22,11 +22,6 @@ var probemode = {
y: 0,
position: "fl" // fl, fr, rl, rr, c
},
plate: {
traveldistance: 25,
thickness: 20,
feedrate: 500
},
probe: xyzprobeplate,
}
@ -159,7 +154,10 @@ function probeautotab() {
} else {
$("#toggle-probe-advanced-content").data('collapse').expand()
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probexyztab() {
@ -177,7 +175,10 @@ function probexyztab() {
} else {
$("#toggle-probe-advanced-content").data('collapse').expand()
}
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probextab() {
@ -192,6 +193,10 @@ function probextab() {
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").show();
$("#toggle-probe-advanced-content").data('collapse').collapse()
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probeytab() {
@ -206,6 +211,10 @@ function probeytab() {
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").show();
$("#toggle-probe-advanced-content").data('collapse').collapse()
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probeztab() {
@ -221,6 +230,10 @@ function probeztab() {
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').collapse()
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probezplatetab() {
@ -235,6 +248,10 @@ function probezplatetab() {
$("#toggle-probe-advanced").show();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').collapse()
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function probeendmilltab() {
@ -249,6 +266,10 @@ function probeendmilltab() {
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').collapse()
$('#runNewProbeBtn').addClass("disabled")
$('#confirmNewProbeBtn').removeClass("disabled")
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
}
function resetOffsetFL() {
@ -315,49 +336,28 @@ function probetype(type) {
}
function confirmProbeInPlace(operation) {
$('#confirmNewProbeBtn').addClass("disabled")
$('#runNewProbeBtn').removeClass("disabled").focus();
}
var imgurl = "./img/xyzprobe/xyz.png"
if (probemode.mode == "xyz") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/xyz.png"
} else if (probemode.mode == "xzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/x.png"
} else if (probemode.mode == "yzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/y.png"
} else if (probemode.mode == "zzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/z.png"
} else if (probemode.mode == "zplate") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/zplate.png"
} else if (probemode.mode == "endmilldia") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/endmill.png"
} else if (probemode.mode == "auto") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/auto.png"
function resetJogModeAfterProbe() {
if (localStorage.getItem('continuousJog')) {
if (JSON.parse(localStorage.getItem('continuousJog')) == true) {
$('#jogTypeContinuous').prop('checked', true)
allowContinuousJog = true;
$('.distbtn').hide()
} else {
$('#jogTypeContinuous').prop('checked', false)
allowContinuousJog = false;
$('.distbtn').show();
}
}
var confirmTemplate = `
<table>
<tr>
<td><img src="` + imgurl + `" height="350" class="img-probe"/>
</td>
<td style="padding: 4px; vertical-align: middle;">
<ul>
<li>Are you sure the probe plate was placed onto the front, left corner of the stock/workpiece?</li>
<li>Are you sure the probe clip is attached to the bit?</li>
<li>Are you sure you jogged the bit to the correct approximate position as shown, prior to initiating the probe?</li>
</ul>
</td>
</tr>
</table>
`
$("#confirmXYZprobeDiv").html(confirmTemplate);
setTimeout(function() {
Metro.dialog.open("#confirmXYZprobeModal")
}, 100);
$('#confirmNewProbeBtn').removeClass("disabled")
}
function runProbeNew() {
resetJogModeAfterProbe()
$("#consoletab").click()
probemode.stock.x = $("#stockwidth").val();
probemode.stock.y = $("#stocklength").val();
@ -573,4 +573,41 @@ function runProbeNew() {
});
}
}
function rippleEffect(el, color) {
var timer = null;
if (el.css('position') === 'static') {
el.css('position', 'relative');
}
el.css({
overflow: 'hidden'
});
$(".ripple").remove();
var size = Math.max(el.outerWidth(), el.outerHeight());
// Add the element
var ripple = $("<span class='ripple'></span>").css({
width: size,
height: size
});
el.prepend(ripple);
// Add the ripples CSS and start the animation
ripple.css({
background: color,
width: size,
height: size,
top: 0 + 'px',
left: 0 + 'px'
}).addClass("rippleEffect");
timer = setTimeout(function() {
timer = null;
$(".ripple").remove();
}, 400);
}

Wyświetl plik

@ -1,6 +1,6 @@
{
"name": "OpenBuildsCONTROL",
"version": "1.0.216-internal-test",
"version": "1.0.217-internal-test",
"license": "AGPL-3.0",
"description": "Machine Interface Driver for OpenBuilds",
"author": "github.com/openbuilds <webmaster@openbuilds.com>",