<commit_before># -*- coding: utf-8 -*-


from time import sleep

from protocol import Protocol
from misc import encode, decode, bytearray_strip, int_to_bytes, bytes_to_int, FuncChain, CAST_SIZE


class Driver(object):
    SERIAL_TIMEOUT = 1
    WAIT_TIME = 0.01

    DEFAULT_CASHIER_PASSWORD = 1
    DEFAULT_ADMIN_PASSWORD = 30

    DEFAULT_MAX_LENGTH = 48

    TABLES_COUNT = 15

    # TODO: подумать можно ли избавиться от port и baudrate в пользу автоматического поиска устройства
    def __init__(self, port='/dev/ttyS0', baudrate=9600, timeout=None, password=None, admin_password=None):
        """
        :type port: str
        :param port: порт взаимодействия с устройством
        :type baudrate: int
        :param baudrate: скорость взаимодействия с устройством
        :type timeout: int
        :param timeout: время таймаута ответа устройства
        :type password: int
        :param password: <PASSWORD>
        :type admin_password: int
        :param admin_password: <PASSWORD> админ<PASSWORD>
        """

        self.protocol = Protocol(
            port,
            baudrate,
            timeout or self.SERIAL_TIMEOUT
        )

        self.password = password or self.DEFAULT_CASHIER_PASSWORD
        self.admin_password = admin_password or self.DEFAULT_ADMIN_PASSWORD

        self.connected = False

    def connect(self):
        """
        Подключиться к ККМ.
        """

        if self.connected:
            self.disconnect()
        self.protocol.connect()
        self.connected = True

    def disconnect(self):
        """
        Отключиться от ККМ.
        """

        if not self.connected:
            return
        self.protocol.disconnect()
        self.connected = False

    def state(self):
        """
        Состояние ККМ в коротком виде.
        """

        return self.protocol.command(0x10, self.password)

    def full_state(self):
        """
        Состояние ККМ.
        """

        return self.protocol.command(0x11, self.password)

    def print_string(self, string, control_tape=True, cash_tape=True):
        """
        Печать строки.
        """

        control = 0b01 if control_tape else 0b00
        cash = 0b10 if cash_tape else 0b00

        result = self.protocol.command(
            0x17, self.password, CAST_SIZE['1'](control + cash), encode(string[:self.DEFAULT_MAX_LENGTH])
        )
        self.wait_printing()

        return result

    def print_line(self, symbol='-', control_tape=True, cash_tape=True):
        """
        Печать строки-разделителя.
        """

        return self.print_string(symbol * self.DEFAULT_MAX_LENGTH, control_tape, cash_tape)

    def test_start(self, minute):
        """
        Тестовый прогон.
        """

        return self.protocol.command(0x19, self.password, CAST_SIZE['1'](minute))

    def write_table(self, table, row, field, value, _type):
        """
        Запись таблицы.
        """

        cast_funcs_map = {
            int: FuncChain(bytearray, int_to_bytes),
            str: encode
        }

        return self.protocol.command(
            0x1E,
            self.admin_password,
            CAST_SIZE['121'](table, row, field),
            cast_funcs_map[_type](value)<commit_msg>Добавлены методы beep, read_exchange_params, request_monetary_register и request_operational_register.<commit_after># -*- coding: utf-8 -*-


from time import sleep

from protocol import Protocol
from misc import encode, decode, bytearray_strip, int_to_bytes, bytes_to_int, FuncChain, CAST_SIZE


class Driver(object):
    SERIAL_TIMEOUT = 1
    WAIT_TIME = 0.01

    DEFAULT_CASHIER_PASSWORD = 1
    DEFAULT_ADMIN_PASSWORD = 30

    DEFAULT_MAX_LENGTH = 48

    TABLES_COUNT = 15

    # TODO: подумать можно ли избавиться от port и baudrate в пользу автоматического поиска устройства
    def __init__(self, port='/dev/ttyS0', baudrate=9600, timeout=None, password=None, admin_password=None):
        """
        :type port: str
        :param port: порт взаимодействия с устройством
        :type baudrate: int
        :param baudrate: скорость взаимодействия с устройством
        :type timeout: int
        :param timeout: время таймаута ответа устройства
        :type password: int
        :param password: <PASSWORD>
        :type admin_password: int
        :param admin_password: <PASSWORD>
        """

        self.protocol = Protocol(
            port,
            baudrate,
            timeout or self.SERIAL_TIMEOUT
        )

        self.password = password or self.DEFAULT_CASHIER_PASSWORD
        self.admin_password = <PASSWORD> or self.DEFAULT_ADMIN_PASSWORD

        self.connected = False

    def connect(self):
        """
        Подключиться к ККМ.
        """

        if self.connected:
            self.disconnect()
        self.protocol.connect()
        self.connected = True

    def disconnect(self):
        """
        Отключиться от ККМ.
        """

        if not self.connected:
            return
        self.protocol.disconnect()
        self.connected = False

    def state(self):
        """
        Состояние ККМ в коротком виде.
        """

        return self.protocol.command(0x10, self.password)

    def full_state(self):
        """
        Состояние ККМ.
        """

        return self.protocol.command(0x11, self.password)

    def beep(self):
        """
        Гудок.
        """

        return self.protocol.command(0x13, self.password)

    def read_exchange_params(self, port):
        """
        Чтение параметров обмена.
        """

        return self.protocol.command(0x15, self.admin_password, CAST_SIZE['1'](port))

    def print_string(self, string, control_tape=True, cash_tape=True):
        """
        Печать строки.
        """

        control = 0b01 if control_tape else 0b00
        cash = 0b10 if cash_tape else 0b00

        result = self.protocol.command(
            0x17, self.password, CAST_SIZE['1'](control + cash), encode(string[:self.DEFAULT_MAX_LENGTH])
        )
        self.wait_printing()

        return result

    def print_line(self, symbol='-', control_tape=True, cash_tape=True):
        """
        Печать строки-разделителя.
        """

        return self.print_string(symbol * self.DEFAULT_MAX_LENGTH, control_tape, cash_tape)

    def test_start(self, minute):
        """
        Тестовый прогон.
        """

        return self.protocol.command(0x19, self.password, CAST_SIZE['1'](minute))

    def request_monetary_register(self, num):
        """
        Запрос денежного регистра.
        """

        return self.protocol.command(0x1A, self.password, CAST_SIZE['1'](num))

    def request_operational_register(self, num):
        """
        Запрос операционного регистра.
        """

        return self.protocol.command(0x1B, self.password, CAST_SIZE['1'](num))

    def write_table(self, table, row, field, value, _type):
        """
        Запись таблицы.
        """

        cast_funcs_map = {
            int: FuncChain(bytearray, int_to_bytes),
            str: encode
        }

        return self.protocol.command(
            0x1E,
            self.admin_password,
            CAST_SIZE['121'](table, row, field),
            cast_funcs_map[_type](value)
{'fraction_non_alphanumeric': 0.09612983770287141, 'fraction_numerical': 0.015119988902760438, 'mean_word_length': 2.1361461505002173, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7261902', 'n_tokens_mistral': 2341, 'n_tokens_neox': 2302, 'n_words': 492}