Consumer Electronics Control (CEC) это возможность протокола HDMI управлять до 15 CEC-совместимых устройств, соединенных через HDMI, при этом используя только один пульт дистанционного управления. Например, управлять телевизором (включать и выключать питание), приставкой, DVD плеером, используя только пульт от телевизора.
Так как HDMI кабель имеет ограниченную длину, поэтому мы разработали дополнительный CEC/HDMI адаптер, который ставится около CEC совместимого устройства (например, телевизор) и проводом подключается к LogicMachine 4 (длина не ограничена).
CEC функции
Добавьте следующий код в Скрипты -> Общие функции (Scripting -> Common Functions):
cec = {}
cec.init = function()
if not cec.port then
require('serial')
cec.port = serial.open('/dev/ttyAPP0')
cec.port:flush()
end
end
cec.send = function(data)
local cmd, res
if type(data) ~= 'string' then
return nil, 'invalid data'
elseif #data < 2 then return nil, 'data too short' elseif #data > 30 then
return nil, 'data too long'
end
cec.init()
cmd = string.char(0x00, 0xA0, #data) .. data
cec.port:write(cmd)
res = cec.port:read(2, 0.2)
if type(res) == 'string' and #res == 2 and res:byte(1) == 0x5A then
if res:byte(2) == 0x10 then
return true
elseif res:byte(2) == 0x40 then
return nil, 'transmitter busy'
end
end
return nil, 'reply error'
end
cec.poll = function()
local cmd, len, frame, count
cec.init()
cmd = string.char(0x00, 0xA0, 0x01, 0xAA)
cec.port:write(cmd)
res = cec.port:read(2, 0.2)
if type(res) == 'string' and #res == 2 and res:byte(1) == 0xA5 then
len = res:byte(2)
if len == 0 then
return false, 0
end
res = cec.port:read(len, 0.2)
if type(res) == 'string' and #res == len then
count = res:byte(1) - 1
return res:sub(2), count
end
end
return nil, 'reply error'
end
Чтобы отправить команду на СЕС устройство, используется следующий вид кода:
cmd = string.char(0xBF, 0x72, 0x01)
cec.send(cmd)
В данном случае команда состоит из трех байт. Первый байт отвечает за источник ‘source’ (первый символ, в примере B) и назначение ‘destination’ (второй символ, в примере F) команды. Второй байт – сама команда ‘message ID’ (0x72), состоящая из двух символов. Также при наличии параметров команды, они записываются в третий и последующие байты (0x01).
Для получения кодов CEC вы можете использовать генератор команд по этой ссылке here.
Получение телеграммы из буфера
Для того чтобы получить телеграмму из буфера и кол-во телеграмм в буфере (до 16), используется следующая функция:
telegram, count = cec.poll()
Если функция возвращает false (0) – это означает, что буфер пуст.