# --------------------------------------------------------------------------------
# @Title: A template python file to measure the TASKEVENTS(ex. GET,PER )
# @Description: 
#	It requires the taskevents csv file from the Trace.EXPORT.TASKEVENTS
#	(ex. temp.csv)
#
# @Author: JIM
# @Copyright: (C) 1989-2018 Lauterbach GmbH, licensed for use with TRACE32(R) only
# --------------------------------------------------------------------------------
# $Id: $

from prettytable import PrettyTable
import sys
import csv

def find_element_in_list(list_element, element):
    try:
        index_element = list_element.index(element)
        return index_element
    except ValueError:
        return None

time  = [] # time list
task  = [] # task list
event = [] #event list

# input parameter passing

args_num=(len(sys.argv)-1)   # args number

if args_num == 3:
    marker_a=sys.argv[2]
    marker_b=sys.argv[3]

elif args_num == 2:
    marker_a=sys.argv[2]

else:
    print ("usages)")
    print ("time.py temp.csv start stop    ; the run-time from start to stop events")
    print ("time.py temp.csv schedule      ; the period for scadule events")
    sys.exit(0)

filename = sys.argv[1]
print('Filename: %s' % filename)
if not '.csv' in filename:
    print ('ERROR: csv file is missing')
    sys.exit(0)

# csv input file parsing
f = open ( filename, 'r', encoding='utf-8')
rdr = csv.reader(f, delimiter=';')
record=list(rdr) #list

for line in record:
    str1 = ''.join(line[0])   #convert list item to the string
    if str1.find("#") != -1:
        pass
    else:
        time.append(line[0].strip())
        task.append(line[1].strip())
        event.append(line[2].strip())
f.close()

# generate task_name Table 
taskNameTable = []
for i in task:
    if i not in taskNameTable:
        taskNameTable.append(i)

# generate event_name Table 
eventNameTable = []
for i in event:
    if i not in eventNameTable:
        eventNameTable.append(i)

if 'marker_a' in locals():
    if find_element_in_list(eventNameTable, marker_a) == None:
        print("ERROR: the event name does not exist: %s" % marker_a )
        print("events list:")
        print(eventNameTable)
        sys.exit(0)
    else:
        print ("Event marker A: %s" % (marker_a))

if 'marker_b' in locals():
    if find_element_in_list(eventNameTable, marker_b) == None:
        print("ERROR: the event name does not exist: %s" % marker_b )
        print("events list:")
        print(eventNameTable)
        sys.exit(0)
    else:
        print ("Event marker B: %s" % (marker_b))

print("\n")

resultTbl = PrettyTable(['time(ns)', 'task_name', 'events', 'e-time(ns)'])

for j,tb in enumerate(taskNameTable):
    print ("!!!!! task: %s !!!!!" % taskNameTable[j])
    s_task = []
    for i, item in enumerate(task):
        if item==taskNameTable[j]:
            s_task.append([time[i], task[i], event[i]])
 
#improve events context 
#for example, (switch&start) -> (schedule&start)
    for i,item in enumerate(s_task):
        if s_task[i][2].find('switch') != -1:
            if(i+1)<len(s_task):
                if s_task[i+1][2].find('start') != -1:
                    s_task[i][2]='schedule'
   
#calculate each event execution time (ti.back)
    basetime=int(s_task[0][0])

    for i,item in enumerate(s_task):

        if (i+1)==len(s_task): # if the last record
            nexttime=int(s_task[i][0])
        else:
            nexttime=int(s_task[i+1][0])
        
        exectime = nexttime-basetime
        s_task[i].append(exectime)
        resultTbl.add_row([s_task[i][0], s_task[i][1], s_task[i][2], exectime])
        basetime = nexttime

# calculate run-time and period
    measurementTimeTbl=[]
    pre_start_time=0

    if 'marker_b' in locals():   # marker A to B time
        for i,item in enumerate(s_task):
            str1 = ''.join(s_task[i][2]) # convert list item to the string
            if str1.find(marker_a) != -1:  # if same
                pre_start_time=int(s_task[i][0])
            if str1.find(marker_b) != -1:  # if same
                if pre_start_time!=0:
                    measurementTimeTbl.append(int(s_task[i][0])-pre_start_time)
                    pre_start_time=0

    else:  # period 
        for i,item in enumerate(s_task):
            str1 = ''.join(s_task[i][2]) # convert list item to the string
            if str1.find(marker_a) != -1:  # if same
                if pre_start_time!=0:
                    measurementTimeTbl.append(int(s_task[i][0])-pre_start_time)
                pre_start_time=int(s_task[i][0])

    
    print(resultTbl)
    table_txt = resultTbl.get_string()
    resultTbl.clear_rows() # empty all the contents in the table

    if measurementTimeTbl:  # not empty list
        if args_num>=3:
            print("running time (%s -> %s) list:" % (marker_a, marker_b) )
        else:
            print("period time (%s) list:" % (marker_a))

#        print(measurementTimeTbl)
        print("max: %d(ns)" % (max(measurementTimeTbl)))
        print("avr: %d(ns)" % (sum(measurementTimeTbl)/len(measurementTimeTbl)))

    print ("\n")

sys.exit(0)

