Esempio n. 1
0
    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)))
Esempio n. 2
0
 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
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
    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)))
Esempio n. 7
0
 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()