Skip to content

Instantly share code, notes, and snippets.

@sckzw
Created July 20, 2016 11:58
Show Gist options
  • Save sckzw/5d683c3de87b255ee1be05ad80dd9178 to your computer and use it in GitHub Desktop.
Save sckzw/5d683c3de87b255ee1be05ad80dd9178 to your computer and use it in GitHub Desktop.
CAN (ISO 11898) data player

CAN data

You can dump CAN data by using ELM327 or STN1100 device.

Dump commands

atl1
ath1
atd1
ats0
atma

Sample data

41183000000000000000
43681001800000000001
0788DF90FF6000009000
5513030200
05083200000000000000
...
#!/usr/bin/env python
#coding: UTF-8
import string
import sys
import time
# コマンドライン引数で指定されたファイルをオープン
argv = sys.argv
argc = len( argv )
if argc <= 1:
print 'Usage: canplayer.py filename'
sys.exit()
f = open( argv[1], 'r' )
diff_list = dict()
global_time_stamp = 0
print_line = 0
# TODO: 表示したくないヘッダのリストを設定する
filter_list = [ '091', '09F', '217' ,'43E' ]
# ターミナルをクリアする
sys.stderr.write( "\x1b[2J\x1b[H" )
# ファイルから1行ごと読み込み差分データを表示する
for line in f:
# ターミナルのカーソルをロールバックする
sys.stderr.write( "\x1b[%dA" % print_line )
# 画面表示間隔分スリープする
time.sleep( 20 / 1000.0 )
# タイムスタンプをインクリメント
global_time_stamp += 1;
# ファイルからヘッダとデータを取得する
current_header = line[:3]
current_data = line[4:].strip()
# 不正なヘッダを除外する
if not all( c in string.hexdigits for c in current_header ):
continue
# ヘッダをフィルタリング
if current_header in filter_list:
continue
# 全ヘッダの年齢をインクリメント
for header in diff_list:
diff_list[header]['age'] += 1
# 既にヘッダが存在する場合
if current_header in diff_list:
# タイムスタンプを更新
diff_list[current_header]['time_stamp'] = global_time_stamp
# カウンタをインクリメント
diff_list[current_header]['count'] += 1
# 差分データを生成する
data = diff_list[current_header]['data']
if current_data != data:
diff_data = ''
data_len = min( len( current_data ), len( data ) )
# 1文字ずつ差分データを生成する
for i in range( data_len ):
if current_data[i] == data[i]:
diff_data = diff_data + '_'
else:
diff_data = diff_data + data[i]
# 差分データリストを更新する
diff_list[current_header]['age'] = 0
diff_list[current_header]['data'] = current_data
diff_list[current_header]['diff_data'] = diff_data
else:
# ヘッダが存在しない場合は差分データリストに追加する
diff_list[current_header] = { 'time_stamp': global_time_stamp,
'count': 1,
'age': 0,
'data': current_data,
'diff_data': '' }
# 差分データリストを表示する
print 'TIME AGE COUNT ID DATA DIFF'
for header in sorted( diff_list.keys() ):
# 年齢が古いデータは除外する
age = diff_list[header]['age']
if age >= 256:
continue
# 差分データを表示する
time_stamp = diff_list[header]['time_stamp']
count = diff_list[header]['count']
data = diff_list[header]['data']
diff_data = diff_list[header]['diff_data']
# sys.stderr.write( "\x1b[38;5;%dm" % ( age & 0xff >> 4 | 0xf0 ) )
print '%04d %03d %05d %3s %16s %16s' \
%( time_stamp, age, count, header, data, diff_data )
# sys.stderr.write( "\x1b[0m" )
# 表示した行数を計算する
print_line = len( diff_list ) + 2
# ターミナルのカーソル以降をクリアする
sys.stderr.write( "\x1b[J" )
f.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment