Blame examples/termios.lua

Packit 437b5e
local p = require "posix"
Packit 437b5e
local dev = arg[1] or "/dev/ttyUSB0"
Packit 437b5e
Packit 437b5e
-- Open serial port and do settings
Packit 437b5e
Packit 437b5e
local fds, err = p.open(dev, p.O_RDWR + p.O_NONBLOCK);
Packit 437b5e
if not fds then
Packit 437b5e
	print("Could not open serial port " .. dev .. ":", err)
Packit 437b5e
	os.exit(1)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
p.tcsetattr(fds, 0, {
Packit 437b5e
	cflag = p.B115200 + p.CS8 + p.CLOCAL + p.CREAD,
Packit 437b5e
	iflag = p.IGNPAR,
Packit 437b5e
	oflag = p.OPOST,
Packit 437b5e
	cc = {
Packit 437b5e
		[p.VTIME] = 0,
Packit 437b5e
		[p.VMIN] = 1
Packit 437b5e
	}
Packit 437b5e
})
Packit 437b5e
Packit 437b5e
-- Set stdin to non canonical mode. Save current settings
Packit 437b5e
Packit 437b5e
local save = p.tcgetattr(0)
Packit 437b5e
p.tcsetattr(0, 0, {
Packit 437b5e
	cc = {
Packit 437b5e
		[p.VTIME] = 0,
Packit 437b5e
		[p.VMIN] = 1
Packit 437b5e
	}
Packit 437b5e
})
Packit 437b5e
Packit 437b5e
-- Loop, reading and writing between ports. ^C stops
Packit 437b5e
Packit 437b5e
local set = {
Packit 437b5e
	[0] = { events = { IN = true } },
Packit 437b5e
	[fds] = { events = { IN = true } },
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
p.write(1, "Starting terminal, hit ^C to exit\r\n")
Packit 437b5e
Packit 437b5e
local function exit(msg)
Packit 437b5e
	p.tcsetattr(0, 0, save)
Packit 437b5e
	print("\n")
Packit 437b5e
	print(msg)
Packit 437b5e
	os.exit(0)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
while true do
Packit 437b5e
	local r = p.poll(set, -1)
Packit 437b5e
	for fd, d in pairs(set) do
Packit 437b5e
		if d.revents and d.revents.IN then
Packit 437b5e
			if fd == 0 then
Packit 437b5e
				local d, err = p.read(0, 1024)
Packit 437b5e
				if not d then exit(err) end
Packit 437b5e
				if d == string.char(3) then exit("Bye") end
Packit 437b5e
				local ok, err = p.write(fds, d)
Packit 437b5e
				if not ok then exit(err) end
Packit 437b5e
			end
Packit 437b5e
			if fd == fds then
Packit 437b5e
				local d, err = p.read(fds, 1024)
Packit 437b5e
				if not d then exit(err) end
Packit 437b5e
				local ok, err = p.write(1, d)
Packit 437b5e
				if not ok then exit(err) end
Packit 437b5e
			end
Packit 437b5e
		end
Packit 437b5e
	end
Packit 437b5e
end