Skip to content
Snippets Groups Projects
Select Git revision
  • 75ec938ae3198c47a648d1ed5f5e99d329362f84
  • master default protected
2 results

main.js

Blame
  • main.js 4.88 KiB
    var wsUrl = 'ws://' + document.location.host + '/ws';
    
    var settings = {
        brightness: 0,
        interval: 0,
        color: {
            r: 255,
            g: 255,
            b: 255,
        }
    };
    
    var highscores = {};
    
    var uiEnabled = false;
    
    $(document).ready(function() {
        enabledUI(false);
        $("#wsMessages, #prompt").val("");    
    });
    
    $(window).on('load', function () {
        startSocket();
    });
    
    $(document).on('change', '.rangeSetting', function () {
        var setting = $(this).data('name');
        var value = $(this).val();
        switch (setting) {
            case 'brightness':
                value = mapRange(value, 1, 100, 8, 255);
                break;
            case 'interval':
                value = mapRange(value, 1, 100, 1000, 10);
                break;
        }
        settings[setting] = value;
        sendSettings();
    });
    
    var colorPicker = new iro.ColorPicker('#colorpicker', {
        layout: [
            {
                component: iro.ui.Wheel,
            }
        ]
    });    
    
    colorPicker.on('input:end', function (color) {
        settings.color = color.rgb;
        sendSettings();
    });
    
    $('.btnAction').on('click', function () {
        var action = $(this).data('action');
        sendAction(action);
    });
    
    $("#prompt").on('keydown', function (e) {
        if (e.keyCode == 13 && $("#prompt").val() != "") {
            var val = $("#prompt").val();
            wsSend(JSON.parse(val));
            $("#prompt").val("");
        }
    });
    
    function enabledUI(enable) {
        if (enable) {
            $('#spinner').addClass('invisible');
            $('.btnAction').prop('disabled', false);
            $('.rangeSetting').prop('disabled', false);
            uiEnabled = true;
        } else {
            $('#spinner').removeClass('invisible');
            $('.btnAction').prop('disabled', true);
            $('.rangeSetting').prop('disabled', true);
            uiEnabled = false;
        }
    }
    
    function addMessage(msg) {
        var txt = $("#wsMessages");
        txt.val($.trim(txt.val() + "\n" + msg));
        txt.scrollTop(txt[0].scrollHeight - txt.height());
    }
    
    function sendSettings() {
        if (!uiEnabled) {
            return;
        }
        var payload = {
            'settings': settings
        };
        wsSend(payload);
    }
    
    function wsSend(obj) {
        ws.send(obj).done(function () {
            addMessage("➡️ " + JSON.stringify(obj));
        }).fail(function (e) {
            addMessage("❗️ " + JSON.stringify(obj));
        });
    }
    
    var ws;
    function startSocket() {
        ws = $.simpleWebSocket({
            url: wsUrl,
            timeout: 5000,
            onOpen: function (e) {
                if (ws.isConnected()) {
                    console.log("WS: connected");
                    addMessage("✅ connected");
                    sendAction('getSettings');
                }
            },
            onClose: function (e) {
                enabledUI(false);
                console.log("WS: disconnected");
                addMessage("❌ disconnected");
            },
            onError: function (e) {
                enabledUI(false);
                console.log("WS: error");
                addMessage("❗️ error");
            },
        });
    
        ws.listen(function (data) {
            addMessage("⬅️ " + JSON.stringify(data));
            if (data.settings) {
                loadSettings(data.settings);
            } else if (data.highscores) {
                updateHighscore(data.highscores);
            } else if (data.stats) {
                updateStats(data.stats);
            }
    
        });
    }
    
    function sendAction(action) {
        var payload = {
            'action': action
        };
        wsSend(payload);
    }
    
    function loadSettings(data) {
        settings.brightness = data.brightness;
        settings.interval = data.interval;
        colorPicker.color.rgb = data.color;
        enabledUI(true);
        $('#rangeBrightness').val(mapRange(data.brightness, 8, 255, 1, 100));
        $('#rangeSpeed').val(mapRange(data.interval, 1000, 10, 1, 100));
        sendAction('getHighscores');
    }
    
    function updateHighscore(hs) {
        highscores = hs;
        $('#hsGames').find('.progress-bar').text(hs.games);
        $('#hsTicks').find('.progress-bar').text(hs.ticks);
        $('#hsCells').find('.progress-bar').text(hs.cells);
    }
    
    function updateStats(lg) {
        var lastGameWidth = 100 / (highscores.games / lg.game);
        var lastTicksWidth = 100 / (highscores.ticks / lg.ticks);
        var lastCellsWidth = 100 / (highscores.cells / lg.cells);
        var hsGamesWidth = (1 - (lg.game / highscores.games)) * 100;
        var hsTicksWidth = (1 - (lg.ticks / highscores.ticks)) * 100;
        var hsCellsWidth = (1 - (lg.cells / highscores.cells)) * 100;
        $('#hsGames').css('width', hsGamesWidth+'%');
        $('#lastGame').css('width', lastGameWidth+'%');
        $('#lastGame').find('.progress-bar').text(lg.game);
        $('#hsTicks').css('width', hsTicksWidth+'%');
        $('#lastTicks').css('width', lastTicksWidth+'%');
        $('#lastTicks').find('.progress-bar').text(lg.ticks);
        $('#hsCells').css('width', hsCellsWidth+'%');
        $('#lastCells').css('width', lastCellsWidth+'%');
        $('#lastCells').find('.progress-bar').text(lg.cells);
    }
    
    function mapRange(number, inMin, inMax, outMin, outMax) {
        return Math.round((number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin);
    }