#!/usr/bin/python3.8 # -*- coding: utf-8 -*- import os import PySimpleGUI as sg import subprocess,time from subprocess import * import threading def GPS_handle(str1): str2 = str1[0].split('\"') str2[1] = "GPS" str3 = '\"'.join(['%s' % id for id in str2]) str1[0] = str3 return str1 def run_filter(commandLine): with open(file[i],'w') as fp: subprocess.run(commandLine, stdout=fp) sg.theme('LightGreen3') # Add some color to the window # Very basic window. Return values using auto numbered keys layout = [ [sg.Text('Please enter your data:canid 只允許配置8個通道\n' 'canid輸入格式(都好隔開):0x101, 0x222, 0x444, 0x331, 0x101, 0x222, 0x444, 0x331\n' 'CAN_len輸入格式(都好隔開): 8,8,8,8,8,8,8,8 \n' 'RMU模塊號輸入格式 320002 \n' 'RMU模塊通道輸入格式: ,2,3,4,5,6,7,8 \n' '注意逗號分隔符的數目不允許超過11個', size=(70,6))], [sg.Text('CAN_ids', size=(20, 1)), sg.InputText(key='-CAN_ids-')], [sg.Text('CAN_len', size=(20, 1)), sg.InputText(key='-CAN_len-')], [sg.Text('RMU_NUM', size=(20, 1)), sg.InputText(key='-RMU_NUM-')], [sg.Text('Channel_NUM', size=(20, 1)), sg.InputText(key='-Channel_NUM-')], [sg.Submit(), sg.Cancel()] ] window = sg.Window('過濾輸入的參數', layout) event, values = window.read() window.close() start_time = time.time() stra = '' strn = ['', '', '', '', '', '', '', '', '','','',''] file = ['', '', '', '', '', '', '', '', '','','',''] can = '' can_len = '' can_id = [] Channel_NUM = '' threads = [] can = values['-CAN_ids-'] stra = values['-RMU_NUM-'] can_len = values['-CAN_len-'] Channel_NUM = values['-Channel_NUM-'] sg.popup('You entered', values['-CAN_ids-'],values['-RMU_NUM-'],values['-CAN_len-'],values['-Channel_NUM-']) if can == '': can = '0x101, 0x222, 0x444, 0x331, 0x101, 0x222, 0x444, 0x331,0x101,0x222' if stra == '': stra = '320002' if can_len == '': can_len='8,8,8,8,8,8,8,8,8,8,8,8' if Channel_NUM == '': Channel_NUM = '1,2,3,4,5,6,7,8,9,10,11,1' sg.popup('設置', can ,can_len,stra,Channel_NUM ) can = can.split(',') can= can + ['0']*(12-len(can)) can_id= can + ['0']*(12-len(can)) can_id= [int(can_id[i],16) for i in range(len(can_id))] tuple(can_id ) file = [str(hex(can_id[i]))[2:5] for i in range(len(file))] file = [file[i] + '_' + str(i + 1) + '.csv' for i in range(len(file))] can_len = can_len.split(',') can_len = can_len + ['8']*(12-len(can_len)) Channel_NUM = Channel_NUM.split(',') Channel_NUM = Channel_NUM + ['1']*(12-len(Channel_NUM)) strn[0] = 'findstr /irc:"8,1,.*,320002,101,1" Combine_All.csv ' strn[1] = 'findstr /irc:"8,2,.*,320002,222,1," Combine_All.csv ' strn[2] = 'findstr /irc:"8,3,.*,320002,444,1," Combine_All.csv ' strn[3] = 'findstr /irc:"8,4,.*,320002,331,1" Combine_All.csv ' strn[4] = 'findstr /irc:"8,5,.*,320002,101,1," Combine_All.csv ' strn[5] = 'findstr /irc:"8,6,.*,320002,222,1" Combine_All.csv ' strn[6] = 'findstr /irc:"8,7,.*,320002,444,1," Combine_All.csv ' strn[7] = 'findstr /irc:"8,8,.*,320002,331,1" Combine_All.csv ' strn[8] = 'findstr /irc:"8,8,.*,320002,101,1" Combine_All.csv ' strn[9] = 'findstr /irc:"8,8,.*,320002,222,1" Combine_All.csv ' strn[10] = 'findstr /irc:"8,8,.*,320002,11,1" Combine_All.csv ' strn[11] = 'findstr /irc:"GPS,1,.*,320002," Combine_All.csv ' strn = [strn[i].split(',') for i in range(len(strn))] for i in range(len(strn)): str1 = strn[i][0].split('\"') str1[1] = can_len[i] str2 = "\"".join(['%s' % id for id in str1]) strn[i][0] = str2 for i in range(len(strn)-1): strn[i][4] = can_id[i] for i in range(len(strn)): strn[i][1] = Channel_NUM[i] for i in range(len(strn)): strn[i][3] = stra strn[11] = GPS_handle(strn[11]) strn = [",".join(['%s' % id for id in strn[i]]) for i in range(len(strn))] file[11] = 'GPS.csv' print(strn) # for i in range(len(strn)): # os.system(strn[i]) for i in range(len(strn)): t = threading.Thread(target=run_filter, args=(strn[i],)) t.start() threads.append(t) for t in threads: t.join() #讀取文件 def readfile(inputfile): with open(inputfile) as f: lines = f.readlines() return lines #每行最后兩個字節取出並轉換成10進制 def datachange_can(string_data): split_line = string_data.strip().split(",") while '' in split_line: split_line.remove('') data1 = split_line[len(split_line)-1] temp = data1[(len(data1)-4):len(data1)] temp1 = int(temp,16) split_line.append(temp) split_line.append(temp1) return split_line #丟幀計數 def change_save(data_lines): sum1 = 0; s2 = ''; for i in range(len(data_lines)): split_line = datachange_can(data_lines[i]) if i<1: split_line.append('\n') s2 = ",".join(['%s' %id for id in split_line]) data_lines[i] = s2 else: split_line1 = datachange_can(data_lines[i-1]) temp = int(split_line[len(split_line)-1])- int(split_line1[11]) split_line.append(temp) split_line.append('\n') if (temp != 1) and (temp != -65535) : temp = temp - 1 sum1 = sum1+temp s2 = ",".join(['%s' %id for id in split_line]) data_lines[i] = s2 return data_lines,sum1 def long_function(): print('已讀取完畢,channel文件的總行數為: %d' %len(data_lines[0])) print('已讀取完畢,channe2文件的總行數為:%d' %len(data_lines[1])) print('已讀取完畢,channe3文件的總行數為:%d' %len(data_lines[2])) print('已讀取完畢,channe4文件的總行數為:%d' %len(data_lines[3])) print('已讀取完畢,channe5文件的總行數為:%d' %len(data_lines[4])) print('已讀取完畢,channe6文件的總行數為:%d' %len(data_lines[5])) print('已讀取完畢,channe7文件的總行數為:%d' %len(data_lines[6])) print('已讀取完畢,channe8文件的總行數為:%d' %len(data_lines[7])) print('已讀取完畢,channe9文件的總行數為:%d' %len(data_lines[8])) print('已讀取完畢,channe10文件的總行數為:%d' %len(data_lines[9])) print('已讀取完畢,channe11文件的總行數為:%d' %len(data_lines[10])) print('已讀取完畢,ALL channel文件的總行數為:%d' %All_lines) print('\n') print("channel 1 lossframe %d" %sum1[0]) print("channel 2 lossframe %d" %sum1[1]) print("channel 3 lossframe %d" %sum1[2]) print("channel 4 lossframe %d" %sum1[3]) print("channel 5 lossframe %d" %sum1[4]) print("channel 6 lossframe %d" %sum1[5]) print("channel 7 lossframe %d" %sum1[6]) print("channel 8 lossframe %d" %sum1[7]) print("channel 9 lossframe %d" %sum1[8]) print("channel 10 lossframe %d" %sum1[9]) print("channel 11 lossframe %d" %sum1[10]) print("ALL 10 channel total lossframe %d" %sum_all) print('\n') if(sum_all/(All_lines+sum_all) == 0): print("No response: wrong number fliter") else: print("Frame loss rate is %.6f" %(sum_all/(All_lines+sum_all))) print("數據分割轉換成功") print("----程序運行時間%s---" %(time.time()- start_time)) return 0 if __name__ == "__main__": data_lines = [1,1,1,1,1,1,1,1,1,1,1,1] a = [1,1,1,1,1,1,1,1,1,1,1,1] sum1 = [1,1,1,1,1,1,1,1,1,1,1,1] All_lines = 0 sum_all = 0 for i in range(11): data_lines[i] = readfile(file[i]) c = 'csv' #讀取csv文件 for i in range(1,12): a[i-1] = str(i) + '.'+'csv' with open(a[i-1],'w') as fp: data_lines[i-1],sum1[i-1]=change_save(data_lines[i-1]) s1 = ''.join(data_lines[i-1]) fp.write(s1) fp.close() for i in range(11): All_lines = len(data_lines[i]) + All_lines for i in range(11): sum_all = sum1[i] + sum_all sg.theme('Dark Blue 3') # please make your windows colorful layout = [[sg.Text('All lossframe is :'), sg.Text(size=(50,1), key='-OUTPUT-')], [sg.Output(size=(80, 20))], [sg.Button('Submit'), sg.Button('Exit')]] window = sg.Window('Get filename and Show outputfile lines', layout) while True: event, values = window.read() values = sum_all print(event, values) if event == sg.WIN_CLOSED or event == 'Exit': break window['-OUTPUT-'].update(values) long_function() window.close()
服務器后台的特定數據的處理:gps,can報文