short i2c_get_byte(char slaveAddr, char dataAddr)
{
    i2c_start();                        // ST
    i2c_address(slaveAddr, 0);          // SAD + W
    i2c_write(dataAddr);                // SUB
    i2c_restart();                      // SR?
    i2c_address(slaveAddr, 1);          // SAD + R
    char data1 = i2c_read(0);  // DATA
    i2c_stop();                         // STOP
    return data1;
}
unsigned short i2c_get_udata(char mAddr, char addr)
{
    i2c_start();
    i2c_address(mAddr, 0);
    i2c_write(addr);
    i2c_restart();
    i2c_address(mAddr, 1);
    unsigned char data1 = i2c_read(1);
    unsigned char data0 = i2c_read(0);
    i2c_stop();
    return data0 + (data1 << 8);
}
void i2c_writeToReg(char slaveAddr, char destAddr, char sendData)
{
    i2c_start();
    i2c_address(slaveAddr, 0);
    i2c_write(destAddr);
    i2c_write(sendData);
    i2c_stop();
}
void i2c_write_raw(char cnt, char cmd)
{
    i2c_start();
    i2c_address(0x77, 0);
    i2c_write(cnt);
    i2c_write(cmd);
    i2c_stop();
}
static void decode_i2cstat(lpc17xx_i2c_config_t *config, int status) {
	error_code_t error = NO_ERROR;
	i2c_command_t *cmd = config->buffer;
	if (cmd->expected_status != status || status == ERROR) {
		cmd->expected_status = ERROR;
		//TODO: Should I issue a STOP command?
	} else {
		switch (status) {
			case START:
				//Send Address byte.
				//After Sending the address, next status should be SLA+W ACK.
				error = i2c_clear_start(config);
				cmd->expected_status = MASTER_SLAVEWr_ACK ;
				error |= i2c_address(config, WRITE);
				break;
			case MASTER_SLAVEWr_ACK:
				//Send Register to Write.
				error = i2c_reg(config);
				cmd->expected_status = MASTER_DATAWr_ACK;
				break;
			case MASTER_DATAWr_ACK:
				//If operation is read, RESTART.
				if (cmd->operation == READ) {
					cmd->expected_status = RESTART;
					error = i2c_set_start(config);
				//Else,just send the data.
				} else if (cmd->data_written < cmd->size ) {
					error = i2c_data_write(config, cmd->data[cmd->data_written]);
					cmd->data_written++;
				//If previous send was the last byte, then next should be STOP.
				} else {
					cmd->expected_status = IDLE;
					error = i2c_stop(config);
				}
				break;
			case RESTART:
				//Send address byte, with direction bit set to READ. I2C will ACK the address.
				error = i2c_clear_start(config);
				cmd->expected_status = MASTER_SLARd_ACK ;
				error |= i2c_address(config, READ);
				break;
			case MASTER_SLARd_ACK:
				//I2C will receive the first byte, set the ACK bit.
				if (cmd->data_written == ( cmd->size - 1) ) {
					error  |= i2c_clear_ack(config);
					cmd->expected_status = MASTER_DATARd_NAK;
				} else {
					error = i2c_set_ack(config);
					cmd->expected_status = MASTER_DATARd_ACK;
				}
				break;
			case MASTER_DATARd_ACK:
				error = i2c_data_read(config);
				//A byte of data was received.
				cmd->data_written++;
				if (cmd->data_written == ( cmd->size - 1) ) {
					//The next byte will be the last byte, send a NAK.
					error  |= i2c_clear_ack(config);
					cmd->expected_status = MASTER_DATARd_NAK;
				} else {
					error |= i2c_set_ack(config);
					cmd->expected_status = MASTER_DATARd_ACK;
				}
				break;
			case MASTER_DATARd_NAK:
				error = i2c_data_read(config);
				cmd->expected_status = IDLE;
				i2c_stop(config);
				break;
			default:
				break;
		}

	}
	if (error != NO_ERROR) {
		cmd->expected_status = ERROR;
	}
	i2c_clear_interrupt(config);
}