diff --git a/.gitignore b/.gitignore index 32e76575e..8cfc62075 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store .vscode/ *.o +/documents/ /design/ /src/**/*.log /build/ diff --git a/src/storyTeller/app_autosleep.h b/src/storyTeller/app_autosleep.h index 21fc95ebd..9bdf489f4 100644 --- a/src/storyTeller/app_autosleep.h +++ b/src/storyTeller/app_autosleep.h @@ -5,11 +5,12 @@ #include "system/display.h" -#define AUTOSLEEP_INACTIVE_TIME_SCREEN_ON 30 -#define AUTOSLEEP_INACTIVE_TIME_SCREEN_OFF 180 +#include "./app_parameters.h" static bool autosleepLocked = false; static long int autosleepTime = 0; +static int autosleepTimeScreenOn = 0; +static int autosleepTimeScreenOff = 0; long int autosleep_timestamp(void) { return (long int) time(0); @@ -18,9 +19,9 @@ long int autosleep_timestamp(void) { void autosleep_keepAwake(void) { if(display_enabled) { - autosleepTime = autosleep_timestamp() + AUTOSLEEP_INACTIVE_TIME_SCREEN_ON; + autosleepTime = autosleep_timestamp() + autosleepTimeScreenOn; } else { - autosleepTime = autosleep_timestamp() + AUTOSLEEP_INACTIVE_TIME_SCREEN_OFF; + autosleepTime = autosleep_timestamp() + autosleepTimeScreenOff; } } @@ -33,18 +34,20 @@ bool autosleep_isSleepingTime(void) return false; } -void autosleep_lock() { +void autosleep_lock(void) { autosleepLocked = true; } -void autosleep_unlock() { +void autosleep_unlock(int timeScreenOn, int timeScreenOff) { + autosleepTimeScreenOn = timeScreenOn; + autosleepTimeScreenOff = timeScreenOff; autosleep_keepAwake(); autosleepLocked = false; } -void autosleep_init(void) +void autosleep_init(int timeScreenOn, int timeScreenOff) { - autosleep_keepAwake(); + autosleep_unlock(timeScreenOn, timeScreenOff); } #endif // STORYTELLER_APP_AUTOSLEEP__ \ No newline at end of file diff --git a/src/storyTeller/app_parameters.h b/src/storyTeller/app_parameters.h new file mode 100644 index 000000000..c755c50fa --- /dev/null +++ b/src/storyTeller/app_parameters.h @@ -0,0 +1,65 @@ +#ifndef STORYTELLER_APP_PARAMETERS__ +#define STORYTELLER_APP_PARAMETERS__ + +static double parametersAudioVolumeStartup = 0.3; +static double parametersAudioVolumeMax = 0.6; +static double parametersScreenBrightnessStartup = 0.3; +static double parametersScreenBrightnessMax = 0.6; +static int parametersScreenOnInactivityTime = 120; +static int parametersScreenOffInactivityTime = 300; +static int parametersMusicInactivityTime = 3600; + +#define APP_PARAMETERS_PATH "/mnt/SDCARD/Saves/.parameters" + + +int parameters_getAudioVolumeStartup() { + return (int)(parametersAudioVolumeStartup * 20 + 0.5); +} + +int parameters_getAudioVolumeMax() { + return (int)(parametersAudioVolumeMax * 20 + 0.5); +} + +int parameters_getAudioVolumeValidation(int audioVolume) { + return audioVolume > parameters_getAudioVolumeMax() ? parameters_getAudioVolumeMax() : audioVolume; +} + +int parameters_getScreenBrightnessStartup() { + return (int)(parametersScreenBrightnessStartup * 10 + 0.5); +} + +int parameters_getScreenBrightnessMax() { + return (int)(parametersScreenBrightnessMax * 10 + 0.5); +} + +int parameters_getScreenBrightnessValidation(int brightness) { + return brightness > parameters_getScreenBrightnessMax() ? parameters_getScreenBrightnessMax() : brightness; +} + +int parameters_getScreenOnInactivityTime() { + return parametersScreenOnInactivityTime; +} + +int parameters_getScreenOffInactivityTime() { + return parametersScreenOffInactivityTime; +} + +int parameters_getMusicInactivityTime() { + return parametersMusicInactivityTime; +} + +void parameters_init(void) +{ + cJSON *parameters = json_load(APP_PARAMETERS_PATH); + if(parameters != NULL) { + json_getDouble(parameters, "audioVolumeStartup", ¶metersAudioVolumeStartup); + json_getDouble(parameters, "audioVolumeMax", ¶metersAudioVolumeMax); + json_getDouble(parameters, "screenBrightnessStartup", ¶metersScreenBrightnessStartup); + json_getDouble(parameters, "screenBrightnessMax", ¶metersScreenBrightnessMax); + json_getInt(parameters, "screenOnInactivityTime", ¶metersScreenOnInactivityTime); + json_getInt(parameters, "screenOffInactivityTime", ¶metersScreenOffInactivityTime); + json_getInt(parameters, "musicInactivityTime", ¶metersMusicInactivityTime); + } +} + +#endif // STORYTELLER_APP_PARAMETERS__ \ No newline at end of file diff --git a/src/storyTeller/app_selector.h b/src/storyTeller/app_selector.h index 2b32614d3..64ec25c56 100644 --- a/src/storyTeller/app_selector.h +++ b/src/storyTeller/app_selector.h @@ -33,7 +33,7 @@ void app_refreshScreen(void) } video_displayImage(SYSTEM_RESOURCES, appImages[appIndex]); display_setScreen(true); - autosleep_unlock(); + autosleep_unlock(parameters_getScreenOnInactivityTime(), parameters_getScreenOffInactivityTime()); } void app_previous(void) diff --git a/src/storyTeller/music_player.h b/src/storyTeller/music_player.h index d4ca8fc6f..24e6daff0 100644 --- a/src/storyTeller/music_player.h +++ b/src/storyTeller/music_player.h @@ -8,6 +8,7 @@ #include "./app_autosleep.h" #include "./sdl_helper.h" +#include "./app_parameters.h" static char **musicList = NULL; static int musicCount = 0; @@ -17,6 +18,10 @@ static void (*callback_musicplayer_autoplay)(void); #define SYSTEM_RESOURCES "/mnt/SDCARD/.tmp_update/res/" #define MUSICPLAYER_RESOURCES "/mnt/SDCARD/Music/" +void musicplayer_autosleep_unlock(void) { + autosleep_unlock(parameters_getMusicInactivityTime(), parameters_getMusicInactivityTime()); +} + void musicplayer_load(void) { @@ -35,7 +40,6 @@ void musicplayer_load(void) video_displayBlackScreen(); display_setScreen(false); - autosleep_lock(); audio_play(MUSICPLAYER_RESOURCES, musicList[musicIndex], &position); Mix_HookMusicFinished(callback_musicplayer_autoplay); } @@ -59,7 +63,8 @@ void musicplayer_ok(void) void musicplayer_autoplay(void) { - musicplayer_next(); + musicIndex += 1; + musicplayer_load(); } @@ -67,11 +72,11 @@ void musicplayer_pause(void) { if(Mix_PlayingMusic() == 1) { if (Mix_PausedMusic() == 1) { - autosleep_lock(); Mix_ResumeMusic(); + musicplayer_autosleep_unlock(); } else { - autosleep_unlock(); Mix_PauseMusic(); + autosleep_lock(); } } } @@ -94,11 +99,12 @@ void musicplayer_save(void) bool musicplayer_isMp3File(const char *fileName) { - return strcmp((char *)fileName + strlen(fileName) - 4, ".mp3") == 0 || strcmp((char *)fileName + strlen(fileName) - 4, ".MP3") == 0; + return strcmp((char *)fileName + strlen(fileName) - 4, ".mp3") == 0; } void musicplayer_init(void) { + musicplayer_autosleep_unlock(); callback_musicplayer_autoplay = &musicplayer_autoplay; video_displayImage(SYSTEM_RESOURCES, "loadingMusic.png"); diff --git a/src/storyTeller/stories_reader.h b/src/storyTeller/stories_reader.h index 167fca256..b2673c795 100644 --- a/src/storyTeller/stories_reader.h +++ b/src/storyTeller/stories_reader.h @@ -12,36 +12,44 @@ #include "./app_file.h" #include "./app_autosleep.h" #include "./sdl_helper.h" +#include "./app_parameters.h" + +#define STR_DIRNAME 64 static char **storiesList = NULL; static cJSON *storyJson = NULL; static int storiesCount = 0; static int storyIndex = 0; -static int storyStageIndex = 0; -static int storyActionIndex = -1; +static char storyStageKey[STR_MAX] = {'\0'}; +static char storyActionKey[STR_MAX] = {'\0'}; static int storyActionOptionIndex = 0; static int storyActionOptionsCount = 0; static double storyTime = 0; static long int storyStartTime = 0; static bool storyAutoplay = false; +static bool storyOkAction = true; static void (*callback_stories_autoplay)(void); +static void (*callback_stories_reset)(void); #define SYSTEM_RESOURCES "/mnt/SDCARD/.tmp_update/res/" #define STORIES_RESOURCES "/mnt/SDCARD/Stories/" +void stories_autosleep_unlock(void) { + autosleep_unlock(parameters_getScreenOnInactivityTime(), parameters_getScreenOffInactivityTime()); +} + long int stories_timestamp(void) { return (long int) time(0); } -bool stories_saveSession(void) +void stories_saveSession(void) { - return file_save( + file_save( APP_SAVEFILE, - "{\"app\":%d, \"storyIndex\":%d, \"storyStageIndex\":%d, \"storyActionIndex\":%d, \"storyActionOptionIndex\":%d, \"storyTime\":%lf}", + "{\"app\":%d, \"storyIndex\":%d, \"storyActionKey\":\"%s\", \"storyActionOptionIndex\":%d, \"storyTime\":%lf}", APP_STORIES, storyIndex, - storyStageIndex, - storyActionIndex, + storyActionKey, storyActionOptionIndex, storyAutoplay ? storyTime : 0 ); @@ -49,20 +57,18 @@ bool stories_saveSession(void) bool stories_loadSession(void) { + storyStageKey[0] = '\0'; cJSON *savedState = json_load(APP_SAVEFILE); int a; if(savedState != NULL && json_getInt(savedState, "app", &a) && a == APP_STORIES) { json_getInt(savedState, "storyIndex", &storyIndex); - json_getInt(savedState, "storyStageIndex", &storyStageIndex); - json_getInt(savedState, "storyActionIndex", &storyActionIndex); + json_getString(savedState, "storyActionKey", storyActionKey); json_getInt(savedState, "storyActionOptionIndex", &storyActionOptionIndex); json_getDouble(savedState, "storyTime", &storyTime); remove(APP_SAVEFILE); return true; } - - storyStageIndex = 0; - storyActionIndex = -1; + storyActionKey[0] = '\0'; storyActionOptionIndex = 0; storyTime = 0; return false; @@ -71,28 +77,28 @@ bool stories_loadSession(void) cJSON *stories_getStage(void) { - cJSON *stageNodes = cJSON_GetObjectItem(storyJson, "stageNodes"); + cJSON *stageNodes = cJSON_GetObjectItem(storyJson, "stages"); if(stageNodes == NULL) { return NULL; } - return cJSON_GetArrayItem(stageNodes, storyStageIndex); + return cJSON_GetObjectItem(stageNodes, storyStageKey); } cJSON *stories_getAction(void) { - if(storyActionIndex == -1) { + if(storyActionKey[0] == '\0') { return NULL; } - cJSON *actionNodes = cJSON_GetObjectItem(storyJson, "actionNodes"); + cJSON *actionNodes = cJSON_GetObjectItem(storyJson, "actions"); if(actionNodes == NULL) { return NULL; } - return cJSON_GetArrayItem(actionNodes, storyActionIndex); + return cJSON_GetObjectItem(actionNodes, storyActionKey); } void stories_readStage(void) @@ -102,43 +108,37 @@ void stories_readStage(void) return; } - char story_path[STR_MAX], imageFilename[STR_MAX], soundFilename[STR_MAX]; - sprintf(story_path, "%s%s/assets/", STORIES_RESOURCES, storiesList[storyIndex]); + char story_audio_path[STR_MAX], story_image_path[STR_MAX], imageFilename[STR_MAX], soundFilename[STR_MAX]; + sprintf(story_audio_path, "%s%s/audios/", STORIES_RESOURCES, storiesList[storyIndex]); + sprintf(story_image_path, "%s%s/images/", STORIES_RESOURCES, storiesList[storyIndex]); if(!cJSON_IsNull(cJSON_GetObjectItem(stageNode, "image")) && json_getString(stageNode, "image", imageFilename)) { - video_displayImage(story_path, imageFilename); + video_displayImage(story_image_path, imageFilename); display_setScreen(true); } else { video_displayBlackScreen(); display_setScreen(false); } + storyAutoplay = false; + storyOkAction = true; + if(!cJSON_IsNull(cJSON_GetObjectItem(stageNode, "audio")) && json_getString(stageNode, "audio", soundFilename)) { - audio_play(story_path, soundFilename, &storyTime); + audio_play(story_audio_path, soundFilename, &storyTime); storyStartTime = stories_timestamp(); - if(cJSON_IsTrue(cJSON_GetObjectItem(cJSON_GetObjectItem(stageNode, "controlSettings"), "autoplay"))) { + if(cJSON_IsTrue(cJSON_GetObjectItem(cJSON_GetObjectItem(stageNode, "control"), "autoplay"))) { storyAutoplay = true; + storyOkAction = cJSON_IsTrue(cJSON_GetObjectItem(cJSON_GetObjectItem(stageNode, "control"), "ok")); autosleep_lock(); Mix_HookMusicFinished(callback_stories_autoplay); } else { - autosleep_unlock(); + stories_autosleep_unlock(); } } else { - autosleep_unlock(); + stories_autosleep_unlock(); } } -void stories_reset(void) -{ - Mix_HookMusicFinished(NULL); - storyAutoplay = false; - storyStageIndex = 0; - storyActionIndex = -1; - storyActionOptionIndex = 0; - storyTime = 0; - stories_readStage(); -} - void stories_readAction(void) { if(storiesCount == 0) { @@ -151,99 +151,106 @@ void stories_readAction(void) storyActionOptionIndex = 0; } - cJSON *stageAction = stories_getAction(); - if(stageAction == NULL) { - return; - } - - cJSON *options = cJSON_GetObjectItem(stageAction, "options"); - if(options == NULL) { + cJSON *nodeAction = stories_getAction(); + if(nodeAction == NULL) { return; } + + cJSON *option = cJSON_GetArrayItem(nodeAction, storyActionOptionIndex); - cJSON *option = cJSON_GetArrayItem(options, storyActionOptionIndex); if(option == NULL) { return; } - - char *stageNodeUUID = cJSON_GetStringValue(option); - char stageUUID[STR_MAX]; - storyStageIndex = -1; - do { - storyStageIndex += 1; - cJSON *stageNode = stories_getStage(); - if(stageNode == NULL) { - return stories_reset(); - } - json_getString(stageNode, "uuid", stageUUID); - } while(strcmp(stageUUID, stageNodeUUID) != 0); - - storyTime = 0; + json_getString(option, "stage", storyStageKey); stories_readStage(); } void stories_load(void) +{ + if(storiesCount == 0) { + return; + } + + char story_path[STR_MAX]; + sprintf(story_path, "%s%s/nodes.json", STORIES_RESOURCES, storiesList[storyIndex]); + storyJson = json_load(story_path); + if(storyJson == NULL) { + return; + } + + if(storyActionKey[0] == '\0') { + cJSON *startTransition = cJSON_GetObjectItem(storyJson, "startAction"); + + if(startTransition == NULL) { + return callback_stories_reset(); + } + + json_getString(startTransition, "action", storyActionKey); + json_getInt(startTransition, "index", &storyActionOptionIndex); + storyTime = 0; + } + + cJSON *nodeAction = stories_getAction(); + if(nodeAction == NULL) { + return; + } + + storyActionOptionsCount = cJSON_GetArraySize(nodeAction); + stories_readAction(); +} + +void stories_title(void) { if(storiesCount == 0) { video_displayImage(SYSTEM_RESOURCES, "noStory.png"); return; } - - stories_loadSession(); + + if(stories_loadSession()) { + return stories_load(); + } if(storyIndex < 0) { storyIndex = storiesCount - 1; } else if (storyIndex >= storiesCount) { storyIndex = 0; } - + char story_path[STR_MAX]; - sprintf(story_path, "%s%s/story.json", STORIES_RESOURCES, storiesList[storyIndex]); - storyJson = json_load(story_path); - if(storyJson == NULL) { - return; - } + sprintf(story_path, "%s%s/", STORIES_RESOURCES, storiesList[storyIndex]); - stories_readStage(); + storyTime = 0; + video_displayImage(story_path, "title.png"); + audio_play(story_path, "title.mp3", &storyTime); + display_setScreen(true); + stories_autosleep_unlock(); + storyStartTime = stories_timestamp(); } void stories_transition(char* transition) { + if(storiesCount == 0) { return; } - Mix_HookMusicFinished(NULL); - cJSON *stageNode = stories_getStage(); if(stageNode == NULL) { - return stories_reset(); + return callback_stories_reset(); } cJSON *transitionNode = cJSON_GetObjectItem(stageNode, transition); if(transitionNode == NULL || cJSON_IsNull(transitionNode)) { - return stories_reset(); + return callback_stories_reset(); } - cJSON *actionNode; - char actionNodeId[STR_MAX], actionId[STR_MAX]; - - json_getString(transitionNode, "actionNode", actionNodeId); - json_getInt(transitionNode, "optionIndex", &storyActionOptionIndex); - - storyActionIndex = -1; - do { - storyActionIndex += 1; - actionNode = stories_getAction(); - if(actionNode == NULL) { - return stories_reset(); - } - json_getString(actionNode, "id", actionId); - - } while(strcmp(actionId, actionNodeId) != 0); + Mix_HookMusicFinished(NULL); + storyTime = 0; - storyActionOptionsCount = cJSON_GetArraySize(cJSON_GetObjectItem(actionNode, "options")); - return stories_readAction(); + json_getString(transitionNode, "action", storyActionKey); + json_getInt(transitionNode, "index", &storyActionOptionIndex); + storyActionOptionsCount = cJSON_GetArraySize(stories_getAction()); + stories_readAction(); } void stories_rewind(double time) @@ -259,9 +266,9 @@ void stories_next(void) if(storyAutoplay) { stories_rewind(10); } else { - if(storyActionIndex == -1) { + if(storyActionKey[0] == '\0') { storyIndex += 1; - stories_load(); + stories_title(); } else { storyActionOptionIndex += 1; stories_readAction(); @@ -275,9 +282,9 @@ void stories_previous(void) if(storyAutoplay) { stories_rewind(-10); } else { - if(storyActionIndex == -1) { + if(storyActionKey[0] == '\0') { storyIndex -= 1; - stories_load(); + stories_title(); } else { storyActionOptionIndex -= 1; stories_readAction(); @@ -287,17 +294,21 @@ void stories_previous(void) void stories_ok(void) { - if(storyAutoplay) { + if(!storyOkAction) { return; } - stories_transition("okTransition"); + if(storyActionKey[0] == '\0') { + stories_load(); + } else { + stories_transition("ok"); + } } void stories_autoplay(void) { - storyAutoplay = false; + storyOkAction = true; stories_ok(); } @@ -310,7 +321,7 @@ void stories_pause(void) Mix_ResumeMusic(); storyStartTime = stories_timestamp(); } else { - autosleep_unlock(); + stories_autosleep_unlock(); Mix_PauseMusic(); long int ts = stories_timestamp(); storyTime += (double)(ts - storyStartTime); @@ -321,7 +332,7 @@ void stories_pause(void) bool stories_home(void) { - if(storyActionIndex == -1) { + if(storyActionKey[0] == '\0') { Mix_HookMusicFinished(NULL); if(Mix_PlayingMusic() == 1) { if (Mix_PausedMusic() != 1) { @@ -330,7 +341,7 @@ bool stories_home(void) } return true; } else { - stories_transition("homeTransition"); + stories_transition("home"); return false; } } @@ -345,9 +356,26 @@ void stories_save(void) stories_saveSession(); } +void stories_reset(void) +{ + Mix_HookMusicFinished(NULL); + storyAutoplay = false; + storyOkAction = true; + storyStageKey[0] = '\0'; + storyActionKey[0] = '\0'; + storyActionOptionIndex = 0; + storyTime = 0; + stories_title(); +} + void stories_init(void) { + if(storiesList != NULL) { + return stories_title(); + } + callback_stories_autoplay = &stories_autoplay; + callback_stories_reset = &stories_reset; video_displayImage(SYSTEM_RESOURCES, "loadingStories.png"); @@ -369,14 +397,14 @@ void stories_init(void) while((dir = readdir(d)) != NULL) { if (dir->d_type == DT_DIR && strcmp(dir->d_name, ".") != 0 && strcmp(dir->d_name, "..") != 0) { - filesList[i] = (char*) malloc(STR_MAX * sizeof(char)); + filesList[i] = (char*) malloc(STR_DIRNAME); strcpy(filesList[i], dir->d_name); i++; } } closedir(d); storiesList = filesList; - stories_load(); + stories_title(); } #endif // STORYTELLER_STORIES_HELPER__ \ No newline at end of file diff --git a/src/storyTeller/storyTeller.c b/src/storyTeller/storyTeller.c index 06c471b6a..fae08f9ee 100644 --- a/src/storyTeller/storyTeller.c +++ b/src/storyTeller/storyTeller.c @@ -13,6 +13,7 @@ #include "./app_autosleep.h" #include "./sdl_helper.h" #include "./app_selector.h" +#include "./app_parameters.h" // for ev.value @@ -41,10 +42,11 @@ int main(int argc, char *argv[]) video_audio_init(); settings_init(); display_init(); - settings_setVolume(6, true); - settings_setBrightness(3, true, false); + parameters_init(); + settings_setVolume(parameters_getAudioVolumeStartup(), true); + settings_setBrightness(parameters_getScreenBrightnessStartup(), true, false); - autosleep_init(); + autosleep_init(parameters_getScreenOnInactivityTime(), parameters_getScreenOffInactivityTime()); app_init(); // Prepare for Poll button input @@ -112,10 +114,10 @@ int main(int argc, char *argv[]) break; case HW_BTN_VOLUME_UP : if(is_menu_pressed) { - settings_setBrightness(settings.brightness + 1, true, false); + settings_setBrightness(parameters_getScreenBrightnessValidation(settings.brightness + 1), true, false); osd_showBrightnessBar(settings.brightness); } else { - settings_setVolume(settings.volume + 1, true); + settings_setVolume(parameters_getAudioVolumeValidation(settings.volume + 1), true); osd_showVolumeBar(settings.volume, false); } break; diff --git a/static/build/.tmp_update/res/sdcard.ico b/static/build/.tmp_update/res/sdcard.ico index ff466b448..fd3633d3c 100644 Binary files a/static/build/.tmp_update/res/sdcard.ico and b/static/build/.tmp_update/res/sdcard.ico differ diff --git a/static/build/.tmp_update/runtime.sh b/static/build/.tmp_update/runtime.sh index d8acc9de9..9cc7f1024 100644 --- a/static/build/.tmp_update/runtime.sh +++ b/static/build/.tmp_update/runtime.sh @@ -45,18 +45,15 @@ main() { fi cd $sysdir - bootScreen "convertingFiles" + bootScreen "Boot" # Init rm /tmp/.offOrder 2> /dev/null HOME=/mnt/SDCARD/Stories/ mkdir -m 777 -p /mnt/SDCARD/Saves - storyteller_jpg2png - bootScreen "Boot" # start_networking - sleep 1 rm -rf /tmp/is_booting launch_storyteller @@ -65,28 +62,6 @@ main() { done } -storyteller_jpg2png() { - for directory in /mnt/SDCARD/Stories/*; do - if [ ! -d "$directory" ]; then - continue - fi - - hasconvertedjpg=false - for file in "$directory"/assets/*.jpg "$directory"/assets/*.jpeg "$directory"/assets/*.JPG "$directory"/assets/*.JPEG; do - if [ ! -f "$file" ]; then - continue - fi - jpg2png "$file" 480 360 - rm -f "$file" 2> /dev/null - hasconvertedjpg=true - done - - if $hasconvertedjpg; then - sed -i 's/\.\(jpg\|jpeg\)"/\.png"/gI' "$directory"/story.json - fi - done -} - set_prev_state() { echo "$1" > /tmp/prev_state } diff --git a/static/build/Saves/.parameters b/static/build/Saves/.parameters new file mode 100644 index 000000000..6840b2f98 --- /dev/null +++ b/static/build/Saves/.parameters @@ -0,0 +1,9 @@ +{ + "audioVolumeStartup": 0.3, + "audioVolumeMax": 0.6, + "screenBrightnessStartup": 0.3, + "screenBrightnessMax": 0.6, + "screenOnInactivityTime": 120, + "screenOffInactivityTime": 300, + "musicInactivityTime": 3600 +}