function GUI_Slider_Sollwert
% GUI mit je drei Slidern, Sollwertanzeigen und Beschriftungen

clear all;
close all;
clc;

%Einstellen des Wertebereichs der Slider

Max_Slider_x = 1000;
Max_Slider_y = 1000;
Max_Slider_z = 200;

%Definition des COM-Ports und der Größe und Position der figure
s = serial('COM7','baudrate',9600);

f = figure('Visible','off','Position',[360,500,500,400],'NumberTitle','off');

%Panel für Slider, Anzeige und Beschriftungen
%Panel_1 stellt die Bedienelemente für die Sollwertvorgabe bereit
%Panel_2 stellt die Bediebelemente zum Starten und Stoppen der Seriellen
%Kommunikation bereit
%Panel_3 stellt den Pushbutton zum senden der Koordinaten an die Serielle
%Schnittstelle bereit.

Panel_1 = uipanel('Title','Sollwertvorgabe','Position',[0 .33 1 .33]);
Panel_2 = uipanel('Title','Kommunikation Starten/Stoppen','Position',[0 .66 1 .33]);
Panel_3 = uipanel('Title','Koordinaten senden','Position',[0 0 1 0.33]);

%Aufbau der Slider
Achse_x = uicontrol('Parent',Panel_1,'Style','slider','String','X-Achse',...
'Position',[100,80,300,20],...
'Min',0,'Max',Max_Slider_x,...
'SliderStep',[0.001 0.1],...
'Callback',{@achse_x_callback});

Achse_y = uicontrol('Parent',Panel_1,'Style','slider','String','Y-Achse',...
'Position',[100,50,300,20],...
'Min',0,'Max',Max_Slider_y,...
'SliderStep',[0.001 0.1],...
'Callback',{@achse_y_callback});

Achse_z = uicontrol('Parent',Panel_1,'Style','slider','String','Z-Achse',...
'Position',[100,20,300,20],...
'Min',0,'Max',Max_Slider_z,...
'SliderStep',[0.001 0.1],...
'Callback',{@achse_z_callback});


%Aufbau der Beschriftungen der Slider
text_1 = uicontrol('Parent',Panel_1,'Style','Text','String','X-Achse',...
    'Position',[25,80,60,20]);

text_2 = uicontrol('Parent',Panel_1,'Style','Text','String','Y-Achse',...
    'Position',[25,50,60,20]);

text_3 = uicontrol('Parent',Panel_1,'Style','Text','String','Z-Achse',...
    'Position',[25,20,60,20]);

%Aufbau der Koordinatenanzeige
Koor_x = uicontrol('Parent',Panel_1,'Style','Text','String','',...
    'Position',[420,80,50,20],...
    'BackgroundColor','w');

Koor_y = uicontrol('Parent',Panel_1,'Style','Text','String','',...
    'Position',[420,50,50,20],...
    'BackgroundColor','w');

Koor_z = uicontrol('Parent',Panel_1,'Style','Text','String','',...
    'Position',[420,20,50,20],...
    'BackgroundColor','w');

%Aufbau der Bedienelemente zum Starten und Stoppen der Seriellen
%Kommunikation
Starten = uicontrol('Parent',Panel_2,'Style','Pushbutton','String','Start',...
    'Position',[25,30,100,50],...
    'BackgroundColor','green','FontWeight','bold','FontSize',10,...
    'Callback',{@starten_callback});

Stoppen = uicontrol('Parent',Panel_2,'Style','Pushbutton','String','Stop',...
    'Position',[150,30,100,50],...
    'BackgroundColor','red','FontWeight','bold','FontSize',10,...
    'Callback',{@stoppen_callback});

%Aufbau des Pushbuttons zum Senden der Koordinaten an die Serielle
%Schnittstelle.
Senden = uicontrol('Parent',Panel_3,'Style','Pushbutton','String','senden',...
    'Position',[25,30,100,50],...
    'BackgroundColor',[0.5 0.7 1],'FontWeight','bold','FontSize',10,...
    'Callback',{@senden_callback});

%Initialisierung der GUI
set([f,Panel_1,Achse_x,Achse_y,Achse_z,...
    text_1,text_2,text_3,...
    Koor_x,Koor_y,Koor_z,...
    Starten,Stoppen,...
    Senden],...
    'Units','normalized');

set(f,'Name','Sollwertvorgabe mit Slider')

movegui(f,'center')

set(f,'Visible','on');
set(Achse_x,'Visible','off');
set(Achse_y,'Visible','off');
set(Achse_z,'Visible','off');
set(Senden,'Visible','off');

%Slider-Callbackfunktionen
    function achse_x_callback(source,eventdata)

        I = get(source,'Value');
        Koordinate = int16(I);
        Wert = num2str(Koordinate);
        set(Koor_x,'String',Wert);

    end

    function achse_y_callback(source,eventdata)

        I = get(source,'Value');
        Koordinate = int16(I);
        Wert = num2str(Koordinate);
        set(Koor_y,'String',Wert);

    end

    function achse_z_callback(source,eventdata)

        I = get(source,'Value');
        Koordinate = int16(I);
        Wert = num2str(Koordinate);
        set(Koor_z,'String',Wert);

    end

%Pushbutton-Callbackfunktionen für Serielle Kommunikation.
    function starten_callback(source,eventdata)
                
        fopen(s);
        pause(7);
        set(Achse_x,'Visible','on');
        set(Achse_y,'Visible','on');
        set(Achse_z,'Visible','on');
        set(Senden,'Visible','on');
    end

    function stoppen_callback(source,eventdata)
        fclose(s);
        delete(s);
        clear s;
        pause(2);
        close (f);
    end

%Pushbutton-Callbackfunktion zum senden der Koordinaten an die Serielle
%Schnittstelle.
    function senden_callback(source,eventdata)
        
        XKoor = '00000';
        YKoor = '00000';
        ZKoor = '00000';
        
        x = int16(get(Achse_x,'Value'));
        y = int16(get(Achse_y,'Value'));
        z = int16(get(Achse_z,'Value'));
        
        xchar = num2str(x);
        ychar = num2str(y);
        zchar = num2str(z);
        
        jx = 5-length(xchar)+1;
        jy = 5-length(ychar)+1;
        jz = 5-length(zchar)+1;
        
        for i=1:length(xchar)
            XKoor(jx) = xchar(i);
            jx = jx+1;
        end
        
        for i=1:length(ychar)
            YKoor(jy) = ychar(i);
            jy = jy+1;
        end
        
        for i=1:length(zchar)
            ZKoor(jz) = zchar(i);
            jz = jz+1;
        end
        
        zusenden = ['x',XKoor,'y',YKoor,'z',ZKoor,'e'];
        disp(zusenden);
        fprintf(s,zusenden);
    end
end