package com.github.zengfr.easymodbus4j.example3;

import java.util.Collection;

import com.github.zengfr.easymodbus4j.ModbusConfs;
import com.github.zengfr.easymodbus4j.common.util.ConsoleUtil;
import com.github.zengfr.easymodbus4j.common.util.ScheduledUtil;
import com.github.zengfr.easymodbus4j.example.processor.ExampleModbusMasterResponseProcessor;
import com.github.zengfr.easymodbus4j.handle.impl.ModbusMasterResponseHandler;
import com.github.zengfr.easymodbus4j.handler.ModbusResponseHandler;
import com.github.zengfr.easymodbus4j.processor.ModbusMasterResponseProcessor;
import com.github.zengfr.easymodbus4j.sender.ChannelSender;
import com.github.zengfr.easymodbus4j.sender.ChannelSenderFactory;
import com.github.zengfr.easymodbus4j.server.ModbusServer4TcpMaster;
import com.github.zengfr.easymodbus4j.server.ModbusServerTcpFactory;

import io.netty.channel.Channel;

public class Example4 {
	private static ModbusServer4TcpMaster modbusServer;

	public static void main(String[] args) throws Exception {
		initServer();
		scheduleToSendData();
		// 1\ ChannelSender to send data to machine
		// 2\ ExampleModbusMasterResponseProcessor to receive resp data.

	}

	private static void initServer() throws Exception {

		int port = 502;
		long sleep = 3000;
		short transactionIdentifierOffset = 0;
		ModbusConfs.MASTER_SHOW_DEBUG_LOG = true;
		ModbusMasterResponseProcessor masterProcessor = new ExampleModbusMasterResponseProcessor(
				transactionIdentifierOffset);
		ModbusResponseHandler responseHandler = new ModbusMasterResponseHandler(masterProcessor);
		;
		modbusServer = ModbusServerTcpFactory.getInstance().createServer4Master(port, responseHandler);

		Thread.sleep(sleep);
	}

	private static void scheduleToSendData() {

		Runnable runnable = () -> {
			ConsoleUtil.clearConsole(true);
			Collection<Channel> channels = modbusServer.getChannels();
			for (Channel channel : channels) {
				if (channel == null || (!channel.isActive()) || !channel.isOpen() || !channel.isWritable())
					return;
				ChannelSender sender = ChannelSenderFactory.getInstance().get(channel);
				// short unitIdentifier=1;
				// ChannelSender sender2 =new ChannelSender(channel, unitIdentifier);

				int startAddress = 0;
				int quantityOfCoils = 4;
				try {
					sender.readCoilsAsync(startAddress, quantityOfCoils);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		int sleep = 1000;
		ScheduledUtil.getInstance().scheduleAtFixedRate(runnable, sleep * 5);

	}
}