#!/usr/bin/python # Act as a server for a BBC Micro requesting bits of disk images. # Adam Sampson import sys, serial, time def read_line(ser): s = "" while 1: c = ser.read(1) if c == "\r" or c == "\n": break s += c return s def checksum(data): csum = 0 for c in data: csum += ord(c) csum = csum & 0xFFFF return csum def main(): ser = serial.Serial("/dev/ttyS0", 19200, rtscts = 1) filename = None while 1: print "Waiting for request..." # Discard until *, in case we get out of sync while 1: c = ser.read(1) if c == "*": break while 1: c = ser.read(1).lower() if c != "*" and c != "": break print "Got command: " + c s = read_line(ser) print "Got arg: " + s # *nfilename - change filename if c == "n": print "Filename: " + s filename = s try: f = open(filename, "r") f.close() ser.write("y\n") except IOError: ser.write("n\n") # *rstart,count - read count bytes starting at start elif c == "r": (start, count) = map(int, s.split(",")) print "Sending %d bytes from %d" % (count, start) try: f = open(filename, "r") f.seek(start) data = f.read(count) f.close() except IOError: data = None if data is None: ser.write("n\n") else: if len(data) < count: print "Short read -- padding with zeroes" data += "\0" * (count - len(data)) sum = checksum(data) ser.write("y%d\n" % sum) time.sleep(0.1) ser.write(data) else: ser.write("n\n") if __name__ == "__main__": main()