Commit 88579d53 authored by Mattias Fält's avatar Mattias Fält

Return values, time stamps, tests and config fixes

parent cc0ac5b4
......@@ -15,30 +15,40 @@ led4 = SysLED(4)
# and adds a ref in motor and led to stream
init_devices!(stream, led1, led2, led3, led4)
ledon = true
for i = 1:50
set!(led1, ledon)
set!(led2, !ledon)
set!(led3, ledon)
set!(led4, !ledon)
for i = 1:100
put!(led1, ledon)
put!(led2, !ledon)
put!(led3, ledon)
put!(led4, !ledon)
send(stream) #Sends all the outputs to the stream in one atomic call
#read(stream) #Sends request to read, reads all inputs
sleep(0.1)
#read(stream)
get(led1)
get(led2)
get(led3)
#sleep(0.1)
v1,v2,v3 = read(stream) #Sends request to read, reads all inputs for which get! was called
v1 == !v2 == v3 == ledon ? nothing : println("ledon is $ledon, but read v1, v2, v3 = $v1, $v2, $v3")
ledon = !ledon
end
for i = 1:40
send(led1, ledon)
sleep(0.03)
#sleep(0.03)
v1 = read(led1)
send(led2, ledon)
sleep(0.03)
#sleep(0.03)
v2 = read(led2)
send(led3, ledon)
sleep(0.03)
#sleep(0.03)
v3 = read(led3)
send(led4, ledon)
sleep(0.03)
#sleep(0.03)
v4 = read(led4)
v1 == v2 == v3 == v4 == ledon ? nothing : println("ledon is $ledon, but read v1, v2, v3, v4 = $v1, $v2, $v3, $v4")
ledon = !ledon
end
set!(led1, false)
set!(led2, false)
set!(led3, false)
set!(led4, false)
put!(led1, false)
put!(led2, false)
put!(led3, false)
put!(led4, false)
send(stream)
close(stream) #Tells BeagleBone to stop listening and close outputs
......@@ -29,27 +29,43 @@ Parse and execute the command `cmd`
"""
bbparse(any) = error("Unexpected input: $any")
function bbsend(sock, vals)#, timestamps)
serialize(sock, vals)#, (timestamps...)))
end
"""
bbparse(l::Tuple)
Parse input on the form `l=(iswrite, ndev, cmd1, cmd2, ..., cmdn)``
bbparse(l::Tuple, sock)
Parse input on the form `l=(iswrite, ndev, cmd1, cmd2, ..., cmdn)`
where if `iswrite`
`cmdi = (devname, id, val)`
and if not `iswrite`
`cmdi = (devname, id)`
and send back on socket (vals, timestamps)
"""
function bbparse(l::Tuple)
function bbparse(l::Tuple, sock)
iswrite = l[1]::Bool #True if write command, false if read
ndev = l[2]::Int32 #Number of devices/commands
for i = 1:ndev
command = l[2+i]::Tuple
dev = getdev(command[1])
if iswrite
if iswrite
for i = 1:ndev
command = l[2+i]::Tuple
dev = getdev(command[1])
write!(dev, command[2], command[3])
else
val = read(dev, command[2])
println("$val")
#TODO return somewhere
end
return
else
#TODO fix to have at least partial type stability
vals = Array{Any,1}(ndev)
timestamps = Array{UInt64,1}(ndev)
for i = 1:ndev
command = l[2+i]::Tuple
dev = getdev(command[1])
vals[i] = read(dev, command[2])
timestamps[i] = UInt64(0)#time_ns()
end
bbsend(sock, (vals, timestamps))
return
end
end
......@@ -81,8 +97,8 @@ function run_server(port=2001; debug=false)
@async while isopen(sock)
try
l = deserialize(sock);
println("deserialize: $l")
bbparse(l)
#println("deserialize: $l")
bbparse(l, sock)
catch err
if !isopen(sock) && isa(err, Base.EOFError)
println("Connection to server closed")
......
......@@ -18,8 +18,8 @@ function read(::SysLED, ind::Int32, debug::Bool=false)
ind [1,2,3,4] && error("Invalid SysLEND ind: $ind")
filename = "/sys/class/leds/beaglebone:green:usr$(ind-1)/brightness"
file = open(filename, "r")
l = readline(file)
(l != "1" && l != "0") && error("Invalid value \"$l\" read from SysLed")
l = read(file,Char)
(l != '1' && l != '0') && error("Invalid value \"$l\" read from SysLed")
close(file)
return l == "1"
return l == '1'
end
const GPIO_AVAILABLE = [
("P8.11","GPIO_30"),
("P8.12","GPIO_60"),
("P8.13","GPIO_31"),
("P8.14","GPIO_40"),
("P8.15","GPIO_48"),
("P8.16","GPIO_51"),
("P8.17","GPIO_4"),
("P8.18","GPIO_5"),
("P8.19","GPIO_13"),
("P8.20","GPIO_12"),
("P8.21","GPIO_3"),
("P8.22","GPIO_2"),
("P8.23","GPIO_49"),
("P8.24","GPIO_15"),
("P8.25","GPIO_117"),
("P8.26","GPIO_14"),
("P8.27","GPIO_125"),
("P8.28","GPIO_123"),
("P8.29","GPIO_111"),
("P8.30","GPIO_112"),
("P8.31","GPIO_110"),
("P8.41","GPIO_20"),
("P8.42","GPIO_7"),
("P9.3", "GPIO_38"),
("P9.4", "GPIO_39"),
("P9.5", "GPIO_34"),
("P9.6", "GPIO_35"),
("P9.7", "GPIO_66"),
("P9.8", "GPIO_67"),
("P9.9", "GPIO_69"),
("P9.10","GPIO_68"),
("P9.11","GPIO_45"),
("P9.12","GPIO_44"),
("P9.13","GPIO_23"),
("P9.14","GPIO_26"),
("P9.15","GPIO_47"),
("P9.16","GPIO_46"),
("P9.17","GPIO_27"),
("P9.18","GPIO_65"),
("P9.19","GPIO_22"),
("P9.20","GPIO_63"),
("P9.21","GPIO_62"),
("P9.22","GPIO_37"),
("P9.23","GPIO_36"),
("P9.24","GPIO_33"),
("P9.25","GPIO_32"),
("P9.26","GPIO_61"),
("P9.27","GPIO_86"),
("P9.28","GPIO_88"),
("P9.29","GPIO_87"),
("P9.30","GPIO_89"),
("P9.31","GPIO_10"),
("P9.32","GPIO_11"),
("P9.33","GPIO_9"),
("P9.34","GPIO_81"),
("P9.35","GPIO_8"),
("P9.36","GPIO_80"),
("P9.37","GPIO_78"),
("P9.38","GPIO_79"),
("P9.39","GPIO_76"),
("P9.40","GPIO_77"),
("P9.41","GPIO_74"),
("P9.42","GPIO_75"),
("P9.43","GPIO_72"),
("P9.44","GPIO_73"),
("P9.45","GPIO_70"),
("P9.46","GPIO_71")]
const PWM_AVAILABLE = [
("P8.14","PWM1A"),
("P8.16","PWM1B"),
("P8.21","PWM0B"),
("P8.22","PWM0A"),
("P8.28","ECAPPWM2"),
("P8.29","PWM0B"),
("P8.31","PWM0A"),
("P8.42","ECAPPWM0"),
("P9.13","PWM2B"),
("P9.19","PWM2A"),
("P9.34","PWM1B"),
("P9.36","PWM1A"),
("P9.45","PWM2A"),
("P9.46","PWM2B")]
const SPI_AVAILABLE = [
("P8.17","SPI0_CS0"),
("P8.18","SPI0_D1"),
("P8.21","SPI0_D0"),
("P8.22","SPI0_SCLK"),
("P8.28","SPI1_CS0"),
("P8.29","SPI1_D0"),
("P8.30","SPI1_D1"),
("P8.31","SPI1_SCLK")]
const UART_AVAILABLE = [
("P8.11","UART4_RX"),
("P8.13","UART4_TX"),
("P8.21","UART2_TX"),
("P8.22","UART2_RX"),
("P8.24","UART1_TX"),
("P8.26","UART1_RX"),
("P9.37","UART5_TX"),
("P9.38","UART5_RX")]
const I2C_AVAILABLE = [
("P8.17", "I2C1_SCL"),
("P8.18", "I2C1_SDA"),
("P8.19", "I2C2_SCL"),
("P8.20", "I2C2_SDA")]
const EQEP_AVAILABLE = [
("P8.25", "eQEP0_strobe"),
("P8.27", "eQEP0B_in"),
("P8.41", "eQEP0_index"),
("P8.42", "eQEP0A_in"),
("P9.11", "eQEP2B_in"),
("P9.12", "eQEP2A_in"),
("P9.15", "eQEP2_strobe"),
("P9.16", "eQEP2_index"),
("P9.31", "eQEP1_index"),
("P9.32", "eQEP1_strobe"),
("P9.33", "eQEP1B_in"),
("P9.34", "eQEP1A_in"),
]
const TIMER_AVAILABLE = [
("P9.7", "TIMER4"),
("P9.8", "TIMER7"),
("P9.9", "TIMER2"),
("P9.10", "TIMER1")]
---
available_pins:
gpio:
P8.11: GPIO_30
P8.12: GPIO_60
P8.13: GPIO_31
P8.14: GPIO_40
P8.15: GPIO_48
P8.16: GPIO_51
P8.17: GPIO_4
P8.18: GPIO_5
P8.19: GPIO_13
P8.20: GPIO_12
P8.21: GPIO_3
P8.22: GPIO_2
P8.23: GPIO_49
P8.24: GPIO_15
P8.25: GPIO_117
P8.26: GPIO_14
P8.27: GPIO_125
P8.28: GPIO_123
P8.29: GPIO_111
P8.30: GPIO_112
P8.31: GPIO_110
P8.41: GPIO_20
P8.42: GPIO_7
P9.3: GPIO_38
P9.4: GPIO_39
P9.5: GPIO_34
P9.6: GPIO_35
P9.7: GPIO_66
P9.8: GPIO_67
P9.9: GPIO_69
P9.10: GPIO_68
P9.11: GPIO_45
P9.12: GPIO_44
P9.13: GPIO_23
P9.14: GPIO_26
P9.15: GPIO_47
P9.16: GPIO_46
P9.17: GPIO_27
P9.18: GPIO_65
P9.19: GPIO_22
P9.20: GPIO_63
P9.21: GPIO_62
P9.22: GPIO_37
P9.23: GPIO_36
P9.24: GPIO_33
P9.25: GPIO_32
P9.26: GPIO_61
P9.27: GPIO_86
P9.28: GPIO_88
P9.29: GPIO_87
P9.30: GPIO_89
P9.31: GPIO_10
P9.32: GPIO_11
P9.33: GPIO_9
P9.34: GPIO_81
P9.35: GPIO_8
P9.36: GPIO_80
P9.37: GPIO_78
P9.38: GPIO_79
P9.39: GPIO_76
P9.40: GPIO_77
P9.41: GPIO_74
P9.42: GPIO_75
P9.43: GPIO_72
P9.44: GPIO_73
P9.45: GPIO_70
P9.46: GPIO_71
pwm:
P8.14: PWM1A
P8.16: PWM1B
P8.21: PWM0B
P8.22: PWM0A
P8.28: ECAPPWM2
P8.29: PWM0B
P8.31: PWM0A
P8.42: ECAPPWM0
P9.13: PWM2B
P9.19: PWM2A
P9.34: PWM1B
P9.36: PWM1A
P9.45: PWM2A
P9.46: PWM2B
spi:
P8.17: SPI0_CS0
P8.18: SPI0_D1
P8.21: SPI0_D0
P8.22: SPI0_SCLK
P8.28: SPI1_CS0
P8.29: SPI1_D0
P8.30: SPI1_D1
P8.31: SPI1_SCLK
uart:
P8.11: UART4_RX
P8.13: UART4_TX
P8.21: UART2_TX
P8.22: UART2_RX
P8.24: UART1_TX
P8.26: UART1_RX
P9.37: UART5_TX
P9.38: UART5_RX
i2c:
P8.17: I2C1_SCL
P8.18: I2C1_SDA
P8.19: I2C2_SCL
P8.20: I2C2_SDA
eqep:
P8.25: eQEP0_strobe
P8.27: eQEP0B_in
P8.41: eQEP0_index
P8.42: eQEP0A_in
P9.11: eQEP2B_in
P9.12: eQEP2A_in
P9.15: eQEP2_strobe
P9.16: eQEP2_index
P9.31: eQEP1_index
P9.32: eQEP1_strobe
P9.33: eQEP1B_in
P9.34: eQEP1A_in
timer:
P9.7: TIMER4
P9.8: TIMER7
P9.9: TIMER2
P9.10: TIMER1
...
export initialize, getstream, setstream!, send, set!
export initialize, getstream, setstream!, send
###### Defaults for AbstractDevice
#What to do when connecting
......@@ -37,17 +37,18 @@ function send(dev::AbstractDevice, val)
end
function read(dev::AbstractDevice)
cmd, stream = safe_getreadcommand(dev)
return read(stream, cmd)
vals, ts = read(stream, cmd)
return vals
end
function set!(dev::AbstractDevice, val)
function put!(dev::AbstractDevice, val)
cmd, stream = safe_getwritecommand(dev, val)
push!(stream.sendbuffer,cmd)
return
end
function get(dev::AbstractDevice, val)
cmd, stream = safe_getreadcommand(dev, val)
function get(dev::AbstractDevice)
cmd, stream = safe_getreadcommand(dev)
push!(stream.readbuffer,cmd)
return
end
......@@ -34,51 +34,18 @@ function send(bbstream::BeagleBoneStream)
empty!(bbstream.sendbuffer)
return
end
function read(comedistream::BeagleBoneStream)
#TODO know the types of outputs some way
function read(bbstream::BeagleBoneStream)
ncmds = length(bbstream.readbuffer)
serialize(bbstream.stream, (false, Int32(ncmds), bbstream.readbuffer...))
#TODO wait for answer
vals = nothing
empty!(bbstream.readbuffer)
return vals
vals, timestamps = deserialize(bbstream.stream)
length(vals) == ncmds || error("Wrong number of return values in $vals on request $(bbstream.readbuffer)")
#TODO Do something with timestamps
return (vals...,) #Converting from array to tuple
end
#
# function send(stream::BeagleBoneStream)
# cmds = Tuple[]
# for dev in stream.devices
# val = getsetvalue(dev)
# cmd, devstream = safe_getwritecommand(dev, val)
# devstream == stream || error("Device $dev is connected to other stream $devstream")
# push!(cmds, cmd)
# end
# ncmds = Int32(length(cmds))
# if ncmds > 0
# allcmds = (true, ncmds, cmds...)
# println("Sending command: $allcmds")
# serialize(stream, allcmds)
# end
# return
# end
# function read(stream::BeagleBoneStream)
# cmds = Tuple[]
# for dev in stream.devices
# cmd, devstream = safe_getreadcommand(dev)
# devstream == stream || error("Device $dev is connected to other stream $devstream")
# push!(cmds, cmd)
# end
# ncmds = Int32(length(cmds))
# if ncmds > 0
# allcmds = (false, ncmds, cmds...)
# println("Sending command: $allcmds")
# serialize(stream, allcmds)
# #TODO save values in dev
# # update_read_vale!(dev, val)
# end
# return
# end
#Maybe rethink a bit to support IObox
#The following are for interal use only
function send(bbstream::BeagleBoneStream, cmd)
allcmds = (true, Int32(1), cmd)
println("Sending single command: $allcmds")
......@@ -89,8 +56,10 @@ function read(bbstream::BeagleBoneStream, cmd)
allcmds = (false, Int32(1), cmd)
println("Sending single command: $allcmds")
serialize(bbstream.stream, allcmds)
#TODO get, wait for and return response
return
vals, timestamps = deserialize(bbstream.stream)
length(vals) == 1 || error("Wrong number of return values in $vals on request $cmd")
#TODO Do something with timestamps
return vals[1], timestamps[1]
end
function close(bbstream::BeagleBoneStream)
......
......@@ -8,12 +8,12 @@ module LabConnections
include(joinpath("BeagleBone","BeagleBone.jl"))
include(joinpath("BeagleBone","precompile.jl"))
println("Precompiling BB")
precompile_bb()
#precompile_bb()
return
end
module Computer
import Base: read, send, close, get, serialize
import Base: read, send, close, get, put!, serialize
println("Initializing Computer")
include(joinpath("Computer","Computer.jl"))
end
......
include("../../src/LabConnections.jl")
using LabConnections.BeagleBone
import LabConnections.BeagleBone: getdev, write!, channels
......
include("../../src/LabConnections.jl")
using LabConnections.BeagleBone
import LabConnections.BeagleBone: getdev, write!, setup, teardown
......@@ -25,9 +24,8 @@ for pin in keys(pins)
teardown(dev, pin)
end
println("Running second experiment on pin $(pin)...")
pin = "P9.22"
println("Running second experiment on pin $(pin)...")
setup(dev, pin)
write!(dev, pin, 2, "1000000000")
write!(dev, pin, 3, "250000000")
......
include("../../src/LabConnections.jl")
using LabConnections.BeagleBone
import LabConnections.BeagleBone: getdev, write!
......
using LabConnections
using Base.Test
# write your own tests here
@test 1 == 2
include("BeagleBone/PWM_test.jl")
include("BeagleBone/Sys_LED_test.jl")
include("BeagleBone/GPIO_test.jl")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment