fix: prevent OLED sleep duration truncation (#834)

OLED sleep settings are stored as seconds, but the kvm_system reader parsed the value into a uint8_t before assigning it to the uint16_t state field. Values above 255 seconds wrapped, so 5 min, 10 min, 30 min, and 1 hour did not behave as selected.

Parse the setting into a uint16_t-sized temporary value and terminate the read buffer before atoi so all configured durations up to 3600 seconds are preserved.

Closes #826
This commit is contained in:
肆月
2026-07-22 17:46:39 +08:00
committed by GitHub
parent 5b0a7d2a91
commit 70f8503cbb

View File

@@ -492,26 +492,30 @@ void oled_auto_sleep_time_update(void)
void oled_auto_sleep(void) void oled_auto_sleep(void)
{ {
uint8_t tmp8; uint16_t tmp16;
uint8_t sleep_close_signal = 0; uint8_t sleep_close_signal = 0;
FILE *fp; FILE *fp;
int file_size; int file_size;
uint8_t RW_Data[10]; char RW_Data[10] = {0};
if(access("/etc/kvm/oled_sleep", F_OK) == 0){ if(access("/etc/kvm/oled_sleep", F_OK) == 0){
fp = fopen("/etc/kvm/oled_sleep", "r"); fp = fopen("/etc/kvm/oled_sleep", "r");
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
file_size = ftell(fp); file_size = ftell(fp);
fseek(fp, 0, SEEK_SET); fseek(fp, 0, SEEK_SET);
if(file_size >= (int)sizeof(RW_Data)){
file_size = sizeof(RW_Data) - 1;
}
fread(RW_Data, sizeof(char), file_size, fp); fread(RW_Data, sizeof(char), file_size, fp);
RW_Data[file_size] = '\0';
fclose(fp); fclose(fp);
if(file_size != 0){ if(file_size != 0){
tmp8 = atoi((char*)RW_Data); tmp16 = atoi(RW_Data);
} else { } else {
tmp8 = OLED_SLEEP_DELAY_DEFAULT; tmp16 = OLED_SLEEP_DELAY_DEFAULT;
} }
if(tmp8 != kvm_oled_state.oled_sleep_param){ if(tmp16 != kvm_oled_state.oled_sleep_param){
// printf("/etc/kvm/oled_sleep = %d\n", tmp8); // printf("/etc/kvm/oled_sleep = %d\n", tmp16);
kvm_oled_state.oled_sleep_param = tmp8; kvm_oled_state.oled_sleep_param = tmp16;
if(kvm_oled_state.oled_sleep_param < OLED_SLEEP_DELAY_MIN){ if(kvm_oled_state.oled_sleep_param < OLED_SLEEP_DELAY_MIN){
sleep_close_signal = 1; sleep_close_signal = 1;
} else { } else {
@@ -552,4 +556,4 @@ void kvm_show_UE(void)
// OLED_ShowString_AlignRight(AlignRightEND_P, 3, " FPS", 4); // OLED_ShowString_AlignRight(AlignRightEND_P, 3, " FPS", 4);
// kvm_init_pcie_ui(); // kvm_init_pcie_ui();
} }
} }