def in_update(self, arg_int=True): """ GPIO入力 """ # GPIO読み込み val = None if arg_int: # 割込発生時点のGPIO val = self.bus.read_byte_data(self.__ICADDR, REG_INTCAPB) self.get_logger().info("I2C INTCAP: %s" % (bin(val))) for i in range(0, 8): # ON状態のチェック if (val >> i) & 0x01 == 1: level = 1 else: level = 0 # X番号に置き換え gpio_pin = self.__BEGIN_IN_DEFAULT + i # ログの表示 self.get_logger().info("Port (IN): %s, Val: %s" % (gpio_pin, level)) # 送信するメッセージの作成 msg = GpioMsg() # BCMポート番号をX端子番号に読み替え msg.port = gpio_pin msg.value = level # ボタンが押された情報を送信 self.pub.publish(msg) else: # 現時点のGPIO val = self.bus.read_byte_data(self.__ICADDR, REG_GPIOB) self.get_logger().info("I2C GPIO : %s" % (bin(val)))
def callback(self, gpio_pin, level, tick): """ スイッチ押下のコールバック関数 Parameters ---------- gpio_pin : int ピン番号 """ #チャタリング無視時間 diff = self.__chattering_cancel + 1 # 前回の入力からの時間差を計算 if self.__last[gpio_pin] is not None: diff = pigpio.tickDiff(self.__last[gpio_pin], tick) # チャタリング除去・前回入力から指定時間以上の間隔をあけて処理 if diff > self.__chattering_cancel: # ログの表示 self.get_logger().info("Port (IN): %s, Val: %s, Tick: %s" % (gpio_pin, level, tick)) # 送信するメッセージの作成 msg = GpioMsg() # BCMポート番号をX端子番号に読み替え msg.port = self.__GpioPin.index(gpio_pin) msg.value = level # ボタンが押された情報を送信 self.pub.publish(msg) self.__last[gpio_pin] = tick
def in_update_thread(self, arg_val=1): """ GPIO入力の定期読み込み Parameters ---------- arg_val 検出する値(L:0/H:1) """ # 現在のH/L状態の一時格納 val_now = [] # 送信するメッセージの作成 msg = GpioMsg() # 指定の入力ピンを一通りスキャン for i in self.__GpioPin: # BCMポート番号をX端子番号に読み替え msg.port = self.__GpioPin.index(i) #現在値を読み込み if wiringpi.digitalRead(i) == 0: msg.value = 0 #前回と値が違うときだけ処理 if self.__GpioPin_before[msg.port] != msg.value: # ボタンのON/OFF情報を送信 self.pub.publish(msg) self.__GpioPin_before[msg.port] = msg.value else: msg.value = 1 #前回と値が違うときだけ処理 if self.__GpioPin_before[msg.port] != msg.value: # ボタンのON/OFF情報を送信 self.pub.publish(msg) self.__GpioPin_before[msg.port] = msg.value # 現在のH/L状態に追記 val_now.append(msg.value) # ログの表示 self.get_logger().info("Port (IN): %s -> %s" % (self.__GpioPin, val_now)) val_now.clear()
def lamp_con_i2c(self, port, value): """ ランプの点灯制御・I2C ---------- port : int ポート番号 value : int 点灯パターン """ # 送信するメッセージの作成 msg = GpioMsg() msg.port = port msg.value = value # ボタンが押された情報を送信 self.pub_i2c.publish(msg)
def callback_i2c(self, message): """ コールバック関数・I2C・メッセージ受け取り Parameters ---------- message : gpio_mes メッセージ """ # ログの表示 self.get_logger().info('Incoming request Port (I2C): %d Value: %d' % (message.port, message.value)) # 送信するメッセージの作成 msg = GpioMsg() # X端子番号をY端子番号に読み替え(100だけオフセット) msg.port = message.port + 100 msg.value = message.value # ボタンが押された情報を送信 self.pub_i2c.publish(msg)
def callback_gpio(self, message): """ コールバック関数・GPIO・メッセージ受け取り Parameters ---------- message : gpio_mes メッセージ """ # ログの表示 self.get_logger().info('Incoming request Port (GPIO): %d Value: %d' % (message.port, message.value)) # 送信するメッセージの作成 msg = GpioMsg() # BCMポート番号をX端子番号に読み替え msg.port = message.port msg.value = message.value # ボタンが押された情報を送信 self.pub_gpio.publish(msg)
def in_update(self, arg_int=True): """ GPIO入力 """ # GPIO読み込み val = None if arg_int: # 割込発生時点のGPIO # INTCAPだと同時押しが取り込みできない。離した後に前のON状態が残る #val = self.bus.read_byte_data(self.__ICADDR, REG_INTCAPB) val = self.bus.read_byte_data(self.__ICADDR, REG_GPIOB) # 現在のH/L状態の一時格納 port_now = [] val_now = [] for i in range(0, 8): # ON状態のチェック if (val >> i) & 0x01 == 1: level = 1 else: level = 0 # X番号に置き換え gpio_pin = self.__BEGIN_IN_DEFAULT + i # 送信するメッセージの作成 msg = GpioMsg() # BCMポート番号をX端子番号に読み替え msg.port = gpio_pin msg.value = level # 現在のH/L状態に追記 port_now.append(msg.port) val_now.append(msg.value) # ボタンが押された/離された情報を送信 self.pub.publish(msg) # ログの表示 self.get_logger().info("Port (IN): %s -> %s (INTCAP) %s " % (port_now, val_now, bin(val))) port_now.clear() val_now.clear() else: # 現時点のGPIO(ここに限ってはINTフラグを解除するためのカラ読み込み用) val = self.bus.read_byte_data(self.__ICADDR, REG_GPIOB) self.get_logger().info("I2C GPIO : %s" % (bin(val)))