Advertisement
Guest User

gui.py

a guest
May 30th, 2012
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.14 KB | None | 0 0
  1.  
  2. import pygtk
  3. import gtk
  4. import serial
  5. import time
  6.  
  7. pygtk.require('2.0')
  8.  
  9. #########################################
  10. #
  11. #  This program was written by John Meichle on 2/25/2010
  12. #  as a GTK GUI Front end to an Arduino Sketch that was written
  13. #  to control an RGB LED. This could be a single LED, or a
  14. #  multiple LED Array. This program interfaces with the Arduino
  15. #  via a serial connection, and uses simple byte commands to
  16. #  set the color values in the Arduino.
  17. #
  18. #  The Python code is not commented well, as it is old code I had that
  19. #  uses the UIManager to build the GTK GUI. If anyone has any questions
  20. #  I can provide a commented copy to use.
  21. #
  22. #  The HSV Loop function is built into the Arduino Sketch, and
  23. #  has a simple serial command called to start the loop. The Sketch
  24. #  activly monitors the serial connection during the loop to check for
  25. #  new RGB values.
  26. #
  27. #  Serial Command set for the Arduino Sketch:
  28. #
  29. #  (Ascii r)(Red Value)                  - Sets the Red RGB value
  30. #  (Ascii g)(Green Value)                - Sets the Green RGB value
  31. #  (Ascii b)(Blue Value)                 - Sets the Blue RGB value
  32. #  (Ascii f)(ms Delay)                   - Starts the HSV loop with internal delay (ms) passed
  33. #
  34. #########################################
  35. class ArduinoRGB:
  36.     serialPort = "COM14"
  37.     serialBaud = 57600
  38.     ui = '''<ui>
  39.    <menubar name="MenuBar">
  40.      <menu action="mnuFile">
  41.        <menuitem action="funConnect"/>
  42.        <menuitem action="funQuit"/>
  43.      </menu>
  44.      <menu action="mnuRGB">
  45.        <menuitem action="funLoop"/>
  46.        <menuitem action="funSetRed"/>
  47.        <menuitem action="funSetGreen"/>
  48.        <menuitem action="funSetBlue"/>
  49.        <separator/>
  50.        <menuitem action="funSetWhite"/>
  51.        <menuitem action="funSetSoftWhite"/>
  52.      </menu>
  53.      <menu action="mnuHelp" expand="true">
  54.        <menuitem action="funAbout"/>
  55.      </menu>
  56.    </menubar>
  57.    <toolbar name="Toolbar">
  58.      <toolitem action="funConnect"/>
  59.      <toolitem action="funQuit"/>
  60.      <separator/>
  61.      <toolitem action="funLoop"/>
  62.      <separator/>
  63.      <toolitem action="funSetRed"/>
  64.      <toolitem action="funSetGreen"/>
  65.      <toolitem action="funSetBlue"/>
  66.      <separator/>
  67.      <toolitem action="funSetWhite"/>
  68.      <toolitem action="funSetSoftWhite"/>
  69.    </toolbar>
  70.    </ui>'''
  71.     serialConnect = False
  72.       
  73.     def aboutButton(self,widget):
  74.         about = gtk.AboutDialog()
  75.         about.set_name("Arduino-RGB")
  76.         about.set_version("0.1")
  77.         about.set_copyright("(c) John Meichle")
  78.         about.set_comments("Arduino-RGB is a python frontend for an Arduino based RGB LED Controller.")
  79.         about.set_website("http://www.Jkmcustoms.com/arduino")
  80.         about.run()
  81.         about.destroy()
  82.         
  83.     def __init__(self):
  84.   
  85.         self.window = gtk.Window()
  86.         self.window.connect('destroy', lambda w: gtk.main_quit())
  87.         self.window.set_size_request(600, 425)
  88.         self.window.set_title("Arduino-RGB")
  89.         icon = self.window.render_icon(gtk.STOCK_CONVERT, gtk.ICON_SIZE_BUTTON)
  90.         self.window.set_icon(icon)
  91.  
  92.         self.vbox = gtk.VBox()
  93.         self.window.add(self.vbox)
  94.         self.uimanager = gtk.UIManager()
  95.         accelgroup = self.uimanager.get_accel_group()
  96.         self.window.add_accel_group(accelgroup)
  97.  
  98.  
  99.         genericactions = gtk.ActionGroup('GenericActions')
  100.         self.genericactions = genericactions
  101.         genericactions.add_actions([
  102.  
  103.                                  ('mnuRGB', None, '_Image'),
  104.                                  ('funLoop', gtk.STOCK_REFRESH, 'HSV _Loop', None, 'HSV Loop', self.hsvLoop),
  105.                                  ('funSetRed', gtk.STOCK_ADD, 'Set _Red', None, 'Set Red', self.setRed),
  106.                                  ('funSetGreen', gtk.STOCK_ADD, 'Set _Green', None, 'Set Green', self.setGreen),
  107.                                  ('funSetBlue', gtk.STOCK_ADD, 'Set _Blue', None, 'Set Blue', self.setBlue),
  108.                                  ('funSetWhite', gtk.STOCK_ADD, 'Set _White', None, 'Set White', self.setWhite),
  109.                                  ('funSetSoftWhite', gtk.STOCK_ADD  , 'Set _Soft White', None, 'Set Soft White', self.setSoftWhite),
  110.  
  111.                                  ])
  112.         self.uimanager.insert_action_group(genericactions, 0)
  113.         
  114.         serialactions = gtk.ActionGroup('SerialActions')
  115.         self.serialactions = serialactions
  116.         serialactions.add_actions([
  117.                                  ('mnuHelp', None, '_Help'),                            
  118.                                  ('funAbout', gtk.STOCK_ABOUT, '_About', None, 'About', self.aboutButton),
  119.                                  ('funQuit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', self.quit),
  120.                                  ('mnuFile', None, '_File'),
  121.                                  ('funConnect', gtk.STOCK_REFRESH, 'Serial _Connect', None, 'Serial Connect', self.setup_serial)
  122.                                  ])
  123.         self.uimanager.insert_action_group(serialactions, 0)
  124.         
  125.         
  126.         
  127.         self.uimanager.add_ui_from_string(self.ui)
  128.         self.menubar = self.uimanager.get_widget('/MenuBar')
  129.         self.vbox.pack_start(self.menubar, False)
  130.         self.toolbar = self.uimanager.get_widget('/Toolbar')
  131.         self.vbox.pack_start(self.toolbar, False)
  132.  
  133.         self.content = gtk.VBox()
  134.  
  135.         headerVbox = gtk.VBox(True,0)
  136.         headerLabel1 = gtk.Label("RGB Control App for Arduino")
  137.         headerVbox.pack_start(headerLabel1)
  138.       
  139.         mainHbox = gtk.HBox(True, 0)
  140.  
  141.         loopVbox = gtk.VBox(True, 0)
  142.         fadeLabel = gtk.Label("Fade Delay (variable on arduino (ms): ")  
  143.         self.fadeScale = gtk.HScale()
  144.         self.fadeScale.set_name("fade")
  145.         self.fadeScale.set_range(5, 60)
  146.         self.fadeScale.set_digits(0)
  147.         self.fadeScale.set_size_request(160, 35)
  148.         self.fadeScale.set_value(35)
  149.         
  150.         self.hsvButton = gtk.Button("HSV Loop")
  151.         self.hsvButton.set_size_request(80, 35)
  152.         self.hsvButton.connect("clicked", self.hsvLoop)
  153.         loopVbox.pack_start(fadeLabel)
  154.         loopVbox.pack_start(self.fadeScale)
  155.         loopVbox.pack_end(self.hsvButton)
  156.         
  157.         
  158.  
  159.         rHbox = gtk.HBox(True,0)
  160.         rLabel = gtk.Label("Red: ")
  161.         rHbox.pack_start(rLabel, expand=False, fill=False)  
  162.             
  163.         self.rScale = gtk.HScale()
  164.         self.rScale.set_name("red")
  165.         self.rScale.set_range(0, 255)
  166.         self.rScale.set_increments(1, 10)
  167.         self.rScale.set_digits(0)
  168.         self.rScale.set_size_request(160, 35)
  169.         self.rScale.connect("value-changed", self.slider_changed)
  170.         rHbox.pack_end(self.rScale)
  171.         
  172.         gHbox = gtk.HBox(True,0)
  173.         gLabel = gtk.Label("Green: ")
  174.         gHbox.pack_start(gLabel, expand=False, fill=False)  
  175.         
  176.         self.gScale = gtk.HScale()
  177.         self.gScale.set_name("green")
  178.         self.gScale.set_range(0, 255)
  179.         self.gScale.set_increments(1, 10)
  180.         self.gScale.set_digits(0)
  181.         self.gScale.set_size_request(160, 35)
  182.         self.gScale.connect("value-changed", self.slider_changed)
  183.         gHbox.pack_end(self.gScale)
  184.         
  185.         bHbox = gtk.HBox(True,0)      
  186.         bLabel = gtk.Label("Blue: ")
  187.         bHbox.pack_start(bLabel, expand=False, fill=False)  
  188.         
  189.         self.bScale = gtk.HScale()
  190.         self.bScale.set_name("blue")
  191.         self.bScale.set_range(0, 255)
  192.         self.bScale.set_increments(1, 10)
  193.         self.bScale.set_digits(0)
  194.         self.bScale.set_size_request(160, 35)
  195.         self.bScale.connect("value-changed", self.slider_changed)
  196.         bHbox.pack_end(self.bScale)
  197.        
  198.         sHbox = gtk.HBox(True,0)      
  199.         sLabel = gtk.Label("Servo: ")
  200.         sHbox.pack_start(bLabel, expand=False, fill=False)  
  201.         
  202.         self.sScale = gtk.HScale()
  203.         self.sScale.set_name("servo")
  204.         self.sScale.set_range(0, 180)
  205.         self.sScale.set_increments(1, 10)
  206.         self.sScale.set_digits(0)
  207.         self.sScale.set_size_request(160, 35)
  208.         self.sScale.connect("value-changed", self.slider_changed)
  209.         sHbox.pack_end(self.sScale)
  210.               
  211.         rgbVbox = gtk.VBox(True,0)
  212.  
  213.         rgbVbox.pack_start(headerVbox)
  214.         rgbVbox.pack_start(rHbox)
  215.         rgbVbox.pack_start(gHbox)
  216.         rgbVbox.pack_start(bHbox)
  217.         rgbVbox.pack_end(sHbox)
  218.         
  219.         mainHbox.pack_start(loopVbox)
  220.         mainHbox.pack_end(rgbVbox)
  221.  
  222.         self.content.pack_end(mainHbox)
  223.         self.disableAll()
  224.         self.vbox.pack_start(self.content)
  225.         self.window.show_all()
  226.         return
  227.         
  228.     def disableAll(self):
  229.         self.rScale.set_sensitive(False)
  230.         self.gScale.set_sensitive(False)
  231.         self.bScale.set_sensitive(False)
  232.         self.sScale.set_sensitive(False)
  233.         self.fadeScale.set_sensitive(False)
  234.         self.hsvButton.set_sensitive(False)
  235.         self.genericactions.set_sensitive(False)
  236.         
  237.     def enableAll(self):
  238.         self.rScale.set_sensitive(True)
  239.         self.gScale.set_sensitive(True)
  240.         self.bScale.set_sensitive(True)
  241.         self.sScale.set_sensitive(True)
  242.         self.fadeScale.set_sensitive(True)
  243.         self.hsvButton.set_sensitive(True)
  244.         self.genericactions.set_sensitive(True)
  245.         
  246.     def setRed(self, b):
  247.         self.rScale.set_value(255)
  248.         self.gScale.set_value(0)
  249.         self.bScale.set_value(0)
  250.         self.serial_write(255,0,0)
  251.         
  252.     def setGreen(self, b):
  253.         self.rScale.set_value(0)
  254.         self.gScale.set_value(255)
  255.         self.bScale.set_value(0)
  256.         self.serial_write(0,255,0)
  257.         
  258.     def setBlue(self, b):
  259.         self.rScale.set_value(0)
  260.         self.gScale.set_value(0)
  261.         self.bScale.set_value(255)
  262.         self.serial_write(0,0,255)
  263.     
  264.     def setWhite(self, b):
  265.         self.rScale.set_value(255)
  266.         self.gScale.set_value(255)
  267.         self.bScale.set_value(255)
  268.         self.serial_write(255,255,255)
  269.         
  270.     def setSoftWhite(self, b):
  271.         self.rScale.set_value(223)
  272.         self.gScale.set_value(161)
  273.         self.bScale.set_value(59)
  274.         self.serial_write(223,161,59)
  275.         
  276.     def slider_changed(self, widget):
  277.         val = widget.get_value()
  278.         name = widget.get_name()
  279.         if name == "red":
  280.             self.ser.write("r" + chr(int((val*-1)+255)))
  281.         elif name == "green":
  282.             self.ser.write("g" + chr(int((val*-1)+255)))
  283.         elif name == "blue":
  284.             self.ser.write("b" + chr(int((val*-1)+255)))
  285.         elif name == "servo":
  286.             self.ser.write("s" + chr(int((val*-1)+180)))
  287.         else:
  288.             print "ERROR: Invalid widget name, in on_changed function"
  289.     
  290.     def serial_write(self, rval, gval, bval):
  291.         self.ser.write("r" + chr(int((rval*-1)+255)))
  292.         self.ser.write("g" + chr(int((gval*-1)+255)))
  293.         self.ser.write("b" + chr(int((bval*-1)+255)))
  294.         self.ser.write("s" + chr(int((sval*-1)+180)))
  295.     
  296.     def hsvLoop(self, b):
  297.       delay = self.fadeScale.get_value()
  298.       self.ser.write("f" + chr(int(delay)))
  299.       time.sleep(.015)
  300.       self.ser.write("f" + chr(int(delay)))
  301.  
  302.  
  303.     def setup_serial(self, widget):
  304.       if (self.serialConnect == False):
  305.         self.ser = serial.Serial()
  306.         self.ser.setPort(self.serialPort)
  307.         self.ser.baudrate = self.serialBaud
  308.         self.ser.open()
  309.         if (self.ser.isOpen()):
  310.           self.serialConnect = True
  311.           self.enableAll()
  312.         else:
  313.           self.disableAll()
  314.           self.serialConnect = False
  315.           print "ERROR: Serial Unable to connect on " + ser.portstr
  316.         
  317.     def quit(self, b):
  318.         print 'Closing Serial Connection...'
  319.         self.ser.close()
  320.         print 'Quitting program'
  321.         gtk.main_quit()
  322.  
  323. if __name__ == '__main__':
  324.     main = ArduinoRGB()
  325.     gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement