Commit b9a13523 authored by Mark Tearle's avatar Mark Tearle
Browse files

Remove virtualvend due to bitrot.

Can always resurrect later.  In the interim, use virtualsnack
parent 6c130dc9
This diff is collapsed.
#!/usr/bin/env python
import sys
import socket
import string
try:
import pygtk
#tell pyGTK, if possible, that we want GTKv2
pygtk.require("2.0")
except:
#Some distributions come with GTK2, but not pyGTK
pass
try:
import gtk
import gtk.glade
except:
print "You need to install pyGTK or GTKv2 ",
print "or set your PYTHONPATH correctly."
print "try: export PYTHONPATH=",
print "/usr/local/lib/python2.2/site-packages/"
sys.exit(1)
import pango
class Switches:
def __init__(self):
self.misc_input = 0xff
self.switch_input = 0x3f
def door_open(self):
return self.switch_input & 0x20
def set_door_open(self, open = True):
if open:
self.switch_input |= 0x20
else:
self.switch_input &= ~0x20
#now we have both gtk and gtk.glade imported
#Also, we know we are running GTK v2
class appgui:
def __init__(self):
"""
In this init we are going to display the main
serverinfo window
"""
gladefile="vvend.glade"
windowname="vvend"
self.wTree=gtk.glade.XML (gladefile,windowname)
# we only have two callbacks to register, but
# you could register any number, or use a
# special class that automatically
# registers all callbacks. If you wanted to pass
# an argument, you would use a tuple like this:
# dic = { "on button1_clicked" :
# (self.button1_clicked, arg1,arg2) , ...
dic = {
"on_button1_clicked" : self.keypad_clicked,
"on_button2_clicked" : self.keypad_clicked,
"on_button3_clicked" : self.keypad_clicked,
"on_button4_clicked" : self.keypad_clicked,
"on_button5_clicked" : self.keypad_clicked,
"on_button6_clicked" : self.keypad_clicked,
"on_button7_clicked" : self.keypad_clicked,
"on_button8_clicked" : self.keypad_clicked,
"on_button9_clicked" : self.keypad_clicked,
"on_button10_clicked" : self.keypad_clicked,
"on_button11_clicked" : self.keypad_clicked,
"on_button11_clicked" : self.keypad_clicked,
"on_door_toggled" : self.door_changed,
"on_vvend_destroy_event" : self.quit,
"on_vvend_delete_event" : self.quit }
self.wTree.signal_autoconnect (dic)
display = self.wTree.get_widget("label1")
label_font = pango.FontDescription('monospace 28')
display.modify_font(label_font)
label_style = display.get_style().copy()
fg_color = display.get_colormap().alloc_color('lightgreen')
label_style.fg[gtk.STATE_NORMAL] = fg_color
display.set_style(label_style)
w = self.wTree.get_widget("eventbox1")
wstyle = w.get_style().copy()
bg_color = w.get_colormap().alloc_color('black')
wstyle.bg[gtk.STATE_NORMAL] = bg_color
w.set_style(wstyle)
display.set_text("*5N4CK0RZ*")
# vending machine password set here
self.vendpw = "AAAAAAAAAAAAAAAA"
self.messageid = None
self.switches = Switches()
#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#
# listenhost=""
# listenport=5150
# s.bind((listenhost, listenport))
# # only one connection
# s.listen(1)
# s.setblocking(1)
# #GDK->gtk.gdk in GTK V 2.0
# id=gtk.input_add(s, gtk.gdk.INPUT_READ, self.handleNewConnection)
self.server()
return
def __del__(self):
try:
self.sock.close()
self.sock.shutdown()
except:
pass
#####CALLBACKS
def keypad_clicked(self,widget):
key = widget.get_label()
if key == 'RESET':
key = '11'
else:
key = '0'+key
self.do_send('2'+key+' keypress\n')
def door_changed(self, widget):
self.switches.set_door_open(not widget.get_active())
if widget.get_active():
self.do_send('401 door closed\n')
else:
self.do_send('400 door open\n')
def handleNewConnection(self,source,condition):
#source is a socket in GTK v 1 and a fd in version 2
conn, addr = source.accept()
sys.stdout.write(conn.recv(1))
conn.send("bing\n")
return gtk.TRUE
# from http://www.pythonbrasil.com.br/moin.cgi/MonitorandoSocketsComPygtk
def send(self, data=None, widget=None):
text = self.entry.get_text()
self.do_send(text)
self.entry.set_text('')
#
def do_send(self, data):
# envia ''data'' para todos os clientes conectados
for addr, (conn, tag) in self.clients.iteritems():
conn.send(data)
def server(self):
# inicializa o servidor
port = 5150
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('localhost', port))
self.sock.listen(0)
print "listening on ", port
#
#
self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
# mantemos uma lista dos clientes conectados
self.clients = {}
def accept(self, source, condition):
#
# esperando para ser aceito
conn, addr = source.accept()
self.insert("%s:%s conectado\n" % addr)
# insere o cliente na lista e registra o mtodo self.write como
# callback para quando existirem dados esperando para serem lidos
self.do_prompt()
self.clients[addr] = (conn, gtk.input_add(conn, gtk.gdk.INPUT_READ, self.write))
def write(self, source, condition):
# mtodo chamado quando um cliente envia dados
data = source.recv(1024)
if data.strip() == 'bye' or not len(data):
# se o cliente enviar um ''bye'', desconecte-o :)
source.close()
for addr, (conn, tag) in self.clients.iteritems():
if source is conn:
gtk.input_remove(tag)
self.insert('%s:%s desconectado\n' % addr)
del self.clients[addr]
self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
break
elif data.strip() == 'quit':
self.quit()
else:
for (addr, port), (conn, tag) in self.clients.iteritems():
if source is conn:
self.insert('%s:%s >>> %s\n'%(addr, port, data.strip()))
self.handle_command(data.strip())
break
return gtk.TRUE
def insert(self, data):
statusbar = self.wTree.get_widget("statusbar1")
if self.messageid:
statusbar.remove(1, self.messageid)
self.messageid=statusbar.push(1,data)
def quit(self, *args):
sys.stdout.write("quiting...\n")
gtk.input_remove(self.server_tag)
for addr, (conn, tag) in self.clients.iteritems():
gtk.input_remove(tag)
conn.close()
self.sock.close()
self.sock.shutdown()
gtk.mainquit()
sys.stdout.write("quit!\n")
def do_prompt(self):
self.do_send("# ")
def do_help(self):
help = """
Valid commands are:
ABOUT ROM information
B[S][nn] beep [synchronously] for a duration nn (optional)
C[S][nn] silence [synchronously] for a duration nn (optional)
Dxxxxxxxxxx show a message on the display
ECHO {ON|OFF} turn echo on or off
GETROM download the ROM source code using xmodem
H[...] this help screen
*JUMPxxxx jumps to a subroutine at location xxxx
*PEEKxxxx returns the value of the byte at location xxxx
*POKExxxxyy sets the value of location xxxx to yy
PING pongs
S[...] query all internal switch states
+Vnn vend an item
+VALL vend all items
*Wxxxxxxxxxxxx set a new password for authenticated vends. xxx=16 chars
password will be converted to uppercase
Very few functions are available when the machine is in standalone
mode (DIP SW 1 is set)
+ denotes that this item requires authentication if DIP SW 2 is set
* denotes that DIP SW 3 must be set to use these
Commands starting with # are ignored (comments)
"""
self.do_send(help)
def do_about(self):
about = """
The Virtual Vending Machine Company
Mark Tearle, June 2004
"""
self.do_send(about)
def do_vend_all(self):
for i in range(11,99):
self.do_send("101 Vending "+str(i)+"\n")
self.do_send("153 Home sensors failing\n")
self.do_send("102 Vend all motors complete\n")
def do_vend(self,command):
fail = None
if fail:
self.do_send("153 Home sensors failing\n")
else:
self.insert("Vending "+command)
self.do_send("100 Vend successful\n")
def do_display(self,string):
display = self.wTree.get_widget("label1")
display.set_text("%-10.10s" % (string))
self.do_send('300 Written\n')
def do_beep(self,command):
sys.stdout.write("\a")
self.do_send('500 Beeped\n')
def do_silence(self,command):
pass
def do_switches(self):
self.do_send("600 3F 3F\n")
def do_pong(self):
self.do_send("000 PONG!\n")
def handle_command(self, command):
command = string.upper(command)
print command
if string.find(command, "HELP",0) == 0:
self.do_help()
elif string.find(command, "ABOUT",0) == 0:
self.do_about()
elif string.find(command, "PING",0) == 0:
self.do_pong()
elif string.find(command, "VALL",0) == 0:
self.do_vend_all()
elif string.find(command, "V",0) == 0:
self.do_vend(command)
elif string.find(command, "B",0) == 0:
self.do_beep(command)
elif string.find(command, "C",0) == 0:
self.do_silence(command)
elif string.find(command, "S",0) == 0:
self.do_switches()
elif string.find(command, "D",0) == 0:
self.do_display(command[1:])
self.do_prompt()
# we start the app like this...
app=appgui()
gtk.main()
# notes
# http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.011.htp
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment