예제 #1
0
 def test_process_should_adjust_laser_power(self):
     self.laser_control = LaserControl(0.5)
     self.laser_control.set_laser_on()
     sample_data_chunk = numpy.array([(0, 0)])
     micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
     micro_disseminator.process(sample_data_chunk)
     self.mock_comm.send.assert_called_with(MoveMessage(0, 0, 127))
예제 #2
0
    def print_layers(self,
                     layer_generator,
                     print_sub_layers=True,
                     dry_run=False,
                     force_source_speed=False):
        logger.info("Shuffled: %s" %
                    self._configuration.options.use_shufflelayers)
        logger.info("Sublayered: %s" %
                    self._configuration.options.use_sublayers)
        logger.info("Overlapped: %s" % self._configuration.options.use_overlap)

        if self._configuration.options.use_sublayers and print_sub_layers:
            layer_generator = SubLayerGenerator(
                layer_generator,
                self._configuration.options.sublayer_height_mm)
        if self._configuration.options.use_shufflelayers:
            layer_generator = ShuffleGenerator(
                layer_generator,
                self._configuration.options.shuffle_layers_amount)
        if self._configuration.options.use_overlap:
            layer_generator = OverLapGenerator(
                layer_generator, self._configuration.options.overlap_amount)

        if self._configuration.serial.on:
            self._commander = SerialCommander(self._configuration.serial.port)
        else:
            self._commander = NullCommander()

        self.laser_control = LaserControl(
            self._configuration.cure_rate.override_laser_power_amount)

        transformer = HomogenousTransformer(
            self._configuration.calibration.max_deflection,
            self._configuration.calibration.height,
            self._configuration.calibration.lower_points,
            self._configuration.calibration.upper_points,
        )

        state = MachineState()
        self._status = MachineStatus()

        if dry_run:
            abort_on_error = False
        else:
            abort_on_error = True

        self._zaxis = self._get_zaxis(dry_run)

        disseminator = self._get_digital_disseminator(dry_run)

        path_to_points = PathToPoints(
            disseminator.samples_per_second, transformer,
            self._configuration.options.laser_thickness_mm)

        if force_source_speed:
            override_draw_speed = None
            override_move_speed = None
        else:
            override_draw_speed = self._configuration.cure_rate.draw_speed if self._configuration.cure_rate.use_draw_speed else None
            override_move_speed = self._configuration.cure_rate.move_speed if self._configuration.cure_rate.use_draw_speed else None

        pre_layer_delay = self._configuration.options.pre_layer_delay if self._configuration.options.pre_layer_delay else 0.0
        post_fire_delay_speed = None
        slew_delay_speed = None
        if self._configuration.options.post_fire_delay:
            post_fire_delay_speed = self._configuration.options.laser_thickness_mm / (
                float(self._configuration.options.post_fire_delay) / 1000.0)
        if self._configuration.options.slew_delay:
            slew_delay_speed = self._configuration.options.laser_thickness_mm / (
                float(self._configuration.options.slew_delay) / 1000.0)

        if self._configuration.options.wait_after_move_milliseconds > 0:
            wait_speed = self._configuration.options.laser_thickness_mm / (
                float(self._configuration.options.wait_after_move_milliseconds)
                / 1000.0)
        else:
            wait_speed = None

        self._writer = LayerWriter(disseminator,
                                   path_to_points,
                                   self.laser_control,
                                   state,
                                   move_distance_to_ignore=self._configuration.
                                   options.laser_thickness_mm,
                                   override_draw_speed=override_draw_speed,
                                   override_move_speed=override_move_speed,
                                   wait_speed=wait_speed,
                                   post_fire_delay_speed=post_fire_delay_speed,
                                   slew_delay_speed=slew_delay_speed)

        self._layer_processing = LayerProcessing(
            self._writer,
            state,
            self._status,
            self._zaxis,
            self._configuration.dripper.max_lead_distance_mm,
            self._commander,
            pre_layer_delay,
            self._configuration.serial.layer_started,
            self._configuration.serial.layer_ended,
            self._configuration.serial.print_ended,
            self._configuration.serial.on_command,
            self._configuration.serial.off_command,
        )

        if self._zaxis:
            self._zaxis.set_call_back(self._status.drip_call_back)
            self._zaxis.start()

        self._controller = Controller(
            self._writer,
            self._layer_processing,
            layer_generator,
            self._status,
            abort_on_error=abort_on_error,
        )

        self._controller.start()
예제 #3
0
 def test_laser_power_throws_if_outside_range(self):
     with self.assertRaises(Exception):
         LaserControl(1.001)
     with self.assertRaises(Exception):
         LaserControl(-0.001)
예제 #4
0
 def test_laser_power_shows_default_when_provided(self):
     expected_laser_power = 0.6
     l = LaserControl(expected_laser_power)
     l.set_laser_on()
     self.assertEquals(expected_laser_power, l.laser_power())
예제 #5
0
 def test_laser_power_shows_1_when_laser_on(self):
     l = LaserControl()
     l.set_laser_on()
     self.assertEquals(1.0, l.laser_power())
예제 #6
0
 def test_laser_power_shows_0_when_laser_off(self):
     l = LaserControl()
     l.set_laser_off()
     self.assertEquals(0.0, l.laser_power())
예제 #7
0
 def test_turn_laser_off_shows_laser_off(self):
     l = LaserControl()
     l.set_laser_on()
     self.assertTrue(l.laser_is_on())
     l.set_laser_off()
     self.assertFalse(l.laser_is_on())
예제 #8
0
 def test_default_state_is_off(self):
     l = LaserControl()
     self.assertFalse(l.laser_is_on())
예제 #9
0
    def __init__(self, configuration_manager):
        logger.info("Calibartion API Startup")
        self._configuration_manager = configuration_manager
        self._configuration = self._configuration_manager.load()

        self._point_generator = SinglePointGenerator()
        self._blink_generator = BlinkGenerator()
        self._orientaiton_generator = OrientationGenerator()
        self._alignment_generator = CalibrationLineGenerator()
        self._scale_generator = ScaleGenerator(speed=2.0, radius=1.0)

        self._test_patterns = {
            'Hilbert Space Filling Curve': HilbertGenerator(),
            'Square': SquareGenerator(),
            'Circle': CircleGenerator(),
            'Spiral': SpiralGenerator(),
            'Memory Hourglass': MemoryHourglassGenerator(),
            'Damping Test': DampingTestGenerator(),
            'NESW': NESWGenerator(),
            'Twitch': TwitchGenerator(),
            }

        self._current_generator = self._point_generator

        self._laser_control = LaserControl(self._configuration.cure_rate.override_laser_power_amount)
        transformer = TuningTransformer(scale=self._configuration.calibration.max_deflection)
        self._controller = None
        logger.debug("Setting up audiowriter")

        self._current_generator = self._point_generator

        self._state = MachineState()
        self._status = MachineStatus()

        self._communicator = UsbPacketCommunicator(self._configuration.circut.calibration_queue_length)
        self._communicator.start()
        self._disseminator = MicroDisseminator(
            self._laser_control,
            self._communicator,
            self._configuration.circut.data_rate
            )

        self._path_to_points = PathToPoints(
            self._disseminator.samples_per_second,
            transformer,
            self._configuration.options.laser_thickness_mm
            )

        post_fire_delay_speed = None
        slew_delay_speed = None
        if self._configuration.options.post_fire_delay:
            post_fire_delay_speed = self._configuration.options.laser_thickness_mm / (float(self._configuration.options.post_fire_delay) / 1000.0)
        if self._configuration.options.slew_delay:
            slew_delay_speed = self._configuration.options.laser_thickness_mm / (float(self._configuration.options.slew_delay) / 1000.0)

        self._writer = LayerWriter(
            self._disseminator,
            self._path_to_points,
            self._laser_control,
            self._state,
            post_fire_delay_speed=post_fire_delay_speed,
            slew_delay_speed=slew_delay_speed
            )

        self._layer_processing = LayerProcessing(
            self._writer,
            self._state,
            self._status,
            )

        self._controller = Controller(
            self._writer,
            self._layer_processing,
            self._current_generator,
            self._status,
            abort_on_error=False,
            )

        self.make_pattern_fit()
        self._controller.start()
예제 #10
0
 def test_next_layer_does_nothing(self):
     micro_disseminator = MicroDisseminator(LaserControl(), MagicMock(), 8000)
     micro_disseminator.next_layer(7.7)
예제 #11
0
 def test_samples_per_second_is_data_rate(self):
     expected_samples_per_second = 8000
     micro_disseminator = MicroDisseminator(LaserControl(), MagicMock(), expected_samples_per_second)
     self.assertEquals(expected_samples_per_second, micro_disseminator.samples_per_second)
예제 #12
0
 def setUp(self):
     self.max_value = pow(2, MicroDisseminator.BIT_DEPTH) - 1
     self.mock_comm = MagicMock()
     self.laser_control = LaserControl()
예제 #13
0
class MicroDisseminatorTests(unittest.TestCase, TestHelpers):
    def setUp(self):
        self.max_value = pow(2, MicroDisseminator.BIT_DEPTH) - 1
        self.mock_comm = MagicMock()
        self.laser_control = LaserControl()

    def test_samples_per_second_is_data_rate(self):
        expected_samples_per_second = 8000
        micro_disseminator = MicroDisseminator(LaserControl(), MagicMock(), expected_samples_per_second)
        self.assertEquals(expected_samples_per_second, micro_disseminator.samples_per_second)

    def test_next_layer_does_nothing(self):
        micro_disseminator = MicroDisseminator(LaserControl(), MagicMock(), 8000)
        micro_disseminator.next_layer(7.7)

    def test_process_should_call_com_with_move_when_laser_off(self):
        self.laser_control.set_laser_off()
        sample_data_chunk = numpy.array([(0, 0)])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.mock_comm.send.assert_called_with(MoveMessage(0, 0, 0))

    def test_process_should_call_com_with_move_when_laser_on(self):
        self.laser_control.set_laser_on()
        sample_data_chunk = numpy.array([(0, 0)])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.mock_comm.send.assert_called_with(MoveMessage(0, 0, 255))

    def test_process_should_adjust_laser_power(self):
        self.laser_control = LaserControl(0.5)
        self.laser_control.set_laser_on()
        sample_data_chunk = numpy.array([(0, 0)])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.mock_comm.send.assert_called_with(MoveMessage(0, 0, 127))

    def test_process_should_call_com_with_correct_posisitions(self):
        self.laser_control.set_laser_on()
        sample_data_chunk = numpy.array([(1, 1)])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.mock_comm.send.assert_called_with(MoveMessage(self.max_value, self.max_value, 255))

    def test_process_should_handle_empty_lists(self):
        self.laser_control.set_laser_on()
        sample_data_chunk = numpy.array([])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.assertEqual(0, self.mock_comm.send.call_count)

    def test_process_should_call_com_each_element_in_list(self):
        self.laser_control.set_laser_on()
        sample_data_chunk = numpy.array([(0.0, 1.0), (0.5, 0.0), (1.0, 0.5)])
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.process(sample_data_chunk)
        self.mock_comm.send.assert_has_calls([
            call(MoveMessage(0,     self.max_value, 255)),
            call(MoveMessage(self.max_value / 2, 0,     255)),
            call(MoveMessage(self.max_value, self.max_value / 2, 255)),
            ])

    def test_close_calls_close_on_communicator(self):
        micro_disseminator = MicroDisseminator(self.laser_control, self.mock_comm, 8000)
        micro_disseminator.close()
        self.mock_comm.close.assert_called_with()