#!/usr/bin/python
import socket
import sys
import struct
import time
# debug
VERBOSE = True
def D(msg):
if VERBOSE: print(msg)
# "struct fbinfo" is defined in $T/system/core/adb/framebuffer_service.c
def fbinfo_unpack(data):
keys = ("version",
"bpp",
"size",
"width",
"height",
"red_offset",
"red_length",
"blue_offset",
"blue_length",
"green_offset",
"green_length",
"alpha_offset",
"alpha_length"
)
# the data is little-endian
values = struct.unpack("<IIIIIIIIIIIII",data)
D("dump struct fbinfo")
i = 0
for key in keys:
D("%14s: %-12d" % (key, values[i]))
i = i + 1
def save():
f = open('dump', 'w')
while True:
data = s.recv(4096 * 16)
if data == "":
break
f.write(data)
f.close()
def communicate(cmd=None):
if cmd != None:
buf = "%04x%s" % (len(cmd), cmd)
D("<< " + buf)
s.send(buf)
data = s.recv(4096)
D(">> [%s]" % len(data))
D(data)
if data[0:4] == 'FAIL':
return False
else:
return True
target = ''
# use getopt module in future
for arg in sys.argv:
if arg == '-q':
VERBOSE = False
if target != 'any':
# compatiable with "adb -d", redirect commands to usb
if arg == '-d':
target = 'usb'
# compatiable with "adb -e", redirect commands to emulator
elif arg == '-e':
target = 'local'
if target == '': target ='any'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
D("connecting")
try:
s.connect(("localhost", 5037))
except socket.error:
print 'Cannot connect to localhost:5037'
print socket.error
sys.exit(0)
D("connected")
if not communicate("host:transport-%s" % target):
sys.exit(1)
#communicate("host:transport-usb:shell:ls /data")
communicate("framebuffer:")
data = s.recv(52)
fbinfo_unpack(data)
t0 = float(time.time())
save()
t1 = float(time.time())
print t1 - t0