import sys
import socket
+import string
try:
import pygtk
display = self.wTree.get_widget("label1")
display.set_text("*5N4CK0RZ*")
+ # vending machine password set here
+ self.vendpw = "AAAAAAAAAAAAAAAA"
+
self.messageid = None
#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
return
-
+
+ def __del__(self):
+ try:
+ self.sock.close()
+ self.sock.shutdown()
+ except:
+ pass
+
#####CALLBACKS
def keypad_clicked(self,widget):
- print "button clicked"
- print widget.get_label()
- self.do_send(widget.get_label())
- sys.stdout.write("\a")
+ key = widget.get_label()
+ if key == 'RESET':
+ key = '11'
+ else:
+ key = '0'+key
+ self.do_send('2'+key+' keypress\n')
def handleNewConnection(self,source,condition):
#source is a socket in GTK v 1 and a fd in version 2
def server(self):
# inicializa o servidor
+ port = 5150
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.sock.bind(('localhost', 5051))
+ self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ self.sock.bind(('localhost', port))
self.sock.listen(0)
+ print "listening on ", port
#
#
# insere o cliente na lista e registra o método 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):
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
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 ",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.mainloop()