
// ****************************************************************************
//
//                                 Main code
//
// ****************************************************************************
// Scan an I2C bus.

#include "include.h"

#define PIN_SDA 2
#define PIN_SCL 3

bool reserved_addr(uint8_t addr)
{
	return (addr & 0x78) == 0 || (addr & 0x78) == 0x78;
}

int main()
{
	stdio_init_all();

	// wait to connect terminal
	int c;
	do {
		printf("Press spacebar to start...\n");
		c = getchar();
	} while (c != ' ');

	PIO pio = pio0;
	uint sm = 0;
	uint offset = pio_add_program(pio, &i2c_program);
	i2c_program_init(pio, sm, offset, PIN_SDA, PIN_SCL);
 
	printf("\nPIO I2C Bus Scan\n");
	printf("   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n");

	for (int addr = 0; addr < (1 << 7); ++addr)
	{
		if (addr % 16 == 0)
		{
			printf("%02x ", addr);
		}

		// Perform a 0-byte read from the probe address. The read function
		// returns a negative result NAK'd any time other than the last data
		// byte. Skip over reserved addresses.
		int result;
		if (reserved_addr(addr))
			result = -1;
		else
			result = pio_i2c_read_blocking(pio, sm, addr, NULL, 0);

		printf(result < 0 ? "." : "@");
		printf(addr % 16 == 15 ? "\n" : "  ");
	}
	printf("Done.\n");

	// Wait for uart output to finish
	sleep_ms(100);

	return 0;
}
