diff options
Diffstat (limited to 'apps/settings.c')
-rw-r--r-- | apps/settings.c | 168 |
1 files changed, 167 insertions, 1 deletions
diff --git a/apps/settings.c b/apps/settings.c index 3dc4ee1530..b2f7888a22 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -96,7 +96,7 @@ const char rec_base_directory[] = REC_BASE_DIR; | |||
96 | #include "eq_menu.h" | 96 | #include "eq_menu.h" |
97 | #endif | 97 | #endif |
98 | 98 | ||
99 | #define CONFIG_BLOCK_VERSION 52 | 99 | #define CONFIG_BLOCK_VERSION 53 |
100 | #define CONFIG_BLOCK_SIZE 512 | 100 | #define CONFIG_BLOCK_SIZE 512 |
101 | #define RTC_BLOCK_SIZE 44 | 101 | #define RTC_BLOCK_SIZE 44 |
102 | 102 | ||
@@ -477,6 +477,11 @@ static const struct bit_entry hd_bits[] = | |||
477 | {1, S_O(rec_channels), 0, "rec channels", "stereo,mono" }, | 477 | {1, S_O(rec_channels), 0, "rec channels", "stereo,mono" }, |
478 | {1, S_O(rec_split_type), 0, "rec split type", "Split, Stop" }, | 478 | {1, S_O(rec_split_type), 0, "rec split type", "Split, Stop" }, |
479 | {1, S_O(rec_split_method), 0, "rec split method", "Time,Filesize" }, | 479 | {1, S_O(rec_split_method), 0, "rec split method", "Time,Filesize" }, |
480 | {6, S_O(ctdn_mins), 0, "countdown timer minutes", NULL }, /* 0 - 59 */ | ||
481 | {5, S_O(ctdn_hrs), 0, "countdown timer hours", NULL }, /* 0 - 23 */ | ||
482 | {6, S_O(ctdn_secs), 0, "countdown timer seconds", NULL }, /* 0 - 59 */ | ||
483 | {3, S_O(ctdn_days), 0, "countdown timer days", NULL }, /* 0 - 6 */ | ||
484 | |||
480 | 485 | ||
481 | { | 486 | { |
482 | #if defined(HAVE_SPDIF_IN) || defined(HAVE_FMRADIO_IN) | 487 | #if defined(HAVE_SPDIF_IN) || defined(HAVE_FMRADIO_IN) |
@@ -2032,6 +2037,167 @@ bool set_int(const unsigned char* string, | |||
2032 | (max-*variable)/step, &data,function); | 2037 | (max-*variable)/step, &data,function); |
2033 | } | 2038 | } |
2034 | 2039 | ||
2040 | /* Useful for time and other multi integer settings */ | ||
2041 | bool set_multi_int(const char* string, const struct opt_items * names, | ||
2042 | struct opt_settings * variable, int varcount) | ||
2043 | { | ||
2044 | int i, j; | ||
2045 | char buf[32]; | ||
2046 | long button; | ||
2047 | int cursor = 0; | ||
2048 | bool done = false; | ||
2049 | int oldvalue[varcount]; | ||
2050 | int pos = 0; | ||
2051 | |||
2052 | for(j = 0; j < varcount; j++) | ||
2053 | oldvalue[j] = *(int*)variable[j].setting; | ||
2054 | |||
2055 | FOR_NB_SCREENS(i) | ||
2056 | { | ||
2057 | screens[i].clear_display(); | ||
2058 | #ifdef HAVE_LCD_BITMAP | ||
2059 | screens[i].setmargins(0, 8); | ||
2060 | #endif | ||
2061 | } | ||
2062 | |||
2063 | snprintf(buf, sizeof(buf), "%s", string); | ||
2064 | FOR_NB_SCREENS(i) | ||
2065 | screens[i].puts(0, 0, buf); | ||
2066 | |||
2067 | /* print variable names */ | ||
2068 | for(j = 0; j < varcount ; j++) | ||
2069 | { | ||
2070 | if (j > 0) | ||
2071 | { | ||
2072 | snprintf(buf, sizeof(buf), ":"); | ||
2073 | FOR_NB_SCREENS(i) | ||
2074 | screens[i].puts(pos - 2, 1, buf); | ||
2075 | } | ||
2076 | |||
2077 | snprintf(buf, sizeof(buf), "%s", P2STR(names[j].string)); | ||
2078 | FOR_NB_SCREENS(i) | ||
2079 | screens[i].puts(pos, 1, buf); | ||
2080 | |||
2081 | pos += strlen(buf) + 3; | ||
2082 | } | ||
2083 | |||
2084 | snprintf(buf, sizeof(buf), "%s", str(LANG_TIMER_CONFIRM)); | ||
2085 | FOR_NB_SCREENS(i) | ||
2086 | screens[i].puts(0, 5, buf); | ||
2087 | |||
2088 | gui_syncstatusbar_draw(&statusbars, true); | ||
2089 | |||
2090 | while(!done) | ||
2091 | { | ||
2092 | pos = 0; | ||
2093 | |||
2094 | /* print variables */ | ||
2095 | for(j = 0; j < varcount; j++) | ||
2096 | { | ||
2097 | if (j > 0) | ||
2098 | { | ||
2099 | snprintf(buf, sizeof(buf), " :"); | ||
2100 | FOR_NB_SCREENS(i) | ||
2101 | screens[i].puts(pos - 3, 3, buf); | ||
2102 | } | ||
2103 | |||
2104 | snprintf(buf, sizeof(buf), "%d", *(int*)variable[j].setting); | ||
2105 | |||
2106 | #ifdef HAVE_LCD_BITMAP | ||
2107 | if (cursor == j) | ||
2108 | { | ||
2109 | FOR_NB_SCREENS(i) | ||
2110 | screens[i].puts_style_offset(pos, 3, buf, STYLE_INVERT, 0); | ||
2111 | } | ||
2112 | else | ||
2113 | #endif | ||
2114 | { | ||
2115 | FOR_NB_SCREENS(i) | ||
2116 | screens[i].puts(pos, 3, buf); | ||
2117 | } | ||
2118 | |||
2119 | snprintf(buf, sizeof(buf), "%d", variable[j].setting_max); | ||
2120 | pos += strlen(buf) + 3; | ||
2121 | } | ||
2122 | |||
2123 | /* print empty char to terminate invert style */ | ||
2124 | snprintf(buf, sizeof(buf), " "); | ||
2125 | FOR_NB_SCREENS(i) | ||
2126 | screens[i].puts(pos - 3, 3, buf); | ||
2127 | |||
2128 | #ifdef HAVE_LCD_BITMAP | ||
2129 | FOR_NB_SCREENS(i) | ||
2130 | screens[i].update(); | ||
2131 | #endif | ||
2132 | |||
2133 | button = get_action(CONTEXT_SETTINGS, TIMEOUT_BLOCK); | ||
2134 | |||
2135 | switch (button) | ||
2136 | { | ||
2137 | case ACTION_STD_NEXT: | ||
2138 | cursor ++; | ||
2139 | if (cursor >= varcount) | ||
2140 | cursor = varcount - 1; | ||
2141 | if (global_settings.talk_menu) | ||
2142 | talk_id(names[cursor].voice_id, false); | ||
2143 | break; | ||
2144 | |||
2145 | case ACTION_STD_PREV: | ||
2146 | if (cursor == 0) | ||
2147 | { | ||
2148 | /* cancel if pressing left when cursor | ||
2149 | is already at the far left */ | ||
2150 | for(j = 0; j < varcount; j++) | ||
2151 | *(int*)variable[j].setting = oldvalue[j]; | ||
2152 | gui_syncsplash(HZ/2, true, str(LANG_MENU_SETTING_CANCEL)); | ||
2153 | done = true; | ||
2154 | } | ||
2155 | else | ||
2156 | cursor --; | ||
2157 | if (cursor < 0) | ||
2158 | cursor = 0; | ||
2159 | if (global_settings.talk_menu) | ||
2160 | talk_id(names[cursor].voice_id, false); | ||
2161 | break; | ||
2162 | |||
2163 | case ACTION_SETTINGS_INC: | ||
2164 | case ACTION_SETTINGS_INCREPEAT: | ||
2165 | *(int*)variable[cursor].setting += 1; | ||
2166 | if (*(int*)variable[cursor].setting > | ||
2167 | variable[cursor].setting_max) | ||
2168 | *(int*)variable[cursor].setting = 0; | ||
2169 | if (global_settings.talk_menu) | ||
2170 | talk_unit(INT, *(int*)variable[cursor].setting); | ||
2171 | break; | ||
2172 | |||
2173 | case ACTION_SETTINGS_DEC: | ||
2174 | case ACTION_SETTINGS_DECREPEAT: | ||
2175 | *(int*)variable[cursor].setting -= 1; | ||
2176 | if (*(int*)variable[cursor].setting < 0) | ||
2177 | *(int*)variable[cursor].setting = | ||
2178 | variable[cursor].setting_max; | ||
2179 | if (global_settings.talk_menu) | ||
2180 | talk_unit(INT, *(int*)variable[cursor].setting); | ||
2181 | break; | ||
2182 | |||
2183 | case ACTION_STD_OK: | ||
2184 | done = true; | ||
2185 | break; | ||
2186 | |||
2187 | case ACTION_STD_CANCEL: | ||
2188 | for(j = 0; j < varcount; j++) | ||
2189 | *(int*)variable[j].setting = oldvalue[j]; | ||
2190 | gui_syncsplash(HZ/2, true, str(LANG_MENU_SETTING_CANCEL)); | ||
2191 | return false; | ||
2192 | |||
2193 | default: | ||
2194 | if (default_event_handler(button) == SYS_USB_CONNECTED) | ||
2195 | return true; | ||
2196 | } | ||
2197 | } | ||
2198 | return false; | ||
2199 | } | ||
2200 | |||
2035 | /* NOTE: the 'type' parameter specifies the actual type of the variable | 2201 | /* NOTE: the 'type' parameter specifies the actual type of the variable |
2036 | that 'variable' points to. not the value within. Only variables with | 2202 | that 'variable' points to. not the value within. Only variables with |
2037 | type 'bool' should use parameter BOOL. | 2203 | type 'bool' should use parameter BOOL. |