summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2008-12-16 12:05:16 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2008-12-16 12:05:16 +0000
commitf6251e4256b48ad85f176fb4219b27b654e3b05e (patch)
tree960ade7843789859473892310f666f8aa54d0ebc
parentffd5e87b785470ba5a63d93e44e35dfcbfe119cf (diff)
downloadrockbox-f6251e4256b48ad85f176fb4219b27b654e3b05e.tar.gz
rockbox-f6251e4256b48ad85f176fb4219b27b654e3b05e.zip
Accept FS#9646 by Christopher Williams which fixes a few radio preset bugs:
* presets list does not scroll horizontally properly (due to the list_do_action() repeatedly timing out after 1 second) * when returning from the presets list to the main radio screen, the highlighted item in the list scrolls on main radio screen (if it's too wide for the screen, that is) * when adding a preset while in the presets list (with ACTION_FM_PRESET) the list is not updated with the new preset * when clearing presets (or deleting the last preset), the main screen still shows the same preset number * when deleting a preset, the current preset number doesn't change if it's past the end of the list (this is partially related to the previous issue) * the find_closest_preset() routine could be improved to actually find the closest frequency that is saved as a preset * inputting a preset name could be optimized in both time and space (especially in radio_add_preset()); also the length parameter to kbd_input() includes the null terminator, so I added one to those arguments git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19457 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/recorder/radio.c76
1 files changed, 52 insertions, 24 deletions
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index dee38b5475..a6213abfb1 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -295,34 +295,54 @@ static int find_preset(int freq)
295 return -1; 295 return -1;
296} 296}
297 297
298/* Return the first preset encountered in the search direction with 298/* Return the closest preset encountered in the search direction with
299 wraparound. */ 299 wraparound. */
300static int find_closest_preset(int freq, int direction) 300static int find_closest_preset(int freq, int direction)
301{ 301{
302 int i; 302 int i;
303 int lowpreset = 0;
304 int highpreset = 0;
305 int closest = -1;
303 306
304 if (direction == 0) /* direction == 0 isn't really used */ 307 if (direction == 0) /* direction == 0 isn't really used */
305 return 0; 308 return 0;
306 309
307 for (i = 0; i < MAX_PRESETS; i++) 310 for (i = 0; i < num_presets; i++)
308 { 311 {
309 int preset_frequency = presets[i].frequency; 312 int f = presets[i].frequency;
310 313 if (f == freq)
311 if (preset_frequency == freq)
312 return i; /* Exact match = stop */ 314 return i; /* Exact match = stop */
313 /* Stop when the preset frequency exeeds freq so that we can 315
314 pick the correct one based on direction */ 316 /* remember the highest and lowest presets for wraparound */
315 if (preset_frequency > freq) 317 if (f < presets[lowpreset].frequency)
316 break; 318 lowpreset = i;
319 if (f > presets[highpreset].frequency)
320 highpreset = i;
321
322 /* find the closest preset in the given direction */
323 if (direction > 0 && f > freq)
324 {
325 if (closest < 0 || f < presets[closest].frequency)
326 closest = i;
327 }
328 else if (direction < 0 && f < freq)
329 {
330 if (closest < 0 || f > presets[closest].frequency)
331 closest = i;
332 }
317 } 333 }
318 334
319 /* wrap around depending on direction */ 335 if (closest < 0)
320 if (i == 0 || i >= num_presets - 1) 336 {
321 i = direction < 0 ? num_presets - 1 : 0; 337 /* no presets in the given direction */
322 else if (direction < 0) 338 /* wrap around depending on direction */
323 i--; /* use previous */ 339 if (direction < 0)
340 closest = highpreset;
341 else
342 closest = lowpreset;
343 }
324 344
325 return i; 345 return closest;
326} 346}
327 347
328static void remember_frequency(void) 348static void remember_frequency(void)
@@ -762,6 +782,7 @@ int radio_screen(void)
762 FOR_NB_SCREENS(i) 782 FOR_NB_SCREENS(i)
763 { 783 {
764 screens[i].set_viewport(&vp[i]); 784 screens[i].set_viewport(&vp[i]);
785 screens[i].stop_scroll();
765 screens[i].clear_viewport(); 786 screens[i].clear_viewport();
766 screens[i].update_viewport(); 787 screens[i].update_viewport();
767 screens[i].set_viewport(NULL); 788 screens[i].set_viewport(NULL);
@@ -1158,24 +1179,24 @@ static int radio_add_preset(void)
1158 1179
1159 if(num_presets < MAX_PRESETS) 1180 if(num_presets < MAX_PRESETS)
1160 { 1181 {
1161 memset(buf, 0, MAX_FMPRESET_LEN); 1182 buf[0] = '\0';
1162 1183
1163 if (!kbd_input(buf, MAX_FMPRESET_LEN)) 1184 if (!kbd_input(buf, MAX_FMPRESET_LEN + 1))
1164 { 1185 {
1165 struct fmstation * const fms = &presets[num_presets]; 1186 struct fmstation * const fms = &presets[num_presets];
1166 buf[MAX_FMPRESET_LEN] = '\0';
1167 strcpy(fms->name, buf); 1187 strcpy(fms->name, buf);
1168 fms->frequency = curr_freq; 1188 fms->frequency = curr_freq;
1169 num_presets++; 1189 num_presets++;
1170 presets_changed = true; 1190 presets_changed = true;
1171 presets_loaded = num_presets > 0; 1191 presets_loaded = num_presets > 0;
1192 return true;
1172 } 1193 }
1173 } 1194 }
1174 else 1195 else
1175 { 1196 {
1176 splash(HZ, ID2P(LANG_FM_NO_FREE_PRESETS)); 1197 splash(HZ, ID2P(LANG_FM_NO_FREE_PRESETS));
1177 } 1198 }
1178 return true; 1199 return false;
1179} 1200}
1180 1201
1181/* needed to know which preset we are edit/delete-ing */ 1202/* needed to know which preset we are edit/delete-ing */
@@ -1188,11 +1209,10 @@ static int radio_edit_preset(void)
1188 { 1209 {
1189 struct fmstation * const fms = &presets[selected_preset]; 1210 struct fmstation * const fms = &presets[selected_preset];
1190 1211
1191 strncpy(buf, fms->name, MAX_FMPRESET_LEN); 1212 strcpy(buf, fms->name);
1192 1213
1193 if (!kbd_input(buf, MAX_FMPRESET_LEN)) 1214 if (!kbd_input(buf, MAX_FMPRESET_LEN + 1))
1194 { 1215 {
1195 buf[MAX_FMPRESET_LEN] = '\0';
1196 strcpy(fms->name, buf); 1216 strcpy(fms->name, buf);
1197 presets_changed = true; 1217 presets_changed = true;
1198 } 1218 }
@@ -1213,6 +1233,8 @@ static int radio_delete_preset(void)
1213 memmove(fms, fms + 1, (uintptr_t)(fms + num_presets) - 1233 memmove(fms, fms + 1, (uintptr_t)(fms + num_presets) -
1214 (uintptr_t)fms); 1234 (uintptr_t)fms);
1215 1235
1236 if (curr_preset >= num_presets)
1237 --curr_preset;
1216 } 1238 }
1217 1239
1218 /* Don't ask to save when all presets are deleted. */ 1240 /* Don't ask to save when all presets are deleted. */
@@ -1222,6 +1244,7 @@ static int radio_delete_preset(void)
1222 { 1244 {
1223 /* The preset list will be cleared, switch to Scan Mode. */ 1245 /* The preset list will be cleared, switch to Scan Mode. */
1224 radio_mode = RADIO_SCAN_MODE; 1246 radio_mode = RADIO_SCAN_MODE;
1247 curr_preset = -1;
1225 presets_loaded = false; 1248 presets_loaded = false;
1226 } 1249 }
1227 1250
@@ -1295,6 +1318,7 @@ static int clear_preset_list(void)
1295 presets_loaded = false; 1318 presets_loaded = false;
1296 /* The preset list will be cleared switch to Scan Mode. */ 1319 /* The preset list will be cleared switch to Scan Mode. */
1297 radio_mode = RADIO_SCAN_MODE; 1320 radio_mode = RADIO_SCAN_MODE;
1321 curr_preset = -1;
1298 1322
1299 presets_changed = false; /* Don't ask to save when clearing the list. */ 1323 presets_changed = false; /* Don't ask to save when clearing the list. */
1300 1324
@@ -1374,12 +1398,16 @@ static int handle_radio_presets(void)
1374 { 1398 {
1375 gui_synclist_draw(&lists); 1399 gui_synclist_draw(&lists);
1376 gui_syncstatusbar_draw(&statusbars, true); 1400 gui_syncstatusbar_draw(&statusbars, true);
1377 list_do_action(CONTEXT_STD, HZ, 1401 list_do_action(CONTEXT_STD, TIMEOUT_BLOCK,
1378 &lists, &action, LIST_WRAP_UNLESS_HELD); 1402 &lists, &action, LIST_WRAP_UNLESS_HELD);
1379 switch (action) 1403 switch (action)
1380 { 1404 {
1381 case ACTION_STD_MENU: 1405 case ACTION_STD_MENU:
1382 radio_add_preset(); 1406 if (radio_add_preset())
1407 {
1408 gui_synclist_set_nb_items(&lists, num_presets);
1409 gui_synclist_select_item(&lists, num_presets - 1);
1410 }
1383 break; 1411 break;
1384 case ACTION_STD_CANCEL: 1412 case ACTION_STD_CANCEL:
1385 result = 1; 1413 result = 1;