Week 16

Interface and Application Programming

The sixteenth lecture on Wednesday May 17th was about Interface and Application Programming: languages, device/data/user interfaces, graphics, multimedia, math, performance. Assignment given by Neil for this sixteenth week was:

  • Write an application that interfaces with an input and/or output device that you made, comparing as many tool options as possible

Writing an interface for Fade-In/Fade-Out LED device, with Python

After exploring different interface programming options, not having technical or engineering background, I decided to take it easy and build a simple Fade-IN/Fade-OUT interface in Python, and make it communicate through serial interface: pushing buttons on the User Interface LED on the board become more on less bright. I won't go through the whole PCB production process since I already had the board from Week 06, about board firmware I used the very same node-B.ino firmware from Week 15.

Here's the Python code. Setting up libraries (opted for GTK3Graphical User Interface libraries)

import gi
import serial, time
import os

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

os.system('clear')

Setting up serial interface


ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
)

print(ser.name)

ser.isOpen()
time.sleep(1)

Declaring the main class and setting up the basic window layout


class ButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Comm Software")
        self.set_border_width(20)
        hbox = Gtk.Box(spacing=20)
        self.add(hbox)

Adding three buttons to the window layout


        button = Gtk.Button.new_with_label("Fade IN")
        button.connect("clicked", self.on_fade_in_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button.new_with_label("Fade OUT")
        button.connect("clicked", self.on_fade_out_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.connect("clicked", self.on_close_clicked)
        hbox.pack_start(button, True, True, 0)

Sending to serial interface command (different for each button), waiting for the board answer and printing out answer itself; last button also exits the program


    def on_fade_in_clicked(self, button):
        print("Local software: \"Fade IN\" button was clicked")
        serialcmd = "dim_set:+;"
        ser.write(serialcmd.encode())
        time.sleep(1)
        data_raw = ser.readline()
        print(data_raw.decode())

    def on_fade_out_clicked(self, button):
        print("Local software: \"Fade OUT\" button was clicked")
        serialcmd = "dim_set:-;"
        ser.write(serialcmd.encode())
        time.sleep(1)
        data_raw = ser.readline()
        print(data_raw.decode())

    def on_close_clicked(self, button):
        print("Local software: Closing application")
        serialcmd = "dim_set:0;"
        ser.write(serialcmd.encode())
        time.sleep(1)
        data_raw = ser.readline()
        print(data_raw.decode())
        ser.close()
        Gtk.main_quit()

Adding standard GTK3 lines

win = ButtonWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

Here's a "Hero Shot" of the application GUI

and here's a small "Hero Video"

Source files