Hallo Himbeerfreunde, Linux-Freaks und Forumsbewohner,
im heutigen Tutorial geht es um Vidgets - virtual input gadgets - auf Deutsch: graphische Bedienelemente. Diese werden am einfachsten mit dem Virtual Interface Builder VIB erzeugt, auf dem Bildschirm platziert, an die entsprechenden Bedürfnisse angepasst (konfiguriert). VIB erzeugt den Quellcode einer lauffähigen GUI-Anwendung (GUI = Graphical User Interface, graphische Benutzerschnittstelle). Wer es genauer wissen möchte: Quellcode in der Programmiersprache Icon - aber das war wohl klar, oder?
In diesem Tutorial
- werden die graphischen Bedienelemente der Programmiersprache Icon vorgestellt,
- wird das Konzept der Callback-Routinen vorgestellt,
- wird gezeigt, wie das Programm VIB bedient wird,
- wird die Entwicklung einer Beispielanwendung gezeigt, die wohl jeder Raspbianer nützlich finden wird: ein Programm zum Ansteuern der GPIO-Pins per Mausklick,
- werden Records und Prozeduren aus [font="Courier"]/home/pi/icon9_51/ipl/gprocs[/font] vorgestellt, mit denen Vidgets auch ohne VIB erstellt und angezeigt werden können sowie Ereignisse auf eigene Vidgets ausgedehnt werden können
- wird gezeigt, wie man aus dem Icon-Code, der von VIB erzeugt wird, eine vollfunktionsfähige GUI-Anwendung erstellt,
In der Übungsaufgabe bekommt Ihr die Aufgabe gestellt, ein GPIO-Kontrollzentrum zu kreieren - zunächst als VIB-Anwendung:
- alle GPIOs auf einen Blick
- 2 GPIOs werden mit einer DUO-LED belegt; über eine Checkbox wird ausgewählt, ob die LED automatisch blinken soll, über einen Rollbalken wird die Blinkfrequenz eingestellt
- mehrere LEDs können angesteuert werden
- eine 7Segment-Anzeige wird angesteuert
Im nächsten Tutorial zeige ich dann, wie aus der VIB-Ausgabe ein richtiges GPIO-Kontrollzentrum wird - und auf der 7Segment-Anzeige nicht nur alle Ziffern sondern auch noch darstellbare Buchstaben angezeigt werden.
Sollte ich jemanden jetzt neugierig gemacht haben, dieses Tutorial als Gelegenheit zu nutzen, doch noch mit elektronischen Basteleien zu beginnen, habe ich auf den letzten 5 Seiten eine Übersicht über eine Grundausstattung (Elektronik-Bauteile, Werkzeuge) zusammengestellt, die im nächsten Tutorial-Teil zum Einsatz kommen.
In der nächsten Ausgabe zeige ich dann, wie man daraus
- Jumperkabel und
- mit Hilfe der Schneid-Klemmtechnik GPIO-Kabel
herstellt
Beides ist für das GPIO-Kontrollzenrum erforderlich.
Ach ja, dieses Tutorial hat aufgrund
- der Länge der Lösung der Übungsaufgabe (Alles mit Primzahlen machen),
- begleitender Screenschots,
- der ausführlichen Bedienungsanleitung der Anwendung VIB,
- weiterer zahlreicher Screenshots zur Erläuterung der Dialogfenster von VIB,
- der Vorstellung der mit den Vidgets zusammenhängenden Records,
- der Vorstellung der mit den Vidgets zusammenhängenden Prozeduren
Ü B E R L Ä N G E.
Die Zusammenstellung der Bauteile und Werkzeuge inkl. Photos habe ich auf Extraseiten ausgelagert (da letztere jeglichen Rahmen sprengen).
Egal, es war viel Arbeit - endlich mal sinnvolle Abende im Hotel, da ich einen Großteil dieses Tutorials auf meinem neuesten Raspberry Pi mit 7"-Touchscreen in den Abendstunden geschrieben habe.
Ich wünsche Euch viel Spaß und viele neue Erkenntnisse.
Gutes Gelingen!
Andreas
P.S.: Während der etwas längeren Berabeitung dieses Tutorial-Teil kam mir eine Idee, Buttons relativ zur Bildschrimgröße zu positionieren und auch deren Größe anzupassen. Herausgekommen ist folgendes kleines Programm.
Das Programm würde ich heute allerdings anders schreiben, denn man kann der Prozedur ProcessEvent() eine Routine mit auf den Weg geben, die sich mit Resizing-Ereignissen (also Größen-Änderung von Fenstern) beschäftigt. Diese Resizing-Funktion ruft automatisch die Resizing-Funktionen jedes Vidget-Typs auf. Aus meiner Resizing-Funktion wird dann ein Einzeiler... bzw. wird ganz überflüssig. Daran kann man erkennen, dass die Icon-Entwickler nicht nur den Ansatz verfolgten, eine Programmiersprache zu erdichten - sondern ursprünglich die Absicht im Vordergrund stand, ein komplettes Betriebssystem zu erschaffen. Denn dafür gab es mal Fördermittel für den Fachbereich Computer Science der Uni in Arizona in Höhe von 640.000 $. Lang, lang ist's her...
Hier das Programm in der ursprünglichen Version:
############################################################################
#
# File: /home/andreas/icon9_51/bin/rwelativeButtons.icn
#
# Subject: Program to ...
#
# Author:
#
# Date: September 27, 2014
#
############################################################################
#
#
#
############################################################################
#
# Requires:
#
############################################################################
#
# Links: vsetup
#
############################################################################
# This vib interface specification is a working program that responds
# to vidget events by printing messages. Use a text editor to replace
# this skeletal program with your own code. Retain the vib section at
# the end and use vib to make any changes to the interface.
link vsetup
global vidgets
procedure resizer()
if *Pending() = 0 then
{ Bg("brown")
EraseArea(1,1, WAttrib("width"), WAttrib("height"))
Bg("pale gray")
rand := WAttrib("width") / 100
newheight := (WAttrib("height") - 20) / 3 - rand - 3
newfontheight := newheight
Font("sans," || newfontheight)
while (WAttrib("fheight") >= newheight) & (newfontheight > 1) do
{ newfontheight -:= 1
Font("sans," || newfontheight)
#write(newfontheight)
}
every i := 1 to *vidgets - 1 do
{ vidgets["button" || i].ax := rand + ((i-1) % 3) * WAttrib("width") / 3
vidgets["button" || i].ay := rand + ((i-1) / 3) * WAttrib("height") / 3
vidgets["button" || i].aw := (WAttrib("width") - 20) / 3 - rand
vidgets["button" || i].ah := (WAttrib("height") - 20) / 3 - rand
Bg("blue")
resize_Vbutton(vidgets["button" || i])
Fg("yellow")
draw_Vbutton(vidgets["button" || i])
Fg("yellow")
draw_Vmessage(vidgets["button" || i])
}
}
end
procedure main(args)
local root, paused
(WOpen ! ui_atts()) | stop("can't open window")
vidgets := ui() # set up vidgets
root := vidgets["root"]
resizer()
paused := 1 # flag no work to do
repeat
{ while (*Pending() > 0) | \paused do
{ ProcessEvent(root, QuitCheck, resizer)
}
}
end
procedure button_cb1(vidget, value)
return
end
procedure button_cb2(vidget, value)
return
end
procedure button_cb3(vidget, value)
return
end
procedure button_cb4(vidget, value)
return
end
procedure button_cb5(vidget, value)
return
end
procedure button_cb6(vidget, value)
return
end
procedure button_cb7(vidget, value)
return
end
procedure button_cb8(vidget, value)
return
end
procedure button_cb9(vidget, value)
return
end
#===<<vib:begin>>=== modify using vib; do not remove this marker line
procedure ui_atts()
return ["size=600,401", "bg=pale gray", "resize=on"]
end
procedure ui(win, cbk)
return vsetup(win, cbk,
[":Sizer:::0,0,600,401:",],
["button1:Button:regular::28,13,35,20:1",button_cb1],
["button2:Button:regular::65,13,35,20:2",button_cb2],
["button3:Button:regular::101,13,35,20:3",button_cb3],
["button4:Button:regular::28,33,35,20:4",button_cb4],
["button5:Button:regular::65,33,35,20:5",button_cb5],
["button6:Button:regular::101,33,35,20:6",button_cb6],
["button7:Button:regular::28,53,35,20:7",button_cb7],
["button8:Button:regular::65,53,35,20:8",button_cb8],
["button9:Button:regular::101,53,35,20:9",button_cb9],
)
end
#===<<vib:end>>=== end of section maintained by vib
Display More
[hr]
Inhaltsangabe:
1. Icon Tutorial Teil 1: Die Programmiersprache Icon - Installation
2. Icon Tutorial Teil 2: Geany: Installation und Konfiguration der IDE Geany
3. Icon Tutorial Teil 3: Eingabe und Ausgabe
4. Icon Tutorial Teil 4: Programmierer-definierte Kontrollstrukturen: Schleifen und Fallentscheidungen
5. Icon tutorial Teil 5: Numerische Datentypen, ihre Funktionen und Operatoren
6. Icon Tutorial Teil 6: Zeichen-basierte Datentypen, ihre Funktionen ud Operatoren
7. Icon Tutorial Teil 7: Struktureirte Datentypen, ihre Funktionen und Operatoren
8. Icon Tutorial Teil 8: Die Datentypen procedure und co-expression
9. Icon Tutorial Teil 9: Konzept des Zeichenketten-Scannens
10. Icon Tutorial Teil 10: Ausdrucks-Auswertung, Typ-Umwandlung, Strukturen sortieren
11. Icon Tutorial Teil 11: Sammelsurium: Zeichenkettennamen, Zeichenketten-Anrufungen, Speichermanagement, Sonstige Fähigkeiten
12. Icon Tutorial Teil 12: Bibliotheken
13. Icon Tutorial Teil 13: Präprozessor
14. Icon Tutorial Teil 14: Fehler & Fehlerbeseitigung
15. Icon Tutorial Teil 15: Graphik I: Window-Datentyp
16. Icon Tutorial Teil 16: Graphik II: Zeichnen und Füllen
17. Icon Tutorial Teil 17: Graphik III: Turtle-Graphik
18. Icon Tutorial Teil 18: Graphik IV: Text
19. Icon Tutorial Teil 19: Graphik V: Farben und Images
20. Icon Tutorial Teil 20: Graphik VI: Fenster
21. Icon Tutorial Teil 21: Interaktion
22. Icon Tutorial Teil 22: Standard-Dialoge
23. Icon Tutorial Teil 23: Vidgets und GUI-Entwicklungen mit VIB (Visual Interface Builder)
24. Icon Tutorial Teil 24: Hardware-Basteleien & Vervollständigung der GPIO-Kommandozentrale
25. Icon-Tutorial Teil 25: Ereignisbehandlung bei Anwendungen mit mehr als einem Fenster - Individuelle Dialoge mit VIB erstellen und programmieren
26. Icon Tutorial Teil 26: Individuelle Dialoge mit VIB
27. Icon Tutorial Teil 27: Ein Spiel entwickeln: Mastermind - Entwurf und GUI-Layout
28. Icon Tutorial Teil 28: Ein Spiel entwickeln: Mastermind - Ereignisbehandlung & Auswertelogik
29. Icon Tutorial Teil 29: Ein Spiel entwickeln: Mastermind - Der Code
Ideen, Block I (in Entwicklung)
30. Icon Tutorial Teil 30: Von Icon auf C-Bibliotheken zugreifen
31. Icon Tutorial Teil 31: Von Icon auf C++-Bibliotheken zugreifen
32. Von Icon auf Prolog-Bibliotheken zugreifen
Ideen, Block II (Software läuft!)
33: Text-to-Speech - Speech-to-Text: Sprachsynthese und Sprachanalyse auf dem Raspberry Pi in Icon
Ideen, Block III (Software für #35 läuft!)
34: GUI mit dem Event-Multiplexor (EVMUX) gestalten inkl. Programmierung der Ereignisbehandlung
35: Symbolizer für Bi-Level-Graphiken
36: Symbolizer für Grafiken mit Icon-Farbpaletten
Ideen, Block IV (Software läuft!)
37: Pseudo-Code-Compiler
Ideen, Block V (Software läuft)
38: Dia-Shower
Ideen, Block VI (Ideensammlung)
39: Hardware-Basteleien: A/D-Wandler und dessen Programmierung in Icon