예제 #1
0
    def __init__(self, settings, callback_send):
        """ コンストラクタ
            settings      : 上位側のconfig情報
            callback_send : GPIO入力、およびSerial読み込み割り込み発生時のcallback関数
        """
        # データ初期化
        self.__serial_recv_buf = [[] for i in range(5)
                                  ]  # serail 5slotぶんのバッファslot 1,3,5,7,9 の順
        self.__serial_info = [{
            'recv_kind': ''
        } for i in range(5)]  # serail 5slotぶんの情報
        """ {'recv_kind':以下}
	    'NONE'/'CHAR'/'LENG'/'TI
	    で、それぞれ必要なら、
	    {'char':1文字}
	    {'leng':長さ}
	    {'time':ms}
        """

        # P1/P2/P3 切り替え
        self.__board_kind = 'P3'
        if self.__board_kind == 'P1':
            self.__board = TpP1Interface()
        elif self.__board_kind == 'P2':
            self.__board = TpP2Interface()
        else:  # P3
            self.__board = TpP3Interface()
        self.board = self.__board

        # 排他制御用定義
        self.i2c_lock = thread.allocate_lock()
        self.spi_lock = thread.allocate_lock()
        if self.__board_kind == 'P2' or self.__board_kind == 'P3':
            self.__board.spi_lock_init(self.spi_lock)

        # I2C健全性チェック
        self.__board.i2c_check_before_init()

        # FWバージョン確認
        self.__board.check_pic_fw()
        self.__board.read_pic_fw_ver(True)
        tpUtils.stdout('Board FW ver = ' + str(self.get_pic_fw_ver()))

        # ボード初期化
        self.__board.board_init()

        # 設定
        self.__tp_button = False
        self.settings = settings
        self.__settings_check()

        # イベント発生用のコールバック関数をセット
        self.callback_send = callback_send

        # PICスロット初期化
        self.__board.pic_slot_init()
    def __client_handler(self, clientsock):
        """
        受信処理スレッド
        """

        while True:

            try:
                # 受信
                rcvmsg = clientsock.recv(self.bufsize)
                #tpUtils.stdout('Received -> %s' % (rcvmsg))
            except Exception:
                # コネクション切断等のエラー時はコネクションの再接続を行う。
                break

            # 切断時
            if rcvmsg == b'':
                # コネクション切断時は再接続を行う。
                break

            if self.callback_recv != None:

                # コールバック
                send_data = self.handler(
                    self.callback_recv, self.info, rcvmsg)

                try:
                    # メッセージを返します
                    if (send_data is None or send_data == ''):
                        # Noneという文字列を返却
                        clientsock.send('None'.encode())
                    elif type(send_data) == str:
                        # 文字
                        clientsock.send(send_data.encode())
                    else:
                        # bytes
                        clientsock.send(send_data)
                except Exception:
                    # コネクション切断等のエラー時はコネクションの再接続を行う。
                    break

        # クローズ
        clientsock.close()
        # コネクション切断時は再接続を行う。
        tpUtils.stdout("Socket erroor reconnect %s %d" %
                       (self.host, self.port))
    def recv(self, host, port):
        """
        受信イベント
        """

        self.host = host
        self.port = port

        rty_cnt = 0
        while True:

            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            while True:
                try:
                    self.sock.bind((host, port))
                    break
                except:
                    rty_cnt = rty_cnt + 1
                    # リトライ
                    if rty_cnt >= 10:
                        raise
                    try:
                        time.sleep(1)
                    except KeyboardInterrupt:
                        sys.exit(0)

            self.sock.listen(100)

            tpUtils.stdout("Server listening on %s %d" % (host, (port)))

            # 接続待機
            clientsock, _ = self.sock.accept()

            # 配列に保持する
            self.lst_clientsock.append(clientsock)

            # 受信イベントスレッド
            client_thread = threading.Thread(target=self.__client_handler,
                                             args=(clientsock,))
            client_thread.daemon = True
            client_thread.start()
예제 #4
0
    def connect(self, host, port):
        """
        接続
        """

        rty_cnt = 0
        while True:
            try:

                # 接続
                self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.sock.connect((host, port))

                # 接続完了
                tpUtils.stdout(
                    '[TP TCP Client] Successfully connected! host:' + host +
                    ' port:' + str(port))
                # 接続したhost、portを保存
                self.host = host
                self.port = port

                break

            except ConnectionRefusedError:

                # 接続中
                tpUtils.stdout('[TP TCP Client] Try connecting')

                rty_cnt = rty_cnt + 1
                # リトライ
                # if rty_cnt >= 10:
                #    raise
                # 1秒WAIT
                try:
                    time.sleep(1)
                except KeyboardInterrupt:
                    sys.exit(0)
예제 #5
0
 def reconnect(self, host, port):
     # ソケットをクローズして、コネクションの再接続を行う。
     self.sock.close()
     tpUtils.stdout("Socket erroor reconnect %s %d" % (host, port))
     self.connect(host, port)
     return
예제 #6
0
    def recv(self, host, port):
        """
        受信イベント
        """

        while True:

            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            self.sock.bind((host, port))
            self.sock.listen(0)

            tpUtils.stdout("Server listening on %s %d" % (host, (port)))

            # 接続待機
            self.clientsock, client_address = self.sock.accept()

            # 一つのクライアントのみ接続可能にするため閉じる
            self.sock.close()

            while True:

                try:
                    # 受信
                    rcvmsg = self.clientsock.recv(self.bufsize)
                    #tpUtils.stdout('Received -> %s' % (rcvmsg))
                except Exception:
                    # コネクション切断等のエラー時はコネクションの再接続を行う。
                    break

                # 切断時
                if rcvmsg == b'':
                    # コネクション切断時は再接続を行う。
                    break

                if self.callback_recv != None:

                    # コールバック
                    send_data = self.handler(self.callback_recv, self.info,
                                             rcvmsg)

                    try:
                        # メッセージを返します
                        if (send_data is None or send_data == ''):
                            # Noneという文字列を返却
                            self.clientsock.send('None'.encode())
                        elif type(send_data) == str:
                            # 文字
                            self.clientsock.send(send_data.encode())
                        else:
                            # bytes
                            self.clientsock.send(send_data)
                    except Exception:
                        # コネクション切断等のエラー時はコネクションの再接続を行う。
                        break

            # クローズ
            self.clientsock.close()
            # コネクション切断時は再接続を行う。
            tpUtils.stdout("Socket erroor reconnect %s %d" % (host, port))
    if (len(argvs) > 1):
        setting_file = argvs[1]

    connect_flg = False
    if (len(argvs) > 2 and argvs[2] == 'true'):
        connect_flg = argvs[2]

    try:

        # インスタンス生成
        tp_connect = TpConnect(setting_file, connect_flg)

    except tpUtils.TpCheckError as e:
        # トレースは出さず、メッセージのみ
        tpUtils.stderr(str(e.args))
        tpUtils.stderr('Tibbo-Pi failed to start up.')
        sys.exit(0)

    # サーバ起動
    tp_connect.start()

    # 接続完了
    tpUtils.stdout('Successfully connected!')

    # 待ち処理
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        pass