mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-09 22:56:35 +00:00
boot: implement battery icon drawing functions
This commit is contained in:
parent
cccef3b85c
commit
72377c2345
8 changed files with 198 additions and 5 deletions
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "boot",
|
||||
"title_id": "0x0100000000000005",
|
||||
"main_thread_stack_size": "0x1000",
|
||||
"main_thread_stack_size": "0x8000",
|
||||
"main_thread_priority": 27,
|
||||
"default_cpu_id": 3,
|
||||
"process_category": 1,
|
||||
|
|
34
stratosphere/boot/source/boot_battery_icon_charging.hpp
Normal file
34
stratosphere/boot/source/boot_battery_icon_charging.hpp
Normal file
File diff suppressed because one or more lines are too long
34
stratosphere/boot/source/boot_battery_icon_charging_red.hpp
Normal file
34
stratosphere/boot/source/boot_battery_icon_charging_red.hpp
Normal file
File diff suppressed because one or more lines are too long
28
stratosphere/boot/source/boot_battery_icon_low.hpp
Normal file
28
stratosphere/boot/source/boot_battery_icon_low.hpp
Normal file
File diff suppressed because one or more lines are too long
83
stratosphere/boot/source/boot_battery_icons.cpp
Normal file
83
stratosphere/boot/source/boot_battery_icons.cpp
Normal file
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2019 Atmosphère-NX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "boot_functions.hpp"
|
||||
#include "boot_battery_icon_low.hpp"
|
||||
#include "boot_battery_icon_charging.hpp"
|
||||
#include "boot_battery_icon_charging_red.hpp"
|
||||
|
||||
void Boot::ShowLowBatteryIcon() {
|
||||
Boot::InitializeDisplay();
|
||||
{
|
||||
/* Low battery icon is shown for 5 seconds. */
|
||||
Boot::ShowDisplay(LowBatteryX, LowBatteryY, LowBatteryW, LowBatteryH, LowBattery);
|
||||
svcSleepThread(5'000'000'000ul);
|
||||
}
|
||||
Boot::FinalizeDisplay();
|
||||
}
|
||||
|
||||
static void FillBatteryMeter(u32 *icon, const size_t icon_w, const size_t icon_h, const size_t meter_x, const size_t meter_y, const size_t meter_w, const size_t meter_h, const size_t fill_w) {
|
||||
const size_t fill_x = meter_x + meter_w - fill_w;
|
||||
|
||||
if (fill_x + fill_w > icon_w || meter_y + meter_h > icon_h || fill_x == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
u32 *cur_row = icon + meter_y * icon_w + fill_x;
|
||||
for (size_t y = 0; y < meter_h; y++) {
|
||||
/* Make last column of meter identical to first column of meter. */
|
||||
cur_row[-1] = icon[(meter_y + y) * icon_w + meter_x];
|
||||
|
||||
/* Black out further pixels. */
|
||||
for (size_t x = 0; x < fill_w; x++) {
|
||||
cur_row[x] = 0xFF000000;
|
||||
}
|
||||
cur_row += icon_w;
|
||||
}
|
||||
}
|
||||
|
||||
void Boot::StartShowChargingIcon(size_t battery_percentage, bool wait) {
|
||||
const bool is_red = battery_percentage <= 15;
|
||||
|
||||
const size_t IconX = is_red ? ChargingRedBatteryX : ChargingBatteryX;
|
||||
const size_t IconY = is_red ? ChargingRedBatteryY : ChargingBatteryY;
|
||||
const size_t IconW = is_red ? ChargingRedBatteryW : ChargingBatteryW;
|
||||
const size_t IconH = is_red ? ChargingRedBatteryH : ChargingBatteryH;
|
||||
const size_t IconMeterX = is_red ? ChargingRedBatteryMeterX : ChargingBatteryMeterX;
|
||||
const size_t IconMeterY = is_red ? ChargingRedBatteryMeterY : ChargingBatteryMeterY;
|
||||
const size_t IconMeterW = is_red ? ChargingRedBatteryMeterW : ChargingBatteryMeterW;
|
||||
const size_t IconMeterH = is_red ? ChargingRedBatteryMeterH : ChargingBatteryMeterH;
|
||||
const size_t MeterFillW = static_cast<size_t>(IconMeterW * (1.0 - (0.0404 + 0.0096 * battery_percentage)) + 0.5);
|
||||
|
||||
/* Create stack buffer, copy icon into it, draw fill meter, draw. */
|
||||
{
|
||||
u32 Icon[IconW * IconH];
|
||||
std::memcpy(Icon, is_red ? ChargingRedBattery : ChargingBattery, sizeof(Icon));
|
||||
FillBatteryMeter(Icon, IconW, IconH, IconMeterX, IconMeterY, IconMeterW, IconMeterH, MeterFillW);
|
||||
|
||||
Boot::InitializeDisplay();
|
||||
Boot::ShowDisplay(IconX, IconY, IconW, IconH, Icon);
|
||||
}
|
||||
|
||||
/* Wait for 2 seconds if we're supposed to. */
|
||||
if (wait) {
|
||||
svcSleepThread(2'000'000'000ul);
|
||||
}
|
||||
}
|
||||
|
||||
void Boot::EndShowChargingIcon() {
|
||||
Boot::FinalizeDisplay();
|
||||
}
|
|
@ -154,10 +154,7 @@ static void InitializeFrameBuffer() {
|
|||
} else {
|
||||
const uintptr_t frame_buffer_aligned = ((reinterpret_cast<uintptr_t>(g_frame_buffer_storage) + DeviceAddressSpaceAlignMask) & ~uintptr_t(DeviceAddressSpaceAlignMask));
|
||||
g_frame_buffer = reinterpret_cast<u32 *>(frame_buffer_aligned);
|
||||
for (size_t i = 0; i < FrameBufferSize / sizeof(u32); i++) {
|
||||
g_frame_buffer[i] = 0xFF0000FF;
|
||||
}
|
||||
//std::memset(g_frame_buffer, 0xCC, FrameBufferSize);
|
||||
std::memset(g_frame_buffer, 0x00, FrameBufferSize);
|
||||
armDCacheFlush(g_frame_buffer, FrameBufferSize);
|
||||
|
||||
constexpr u64 DeviceName_DC = 2;
|
||||
|
|
|
@ -74,6 +74,11 @@ class Boot {
|
|||
static void ShowDisplay(size_t x, size_t y, size_t width, size_t height, const u32 *img);
|
||||
static void FinalizeDisplay();
|
||||
|
||||
/* Battery Display utilities. */
|
||||
static void ShowLowBatteryIcon();
|
||||
static void StartShowChargingIcon(size_t battery_percentage, bool wait);
|
||||
static void EndShowChargingIcon();
|
||||
|
||||
/* Calibration utilities. */
|
||||
static u16 GetCrc16(const void *data, size_t size);
|
||||
static u32 GetBatteryVersion();
|
||||
|
|
|
@ -133,6 +133,18 @@ int main(int argc, char **argv)
|
|||
|
||||
Boot::SetInitialClockConfiguration();
|
||||
|
||||
Boot::ShowLowBatteryIcon();
|
||||
|
||||
Boot::StartShowChargingIcon(0, true);
|
||||
Boot::EndShowChargingIcon();
|
||||
|
||||
Boot::StartShowChargingIcon(15, true);
|
||||
Boot::EndShowChargingIcon();
|
||||
|
||||
Boot::StartShowChargingIcon(100, true);
|
||||
Boot::EndShowChargingIcon();
|
||||
while (1) { }
|
||||
|
||||
/* TODO: CheckAndRepairBootImages(); */
|
||||
|
||||
/* Tell PM to start boot2. */
|
||||
|
|
Loading…
Reference in a new issue