#include <mes2.h>
#include <h8/reg3067.h>

int main(int argc, char **argv) {
	int	port, sk, cl, n, ip;
	struct sockaddr	myaddr, addr;
	char	buf[16];
	char	st[5];
	int	bfno, stno;
	int	rdat, redat, pno;
	int	rbuf, ra, rb;
	int	i, flg;

	/* パスワード "1234"に仮設定されております、変更する場合は半角英数字4文字で変更設定のこと。*/
	strcpy(st, "1234");

	flg = 0;
	PADDR = 0xff;
	PBDDR = 0xef;

	/* ポート"3000"に仮設定されております、変更する場合は半角数字で変更設定のこと。*/
	port = 3000;

	if(argc == 2) sscanf(argv[1], "%d", &port);
	sk = tcp_socket(0);
	myaddr.sin_port = port;
	tcp_bind(sk, &myaddr);
	tcp_listen(sk, 5);
	printf("Server start...\r");
	while(1){
		cl = tcp_accept(sk, &addr);
		if(cl < 0) continue;
		ip = addr.sin_addr;
		printf("%d.", (ip >> 24) & 0xff);
		printf("%d.", (ip >> 16) & 0xff);
		printf("%d.", (ip >> 8) & 0xff);
		printf("%d:", ip & 0xff);
		printf("%d\r", addr.sin_port);
				
		while(1){
			n = tcp_read(cl, buf, 6);
			if(n < 0) n = 1;
			if(memcmp(buf, "quit", 4) == 0){
				break;
			}
			if(memcmp(buf, "stop", 4) == 0){
				PADR = 0x00;
				PBDR = 0x00;
				break;
			}

			pno = buf[0];
			switch(pno){
				case 49:
					if(flg == 4) rdat = P7DR;
					redat = 10000 + rdat;
					sprintf(buf, "%d", redat);
					break;
				case 50:
					rbuf = atoi(buf);
					ra = rbuf - 20000;
					if(flg == 4) PADR = ra;
					break;
				case 51:
					rbuf = atoi(buf);
					rb = rbuf - 30000;
					if(flg == 4) PBDR = rb;
					break;
				case 48:
					for(i=0; i<=3; i++){
						bfno = buf[i+1];
						stno = st[i];
						if(bfno == stno){
							if(flg >= 4){
								flg = 4;
							}else{
								flg = flg + 1;
							}
						}
						else{
							flg = 0;
						}	
					}
			}
			if(flg != 4) strcpy(buf, "09999");
			tcp_write(cl, buf, 6);
		}					
		tcp_free(cl);
	}
}
