class DS3234RTC
{
	// Squirrel class for the Dallas/Maxim DS3234 real time clock used on the
	// SparkFun DeadOn breakout board https://www.sparkfun.com/products/10160
	//
	// Bus: SPI
	//
	// Written by Tony Smith, September 2014
	// Version 1.0
	
	LOW = 0
	HIGH = 1
	
	DS3234_CTRL_REG_WRITE = "\x8E"
	DS3234_RAM_START_READ = "\x00"
	DS3234_RAM_START_WRITE = "\x80"
	
	_spi = null
	_cs = null
	
	constructor(bus, csPin)
	{
		_spi = bus
		_cs = csPin
	}
	
	function init()
	{
		// Configure SPI bus for SPI Mode 3
		
		_spi.configure((CLOCK_IDLE_LOW | CLOCK_2ND_EDGE), 3000)
		
		// Set the Chip Select pin HIGH
		
		_cs.configure(DIGITAL_OUT)
		_cs.write(HIGH)
		
		imp.sleep(0.02)
		
		// Initialise the DS3234 with basic settings, ie. zero Control Register
		
		_cs.write(LOW)
		_spi.write(DS3234_CTRL_REG_WRITE)
		_spi.write("\x00")
		_cs.write(HIGH)
	}
	
	function setDateAndTime(date, month, year, wday, hour, min, sec)
	{
		// Sets the RTC's initial values - all integers
		
		local dateData = [sec, min, hour, wday, date, month, (year - 2000)]
		
		for (local i = 0 ; i < 7 ; i++)
		{
			dateData[i] = integerToBCD(dateData[i])
			if (i == 2) dateData[i] = dateData[i] & 0x3F
			
			// DS3234 memory is written at 0x80 and up
			// 0x80 = seconds (0-59)
			// 0x81 = minutes (0-59)
			// 0x82 = hour (0-23)
			// 0x83 = day of week (1-7)
			// 0x84 = day of month (1-31)
			// 0x85 = month (1-12)
			// 0x86 = year (00-99)
			
			_cs.write(LOW)
			local r = blob(1)
			r.writen((i + 0x80), 'b')
			_spi.write(r)
			local v = blob(1)
			v.writen(dateData[i], 'b')
			_spi.write(v)
			_cs.write(HIGH)
		}
	}
	
	function getDateAndTime()
	{
		local b = null
		local dateData = [0, 0, 0, 0, 0, 0, 0]
		
		for (local i = 0 ; i < 7 ; i++)
		{
			// DS3234 memory is read at 0x00 and up
			// 0x00 = seconds (0-59)
			// 0x01 = minutes (0-59)
			// 0x02 = hour (0-23)
			// 0x03 = day of week (1-7)
			// 0x04 = day of month (1-31)
			// 0x05 = month (1-12)
			// 0x06 = year (00-99)
				
			_cs.write(LOW)
			local r = blob(1)
			r.writen(i, 'b')
			_spi.write(r)
			b = _spi.readblob(1)
			dateData[i] = bcdToInteger(b[0])
			_cs.write(HIGH)
		}
		
		return dateData
	}
	
	function integerToBCD(value)
	{
		// DS3234 stores data in Binary Coded Decimal (BCD)
		// Writes must be converted from integer to BCD
		
		local a = value / 10
		local b = value - (a * 10)
		return (a << 4) + b
	}
	
	function bcdToInteger(value)
	{
		// DS3234 stores data in Binary Coded Decimal (BCD)
		// Reads must be converted to integer from BCD
		
		local a = (value & 0xF0) >> 4
		local b = value & 0x0F
		return (a * 10) + b
	}
}class DS3234
{
	// Squirrel class for the Dallas/Maxim DS3234 real time clock used on the
	// SparkFun DeadOn breakout board https://www.sparkfun.com/products/10160
	//
	// Bus: SPI
	//
	// Written by Tony Smith, September 2014
	// Version 1.0
	
	LOW = 0
	HIGH = 1
	
	DS3234_CTRL_REG_WRITE = "\x8E"
	DS3234_RAM_START_READ = "\x00"
	DS3234_RAM_START_WRITE = "\x80"
	
	_spi = null
	_cs = null
	
	constructor(bus, csPin)
	{
		_spi = bus
		_cs = csPin
	}
	
	function init()
	{
		// Configure SPI bus for SPI Mode 3
		
		_spi.configure((CLOCK_IDLE_LOW | CLOCK_2ND_EDGE), 3000)
		
		// Set the Chip Select pin HIGH
		
		_cs.configure(DIGITAL_OUT)
		_cs.write(HIGH)
		
		imp.sleep(0.02)
		
		// Initialise the DS3234 with basic settings, ie. zero Control Register
		
		_cs.write(LOW)
		_spi.write(DS3234_CTRL_REG_WRITE)
		_spi.write("\x00")
		_cs.write(HIGH)
	}
	
	function setDateAndTime(date, month, year, wday, hour, min, sec)
	{
		// Sets the RTC's initial values - all integers
		
		local dateData = [sec, min, hour, wday, date, month, (year - 2000)]
		
		for (local i = 0 ; i < 7 ; i++)
		{
			dateData[i] = integerToBCD(dateData[i])
			if (i == 2) dateData[i] = dateData[i] & 0x3F
			
			// DS3234 memory is written at 0x80 and up
			// 0x80 = seconds (0-59)
			// 0x81 = minutes (0-59)
			// 0x82 = hour (0-23)
			// 0x83 = day of week (1-7)
			// 0x84 = day of month (1-31)
			// 0x85 = month (1-12)
			// 0x86 = year (00-99)
			
			_cs.write(LOW)
			local r = blob(1)
			r.writen((i + 0x80), 'b')
			_spi.write(r)
			local v = blob(1)
			v.writen(dateData[i], 'b')
			_spi.write(v)
			_cs.write(HIGH)
		}
	}
	
	function getDateAndTime()
	{
		local b = null
		local dateData = [0, 0, 0, 0, 0, 0, 0]
		
		for (local i = 0 ; i < 7 ; i++)
		{
			// DS3234 memory is read at 0x00 and up
			// 0x00 = seconds (0-59)
			// 0x01 = minutes (0-59)
			// 0x02 = hour (0-23)
			// 0x03 = day of week (1-7)
			// 0x04 = day of month (1-31)
			// 0x05 = month (1-12)
			// 0x06 = year (00-99)
				
			_cs.write(LOW)
			local r = blob(1)
			r.writen(i, 'b')
			_spi.write(r)
			b = _spi.readblob(1)
			dateData[i] = bcdToInteger(b[0])
			_cs.write(HIGH)
		}
		
		return dateData
	}
	
	function integerToBCD(value)
	{
		// DS3234 stores data in Binary Coded Decimal (BCD)
		// Writes must be converted from integer to BCD
		
		local a = value / 10
		local b = value - (a * 10)
		return (a << 4) + b
	}
	
	function bcdToInteger(value)
	{
		// DS3234 stores data in Binary Coded Decimal (BCD)
		// Reads must be converted to integer from BCD
		
		local a = (value & 0xF0) >> 4
		local b = value & 0x0F
		return (a * 10) + b
	}
}