view ABP/receiver2.c @ 8:5dc0fa7caa57 draft

add ABP
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 01 May 2012 13:48:30 +0900
parents
children 18d2a590bc10
line wrap: on
line source

int comm_bit;  /* communication bit */
char *comm_msg;  /* communication message */

code (*ret)(int);
void *env;
code receiveState(struct packet, int);
code sendState(struct packet, int);

struct packet {
	int        bit;  /*alternating bit */
	char     **msg;  /* message */
	code (*next)();  /* next code segment */
};

char *msgs[6] = { "hoge1", "hoge2", "hoge3", "hoge4", "hoge5", 0 };

code sendState(struct packet pkt, int i)
{
	printf("ack\n");
	comm_bit = pkt.bit;  // ack
	comm_bit = !pkt.bit;  // sender's task
	i++;  // sender's task
	comm_msg = pkt.msg[i];  // sender's task

	pkt.next = receiveState;
	goto pkt.next(pkt, i);
}

code receiveState(struct packet pkt, int i)
{
	if (pkt.msg[i] == 0) goto ret(0), env;

	/* correct bit */
	if (pkt.bit != comm_bit) {
		printf("bit: %d\n", comm_bit);
		printf("message: %s\n", comm_msg);
		pkt.bit = !pkt.bit;

		pkt.next = sendState;
		goto pkt.next(pkt, i);
	/* wrong bit */
	} else {
		printf("nack\n");
		comm_bit = !pkt.bit;  // sender's task

		pkt.next = receiveState;
		goto pkt.next(pkt, i);
	}
}

code initReceiver(struct packet pkt, int init_bit)
{
	pkt.bit = 1;
	pkt.msg = msgs;
	comm_bit = init_bit;  // sender's task
	comm_msg = pkt.msg[0];  // sender's task
	pkt.next = receiveState;
	goto pkt.next(pkt, 0);
}

int main(void)
{
	struct packet pkt;
	ret = return;
	env = environment;
	goto initReceiver(pkt, 0);
}