======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)
#