ONDD command line calculator

by Hajime Yamasaki Vukelic

HTML

<form id="sat-settings">
    <p>
        <label for="lnb">LNB type</label>
        <select id="lnb">
            <option value="u">Universal</option>
            <option value="k">NA Ku</option>
            <option value="c">C-band</option>
        </select>
        <span class="hint">Ku LNBs are only used in North America</span>
    </p>
    <p>
        <label for="freq">Transponder frequency (MHz)</label>
        <input type="numeric" required id="freq"/>
        <span class="hint">e.g., 11471</span>
    </p>
    <p>
        <label for="symb">Symbol rate (kbauds)</label>
        <input type="numeric" required id="symb"/>
        <span class="hint">eg., 27500</span>
    </p>
    <p>
        <label for="pol">Polarisation</label>
        <select id="pol">
            <option value="V">Vertical</option>
            <option value="H">Horizontal</option>
        </select>
    </p>
    <p>
        <button>Calcualte ONDD commandline</button>
    </p>
</form>

<input type="text" id="out"></input>

CSS

body {
    font-family: Arial, sans-serif;
    background: #eee;
    color: #333;
}

button {
    box-sizing: border-box;
    width: 280px;
    background: #5577aa;
    border: 1px solid #5577aa;
    cursor: pointer;
    color: #eee;
    font-size: 18px;
    padding: 0.5em 1em;
    border-radius: 3px;
}

label {
    display: block;
    font-weight: bold;
    font-size: 18px;
    line-height: 140%;
    cursor: pointer;
    color: #5577aa;
}

.hint {
    color: grey;
    font-style: italic;
    display: block;
}

input[type="text"], 
input[type="numeric"],
select {
    box-sizing: border-box;
    font-size: 120%;
    width: 280px;
    border: 1px solid grey;
    padding: 0.5em;
}

output {
    border: 1px solid grey;
    background: white;
    color: #333;
    width: 280px;
    box-sizing: border-box;
}

JavaScript

// Constants

var UN_SW = 11700;    // high-low switch frequency for Universal
var UN_HOFF = 10600;  // Universal high band offset
var UN_LOFF = 9750;   // Universal low band offset
var KU_OFF = 10750;   // Ku LNB offset
var C_OFF = 5150;  // C LNB offset
var KU = 'k';  // Ku band LNB
var UN = 'u';  // Universal LNB
var C = 'c';  // C-band LNB

// Stash selectors
var satForm = $('#sat-settings');
var output = $('#out');

// Business

satForm.on('submit', function(e) {
    var data, onddCmd;
    e.preventDefault();
    data = getFormValue(satForm);
    onddCmd = buildCmd(data.lnb, data.freq, data.symb, data.pol);
    output.val(onddCmd);
});

// Helpers

function getValue(frm, name) {
    return frm.find('#' + name).val();
}


function getNumeric(s) {
    return /(\d+)/.exec(s).slice(1).join('');  
}

function getFormValue(frm) {
    var data = {};
    ['lnb', 'freq', 'symb', 'pol'].forEach(function(k) {
        data[k] = getValue(frm, k);
    });
    data.freq = parseInt(getNumeric(data.freq), 10);
    data.symb = parseInt(getNumeric(data.symb), 10);
    return data;
}

function needsTone(lnbType, freq) {
    if (lnbType === KU || lnbType === C) {
        return false;
    }
    if (freq >= UN_SW) {
        return true;
    }
    return false;
}

function lFreq(lnbType, freq) {
    if (lnbType === KU) {
        return freq - KU_OFF;
    }
    if (lnbType === C) {
        return Math.abs(freq - C_OFF);
    }
    if (freq >= UN_SW) {
        return freq - UN_HOFF;
    }
    return freq - UN_LOFF;
}

function buildCmd(lnbType, freq, symb, pol) {
    var lf = lFreq(lnbType, freq);
    var tone = needsTone(lnbType, freq);
    var cmd = '/usr/sbin/ondd';
    
    cmd += ' -f ' + lf;
    cmd += ' -s ' + symb;
    cmd += ' -p ' + pol;
    if (tone) {
        cmd += ' -t';
    }
    cmd += ' -o /tmp/downloads';
    return cmd;
}