@@ -35,29 +35,40 @@ bool is_setting_selected(VideoStream& stream, ProControllerContext& context, Ima
3535 overlays.add (COLOR_BLUE, unselected_box2);
3636 context.wait_for_all_requests ();
3737 context.wait_for (Milliseconds (250 ));
38- VideoSnapshot snapshot = stream.video ().snapshot ();
39-
40- ImageStats stats_unselected_box1 = image_stats (extract_box_reference (snapshot, unselected_box1));
41- double unselected1_average_sum = stats_unselected_box1.average .sum ();
42- stream.log (" unselected_average_sum1: " + std::to_string (unselected1_average_sum));
43-
44- ImageStats stats_unselected_box2 = image_stats (extract_box_reference (snapshot, unselected_box2));
45- double unselected2_average_sum = stats_unselected_box2.average .sum ();
46- stream.log (" unselected_average_sum2: " + std::to_string (unselected2_average_sum));
47-
48- double average_sum_unselected_diff = std::abs (unselected1_average_sum - unselected2_average_sum);
49-
50- ImageStats stats_selected_box = image_stats (extract_box_reference (snapshot, selected_box));
51- double selected_average_sum = stats_selected_box.average .sum ();
52- stream.log (" selected_average_sum: " + std::to_string (selected_average_sum));
38+ size_t max_attempts = 5 ; // multiple attempts because the highlighted icon/setting pulses. and sometimes there isn't enough contrast at the exact moment you take the snapshot.
39+ bool is_selected = false ;
40+ for (size_t i = 0 ; i < max_attempts; i++){
41+ VideoSnapshot snapshot = stream.video ().snapshot ();
42+
43+ ImageStats stats_unselected_box1 = image_stats (extract_box_reference (snapshot, unselected_box1));
44+ double unselected1_average_sum = stats_unselected_box1.average .sum ();
45+ stream.log (" unselected_average_sum1: " + std::to_string (unselected1_average_sum));
46+
47+ ImageStats stats_unselected_box2 = image_stats (extract_box_reference (snapshot, unselected_box2));
48+ double unselected2_average_sum = stats_unselected_box2.average .sum ();
49+ stream.log (" unselected_average_sum2: " + std::to_string (unselected2_average_sum));
50+
51+ double average_sum_unselected_diff = std::abs (unselected1_average_sum - unselected2_average_sum);
52+
53+ ImageStats stats_selected_box = image_stats (extract_box_reference (snapshot, selected_box));
54+ double selected_average_sum = stats_selected_box.average .sum ();
55+ stream.log (" selected_average_sum: " + std::to_string (selected_average_sum));
56+
57+ if (is_white_theme (stream, context)){ // light mode
58+ // unselected should be brighter than selected
59+ is_selected = selected_average_sum < std::min (unselected1_average_sum, unselected2_average_sum) - average_sum_unselected_diff - 20 ;
60+ }else { // dark mode
61+ // selected should be brighter than unselected
62+ is_selected = selected_average_sum > std::max (unselected1_average_sum, unselected2_average_sum) + average_sum_unselected_diff + 20 ;
63+ }
5364
54- if (is_white_theme (stream, context)){ // light mode
55- // unselected should be brighter than selected
56- return selected_average_sum < std::min (unselected1_average_sum, unselected2_average_sum) - average_sum_unselected_diff - 20 ;
57- }else { // dark mode
58- // selected should be brighter than unselected
59- return selected_average_sum > std::max (unselected1_average_sum, unselected2_average_sum) + average_sum_unselected_diff + 20 ;
65+ if (is_selected){
66+ return true ;
67+ }
68+ context.wait_for (Milliseconds (200 ));
6069 }
70+
71+ return false ;
6172}
6273
6374void home_to_date_time (VideoStream& stream, ProControllerContext& context, bool to_date_change, bool fast){
0 commit comments