311 lines
8.0 KiB
Lua
311 lines
8.0 KiB
Lua
-- LUA default run file
|
|
|
|
-- LUA default run file
|
|
|
|
require "env"
|
|
|
|
periphery = require('periphery')
|
|
Serial = periphery.Serial
|
|
|
|
evdev = require "evdev"
|
|
touch = evdev.Device("/dev/input/event0")
|
|
|
|
socket = require('socket')
|
|
|
|
COMMAND_POSITION = 0x19
|
|
COMMAND_POSITION_X = 0x13
|
|
COMMAND_POSITION_Y = 0x11
|
|
|
|
COMMAND_HOME = 0x0C
|
|
|
|
COMMAND_PASSWORD = 0x7F
|
|
|
|
COMMAND_01H = 0x01
|
|
COMMAND_03H = 0x03
|
|
|
|
COMMAND_CURSOR_ON = 0x0F
|
|
COMMAND_CURSOR_OFF = 0x0E
|
|
|
|
COMMAND_BLINK = 0x0B
|
|
COMMAND_UNBLINK = 0x0C
|
|
|
|
COMMAND_CR = 0x0D
|
|
COMMAND_LF = 0x0A
|
|
|
|
blinkFlag = false
|
|
|
|
posX = 0
|
|
posY = 0
|
|
|
|
touchY = 0
|
|
touchX = 0
|
|
|
|
LOGING = 1
|
|
-- 1 2 3 4 5 6 7 8 9 10
|
|
-- 11 12 13 14 15 16 17 18 19 20
|
|
controlLabels = {"<-" ,"<<" ,"^" ,"^^" ,"vv" , "v" ,">>" ,"->" ,"Help" ,"Del",
|
|
"Done" ," " ,"Insert","," ,"Space" , " " ,"=" ,"Remove","Enter" ," "}
|
|
controlFonts = {"C" ,"C" ,"C" ,"C" ,"C" , "C" ,"C" ,"C" ,"T" ,"C",
|
|
"C" ,"T" ,"T" ,"C" ,"C" , "T" ,"C" ,"T" ,"C" ,"T"}
|
|
controlPos = {{02,06}, {01,18}, {02,02}, {01,30}, {01,22}, {18,02}, {01,34}, {02,44}, {02,10}, {02,50},
|
|
{10,01}, {10,01}, {06,01}, {10,50}, {14,50}, {14,50}, {06,50}, {15,02}, {18,50}, {18,50}}
|
|
|
|
local function errLog(msg)
|
|
io.stderr:write(msg)
|
|
end
|
|
|
|
function logPrint(msg,aux)
|
|
if ( LOGING ) then
|
|
if aux then
|
|
print(msg.." , "..aux)
|
|
else
|
|
print(msg);
|
|
end
|
|
end
|
|
end
|
|
|
|
function dbgPrint(msg,aux)
|
|
if ( DEBUG ) then
|
|
if aux then
|
|
print(msg.." , "..aux)
|
|
else
|
|
print(msg);
|
|
end
|
|
end
|
|
end
|
|
|
|
function checkY(y)
|
|
if y < 0 then
|
|
y = 0
|
|
end
|
|
if y > 5 then
|
|
y = 5
|
|
end
|
|
posY = y
|
|
return y
|
|
end
|
|
|
|
function checkX(x)
|
|
if x < 0 then
|
|
x = 39;
|
|
posY = posY - 1
|
|
checkY(posY)
|
|
end
|
|
if x > 39 then
|
|
if posY == 5 then
|
|
x = 39;
|
|
else
|
|
x = 0;
|
|
posY = posY + 1
|
|
checkY(posY);
|
|
end
|
|
end
|
|
posX = x
|
|
return x
|
|
end
|
|
|
|
function gotoXY(x,y)
|
|
checkX(x);
|
|
checkY(y);
|
|
end
|
|
|
|
function lineFeed(void)
|
|
posY = posY + 1
|
|
gotoXY(posX, checkY(posY));
|
|
end
|
|
|
|
function carriageReturn(void)
|
|
gotoXY(0, posY);
|
|
end
|
|
|
|
function clearAndHome(void)
|
|
for i=1, 6, 1 do
|
|
for j=1, 40, 1 do
|
|
line[i][j]:setTextColor(HMI.Color.green);
|
|
line[i][j]:setBackground(HMI.Color.black);
|
|
line[i][j]:setText(" ")
|
|
line[i][j]:draw()
|
|
end
|
|
end
|
|
posX = 0
|
|
posY = 0
|
|
end
|
|
|
|
|
|
function doRead()
|
|
local timestamp = socket.gettime()*1000
|
|
|
|
while socket.gettime()*1000 - timestamp < 100 do
|
|
if serial:poll(0.01) then
|
|
local c = serial:read(1)
|
|
if c:byte() == COMMAND_POSITION then
|
|
local cmd = serial:read(1)
|
|
if cmd:byte() == COMMAND_POSITION_X then
|
|
local x = string.byte(serial:read(1))
|
|
gotoXY(x,posY)
|
|
elseif cmd:byte() == COMMAND_POSITION_Y then
|
|
local y = string.byte(serial:read(1))
|
|
gotoXY(posX,y)
|
|
elseif cmd:byte() == COMMAND_HOME then
|
|
clearAndHome();
|
|
end
|
|
elseif c:byte() == COMMAND_03H then
|
|
serial:read(1)
|
|
serial:read(1)
|
|
elseif c:byte() == COMMAND_BLINK then
|
|
blinkFlag = true
|
|
elseif c:byte() == COMMAND_UNBLINK then
|
|
blinkFlag = false
|
|
elseif c:byte() == COMMAND_CURSOR_OFF then
|
|
-- curs_set(0);
|
|
elseif c:byte() == COMMAND_CURSOR_ON then
|
|
-- curs_set(0);
|
|
elseif c:byte() == COMMAND_CR then
|
|
carriageReturn()
|
|
elseif c:byte() == COMMAND_LF then
|
|
lineFeed()
|
|
else
|
|
if c:byte() == COMMAND_PASSWORD then
|
|
c = '*'
|
|
end
|
|
|
|
if c:byte() >= 0x20 and c:byte() < 0x7F then
|
|
--print(c.." at "..posX.." "..posY.."\n")
|
|
local label = line[posY+1][posX+1]
|
|
label:setText(c)
|
|
if blinkFlag then
|
|
label:setTextColor(HMI.Color.black);
|
|
label:setBackground(HMI.Color.green);
|
|
else
|
|
label:setTextColor(HMI.Color.green);
|
|
label:setBackground(HMI.Color.black);
|
|
end
|
|
posX = posX + 1
|
|
checkX(posX)
|
|
label:draw()
|
|
else
|
|
print("Unknown: "..c:byte().."\n");
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function doTouch()
|
|
local x = 0;
|
|
local y = 0;
|
|
if touch:avail() > 0 then
|
|
local timestamp, eventType, eventCode, value = touch:read()
|
|
if eventType == evdev.EV_ABS then
|
|
if eventCode == 53 then
|
|
touchX = value
|
|
elseif eventCode == 54 then
|
|
touchY = value
|
|
end
|
|
end
|
|
if eventType == 1 then
|
|
if eventCode == 330 then
|
|
if touchY > 0 and touchY < 79 then
|
|
idx = math.floor(touchX/80)+1
|
|
x = controlPos[idx][2]
|
|
y = controlPos[idx][1]
|
|
print("Ctrl1: ",y,x,idx)
|
|
end
|
|
if touchY > 400 and touchY < 479 then
|
|
idx = math.floor(touchX/80)+11
|
|
x = controlPos[idx][2]
|
|
y = controlPos[idx][1]
|
|
print("Ctrl2: ",y,x,idx)
|
|
end
|
|
if touchY > 320 and touchY < 399 then
|
|
x = 8 + math.floor(touchX/80)*4
|
|
y = 19
|
|
print("Numbs: ",y,x)
|
|
end
|
|
if touchY > 80 and touchY < 319 then
|
|
y = math.floor((touchY-80)/240*10+6)
|
|
x = math.floor(touchX/720*36+7)
|
|
print("Lines: ",y,x)
|
|
end
|
|
if x > 0 and y > 0 then
|
|
if value == 1 then
|
|
print("down")
|
|
serial:write(string.char(0x5F,y,x))
|
|
serial:flush()
|
|
--serial:write(string.char(0x5F,x,y))
|
|
else
|
|
print("up")
|
|
serial:write(string.char(0x6F,y,x))
|
|
serial:flush()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function setup()
|
|
serial = Serial{device="/dev/ttyAMA0", baudrate=9600, databits=7, parity="odd", stopbits=1}
|
|
instance = HMI.App.instance;
|
|
layout = HMI.Layout(instance,200,48);
|
|
|
|
monoChar = HMI.Font("/root/font/mono.ttf",34)
|
|
monoText = HMI.Font("/root/font/mono.ttf",20)
|
|
|
|
line = {}
|
|
for i=1, 6, 1 do
|
|
line[i] = {}
|
|
for j=1, 40, 1 do
|
|
line[i][j] = HMI.Label(layout,5*(j-1),8+4*(i-1),5,4," ");
|
|
line[i][j]:setTextColor(HMI.Color.green);
|
|
line[i][j]:setBackground(HMI.Color.black);
|
|
line[i][j]:setFont(monoChar)
|
|
line[i][j]:draw()
|
|
end
|
|
end
|
|
|
|
number = {}
|
|
for i=1, 10, 1 do
|
|
number[i] = HMI.Cell(layout,1+20*(i-1),34,20,7,i-1);
|
|
number[i]:setTextColor(HMI.Color.black);
|
|
number[i]:setBackground(HMI.Color.white);
|
|
number[i]:setFont(monoChar)
|
|
end
|
|
|
|
control = {}
|
|
for j=0, 1, 1 do
|
|
for i=1, 10, 1 do
|
|
local idx = i+j*10
|
|
if idx ~= 12 and idx ~= 16 and idx ~= 20 then
|
|
if idx == 11 or idx == 15 or idx == 19 then
|
|
control[idx] = HMI.Cell(layout,1+20*(i-1),j*41,40,7,i-1);
|
|
else
|
|
control[idx] = HMI.Cell(layout,1+20*(i-1),j*41,20,7,i-1);
|
|
end
|
|
if controlLabels[idx] then
|
|
control[idx]:setText(controlLabels[idx])
|
|
end
|
|
control[idx]:setTextColor(HMI.Color.black);
|
|
control[idx]:setBackground(HMI.Color.grey);
|
|
if controlFonts[idx] == 'T' then
|
|
control[idx]:setFont(monoText)
|
|
else
|
|
control[i+j*10]:setFont(monoChar)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
cnt = 0;
|
|
end
|
|
|
|
function loop()
|
|
doRead()
|
|
doTouch()
|
|
end
|
|
|
|
io.stderr:write("Run LUA\n");
|
|
|
|
--------------------------------------------------
|
|
|