mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-18 16:32:05 +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",
|
"name": "boot",
|
||||||
"title_id": "0x0100000000000005",
|
"title_id": "0x0100000000000005",
|
||||||
"main_thread_stack_size": "0x1000",
|
"main_thread_stack_size": "0x8000",
|
||||||
"main_thread_priority": 27,
|
"main_thread_priority": 27,
|
||||||
"default_cpu_id": 3,
|
"default_cpu_id": 3,
|
||||||
"process_category": 1,
|
"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 {
|
} else {
|
||||||
const uintptr_t frame_buffer_aligned = ((reinterpret_cast<uintptr_t>(g_frame_buffer_storage) + DeviceAddressSpaceAlignMask) & ~uintptr_t(DeviceAddressSpaceAlignMask));
|
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);
|
g_frame_buffer = reinterpret_cast<u32 *>(frame_buffer_aligned);
|
||||||
for (size_t i = 0; i < FrameBufferSize / sizeof(u32); i++) {
|
std::memset(g_frame_buffer, 0x00, FrameBufferSize);
|
||||||
g_frame_buffer[i] = 0xFF0000FF;
|
|
||||||
}
|
|
||||||
//std::memset(g_frame_buffer, 0xCC, FrameBufferSize);
|
|
||||||
armDCacheFlush(g_frame_buffer, FrameBufferSize);
|
armDCacheFlush(g_frame_buffer, FrameBufferSize);
|
||||||
|
|
||||||
constexpr u64 DeviceName_DC = 2;
|
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 ShowDisplay(size_t x, size_t y, size_t width, size_t height, const u32 *img);
|
||||||
static void FinalizeDisplay();
|
static void FinalizeDisplay();
|
||||||
|
|
||||||
|
/* Battery Display utilities. */
|
||||||
|
static void ShowLowBatteryIcon();
|
||||||
|
static void StartShowChargingIcon(size_t battery_percentage, bool wait);
|
||||||
|
static void EndShowChargingIcon();
|
||||||
|
|
||||||
/* Calibration utilities. */
|
/* Calibration utilities. */
|
||||||
static u16 GetCrc16(const void *data, size_t size);
|
static u16 GetCrc16(const void *data, size_t size);
|
||||||
static u32 GetBatteryVersion();
|
static u32 GetBatteryVersion();
|
||||||
|
|
|
@ -133,6 +133,18 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Boot::SetInitialClockConfiguration();
|
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(); */
|
/* TODO: CheckAndRepairBootImages(); */
|
||||||
|
|
||||||
/* Tell PM to start boot2. */
|
/* Tell PM to start boot2. */
|
||||||
|
|
Loading…
Reference in a new issue