Thanks Juan! I'll give it a try when I have time, but that sounds like
it might be exactly what I want.

2009/1/8 Juan Hernandez Gomez <[email protected]>:
> The attached program uses USPP to read from a serial port (USB for example).
>
>
>
> Daniel Kersten wrote:
>
> Hi all,
>
> On linux, if I want to read raw values off devices (eg serial, usb, etc) I
> can open() /dev/whatever and then read raw bytes from that.
>
> Does anyone know how I can do this on windows? Specifically, I want to try
> to read a MIDI device connected through USB. In linux, this is simply
> /dev/midi1, any ideas how I might access this on windows..? I don't actually
> want to do anything MIDI specific (so a MIDI sound library is no use to me),
> I want to read the raw bytes so that I can access the raw MIDI commands
> myself. Probably Windows won't let me read it directly, but its worth a
> shot.
>
> Thanks,
> Dan.
>
> --
> Daniel Kersten.
> Leveraging dynamic paradigms since the synergies of 1985.
>
>
>
> >
>
> #################################################################################
> ##
> ## readlog.py - Read gps tracklogs from Wintec 201 and write them into a
> .tk1 file.
> ##
> ## Version 1.0 - Copyright (c) 2007 Steffen Siebert
> <[email protected]>
> ##
> #################################################################################
> ##
> ## This program is free software; you can redistribute it and/or modify
> ## it under the terms of the GNU General Public License as published by
> ## the Free Software Foundation; either version 2 of the License, or
> ## (at your option) any later version.
> ##
> ## This program is distributed in the hope that it will be useful,
> ## but WITHOUT ANY WARRANTY; without even the implied warranty of
> ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ## GNU General Public License for more details.
> ##
> ## You should have received a copy of the GNU General Public License
> ## along with this program; if not, write to the Free Software
> ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>  02110-1301, USA
> ##
> #################################################################################
> ## Requirements
>    ##
> #################################################################################
> ##
> ## Python 2.2 or later:
> ## <http://www.python.org>
> ##
> ## Required Python libraries:
> ## uspp-1.0 from http://ibarona.googlepages.com/uspp
> ## For usage with windows: pywin32 from
> http://sourceforge.net/projects/pywin32/ (required by uspp)
> ##
> #################################################################################
> ## Known Problems:
>   ##
> #################################################################################
> ##
> ## - Several fields in the tk1 header and footer are filled with dummy
> values,
> ##   thus the created tk1 file is not identical with a tk1 file created by
> ##   Time Machine X. But the files created by readlog.py can be read and
> ##   converted in other file formats with Time Machine X.
> ## - The code for deleting the tracks from the Wintec 201 is included, but
> ##   disabled.
> ##
> #################################################################################
> ## Support
>   ##
> #################################################################################
> ##
> ## The latest version of webcheck is always available from my homepage:
> ## <http://www.SteffenSiebert.de/soft/python/wintec_tools.html>
> ##
> ## If you have bug reports, patches or some questions, just send a mail to
> ## <[email protected]>
> ##
> #################################################################################
>
> from winteclib import *
>
> import datetime
> import getopt
> import struct
> import sys
> import time
> import uspp
>
> #debug = None
>
> def isChecksumCorrect(buffer, checksum):
>    cs = 0
>    for char in buffer:
>        cs = cs ^ ord(char)
>    return checksum == "%02X" % cs
>
> def getLogString(tty):
>    line = tty.readline()
>    if debug:
>        print line
>    return line.split(",")[-1].strip()
>
> def getLogValue(tty):
>    return int(getLogString(tty))
>
> def writeBytes(f, byte, count):
>    for i in range(count):
>        f.write(byte)
>
> def writeFooterEntry(f, tracknumber, trackvalues):
>    # 24 Bytes per track.
>    # 0x00-0x03: tracknumber
>    # 0x04-0x07: Offset first track
>    # 0x08-0x0b: Trackpoint count
>    # 0x0c-0x0f: Track duration in seconds
>    # 0x10-0x17: Track length as double
>    f.write(struct.pack('l', tracknumber))
>    f.write(struct.pack('l', trackvalues[0]))
>    f.write(struct.pack('l', trackvalues[1]))
>    f.write(struct.pack('l', trackvalues[2]))
>    f.write(struct.pack('d', trackvalues[3]))
>
> def writeHeader(f, devicename, deviceinfo, trackpointcount, footerpos,
> trackcount):
>    f.write('WintecLogFormat' + chr(0x00))
>    f.write(chr(0x00)+chr(0x00)+chr(0x80)+chr(0x3f))
>    f.write(chr(0x00)+chr(0x00)+chr(0x80)+chr(0x3f))
>    f.write(chr(0x00)+chr(0x00)+chr(0x80)+chr(0x3f))
>    f.write(chr(0x41)+chr(0xbf)+chr(0x10)+chr(0x00))
>    f.write(struct.pack('l', trackpointcount))
>    f.write(chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00))
>    f.write(devicename)
>    writeBytes(f, chr(0), 20-len(devicename))
>    f.write(deviceinfo)
>    writeBytes(f, chr(0), 20-len(deviceinfo))
>    f.write('YYMM1234567890'+chr(0x00)+chr(0x00))
>    writeBytes(f, chr(0), 24)
>    f.write(time.strftime("%Y_%m_%d_%H:%M:%S", time.localtime()) +chr(0))
>    f.write(struct.pack('l', footerpos))
>    f.write(struct.pack('l', trackcount))
>    writeBytes(f, chr(0), 876)
>
> def parseTracklog(data):
>    outputFile = None
>    dataPos = 0
>    trackCount = 0
>    trackPointCount = 0
>    trackStartPos = 0x400
>    trackStartDateTime = None
>    trackDistance = float(0)
>    previousDateTime = None
>    previousLatitude = None
>    previousLongitude = None
>    tracks = {}
>    while dataPos < len(data):
>        byte = data[dataPos]
>        dateTime = convertToDateTime(readLongWord(data, dataPos+2))
>        # The first trackpoint might not be marked with the trackstart flag.
>        if ord(byte) & 0x01 == 1 or dataPos == 0:
>            if previousDateTime != None:
>                trackDuration = previousDateTime - trackStartDateTime
>                tracks[trackCount-1] = (trackStartPos, trackPointCount,
> trackDuration.days * 24 * 60 * 60 + trackDuration.seconds, trackDistance)
>            # Start of new Track
>            trackPointCount = 0
>            trackStartPos = dataPos + 0x400
>            trackStartDateTime = dateTime
>            trackDistance = float(0)
>            previousDateTime = None
>            previousLatitude = None
>            previousLongitude = None
>            trackCount = trackCount + 1
>        latitude = float(readSignedLongWord(data, dataPos+6))
>        longitude = float(readSignedLongWord(data, dataPos+10))
>        altitude = float(readSignedWord(data, dataPos+14))
>        speed = 0
>        if previousLatitude:
>            trackDistance = trackDistance +
> calculateVincentyDistance(previousLatitude / 10000000.0, previousLongitude /
> 10000000.0, latitude / 10000000.0, longitude / 10000000.0)
>        previousDateTime = dateTime
>        previousLatitude = latitude
>        previousLongitude = longitude
>        trackPointCount = trackPointCount + 1
>        dataPos = dataPos + 16
>    if previousDateTime != None:
>        trackDuration = previousDateTime - trackStartDateTime
>        tracks[trackCount-1] = (trackStartPos, trackPointCount,
> trackDuration.days * 24 * 60 * 60 + trackDuration.seconds, trackDistance)
>    return tracks
>
> def usage():
>    print "Usage: python readlog.py [-v] [-p password] [-d] [serial port]
> [filename]"
>    print "-v: Print debug info"
>    print "-p: Wintec password (4 digits)"
>    print "-d: Delete log from Wintec after transfer"
>
> def main():
>    global debug
>
>    BAUDRATE = 57600
>    READ_TIMEOUT = 3000 # 3 seconds
>
>    deleteLog = None
>    password = None
>    debug = None
>
>    try:
>        opts, args = getopt.getopt(sys.argv[1:], "?hvp:d")
>    except getopt.GetoptError:
>        # print help information and exit:
>        usage()
>        sys.exit(2)
>    if len(args) != 2:
>        usage()
>        sys.exit(1)
>
>    for o, a in opts:
>        if o == "-v":
>            debug = 1
>        if o in ("-h", "-?"):
>            usage()
>            sys.exit()
>        if o == "-d":
>            deleteLog = 1
>        if o == "-p":
>            password = a
>
>    tty = None
>    f = None
>    try:
>        tty = uspp.SerialPort(args[0], READ_TIMEOUT, BAUDRATE)
>
>        # I'm not sure why, but the next two lines seem to be necessary to
> enter command code.
>        time.sleep(1)
>        tty.readline()
>
>        print "Enter command mode"
>        if password:
>            tty.write("@AL,1%s\n" % password)
>        else:
>            tty.write("@AL,\n")
>        ready = 0
>        retrycount = 50
>        while 1:
>            try:
>                line = tty.readline()
>            except uspp.SerialPortException, ex:
>                if str(ex) == "Timeout" and line == '@AL\n' and password ==
> None:
>                    print "Device seem to be password protected!"
>                    print "Please provide the correct password using option
> -p"
>                    sys.exit(1)
>                else:
>                    raise ex
>                    sys.exit(1)
>            if debug:
>                print line
>            if line == "@AL,LoginOK\n":
>                ready = 1
>                break
>            if password and line == "@AL,PassworError\n":
>                print "Wrong Password"
>                sys.exit(1)
>            retrycount = retrycount - 1
>            if retrycount <= 0:
>                break
>
>        if ready == 1:
>            tty.write("@AL,07,01\n")
>            devicename = getLogString(tty)
>            tty.write("@AL,07,02\n")
>            deviceinfo = getLogString(tty)
>            tty.write("@AL,01,01\n")
>            autosleep = getLogString(tty)
>            tty.write("@AL,01,02\n")
>            overspeed = getLogString(tty)
>            tty.write("@AL,05,01\n")
>            logstart = getLogValue(tty)
>            tty.write("@AL,05,02\n")
>            logend = getLogValue(tty)
>            tty.write("@AL,05,09\n")
>            logareastart = getLogValue(tty)
>            tty.write("@AL,05,10\n")
>            logareaend = getLogValue(tty)
>            print "Logarea: %s-%s" % (logareastart, logareaend)
>            print "Log: %s-%s" % (logstart, logend)
>            logcapacy = (logareaend - logareastart) / 16
>            if logcapacy < 4096:
>                readcount = logcapacy
>            else:
>                readcount = 4096
>            readstart = int(logstart)
>            lastsection = 0
>            tracklog = ''
>            while 1:
>                print "Read buffer at %s (%s Bytes)" % (readstart, readcount)
>                tty.write("@AL,05,03,%i\n" % readstart)
>                try:
>                    buffer = tty.read(readcount)
>                except uspp.SerialPortException:
>                    print "Buffer read timeout, retrying"
>                    continue
>                line = tty.readline()
>                if debug:
>                    print line
>                checksum = line.split(",")[2]
>                if debug:
>                    print "Expected block checksum: " + checksum
>                if not isChecksumCorrect(buffer, checksum):
>                    print "Buffer read error, retrying"
>                    continue
>                else:
>                    tracklog = tracklog + buffer
>                line = tty.readline()
>                if debug:
>                    print line
>                if lastsection == 1:
>                    break
>                readstart = readstart + len(buffer)
>                if readstart >= logareaend:
>                    readstart = logareastart
>                if (readstart < logend) and (readstart + 4096 >= logend):
>                    readcount = logend - readstart
>                    lastsection = 1
>
>            # Write data as .tk1 file
>            f = open(args[1], "wb")
>            tracks = parseTracklog(tracklog)
>            writeHeader(f, devicename, deviceinfo, len(tracklog)/16,
> len(tracklog) + 0x0400, len(tracks))
>            f.write(tracklog)
>            for key in tracks.keys():
>                writeFooterEntry(f, key, tracks[key])
>            f.close()
>            if deleteLog:
>                tty.write("@AL,05,06\n")
>        else:
>            print "Can't switch into command mode!"
>    finally:
>        print "Exit command mode"
>        if tty != None:
>            tty.write("@AL,02,01\n")
>            del tty
>
> if __name__ == "__main__":
>    main()
>
>



-- 
Daniel Kersten.
Leveraging dynamic paradigms since the synergies of 1985.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Python Ireland" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.ie/group/pythonireland?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to