1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| ' Gambas class file PUBLIC PORT_DATA AS INTEGER = &H378 ' PORT de BASE avec &H378,&H278 ou &H3bc. PUBLIC PORT_STAT AS INTEGER = PORT_DATA + 1 ' PORT de STATUT. PUBLIC PORT_CTRL AS INTEGER = PORT_DATA + 2 ' PORT de CONTROLE. PUBLIC hPort AS File PUBLIC PicLEDS AS OBJECT[8] 'Déclaration pour la Construction des LEDS, pour TEST et ANIMATIONS. PUBLIC ColorLEDS AS Integer[] = [&HDFFFBF&, &H80FF00&] ' Couleur Rouge [&H00FFDFDF&, &H00FF0000&]
PUBLIC SUB Form_Open()
BuildFrameLEDS ' Seulement, pour TEST et ANIMATIONS. ME.X = (Desktop.Width - ME.W) / 2 ME.Y = 0 OpenInit_PORT
END
PUBLIC SUB Form_Close() ' Ferme les PORTS, puis l'Application.
Write_PORT(PORT_DATA, 0) CLOSE #hPort
END
PUBLIC SUB OpenInit_PORT() ' Ouverture et Initialisation des PORTS. hPort = OPEN "/dev/port" FOR READ WRITE Write_PORT(PORT_CTRL, 0) Write_PORT(PORT_DATA, 0) OnOff_LEDS END
PUBLIC SUB Write_PORT(PORT AS INTEGER, iValue AS BYTE) ' Ecriture sur un PORT.
SEEK #hPort, PORT WRITE #hPort, iValue
END
PUBLIC FUNCTION Read_PORT(PORT AS INTEGER) AS BYTE ' Lecture sur un PORT.
DIM iValue AS BYTE = 0
SEEK #hPort, PORT READ #hPort, iValue
RETURN iValue END
'==================================================================== ' Ci - Dessous CODE, pour TEST, et ANIMATIONS. '==================================================================== PUBLIC SUB BuildFrameLEDS()
DIM iFor AS INTEGER = 0 FOR iFor = 0 TO 7 'Construction de la Frame de LEDS PicLEDS[iFor] = NEW PictureBox(Frame4) AS "PicLEDSchange" WITH PicLEDS[iFor] .x = 45 + (iFor * 28) .y = 18 .h = 12 .w = 24 '.Tag = 7 - iFor .Tag = "LEDS," & Str$(7 - iFor) .Border = Border.Plain .Background = ColorLEDS[0] END WITH NEXT StartStop.ForeColor = Color.DarkGreen END
PUBLIC SUB RND_Click() ' Valide/Invalide le Générateur Pseudo-Aléatoire.
IF LAST.Value THEN DATA.Enabled = FALSE Timer1.Enabled = TRUE StartStop.Text = "Stop" StartStop.ForeColor = Color.Red ELSE DATA.Enabled = TRUE ENDIF
END
PUBLIC SUB StartStop_Click() ' Démarre/Arrête l'Animation. Timer1.Delay = DELAY.Value IF LAST.Text = "Start" THEN LAST.Text = "Stop" StartStop.ForeColor = Color.Red DELAY.Enabled = FALSE Timer1.Start ELSE LAST.Text = "Start" Timer1.Stop DELAY.Enabled = TRUE StartStop.ForeColor = Color.DarkGreen ENDIF DATA_Change END
PUBLIC SUB DATA_Change() ' Ecriture/Lecture PORT_DATA.
Write_PORT(PORT_DATA, DATA.Value) DATA.Value = Read_PORT(PORT_DATA) Show_DATA.Text = DATA.Value OnOff_LEDS
END
PUBLIC SUB Timer1_Timer() ' Animation.
IF RND.value THEN DATA.Value = Int(Rnd(256)) ' Génération de BITS Pseudo-Aléatoire. ELSE DATA.Value = (Read_PORT(PORT_DATA)) XOR &HFF ' Inverse les BITS sur la SORTIE. ENDIF DATA_Change END
PUBLIC SUB OnOff_LEDS() ' Actualisation des LEDS. DIM iFor AS INTEGER = 0 DIM iData AS BYTE = DATA.Value FOR iFor = 7 TO 0 STEP -1 PicLEDS[iFor].Background = ColorLEDS[iData AND &H01] iData = Lsr(iData, 1) ' Décalage d'un BIT, vers la Droite. NEXT END
PUBLIC SUB PicLEDSchange_MouseDown() ' Change l'Etat des LEDS.
DIM sArElem AS String[]
sArElem = Split(LAST.Tag, " , \n") SELECT sArElem[0] CASE "LEDS" DATA.Value = BChg(DATA.Value, sArElem[1]) ' Inverse l'état de la LED Cliquée CASE "LSB" DATA.Value = sArElem[1] ' Toutes les LEDS, Eteintes. CASE "MSB" DATA.Value = sArElem[1] ' Toutes les LEDS, Allumées. CASE "QUIT" ME.Close END SELECT
END
|
merci pour le partage.
Pour info, plutôt que de lancer l'application avec les droits super utilisateurs, on peut ajuster les droits sur le fichier /dev/port, exemple (sur debian) :
crw-r----- 1 root kmem 1, 4 mai 15 18:31 /dev/port
on ajoute le droit de lecture et écriture à tout le monde :
florian@biduloscope:~$ ls -l /dev/port
crw-rw-rw- 1 root kmem 1, 4 mai 15 18:31 /dev/port
Dans un cas comme dans l'autre, il semblerait que l'utilisation du fichier /dev/port est un risque pour la sécurité du système (selon http://www.tldp.org/HOWTO/IO-Port-Programming-2.html ) et il vaudrait mieux utiliser les fichier /dev/lp*