diff --git a/cm700reader.py b/cm700reader.py index 1ed6b8f..8b68d18 100644 --- a/cm700reader.py +++ b/cm700reader.py @@ -12,6 +12,7 @@ class CM700D: + # 初期化 def initialize(self): if not self.open_port(): return False @@ -27,6 +28,7 @@ return True + # 分光分布csv読み込み def read_spectrum_csv(self, filename): # csv読み込み with open(filename, newline="") as f: @@ -41,50 +43,58 @@ data[:, i] = resampler(self.wl) return data - # デバイス名でCOMポート番号を検索 - @staticmethod - def find_port(device_str): - ports = list(serial.tools.list_ports.comports()) - found_list = list(filter(lambda x: device_str in x.description, ports)) - if len(found_list) == 0: - return "" - return found_list[0].device - # COMポートを開く def open_port(self): - port = self.find_port(config.DEVICE_NAME) - if port == "": + ports = list(serial.tools.list_ports.comports()) + if len(ports) == 0: print(f"シリアルデバイス {config.DEVICE_NAME} が見つかりません") return False - self.ser = serial.Serial(port, config.BAUD_RATE, timeout=config.TIMEOUT) - if not self.ser.is_open: - print(f"COMポート{port}を開くことができませんでした") - return False - print(f"CM-700dと接続しました ({port})") - return True + + found = False + for port in ports: + try: + print(f"Checking {port.device} ... ", end="") + self.ser = serial.Serial(port.device, config.BAUD_RATE, timeout=config.TIMEOUT, writeTimeout=config.TIMEOUT) + if self.ser.is_open: + recv = cm700d.send_command("IDR") + print(recv) + if recv[0] == "OK00": + print(f"CM-700dと接続しました ({port.device})") + found = True + break + self.ser.close() + except Exception as e: + print(str(e)) + return found # コマンド送受信 def send_command(self, command, validate=True): - self.ser.write((command + "\r\n").encode()) - data = self.ser.read(1024) - recv_items = [x.strip() for x in data.decode().split(",")] - if recv_items[0] != config.CODE_OK and validate: - print(f"コマンド{command}に失敗しました {recv_items[0]}") - return recv_items + try: + self.ser.write((command + "\r\n").encode()) + data = self.ser.read(1024) + recv_items = [x.strip() for x in data.decode().split(",")] + if recv_items[0] != config.CODE_OK and validate: + print(f"コマンド{command}に失敗しました {recv_items[0]}") + return recv_items + except Exception as e: + return ["error", str(e)] # COMポートを閉じる def close_port(self): self.ser.close() + # 保存されている計測サンプル数を取得 def get_num_samples(self): recv = self.send_command("STR") self.num_samples = int(recv[5]) print(f"本体保存サンプル数は{self.num_samples}個です") + # 保存されている計測サンプルを全て取得 def read_all_spectrum(self): self.get_num_samples() self.read_spectrum(1, self.num_samples) + # 一部の計測サンプルを取得 def read_partial_spectrum(self): self.get_num_samples() start_no = int(input("開始サンプル番号>")) @@ -93,6 +103,7 @@ end_no = self.num_samples self.read_spectrum(start_no, end_no) + # 計測サンプルを読み込む def read_spectrum(self, start_no, end_no): # 基本データ受信 recv = self.send_command("IDR") @@ -200,6 +211,7 @@ count = len(data) + 1 data.append([count] + XYZ.tolist() + lab + spectrum.tolist()) + # XYZからLabへ変換 def xyz_to_lab(self, xyz): x, y, z = xyz xw, yw, zw = self.XYZw @@ -212,6 +224,7 @@ float(200.0 * (fy - fz)), ] + # f関数 def f(self, t): if t > (6.0 / 29.0) ** 3.0: return t ** (1.0 / 3.0) @@ -224,6 +237,7 @@ cm700d = CM700D() if not cm700d.initialize(): + print("デバイスに接続できないため終了します") sys.exit() while True: @@ -232,6 +246,7 @@ print("2. 一部の本体データを取得") print("3. 手動計測") print("4. インターバル計測") + print("0. 終了") n = input("選択>") if n == "1": diff --git a/config.py b/config.py index d85787b..31c9268 100644 --- a/config.py +++ b/config.py @@ -1,4 +1,3 @@ -DEVICE_NAME = "CM-700" BAUD_RATE = 115200 TIMEOUT = 1 CODE_OK = "OK00"