From b309c61de36a759110e3daf8a007b011a292df8c Mon Sep 17 00:00:00 2001
From: Alessandro Ranellucci <aar@cpan.org>
Date: Mon, 2 Nov 2015 01:35:28 +0100
Subject: [PATCH] Test button for serial connection

---
 lib/Slic3r/GUI/Tab.pm            | 45 ++++++++++++++++++++++++++++++--
 xs/src/libslic3r/GCodeSender.cpp |  1 +
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm
index 0d7981efe..3d65b5f7a 100644
--- a/lib/Slic3r/GUI/Tab.pm
+++ b/lib/Slic3r/GUI/Tab.pm
@@ -1000,7 +1000,8 @@ sub build {
     my $bed_shape_widget = sub {
         my ($parent) = @_;
         
-        my $btn = Wx::Button->new($parent, -1, "Set…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
+        my $btn = Wx::Button->new($parent, -1, "Set…", wxDefaultPosition, wxDefaultSize,
+            wxBU_LEFT | wxBU_EXACTFIT);
         $btn->SetFont($Slic3r::GUI::small_font);
         if ($Slic3r::GUI::have_button_icons) {
             $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/cog.png", wxBITMAP_TYPE_PNG));
@@ -1077,8 +1078,42 @@ sub build {
                 
                 return $btn;
             });
+            my $serial_test = sub {
+                my ($parent) = @_;
+                
+                my $btn = $self->{serial_test_btn} = Wx::Button->new($parent, -1,
+                    "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+                $btn->SetFont($Slic3r::GUI::small_font);
+                if ($Slic3r::GUI::have_button_icons) {
+                    $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/wrench.png", wxBITMAP_TYPE_PNG));
+                }
+                
+                EVT_BUTTON($self, $btn, sub {
+                    my $sender = Slic3r::GCode::Sender->new;
+                    my $res = $sender->connect(
+                        $self->{config}->serial_port,
+                        $self->{config}->serial_speed,
+                    );
+                    if ($res) {
+                        {
+                            # set up a timeout
+                            my $timestamp = time();
+                            my $CONNECTION_TIMEOUT = 3; # seconds
+                            1 until $sender->is_connected || (time - $timestamp) >= $CONNECTION_TIMEOUT;
+                        }
+                        $res = $sender->is_connected;
+                    }
+                    if ($res) {
+                        Slic3r::GUI::show_info($self, "Connection to printer works correctly.", "Success!");
+                    } else {
+                        Slic3r::GUI::show_error($self, "Connection failed.");
+                    }
+                });
+                return $btn;
+            };
             $line->append_option($serial_port);
             $line->append_option($optgroup->get_option('serial_speed'));
+            $line->append_widget($serial_test);
             $optgroup->append_line($line);
         }
         {
@@ -1114,7 +1149,8 @@ sub build {
             my $octoprint_host_test = sub {
                 my ($parent) = @_;
                 
-                my $btn = $self->{octoprint_host_test_btn} = Wx::Button->new($parent, -1, "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
+                my $btn = $self->{octoprint_host_test_btn} = Wx::Button->new($parent, -1,
+                    "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
                 $btn->SetFont($Slic3r::GUI::small_font);
                 if ($Slic3r::GUI::have_button_icons) {
                     $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/wrench.png", wxBITMAP_TYPE_PNG));
@@ -1300,6 +1336,11 @@ sub _update {
     my $config = $self->{config};
     
     $self->get_field('serial_speed')->toggle($config->get('serial_port'));
+    if ($config->get('serial_speed') && $config->get('serial_port')) {
+        $self->{serial_test_btn}->Enable;
+    } else {
+        $self->{serial_test_btn}->Disable;
+    }
     if ($config->get('octoprint_host') && eval "use LWP::UserAgent; 1") {
         $self->{octoprint_host_test_btn}->Enable;
     } else {
diff --git a/xs/src/libslic3r/GCodeSender.cpp b/xs/src/libslic3r/GCodeSender.cpp
index 65b4fbfd3..507e628e7 100644
--- a/xs/src/libslic3r/GCodeSender.cpp
+++ b/xs/src/libslic3r/GCodeSender.cpp
@@ -29,6 +29,7 @@ GCodeSender::GCodeSender()
 
 GCodeSender::~GCodeSender()
 {
+    printf("disconnecting\n");
     this->disconnect();
 }