import socket
import sys
import serial
import os
import time
import json
import string
import select

global cashless_stage
_cashless_stage = ["Just reset",
                   "Setup",
                   "Min/max prices",
                   "Reset from VMC",
                   "Vend request",
                   "Vend cancel",
                   "Vend success",
                   "Vend failure",
                   "Session complete",
                   "Disabled by VMC",
                   "Enabled by VMC",
                   "Canceled by VMC",
                   "Expansion request ID",
                   "Data entry request",
                   "Revalue request",
                   "Revalue limit",
                   "",
                   "",
                   ""
                   ""
                   ""
                   ""]


def mdb_cashless_set_country_code(_llinput):
    global ser
    try:
        _lcountry_code = int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessSetCountryCode: "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return
    _lserial_string = [0xFE,0x02]
    _lserial_string.append((_lcountry_code & 0xFF00) >> 8)
    _lserial_string.append(_lcountry_code & 0xFF)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc += _lserial_string[_li]
    _lcrc = _lcrc & 0xFF
    _lserial_string.append(_lcrc)
    print (_lserial_string)
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessSetCountryCode": "'+str(_lcountry_code)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessSetCountryCode": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    else:
        _ljson_string='{"MDBCashlessSetCountryCode": "-1"}\r\n' # no answer from the interface
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3
    
def mdb_cashless_set_scaling_factor(_llinput,_pscaling_factor):
    global ser
    try:
        _lscaling_factor = int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessSetScalingFactor": "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return _pscaling_factor
    _lserial_string = [0xFE,0x03]
    _lserial_string.append(_lscaling_factor & 0xFF)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc += _lserial_string[_li]
    _lcrc = _lcrc & 0xFF
    _lserial_string.append(_lcrc)
    print (_lserial_string)
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessSetScaligFactor": "'+str(_lscaling_factor)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessSetScalingFactor": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return _pscaling_factor
    else:
        _ljson_string='{"MDBCashlessSetScalingFactor": "-1"}\r\n' # no answer from the interface
        _lscaling_factor = _pscaling_factor
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3
    return _lscaling_factor

def mdb_cashless_set_options(_llinput):
    global ser
    try:
        _loptions = int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessSetOptions": "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return
    _lserial_string = [0xFE,0x04]
    _lserial_string.append(_loptions & 0xFF)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc += _lserial_string[_li]
    _lcrc = _lcrc & 0xFF
    _lserial_string.append(_lcrc)
    print (_lserial_string)
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessSetOptions": "'+str(_loptions)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessSetOptions": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    else:
        _ljson_string='{"MDBCashlessSetOptions": "-1"}\r\n' # no answer from the interface
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3
    

def mdb_cashless_set_decimal_places(_llinput):
    global ser
    try:
        _ldecimal_places = int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessSetDecimalPlaces": "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return
    _lserial_string = [0xFE,0x05]
    _lserial_string.append(_ldecimal_places & 0xFF)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc += _lserial_string[_li]
    _lcrc = _lcrc & 0xFF
    _lserial_string.append(_lcrc)
    print (_lserial_string)
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessSetDecimalPlaces": "'+str(_ldecimal_places)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessSetDecimalPlacese": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    else:
        _ljson_string='{"MDBCashlessSetDecimalPlaces": "-1"}\r\n' # no answer from the interface
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3


# MDB begin session
def mdb_cashless_begin_session(_llinput,_pscaling_factor):
    global ser
    try:
        _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return
    #_lscaling_factor = _pscaling_factor
    _lvalue = round(_lvalue / _pscaling_factor)
    _lserial_string=[0x03]
    _lvalue_hi = (_lvalue & 0xFF00) >> 8
    _lvalue_lo = _lvalue & 0x00FF
    _lserial_string.append(_lvalue_hi)
    _lserial_string.append(_lvalue_lo)
    for _li in range(0,4):
        _lserial_string.append(0xFF)
    for _li in range(0,3):
        _lserial_string.append(0x00)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc = _lcrc + _lserial_string[_li]
    _lcrc = _lcrc & 0x00FF
    _lserial_string.append(_lcrc)
    print (_lserial_string)
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessBeginSession": "'+str(_lvalue * _pscaling_factor)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    else:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n' # no answer from the interface
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3

# cancel session 
def mdb_cashless_cancel_session():
    _lserial_string=[0x04,0x04]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessCancelSession": "0"}\r\n'
        else:
            _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3
    
# vend denied
def mdb_cashless_vend_denied():
    _lserial_string=[0x06,0x06]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessVendDenied": "0"}\r\n'
        else:
            _ljson_string='{"MDBCashlessVendDenied": ""-1"}\r\n'
    else:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n' # no answer from the interface            
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3

# MDB vend approved
def mdb_cashless_vend_approved(_llinput,_pscaling_factor):
    global ser
    try:
        _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")])
    except:
        _ljson_string='{"MDBCashlessVendApproved": "-1"}\r\n'
        sock.send(_ljson_string.encode())
        ser.timeout = 0.3
        return
    #_lvalue = round(_lvalue / _pscaling_factor)
    _lserial_string = [0x05]
    _lvalue_hi = (_lvalue & 0xFF00) >> 8
    _lvalue_lo = _lvalue & 0x00FF
    _lserial_string.append(_lvalue_hi)
    _lserial_string.append(_lvalue_lo)
    _lcrc = 0
    for _li in range(0,len(_lserial_string)):
        _lcrc = _lcrc + _lserial_string[_li]
    _lcrc = _lcrc & 0x00FF
    _lserial_string.append(_lcrc)
    
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessVendApproved": "'+str(_lvalue)+'"}\r\n'
        else:
            _ljson_string='{"MDBCashlessVendApproved": "-1"}\r\n'
            sock.send(_ljson_string.encode())
    else:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n' # no answer from the interface            
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3

# MDB revalue approved
def mdb_cashless_revalue_approved(_llinput,_pscaling_factor):
    global ser
    _lserial_string = [0x0D,0x0D]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessRevalueApproved": "0"}\r\n'
        else:
            _ljson_string='{"MDBCashlessRevalueApproved": "-1"}\r\n'
            sock.send(_ljson_string.encode())
    else:
        _ljson_string='{"MDBCashlessRevalueApproved": "-1"}\r\n' # no answer from the interface            
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3

# MDB revalue denied
def mdb_cashless_revalue_denied(_llinput,_pscaling_factor):
    global ser
    _lserial_string = [0x0E,0x0E]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 2
    _gsir = ser.read(6)
    if len(_gsir)>4:
        if _gsir[1] == 0xFC:
            _ljson_string='{"MDBCashlessRevalueDenied": "0"}\r\n'
        else:
            _ljson_string='{"MDBCashlessRevalueDenied": "-1"}\r\n'
            sock.send(_ljson_string.encode())
    else:
        _ljson_string='{"MDBCashlessRevalueDenied": "-1"}\r\n' # no answer from the interface            
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3

# get stat
def mdb_cashless_get_stat(_pscaling_factor):
    global _cashless_stage
    _lserial_string=[0xFB,0xFB]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 1
    _gsir = ser.read(20)
    if len(_gsir)>15:
        print_hex_string(_gsir)
        if _gsir[0] == 0xFB:
            _lcash_sniff = 0
            # exatracting cash sniff
            for _li in range(1,5):
                _lcash_sniff = _lcash_sniff << 8
                _lcash_sniff = _lcash_sniff + _gsir[_li]
            _lchange_sniff = 0
            # extracting change sniff
            for _li in range(5,9):
                _lchange_sniff = _lchange_sniff << 8
                _lchange_sniff = _lchange_sniff + _gsir[_li]
            # extracting scaling factor
            _lscaling_factor = str(_gsir[10])
            _lscaling_factor_value = _gsir[10]
            # extracting decimal places
            _ldecimal_places = str(_gsir[11])
            # extracting country code
            _lcountry_code = str(_gsir[12]) + str(_gsir[13])
            # extracting cash sale reporting capable
            if (_gsir[14] & 0b00001000) != 0x00:
                _lvend_cash_reporting = "True"
            else:
                _lvend_cash_reporting = "False"
            # extracting revalue capable
            if (_gsir[14] & 0b00000001) != 0x00:
                _lrevalue_capable   = "True"
            else:
                _lrevalue_capable = "False"
            # exatracting available change
            _lavailable_change = 0
            for _li in range(15,19):
                _lavailable_change = _lavailable_change << 8
                _lavailable_change = _lavailable_change + _gsir[_li]
            
            
            _ljson_string='{"MDBCashlessStatus":"'+str(_gsir[9])+'",'
            _ljson_string += '"MDBCashlessHuman":"'+_cashless_stage[_gsir[9]]+'",'
            _ljson_string += '"MDBCashSniff":"'+str(_lcash_sniff)+'",'
            _ljson_string += '"MDBChangeSniff":"'+str(_lchange_sniff)+'",'
            _ljson_string += '"MDBCashlessScalingFactor":"'+str(_lscaling_factor)+'",'
            _ljson_string += '"MDBCashlessDecimalPlaces":"'+str(_ldecimal_places)+'",'
            _ljson_string += '"MDBCashlessCountryCode":"'+str(_lcountry_code)+'",'
            _ljson_string += '"MDBCashlessCashSaleSubcmd":"'+str(_lvend_cash_reporting)+'",'
            _ljson_string += '"MDBCashlessAcceptRevalue":"'+str(_lrevalue_capable)+'",'
            _ljson_string += '"MDBAvailableChange":"'+str(_lavailable_change)+'"'
            _ljson_string += '}\r\n'
        else:
            _ljson_string='{"MDBCashlessStatus": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return _pscaling_factor
    else:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n' # no answer from the interface
        _lscaling_factor_value = _pscaling_factor
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3
    return _lscaling_factor_value

# get reset
def mdb_cashless_reset():
    _lserial_string=[0xFE,0x01,0xFF]
    ser.rts = True
    while ser.cts == False:
        pass
    ser.write(_lserial_string)
    ser.rts = False
    ser.timeout = 1
    _gsir = ser.read(4)
    if len(_gsir)>1:
        if _gsir[0] == 0xFC:
            _ljson_string='{"MDBCashlessReset": "0"}\r\n'
        else:
            _ljson_string='{"MDBCashlessReset": "-1"}\r\n'
            sock.send(_ljson_string.encode())
            ser.timeout = 0.3
            return
    else:
        _ljson_string='{"MDBCashlessBeginSession": "-1"}\r\n' # no answer from the interface        
    sock.send(_ljson_string.encode())
    ser.timeout = 0.3


def prel_device_message(_llsir):
    global _gscaling_factor
    _lposition = 0
    
    # daca e cu 0x14
    if _llsir[_lposition] == 0x14:
        if _llsir[_lposition+1] == 0x00:
            _ljson_string = '{"CashlessStatus" : "Disabled"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[3:]
        elif _llsir[_lposition+1] == 0x01:
            _ljson_string = '{"CashlessStatus" : "Enabled"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[3:]
        elif _llsir[_lposition+1] == 0x02:
            _ljson_string = '{"CashlessStatus" : "Cancel"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[3:]
        else:
            _local_sir = ""
    # daca e cu 0x15
    elif _llsir[_lposition] == 0x15:
        if _llsir[_lposition + 1] == 0x00: # revalue
            _lrevalue_value = _llsir[_lposition + 2]
            _lrevalue_value = _lrevalue_value << 8
            _lrevalue_value = _lrevalue_value + _llsir[_lposition + 3]
            _ljson_string = '{"CasshlessOperation" : "CashlessRevalue", "Value" : "'+str(_lrevalue_value * _gscaling_factor)+'"}\r\n'
            _local_sir = _llsir[5:]
            sock.send(_ljson_string.encode())
    # daca e cu 0x13
    elif _llsir[_lposition] == 0x13:
        if _llsir[_lposition + 1] == 0x00: # vend request
            _lproduct_id = _llsir[_lposition + 4]
            _lproduct_id = _lproduct_id << 8
            _lproduct_id = _lproduct_id + _llsir[_lposition + 5]
            _lproduct_price = _llsir[_lposition + 2]
            _lproduct_price = _lproduct_price << 8
            _lproduct_price = _lproduct_price + _llsir[_lposition + 3]
            _lproduct_price = _lproduct_price * _gscaling_factor
            _ljson_string = '{"VMCRequest" : "VendRequest", "ProductID" : "'+str(_lproduct_id)+'","ProductPrice" : "'+str(_lproduct_price)+ '"}\r\n'
            _local_sir = _llsir[7:]
            sock.send(_ljson_string.encode())            
        elif _llsir[_lposition + 1] == 0x02: # vend success
            _lproduct_id = _llsir[_lposition + 2]
            _lproduct_id = _lproduct_id << 8
            _lproduct_id = _lproduct_id + _llsir[_lposition + 3]
            _ljson_string = '{"VMCResponse" : "VendSuccess", "ProductID" : "'+str(_lproduct_id)+'"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[5:]

        elif _llsir[_lposition + 1] == 0x03: # vend failure
            _ljson_string = '{"VMCResponse" : "VendFailure"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[3:]

        elif _llsir[_lposition + 1] == 0x04: # session complete
            _ljson_string = '{"VMCResponse" : "SessionComplete"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[3:]
            
        elif _llsir[_lposition + 1] == 0x05: # cash sale reported to cashless
            _lproduct_id = _llsir[_lposition + 4]
            _lproduct_id = _lproduct_id << 8
            _lproduct_id = _lproduct_id + _llsir[_lposition + 5]
            _lproduct_price = _llsir[_lposition + 2]
            _lproduct_price = _lproduct_price << 8
            _lproduct_price = _lproduct_price + _llsir[_lposition + 3]
            _lproduct_price = _lproduct_price * _gscaling_factor
            _ljson_string = '{"CashSale" : "Success", "ProductID" : "'+str(_lproduct_id)+'","ProductPrice" : "'+str(_lproduct_price)+ '"}\r\n'
            sock.send(_ljson_string.encode())
            _local_sir = _llsir[7:]
        else:
            _local_sir = ""
    elif _llsir[_lposition] == 0xFC:

        _local_sir = _llsir[6:]
    else:
        print(_llsir)
        _local_sir = ""
        pass
    
    return  _local_sir

def serial_check_crc(_lsir):
    _lcrc = 0
    for _li in range(0,len(_lsir)-1):
        _lcrc = _lcrc + _lsir[_li]

    if (_lcrc & 0xFF) == _lsir[len(_lsir)-1]:
        return True
    else:
        return False

def print_hex_string(_llsir):
    _hex_string = ""
    for _li in range(0,len(_llsir)):
        _hex_tmp_string = hex(_llsir[_li])[2:]
        if len(_hex_tmp_string) < 2:
            _hex_tmp_string = "0x0" + _hex_tmp_string
        else:
            _hex_tmp_string = "0x" + _hex_tmp_string
        _hex_string += _hex_tmp_string + " "
    print(_hex_string)

def prel_serial_messages(_llsir):
    global ser
    global sock
    global conn

    print_hex_string(_llsir)
    if _llsir[0] == 0xFA: ## daca e credit din cash modificat
        _lcrc = 0
        if serial_check_crc(_llsir):
            _lcash = 0
            for _ji in range(1,5):
                _lcash = _lcash << 8
                _lcash = _lcash + _llsir[_ji]
            _ljson_string = '{"CashInput" : "'+str(_lcash)+'"}\r\n'
            sock.send(_ljson_string.encode())
        else:
            _ljson_string = '{"ERROR" : "SerialCRCFail"}\r\n'
            sock.send(_ljson_string.encode())
    elif _llsir[0] == 0x14:
        _llsir = prel_device_message(_llsir)
        while len(_llsir) != 0:
            _llsir = prel_device_message(_llsir)
    elif _llsir[0] == 0x15:
        _llsir = prel_device_message(_llsir)
        while len(_llsir) != 0:
            _llsir = prel_device_message(_llsir)
    elif _llsir[0] == 0x13:
        _llsir = prel_device_message(_llsir)
        while len(_llsir) != 0:
            _llsir = prel_device_message(_llsir)
    elif _llsir[0] == 0xFB:
        _llsir = prel_device_message(_llsir)
        while len(_llsir) != 0:
            _llsir = prel_device_message(_llsir)
    elif _llsir[0] == 0xFC:
        _llsir = prel_device_message(_llsir)
        while len(_llsir) != 0:
            _llsir = prel_device_message(_llsir)
    elif _llsir[0] == 0xFE:
        pass
    else:
        pass

# server parse and execute received message
def prel_socket_messages(_llsir,_pscaling_factor):
    global ser
    global sock
    global conn
    try:
        _lsir=_llsir.decode()
    except:
        print("Malformated command")
        return
    _lsir=_lsir.upper()
    # daca e MDBcashlessbeginsession
    if _lsir.find("MDBCASHLESSBEGINSESSION(")!=-1:
        print("Begining the cashless session ")
        mdb_cashless_begin_session(_lsir,_pscaling_factor)
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSCANCELSESSION")!=-1:
        print("Trying to CANCEL SESSION... ")
        mdb_cashless_cancel_session()
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSVENDDENIED")!=-1:
        print("Sending VEND DENIED...")
        mdb_cashless_vend_denied()
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSVENDAPPROVED")!=-1:
        print("Sending VEND APPROVED...")
        mdb_cashless_vend_approved(_lsir,_pscaling_factor)
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSREVALUEAPPROVED")!=-1:
        print("Sending REVALUE APPROVED...")
        mdb_cashless_revalue_approved(_lsir,_pscaling_factor)
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSREVALUEDENIED")!=-1:
        print("Sending REVALUE DENIED...")
        mdb_cashless_revalue_denied(_lsir,_pscaling_factor)
        return _pscaling_factor       
    elif _lsir.find("MDBCASHLESSGETSTAT")!=-1:
        print("Getting status...")
        return mdb_cashless_get_stat(_pscaling_factor)
    elif _lsir.find("MDBCASHLESSRESET")!=-1:
        print("Reset cashless device...")
        mdb_cashless_reset()
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSSETCOUNTRYCODE(")!=-1:
        print("Setting country code...")
        mdb_cashless_set_country_code(_lsir)
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSSETSCALINGFACTOR(")!=-1:
        print("Setting scaling factor...")
        return mdb_cashless_set_scaling_factor(_lsir,_pscaling_factor)
    elif _lsir.find("MDBCASHLESSSETOPTIONS(")!=-1:
        print("Setting options code...")
        mdb_cashless_set_options(_lsir)
        return _pscaling_factor
    elif _lsir.find("MDBCASHLESSSETDECIMALPLACES(")!=-1:
        print("Setting decimal places...")
        mdb_cashless_set_decimal_places(_lsir)
        return _pscaling_factor        
    elif _lsir.find("BYE")!=-1:
        sys.exit(0)
    else:
        sock.send(json.dumps({"UnknownCommand" : "failed"}).encode()+b"\n")
        return _pscaling_factor
        

# Main Procedure
def MainProcedure():
    host = "0.0.0.0"
    port = 5126
    global _gscaling_factor
    _gscaling_factor = 10
    
    
    if len(sys.argv)<2:
        print("You have to give me the serial port as a parameter :-)")
        sys.exit(1)
    print("Opening serial port")
    
    try:
        global ser
        ser=serial.Serial(port=sys.argv[1],baudrate=230400,timeout=0.3,rtscts=True,xonxoff=False)
        if ser.isOpen()==False:
            print("Cannot open serial port")
            sys.exit(2)
    except:
        print("Error opening serial port")
        sys.exit(3)

    try:
        global sock
        global conn
        global addr
        conn = socket.socket()
        conn.bind((host,port))
        conn.listen(1)
        sock, addr = conn.accept()
        sock.setblocking(0)
        sock.send(json.dumps({"AppName" : "MDBSlaveRS232IFC","Version" : "1.01","CreatedBy" : "www.vendingtools.ro"}).encode()+b"\n")
    except:
        print("Cannot open socket for listening. Maybe the port is in use.")
        sys.exit(4)


    # forever loop listening to sock and serial
    while True:
        ser.rts = False
        ## Verifica daca are ceva primit pe socket
        _sock_ready = select.select([sock], [], [], 0.4)
        if _sock_ready[0]:
            _gsir = sock.recv(128)
            if len(_gsir)>3:
               # parse and execute received command
               _gscaling_factor = prel_socket_messages(_gsir,_gscaling_factor);
            else:
                if len(_gsir)==0:
                    conn.listen(1)
                    sock, addr = conn.accept()
                    sock.setblocking(0)
                    sock.send(json.dumps({"AppName" : "MDBSlaveRS232IFC","Version" : "1.01","CreatedBy" : "www.vendingtools.ro"}).encode()+b"\n")
                else:
                    pass

            # connection closed, wait for the next one
        else:
            pass
        ## sf verifica daca are ceva primit pe socket

        ## verifica daca are ceva pe seriala
        _gsir = ser.read(128)
        if len(_gsir) > 2:
            prel_serial_messages(_gsir)
            _gsir = ser.read(128)
            if len(_gsir) > 2:
                prel_serial_messages(_gsir)
        else:
            pass
        ## sf daca are ceva pe seriala

    ## sf forever loop
    conn.close()
     
if __name__ == '__main__':
    MainProcedure()