Files
2025-10-14 09:52:32 +09:00

163 lines
5.8 KiB
Python

#!/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 <ip-address>] [--port <num>] <cmd>
#
# 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 <node> -p <port> <cmd>'%PROGNAME)
sys.exit(2)
node = 'localhost'
port = '20000'
cmd = ''
for opt, arg in opts:
if opt == '-h':
print('%s --node <node> --port <port> <cmd>'%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:])