def _animate_rainbow(): # state 0: (LEFT,RIGHT) from (0,0) to (1,0)...RED # state 1: (LEFT,RIGHT) from (1,0) to (1,1)...AMBER # state 2: (LEFT,RIGHT) from (1,1) to (0,1)...GREEN # state 3: (LEFT,RIGHT) from (0,1) to (0,0)...OFF state = 0 left_value = 0 right_value = 0 MIN_VALUE = 0 MAX_VALUE = 1 self.all_off() duration_ms = duration * 1000 if duration is not None else None stopwatch = StopWatch() stopwatch.start() while True: if state == 0: left_value += increment_by elif state == 1: right_value += increment_by elif state == 2: left_value -= increment_by elif state == 3: right_value -= increment_by else: raise Exception("Invalid state {}".format(state)) # Keep left_value and right_value within the MIN/MAX values left_value = min(left_value, MAX_VALUE) right_value = min(right_value, MAX_VALUE) left_value = max(left_value, MIN_VALUE) right_value = max(right_value, MIN_VALUE) self.set_color(group1, (left_value, right_value)) self.set_color(group2, (left_value, right_value)) if state == 0 and left_value == MAX_VALUE: state = 1 elif state == 1 and right_value == MAX_VALUE: state = 2 elif state == 2 and left_value == MIN_VALUE: state = 3 elif state == 3 and right_value == MIN_VALUE: state = 0 if self.animate_thread_stop or stopwatch.is_elapsed_ms( duration_ms): break sleep(sleeptime) self.animate_thread_stop = False self.animate_thread_id = None
def _animate_flash(): even = True duration_ms = duration * 1000 if duration is not None else None stopwatch = StopWatch() stopwatch.start() while True: if even: for group in groups: self.set_color(group, color) else: self.all_off() if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms): break even = not even sleep(sleeptime) self.animate_thread_stop = False self.animate_thread_id = None
def _animate_cycle(): index = 0 max_index = len(colors) duration_ms = duration * 1000 if duration is not None else None stopwatch = StopWatch() stopwatch.start() while True: for group in groups: self.set_color(group, colors[index]) index += 1 if index == max_index: index = 0 if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms): break sleep(sleeptime) self.animate_thread_stop = False self.animate_thread_id = None
def _animate_police_lights(): self.all_off() even = True duration_ms = duration * 1000 if duration is not None else None stopwatch = StopWatch() stopwatch.start() while True: if even: self.set_color(group1, color1) self.set_color(group2, color2) else: self.set_color(group1, color2) self.set_color(group2, color1) if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms): break even = not even sleep(sleeptime) self.animate_thread_stop = False self.animate_thread_id = None
def test_stopwatch(self): sw = StopWatch() self.assertEqual(str(sw), "StopWatch: 00:00:00.000") sw = StopWatch(desc="test sw") self.assertEqual(str(sw), "test sw: 00:00:00.000") self.assertEqual(sw.is_started, False) sw.start() self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 0) self.assertEqual(sw.value_secs, 0) self.assertEqual(sw.value_hms, (0, 0, 0, 0)) self.assertEqual(sw.hms_str, "00:00:00.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), False) self.assertEqual(sw.is_elapsed_secs(3), False) set_mock_ticks_ms(1500) self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 1500) self.assertEqual(sw.value_secs, 1.5) self.assertEqual(sw.value_hms, (0, 0, 1, 500)) self.assertEqual(sw.hms_str, "00:00:01.500") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), False) self.assertEqual(sw.is_elapsed_secs(3), False) set_mock_ticks_ms(3000) self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 3000) self.assertEqual(sw.value_secs, 3) self.assertEqual(sw.value_hms, (0, 0, 3, 0)) self.assertEqual(sw.hms_str, "00:00:03.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), True) self.assertEqual(sw.is_elapsed_secs(3), True) set_mock_ticks_ms(1000 * 60 * 75.5) #75.5 minutes self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 1000 * 60 * 75.5) self.assertEqual(sw.value_secs, 60 * 75.5) self.assertEqual(sw.value_hms, (1, 15, 30, 0)) self.assertEqual(sw.hms_str, "01:15:30.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), True) self.assertEqual(sw.is_elapsed_secs(3), True) try: # StopWatch can't be started if already running sw.start() self.fail() except StopWatchAlreadyStartedException: pass # test reset behavior sw.restart() self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 0) self.assertEqual(sw.value_secs, 0) self.assertEqual(sw.value_hms, (0, 0, 0, 0)) self.assertEqual(sw.hms_str, "00:00:00.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), False) self.assertEqual(sw.is_elapsed_secs(3), False) set_mock_ticks_ms(1000 * 60 * 75.5 + 3000) self.assertEqual(sw.is_started, True) self.assertEqual(sw.value_ms, 3000) self.assertEqual(sw.value_secs, 3) self.assertEqual(sw.value_hms, (0, 0, 3, 0)) self.assertEqual(sw.hms_str, "00:00:03.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), True) self.assertEqual(sw.is_elapsed_secs(3), True) # test stop sw.stop() set_mock_ticks_ms(1000 * 60 * 75.5 + 10000) self.assertEqual(sw.is_started, False) self.assertEqual(sw.value_ms, 3000) self.assertEqual(sw.value_secs, 3) self.assertEqual(sw.value_hms, (0, 0, 3, 0)) self.assertEqual(sw.hms_str, "00:00:03.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), True) self.assertEqual(sw.is_elapsed_secs(3), True) # test reset sw.reset() self.assertEqual(sw.is_started, False) self.assertEqual(sw.value_ms, 0) self.assertEqual(sw.value_secs, 0) self.assertEqual(sw.value_hms, (0, 0, 0, 0)) self.assertEqual(sw.hms_str, "00:00:00.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), False) self.assertEqual(sw.is_elapsed_secs(3), False) set_mock_ticks_ms(1000 * 60 * 75.5 + 6000) self.assertEqual(sw.is_started, False) self.assertEqual(sw.value_ms, 0) self.assertEqual(sw.value_secs, 0) self.assertEqual(sw.value_hms, (0, 0, 0, 0)) self.assertEqual(sw.hms_str, "00:00:00.000") self.assertEqual(sw.is_elapsed_ms(None), False) self.assertEqual(sw.is_elapsed_secs(None), False) self.assertEqual(sw.is_elapsed_ms(3000), False) self.assertEqual(sw.is_elapsed_secs(3), False)