diff --git a/data_src/index.html b/data_src/index.html index d44984476ab0624284db1748bfcd6878c8f9ab73..55930d2ab26b5792c6ae8aab48f19e43b895a0c6 100644 --- a/data_src/index.html +++ b/data_src/index.html @@ -24,6 +24,9 @@ </h5> <div class="card-body text-center"> + <div class="row mb-3 px-3"> + <div id="colorpicker" class="d-flex justify-content-center"></div> + </div> <div class="row mb-3 px-3"> <label for="rangeBrightness" class="col-form-label">Brightness</label> <input type="range" class="form-range rangeSetting" id="rangeBrightness" data-name="brightness" min="1" @@ -44,8 +47,10 @@ <div class="card-footer text-body-secondary py-3"> <div class="row"> <div class="col-6"> - <button type="button" class="btn btn-sm btn-success btnAction me-1" data-action="loadSettings" disabled>Load</button> - <button type="button" class="btn btn-sm btn-success btnAction" data-action="saveSettings" disabled>Save</button> + <button type="button" class="btn btn-sm btn-success btnAction me-1" data-action="loadSettings" + disabled>Load</button> + <button type="button" class="btn btn-sm btn-success btnAction" data-action="saveSettings" + disabled>Save</button> </div> <div class="col-6 text-end"> <button type="button" class="btn btn-sm btn-outline-secondary me-1" data-bs-toggle="collapse" @@ -92,6 +97,8 @@ <script src="https://cdn.jsdelivr.net/gh/jbloemendal/jquery-simple-websocket@master/dist/jquery.simple.websocket.min.js" crossorigin="anonymous"></script> + <script src="https://cdn.jsdelivr.net/npm/@jaames/iro@5.5.2/dist/iro.min.js" + integrity="sha256-XQju26ya9yEvX99+M2rrLah6xHsjZIGK1LvX/L3RjQ0=" crossorigin="anonymous"></script> <script src="main.js"></script> </body> diff --git a/data_src/main.js b/data_src/main.js index fe3f97b492c1afa1af45181da71b74b264686ecd..58eaac2edfe42f5a2dec9e220f95db4932dda6ec 100644 --- a/data_src/main.js +++ b/data_src/main.js @@ -3,11 +3,21 @@ var wsUrl = 'ws://' + document.location.host + '/ws'; var settings = { brightness: 0, interval: 0, + color: { + r: 255, + g: 255, + b: 255, + } }; -$(document).ready(function () { - uiEnabled(false); - $("#wsMessages, #prompt").val(""); +var uiEnabled = false; + +$(document).ready(function() { + enabledUI(false); + $("#wsMessages, #prompt").val(""); +}); + +$(window).on('load', function () { startSocket(); }); @@ -23,10 +33,20 @@ $(document).on('change', '.rangeSetting', function () { break; } settings[setting] = value; - var payload = { - 'settings': settings - }; - wsSend(payload); + 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 () { @@ -42,15 +62,17 @@ $("#prompt").on('keydown', function (e) { } }); -function uiEnabled(enabled) { - if (enabled) { +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; } } @@ -60,6 +82,16 @@ function addMessage(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)); @@ -74,19 +106,19 @@ function startSocket() { url: wsUrl, timeout: 5000, onOpen: function (e) { - ws.isConnected(function (connected) { + if (ws.isConnected()) { console.log("WS: connected"); addMessage("✅ connected"); sendAction('getSettings'); - }); + } }, onClose: function (e) { - uiEnabled(false); + enabledUI(false); console.log("WS: disconnected"); addMessage("❌ disconnected"); }, onError: function (e) { - uiEnabled(false); + enabledUI(false); console.log("WS: error"); addMessage("❗️ error"); }, @@ -110,7 +142,8 @@ function sendAction(action) { function loadSettings(data) { settings.brightness = data.brightness; settings.interval = data.interval; - uiEnabled(true); + 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'); diff --git a/src/display.cpp b/src/display.cpp index c30d059b68468cd2a40ca2cacb166afebe8e2e0f..217b2988afecc58a78dba5c38e0920700d08c733 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -14,7 +14,8 @@ const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE); // see http://docs const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE); const uint8_t kIndexedLayerOptions = (SM_INDEXED_OPTIONS_NONE); -rgb24 colorWhite = {0xff, 0xff, 0xff}; +rgb24 gameColor = {colorR, colorG, colorB}; +rgb24 textColor = {255, 255, 255}; SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions); SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions); @@ -27,6 +28,7 @@ void setupDisplay() matrix.begin(); matrix.setBrightness(defaultBrightness); indexedLayer.setFont(font3x5); + indexedLayer.setIndexedColor(1, textColor); backgroundLayer.setBrightness(255); backgroundLayer.enableColorCorrection(true); } @@ -42,7 +44,7 @@ void displayLoop() { if (g[i][j]) { - backgroundLayer.drawPixel(j, i, colorWhite); + backgroundLayer.drawPixel(j, i, gameColor); } } } @@ -83,6 +85,13 @@ void gameBrightness(int brightness) backgroundLayer.setBrightness(brightness); } +void setGameColor(uint8_t r, uint8_t g, uint8_t b) +{ + gameColor.red = r; + gameColor.green = g; + gameColor.blue = b; +} + void clearDisplay() { indexedLayer.fillScreen(0); diff --git a/src/display.h b/src/display.h index 52ccbe387c588de310becfeee9665476b8409879..a0a17cdef1acef55742bc8cd264bf6249a908cd3 100644 --- a/src/display.h +++ b/src/display.h @@ -8,6 +8,9 @@ extern bool runGame; extern int defaultBrightness; extern int gameEra; +extern uint8_t colorR; +extern uint8_t colorG; +extern uint8_t colorB; void setupDisplay(); void displayLoop(); @@ -15,6 +18,7 @@ void showEndScreen(int ticks); void showMessage(char* msg); void displayBrightness(int brightness); void gameBrightness(int brightness); +void setGameColor(uint8_t r, uint8_t g, uint8_t b); void clearDisplay(); #endif diff --git a/src/main.cpp b/src/main.cpp index 6ed2e4151c8971546339f7105ca9f23f12a84129..5dcbb6582d31a4b7590b47563130a7975bd854c8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,6 +7,9 @@ int defaultBrightness; int gameInterval; +uint8_t colorR; +uint8_t colorG; +uint8_t colorB; unsigned long lastTick; @@ -17,7 +20,6 @@ void showTitle() { showMessage(msg); } - void setup() { Serial.begin(115200); diff --git a/src/network.cpp b/src/network.cpp index cdbc9b0f6b637397c8a74d8af0cb1cd54548b1f5..5f78cd8bf8edd2edf9b0fa27805854785ca1e9e3 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -266,7 +266,11 @@ void updateSettings(StaticJsonDocument<200U> doc) { gameInterval = doc["settings"]["interval"]; defaultBrightness = doc["settings"]["brightness"]; + colorR = doc["settings"]["color"]["r"]; + colorG = doc["settings"]["color"]["g"], + colorB = doc["settings"]["color"]["b"]; displayBrightness(defaultBrightness); + setGameColor(colorR, colorG, colorB); } void sendSettings() @@ -275,6 +279,10 @@ void sendSettings() JsonObject settings = doc.createNestedObject("settings"); settings["brightness"] = defaultBrightness; settings["interval"] = gameInterval; + JsonObject color = settings.createNestedObject("color"); + color["r"] = colorR; + color["g"] = colorG; + color["b"] = colorB; size_t strsize = measureJson(doc) + 1; char json[strsize]; serializeJson(doc, json, strsize); diff --git a/src/settings.cpp b/src/settings.cpp index a7c7875d9001e8c6189d0cfa522cd7a9f1ee85aa..697212fbab3dcd6e8bcd4db9e5658fc12f9d4d6e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -8,14 +8,21 @@ void loadSettings() { preferences.begin("settings", true); // true = readonly defaultBrightness = preferences.getUInt("brightness", 50); gameInterval = preferences.getUInt("interval", 100); + colorR = preferences.getUInt("color_r", 255); + colorG = preferences.getUInt("color_g", 255); + colorB = preferences.getUInt("color_b", 255); preferences.end(); displayBrightness(defaultBrightness); + setGameColor(colorR, colorG, colorB); } void saveSettings() { preferences.begin("settings", false); preferences.putUInt("brightness", defaultBrightness); preferences.putUInt("interval", gameInterval); + preferences.putUInt("color_r", colorR); + preferences.putUInt("color_g", colorG); + preferences.putUInt("color_b", colorB); preferences.end(); } diff --git a/src/settings.h b/src/settings.h index 05a0964a8b8edbcfb8c7ea033b0a0f6f888d0926..b70038f8a8cdbf235c51012bf4d2f61187e83f0a 100644 --- a/src/settings.h +++ b/src/settings.h @@ -7,6 +7,9 @@ extern int defaultBrightness; extern int gameInterval; +extern uint8_t colorR; +extern uint8_t colorG; +extern uint8_t colorB; typedef struct { int games;