gusucode.com > 电子数字钟源码程序 > 电子数字钟源码程序/clockColon.m

    classdef clockColon < handle
    %% CLOCKCOLON a visual representation of a colon.
    %
    %
    % Syntax:
    %
    % colon = CLOCKCOLON;
    % colon = CLOCKCOLON(BOOL);
    % colon = CLOCKCOLON(X, Y);
    % colon = CLOCKCOLON(X, Y, BOOL);
    %
    %
    % Description:
    %
    % colon = CLOCKCOLON sets the status of the colon to true and
    % defaults the x and y locations of the top left corner of the
    % clockColon's matrix to (0, 0).
    %
    % colon = CLOCKCOLON(bool) sets the status of the colon to BOOL and
    % defaults the x and y locations of the top left corner of the
    % clockColon's matrix to (0, 0).
    %
    % colon = CLOCKCOLON(X, Y) sets the status of the colon to true and
    % sets the x and y locations of the top left corner of the
    % clockColon's matrix to (X, Y).
    %
    % colon = CLOCKCOLON(X, Y, bool) sets the status of the colon to BOOL
    % and sets the x and y locations of the top left corner of the
    % clockColon's matrix to (X, Y).
    %
    %
    % Copyright James Kristoff 2012
    %
    % see also: CLOCKSEGMENT, HORSEGMENT, VERTSEGMENT, SEVENSEGMENTDISPLAY,
    %           DIGICLOCK

    %% Properties of a CLOCKCOLON
    %These properties are protected, and cannot be accessed outside of this
    %class
    properties (Access = protected)
        rows        %number of rows in the clockColon's matrix
        cols        %number of columns in the clockColon's matrix
        colonMatrix %a matrix to be filled, then shown with IMSHOW
        hClockColon %a handle to the figure of the clockColon
        black       %a value of 255 which is used to normalize colonMatrix
    end
    %These properties are public, and can be accessed outside the class.
    %They are also observable, which means they can be watched by a
    %   listener function.
    properties (Access = public, SetObservable = true)
        topLeftX    %the X location of the top left corner
                    %   of the colonMatrix
        topLeftY    %the Y location of the top left corner
                    %   of the colonMatrix
        dots        %vector containing horSegment objects
        status      %the status of the clockColon, true or false, which
                    %    defines whether the clockColon is on or off
    end
    %% Custom events to be listened for by the class
    events
        parentClosed
    end
    %% Member functions for the class
    methods
        function obj = clockColon(varargin)
        %Default constructor for the class

            %handle is null until an image is created with IMSHOW
            obj.hClockColon = [];
            %initialize colon segment Locations
            obj.dots    = horSegment(2, 10, 5, 6);
            obj.dots(2) = horSegment(2, 24, 5, 6);
            %set the row and column size for the clockColon's matrix
            setDims(obj);
            %set black to 255
            obj.black = 255;
            %switch statement to parse inputs
            switch nargin
                case 0    %if nothing is passed then set values to default
                    obj.status   = true;
                    obj.topLeftX = 0;
                    obj.topLeftY = 0;
                case 1    %for one input expect a boolean
                    obj.status   = varargin{1};
                    obj.topLeftX = 0;
                    obj.topLeftY = 0;
                case 2    %for two inputs expect x and y values
                    obj.topLeftX = varargin{1};
                    obj.topLeftY = varargin{2};
                    obj.status   = true;
                case 3    %for three inputs expect x, y, and then a boolean
                    obj.topLeftX = varargin{1};
                    obj.topLeftY = varargin{2};
                    obj.status   = varargin{3};
                otherwise %otherwise put out an error
                    error('Between 0 and 3 inputs allowed');
            end
            %initializes and fills the clockColon's matrix with color
            reInit(obj);
            %begins listening for an event to which it will react
            addlistener(obj,'parentClosed', @parentClosedFcn);
        end
        function rows = getRows(obj)
        %get the number of rows
            rows = obj.rows;
        end
        function cols = getCols(obj)
        %get the number of columns
            cols = obj.cols;
        end
        function mat = getMat(obj)
        %get the clockColon's Matrix
            mat = obj.colonMatrix;
        end
        function setDims(obj)
        %set the number of rows and columns
            obj.rows = 39;
            obj.cols = 8;
        end
        function parentClosedFcn(obj, ~,~,~)
        %when the parent object is closed set the handle to null
            obj.hClockColon = [];
        end
        function notifyCloseParent(obj,~,~)
        %function necessary for custom event?
            notify(obj, 'parentClosed')
            closereq
        end
        function disp(obj)
        %overload the DISP function to display what we want for this object
            tmpStr1 = 'The status is: %i,\n';
            tmpStr2 = 'The display is located at: (%i, %i)\n';
            fprintf(1,                  ...
                    [tmpStr1 tmpStr2],  ...
                    obj.status,         ...
                    obj.topLeftX,       ...
                    obj.topLeftY);
        end
        function display(obj) %gets rid of a = at top...
        %overload DISPLAY function
            disp(obj)
        end
        function set.status(obj, value)
        %overloaded set function for status property

            %Check if value is a boolean
            if (value ~= true && value ~= false)
                warning('MATLAB:paramAmbiguous',...
                        'only booleans allowed, not changed');
            else
                switch value
                    case false
                        obj.dots(1).status = false; %#ok<*MCSUP>
                        obj.dots(2).status = false;
                    case true
                        obj.dots(1).status = true;
                        obj.dots(2).status = true;
                    otherwise
                        obj.dots(1).status = true;
                        obj.dots(2).status = true;
                        warning('MATLAB:paramAmbiguous',...
                                'Something went wrong setting a number\n');
                end
                obj.status = value;
            end
            %reinitialize
            reInit(obj);
        end
        function imshow(obj)
        %overload IMSHOW function to show the clockColon's matrix

            %if the image has not been created yet set the handle
            if isempty(obj.hClockColon)
                obj.hClockColon = imshow(obj.colonMatrix ./ obj.black);
                set(gcf,'closeRequestFcn',@obj.notifyCloseParent); 
                set(gca,'DeleteFcn'      ,@obj.notifyCloseParent);
            else %isHandle because it exists...
                if ishandle(obj.hClockColon)
                    %update the images data
                    set(obj.hClockColon, 'CData', obj.colonMatrix...
                                                ./obj.black);
                else
                    %Do nothing (it was ploted but has since disappeared)
                    obj.hClockColon = [];
                end
            end
        end
        function reInit(obj)
        %refills the matrix then shows the updated image
            populateDisplay(obj);

            if ~isempty(obj.hClockColon)
                imshow(obj);
            end
        end
        function populateDisplay(obj)
        %fills the clockColon with it's two horSegments

            %initialize segment to a black rectangle
            obj.colonMatrix = zeros (obj.rows,obj.cols,3);
            %fills clockColon with the segments
            for i = 1:size(obj.dots,2)
                obj.colonMatrix(obj.dots(i).topLeftY:...
                               (obj.dots(i).topLeftY ...
                              + obj.dots(i).getRows() - 1),...
                                obj.dots(i).topLeftX:...
                               (obj.dots(i).topLeftX ...
                              + obj.dots(i).getCols() - 1),...
                                :)...
                              = ...
               (obj.colonMatrix(obj.dots(i).topLeftY:...
                               (obj.dots(i).topLeftY ...
                              + obj.dots(i).getRows() - 1),...
                                obj.dots(i).topLeftX:...
                               (obj.dots(i).topLeftX ...
                              + obj.dots(i).getCols() - 1),...
                                :)...
                              + obj.dots(i).getMat());
            end
        end
    end
end