Serial control of the Oppo BDP-103

If you have a question or need help, this is the place to be.
User avatar
kgschlosser
Site Admin
Posts: 4250
Joined: Fri Jun 05, 2015 5:43 am
Location: Rocky Mountains, Colorado USA

Re: Serial control of the Oppo BDP-103

Post by kgschlosser » Thu Aug 23, 2018 2:53 pm

@jachin

I made this up for ya.. it should make things a bit easier. follow the instructions

viewtopic.php?f=10&t=10202
If you like the work I have been doing then feel free to Image

jachin99
Experienced User
Posts: 547
Joined: Sat Feb 13, 2016 8:39 pm

Re: Serial control of the Oppo BDP-103

Post by jachin99 » Thu Aug 23, 2018 9:43 pm

Now that I see everything the plugin generator does I have to say that you are a real life saver!! Below is my first attempt at making the plugin. I included all of the basic commands and queries so far. I assumed the plugin would need a UDP listen, and TCP listen and broadcast service. I would still like to avoid extacting IPs from UDP broadcasts for my first go around but I included it just in cast. One comment I have about the register plugin generator is that I could not select all the code from the view box using keyboard shortcuts. I had to scroll through the whole thing and highlight it. Its not a big deal but I'm not sure if that was intentional, or I am just making a mistake or what. Overall though it looks like it is working good so far. Also, is there a way to edit what I have so far, or import a file using the plugin generator for later changes?

Code: Select all

[# -*- coding: utf-8 -*-
#
# This file is part of EventGhost.
# Copyright © 2005-2016 EventGhost Project <http://www.eventghost.org/>
#
# EventGhost is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 2 of the License, or (at your option)
# any later version.
#
# EventGhost is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with EventGhost. If not, see <http://www.gnu.org/licenses/>.

import eg

eg.RegisterPlugin(
    name=u'Oppo BDP Network Controller',
    author=u'Jachin99',
    version=u'0.1a',
    description=(
        u'This plugin conrols the Oppo BDP-103 & 105 Bluray players including ',
        u'Darbee editions over TCP/IP'
    ),
    kind=u'external',
    url=u'http://www.eventghost.net/forum/viewtopic.php?f=2&t=10203',
    help=u'',
    canMultiLoad=False,
    createMacrosOnAdd=True,
    guid=u'{1B646F04-435D-4613-A75D-439F5607C37B}',
    hardwareId=u'',
    icon=None
)



import threading # NOQA
import socket # NOQA


class TCPListen(object):

    def __init__(self, plugin):
        self.plugin = plugin
        self._thread = None
        self._event = threading.Event()
        self.socks = []
        self.port = 0

    @property
    def interface_addresses(self, family=socket.AF_INET):
        for fam, a, b, c, sock_addr in socket.getaddrinfo('', None):
            if family == fam:
                yield sock_addr[0]
    
    def run(self):
        queue_lock = threading.Lock()
        queue = []
        queue_event = threading.Event()
        
        sock_threads = []        
        def listen(address):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.bind((address, self.port))
            sock.listen(3)
            
            self.socks.append(sock)
        
            while not self._event.isSet():
                try:
                    conn, addr = sock.accept()
                    data = conn.recv(4096)
                    try:
                        conn.close()
                    except socket.error:
                        pass
                        
                    with queue_lock:
                        queue.append(data)
                        queue_event.set()
                    
                except socket.error:
                    break
            try:
                sock.close()
            except socket.error:
                pass
            
            self.socks.remove(sock)                            
            sock_threads.remove(threading.currentThread()) 
            queue_event.set()
        
        for interface_address in self.interface_addresses:
            t = threading.Thread(target=listen, args=(interface_address,))
            sock_threads += [t]
            t.start()
        
        while sock_threads:
            queue_event.wait()
            
            with queue_lock:
                while queue:
                    queue_data = queue.pop(0)
                    self.plugin.process_data(queue_data)
                queue_event.clear()
                
        self._event.clear()
        self._thread = None
        
    def stop(self):
        if self._thread is not None:
            self._event.set()
            for sock in self.socks:
                try:
                    sock.close()
                except socket.error:
                    pass
            self._thread.join(3)
            
    def start(self, port):
        if self._thread is None:
            self.port = port
            self._thread = threading.Thread(target=self.run)
            self._thread.start()

import threading # NOQA
import socket # NOQA


class UDPListen(object):

    def __init__(self, plugin):
        self.plugin = plugin
        self._thread = None
        self._event = threading.Event()
        self.socks = []
        self.port = 0

    @property
    def interface_addresses(self, family=socket.AF_INET):
        for fam, a, b, c, sock_addr in socket.getaddrinfo('', None):
            if family == fam:
                yield sock_addr[0]
    
    def run(self):
        queue_lock = threading.Lock()
        queue = []
        queue_event = threading.Event()
        
        sock_threads = []        
        def listen(address):
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.bind((address, self.port))
            sock.listen(3)
            
            self.socks.append(sock)
        
            while not self._event.isSet():
                try:
                    conn, addr = sock.accept()
                    data = conn.recv(4096)
                    
                    try:
                        conn.close()
                    except socket.error:
                        pass
                        
                    with queue_lock:
                        queue.append(data)
                        queue_event.set()
                        
                except socket.error:
                    break
            try:
                sock.close()
            except socket.error:
                pass
            
            self.socks.remove(sock)                            
            sock_threads.remove(threading.currentThread()) 
            queue_event.set()
        
        for interface_address in self.interface_addresses:
            t = threading.Thread(target=listen, args=(interface_address,))
            sock_threads += [t]
            t.start()
        
        while sock_threads:
            queue_event.wait()
            
            with queue_lock:
                while queue:
                    queue_data = queue.pop(0)
                    self.plugin.process_data(queue_data)
                queue_event.clear()
                
        self._event.clear()
        self._thread = None
        
    def stop(self):
        if self._thread is not None:
            self._event.set()
            for sock in self.socks:
                try:
                    sock.close()
                except socket.error:
                    pass
            self._thread.join(3)
            
    def start(self, port):
        if self._thread is None:
            self.port = port
            self._thread = threading.Thread(target=self.run)
            self._thread.start()



class Text:
    # add variables with string that you want to be able to have translated
    # using the language editor in here
    
    class Power_On:
        name = u'Power On'
        description = 'Action Power On'

    
    class Power_Off:
        name = u'Power Off'
        description = 'Action Power Off'

    
    class Power_Toggle:
        name = u'Power Toggle'
        description = 'Action Power Toggle'

    
    class Source:
        name = u'Source'
        description = 'Action Source'

    
    class Eject:
        name = u'Eject'
        description = 'Action Eject'

    
    class Power:
        name = u'Power'
        description = 'Action Power'

    
    class Dimmer:
        name = u'Dimmer'
        description = 'Action Dimmer'

    
    class Pure_Audio:
        name = u'Pure Audio'
        description = 'Action Pure Audio'

    
    class Vol_Up:
        name = u'Vol Up'
        description = 'Action Vol Up'

    
    class Vol_Dn:
        name = u'Vol Dn'
        description = 'Action Vol Dn'

    
    class Mute:
        name = u'Mute'
        description = 'Action Mute'

    
    class 1:
        name = u'1'
        description = 'Action 1'

    
    class 2:
        name = u'2'
        description = 'Action 2'

    
    class 3:
        name = u'3'
        description = 'Action 3'

    
    class 4:
        name = u'4'
        description = 'Action 4'

    
    class 5:
        name = u'5'
        description = 'Action 5'

    
    class 6:
        name = u'6'
        description = 'Action 6'

    
    class 7:
        name = u'7'
        description = 'Action 7'

    
    class 8:
        name = u'8'
        description = 'Action 8'

    
    class 9:
        name = u'9'
        description = 'Action 9'

    
    class 0:
        name = u'0'
        description = 'Action 0'

    
    class Clear:
        name = u'Clear'
        description = 'Action Clear'

    
    class Goto:
        name = u'Goto'
        description = 'Action Goto'

    
    class Home:
        name = u'Home'
        description = 'Action Home'

    
    class Page_Up:
        name = u'Page Up'
        description = 'Action Page Up'

    
    class Page_Dn:
        name = u'Page Dn'
        description = 'Action Page Dn'

    
    class Display:
        name = u'Display'
        description = 'Action Display'

    
    class Top_Menu:
        name = u'Top Menu'
        description = 'Action Top Menu'

    
    class Popup_Menu:
        name = u'Popup Menu'
        description = 'Action Popup Menu'

    
    class Up:
        name = u'Up'
        description = 'Action Up'

    
    class Down:
        name = u'Down'
        description = 'Action Down'

    
    class Left:
        name = u'Left'
        description = 'Action Left'

    
    class Right:
        name = u'Right'
        description = 'Action Right'

    
    class Enter:
        name = u'Enter'
        description = 'Action Enter'

    
    class Setup:
        name = u'Setup'
        description = 'Action Setup'

    
    class Return:
        name = u'Return'
        description = 'Action Return'

    
    class Red:
        name = u'Red'
        description = 'Action Red'

    
    class Blue:
        name = u'Blue'
        description = 'Action Blue'

    
    class Green:
        name = u'Green'
        description = 'Action Green'

    
    class Yellow:
        name = u'Yellow'
        description = 'Action Yellow'

    
    class Stop:
        name = u'Stop'
        description = 'Action Stop'

    
    class Play:
        name = u'Play'
        description = 'Action Play'

    
    class Pause:
        name = u'Pause'
        description = 'Action Pause'

    
    class Previous_Track:
        name = u'Previous Track'
        description = 'Action Previous Track'

    
    class Next:
        name = u'Next'
        description = 'Action Next'

    
    class Reverse:
        name = u'Reverse'
        description = 'Action Reverse'

    
    class Fast_Forward:
        name = u'Fast Forward'
        description = 'Action Fast Forward'

    
    class Skip_Track:
        name = u'Skip Track'
        description = 'Action Skip Track'

    
    class Audio_Track:
        name = u'Audio Track'
        description = 'Action Audio Track'

    
    class Subtitles:
        name = u'Subtitles'
        description = 'Action Subtitles'

    
    class Angle:
        name = u'Angle'
        description = 'Action Angle'

    
    class Zoom:
        name = u'Zoom'
        description = 'Action Zoom'

    
    class Sap:
        name = u'Sap'
        description = 'Action Sap'

    
    class Ab_Replay:
        name = u'Ab Replay'
        description = 'Action Ab Replay'

    
    class Repeat:
        name = u'Repeat'
        description = 'Action Repeat'

    
    class Picturei_In_Picture:
        name = u'Picturei In Picture'
        description = 'Action Picturei In Picture'

    
    class Resolution:
        name = u'Resolution'
        description = 'Action Resolution'

    
    class Subtitle_Shift:
        name = u'Subtitle Shift'
        description = 'Action Subtitle Shift'

    
    class Netflix:
        name = u'Netflix'
        description = 'Action Netflix'

    
    class Vudu:
        name = u'Vudu'
        description = 'Action Vudu'

    
    class Option:
        name = u'Option'
        description = 'Action Option'

    
    class 3D:
        name = u'3D'
        description = 'Action 3D'

    
    class Darbee:
        name = u'Darbee'
        description = 'Action Darbee'

    
    class No_Operation:
        name = u'No Operation'
        description = 'Action No Operation'

    
    class Query_Verbose_Mode:
        name = u'Query Verbose Mode'
        description = 'Action Query Verbose Mode'

    
    class Query_Power_Status:
        name = u'Query Power Status'
        description = 'Action Query Power Status'

    
    class Query_Firmware_Version:
        name = u'Query Firmware Version'
        description = 'Action Query Firmware Version'

    
    class Query_Volume:
        name = u'Query Volume'
        description = 'Action Query Volume'

    
    class Query_Hdmi_Resolution:
        name = u'Query Hdmi Resolution'
        description = 'Action Query Hdmi Resolution'

    
    class Query_Playback_Status:
        name = u'Query Playback Status'
        description = 'Action Query Playback Status'

    
    class Query_Track:
        name = u'Query Track'
        description = 'Action Query Track'

    
    class Query_Chapter:
        name = u'Query Chapter'
        description = 'Action Query Chapter'

    
    class Query_Track_Elapsed_Time:
        name = u'Query Track Elapsed Time'
        description = 'Action Query Track Elapsed Time'

    
    class Query_Track_Remaining_Time:
        name = u'Query Track Remaining Time'
        description = 'Action Query Track Remaining Time'

    
    class Query_Chapter_Elapsed_Time:
        name = u'Query Chapter Elapsed Time'
        description = 'Action Query Chapter Elapsed Time'

    
    class Query_Chapter_Remaining_Time:
        name = u'Query Chapter Remaining Time'
        description = 'Action Query Chapter Remaining Time'

    
    class Query_Total_Elapsed_Time:
        name = u'Query Total Elapsed Time'
        description = 'Action Query Total Elapsed Time'

    
    class Query_Total_Remaining_Time:
        name = u'Query Total Remaining Time'
        description = 'Action Query Total Remaining Time'

    
    class Query_Disc_Type:
        name = u'Query Disc Type'
        description = 'Action Query Disc Type'

    
    class Query_Audio_Type:
        name = u'Query Audio Type'
        description = 'Action Query Audio Type'

    
    class Query_Subtitle_Type:
        name = u'Query Subtitle Type'
        description = 'Action Query Subtitle Type'

    
    class Query_Subtitle_Shift:
        name = u'Query Subtitle Shift'
        description = 'Action Query Subtitle Shift'

    
    class Query_Osd_Position:
        name = u'Query Osd Position'
        description = 'Action Query Osd Position'

    
    class Query_Repeat_Mode:
        name = u'Query Repeat Mode'
        description = 'Action Query Repeat Mode'

    
    class Query_Zoom_Mode:
        name = u'Query Zoom Mode'
        description = 'Action Query Zoom Mode'

    
    class Query_Input_Source:
        name = u'Query Input Source'
        description = 'Action Query Input Source'

    
    class Query_Darbee'S_Demo_Mode:
        name = u"Query Darbee'S Demo Mode"
        description = 'Action Query Darbee'S Demo Mode'

    


class OppoBDPNetworkController(eg.PluginBase):
    text = Text

    # you want to add any variables that can be access from anywhere inside of
    # your plugin here
    def __init__(self):
        self.AddAction(Power_On)
        self.AddAction(Power_Off)
        self.AddAction(Power_Toggle)
        self.AddAction(Source)
        self.AddAction(Eject)
        self.AddAction(Power)
        self.AddAction(Dimmer)
        self.AddAction(Pure_Audio)
        self.AddAction(Vol_Up)
        self.AddAction(Vol_Dn)
        self.AddAction(Mute)
        self.AddAction(1)
        self.AddAction(2)
        self.AddAction(3)
        self.AddAction(4)
        self.AddAction(5)
        self.AddAction(6)
        self.AddAction(7)
        self.AddAction(8)
        self.AddAction(9)
        self.AddAction(0)
        self.AddAction(Clear)
        self.AddAction(Goto)
        self.AddAction(Home)
        self.AddAction(Page_Up)
        self.AddAction(Page_Dn)
        self.AddAction(Display)
        self.AddAction(Top_Menu)
        self.AddAction(Popup_Menu)
        self.AddAction(Up)
        self.AddAction(Down)
        self.AddAction(Left)
        self.AddAction(Right)
        self.AddAction(Enter)
        self.AddAction(Setup)
        self.AddAction(Return)
        self.AddAction(Red)
        self.AddAction(Blue)
        self.AddAction(Green)
        self.AddAction(Yellow)
        self.AddAction(Stop)
        self.AddAction(Play)
        self.AddAction(Pause)
        self.AddAction(Previous_Track)
        self.AddAction(Next)
        self.AddAction(Reverse)
        self.AddAction(Fast_Forward)
        self.AddAction(Skip_Track)
        self.AddAction(Audio_Track)
        self.AddAction(Subtitles)
        self.AddAction(Angle)
        self.AddAction(Zoom)
        self.AddAction(Sap)
        self.AddAction(Ab_Replay)
        self.AddAction(Repeat)
        self.AddAction(Picturei_In_Picture)
        self.AddAction(Resolution)
        self.AddAction(Subtitle_Shift)
        self.AddAction(Netflix)
        self.AddAction(Vudu)
        self.AddAction(Option)
        self.AddAction(3D)
        self.AddAction(Darbee)
        self.AddAction(No_Operation)
        self.AddAction(Query_Verbose_Mode)
        self.AddAction(Query_Power_Status)
        self.AddAction(Query_Firmware_Version)
        self.AddAction(Query_Volume)
        self.AddAction(Query_Hdmi_Resolution)
        self.AddAction(Query_Playback_Status)
        self.AddAction(Query_Track)
        self.AddAction(Query_Chapter)
        self.AddAction(Query_Track_Elapsed_Time)
        self.AddAction(Query_Track_Remaining_Time)
        self.AddAction(Query_Chapter_Elapsed_Time)
        self.AddAction(Query_Chapter_Remaining_Time)
        self.AddAction(Query_Total_Elapsed_Time)
        self.AddAction(Query_Total_Remaining_Time)
        self.AddAction(Query_Disc_Type)
        self.AddAction(Query_Audio_Type)
        self.AddAction(Query_Subtitle_Type)
        self.AddAction(Query_Subtitle_Shift)
        self.AddAction(Query_Osd_Position)
        self.AddAction(Query_Repeat_Mode)
        self.AddAction(Query_Zoom_Mode)
        self.AddAction(Query_Input_Source)
        self.AddAction(Query_Darbee'S_Demo_Mode)
        
        self.tcp_listen = TCPListen(self)        self.sock = None
        self.port = None
        self.ip_address = None
        self.udp_listen = UDPListen(self)
    
    # you will want to add any startup parameters and also run any startup code
    # here
    def __start__(self, *args):
        # You are going to need to make a config
        # dialog and add a port control       
        self.tcp_listen.start(port)        # You are going to need to make a config
        # dialog and add a port control and an ip control        
        self.ip_address = ip_address
        self.port = port
        self.sock = self.connect()
        # You are going to need to make a config
        # dialog and add a port control
        self.udp_listen.start(port)
    
    # this gets called when eg is being closed and you can run code when that
    # happens
    def __close__(self):
        pass
        
    # this gets called as well when EG closes but it also gets called when a
    # plugin gets disabled. This is where you will do things like close any
    # open sockets
    def __stop__(self):
        self.tcp_listen.stop()        if self.sock is not None:
            try:
                self.sock.close()
            except socket.error:
                pass

            self.sock = None
        self.udp_listen.stop()
        
    # You will replace the code in this method if you want to make a plugin
    # configuration dialog.
    def Configure(self, *args):
        eg.PluginBase.Configure(self, *args)

    
    # The next 2 are pretty self explanatory
    def OnComputerResume(self):
        pass
    
    def OnComputerSuspend(self):
        pass
    
    # This gets called when a plugin gets deleted from the tree. so here if
    # you use eg.PersistantData to store any data. that data needs to be
    # deleted when the plugin gets removed. this is where that gets done.
    def OnDelete(self):
        pass    

    def connect(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.connect((self.ip_address, self.port))
        return sock
        
    def send(self, message):
        try:
            self.sock.sendall(message)
        except socket.error:
            self.sock = self.connect()
            self.send(message)               
        
        # optional receive after sending the message
        
        try:
            data, addr = self.sock.recv(4096)
        except socket.error:
            data = None
            
        return data




class Power_On(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Power_Off(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Power_Toggle(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Source(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Eject(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Power(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Dimmer(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Pure_Audio(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Vol_Up(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Vol_Dn(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Mute(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 1(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 2(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 3(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 4(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 5(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 6(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 7(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 8(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 9(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 0(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Clear(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Goto(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Home(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Page_Up(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Page_Dn(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Display(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Top_Menu(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Popup_Menu(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Up(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Down(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Left(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Right(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Enter(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Setup(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Return(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Red(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Blue(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Green(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Yellow(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Stop(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Play(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Pause(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Previous_Track(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Next(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Reverse(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Fast_Forward(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Skip_Track(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Audio_Track(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Subtitles(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Angle(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Zoom(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Sap(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Ab_Replay(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Repeat(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Picturei_In_Picture(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Resolution(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Subtitle_Shift(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Netflix(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Vudu(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Option(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class 3D(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Darbee(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class No_Operation(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Verbose_Mode(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Power_Status(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Firmware_Version(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Volume(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Hdmi_Resolution(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Playback_Status(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Track(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Chapter(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Track_Elapsed_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Track_Remaining_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Chapter_Elapsed_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Chapter_Remaining_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Total_Elapsed_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Total_Remaining_Time(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Disc_Type(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Audio_Type(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Subtitle_Type(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Subtitle_Shift(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Osd_Position(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Repeat_Mode(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Zoom_Mode(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Input_Source(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()


class Query_Darbee'S_Demo_Mode(eg.ActionBase):

    # this code gets executed when the action gets run
    def __call__(self, *args):
        pass
        
    # this is where you would put the code for an action configuration dialog
    def Configure(self, *args):
        text = self.text
        panel = eg.ConfigPanel()
        
        while panel.Affirmed():
            panel.SetResult()

/code]

User avatar
kgschlosser
Site Admin
Posts: 4250
Joined: Fri Jun 05, 2015 5:43 am
Location: Rocky Mountains, Colorado USA

Re: Serial control of the Oppo BDP-103

Post by kgschlosser » Fri Aug 24, 2018 2:20 am

I am going to assume the [ as the first character is a mistake. that should not be there.

The register plugin generator is not perfect by any means. It is simply something i threw together to actually make the eg.RegisterPlugin() portion of the plugin to include the GUID and also have all of the parameters available to be easily set. It kind of gre on me as i found myself using specific bits over and over again.

What I am going to do is I will go through this plugin and correct it/add to it. I will comment each and every single change/addition explaining how it work why I made the change/addition. The RegisterPluginGenerator is simply meant to be used as a framework/outline. It puts most of the common pieces into place but those pieces will need to be modified/altered to fit needs of whatever the plugin is for.

You are going to need to use the UDP Listen as well as the TCP Listen. the TCP Listen is going to have to be altered because we do not need a TCP socket that waits for an incoming connection. we want to make it so that it will connect and then waits for data to be sent to it. Kinda the same idea but the connection specific bits need to be changed. You can use the TCP Send and the TCP Listen and they will need to be combined together.

It is going to be better to get the UDP working right out of the gate. This is so that you can have your BD Player use a dynamic IP Address. it is simply one more thing that a user will n0t have to keep track of. A lot of devices these days do not even give the option to be able to set a static address. and in order to do that you would have to use ip reservations using the mac address of the device. some routers allow for this and some do not. so if there is an automated way to obtain the IP then that should be the mechanism that should be used. Plus it always adds to the "WoW" factor.

As an example. All of the PC based HA solutions that I have seen that can use ZWave, every single one of them require you to enter the com port of the device. Shitty thing about this is if you happen to unplug the device and plug it into a different USB port. the port that is assigned by windows does not follow the device. A new one gets created and you will then have to go and setup a new device and it will create a whole new set of configuration data. Where as the EG implementation of zwave auto discovers the devices. I have been trying to nail down an identifier for the device so that matching it with the correct config data is possible. But at it's present state all one would have to do is simply enter the same name that was used before the comport changed and all of the config data is restored. It is the little things like that which is what makes EG the best.

So the best thing to do is to give the extra.

Give me a little bit to go over the plugin and make any changes.

with the comments i will add it is going to give you a whole lot better understand of how a plugin functions.
If you like the work I have been doing then feel free to Image

User avatar
kgschlosser
Site Admin
Posts: 4250
Joined: Fri Jun 05, 2015 5:43 am
Location: Rocky Mountains, Colorado USA

Re: Serial control of the Oppo BDP-103

Post by kgschlosser » Fri Aug 24, 2018 4:47 pm

OK so instead of putting you off any further. I have commented a lot of this. I am not finished with the comments But ti should get you started with some light reading material anyway.

I do not know if the plugin will work. it is a rough draft. when I am through with commenting the whole thing and you can read through it. you can clean out any of the bugs in it.
Attachments
scratch_563.py
(41.01 KiB) Downloaded 4 times
If you like the work I have been doing then feel free to Image

jachin99
Experienced User
Posts: 547
Joined: Sat Feb 13, 2016 8:39 pm

Re: Serial control of the Oppo BDP-103

Post by jachin99 » Fri Aug 24, 2018 5:43 pm

The player didn't come with a remote so this will actually be really nice to have. Thanks.

User avatar
kgschlosser
Site Admin
Posts: 4250
Joined: Fri Jun 05, 2015 5:43 am
Location: Rocky Mountains, Colorado USA

Re: Serial control of the Oppo BDP-103

Post by kgschlosser » Fri Aug 24, 2018 6:50 pm

Again this is a learning thing for you. So be sure to read the comments. I would really be surprised if it works. I still need to finish making the comments I. It
If you like the work I have been doing then feel free to Image

jachin99
Experienced User
Posts: 547
Joined: Sat Feb 13, 2016 8:39 pm

Re: Serial control of the Oppo BDP-103

Post by jachin99 » Thu Aug 30, 2018 2:37 am

I'm also using this class from code academy to work through the basics. Its a little easier than the videos, and uses python 2.7. The class is free. https://www.codecademy.com/courses/lear ... ntent_item

Post Reply