1 module dgpio;
2 
3 import std.stdio : File;
4 import std.conv : to;
5 import std.string : strip;
6 
7 class GPIO{
8 	immutable ubyte gpio;
9 	bool err = false;
10 
11 	private void activate(){
12 		try{
13 			File pExport = File("/sys/class/gpio/export", "w");
14 			pExport.writefln("%s", gpio);
15 			pExport.close();
16 		}catch(Exception e){
17 			err = true;
18 		}
19 	}
20 
21 	void deactivate(){
22 		try{
23 			File pUnexport = File("/sys/class/gpio/unexport", "w");
24 			pUnexport.writefln("%s", gpio);
25 			pUnexport.close();
26 		}catch(Exception e){
27 			err = true;
28 		}
29 	}
30 
31 	void setInput(){
32 		scope(failure){
33 			err = true;
34 		}
35 		File pDirection = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction", "w");
36 		pDirection.writefln("in");
37 		pDirection.close();
38 	}
39 
40 	void setOutput(){
41 		scope(failure){
42 			err = true;
43 		}
44 		File pDirection = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction", "w");
45 		pDirection.writefln("out");
46 		pDirection.close();
47 	}
48 
49 	bool isInput(){
50 		scope(failure){
51 			err = true;
52 		}
53 		File pDirection = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction", "r");
54 		string str = strip(pDirection.readln());
55 		pDirection.close();
56 		switch(str){
57 			case "in":
58 				return(true);
59 			default:
60 				return(false);
61 		}
62 	}
63 
64 	bool isOutput(){
65 		scope(failure){
66 			err = true;
67 		}
68 		File pDirection = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/direction", "r");
69 		string str = strip(pDirection.readln());
70 		pDirection.close();
71 		switch(str){
72 			case "out":
73 				return(true);
74 			default:
75 				return(false);
76 		}
77 	}
78 
79 	void setHigh(){
80 		scope(failure){
81 			err = true;
82 			return;
83 		}
84 		File pValue = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/value", "w");
85 		pValue.writefln("1");
86 		pValue.close();
87 	}
88 
89 	void setLow(){
90 		scope(failure){
91 			err = true;
92 			return;
93 		}
94 		File pValue = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/value", "w");
95 		pValue.writefln("0");
96 		pValue.close();
97 	}
98 
99 	bool isHigh(){
100 		scope(failure){
101 			err = true;
102 		}
103 		File pValue = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/value", "r");
104 		string str = strip(pValue.readln());
105 		pValue.close();
106 		switch(str){
107 			case "0":
108 				return(false);
109 			default:
110 				return(true);
111 		}
112 	}
113 
114 	bool isLow(){
115 		scope(failure){
116 			err = true;
117 		}
118 		File pValue = File("/sys/class/gpio/gpio" ~ to!string(gpio) ~ "/value", "r");
119 		string str = strip(pValue.readln());
120 		pValue.close();
121 		switch(str){
122 			case "0":
123 				return(true);
124 			default:
125 				return(false);
126 		}
127 	}
128 
129 	void deleteError(){
130 		scope(failure){
131 			err = true;
132 		}
133 		err = false;
134 	}
135 
136 	this(ubyte gpio){
137 		scope(failure){
138 			err = true;
139 		}
140 		this.gpio = gpio;
141 		activate();
142 	}
143 
144 	~this(){
145 		deactivate();
146 	}
147 }