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