#include "NXTDefs.h"


// The main program

dseg segment
	is_invalid	byte
	i2c_check	TCommLSCheckStatus
	i2c_write	TCommLSWrite
	i2c_read	TCommLSRead
	
	i2c_8574_alloff	byte[], 0x40, 0xFF
	i2c_8574_allon	byte[], 0x40, 0x00

	i2c_8574_2on	byte[], 0x40, 0xFB
	i2c_8574_3on	byte[], 0x40, 0xF7
	
	i2c_8574_read	byte[], 0x40
	
	state_buffer	byte[], 0x00
	state			byte

	dtArgs			TDrawText
	
	resultnum		byte[]
	p0				byte[], '0: '
	p1				byte[], '1: '
	p2				byte[], '2: '
	p3				byte[], '3: '
	p4				byte[], '4: '
	p5				byte[], 'state: '
dseg ends

thread main
	set		dtArgs.Options, 1

	setin IN_TYPE_LOWSPEED, IN_3, Type
	setin IN_MODE_RAW, IN_3, InputMode
	setin TRUE, IN_3, InvalidData
	
  	wait_for_valid:
	  	getin	is_invalid, IN_3, InvalidData

		//numtostr	resultnum, is_invalid
		//strcat		dtArgs.Text, p1, resultnum
		//syscall		DrawText, dtArgs
		//wait 500

  		brcmp EQ, wait_for_valid, is_invalid, TRUE

	mov		i2c_check.Port, IN_3
	i2c_tryagain1:
		syscall		CommLSCheckStatus, i2c_check
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p2, resultnum
		//syscall		DrawText, dtArgs
		//wait 500
		brcmp 		GT, i2c_tryagain1, i2c_check.Result, NO_ERR
		
	wait	50

	mov		i2c_write.Port, IN_3
	set		i2c_write.ReturnLen, 0
	mov		i2c_write.Buffer, i2c_8574_alloff		
	syscall	CommLSWrite, i2c_write
	
	wait 1000

	i2c_tryagain2:
		syscall		CommLSCheckStatus, i2c_check
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p3, resultnum
		//syscall		DrawText, dtArgs
		//wait 500
		brcmp 		GT, i2c_tryagain2, i2c_check.Result, NO_ERR
		
	mov		i2c_write.Buffer, i2c_8574_allon		
	syscall	CommLSWrite, i2c_write

	wait 1000
		
	i2c_tryagain3:
		syscall		CommLSCheckStatus, i2c_check
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p4, resultnum
		//syscall		DrawText, dtArgs
		//wait 500
		brcmp 		GT, i2c_tryagain3, i2c_check.Result, NO_ERR
		
	mov		i2c_write.Buffer, i2c_8574_2on		
	syscall	CommLSWrite, i2c_write

	wait 1000

	i2c_tryagain4:
		syscall		CommLSCheckStatus, i2c_check
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p4, resultnum
		//syscall		DrawText, dtArgs
		//wait 500
		brcmp 		GT, i2c_tryagain4, i2c_check.Result, NO_ERR
		
	mov		i2c_write.Buffer, i2c_8574_3on		
	syscall	CommLSWrite, i2c_write

	wait 1000

	i2c_tryagain5:
		syscall		CommLSCheckStatus, i2c_check
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p4, resultnum
		//syscall		DrawText, dtArgs
		//wait 500
		brcmp 		GT, i2c_tryagain5, i2c_check.Result, NO_ERR
		
	mov		i2c_write.Buffer, i2c_8574_alloff		
	syscall	CommLSWrite, i2c_write

	//wait 1000
	
	/* reading data */

	i2c_tryagain6:
		syscall		CommLSCheckStatus, i2c_check
		brcmp 		GT, i2c_tryagain6, i2c_check.Result, NO_ERR
		
		//numtostr	resultnum, i2c_check.Result
		//strcat		dtArgs.Text, p0, resultnum
		//syscall		DrawText, dtArgs
		//wait 2000

	set		i2c_write.ReturnLen, 1
	mov		i2c_write.Buffer, i2c_8574_read		
	syscall	CommLSWrite, i2c_write

		//numtostr	resultnum, i2c_write.Result
		//strcat		dtArgs.Text, p1, resultnum
		//syscall		DrawText, dtArgs
		//wait 50

	i2c_tryagain7:
		syscall		CommLSCheckStatus, i2c_check
		brcmp 		GT, i2c_tryagain7, i2c_check.Result, NO_ERR
		
		numtostr	resultnum, i2c_check.Result
		strcat		dtArgs.Text, p2, resultnum
		syscall		DrawText, dtArgs
		wait 2000

		numtostr	resultnum, i2c_check.BytesReady
		strcat		dtArgs.Text, p3, resultnum
		syscall		DrawText, dtArgs
		wait 2000

	mov		i2c_write.Port, IN_3
	set		i2c_write.ReturnLen, 0
	mov		i2c_write.Buffer, i2c_8574_allon		
	syscall	CommLSWrite, i2c_write
	i2c_tryagain98:
		syscall		CommLSCheckStatus, i2c_check
		brcmp 		GT, i2c_tryagain98, i2c_check.Result, NO_ERR
	wait 1000
	mov		i2c_write.Buffer, i2c_8574_alloff		
	syscall	CommLSWrite, i2c_write
	i2c_tryagain99:
		syscall		CommLSCheckStatus, i2c_check
		brcmp 		GT, i2c_tryagain99, i2c_check.Result, NO_ERR
	wait 1000

	mov		i2c_read.Port, IN_3
	mov		i2c_read.Buffer, state_buffer
	set		i2c_read.BufferLen, 1
	syscall	CommLSRead, i2c_read

		numtostr	resultnum, i2c_read.Result
		strcat		dtArgs.Text, p4, resultnum
		syscall		DrawText, dtArgs
		wait 1000

	index	state, i2c_read.Buffer, 0
	numtostr	resultnum, state
	strcat		dtArgs.Text, p5, resultnum
	syscall		DrawText, dtArgs	

	wait 2000

	exit
endt

