import socket
import select
import sys
import traceback
class Onkyo:
    def __init__(self):
        HOST = '10.0.2.137'
        PORT = 60128
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((HOST, PORT))
    def mycolors(self):
        self.cred = '\033[91m'
        self.creset = '\033[0m'
        self.cgreen = '\033[92m'
        self.cblue = '\033[94m'
        self.cyellow = '\033[33m'

    def myError(self, message="No message"):
        #self.printDebug()
        print self.cred + "Error: %s" % (message) + self.creset
        print traceback.print_exc(file=None)
        print "---End of traceback---\n"

    def myclean(self):
        if self.socket:
            self.socket.close()
    def makeMessage(self, cmd=None):
        if not cmd:
            self.myError("makeMessage: no message")
            
        o = 'ISCP\x00\x00\x00\x10\x00\x00\x00\n\x01\x00\x00\x00!1%s\r\n' % (cmd)
        return o
    def Iscp2Humans(self, i=None):
        if not i:
            self.myError("parseIscp: nothing to parse")
            return None
        else:
            i = i.replace("\x00", "").replace("\x01", "").replace("\x1a", "")
            i = i.replace("\x10", "").replace("!1", ": ").replace("\n", "").replace("\r","")
            i = i.replace("\x0b", "")
            return i

    def validcase(self):
        self.socket.send("ISCP\x00\x00\x00\x10\x00\x00\x00\n\x01\x00\x00\x00!1SLIQSTN\x1a\r\n")
        
    def main(self):
        self.mycolors()
        print self.cgreen + "Turmio Onkyo Magick v0.1 > " + self.creset
        self.validcase()
        while True:
            data = select.select([self.socket, sys.stdin],[],[],5)[0]
            if self.socket in data:
                d = self.socket.recv(1024)
                #print repr(d)
                #print repr(dstrip)
                print '<-- ' + self.cgreen + self.Iscp2Humans(d) + self.creset
            
            if sys.stdin in data:
                try:
                    i = sys.stdin.readline()
                    if i[0] == "!":
                        o = i[1:]
                        self.socket.send(o)
                        print "--> " + self.cyellow + \
                                "RAW: %s" % self.Iscp2Humans(o) + self.creset
                        self.validcase()
                    else:
                        o = self.makeMessage(i)
                        self.socket.send(o)
                        print "--> " + self.cyellow + \
                            "%s" % self.Iscp2Humans(o) + self.creset
                
                except:
                    self.myError("Something wrong while sending")
                    print "fail"


    #print "raw: %s" % data
    #print 'Received', repr(data)
if __name__ == "__main__":
    try:
        remote = Onkyo()
        remote.main()

    except KeyboardInterrupt:
        remote.myclean()
        sys.exit(1)
