aboutsummaryrefslogblamecommitdiff
path: root/Tools/fetch_log.py
blob: edcc6557c2d7ca44527e3b2ce6c0041db7d21cee (plain) (tree)




































































































































                                                                            
#!/usr/bin/env python
############################################################################
#
#   Copyright (C) 2012, 2013 PX4 Development Team. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 3. Neither the name PX4 nor the names of its contributors may be
#    used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################

#
# Log fetcher
#
# Print list of logs:
#     python fetch_log.py
#
# Fetch log:
#     python fetch_log.py sess001/log001.bin
#

import serial, time, sys, os

def wait_for_string(ser, s, timeout=1.0, debug=False):
    t0 = time.time()
    buf = []
    res = []
    n = 0
    while (True):
        c = ser.read()
        if debug:
            sys.stderr.write(c)
        buf.append(c)
        if len(buf) > len(s):
            res.append(buf.pop(0))
            n += 1
            if n % 10000 == 0:
                sys.stderr.write(str(n) + "\n")
        if "".join(buf) == s:
            break
        if timeout > 0.0 and time.time() - t0 > timeout:
            raise Exception("Timeout while waiting for: " + s)
    return "".join(res)

def exec_cmd(ser, cmd, timeout):
    ser.write(cmd + "\n")
    ser.flush()
    wait_for_string(ser, cmd + "\r\n", timeout)
    return wait_for_string(ser, "nsh> \x1b[K", timeout)

def ls_dir(ser, dir, timeout=1.0):
    res = []
    for line in exec_cmd(ser, "ls -l " + dir, timeout).splitlines()[1:]:
        res.append((line[20:], int(line[11:19].strip()), line[1] == "d"))
    return res

def list_logs(ser):
    logs_dir = "/fs/microsd/log"
    res = []
    for d in ls_dir(ser, logs_dir):
        if d[2]:
            sess_dir = d[0][:-1]
            for f in ls_dir(ser, logs_dir + "/" + sess_dir):
                log_file = f[0]
                log_size = f[1]
                res.append(sess_dir + "/" + log_file + "\t" + str(log_size))
    return "\n".join(res)

def fetch_log(ser, fn, timeout):
    cmd = "dumpfile " + fn
    ser.write(cmd + "\n")
    ser.flush()
    wait_for_string(ser, cmd + "\r\n", timeout, True)
    res = wait_for_string(ser, "\n", timeout, True)
    data = []
    if res.startswith("OK"):
        size = int(res.split()[1])
        n = 0
        print "Reading data:"
        while (n < size):
            buf = ser.read(min(size - n, 8192))
            data.append(buf)
            n += len(buf)
            sys.stdout.write(".")
            sys.stdout.flush()
        print
    else:
        raise Exception("Error reading log")
    wait_for_string(ser, "nsh> \x1b[K", timeout)
    return "".join(data)

def main():
    dev = "/dev/tty.usbmodem1"
    ser = serial.Serial(dev, "115200", timeout=0.2)
    if len(sys.argv) < 2:
        print list_logs(ser)
    else:
        log_file = sys.argv[1]
        data = fetch_log(ser, "/fs/microsd/log/" + log_file, 1.0)
        try:
            os.mkdir(log_file.split("/")[0])
        except:
            pass
        fout = open(log_file, "wb")
        fout.write(data)
        fout.close()
    ser.close()

if __name__ == "__main__":
    main()