Управление освещением
    Презентации
    Технические решения на LogicMachine
    Визуализация
      evika.ru    Технические решения на LogicMachine    Управлять телевизором через CEC HDMI из LogicMachine4

    Управлять телевизором через 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) – это означает, что буфер пуст.




    Copyright
    © Embedded Systems Rus
    2017. All Rights Reserved