From 1c479a28759da252bc7dc23c5dd64483d9a0dafa Mon Sep 17 00:00:00 2001 From: Brod8362 Date: Tue, 28 Feb 2023 16:21:03 -0600 Subject: [PATCH] Add sim status window background and make it pretty Instead of drawing just circles use a background image to show status symbols what the respective status means (not just the color of the dots). Furthermore draw a rectangle for the battery status instead of bubbles. --- img/sim_background.bmp | Bin 0 -> 230538 bytes img/sim_background.xcf | Bin 0 -> 12689 bytes main.cpp | 70 ++++++++++++++++++++++++++++++----------- 3 files changed, 52 insertions(+), 18 deletions(-) create mode 100644 img/sim_background.bmp create mode 100644 img/sim_background.xcf diff --git a/img/sim_background.bmp b/img/sim_background.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9fe59049da17fcb276e4e2949265917698160ea7 GIT binary patch literal 230538 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 9c61966..7a04302 100644 --- a/main.cpp +++ b/main.cpp @@ -426,6 +426,16 @@ public: init_NRF_WDT(); init_NRF_POWER(); + // Attempt to load background PNG for the status display window + SDL_Surface* simDisplayBgRaw = SDL_LoadBMP("img/sim_background.bmp"); + if (simDisplayBgRaw == NULL) { + printf("Failed to load sim background image: %s\n", SDL_GetError()); + } else { + // convert the loaded image into a texture + simDisplayTexture = SDL_CreateTextureFromSurface(renderer, simDisplayBgRaw); + SDL_FreeSurface(simDisplayBgRaw); + simDisplayBgRaw = NULL; + } motorController.Init(); settingsController.Init(); @@ -444,6 +454,9 @@ public: // Destructor ~Framework(){ + if (simDisplayTexture != NULL) { + SDL_DestroyTexture(simDisplayTexture); + } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); @@ -486,6 +499,8 @@ public: } void refresh() { + // left edge for all "bubbles" (circles) + constexpr const int bubbleLeftEdge = 65; // always refresh the LVGL screen this->refresh_screen(); @@ -494,9 +509,13 @@ public: } SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); + // Render the background if it was able to be loaded + if (simDisplayTexture != NULL) { + SDL_RenderCopy(renderer, simDisplayTexture, NULL, NULL); + } { // motorController.motor_is_running - constexpr const int center_x = 45; - constexpr const int center_y = 15; + constexpr const int center_x = bubbleLeftEdge; + constexpr const int center_y = 216; bool motor_is_running = nrf_gpio_pin_read(Pinetime::PinMap::Motor); if (motor_is_running) { draw_circle_red(center_x, center_y, 15); @@ -505,8 +524,8 @@ public: } } { // ble.motor_is_running - constexpr const int center_x = 75; - constexpr const int center_y = 15; + constexpr const int center_x = bubbleLeftEdge; + constexpr const int center_y = 24; if (bleController.IsConnected()) { draw_circle_blue(center_x, center_y, 15); } else { @@ -514,18 +533,31 @@ public: } } // batteryController.percentRemaining - for (uint8_t percent=0; percent<=10; percent++) { - const int center_x = 15+15*percent; - const int center_y = 60; - if (batteryController.percentRemaining < percent*10) { - draw_circle_grey(center_x, center_y, 15); - } else { - draw_circle_green(center_x, center_y, 15); - } + { + const int center_x = bubbleLeftEdge; + const int center_y = 164; + const int max_bar_length = 150; + const int filled_bar_length = max_bar_length * (batteryController.percentRemaining/100.0); + const int rect_height = 14; + SDL_Rect rect { + .x = center_x - rect_height/2, + .y = center_y, + .w = max_bar_length, + .h = rect_height + }; + SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255); + SDL_RenderDrawRect(renderer, &rect); + + rect.w = filled_bar_length; + rect.h++; + rect.h-=2; + SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); + SDL_RenderFillRect(renderer, &rect); + //set color and new x pos, draw again } { // batteryController.isCharging - constexpr const int center_x = 15; - constexpr const int center_y = 90; + constexpr const int center_x = bubbleLeftEdge; + constexpr const int center_y = 120; if (batteryController.isCharging) { draw_circle_yellow(center_x, center_y, 15); } else @@ -534,7 +566,7 @@ public: } } { // brightnessController.Level - constexpr const int center_y = 15; + constexpr const int center_y = 72; const Pinetime::Controllers::BrightnessController::Levels level = brightnessController.Level(); uint8_t level_idx = 0; if (level == Pinetime::Controllers::BrightnessController::Levels::Low) @@ -548,11 +580,12 @@ public: level_idx = 3; } for (uint8_t i=0; i<4; i++) { - const int center_x = 115+15*i; + const int bubble_size = (i*2) + 5; + const int center_x = bubbleLeftEdge + ((bubble_size+10) * i) - 5; if (i <= level_idx) { - draw_circle_white(center_x, center_y, 15); + draw_circle_white(center_x, center_y, bubble_size); } else { - draw_circle_grey(center_x, center_y, 15); + draw_circle_grey(center_x, center_y, bubble_size); } } } @@ -943,6 +976,7 @@ private: int width; // Width of the window SDL_Renderer *renderer = NULL; // Pointer for the renderer SDL_Window *window = NULL; // Pointer for the window + SDL_Texture* simDisplayTexture = NULL; // Background for the sim status window bool left_release_sent = true; // make sure to send one mouse button release event bool right_last_state = false; // varable used to send message only on changing state