Горячая линия Embedded System Rus:8-800-775-06-34 (звонок по России бесплатный)

LM5_N
LM-Wall_N
DALI_N
Vita_N

Управлять телевизором через CEC HDMI из LogicMachine4

cec_hdmiConsumer 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_hdmi

Для получения кодов CEC вы можете использовать генератор команд по этой ссылке here.

cec_hdmi

Получение телеграммы из буфера
Для того чтобы получить телеграмму из буфера и кол-во телеграмм в буфере (до 16), используется следующая функция:
telegram, count = cec.poll()
Если функция возвращает false (0) – это означает, что буфер пуст.