#!/usr/bin/python

import sys
import time
import os
import hal
from pymodbus.client.sync import ModbusTcpClient

#Max 16 bit registers is 125
#Max Coils is 128
#################LOOP TIME#####################
loop_time = 0.01
#############ARDUINO IP ADRESS#################
client = ModbusTcpClient("192.168.88.88")
###############ARDUINO PINS####################
digital_out_port_range = [2,4]
analog_out_port_range = [3,5]
analog_in_port_range = [14]
digital_in_port_range = [9]
##############OLD VALUE LIST###################
old_value = [0]*128
###############CREATING PINS###################
h = hal.component("arduino_modbus_tcp")
for port in digital_out_port_range:
    h.newpin("digital-out-%d" % port, hal.HAL_BIT, hal.HAL_IN)
for port in analog_out_port_range:
    h.newpin("analog-out-%d" % port, hal.HAL_FLOAT, hal.HAL_IN)
for port in digital_in_port_range:
    h.newpin("digital-in-%d" % port, hal.HAL_BIT, hal.HAL_OUT)
for port in analog_in_port_range:
    h.newpin("analog-in-%d" % port, hal.HAL_FLOAT, hal.HAL_OUT)
###############################################
h.ready()

############################################MAIN LOOP#####################################
while 1:
    try:	
###############ARDUINO PINS####################
        for port in digital_out_port_range:
            if h['digital-out-%d' % port] <> old_value[port]:
                client.write_coil(port, h['digital-out-%d' % port])
                old_value[port] = h['digital-out-%d' % port]
        for port in analog_out_port_range:
            if h['analog-out-%d' % port] <> old_value[port]:
                client.write_register(port, h['analog-out-%d' % port])
                old_value[port] = h['analog-out-%d' % port]
        for port in analog_in_port_range:
            reg = (client.read_holding_registers(port).registers)[0]
            if reg <> old_value[port]:
                h['analog-in-%d' % port] = reg
                old_value[port] = h['analog-in-%d' % port]
        for port in digital_in_port_range:
            reg = (client.read_coils(port).bits)[0]
            if reg <> old_value[port]:
                h['digital-in-%d' % port] = reg
                old_value[port] = h['digital-in-%d' % port]

        time.sleep(loop_time)
    except Exception as e:
        print e




