mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-09-11 00:22:56 -05:00
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:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user