#!/usr/bin/python # # Uploads raw audio files to Teensy + Audio board with SPI Flash on board. To use this program, first # load the 'CopyFromSerial' example sketch. When it first runs, it will format the SPI flash chip # (this may take a long time for larger chips; a 128MB chip that I am using can take almost 10 minutes, # but smaller 16MB ones should be faster). # # While the chip is being formatted, the LED (pin 13) will toggle at 1Hz rate. When the formatting is # done, it flashes quickly (10Hz) for one second, then stays on solid. When nothing has been received # for 3 seconds, the upload is assumed to be completed, and the light goes off. # # You can start this program immediately upon plugging in the Teensy. It will buffer and wait until # the Teensy starts to read the serial data from USB. # ################### import serial, sys, os, time if (len(sys.argv) <= 2): print("Usage: '" + sys.argv[0] + " ' where:\n\t is the TTY USB port connected to Drum Master\n\t is a list of .RAW files (bash globs work).") sys.exit() #Special bytes BYTE_START = "\x7e" BYTE_ESCAPE = "\x7d" BYTE_SEPARATOR = "\x7c" #Flash size (in MB). Change this to match how much space you have on your chip. FLASH_SIZE = 16 totalFileSize = 0; for i, filename in enumerate(sys.argv): if (i >= 2): totalFileSize = totalFileSize + os.path.getsize(filename) flashSizeBytes = FLASH_SIZE * 1024 * 1024 if (totalFileSize > flashSizeBytes): print("Too many files selsected.\n\tTotal flash size:\t" + "{:>14,}".format(flashSizeBytes) + " bytes\n\tTotal file size:\t" + "{:>14,}".format(totalFileSize) + " bytes") sys.exit() ser = serial.Serial(sys.argv[1]) print("Uploading " + str(len(sys.argv) - 2) + " files...") for i, filename in enumerate(sys.argv): if (i >= 2): startTime = time.time(); sys.stdout.write(str(i - 1) + ": ") sys.stdout.write(filename) sys.stdout.flush() f = open(filename, "rb") fileLength = os.path.getsize(filename) try: encoded = [] #Start byte encoded.append(BYTE_START) #Filename for byte in os.path.basename(filename): encoded.append(byte) #End of filename encoded.append(BYTE_SEPARATOR) #File length (uint32_t) encoded.append(chr((fileLength >> 24) & 0xFF)); encoded.append(chr((fileLength >> 16) & 0xFF)); encoded.append(chr((fileLength >> 8) & 0xFF)); encoded.append(chr((fileLength >> 0) & 0xFF)); encoded.append(BYTE_SEPARATOR) #Binary data, with escaping for byte in f.read(): if byte == BYTE_START or byte == BYTE_ESCAPE: encoded.append(BYTE_ESCAPE) encoded.append(chr(ord(byte) ^ 0x20)) else: encoded.append(byte); #Write end of data byte encoded.append(BYTE_START) ser.write("".join(encoded)) finally: f.close() endTime = time.time(); print(" (" + str(round(fileLength / 1024 / (endTime - startTime), 2)) + " KB/s)"); print("All files uploaded")