rockbox/firmware/target/hosted/anbernic/instant_play.c
Hairo R. Carela c9e16e4888 rgnano: Sleep timer and idle poweroff support
Actually power off the handheld with the sleep timer and idle poweroff functions instead of closing rockbox.

This commit also moves setting system volume to max from the launch script to system-sdl.c so it works when running rockbox via instant play.

Change-Id: I174b67c6abef451faa05f4a8f52b8d9eeed98a22
2025-08-15 09:44:35 -04:00

111 lines
2.8 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2025 Hairo R. Carela
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
static int get_value(const char *cmd)
{
/* Read values with the brightness/volume tools, stored in
bootloader variables */
char line[4];
int value;
char full_cmd[18];
snprintf(full_cmd, 18, "%s get", cmd);
FILE* fp = popen(full_cmd, "r");
if (fp == NULL) {
value = -1;
}
if (fgets(line, sizeof(line), fp) != NULL)
{
value = strtol(line, NULL, 10);
}
else
{
value = -1;
}
pclose(fp);
return value;
}
static void set_value(const char *cmd, const int value)
{
/* Set values with the brightness/volume tools, stored in
bootloader variables. */
char full_cmd[22];
snprintf(full_cmd, 22, "%s set %d", cmd, value);
system(full_cmd);
}
void ip_reset_values(void)
{
/* Use the brightness/volume tools to reset to their previous
values before launching rockbox */
int volume_level = get_value("volume");
if (volume_level > -1)
{
set_value("volume", volume_level);
}
int brightness_level = get_value("brightness");
if (brightness_level > -1)
{
set_value("brightness", brightness_level);
}
}
void ip_power_off(void)
{
/* Stop the powerdown countdown */
system("powerdown handle");
/* Write the instant_play file */
char buf[60];
size_t nbytes;
int fd;
fd = open("/mnt/instant_play", O_WRONLY | O_CREAT, 0640);
strcpy(buf, "'/opk/rockbox' &\npid record $!\nwait $!\npid erase\n");
nbytes = strlen(buf);
write(fd, buf, nbytes);
close(fd);
/* Powerdown the handheld after writting the file */
system("powerdown now");
}
void ip_handle_sigusr1(int sig)
{
if (sig == SIGUSR1)
{
ip_power_off();
}
}