diff --git a/src/BeagleBone/GPIO.jl b/src/BeagleBone/GPIO.jl new file mode 100644 index 0000000000000000000000000000000000000000..9a757ea889fca39f8bc18c6c0fad5a42ddef8fef --- /dev/null +++ b/src/BeagleBone/GPIO.jl @@ -0,0 +1,86 @@ +""" +Lowest form of communication woth the GPIO pins. The available pins are +listed in the "channel" parameter, and appear as directories in /sys/class. +Any of these GPIOs can be run in various ways, with any operation specified +by a sequence of three entries + + (channel, operation, entry) = (int32, int32, String) + +For instance, if the GPIO "gpio30" is to be configured as a output pin and set +to high, the following two writes aould be done. + + write!(GPIO, 14, 2, "out") + write!(GPIO, 14, 1, "1") + +""" +struct GPIO +end + +writeOperations = [ + Dict("dir" => "value", "entries"=>["1", "0"]) + Dict("dir" => "direction", "entries"=>["in", "out"]) +] + +readOperations = [ + "value" + "direction" + "edge" +] + +channels =[ + "gpio112" + "gpio114" + "gpio115" + "gpio116" + "gpio14" + "gpio15" + "gpio2" + "gpio20" + "gpio22" + "gpio23" + "gpio26" + "gpio27" + "gpio3" + "gpio30" + "gpio31" + "gpio4" + "gpio44" + "gpio45" + "gpio46" + "gpio47" + "gpio48" + "gpio49" + "gpio5" + "gpio50" + "gpio51" + "gpio60" + "gpio61" + "gpio65" + "gpio66" + "gpio67" + "gpio68" + "gpio69" + "gpio7" +] + +function write!(::GPIO, index::Int32, operation::Int32, entry::String) + (index <= 0 || index > length(channels)) && error("Invalid GPIO index: $index") + (operation <= 0 || operation > length(writeOperations)) && error("Invalid GPIO operation: $operation") + filename = "/sys/class/gpio/$(channels[index])/$(writeOperations[operation]["dir"])" + + if entry in writeOperations[operation]["entries"] + file = open(filename, "r+") + write(file, "$(entry)") + close(file) + else + error("Cannot write $(entry) to operation: $operation") + end + return +end + +#function Base.read(::SysLED, ind::Int32) +# (ind < 0 || ind > length(channels)) && error("Invalid SysLEND ind: $ind") +# println("not yet supported") +# l = 0 +# return l == "1" +#end diff --git a/test/BeagleBone/GPIO_test.jl b/test/BeagleBone/GPIO_test.jl new file mode 100644 index 0000000000000000000000000000000000000000..a6e445d7597526a865c609aab27aaec7dba7eac5 --- /dev/null +++ b/test/BeagleBone/GPIO_test.jl @@ -0,0 +1,41 @@ +include("../../src/BeagleBone/BeagleBone.jl") + +using Base.Test + +#Fixture +device = getdev("gpio") +gpio_state = true +write!(device, 31, 2, "out") + +device = getdev("gpio") + +@testset "GPIO Tests" begin + @testset "Error Handling" begin + # Attempt to initialize faulty device + @test_throws ErrorException getdev("wrong_device_name") + + # Test that an exception is thrown when a faulty channel is given + @test_throws ErrorException write!(device, 100, 1, "0") + + # Test that an exception is thrown when a faulty channel is given + @test_throws ErrorException write!(device, 0, 1, "1") + + # Test that an exepition is thrown when requiring bad entry + @test_throws ErrorException write!(device, 0, 123, "0") + + # Test that an exepition is thrown when requiring bad entry + @test_throws ErrorException write!(device, 0, 1, "bad_entry") + end + @testset "IO Communication" begin + # Instanciate all possible leds and perform 10 read/write commands + # with the set high/low operation (1) + operation = 1 + for i = 1:10 + state = "$(i%2)" + for index = 1:length(channels) + write!(device, index, operation, state) + end + sleep(0.1) + end + end +end