#!/usr/bin/python # -*- coding: latin-1 -*- # -------------------------------------------------------------------------------- # @Title: TRACE32 Remote API that use T32_Cmd() and T32_GetMessage() # @Description: # TRACE32 Remote API sample program illustrating the use of T32_Cmd() # and T32_GetMessage() This demo send a command to TRACE32 PowerView # and request any AREA message. # # Syntax: t32apicmd.py [--node ] [--port ] # # Example: t32apicmd.py --node localhost --port 20000 PRINT VERSION.BUILD() # # TRACE32's configuration file "config.t32" has to contain these lines: # RCL=NETASSIST # PORT=20000 # The port value may be changed but has to match with the port number # used with this python script. # # @Keywords: python # @Author: WBA # @Copyright: (C) 1989-2015 Lauterbach GmbH, licensed for use with TRACE32(R) only # -------------------------------------------------------------------------------- # $Id: t32apicmd.py 116756 2020-01-27 07:42:44Z jvogl $ # import sys, getopt, ctypes, os, platform from ctypes import * # auto-detect the correct library if (platform.system()=='Windows') or (platform.system()[0:6]=='CYGWIN') : if ctypes.sizeof(ctypes.c_voidp)==4: # WINDOWS 32bit t32api = ctypes.CDLL("./t32api.dll") # alternative using windows DLL search order: # t32api = ctypes.cdll.t32api else: # WINDOWS 64bit t32api = ctypes.CDLL("./t32api64.dll") # alternative using windows DLL search order: # t32api = ctypes.cdll.t32api64 elif platform.system()=='Darwin' : # Mac OS X t32api = ctypes.CDLL("./t32api.dylib") else : if ctypes.sizeof(ctypes.c_voidp)==4: # Linux 32bit t32api = ctypes.CDLL("./t32api.so") else: # Linux 64bit t32api = ctypes.CDLL("./t32api64.so") ### Setup connection T32_OK = 0 WIN_MESSAGEMODENONE = 0x00 WIN_MESSAGEMODEINFO = 0x01 WIN_MESSAGEMODEERROR = 0x02 WIN_MESSAGEMODESTATE = 0x04 WIN_MESSAGEMODEWARNINFO = 0x08 WIN_MESSAGEMODEERRORINFO = 0x10 WIN_MESSAGEMODETEMP = 0x20 WIN_MESSAGEMODETEMPINFO = 0x40 node = '' port = '' cmd = '' PROGNAME=os.path.basename(__file__) def main(argv): try: opts, args = getopt.getopt(argv,"hn:p:",["node=","port="]) except getopt.GetoptError: print('%s -n -p '%PROGNAME) sys.exit(2) node = 'localhost' port = '20000' cmd = '' for opt, arg in opts: if opt == '-h': print('%s --node --port '%PROGNAME) sys.exit() elif opt in ("-n", "--node","-N","--NODE"): node = arg elif opt in ("-p", "--port","-P","--PORT"): port = arg option=0 for i in range (1,len(sys.argv)): if option == 0: if sys.argv[i]=='-n' or sys.argv[i]=='-p' or sys.argv[i]=='-N' or sys.argv[i]=='-P' or sys.argv[i]=='--node' or sys.argv[i]=='--NODE' or sys.argv[i]=='--port' or sys.argv[i]=='--PORT' : option=1 else : cmd= cmd + ' ' + sys.argv[i] else : option=0 ### Debugger operation t32api.T32_Config(b"NODE=",node.encode('latin-1')) if t32api.T32_Config(b"PORT=",port.encode('latin-1'))!=T32_OK: print('Invalid port number',port,'specified.') sys.exit() t32api.T32_Config(b"PACKLEN=",b"1024") print('Connecting...') for i in range (1, 3): if t32api.T32_Init()==T32_OK: if t32api.T32_Attach(1)==T32_OK: print('Successfully established a remote connection with TRACE32 PowerView.') break else : if i==1: print('Failed once to established a remote connection with TRACE32 PowerView.') t32api.T32_Exit() elif i==2 : print('Failed twice to established a remote connection with TRACE32 PowerView.') print(' Terminating ...') sys.exit() else : if i==1: print('Failed once to initialize a remote connection with TRACE32 PowerView.') t32api.T32_Exit() elif i==2 : print('Failed twice to initialize a remote connection with TRACE32 PowerView.') print(' Terminating ...') sys.exit() # send input command to TRACE32 PowerView for execution and return any message if len(cmd)>2040: print('Failed to send remote command, command exceeds 2040 characters.') sys.exit() msgstring=create_string_buffer(50) msgtype=c_ulonglong(0) if t32api.T32_Cmd(b'PRINT')==T32_OK: if t32api.T32_Cmd(cmd.encode('latin-1'))==T32_OK: if t32api.T32_GetMessage(byref(msgstring), byref(msgtype))==T32_OK: if msgtype.value < (WIN_MESSAGEMODETEMPINFO << 1): if msgtype.value != WIN_MESSAGEMODENONE and not((len(msgstring.value) == 0) and (msgtype.value & (WIN_MESSAGEMODETEMPINFO | WIN_MESSAGEMODETEMP))): if msgtype.value & WIN_MESSAGEMODEINFO: print('info message:', msgstring.value) if msgtype.value & WIN_MESSAGEMODESTATE: print('status message:', msgstring.value) if msgtype.value & WIN_MESSAGEMODEWARNINFO: print('warning message:', msgstring.value) if (msgtype.value & WIN_MESSAGEMODEERRORINFO) or (msgtype.value & WIN_MESSAGEMODEERROR): print('error message:', msgstring.value) if (msgtype.value & WIN_MESSAGEMODETEMPINFO) or (msgtype.value & WIN_MESSAGEMODETEMP): print('miscellaneous message: %s' %msgstring.value) else: print('Successfully executed user command %s' %cmd) else: print('Failed to determine the type of the return message.') else: print('Failed to query return message.') else: print('Failed to execute erroneous user command %s' %cmd) else: print('Failed to execute \'T32_Cmd(""PRINT"")') print ("") if t32api.T32_Exit()!= T32_OK: print(' Failed to close the remote connection port on the dos shell application\'s side.') sys.exit() if __name__ == "__main__": main(sys.argv[1:])