/*
 * Copyright(C) Paul und Scherer (mct.de/mct.net)
 *
 * This example demonstrates how to...
 *
 *  ... use the ZigBee module as receiver.
 *
 * Note: This program is derived from a ZigBee demo
 * program from "mikroElektronika" (www.mikroe.com).
 */

#include <stdio.h>
#include "zb1.h"

#define PID	 1				// choose PAN ID
#define ADR	 2				//        address
#define CHN	12				//        channel

/*
 * SPIMS (SPI Made Simple) chip selects
 */
#define CS0	0x10000				// P0.16
#define CS1	0x20000				// P0.17
#define CS2	0x40000				// P0.18
#define CS3	0x80000				// P0.19

#define HLEN	11				// header length

/*
 * The SPI is setup as master (CPOL =0, CPHA =0).
 */
static void
spi_init(void)
{
	Intern_pinsel0 |= 0x5500;		// enable SPI pins
	Intern_spcr     = 0x20;			// MSTR
	Intern_spccr    = 8;			// SCK =pclk/8
}

int
main()
{
	/*
	 * De-select all SPImS devices.
	 */
	Intern_ioset  = CS0|CS1|CS2|CS3;
	Intern_iodir |= CS0|CS1|CS2|CS3;

	spi_init();				// initialize SPI
	zb_init(PID, ADR, CHN);			//            ZB module

	printf("\n"
	       "ZB1 ZigBee receiver\n"
	       "===================\n\n"
	       "  PAN ID : %d\n"
	       " Address : %d\n"
	       " Channel : %d\n", PID, ADR, CHN
	);

	while(1) {
		int n, i;

		puts("\nWaiting for data...");

		while (!(zb_rs(ZB_INTSTAT)&8)) ; // wait for data

		zb_ws(ZB_BBREG1, 4);		// disable receiving
		n = zb_rl(0x300)-HLEN-2;	// # of received bytes

		printf("Received from (PAN ID/address) %d/%d:",
			zb_rl(0x300+HLEN-2)<<8|
			zb_rl(0x300+HLEN-3),
			zb_rl(0x300+HLEN  )<<8|
			zb_rl(0x300+HLEN-1)
		);
		for (i = 0; i < n; printf(" %02x", zb_rl(0x300+HLEN+1+i++))) ;
		printf(" (LQI/RSSI: %d/%d)",
			zb_rl(0x300+HLEN+3+n),
			zb_rl(0x300+HLEN+4+n)
		);
		zb_ws(ZB_BBREG1, 0);		// enable receiving
	}
}
