'=========================================================================
'region declare
TYPE SYSTEMTIME_UTYPE,2
	DEF wYea:WORD 
	DEF wMon:WORD 
	DEF wDow:WORD 
	DEF wDay:WORD 
	DEF wHou:WORD 
	DEF wMin:WORD 
	DEF wSec:WORD 
	DEF wMse:WORD
ENDTYPE

	Window w_plog
	DEF log_tm,log_old_tm:SYSTEMTIME_UTYPE
	int printpos = 20
	int w_plog_wdh,w_plog_hgh

	int woid

	int ttshowwblind = 1

'=========================================================================
	window w_qbox


	INT 		CRS_SRV_ID_OnConnectMessage		=0x8101
	INT 		CRS_SRV_ID_OnDataMessage			=0x8102
	int 		CRS_SRV_port							= 5001
	int 		CRS_SRV_Listen_Socket 				= -1
	int 		CRS_SRV_incoming_client_Socket   = -1


	INT 		SNS_SRV_ID_OnConnectMessage		=0x8103
	INT 		SNS_SRV_ID_OnDataMessage			=0x8104
	int 		SNS_SRV_port							= 5002
	int 		SNS_SRV_Listen_Socket 				= -1
	int 		SNS_SRV_incoming_client_Socket	= -1


	INT 		US1_SRV_ID_OnConnectMessage		=0x8105
	INT 		US1_SRV_ID_OnDataMessage			=0x8106
	int 		US1_SRV_port							= 5003
	int 		US1_SRV_Listen_Socket 				= -1
	int 		US1_SRV_incoming_client_Socket  	= -1


	INT 		US2_SRV_ID_OnConnectMessage		=0x8107
	INT 		US2_SRV_ID_OnDataMessage			=0x8108
	int 		US2_SRV_port							= 5004
	int 		US2_SRV_Listen_Socket 				= -1
	int 		US2_SRV_incoming_client_Socket	= -1


	int 		QBX_BBQ_ID_OnDataMessage			=0x8109
	int 		QBX_to_BBQ_out_client_Socket 		= -1



	int ttsendxmsg 	= 2
	INT ttsendxmsg_time = 2000



	INT 		SIM_to_CRS_ID_OnConnectMessage	=0x8201
	INT 		SIM_to_CRS_ID_OnDataMessage		=0x8202
	int 		SIM_to_CRS_out_client_Socket = -1


	int 		SIM_to_SNS_out_client_Socket = -1
	INT 		SIM_to_SNS_ID_OnConnectMessage	=0x8203
	INT 		SIM_to_SNS_ID_OnDataMessage		=0x8204


	INT 		SIM_to_US1_ID_OnConnectMessage	=0x8205
	INT 		SIM_to_US1_ID_OnDataMessage		=0x8206
	int 		SIM_to_US1_out_client_Socket = -1


	INT 		SIM_to_US2_ID_OnConnectMessage	=0x8207
	INT 		SIM_to_US2_ID_OnDataMessage		=0x8208
	int 		SIM_to_US2_out_client_Socket = -1

	INT 		BBQ_SRV_ID_OnConnectMessage		=0x8209
	INT 		BBQ_SRV_ID_OnDataMessage			=0x820a
	int 		BBQ_SRV_port							= 5000
	int 		BBQ_SRV_Listen_Socket 				= -1
	int 		BBQ_SRV_incoming_client_Socket   = -1
	string BBQ_SRV_ip					= "192.168.91.48"
'endregion
'=========================================================================
'region Start and wait
$MAIN
$include "windowssdk.inc"
autodefine "off"
int run = 9, z = 0
int i


OPENWINDOW w_plog, 280, 0, 1640, 1047, @MINBOX|@SIZE, 0, "Log",		&w_log_handler		'|@HIDDEN
			plog("main_line", "OPENWINDOW w_plog")

OPENWINDOW w_qbox,  0,  0,  280, 1047, 0, 0, "QBox",	&w_qbox_handler	'|@HIDDEN
			plog("main_line", "OPENWINDOW w_qbox")
			plog("main_line", "call w_qbox_make_buttons")
			w_qbox_make_buttons()	

			i = IWNCSInit(8,8)
			if i < 0
				plog("main_line","ERR. - IWNCSInit(8,8), Errorcode :"+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
			ELSE
				plog("main_line","O.K. - IWNCSInit(8,8), Errorcode :"+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
			endif

			plog("main_line", "Initialisation done, waituntil")
			plog("main_line", " ")
'endregion  Start and wait
'=========================================================================
'region Main Loop and Exit

waituntil run = 1
	plog("mainline","shutting down system")


	socket_close(QBX_to_BBQ_out_client_Socket, "x")
	socket_close(SIM_to_CRS_out_client_Socket, "x")
	socket_close(SIM_to_SNS_out_client_Socket, "x")
	socket_close(SIM_to_US1_out_client_Socket, "x")
	socket_close(SIM_to_US2_out_client_Socket, "x")
	socket_close(BBQ_SRV_incoming_client_Socket, "x")
	socket_close(BBQ_SRV_Listen_Socket, "x")
	socket_close(CRS_SRV_incoming_client_Socket, "x")
	socket_close(CRS_SRV_Listen_Socket, "x")
	socket_close(SNS_SRV_incoming_client_Socket, "x")
	socket_close(SNS_SRV_Listen_Socket, "x")
	IWNCSFree()

	CLOSEWINDOW w_qbox
	CLOSEWINDOW w_plog

ENd
'endregion Main Loop and Exit
'=========================================================================
sub w_qbox_make_buttons(),int
	int bhp,bvp,bw,bh,bsp,bn
	window win
	win = w_qbox
	bw  =  240	'button width
	bh  =   25	'button heigth
	bsp =   20	'button spacing
	bhp =   20	'button h pos
	bvp =   20	'button v pos
	bn  =  301	'button number

	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"Start Client QBX to QCU",		bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"Stop  Client QBX to QCU",		bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

	bn  =  341	'button number
	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"Start CRS Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"Stop  CRS Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

	bn  =  351	'button number
	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"Start SNS Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"Stop  SNS Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

	bn  =  361	'button number
	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"Start US1 Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"Stop  US1 Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

	bn  =  371	'button number
	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"Start US2 Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"Stop  US2 Server",					bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

'  ==============  reset lbrary
	bn  =  381	'button number
	bvp = bvp + 15
	CONTROL  (win,@BUTTON,"IWNCSInit",		bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1
	CONTROL  (win,@BUTTON,"IWNCSFree",		bhp, bvp, bw, bh,0,bn) : bvp = bvp + bh : bn = bn + 1

return 0
endsub
'=========================================================================
sub w_qbox_handler(),int
	int i
	SELECT @MESSAGE
		CASE @IDCONTROL
   	 	SELECT @CONTROLID
				CASE 301
					QBX_to_BBQ_out_client_Socket = Connect_To_server(BBQ_SRV_ip,BBQ_SRV_port,w_qbox,QBX_BBQ_ID_OnDataMessage,"QBX_to_BBQ")
				CASE 302
					QBX_to_BBQ_out_client_Socket = socket_close(QBX_to_BBQ_out_client_Socket,"QBX_to_BBQ")


				CASE 341
					CRS_SRV_listen_socket = server_Start(CRS_SRV_port,w_qbox,CRS_SRV_ID_OnConnectMessage,"CRS_SRV")
					plog("w_qbox_handler","CRS_SRV_listen_socket = "+str$(CRS_SRV_listen_socket))
				CASE 342
					CRS_SRV_listen_socket = socket_close(CRS_SRV_listen_socket,"CRS_srv")
					plog("w_qbox_handler","CRS_SRV_listen_socket          = "+str$(CRS_SRV_listen_socket))

				CASE 351
					SNS_SRV_listen_socket = server_Start(SNS_SRV_port,w_qbox,SNS_SRV_ID_OnConnectMessage,"SNS_SRV")
					plog("w_qbox_handler","SNS_SRV_listen_socket = "+str$(SNS_SRV_listen_socket))
				CASE 352
					SNS_SRV_listen_socket = socket_close(SNS_SRV_listen_socket,"SNS_SRV")
					plog("w_qbox_handler","SNS_SRV_listen_socket          = "+str$(SNS_SRV_listen_socket))

				CASE 361
					US1_SRV_listen_socket = server_Start(US1_SRV_port,w_qbox,US1_SRV_ID_OnConnectMessage,"US1_SRV")
					plog("w_qbox_handler","US1_SRV_listen_socket = "+str$(US1_SRV_listen_socket))
				CASE 362
					US1_SRV_listen_socket = socket_close(US1_SRV_listen_socket,"US1_SRV")
					plog("w_qbox_handler","US1_SRV_listen_socket          = "+str$(US1_SRV_listen_socket))

				CASE 371
					US2_SRV_listen_socket = server_Start(US2_SRV_port,w_qbox,US2_SRV_ID_OnConnectMessage,"US2_SRV")
					plog("w_qbox_handler","US2_SRV_listen_socket = "+str$(US2_SRV_listen_socket))
				CASE 372
					US2_SRV_listen_socket = socket_close(US2_SRV_listen_socket,"US2_SRV")
					plog("w_qbox_handler","US2_SRV_listen_socket          = "+str$(US2_SRV_listen_socket))
				CASE 381
					i = IWNCSInit(16,8)
					if i < 0
						plog("w_qbox_handler","ERR. - IWNCSInit(8,8), Errorcode :"+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
					ELSE
						plog("w_qbox_handler","O.K. - IWNCSInit(8,8), Errorcode :"+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
					endif
				CASE 382
					IWNCSFree()
					plog("w_qbox_handler","O.K. - IWNCSFree()")
			ENDSELECT ' @CONTROLID

		CASE CRS_SRV_ID_OnConnectMessage
			plog("w_qbox_handler","client for CRS_SRV present")

		CASE CRS_SRV_ID_OnDataMessage
			plog("w_bbq_handler","Data for CRS_SRV present")


		CASE SNS_SRV_ID_OnConnectMessage
			plog("w_qbox_handler","Client for SNS_SRV present")

		CASE SNS_SRV_ID_OnDataMessage
			plog("w_qbox_handler","Data for SNS-server present")


		CASE US1_SRV_ID_OnConnectMessage
			plog("w_qbox_handler","Client present for US1-server")
		CASE US1_SRV_ID_OnDataMessage
			plog("w_qbox_handler","Data present for US1-server")


		CASE US2_SRV_ID_OnConnectMessage
			plog("w_qbox_handler","Client present for US2-server")
		CASE US2_SRV_ID_OnDataMessage
			plog("w_qbox_handler","Data present for US2-server")

		case QBX_BBQ_ID_OnDataMessage
			plog("w_qbox_handler","Data for QBX from BBQ-server present")



	  	CASE @IDMOUSEMOVE ' needed for placing controls etc
			mopri(w_plog, 10, 10 ,using("w_qbox       : x= #### y= ####", @MOUSEX,@MOUSEY))
		CASE @IDCLOSEWINDOW
			run = 1
	ENDSELECT ' SELECT @CLASS

RETURN 0
ENDSUB
'=========================================================================
sub server_start(server_port:int, w:window, ID_OnConnectMessage:int, name:string),int
	int ncsStatus = -1, socket = -1
	ncsStatus = IWNCSOpenForclients("",server_port,4)
	if ncsStatus < 0
		plog(name + " server_start","ERR. - OpenForClients, errorcode = "+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
	else
		socket = ncsStatus
		plog(name + " server_start","O.K. - OpenForClients, "+name+"-socket = "+STR$(socket))

		ncsStatus = IWNCSOnConnectMessage(w.hwnd,socket,ID_OnConnectMessage)
		if ncsStatus < 0
			plog(name + " server_start","ERR. - OnConnectMessage, errorcode = "+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
		else
			plog(name + " server_start","O.K. - OnConnectMessage ")
		endif
	endif

return socket
endsub
'=========================================================================
sub socket_close(socket:int,name:String),int ' close socket if not -1
	int ncsStatus = -1
	if socket < 0
		'plog(name+" server_stop","ERR. - CloseSocket, Socket was not open")
	else
		ncsStatus = IWNCSCloseSocket(socket)
		if ncsStatus < 0
			plog(name+" server_stop","ERR. - CloseSocket, "+name+" Socket = "+str$(socket)+" errorcode = "+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
		else
			plog(name+" server_stop","O.K. - CloseSocket, "+name+" Socket = "+str$(socket))
			socket = -1
		endif
	endif
return socket
endsub
'=========================================================================
SUB w_log_handler(),int ' log window for debugging
	SELECT @CLASS
		case @IDCreate
	  	CASE @IDCLOSEWINDOW
			run = 1
	  	CASE @IDMOUSEMOVE ' needed for placing controls etc
			move w_plog, 10, 10
			print w_plog,using("w_log        : x= #### y= ####", @MOUSEX,@MOUSEY)
	ENDSELECT

RETURN 0
ENDSUB
'=========================================================================
SUB plog(pw:string,pi:string),int ' prints into log window
	' int time_delta
	string timestring, txt ', time_delta_string
	getclientsize w_plog,woid,woid,w_plog_wdh,w_plog_hgh
	SETFONT w_plog, "courier new", 8, 400

	log_old_tm = log_tm
	GetLocalTime(log_tm)
	if left$(pi,1) = "$" 'indicator for "print in the same line as before to avoid masses of entries in loops"
		txt = mid$(pi,2) 
	else 
		txt = pi
		printpos = printpos + 13
	endif

	IF (printpos > w_plog_hgh - 30) then printpos = 30
	RECT w_plog,0,printpos,2000, 60,RGB(255,255,255),RGB(255,255,255)
	timestring = using("0##:0##:0##:0###",log_tm.wHou,log_tm.wMin,log_tm.wSec,log_tm.wmse)
	'time_delta = (log_tm.wmse - log_old_tm.wmse) + (log_tm.wsec - log_old_tm.wsec)*1000  + (log_tm.wmin - log_old_tm.wmin) * 60000 + (log_tm.wHou - log_old_tm.wHou) * 3600000
	'time_delta_string = using("0####",time_delta)
	mopri(w_plog, 10, printpos, timestring + " " + pw)		'" dT:" + time_delta_string + 
	mopri(w_plog, 250, printpos," :"+ txt+"<")

return printpos
ENDSUB
'=========================================================================
sub mopri(w:window, hor_pos:INT, vert_pos:INT,text:string),int ' Prints mouse x, y to log window
	move w,hor_pos,vert_pos
	print w,text
return 0
endsub
'=========================================================================
sub Connect_To_server(ip:string, port:int, w:window, ID_OnDataMessage:int, name:string),int ' open a client
	plog(name+"_client_Start","ncsStatus = ConnectToserver(IP,port), waiting for connection")
	int ncsStatus, socket
	ncsStatus = IWNCSConnectToserver(IP,port)
	if ncsStatus < 0
		plog("client_Start","ERR. - connecting to server "+IP+", Errorcode = "+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText())
	else
		socket = ncsStatus
		plog(name+"_client_Start","O.K. - Connected to server, IP = "+IP+", Port = "+str$(port)+", client_socket = "+str$(socket))

		ncsStatus=IWNCSOnDataMessage(w.hWnd, socket, ID_OnDataMessage)
		if ncsStatus < 0
			plog(name+"_client_Start","ERR. - OnDataMessage, Errorcode = "+str$(IWNCSGetLastError())+", "+IWNCSGetErrorText()) 
		ELSE
			plog(name+"_client_Start","O.K. - OnDataMessage")
		endif
	endif
return socket
endsub


'=========================================================================
