======u4.lisp====== (load "micro-graphics/load.lisp") (load "07.lisp") ======Digitální sedmisegmentový displej ====== Úkolem je naprogramovat digitální displej, který bude složen z tzv. sedminsegmentovek. Sedmisegmentovka obsahuje sedm políček, které je možné individuálně rozsvěcet a zhasínat. Sedmisegmentovka bude schopná zozbrazovat čísla od 0 do 9, hodnota nil se bude interpretovat jako všechny segmenty zhasnuty. ======Třída 7-segment====== Vytvořte třídu 7-segment, která bude reprezentovat jednu sedmisegmentovku. Třída bude potomek třídy picture a bude mít tyto sloty: =====value:===== Bude reprezentovat hodnotu, která se má zobrazit. =====on-p:===== Bude indikovat, zda je sedmisegmentovka zapnutá nebo vypnutá (vypnutná sedmisegmentovka ale má stále hodnotu ve slotu value). (defclass 7-segment (picture) ((value :initform 0) (on-p :initform nil) )) _____ __0__ | | | | |1| |2| | | | | _____ __3__ | | | | |4| |5| | | | | _____ __6__ (defmethod initialize-instance ((self 7-segment) &key) ;jsme potomkem picture, do .items nacpeme segmenty ) ======Metody: ====== =====segments: ===== Vrátí segmenty sedmisegmentovky (ta bude reprezentována osmi polygony, tj. sedmi segmenty a podkladovým polygonem). =====set-segments: ===== Nastaví (tj. rozsvítí nebo zhasne) jednotlivé segmenty sedmisegmentovky. Vyberte si, jak budete hodnoty pro jednotlivé segmenty reprezentovat. Jedna možnost je reprezentace seznamem hodnot t a nil, kde každá hodnota odpovídá jednomu segmentu, t značí rozsvícený segment, nil zhasnutý segment. =====set-on===== =====set-off===== Zapne, resp. vypne sedmisegmentovku =====set-value===== Nastaví hodnotu, přípustné hodnoty jsou 0-9 Další částí úkolu je vytvořit displej složený se sedmisegmentovek. Displej bude reprezentován třídou segment-display, která bude potomkem třídy picture. Výchozí počet segmentů je šest. ======Třída segment-display====== Třída segment-display nebude mít žádné sloty (kromě zděděných, pochopitelně). (defclass segment-display () ;superclass? () ) Metody: =====segment-count: ===== Zjistí počet sedmisegmentovek displeje (počet sedmisegmentovek segmentů není třeba ukládat do slotu, dá se dynamicky zjistit z items). =====set-segment-count: ===== Nastaví počet sedmisegmentovek a provede reset. =====reset: ===== Provede reset displeje, tj. nastaví každý sedmisegment na nil =====value: ===== Vrátí seznam hodnot v sedmisegmentech. Nespecifikované sedmisegmenty budou mít hodnotu NIL. Poznámka: opět nemáme slot na hodnotu, kterou dynamicky zjistíme zhodnot jednotlivých sedmisegmentů. =====set-value: ===== Nastaví hodnoty sedmisegmentů podle zadaného seznamu hodnot. Jednotlivé hodnoty seinterpretují zleva doprava, pokud je seznam hodnot kratší než je počet segmentů, pak sezadané hodnoty zarovnají doprava (napříjklad pro seznam hodnot '(1 2 3 4) budou u displeje s šesti sedmisegmenty první dvě (zleva) sedmisegmentovky vypnuté dále budounásledovat hodnoty 1, 2, 3, a 4. Při pokusu o nastavení většího počtu hodnot než displejobsahuje sedmisegmentovek, musí být signalizována chyba. set-on, set-off: Zapne, resp. vypne displej. CL-USER 47 > (setf w (make-instance 'window)) # CL-USER 48 > (set-shape w (make-instance 'segment-display)) # CL-USER 49 > (redraw w) # CL-USER 51 > (set-value (shape w) '(1 2 3 4)) # CL-USER 52 > (redraw w) # CL-USER 53 > (value (shape w)) (NIL NIL 1 2 3 4) CL-USER 54 > (set-segment-count (shape w) 4) # CL-USER 55 > (redraw w) # CL-USER 57 > (set-value (shape w) '(9 0)) # CL-USER 58 > (redraw w) # CL-USER 59 > (set-off (shape w)) # CL-USER 60 > (redraw w) # CL-USER 61 > (set-on (shape w)) # CL-USER 62 > (redraw w) #