-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsd_data_recorder.py
More file actions
163 lines (129 loc) · 5.52 KB
/
Copy pathsd_data_recorder.py
File metadata and controls
163 lines (129 loc) · 5.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
"""
IMS-SD SDデータ記録モジュール
外部トリガなしでSDカードにデータを保存するサンプルコード
"""
import datetime
import sys
import io
import time
from ims_device import ImsDevice # type: ignore
from data_collector import setup_measurement_conditions, setup_sd_additional_conditions # type: ignore
class SdDataRecorder:
"""SDデータ記録クラス"""
def __init__(self, device: ImsDevice):
self.device = device
def record_data(self, duration: float = 10.0) -> bool:
"""
SDカードへのデータ記録実行
Args:
duration: 記録時間(秒)
Returns:
bool: 記録成功時True
"""
# 測定実行
if not self.device.is_connected:
print("デバイスが接続されていません")
return False
print(f"SD記録開始: {duration}秒間")
# EXTコマンドで外部トリガ待ち受けモードに移行
if not self.device.set_ext_mode():
print("外部トリガモード移行失敗")
return False
# TRIGコマンドでトリガ出力(測定開始)
if self.device.send_trigger():
print("SD記録開始")
else:
print("トリガ出力失敗")
return False
# SD記録中は指定時間待機
print(f"SD記録中... ({duration}秒間)")
time.sleep(duration)
# 記録時間経過後、ステータスチェックを0.5秒間隔で行う
print("記録時間経過、自動停止確認中...")
while True:
# ステータス確認
status = self.device.get_status()
if status:
print(f"ステータス: {status.value}")
# IDLEに戻った場合(記録が自動停止した場合)
if status.name == "IDLE":
print("SD記録が自動停止しました")
break
else:
print("ステータス取得失敗")
# まだMEASUREの場合は0.5秒待機してから再チェック
time.sleep(0.5)
print(f"✓ SDカードへのデータ保存完了")
return True
def main():
"""メイン処理"""
# Windows環境でのエンコーディング設定とバッファリング無効化
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', line_buffering=True)
print("=" * 50)
print("IMS-SD SDデータ記録プログラム")
print("=" * 50)
# IMS-SDデバイス初期化
device = ImsDevice()
try:
# 1. ポート一覧表示
print("\n1. 利用可能なCOMポート:")
ports = device.serial.list_available_ports()
for i, port in enumerate(ports, 1):
print(f" {i}. {port['device']}: {port['description']}")
if not ports:
print("利用可能なポートがありません")
return
# 2. COM3に接続
print("\n2. デバイス接続中...")
if not device.connect("COM3"):
print("デバイス接続失敗")
return
print("✓ デバイス接続成功")
print(f" シリアル番号: {device.serial_number}")
print(f" モデル: {device.model}")
print(f" バージョン: {device.version}")
# 3. 測定条件設定(1000Hz, SD保存, 30G)
# SD記録時はまとめ数(matome_pc)の設定は実際には使用されない
print("\n3. 測定条件設定(1000Hz, SD保存)")
if not setup_measurement_conditions(device, frequency=1000, matome_pc=100, save_to_flash=True, acc_range=30):
print("測定条件設定失敗")
return
# 4. SD記録用追加設定
if not setup_sd_additional_conditions(
device,
header="SD1KH", # ファイルヘッダ(半角5文字以内)
step_number=1, # ステップナンバー(0-999)
save_time=10, # 保存時間(秒)
stop_on_low_battery=True, # 電池残量で測定停止するか
stop_soc_percent=2, # 測定停止する電池残量(%)
save_interval_hours=1 # SD保存時間間隔(時間)
# 作成されるファイル名は、SD1KH001.BINとなります。
# SDカード内に同名ファイルが存在する場合は、外部トリガモード移行に失敗しますので
# あらかじめ、SDカード内ファイルのファイル名を把握しておくことが必要です
):
print("SD記録用追加設定失敗")
return
# 5. SDデータ記録実行
print("\n=== SDデータ記録実行 ===")
recorder = SdDataRecorder(device)
duration = 10.0 # 10秒間記録
# データ記録実行
if recorder.record_data(duration=duration):
print("✓ SDデータ記録完了")
else:
print("✗ SDデータ記録失敗")
except KeyboardInterrupt:
print("\n中断されました")
except Exception as e:
print(f"\nエラー: {e}")
finally:
# 6. デバイス切断
print("\n6. デバイス切断中...")
if device.disconnect():
print("✓ デバイス切断完了")
else:
print("✗ デバイス切断失敗")
print("\nプログラム終了")
# テスト用コード
if __name__ == "__main__":
main()