Completed
Pull Request — master (#13)
by Jeffrey
03:21
created

KissTcp.__enter__()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 2
rs 10
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
4
"""KISS Core Classes."""
5
6
# These imports are for python3 compatability inside python2
7
from __future__ import absolute_import
8
from __future__ import division
9
from __future__ import print_function
10
11
import logging
12
import socket
13
14
from apex.kiss import constants as kiss_constants
15
from .kiss import Kiss
16
17
__author__ = 'Jeffrey Phillips Freeman (WI2ARD)'
18
__maintainer__ = 'Jeffrey Phillips Freeman (WI2ARD)'
19
__email__ = '[email protected]'
20
__license__ = 'Apache License, Version 2.0'
21
__copyright__ = 'Copyright 2016, Syncleus, Inc. and contributors'
22
__credits__ = []
23
24
25
class KissTcp(Kiss):
26
27
    """KISS TCP Object Class."""
28
29
    logger = logging.getLogger(__name__)
30
    logger.setLevel(kiss_constants.LOG_LEVEL)
31
    console_handler = logging.StreamHandler()
32
    console_handler.setLevel(kiss_constants.LOG_LEVEL)
33
    formatter = logging.Formatter(kiss_constants.LOG_FORMAT)
34
    console_handler.setFormatter(formatter)
35
    logger.addHandler(console_handler)
36
    logger.propagate = False
37
38
    frame_buffer = []
39
40
    def __init__(self,
41
                 strip_df_start=True,
42
                 host=None,
43
                 tcp_port=8000):
44
        super(KissTcp, self).__init__(strip_df_start)
45
46
        self.host = host
47
        self.tcp_port = tcp_port
48
        self.socket = None
49
        self.strip_df_start = strip_df_start
50
        self.exit_kiss = False
51
52
        self.logger.info('Using interface_mode=TCP')
53
54
    def __enter__(self):
55
        return self
56
57
    def __exit__(self, exc_type, exc_val, exc_tb):
58
        self.socket.close()
59
60
    def _read_interface(self):
61
        return self.socket.recv(kiss_constants.READ_BYTES)
62
63
    def _write_interface(self, data):
64
        self.socket.write(data)
65
66
    def start(self, mode_init=None, **kwargs):
67
        """
68
        Initializes the KISS device and commits configuration.
69
70
        See http://en.wikipedia.org/wiki/KISS_(TNC)#Command_codes
71
        for configuration names.
72
73
        :param **kwargs: name/value pairs to use as initial config values.
74
        """
75
        self.logger.debug('kwargs=%s', kwargs)
76
77
        address = (self.host, self.tcp_port)
78
        self.socket = socket.create_connection(address)
79
80
    def close(self):
81
        if not self.socket:
82
            raise RuntimeError('Attempting to close before the class has been started.')
83
84
        super(KissTcp, self).close()
85
        self.socket.shutdown()
86
        self.socket.close()
87
88
    def shutdown(self):
89
        self.socket.shutdown()
90